{"version":3,"sources":["vendor/ember-cli/app-prefix.js","web-directory/adapter.js","web-directory/adapters/application.js","web-directory/adapters/call-forwarding.js","web-directory/adapters/callv2.js","web-directory/adapters/contact.js","web-directory/adapters/conversation.js","web-directory/adapters/externalcontacts/contact.js","web-directory/adapters/externalcontacts/external-organization.js","web-directory/adapters/geolocation-settings.js","web-directory/adapters/geolocation.js","web-directory/adapters/group-policy.js","web-directory/adapters/group.js","web-directory/adapters/location.js","web-directory/adapters/org.js","web-directory/adapters/person.js","web-directory/adapters/public-api-user.js","web-directory/adapters/purecloud.js","web-directory/adapters/queue.js","web-directory/adapters/recorded-call.js","web-directory/adapters/recording.js","web-directory/adapters/skillgroup.js","web-directory/adapters/station.js","web-directory/adapters/user.js","web-directory/adapters/voicemail-message.js","web-directory/app-providers/agent-assist-provider.js","web-directory/app-providers/canned-responses-gadget-provider.ts","web-directory/app-providers/case-gadget-provider.ts","web-directory/app-providers/co-pilot-provider.ts","web-directory/app-providers/cobrowse-provider.ts","web-directory/app-providers/consult-gadget-provider.ts","web-directory/app-providers/conversation-details-interapptions-provider.ts","web-directory/app-providers/email-gadget-provider.ts","web-directory/app-providers/holistic-journey-interapptions-provider.js","web-directory/app-providers/integration-interapptions-provider.ts","web-directory/app-providers/messaging-gadget-provider.ts","web-directory/app-providers/notes-provider.ts","web-directory/app-providers/profile-panel-provider.ts","web-directory/app-providers/schedule-callback-gadget-provider.ts","web-directory/app-providers/scripter-gadget-base-provider.ts","web-directory/app-providers/smart-advisor-provider.js","web-directory/app-providers/video-provider.ts","web-directory/app-providers/workitem-details-gadget-provider.ts","web-directory/app-providers/workitem-interapption-gadget-provider.ts","web-directory/app-providers/wrapup-codes-provider.ts","web-directory/app.js","web-directory/application-loading/template.js","web-directory/authenticators/directory.js","web-directory/authenticators/test.js","web-directory/components/account-switcher-frame-router/component.ts","web-directory/components/acd-interactions-panel-v2/component.ts","web-directory/components/acd-interactions-panel-v2/interaction-consult-controls/component.ts","web-directory/components/acd-interactions-panel-v2/interaction-consult-controls/template.js","web-directory/components/acd-interactions-panel-v2/interaction-header/component.ts","web-directory/components/acd-interactions-panel-v2/interaction-header/header-button/component.ts","web-directory/components/acd-interactions-panel-v2/interaction-header/header-button/template.js","web-directory/components/acd-interactions-panel-v2/interaction-header/header-dropdown/component.ts","web-directory/components/acd-interactions-panel-v2/interaction-header/header-dropdown/template.js","web-directory/components/acd-interactions-panel-v2/interaction-header/header-group/component.ts","web-directory/components/acd-interactions-panel-v2/interaction-header/header-group/template.js","web-directory/components/acd-interactions-panel-v2/interaction-header/template.js","web-directory/components/acd-interactions-panel-v2/interaction-roster/interaction-roster-header/component.ts","web-directory/components/acd-interactions-panel-v2/interaction-roster/interaction-roster-header/template.js","web-directory/components/acd-interactions-panel-v2/interaction-script/component.ts","web-directory/components/acd-interactions-panel-v2/interaction-type-icon/component.ts","web-directory/components/acd-interactions-panel-v2/interaction-type-icon/template.js","web-directory/components/acd-interactions-panel-v2/interaction/component.ts","web-directory/components/acd-interactions-panel-v2/interaction/template.js","web-directory/components/acd-interactions-panel-v2/interapptions-manager-v2/component.ts","web-directory/components/acd-interactions-panel-v2/template.js","web-directory/components/acd-interactions-panel/component.ts","web-directory/components/acd-interactions-panel/interaction-blind-transfer-participant-dropdown/component.ts","web-directory/components/acd-interactions-panel/interaction-blind-transfer-participant-dropdown/template.js","web-directory/components/acd-interactions-panel/interaction-card-v2/alerting-card/component.ts","web-directory/components/acd-interactions-panel/interaction-card-v2/alerting-card/template.js","web-directory/components/acd-interactions-panel/interaction-card-v2/alerting-workitem-card/component.ts","web-directory/components/acd-interactions-panel/interaction-card-v2/alerting-workitem-card/template.js","web-directory/components/acd-interactions-panel/interaction-card-v2/base-card/component.ts","web-directory/components/acd-interactions-panel/interaction-card-v2/base-card/template.js","web-directory/components/acd-interactions-panel/interaction-card-v2/chat-card/component.ts","web-directory/components/acd-interactions-panel/interaction-card-v2/component.ts","web-directory/components/acd-interactions-panel/interaction-card-v2/email-card/component.ts","web-directory/components/acd-interactions-panel/interaction-card-v2/message-card/component.ts","web-directory/components/acd-interactions-panel/interaction-card-v2/template.js","web-directory/components/acd-interactions-panel/interaction-card-v2/voice-card/component.ts","web-directory/components/acd-interactions-panel/interaction-card-v2/workitem-card/component.ts","web-directory/components/acd-interactions-panel/interaction-card-v2/workitem-card/template.js","web-directory/components/acd-interactions-panel/interaction-conference-hangup-dropdown/component.ts","web-directory/components/acd-interactions-panel/interaction-conference-hangup-dropdown/template.js","web-directory/components/acd-interactions-panel/interaction-conference-roster-dropdown/component.ts","web-directory/components/acd-interactions-panel/interaction-conference-roster-dropdown/participant-row/component.ts","web-directory/components/acd-interactions-panel/interaction-conference-roster-dropdown/participant-row/template.js","web-directory/components/acd-interactions-panel/interaction-conference-roster-dropdown/template.js","web-directory/components/acd-interactions-panel/interaction-create-email/component.ts","web-directory/components/acd-interactions-panel/interaction-create-email/template.js","web-directory/components/acd-interactions-panel/interaction-create-message/component.ts","web-directory/components/acd-interactions-panel/interaction-create-message/template.js","web-directory/components/acd-interactions-panel/interaction-group/component.ts","web-directory/components/acd-interactions-panel/interaction-group/template.js","web-directory/components/acd-interactions-panel/interaction-messages-icon/component.ts","web-directory/components/acd-interactions-panel/interaction-messages-icon/template.js","web-directory/components/acd-interactions-panel/interaction-outbound-contact/component.ts","web-directory/components/acd-interactions-panel/interaction-outbound-contact/template.js","web-directory/components/acd-interactions-panel/interaction-queue-status/component.ts","web-directory/components/acd-interactions-panel/interaction-queue-status/template.js","web-directory/components/acd-interactions-panel/interaction-roster/component.ts","web-directory/components/acd-interactions-panel/interaction-roster/template.js","web-directory/components/acd-interactions-panel/interaction-script/component.js","web-directory/components/acd-interactions-panel/interaction-session-share/interaction-co-browse-next/component.js","web-directory/components/acd-interactions-panel/interaction-session-share/interaction-co-browse-next/template.js","web-directory/components/acd-interactions-panel/interaction-session-share/session-share-dropdown/component.ts","web-directory/components/acd-interactions-panel/interaction-session-share/session-share-dropdown/template.js","web-directory/components/acd-interactions-panel/interaction-settings/component.js","web-directory/components/acd-interactions-panel/interaction-settings/template.js","web-directory/components/acd-interactions-panel/interaction-voicemail/component.js","web-directory/components/acd-interactions-panel/interaction-voicemail/template.js","web-directory/components/acd-interactions-panel/interaction/component.js","web-directory/components/acd-interactions-panel/interaction/interaction-consult-controls/component.js","web-directory/components/acd-interactions-panel/interaction/interaction-consult-controls/template.js","web-directory/components/acd-interactions-panel/interaction/panel-manager/component.js","web-directory/components/acd-interactions-panel/interaction/panel-manager/template.js","web-directory/components/acd-interactions-panel/interaction/panel-sizer/component.js","web-directory/components/acd-interactions-panel/interaction/panel-sizer/template.js","web-directory/components/acd-interactions-panel/interaction/template.js","web-directory/components/acd-interactions-panel/interapptions-manager-v2/component.ts","web-directory/components/acd-interactions-panel/participant-name/component.ts","web-directory/components/acd-interactions-panel/participant-name/template.js","web-directory/components/acd-interactions-panel/template.js","web-directory/components/active-call-entry/component.js","web-directory/components/active-call-entry/template.js","web-directory/components/active-fax/component.js","web-directory/components/active-fax/template.js","web-directory/components/admin-ui-modal/component.js","web-directory/components/admin-ui-modal/template.js","web-directory/components/agent-greeting/component.js","web-directory/components/agent-greeting/template.js","web-directory/components/alerting-container/component.ts","web-directory/components/alerting-container/template.js","web-directory/components/alerting-manager/component.ts","web-directory/components/alerting-modal/component.ts","web-directory/components/alerting-modal/template.js","web-directory/components/anchor-tag/component.js","web-directory/components/anchor-tag/template.js","web-directory/components/app-carousel-toolbar/component.ts","web-directory/components/app-carousel-toolbar/template.js","web-directory/components/app-carousel-view/component.ts","web-directory/components/app-carousel-view/template.js","web-directory/components/app-embed/component.js","web-directory/components/app-embed/template.js","web-directory/components/app-img/component.js","web-directory/components/app-img/template.js","web-directory/components/app-instance/component.js","web-directory/components/app-instance/template.js","web-directory/components/app-pool/component.js","web-directory/components/app-pool/template.js","web-directory/components/app-view-stack/component.ts","web-directory/components/app-view-stack/template.js","web-directory/components/application-links/component.js","web-directory/components/application-links/template.js","web-directory/components/application-preferences/component.js","web-directory/components/application-preferences/interactions/component.js","web-directory/components/application-preferences/interactions/template.js","web-directory/components/application-preferences/preferences-sound/component.js","web-directory/components/application-preferences/preferences-sound/template.js","web-directory/components/application-preferences/template.js","web-directory/components/application-view/component.js","web-directory/components/application-view/template.js","web-directory/components/apps-sidebar-panel/component.js","web-directory/components/apps-sidebar-panel/template.js","web-directory/components/associate-activity/component.ts","web-directory/components/associate-activity/template.js","web-directory/components/audio-player-v2/component.js","web-directory/components/audio-player-v2/participant/component.js","web-directory/components/audio-player-v2/participant/template.js","web-directory/components/audio-player-v2/template.js","web-directory/components/audio-player-v2/timeline/component.js","web-directory/components/audio-player-v2/timeline/template.js","web-directory/components/audio-player-v2/waveform-graph/component.js","web-directory/components/audio-player/component.js","web-directory/components/audio-player/seek-bar/component.js","web-directory/components/audio-player/seek-bar/template.js","web-directory/components/audio-player/template.js","web-directory/components/audio-visualizer/component.ts","web-directory/components/audio-visualizer/template.js","web-directory/components/audit-footer/component.js","web-directory/components/audit-footer/template.js","web-directory/components/auth-loading/component.js","web-directory/components/auth-loading/template.js","web-directory/components/breadcrumb-bar/component.js","web-directory/components/breadcrumb-bar/template.js","web-directory/components/call-controls/component.js","web-directory/components/call-controls/template.js","web-directory/components/call-history-entity/component.js","web-directory/components/call-history-entity/template.js","web-directory/components/call-history-v2/component.ts","web-directory/components/call-history-v2/template.js","web-directory/components/call-participant/component.js","web-directory/components/call-participant/template.js","web-directory/components/carousel-menu/component.js","web-directory/components/carousel-menu/template.js","web-directory/components/center-stage-frame/component.js","web-directory/components/center-stage-frame/template.js","web-directory/components/change-password/component.js","web-directory/components/change-password/template.js","web-directory/components/change-pin/component.js","web-directory/components/change-pin/template.js","web-directory/components/characters-used/component.js","web-directory/components/characters-used/template.js","web-directory/components/chat-frame-router/component.ts","web-directory/components/chat-frame-router/template.js","web-directory/components/command-banner/component.ts","web-directory/components/command-banner/template.js","web-directory/components/command-bar/command-button/command-button-bookmark/component.ts","web-directory/components/command-bar/command-button/command-button-bookmark/template.js","web-directory/components/command-bar/command-button/component.ts","web-directory/components/command-bar/command-button/template.js","web-directory/components/command-bar/component.ts","web-directory/components/command-bar/control-queue-toggle/component.ts","web-directory/components/command-bar/control-queue-toggle/template.js","web-directory/components/command-bar/skip-links/component.ts","web-directory/components/command-bar/skip-links/template.js","web-directory/components/command-bar/template.js","web-directory/components/command-bookmarks/component.ts","web-directory/components/command-bookmarks/template.js","web-directory/components/command-chat-panel/component.ts","web-directory/components/command-chat-panel/template.js","web-directory/components/command-free-trial-support/component.ts","web-directory/components/command-free-trial-support/template.js","web-directory/components/command-global-search/component.ts","web-directory/components/command-global-search/page-result/component.ts","web-directory/components/command-global-search/page-result/template.js","web-directory/components/command-global-search/search-result/component.ts","web-directory/components/command-global-search/search-result/template.js","web-directory/components/command-global-search/template.js","web-directory/components/command-nav/component.ts","web-directory/components/command-nav/navMenu.ts","web-directory/components/command-nav/template.js","web-directory/components/command-panel-account-switcher/component.ts","web-directory/components/command-panel-account-switcher/template.js","web-directory/components/command-panel-agent/component.ts","web-directory/components/command-panel-agent/template.js","web-directory/components/command-panel-apps/component.ts","web-directory/components/command-panel-apps/template.js","web-directory/components/command-panel-copilot-framework/component.ts","web-directory/components/command-panel-copilot-framework/template.js","web-directory/components/command-panel-help/component.ts","web-directory/components/command-panel-help/template.js","web-directory/components/command-panel-notifications/component.ts","web-directory/components/command-panel-notifications/template.js","web-directory/components/command-panel/component.ts","web-directory/components/command-panel/panel-definition.ts","web-directory/components/command-panel/panel-navigation/component.ts","web-directory/components/command-panel/panel-navigation/template.js","web-directory/components/command-panel/template.js","web-directory/components/command-subnav/component.ts","web-directory/components/command-subnav/template.js","web-directory/components/command-user-settings/component.ts","web-directory/components/command-user-settings/menu-options/component.ts","web-directory/components/command-user-settings/menu-options/details-menu/component.ts","web-directory/components/command-user-settings/menu-options/details-menu/template.js","web-directory/components/command-user-settings/menu-options/menu-option-presence/component.ts","web-directory/components/command-user-settings/menu-options/menu-option-presence/template.js","web-directory/components/command-user-settings/menu-options/menu-option/component.ts","web-directory/components/command-user-settings/menu-options/menu-option/template.js","web-directory/components/command-user-settings/menu-options/open-menu-header/component.ts","web-directory/components/command-user-settings/menu-options/open-menu-header/template.js","web-directory/components/command-user-settings/menu-options/open-menu-sub-header/component.ts","web-directory/components/command-user-settings/menu-options/open-menu-sub-header/template.js","web-directory/components/command-user-settings/menu-options/out-of-office-menu/component.ts","web-directory/components/command-user-settings/menu-options/out-of-office-menu/template.js","web-directory/components/command-user-settings/menu-options/presence-selector-menu/component.ts","web-directory/components/command-user-settings/menu-options/presence-selector-menu/template.js","web-directory/components/command-user-settings/menu-options/presence-selector-menu/user-presence-input/component.ts","web-directory/components/command-user-settings/menu-options/presence-selector-menu/user-presence-input/template.js","web-directory/components/command-user-settings/menu-options/template.js","web-directory/components/command-user-settings/template.js","web-directory/components/command-user-settings/user-information/component.ts","web-directory/components/command-user-settings/user-information/template.js","web-directory/components/command-user-settings/user-settings-button/component.ts","web-directory/components/command-user-settings/user-settings-button/template.js","web-directory/components/command-view/component.ts","web-directory/components/command-view/template.js","web-directory/components/common-badge/component.ts","web-directory/components/common-badge/template.js","web-directory/components/consult-transfer/component.js","web-directory/components/consult-transfer/template.js","web-directory/components/conversation-controls/component.js","web-directory/components/conversation-controls/template.js","web-directory/components/desktop-notification/component.js","web-directory/components/desktop-notification/template.js","web-directory/components/device-selection-with-preview/component.js","web-directory/components/device-selection-with-preview/template.js","web-directory/components/dial-pad-number/component.js","web-directory/components/dial-pad-number/template.js","web-directory/components/dial-pad/component.js","web-directory/components/dial-pad/template.js","web-directory/components/drag-drop-container/component.js","web-directory/components/drag-drop-container/template.js","web-directory/components/drag-drop-item/component.js","web-directory/components/drag-drop-item/template.js","web-directory/components/drop-down/component.js","web-directory/components/drop-down/template.js","web-directory/components/dropdown-menu/component.js","web-directory/components/dropdown-menu/template.js","web-directory/components/duration-format/component.ts","web-directory/components/duration-format/template.js","web-directory/components/dynamic-popover/component.ts","web-directory/components/dynamic-popover/template.js","web-directory/components/embedded-admin/component.js","web-directory/components/embedded-admin/helpers.js","web-directory/components/embedded-admin/template.js","web-directory/components/embedded-app/component.js","web-directory/components/emergency-location/component.js","web-directory/components/emergency-location/template.js","web-directory/components/emoji-dom/component.js","web-directory/components/emoji-dom/template.js","web-directory/components/entity-contact-group/component.js","web-directory/components/entity-contact-group/template.js","web-directory/components/entity-contact-queue/component.js","web-directory/components/entity-contact/component.js","web-directory/components/entity-contact/template.js","web-directory/components/entity-hover-card/component.js","web-directory/components/entity-hover-card/template.js","web-directory/components/entity-image/component.js","web-directory/components/entity-image/template.js","web-directory/components/entity-location/component.js","web-directory/components/entity-location/template.js","web-directory/components/entity-mini/component.js","web-directory/components/entity-mini/default/component.js","web-directory/components/entity-mini/default/template.js","web-directory/components/entity-mini/entity-details/component.js","web-directory/components/entity-mini/entity-details/template.js","web-directory/components/entity-mini/external-contact/component.js","web-directory/components/entity-mini/external-contact/template.js","web-directory/components/entity-mini/queue/component.js","web-directory/components/entity-mini/queue/template.js","web-directory/components/entity-mini/template.js","web-directory/components/fax-panel/component.js","web-directory/components/fax-panel/template.js","web-directory/components/feedback-section-v2/component.js","web-directory/components/feedback-section-v2/template.js","web-directory/components/floating-calls/component.ts","web-directory/components/floating-calls/template.js","web-directory/components/follow-me-settings-panel/component.js","web-directory/components/follow-me-settings-panel/forwarding-helpers.ts","web-directory/components/follow-me-settings-panel/route-entry/component.js","web-directory/components/follow-me-settings-panel/route-entry/template.js","web-directory/components/follow-me-settings-panel/stations-list/component.js","web-directory/components/follow-me-settings-panel/stations-list/template.js","web-directory/components/follow-me-settings-panel/template.js","web-directory/components/frame-router/component.js","web-directory/components/free-trial-support/component.js","web-directory/components/free-trial-support/template.js","web-directory/components/global-modal/component.js","web-directory/components/global-modal/template.js","web-directory/components/global-side-panel/component.js","web-directory/components/global-side-panel/template.js","web-directory/components/icon-bootstrap/component.js","web-directory/components/icon-bootstrap/template.js","web-directory/components/inbox-panel-v2/adherence-explanations/component.js","web-directory/components/inbox-panel-v2/adherence-explanations/template.js","web-directory/components/inbox-panel-v2/cancellable-textbox/component.js","web-directory/components/inbox-panel-v2/cancellable-textbox/template.js","web-directory/components/inbox-panel-v2/coaching-appointments/component.js","web-directory/components/inbox-panel-v2/coaching-appointments/template.js","web-directory/components/inbox-panel-v2/component.js","web-directory/components/inbox-panel-v2/delete-confirmation/component.js","web-directory/components/inbox-panel-v2/delete-confirmation/template.js","web-directory/components/inbox-panel-v2/evaluations-v2/component.js","web-directory/components/inbox-panel-v2/evaluations-v2/template.js","web-directory/components/inbox-panel-v2/export-expiration-summary/component.ts","web-directory/components/inbox-panel-v2/export-expiration-summary/template.js","web-directory/components/inbox-panel-v2/learning-assignments/component.js","web-directory/components/inbox-panel-v2/learning-assignments/template.js","web-directory/components/inbox-panel-v2/notes-editor/component.js","web-directory/components/inbox-panel-v2/notes-editor/template.js","web-directory/components/inbox-panel-v2/reporting-alert/component.js","web-directory/components/inbox-panel-v2/reporting-alert/reporting-alert-summary/component.ts","web-directory/components/inbox-panel-v2/reporting-alert/reporting-alert-summary/template.js","web-directory/components/inbox-panel-v2/reporting-alert/template.js","web-directory/components/inbox-panel-v2/reporting-export/component.js","web-directory/components/inbox-panel-v2/reporting-export/template.js","web-directory/components/inbox-panel-v2/shift-trade-requests-v2/component.js","web-directory/components/inbox-panel-v2/shift-trade-requests-v2/template.js","web-directory/components/inbox-panel-v2/template.js","web-directory/components/inbox-panel-v2/time-off-requests-v2/component.js","web-directory/components/inbox-panel-v2/time-off-requests-v2/template.js","web-directory/components/inbox-panel-v2/voice-recording-v2/component.js","web-directory/components/inbox-panel-v2/voice-recording-v2/template.js","web-directory/components/infinite-scroll/component.ts","web-directory/components/infinite-scroll/template.js","web-directory/components/integration-badge/component.js","web-directory/components/integration-badge/template.js","web-directory/components/integration-badges/component.js","web-directory/components/integration-badges/template.js","web-directory/components/interaction-annotation/component.js","web-directory/components/interaction-annotation/template.js","web-directory/components/interaction-inactivity-status/component.ts","web-directory/components/interaction-inactivity-status/template.js","web-directory/components/internal-logs-panel/component.js","web-directory/components/internal-logs-panel/template.js","web-directory/components/log-capture-help/component.js","web-directory/components/log-capture-help/template.js","web-directory/components/login-oauth/component.js","web-directory/components/login-oauth/template.js","web-directory/components/maintenance-page/component.ts","web-directory/components/maintenance-page/template.js","web-directory/components/media-providers/video-dropdown/component.js","web-directory/components/media-providers/video-dropdown/template.js","web-directory/components/menu-item/component.js","web-directory/components/menu-item/template.js","web-directory/components/mobile-modal/component.js","web-directory/components/mobile-modal/template.js","web-directory/components/modal-gux/component.ts","web-directory/components/modal-gux/template.js","web-directory/components/mode-manager/component.ts","web-directory/components/mode-manager/interapptions-container/component.ts","web-directory/components/mode-manager/interapptions-container/template.js","web-directory/components/mode-manager/main-stages/empty-main-stage/component.ts","web-directory/components/mode-manager/main-stages/empty-main-stage/template.js","web-directory/components/mode-manager/main-stages/external-contact-main-stage/component.ts","web-directory/components/mode-manager/main-stages/external-contact-main-stage/template.js","web-directory/components/mode-manager/main-stages/history-main-stage/component.ts","web-directory/components/mode-manager/main-stages/history-main-stage/template.js","web-directory/components/mode-manager/mode-button/component.ts","web-directory/components/mode-manager/mode-button/template.js","web-directory/components/mode-manager/mode-dial-pad/component.ts","web-directory/components/mode-manager/mode-dial-pad/template.js","web-directory/components/mode-manager/mode-roster-empty-state/component.ts","web-directory/components/mode-manager/mode-roster-empty-state/template.js","web-directory/components/mode-manager/mode-roster-side-panel/component.ts","web-directory/components/mode-manager/mode-roster-side-panel/template.js","web-directory/components/mode-manager/mode-roster/component.ts","web-directory/components/mode-manager/mode-roster/template.js","web-directory/components/mode-manager/modes/active.ts","web-directory/components/mode-manager/modes/base/index.ts","web-directory/components/mode-manager/modes/base/mode.ts","web-directory/components/mode-manager/modes/base/subscription.ts","web-directory/components/mode-manager/modes/external-contact.ts","web-directory/components/mode-manager/modes/history.ts","web-directory/components/mode-manager/modes/inactive.ts","web-directory/components/mode-manager/modes/utils.ts","web-directory/components/mode-manager/participant-name/component.ts","web-directory/components/mode-manager/participant-name/template.js","web-directory/components/mode-manager/roster-cards/base/body/component.ts","web-directory/components/mode-manager/roster-cards/base/body/template.js","web-directory/components/mode-manager/roster-cards/base/component.ts","web-directory/components/mode-manager/roster-cards/base/header/component.ts","web-directory/components/mode-manager/roster-cards/base/header/template.js","web-directory/components/mode-manager/roster-cards/base/template.js","web-directory/components/mode-manager/roster-cards/interaction-group/body/component.ts","web-directory/components/mode-manager/roster-cards/interaction-group/body/template.js","web-directory/components/mode-manager/roster-cards/interaction-group/component.ts","web-directory/components/mode-manager/roster-cards/interaction-group/template.js","web-directory/components/mode-manager/roster-side-panels/active-mode-filter-panel/component.ts","web-directory/components/mode-manager/roster-side-panels/active-mode-filter-panel/template.js","web-directory/components/mode-manager/roster-side-panels/inactive-mode-filter-panel/component.ts","web-directory/components/mode-manager/roster-side-panels/inactive-mode-filter-panel/template.js","web-directory/components/mode-manager/roster-side-panels/outbound-panel/component.ts","web-directory/components/mode-manager/roster-side-panels/outbound-panel/create-conversation/component.ts","web-directory/components/mode-manager/roster-side-panels/outbound-panel/create-conversation/template.js","web-directory/components/mode-manager/roster-side-panels/outbound-panel/create-email/component.ts","web-directory/components/mode-manager/roster-side-panels/outbound-panel/create-email/template.js","web-directory/components/mode-manager/roster-side-panels/outbound-panel/create-message/component.ts","web-directory/components/mode-manager/roster-side-panels/outbound-panel/create-message/template.js","web-directory/components/mode-manager/roster-side-panels/outbound-panel/create-voice/component.ts","web-directory/components/mode-manager/roster-side-panels/outbound-panel/create-voice/template.js","web-directory/components/mode-manager/roster-side-panels/outbound-panel/create-workitem/component.ts","web-directory/components/mode-manager/roster-side-panels/outbound-panel/create-workitem/template.js","web-directory/components/mode-manager/roster-side-panels/outbound-panel/template.js","web-directory/components/mode-manager/roster-side-panels/settings-panel/component.ts","web-directory/components/mode-manager/roster-side-panels/settings-panel/template.js","web-directory/components/mode-manager/template.js","web-directory/components/multi-select-target-dropdown/component.ts","web-directory/components/multi-select-target-dropdown/template.js","web-directory/components/park-schedule-popover/component.ts","web-directory/components/park-schedule-popover/template.js","web-directory/components/participant-controls/component.js","web-directory/components/participant-controls/template.js","web-directory/components/phone-settings/component.js","web-directory/components/phone-settings/template.js","web-directory/components/preference-setting/component.js","web-directory/components/preference-setting/template.js","web-directory/components/preferences-chat/component.js","web-directory/components/preferences-chat/template.js","web-directory/components/preferences-direct-routing/component.js","web-directory/components/preferences-direct-routing/template.js","web-directory/components/preferences-general/component.js","web-directory/components/preferences-general/template.js","web-directory/components/preferences-language/component.js","web-directory/components/preferences-language/template.js","web-directory/components/preferences-notifications-desktop/component.js","web-directory/components/preferences-notifications-desktop/template.js","web-directory/components/preferences-notifications/component.js","web-directory/components/preferences-notifications/template.js","web-directory/components/preferences-video/component.js","web-directory/components/preferences-video/template.js","web-directory/components/profile-dropdown-menu/component.js","web-directory/components/profile-dropdown-menu/template.js","web-directory/components/profile-selection-v2/component.js","web-directory/components/profile-selection-v2/template.js","web-directory/components/progress-underlay/component.js","web-directory/components/progress-underlay/template.js","web-directory/components/region-chooser/component.js","web-directory/components/region-chooser/template.js","web-directory/components/resizable-content/component.js","web-directory/components/resizable-content/template.js","web-directory/components/resource-center-search-v2/component.js","web-directory/components/resource-center-search-v2/template.js","web-directory/components/roving-tabindex-list/component.ts","web-directory/components/roving-tabindex-list/template.js","web-directory/components/simple-outlet-view/component.ts","web-directory/components/single-select-target-dropdown/component.ts","web-directory/components/single-select-target-dropdown/template.js","web-directory/components/skillgroup-profile/component.js","web-directory/components/skillgroup-profile/division-picker/component.js","web-directory/components/skillgroup-profile/division-picker/template.js","web-directory/components/skillgroup-profile/dynamic-rules/component.js","web-directory/components/skillgroup-profile/dynamic-rules/condition-display/component.js","web-directory/components/skillgroup-profile/dynamic-rules/condition-display/skill-search/component.js","web-directory/components/skillgroup-profile/dynamic-rules/condition-display/skill-search/template.js","web-directory/components/skillgroup-profile/dynamic-rules/condition-display/template.js","web-directory/components/skillgroup-profile/dynamic-rules/template.js","web-directory/components/skillgroup-profile/membership-entry/component.js","web-directory/components/skillgroup-profile/membership-entry/template.js","web-directory/components/skillgroup-profile/membership-listing/component.js","web-directory/components/skillgroup-profile/membership-listing/template.js","web-directory/components/skillgroup-profile/template.js","web-directory/components/snail-progress/component.js","web-directory/components/snail-progress/template.js","web-directory/components/station-picker-v2/component.js","web-directory/components/station-picker-v2/template.js","web-directory/components/tags-input/component.ts","web-directory/components/tags-input/label/component.ts","web-directory/components/tags-input/label/template.js","web-directory/components/tags-input/template.js","web-directory/components/target-dropdown/component.ts","web-directory/components/target-dropdown/data/conversation-summary-config.const.ts","web-directory/components/target-dropdown/data/filter-data.const.ts","web-directory/components/target-dropdown/data/filter-store-config.const.ts","web-directory/components/target-dropdown/data/index.ts","web-directory/components/target-dropdown/filter/component.ts","web-directory/components/target-dropdown/filter/template.js","web-directory/components/target-dropdown/rows/external-contact-row/component.ts","web-directory/components/target-dropdown/rows/external-contact-row/template.js","web-directory/components/target-dropdown/rows/person-row/component.ts","web-directory/components/target-dropdown/rows/person-row/template.js","web-directory/components/target-dropdown/rows/queue-row/component.ts","web-directory/components/target-dropdown/rows/queue-row/template.js","web-directory/components/target-dropdown/template.js","web-directory/components/target-dropdown/thumbnail/component.ts","web-directory/components/target-dropdown/thumbnail/template.js","web-directory/components/target-dropdown/types/index.ts","web-directory/components/target-dropdown/types/queue-details.type.ts","web-directory/components/time-elapsed/component.js","web-directory/components/time-elapsed/template.js","web-directory/components/timeline-stream/component.js","web-directory/components/timeline-stream/direct-message-renderer/component.js","web-directory/components/timeline-stream/direct-message-renderer/template.js","web-directory/components/timeline-stream/mention-renderer/component.js","web-directory/components/timeline-stream/mention-renderer/template.js","web-directory/components/timeline-stream/missed-call-renderer/component.js","web-directory/components/timeline-stream/missed-call-renderer/template.js","web-directory/components/timeline-stream/renderer-component-base.ts","web-directory/components/timeline-stream/room-message-renderer/component.js","web-directory/components/timeline-stream/room-message-renderer/template.js","web-directory/components/timeline-stream/template.js","web-directory/components/timeline-stream/time-ago-indicator/component.ts","web-directory/components/timeline-stream/time-ago-indicator/template.js","web-directory/components/toggle-item-bar/component.js","web-directory/components/toggle-item-bar/template.js","web-directory/components/toggle-item/component.js","web-directory/components/toggle-item/template.js","web-directory/components/toggle-switch/component.js","web-directory/components/toggle-switch/template.js","web-directory/components/tooltip-on-element.js","web-directory/components/volume-input/component.js","web-directory/components/volume-input/template.js","web-directory/components/webrtc-debug-modal/component.js","web-directory/components/webrtc-debug-modal/template.js","web-directory/components/webrtc-issues/component.js","web-directory/components/webrtc-issues/template.js","web-directory/components/webrtc-softphone-audio/component.js","web-directory/components/webrtc-softphone-audio/template.js","web-directory/components/webrtc-troubleshooter-frame-router/component.ts","web-directory/controllers/admin.js","web-directory/controllers/application.js","web-directory/controllers/chat-room.js","web-directory/controllers/engage/embedded.js","web-directory/controllers/feedback.js","web-directory/controllers/internal-logs.js","web-directory/controllers/time-machine.js","web-directory/field-config/entities/external-contact.js","web-directory/field-config/entities/group.js","web-directory/field-config/entities/org.js","web-directory/field-config/entities/person.js","web-directory/field-config/field-config.js","web-directory/field-config/field-object.js","web-directory/field-config/field-section.js","web-directory/field-config/field.js","web-directory/formats.js","web-directory/helpers/address-format.js","web-directory/helpers/app-version.js","web-directory/helpers/await.js","web-directory/helpers/dasherize.js","web-directory/helpers/emoji-text.js","web-directory/helpers/escape.js","web-directory/helpers/first.js","web-directory/helpers/flair.js","web-directory/helpers/full-name.js","web-directory/helpers/help-article-icon.js","web-directory/helpers/html-safe.js","web-directory/helpers/is-selected-call-route.js","web-directory/helpers/join-strings.js","web-directory/helpers/page-title.js","web-directory/helpers/phone-integrations.js","web-directory/helpers/pluralize.js","web-directory/helpers/route-action.js","web-directory/helpers/singularize.js","web-directory/helpers/t.js","web-directory/iframe-client-config.ts","web-directory/initializers/add-modals-container.js","web-directory/initializers/analytics-service.js","web-directory/initializers/app-version.js","web-directory/initializers/application-service.js","web-directory/initializers/apps-service.js","web-directory/initializers/authentication-setup.js","web-directory/initializers/authenticators.js","web-directory/initializers/chat-frame-service.js","web-directory/initializers/chat-service.js","web-directory/initializers/clock-service.js","web-directory/initializers/component-styles.js","web-directory/initializers/container-debug-adapter.js","web-directory/initializers/device-profiles-v2-service.js","web-directory/initializers/ember-data-change-tracker.js","web-directory/initializers/ember-data.js","web-directory/initializers/ember-simple-auth.js","web-directory/initializers/export-application-global.js","web-directory/initializers/field-config.js","web-directory/initializers/integrations-presence-service.js","web-directory/initializers/interapption-providers.js","web-directory/initializers/main.js","web-directory/initializers/media-providers.js","web-directory/initializers/monitoring-service.js","web-directory/initializers/phone-service.js","web-directory/initializers/pigeon-service.js","web-directory/initializers/preferences-service.js","web-directory/initializers/register-spark-components.js","web-directory/initializers/screen-monitor-notifications-service.ts","web-directory/initializers/service-discovery.js","web-directory/initializers/session-service.js","web-directory/initializers/sidebar-service.js","web-directory/initializers/video-conference-details-service.js","web-directory/initializers/webrtc-sdk-service.js","web-directory/initializers/webrtc-service.js","web-directory/initializers/webrtc-settings-service.js","web-directory/initializers/worker-providers.ts","web-directory/instance-initializers/agent-schedule.js","web-directory/instance-initializers/attach-application-controller.js","web-directory/instance-initializers/attach-application-session.js","web-directory/instance-initializers/backburner-debug.js","web-directory/instance-initializers/clock-service.js","web-directory/instance-initializers/conversation-service.js","web-directory/instance-initializers/copilot-broadcast.ts","web-directory/instance-initializers/ember-data.js","web-directory/instance-initializers/ember-intl.js","web-directory/instance-initializers/ember-simple-auth.js","web-directory/instance-initializers/entity-contact-group.js","web-directory/instance-initializers/entity-hover-card.js","web-directory/instance-initializers/entity-image.js","web-directory/instance-initializers/entity-location.js","web-directory/instance-initializers/reopen-component.js","web-directory/instance-initializers/reopen-linkview.js","web-directory/instance-initializers/reopen-route.js","web-directory/instance-initializers/screen-recording.js","web-directory/instance-initializers/set-application-service-values.js","web-directory/instance-initializers/set-application-values.js","web-directory/instance-initializers/setup-application.js","web-directory/instance-initializers/setup-apps-api-handlers.js","web-directory/instance-initializers/setup-error-handling.js","web-directory/instance-initializers/setup-monitoring.js","web-directory/instance-initializers/webrtc.js","web-directory/media-providers/provider.js","web-directory/media-providers/purecloud.js","web-directory/media-providers/teams.js","web-directory/media-providers/utils/auth.js","web-directory/media-providers/zoom.js","web-directory/mixins/acd-utilities.js","web-directory/mixins/acd/after-call-work.js","web-directory/mixins/acd/interaction-state.js","web-directory/mixins/acd/interaction-timers.js","web-directory/mixins/acd/participants.js","web-directory/mixins/acd/session-share.js","web-directory/mixins/authenticated-authorized-route-mixin.js","web-directory/mixins/batch-data-requests.js","web-directory/mixins/cache-chat-rooms.js","web-directory/mixins/chat-commands.js","web-directory/mixins/chat-message-media.js","web-directory/mixins/chat-message-mixin.js","web-directory/mixins/chat-service/chat-events.js","web-directory/mixins/chat-service/message-notifications.js","web-directory/mixins/chat-service/message-splitting.js","web-directory/mixins/chat-user.js","web-directory/mixins/conversation-uri-builder.js","web-directory/mixins/conversation.js","web-directory/mixins/conversation/chats.js","web-directory/mixins/conversation/emails.js","web-directory/mixins/custom-fields-limits.js","web-directory/mixins/device-enumeration.js","web-directory/mixins/embedded-message-event-handler.js","web-directory/mixins/entity-controller.js","web-directory/mixins/entity-image-defaults.js","web-directory/mixins/entity-presence.js","web-directory/mixins/entity.js","web-directory/mixins/evaluations.js","web-directory/mixins/external-contacts.js","web-directory/mixins/faxes.js","web-directory/mixins/flag.js","web-directory/mixins/job.js","web-directory/mixins/logger.ts","web-directory/mixins/model-route.js","web-directory/mixins/paging.js","web-directory/mixins/password-rules.js","web-directory/mixins/phone-service/active-call.js","web-directory/mixins/phone-service/call-controls.js","web-directory/mixins/phone-service/call-forward.js","web-directory/mixins/phone-service/conversation-manager.js","web-directory/mixins/phone-service/events.js","web-directory/mixins/phone-service/notifications.js","web-directory/mixins/phone-service/station.js","web-directory/mixins/promise-loading.js","web-directory/mixins/roster-badge-tracking.js","web-directory/mixins/sort-chat-users.js","web-directory/mixins/unprotected-route-mixin.js","web-directory/mixins/viewport.js","web-directory/mixins/webrtc-action-utils.js","web-directory/mixins/webrtc-conversation-analysis.js","web-directory/mixins/webrtc-conversation-session-events.js","web-directory/mixins/webrtc-service/auto-save-devices.js","web-directory/mixins/webrtc-service/webrtc-conversation-manager.js","web-directory/mixins/webrtc-service/webrtc-debug.js","web-directory/mixins/webrtc-service/webrtc-events.js","web-directory/mixins/webrtc-service/webrtc-media.js","web-directory/mixins/webrtc-service/webrtc-message-notifications.js","web-directory/mixins/webrtc-service/webrtc-stats.js","web-directory/models/app-api-call.js","web-directory/models/app-instance.js","web-directory/models/app-pool.js","web-directory/models/app.js","web-directory/models/call-communication.js","web-directory/models/call-forwarding.js","web-directory/models/callback-communication.js","web-directory/models/callv2.ts","web-directory/models/chat-communication.js","web-directory/models/chat-message.js","web-directory/models/chat-room.js","web-directory/models/coaching-appointment.js","web-directory/models/command-button-factory.ts","web-directory/models/communication.js","web-directory/models/conversation-legacy.js","web-directory/models/conversation.js","web-directory/models/email-communication.js","web-directory/models/evaluation.js","web-directory/models/external-contact.js","web-directory/models/externalcontacts/channel-record.js","web-directory/models/externalcontacts/contact.js","web-directory/models/externalcontacts/external-organization.js","web-directory/models/fax.js","web-directory/models/geolocation-settings.js","web-directory/models/geolocation.js","web-directory/models/github-item.js","web-directory/models/group-policy.js","web-directory/models/group.js","web-directory/models/interaction/call-interaction.js","web-directory/models/interaction/callback-interaction.js","web-directory/models/interaction/chat-interaction.js","web-directory/models/interaction/email-interaction.js","web-directory/models/interaction/interaction.js","web-directory/models/interaction/message-interaction.js","web-directory/models/internally-hosted-app.js","web-directory/models/location.js","web-directory/models/message-communication.js","web-directory/models/org.js","web-directory/models/participant.js","web-directory/models/person.js","web-directory/models/presence.js","web-directory/models/public-api-user.js","web-directory/models/queue.js","web-directory/models/recorded-call.js","web-directory/models/recording.js","web-directory/models/resource-article.js","web-directory/models/screenshare-communication.js","web-directory/models/skillgroup.js","web-directory/models/split-message.js","web-directory/models/station.js","web-directory/models/unrecoverable-app-failure.ts","web-directory/models/user.js","web-directory/models/video-communication.js","web-directory/models/video-participant-v2.js","web-directory/models/video-participant.js","web-directory/models/voicemail-message.js","web-directory/models/webrtc-conversation.js","web-directory/models/wfm-notification.js","web-directory/phone/route.js","web-directory/phone/template.js","web-directory/resolver.js","web-directory/router.js","web-directory/routes/admin-emergency-group-detail-redirect.js","web-directory/routes/admin-emergency-group-list-redirect.js","web-directory/routes/admin-entry.js","web-directory/routes/admin.js","web-directory/routes/application.js","web-directory/routes/center-stage-frame.js","web-directory/routes/center-stage-frame/internal.js","web-directory/routes/chat-room.js","web-directory/routes/content-management.js","web-directory/routes/conversations.js","web-directory/routes/custom-fields-contacts-redirect.js","web-directory/routes/custom-fields-orgs-redirect.js","web-directory/routes/engage/did-assignment-redirect.js","web-directory/routes/engage/embedded.js","web-directory/routes/engage/inprogress-screenrecordings-redirect.js","web-directory/routes/engage/interaction-screenrecordings-redirect.js","web-directory/routes/engage/interaction-search-redirect.js","web-directory/routes/engage/interaction-videorecordings-redirect.js","web-directory/routes/engage/quality-redirect.js","web-directory/routes/engage/quality.js","web-directory/routes/engage/queue-activity-detail-redirect.js","web-directory/routes/engage/queue-activity-summary-redirect.js","web-directory/routes/engage/queue-performance-detail-redirect.js","web-directory/routes/engage/queue-performance-summary-redirect.js","web-directory/routes/engage/recording-management-redirect.ts","web-directory/routes/engage/telephony-admin-extensions-redirect.js","web-directory/routes/engage/telephony-admin-redirect.js","web-directory/routes/engage/wfm-admin-redirect.js","web-directory/routes/feedback.js","web-directory/routes/index.js","web-directory/routes/interaction-detail-redirect-agent.js","web-directory/routes/interaction-detail-redirect.js","web-directory/routes/interaction.js","web-directory/routes/interactions.js","web-directory/routes/internal-logs.js","web-directory/routes/login-oauth.js","web-directory/routes/login.js","web-directory/routes/maintenance.ts","web-directory/routes/no-access.js","web-directory/routes/partners/clients.js","web-directory/routes/policy-access-denied.js","web-directory/routes/region-chooser.js","web-directory/routes/relate/contacts-ui-redirect.js","web-directory/routes/reset-password.js","web-directory/routes/screen-share.js","web-directory/routes/signup.js","web-directory/routes/skillgroup/detail.js","web-directory/routes/third-party/app-embed.js","web-directory/routes/time-machine.js","web-directory/routes/timeline.js","web-directory/search/adapter-mixin.js","web-directory/search/request-builder.js","web-directory/search/service.js","web-directory/search/store-mixin.js","web-directory/serializers/application.js","web-directory/serializers/call-communication.js","web-directory/serializers/call-forwarding.js","web-directory/serializers/callback-communication.js","web-directory/serializers/callv2.js","web-directory/serializers/chat-communication.js","web-directory/serializers/checkbox.js","web-directory/serializers/contact.js","web-directory/serializers/conversation.js","web-directory/serializers/date.js","web-directory/serializers/datetime.js","web-directory/serializers/email-communication.js","web-directory/serializers/enum.js","web-directory/serializers/external-org.js","web-directory/serializers/externalcontacts/contact.js","web-directory/serializers/externalcontacts/external-organization.js","web-directory/serializers/field.js","web-directory/serializers/geolocation-settings.js","web-directory/serializers/geolocation.js","web-directory/serializers/group-policy.js","web-directory/serializers/group.js","web-directory/serializers/identifier.js","web-directory/serializers/integer.js","web-directory/serializers/location.js","web-directory/serializers/longtext.js","web-directory/serializers/message-communication.js","web-directory/serializers/number.js","web-directory/serializers/participant.js","web-directory/serializers/person.js","web-directory/serializers/public-api-user.js","web-directory/serializers/purecloud.js","web-directory/serializers/queue.js","web-directory/serializers/recorded-call.js","web-directory/serializers/recording.js","web-directory/serializers/screenshare-communication.js","web-directory/serializers/skillgroup.js","web-directory/serializers/station.js","web-directory/serializers/tag.js","web-directory/serializers/text.js","web-directory/serializers/url.js","web-directory/serializers/user.js","web-directory/serializers/video-communication.js","web-directory/serializers/voicemail-message.js","web-directory/services/acdcall.js","web-directory/services/acdcallback.js","web-directory/services/acdchat.js","web-directory/services/acdemail.js","web-directory/services/acdinitialization.ts","web-directory/services/acdsms.js","web-directory/services/acdvoicemail.js","web-directory/services/acdworkitem.ts","web-directory/services/addressformat.js","web-directory/services/admin-access.js","web-directory/services/admin-nav.js","web-directory/services/adminui.js","web-directory/services/agent-assist-checks.ts","web-directory/services/agent-schedule.ts","web-directory/services/agent-ui-backend.js","web-directory/services/ajax.js","web-directory/services/alerting.ts","web-directory/services/analytics.js","web-directory/services/application.js","web-directory/services/apps-api-handlers/attention-count-handler.js","web-directory/services/apps-api-handlers/directory-nav-handler.js","web-directory/services/apps-api-handlers/external-contacts-handler.js","web-directory/services/apps-api-handlers/lifecycle-handler.js","web-directory/services/apps-api-handlers/my-interactions-handler.js","web-directory/services/apps-api-handlers/open-panel-handler.js","web-directory/services/apps-api-handlers/open-window-handler.js","web-directory/services/apps-api-handlers/propose-message-handler.js","web-directory/services/apps-api-handlers/resource-center-handler.js","web-directory/services/apps-api-handlers/show-interaction-details-handler.js","web-directory/services/apps-api-handlers/toast-handler.js","web-directory/services/apps-v2-api-handlers/apps-v2-sdk-handler.ts","web-directory/services/apps-v2-api-handlers/associate-activity-message-handler.ts","web-directory/services/apps-v2-api-handlers/conversations-list-message-handler.ts","web-directory/services/apps-v2-api-handlers/conversations-message-handler.ts","web-directory/services/apps-v2-api-handlers/hawk-message-handler.ts","web-directory/services/apps-v2-api-handlers/legacy-message-handler.ts","web-directory/services/apps-v2-api-handlers/modal-message-handler.ts","web-directory/services/apps-v2-api-handlers/monitoring-message-handler.ts","web-directory/services/apps-v2-api-handlers/open-panel-handler.ts","web-directory/services/apps-v2-api-handlers/open-window-handler.ts","web-directory/services/apps-v2-api-handlers/toast-handler.ts","web-directory/services/apps.js","web-directory/services/batch-data-requests.js","web-directory/services/bookmark-page-title.ts","web-directory/services/case-association.ts","web-directory/services/center-stage-frame.js","web-directory/services/chat-commands.js","web-directory/services/chat-frame.js","web-directory/services/chat.js","web-directory/services/clock.js","web-directory/services/coaching.js","web-directory/services/cobrowse.js","web-directory/services/command-nav.ts","web-directory/services/communication.js","web-directory/services/contactlist.js","web-directory/services/conversation-timeline-logger.js","web-directory/services/conversation.js","web-directory/services/cookies.js","web-directory/services/copilot-broadcast.ts","web-directory/services/customer-intent.ts","web-directory/services/device-profiles-v2.js","web-directory/services/direct-routing.js","web-directory/services/documents.js","web-directory/services/emergency-location.js","web-directory/services/engage.js","web-directory/services/engageanalytics.js","web-directory/services/events.ts","web-directory/services/external-contacts.js","web-directory/services/favicon.js","web-directory/services/favorites.js","web-directory/services/fax.js","web-directory/services/feature.js","web-directory/services/file-upload.js","web-directory/services/fullscreen.js","web-directory/services/geolocation.js","web-directory/services/help.js","web-directory/services/iframe-state.js","web-directory/services/inbox.js","web-directory/services/integrations-presence.js","web-directory/services/interaction.js","web-directory/services/internal-messaging.ts","web-directory/services/intl.js","web-directory/services/learning.js","web-directory/services/log-capture.js","web-directory/services/media-providers.js","web-directory/services/modal-dialog.js","web-directory/services/modal.js","web-directory/services/modes/conversation-mode-service.ts","web-directory/services/modes/interapptions-state-service.ts","web-directory/services/modes/mainstage-layout-service.ts","web-directory/services/modes/mode-service.ts","web-directory/services/modes/roster-selection-service.ts","web-directory/services/modes/roster-side-panel-service.ts","web-directory/services/modes/utils/conversation-processing-steps/call-specific-processing-steps.ts","web-directory/services/modes/utils/conversation-processing-steps/callback-specific-processing-steps.ts","web-directory/services/modes/utils/conversation-processing-steps/email-specific-processing-steps.ts","web-directory/services/modes/utils/conversation-processing-steps/message-specific-processing-steps.ts","web-directory/services/modes/utils/conversation-processing-steps/shared-processing-steps.ts","web-directory/services/modes/utils/workitem-processing-steps.ts","web-directory/services/modes/workitem-mode-service.ts","web-directory/services/monitoring.ts","web-directory/services/names.js","web-directory/services/notification.js","web-directory/services/participant-name.ts","web-directory/services/permissions.js","web-directory/services/phone-integrations.js","web-directory/services/phone.js","web-directory/services/pigeon-v1.js","web-directory/services/pigeon-v2.ts","web-directory/services/pigeon.ts","web-directory/services/preferences.js","web-directory/services/presence-subscription.js","web-directory/services/presence.js","web-directory/services/purecloud-oauth.js","web-directory/services/queue-toggle.js","web-directory/services/queue.js","web-directory/services/relate.js","web-directory/services/ring.js","web-directory/services/rolling-log-capture.js","web-directory/services/roster.js","web-directory/services/screen-media.ts","web-directory/services/screen-monitor-notifications.ts","web-directory/services/screen-recording.js","web-directory/services/session.js","web-directory/services/settings.js","web-directory/services/side-panel.js","web-directory/services/sidebar.js","web-directory/services/sound.js","web-directory/services/stash-logger.js","web-directory/services/storage.ts","web-directory/services/store.js","web-directory/services/streaming.js","web-directory/services/task-management.ts","web-directory/services/timeline.ts","web-directory/services/trial.js","web-directory/services/video-conference-details.ts","web-directory/services/volt.js","web-directory/services/webrtc-sdk.ts","web-directory/services/webrtc-settings.ts","web-directory/services/webrtc.js","web-directory/services/wfm.js","web-directory/session-stores/application.js","web-directory/templates/about/index.js","web-directory/templates/admin.js","web-directory/templates/application.js","web-directory/templates/chat-room.js","web-directory/templates/components/webhooks-collapsible.js","web-directory/templates/components/webhooks.js","web-directory/templates/feedback.js","web-directory/templates/index.js","web-directory/templates/internal-logs.js","web-directory/templates/login-oauth.js","web-directory/templates/maintenance.js","web-directory/templates/nav-system-v2/agent-ui.js","web-directory/templates/nav-system-v2/mainstage.js","web-directory/templates/nav-system-v2/modals.js","web-directory/templates/no-access.js","web-directory/templates/partials/-no-station-notification.js","web-directory/templates/policy-access-denied.js","web-directory/templates/purecloud/partials/on-call.js","web-directory/templates/region-chooser.js","web-directory/templates/skillgroup/detail.js","web-directory/templates/third-party/app-embed.js","web-directory/templates/time-machine.js","web-directory/templates/timeline.js","web-directory/transforms/iso-date.js","web-directory/types/feature-toggle-keys.test.ts","web-directory/types/index.ts","web-directory/utils/acd-ts.ts","web-directory/utils/acd.js","web-directory/utils/acdParticipantStatuses.js","web-directory/utils/active-interactions-to-conversations.ts","web-directory/utils/acw-wrapup-gadget-cleanup.ts","web-directory/utils/adapter-auth-headers.js","web-directory/utils/address-format.js","web-directory/utils/analytics-routing.ts","web-directory/utils/app-provider.js","web-directory/utils/apps-v2-api-handlers.ts","web-directory/utils/apps.ts","web-directory/utils/async.ts","web-directory/utils/attach-media-stream.js","web-directory/utils/auth-constants.js","web-directory/utils/boolean-expressions.js","web-directory/utils/browser.js","web-directory/utils/code-utils.js","web-directory/utils/collab-chat-constants.ts","web-directory/utils/command-nav.ts","web-directory/utils/conversation-states.js","web-directory/utils/conversation.ts","web-directory/utils/date-time.ts","web-directory/utils/dates.js","web-directory/utils/debug-backburner.js","web-directory/utils/debug-rsvp.js","web-directory/utils/display-geolocation.js","web-directory/utils/duplicate-object.ts","web-directory/utils/email.js","web-directory/utils/emergency-location-util.js","web-directory/utils/emoji.js","web-directory/utils/entity-fields.js","web-directory/utils/error-white-list.js","web-directory/utils/escape.js","web-directory/utils/exponential-interval-generator.js","web-directory/utils/external-contact-messaging.js","web-directory/utils/feature-toggles.ts","web-directory/utils/find-last.ts","web-directory/utils/focus-management.js","web-directory/utils/gc-auth-coordinator.ts","web-directory/utils/genesys-app-name.ts","web-directory/utils/geolocation.js","web-directory/utils/gux-popover-list-a11y.ts","web-directory/utils/hosted-context.js","web-directory/utils/interaction-icons.ts","web-directory/utils/intl.js","web-directory/utils/intl/missing-message.js","web-directory/utils/jid-helpers.js","web-directory/utils/keystroke.ts","web-directory/utils/lru-cache.ts","web-directory/utils/mainstage.ts","web-directory/utils/markdown.js","web-directory/utils/menu.js","web-directory/utils/message-channels.js","web-directory/utils/modal.ts","web-directory/utils/names.ts","web-directory/utils/navigation-provider-expression-evaluator.ts","web-directory/utils/net.js","web-directory/utils/newrelic.ts","web-directory/utils/objects.js","web-directory/utils/outbound-recipient-validation.ts","web-directory/utils/participant-name.ts","web-directory/utils/pigeon.js","web-directory/utils/policy-access-denied.ts","web-directory/utils/post-auth-redirect.ts","web-directory/utils/presence-utils.ts","web-directory/utils/promise-array.js","web-directory/utils/query-parser.js","web-directory/utils/queued-processing-chain.js","web-directory/utils/reporting-alert-summary/reporting-alert-summary.ts","web-directory/utils/request.ts","web-directory/utils/roving-tabindex.ts","web-directory/utils/safeSet.js","web-directory/utils/schedule-callback-gadget.ts","web-directory/utils/serial-processing-chain.ts","web-directory/utils/shared-provider.ts","web-directory/utils/simple-cache.ts","web-directory/utils/streaming-client.js","web-directory/utils/string-transforms.ts","web-directory/utils/supported-messaging-subtypes.ts","web-directory/utils/testing.ts","web-directory/utils/timeout-promise.js","web-directory/utils/transform-panels.ts","web-directory/utils/ttl-cache.ts","web-directory/utils/types.ts","web-directory/utils/url-helpers.js","web-directory/utils/uuid.js","web-directory/utils/volt-popout.ts","web-directory/utils/webrtc-conversation-types.js","web-directory/utils/worker-provider.ts","web-directory/utils/workitem-create.ts","web-directory/views/card/tree.js","web-directory/worker-providers/notes-worker.ts","web-directory/worker-providers/wrapup-codes.worker.ts","vendor/ember-cli/app-config.js","vendor/ember-cli/app-boot.js"],"names":["f","exports","_typeof","module","define","amd","g","window","global","self","this","adapter","r","e","n","t","o","i","c","require","u","a","Error","code","p","call","length","1","SDPUtils","writeMediaSection","transceiver","caps","type","stream","dtlsRole","sdp","writeRtpDescription","kind","writeIceParameters","iceGatherer","getLocalParameters","writeDtlsParameters","dtlsTransport","mid","rtpSender","rtpReceiver","trackId","_initialTrackId","track","id","msid","sendEncodingParameters","ssrc","rtx","localCName","getCommonCapabilities","localCapabilities","remoteCapabilities","commonCapabilities","codecs","headerExtensions","fecMechanisms","findCodecByPayloadType","pt","parseInt","payloadType","preferredPayloadType","rtxCapabilityMatches","lRtx","rRtx","lCodecs","rCodecs","lCodec","parameters","apt","rCodec","name","toLowerCase","forEach","clockRate","JSON","parse","stringify","numChannels","Math","min","push","rtcpFeedback","filter","fb","j","parameter","lHeaderExtension","rHeaderExtension","uri","isActionAllowedInSignalingState","action","signalingState","offer","setLocalDescription","setRemoteDescription","answer","indexOf","maybeAddCandidate","iceTransport","candidate","alreadyAdded","getRemoteCandidates","find","remoteCandidate","foundation","ip","port","priority","protocol","addRemoteCandidate","makeError","description","NotSupportedError","InvalidStateError","InvalidAccessError","TypeError","undefined","OperationError","edgeVersion","addTrackToStreamAndFireEvent","addTrack","dispatchEvent","MediaStreamTrackEvent","fireAddTrack","pc","receiver","streams","trackEvent","Event","setTimeout","_dispatchEvent","RTCPeerConnection","config","_eventTarget","document","createDocumentFragment","method","bind","canTrickleIceCandidates","needNegotiation","localStreams","remoteStreams","_localDescription","_remoteDescription","iceConnectionState","connectionState","iceGatheringState","usingBundle","bundlePolicy","rtcpMuxPolicy","iceTransportPolicy","iceServers","hasTurn","server","urls","url","console","warn","isString","validTurn","filterIceServers","_iceGatherers","iceCandidatePoolSize","RTCIceGatherer","gatherPolicy","_config","transceivers","_sdpSessionId","generateSessionId","_sdpSessionVersion","_dtlsRole","_isClosed","Object","defineProperty","prototype","configurable","get","onicecandidate","onaddstream","ontrack","onremovestream","onsignalingstatechange","oniceconnectionstatechange","onconnectionstatechange","onicegatheringstatechange","onnegotiationneeded","ondatachannel","event","_emitGatheringStateChange","getConfiguration","getLocalStreams","getRemoteStreams","_createTransceiver","doNotAdd","hasBundleTransport","recvEncodingParameters","associatedRemoteMediaStreams","wantReceive","transports","_createIceAndDtlsTransports","alreadyExists","s","_maybeFireNegotiationNeeded","RTCRtpSender","addStream","getTracks","clonedStream","clone","idx","clonedTrack","addEventListener","enabled","removeTrack","sender","stop","map","splice","removeStream","getSenders","getReceivers","_createIceGatherer","sdpMLineIndex","shift","value","writable","bufferedCandidateEvents","bufferCandidates","end","keys","state","_gather","onlocalcandidate","removeEventListener","evt","sdpMid","cand","component","ufrag","usernameFragment","serializedCandidate","writeCandidate","assign","parseCandidate","toJSON","sections","getMediaSections","getDescription","join","complete","every","RTCIceTransport","onicestatechange","_updateIceConnectionState","_updateConnectionState","RTCDtlsTransport","ondtlsstatechange","onerror","_disposeIceAndDtlsTransports","_transceive","send","recv","params","encodings","rtcp","cname","compound","rtcpParameters","receive","sessionpart","Promise","reject","splitSections","mediaSection","parseRtpParameters","isIceLite","matchPrefix","rejected","isRejected","remoteIceParameters","getIceParameters","remoteDtlsParameters","getDtlsParameters","role","start","_updateSignalingState","resolve","receiverList","iceOptions","substr","split","lines","splitLines","getKind","direction","getDirection","remoteMsid","parseMsid","getMid","generateIdentifier","parseRtpEncodingParameters","parseRtcpParameters","isComplete","cands","setTransport","setRemoteCandidates","hasRtx","MediaStream","default","RTCRtpReceiver","getCapabilities","codec","isNewTrack","nativeTrack","removeTrackFromStreamAndFireEvent","sid","item","close","newState","states","new","closed","checking","connected","completed","disconnected","failed","connecting","createOffer","numAudioTracks","numVideoTracks","offerOptions","arguments","mandatory","optional","offerToReceiveAudio","offerToReceiveVideo","writeSessionBoilerplate","remoteCodec","hdrExt","remoteExtensions","rHdrExt","getLocalCandidates","desc","RTCSessionDescription","createAnswer","mediaSectionsInOffer","localTrack","getAudioTracks","getVideoTracks","reducedSize","addIceCandidate","candidateString","trim","getStats","selector","MediaStreamTrack","senderOrReceiver","promises","all","then","allStats","results","Map","stats","stat","set","ortcObjectName","obj","nativeGetstats","apply","nativeStats","mapStats","inboundrtp","outboundrtp","candidatepair","localcandidate","remotecandidate","methods","nativeMethod","args","error","2","random","toString","blob","line","parts","part","index","prefix","substring","address","relatedAddress","relatedPort","tcpType","toUpperCase","parseIceOptions","parseRtpMap","parsed","channels","writeRtpMap","parseExtmap","writeExtmap","headerExtension","preferredId","parseFmtp","kv","writeFmtp","param","parseRtcpFb","writeRtcpFb","parseSsrcMedia","sp","colon","attribute","parseSsrcGroup","semantics","ssrcs","parseFingerprint","algorithm","fingerprints","setupType","fp","concat","iceParameters","password","mline","rtpmapline","fmtps","maxptime","extension","secondarySsrc","encodingParameters","hasRed","hasUlpfec","primarySsrc","flows","encParam","codecPayloadType","fec","mechanism","bandwidth","maxBitrate","remoteSsrc","rsize","mux","spec","planB","msidParts","sessId","sessVer","sessUser","sessionId","version","user","parseMLine","fmt","slice","parseOLine","username","sessionVersion","netType","addressType","isValidSDP","charAt","3","adapterFactory","./adapter_factory.js","4","utils","dependencies","opts","options","shimChrome","shimFirefox","shimEdge","shimSafari","key","hasOwnProperty","logging","log","browserDetails","detectBrowser","chromeShim","edgeShim","firefoxShim","safariShim","commonShim","extractVersion","disableLog","disableWarnings","browser","shimPeerConnection","browserShim","shimCreateObjectURL","shimGetUserMedia","shimMediaStream","shimSourceObject","shimOnTrack","shimAddTrackRemoveTrack","shimGetSendersWithDtmf","shimSenderReceiverGetStats","fixNegotiationNeeded","shimRTCIceCandidate","shimMaxMessageSize","shimSendThrowTypeError","shimRemoveStream","shimSenderGetStats","shimReceiverGetStats","shimRTCDataChannel","shimReplaceTrack","shimGetDisplayMedia","shimRTCIceServerUrls","shimCreateOfferLegacy","shimCallbacksAPI","shimLocalStreamsAPI","shimRemoteStreamsAPI","shimTrackEventTransceiver","./chrome/chrome_shim","./common_shim","./edge/edge_shim","./firefox/firefox_shim","./safari/safari_shim","./utils","5","filterStats","result","outbound","streamStatsType","filteredResult","trackStats","trackIdentifier","trackStat","walkStats","base","resultSet","has","endsWith","webkitMediaStream","_ontrack","enumerable","origSetRemoteDescription","_ontrackpoly","te","wrapPeerConnectionEvent","shimSenderWithDtmf","dtmf","_dtmf","createDTMFSender","_pc","_senders","origAddTrack","origRemoveTrack","origAddStream","origRemoveStream","origGetSenders","senders","origGetReceivers","receivers","srcElement","origGetStats","err","DOMException","URL","HTMLMediaElement","_srcObject","src","revokeObjectURL","createObjectURL","shimAddTrackRemoveTrackWithNative","_shimmedLocalStreams","streamId","existingSenders","newSenders","newSender","origGetLocalStreams","nativeStreams","_reverseStreams","_streams","newStream","oldStream","isLegacyCall","replaceInternalStreamId","origSetLocalDescription","replaceExternalStreamId","origLocalDescription","getOwnPropertyDescriptor","isLocal","streamid","hasTrack","internalId","externalStream","internalStream","replace","RegExp","webkitRTCPeerConnection","pcConfig","pcConstraints","iceTransports","generateCertificate","successCallback","errorCallback","fixChromeStats_","response","standardReport","reports","report","standardStats","timestamp","names","makeMapStats","successCallbackWrapper_","promise","RTCIceCandidate","nativeAddIceCandidate","target","getSourceId","navigator","mediaDevices","getDisplayMedia","constraints","sourceId","widthSpecified","video","width","heightSpecified","height","frameRateSpecified","frameRate","chromeMediaSource","chromeMediaSourceId","maxFrameRate","maxWidth","maxHeight","getUserMedia","deprecated","../utils.js","./getusermedia","6","constraintsToChrome_","cc","ideal","exact","max","oldname_","oc","mix","advanced","shimConstraints_","func","audio","remap","b","face","facingMode","matches","getSupportedFacingModeLies","getSupportedConstraints","enumerateDevices","devices","d","dev","some","match","label","deviceId","shimError_","PermissionDeniedError","PermissionDismissedError","DevicesNotFoundError","ConstraintNotSatisfiedError","TrackStartError","MediaDeviceFailedDueToShutdown","MediaDeviceKillSwitchOn","TabCaptureError","ScreenCaptureError","DeviceCaptureError","message","constraint","constraintName","onSuccess","onError","webkitGetUserMedia","getUserMediaPromise_","kinds","getSources","device","groupId","echoCancellation","origGetUserMedia","cs","7","NativeRTCIceCandidate","nativeCandidate","parsedCandidate","augmentedCandidate","nativeCreateObjectURL","nativeRevokeObjectURL","newId","delete","dsc","srcObject","nativeSetAttribute","setAttribute","RTCSctpTransport","_sctp","sctpInDescription","mLine","getRemoteFirefoxVersion","getCanSendMaxMessageSize","remoteIsFirefox","canSendMaxMessageSize","getMaxMessageSize","maxMessageSize","isFirefox","canSendMMS","remoteMMS","Number","POSITIVE_INFINITY","sctp","origCreateDataChannel","createDataChannel","dataChannel","wrapDcSend","channel","dc","origDataChannelSend","data","size","byteLength","readyState","8","shimRTCPeerConnection","origMSTEnabled","ev","RTCDtmfSender","RTCDTMFSender","RTCPeerConnectionShim","replaceTrack","setTrack","preferredMediaSource","origGetDisplayMedia","../utils","./filtericeservers","rtcpeerconnection-shim","9","10","catch","11","RTCTrackEvent","mozSrcObject","mozRTCPeerConnection","newIceServers","newServer","credential","mozRTCSessionDescription","mozRTCIceCandidate","modernStatsTypes","nativeGetStats","onSucc","onErr","DataChannel","RTCDataChannel","mediaSource","12","InternalError","SecurityError","The operation is insecure.","getUserMedia_","constraintsToFF37_","mozGetUserMedia","orgEnumerateDevices","nativeGetUserMedia","getSettings","nativeGetSettings","applyConstraints","nativeApplyConstraints","13","_localStreams","getStreamById","_remoteStreams","_addTrack","tracks","_onaddstream","_onaddstreampoly","failureCallback","withCallback","cb","errcb","OrigPeerConnection","RTCTransceiver","origCreateOffer","audioTransceiver","getTransceivers","setDirection","addTransceiver","videoTransceiver","14","logDisabled_","deprecationWarnings_","uastring","expr","pos","eventNameToWrap","wrapper","proto","nativeAddEventListener","nativeEventName","wrappedCallback","modifiedEvent","_eventMap","nativeRemoveEventListener","unwrappedCb","bool","oldMethod","newMethod","userAgent","versions","people","groups","locations","users","messages","notifications","ApplicationAdapter","DS","RESTAdapter","extend","SearchAdapterMixin","logger","service","session","application","defaultSerializer","namespace","headers","hash","location","ININ-Client-Path","buildAuthHeaders","ajax","dataType","context","_super","shouldReloadAll","shouldBackgroundReloadRecord","normalizeErrorResponse","status","payload","normalizedPayload","title","detail","String","Array","isArray","errors","modelFor","pathForType","modelName","camelize","pluralize","createRecord","store","record","snapshot","_createSnapshot","serializerFor","serialize","includeId","buildURL","updateRecord","serializeIntoHash","attr","urlForUpdateRecord","_directoryUrl","findRecord","FULL_PERSON","fl","traditional","findQuery","query","entityEndpoint","path","modelEndpoint","apiVersion","host","findMultiEntity","requestType","limit","_entity","facets","returnFields","_toConsumableArray","BASE_PERSON","BASE_GROUP_FIELDS","performSearch","findFavorites","findFavoritesV3","_this","deferred","defer","_findFavoritesV3","res","_handleFavorites","page","count","offset","cache","collection","_this2","nextPage","currentCount","forwardVoicemail","voicemail","recipient","voicemailMessageId","userId","_findDirectReports","_handleReports","_this3","findDirectReports","_this4","findSuperiors","_exports","reads","ajaxOptions","mergeAuthHeaders","serializer","adapterOptions","patch","urlForFindRecord","handleResponse","requestData","paging","pageSize","pageNumber","queryDefaults","currentInterval","moment","previousInterval","subtract","typeClass","resetIntervals","findLatestCalls","_fetchLatestCalls","_fetchHistory","guid","interval","toISOString","add","getHistoryPath","meta","_","merge","entities","incrementPageNumber","decrementWeek","pcV2Uri","Schema","PurecloudAdapter","findHasMany","relationship","conversationId","LoggerMixin","relate","addressformat","permissions","cannotViewExternalContacts","not","clearCachedAdapter","originator","urlAndModel","URLSearchParams","expand","timeout","deleteRecord","returnValue","queryParams","addressFormat","searchTerm","expandField","sortOrder","subType","hasValidSearchTerm","isValidPhoneNumber","isValidNumber","containsOnlyPhoneNumberChars","test","isExactSearch","addPageAction","orgId","formatAddress","useLookupService","pcUri","lookupVal","term","encodeURI","q","decodeURI","bypassCache","findMatchingExternalContacts","getCachedAdapter","TIME_OUT","EXPAND","_baseUrl","groupPolicy","details","directoryHost","platformNameSpace","buildQuery","baseUrl","endpoint","urlForFindMany","fields","gProfile","general","memberCount","individuals","owners","groupSerializer","group","policy","generateGroupProfilePayload","jIdNumber","getJidIdNumber","contactInfo","chat","jid","getDeletedGroup","findMany","ids","snapshots","uuids","jIds","urlWithAppendedIds","urlDeletedWithAppendedIds","activeResults","getDeletedGroups","deleteUrl","groupsResults","deletedGroups","normalizeDeletedGroup","_this5","getUrl","deletedGroup","adapterFor","findGroupMembership","ceil","json","vmPolicy","organizationId","mt","membershipDraft","needsCommit","exchangeSync","links","cleanGroupLinkIds","email","groupNumber","phone","labelKey","hasGroupPhone","groupAlertType","numberInfo","hasNumber","number","hasExtension","groupType","jabberId","hashArg","BASE_LOCATION_FIELDS","urlForHasMany","floors","ajaxService","integrationsPresenceSvc","usingIntegrationSource","integrationPresenceSource","extraExpandArr","extraExpands","ajaxGet","snapshotsOrOptions","guids","jids","_findMany","superiors","mapBy","directReports","baseRequestData","batchEntityIds","_defineProperty","flat","integrationSource","_loadActivities","urlForQuery","findBelongsTo","link","modelClass","snapshotOrQuery","Content-Type","contextId","objId","Symbol","iterator","toStringTag","Generator","create","_regeneratorDefine2","y","G","v","l","done","return","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","setPrototypeOf","__proto__","displayName","_regenerator","w","m","_invoke","asyncGeneratorStep","_asyncToGenerator","_next","_throw","divisionLimit","_callee","fetchDivisions","divisionIds","_context","divisionAgnostic","myQueuesOnly","workitemDivisionId","divisionId","fetchDivisionsForTargetQueueSearch","entity","getDivisionLimits","RSVP","_callee2","_context2","permission","divisionAware","findAll","retentionAttributes","intl","pigeon","buildUrl","urlForQueryRecord","topicForQuery","topicForQueryRecord","topic","registerPriorityTopic","isStreamingConnected","awaitTopicEvent","_awaitTopicEvent","_httpGetWithRetry","finally","unRegisterPriorityTopic","debug","queryRecord","recordingId","recordingAttrs","_didChangeRetentionAttributes","reduce","acc","put","accepts","plain","raw","jqXHR","_handleHttpAccepted","pid","run","later","TimeoutError","cancel","topicParts","eventName","one","attributeChanges","changedAttributes","A","includes","oldVal","newVal","isSameDay","isSame","boolEqual","UserAdapter","sortQueryParams","sortBy","AgentAssistProvider","EmberObject","trustedProvider","assetPrefix","products","readOnly","isAgentAssistProductEnabled","computed","product","getAppConfigs","appContext","appContextType","apps","_t","_t2","_isSupportedMediaType","_checkIfAgentAssistIsEnabled","sandbox","GC_LANG_TAG_URL_REPLACEMENT_TOKEN","monochromicIcon","vector","interaction","interactionType","queueId","_checkIfQueueHasAssistant","request","assistantUrl","assistant","knowledgeSuggestionConfig","vendorName","_checkAssistantState","boolExpr","perm","inject","monitorInteractionUpdates","gadgetTargetOrigin","runtime","local","publicDomainName","origin","appDefs","urlParams","search","cannedResponseGadgetVersion","gadgetOrigin","myselfIsCoachOrMonitor","buildCannedResponsesGadgetDef","and","classNames","trustedDataPassing","startBehavior","lifecycleConfig","bootstrap","bootstrapTimeoutMillis","bootstrapReadyTimeoutMillis","loadTimeoutMillis","allow","runtimeEnv","validatePermissions","requiredPermissions","buildCaseGadgetDef","permissionsService","validateDonutPermission","ft","getGadgetUrl","validatePortNumber","_ref","focus","blur","CoPilotProvider","agentAssistChecks","isCoPilotProductEnabled","locale","_checkIfSmartAdvisorIsEnabled","typeOf","buildCoPilotGadgetDef","getCopilotGadgetUrl","getCommunicationType","stashLogger","interactionService","useMultipanel","init","Ember","on","getAvailableAppSizes","getCanUseFocusMode","activeSession","_getActiveCobrowseSession","_setCobrowseStatusActive","buildCobrowseIframeApp","_setCobrowseStatusInactive","_createCobrowseSession","targetConversation","post","_handleCobrowseError","isTesting","appUtils","buildInterapptionsLogMsg","remoteData","interactionId","agent","cobrowsesessions","cobrowseSessions","setProperties","cobrowseSessionShareActive","sessionShareActiveOnLoad","isCobrowseV2","isCobrowseV2Disconnected","or","consultGadgetVersion","_currentParticipant$i","_peerParticipant$inte","currentParticipant","currentParticipantInternalMessage","internalMessages","peerId","participants","peerParticipant","participant","_participant$internal","peerParticipantInternalMessage","buildConsultGadgetDef","ConversationDetailsInterapptionsProvider","PARTICIPANT_DATA_CARD_KEY_PREFIXES","customerParticipantData","agentHasViewPermission","hasParticipantData","startsWith","buildConversationDetailsGadgetDef","route","assertNever","_ref$route","emailGadgetVersion","buildEmailGadgetDef","JOURNEY_HAWK_LOCAL_PROXY_PATH","BASE_GADGET_PARAMS","environment","PC_ENV_URL_REPLACEMENT_TOKEN","gcTargetEnvironment","GC_TARGET_ENV_REPLACEMENT_TOKEN","gcHostOrigin","GC_HOST_ORIGIN_REPLACEMENT_TOKEN","HOLISTIC_JOURNEY_HAWK_PARAMS","_objectSpread","HolisticJourneyInterapptionsProvider","canUseClientV2","getFeatureToggle","externalContactId","isPresent","hasPermission","_getHcjHawkConfig","loadClientV2","toggle","holisticJourneyHawkParams","hcjVersion","_buildGadgetQueryString","icon","guxIcon","decorative","_len","paramObjs","_key","paramCount","currParam","currValue","encodeURIComponent","INTEGRATIONS_INTERAPPTIONS_PROVIDER_ID","IntegrationsInterapptionsProvider","_cachedApps","fetchInterapptions","findAllInterapptions","reason","interapptions","currInterapption","_filterForQueue","_filterForInteraction","interapption","enableWorkitem","enabledCommunicationTypes","currInteractionCommType","INTERAPPTION_COMMUNICATION_TYPE_FILTERS","enabledQueueIds","currQueueId","_interaction$agent","messagingGadgetVersion","buildMessagingGadgetDef","myselfIsMonitorV2","buildNotesGadgetDef","ProfilePanelProvider","canSupportWorkItems","useLocalProfilePanel","isLowers","runningWebDirectoryLocally","getVersion","targetOrigin","branch","searchParams","buildProfilePanelDef","agentHasPermission","isCallOrCallback","isInConsult","buildScheduleCallbackGadgetDef","scriptProviderConfigs","shouldBuild","features","workitem","scriptId","getAppGroup","_appDef","appDef","scripterGadgetVersion","foundProviderConfig","scripterAppDef","stopTimeoutMillis","buildScripterGadgetDef","SmartAdvisorProvider","isSmartAdvisorProductEnabled","supportedProducts","GC_CONVERSATION_ID_URL_REPLACEMENT_TOKEN","roomJid","_getActiveVideoRoomJid","buildVideoIframeApp","isVoltLocalhost","_createVideo","communicationId","_handleVideoError","videos","activeConference","conference","roomJId","voltUrl","getVoltFeatureBranch","buildWorkitemDetailsGadgetDef","_division","division","assignmentState","requiredStatusPermissions","buildWorkitemStatusGadgetDef","requiredWrapupPermissions","buildWorkitemWrapupGadgetDef","gadgetRoute","buildBaseWorkitemGadgetDef","iconClassNames","_ref2","_ref3","popoutAuthForIframes","_appContext$payload$g","hideAfterCallWork","buildWrapupCodesGadgetDef","_ref$popoutAuthForIfr","urlSearchParams","usePopupAuth","iframeCoordinator","registerCustomElements","defineCustomElements","APP","LOG_RUNLOOP_STACKTRACE","backburner","DEBUG","LOG_BINDINGS","defineModifier","App","Application","cookies","applicationService","customEvents","navRequest","notifyRequest","modalRequest","pageChanged","itemsPerPageChanged","favoriteEvent","contactEvent","navigateToProfileEvent","guxdismiss","checkAccessibility","axeLive","runOnly","values","modulePrefix","podModulePrefix","Resolver","entityTypes","currentRouteName","initVersion","initContext","isImpersonating","proxyPersonId","read","iframed","top","libraries","register","semver","ENV","LOG_VERSION","libs","parseQueryParams","controllerFor","instance","lookup","serviceFor","componentFor","listAsync","resolveRegistration","logTimerQueue","logPendingPromises","promiseStackFor","lookupPromiseStack","loadInitializers","stackTraceLimit","createTemplateFactory","block","moduleName","isStrictMode","constructor","Base","storage","purecloudOauth","_authData","_willRetryBootstrap","_ajaxPrefilters","_ajaxErrors","_onClient401Handler","_onAccountSwitchRequestHandler","$","Callbacks","ajaxPrefilter","fire","ajaxError","restore","pcuiauth_restore","accessToken","access_token","_establishLocalSession","AUTH_CONFIG","OAUTH_STORE_PROPS","_getLocationHash","_getLocationPathname","pathname","_getLocationSearch","_getLocationHostname","hostname","_replaceHistoryState","newUrl","history","replaceState","_setLocationHash","_saveFramePathOverrides","overrides","extractQueryParamsByPrefix","FRAME_PATH_OVERRIDE_PREFIX","setSessionStorageItem","FRAME_PATH_OVERRIDE_SEARCH_KEY","_restoreFramePathOverrides","stashed","getSessionStorageItem","mergeQueryParams","authenticate","locationHash","REDIRECT_FRAGMENT_KEY","redirectUrl","_buildRedirectUri","locationPathname","TIMEMACHINE_PATH_REGEX","timeMachineFragment","TIMEMACHINE_FRAGMENT_PREFIX","authOptions","redirectTo","orgName","regionName","_gcMfeAuthenticateAndBootstrap","removeSessionStorageItem","finalOptions","OAUTH_STORE_PARAMS","_buildAuthRejection","pcuiauth_authenticate","scope","deserializeRestoreState","expires_in","token_expiry_time_millis","_getCurrMillis","token_expiry_time_iso_string","Date","POLICY_ACCESS_DENIED_TYPE","SESSION_BOOTSTRAP_ERROR_TYPE","failedStep","stateParam","authUrl","_buildAuthUrl","invalidate","allSettled","_destroyLocalSession","deauthorizeAllDomainRequests","extractAuthData","accumulator","currPair","tokens","currToken","decodeURIComponent","buildAuthorizeUrl","org","buildLogoutUrl","cleanCustomBrowserStorage","clear","clearSession","coordinatedAuthenticate","_resolve","_reject","token","cleanedSearch","removeQueryParams","ACCOUNT_SWITCHER_PARAMS","restoredSearch","currentHash","storedFragment","alreadyInTimeMachine","tmMatch","localSessionDeferred","authorizeAllDomainRequests","authenticateWithSession","removeAuthCookie","legacyInvalidSessionToken","ensureLogsSent","_x","_this6","clearActiveSession","login","stateParamValue","targetOrg","baseAuthUri","clientId","oauthParams","response_type","client_id","enableRegionSwitching","redirect_uri","LOGIN_PATH","LOGOUT_PATH","buildRedirectUri","AUTH_COOKIE_NAME","_this7","immediateSaveLogs","now","_isAbsPathOfProxiedEnv","envDetails","tgtEnvDetails","netUtils","getEnvDetails","env","unknownEnv","_isWhitelistedUrl","_isGcPublicApiUrl","pubApiBase","pubApiProxyBase","currBase","_handleUnauthorizedRequests","settings","thrownError","_this8","skipPurecloudUnauthorizedCheck","crossDomain","_sendXhrErrorDetails","unauthorized","_handleClientUnauthorizedError","_this9","_sendErrorMessage","isUnauthorizedError","xhr","correlationId","getResponseHeader","messageData","beforeSend","app","appId","appVersion","traces","level","time","_addHeadersPrefilter","original","excludeAuthHeaderForFax","isFaxUpload","_buildHeaders","Authorization","headerValue","headerName","setRequestHeader","headerTokens","appContextHeaderTokens","REQUEST_TELEMETRY_APP_SUBSECTIONS","subsection","subsectionTokens","curr","finalHeader","appName","getGenesysAppName","isHosted","isPopout","gcAuthHost","Host","authData","_this0","onClient401","msg","client","onAccountSwitchRequest","environments","serviceDiscoveryWeb","getEnvironments","region","publicDomainAliases","appsLink","href","pcUiAuth","empty","DirectoryAuthenticator","ACCOUNT_SWITCHER_CONFIG","FrameRouter","intlService","frame","_getLocationOrigin","didInsertElement","requestAnimationFrame","isDestroyed","isDestroying","perform","timeMachineUrl","isLocalhost","setupFrames","task","appUrl","urlOverride","clientConfig","clients","account-switcher","assignedRoute","envData","hostRootUrl","custom","oauth_client_id","getClientId","element","setupToasts","publishToClient","publish","_arrayLikeToArray","_arrayWithoutHoles","from","_iterableToArray","_unsupportedIterableToArray","_nonIterableSpread","_slicedToArray","_arrayWithHoles","next","_iterableToArrayLimit","_nonIterableRest","Component","acdemail","acdsms","acdcall","acdworkitem","agentUIBackend","externalContacts","notification","participantName","queue","queueToggle","sidebar","commandNav","webrtc","webrtcSdk","caseAssociation","active","onQueue","selectedInteraction","selectedWorkitem","emergencyLocationData","emergencyLocationOn","streamingConnected","requestedInteraction","requestedWorkitemId","_defaultPanelSettings","interapptionProviders","workerProviders","cachedDivisionsMap","SimpleCache","cannedResponseChatText","cannedResponseSmsText","cannedResponseEmailText","structuredMessage","communicationSidebarExpanded","defaultPanelSettings","standardTransformationFtComputedDepKey","_this$get","basePanelSettings","fromEntries","entries","currSetting","transformedPanel","transformPanelSetting","panelId","addNativeProvider","v2InterapptionProviders","useAppsV2ConversationInterapptionManager","appPoolV2","attentionCountPerCompositeId","hasConversationAppForCurrInteraction","visibleContextualAppsForCurrInteraction","hasContextualFocusModeEnabled","hasMainstageFocusModeEnabled","activeSubPanelInterapptions","selectedSubPanelInterapptionStateKey","contextualInteractionScriptStateMap","selectedInteractionTask","conversation","selectedAppContext","selectedTaskId","currAppContext","activeInteractionTasks","conversations","workitems","tasks","conversationTasks","workitemTasks","activeAppContexts","forcedPanelSelectionMap","baseForcedPanelSelectionMap","forcedPanels","requiresStructuredMessage","_doesRequireStructuredMessage","internalMessagesForCurrentUser","computeInteractionKey","getInteractionType","_ref4","transformPanelId","activeInteractions","activeWorkitems","isOnQueue","currentUserId","acdPanelOpen","isTypingInteractions","hideInteractionButtons","draftUpdateHash","useNewNav","contacts","e911","canCreateEmail","canSendMessage","canMakeCall","canViewExternalContacts","canViewQueue","canViewCustomerIntents","featureToggles","acdAnswerFocusFix","acdExternalContactDivNameFT","acdExternalContactWorkitemsDivNameFT","acdAnnounceMonitoring","acdAnnounceMonitoringDigital","acdEngagementSourcesFT","acdWarmConferencePhase1FT","agentAddressOnBehalfOfQueue","useScripterGadget","inactivityTimeoutFT","caseAssociationRequestFT","caseAgentWorkitemUIFT","alertingCallInteractions","interactions","interactionsNeedingSession","hasPendingSesion","findBy","needsSession","int","acceptedByClient","shouldAutoAnswer","caseCacheVersion","getCaseForInteraction","_caseAssociation$getC","getCachedCase","activeInteractionsMetadataMap","currInteraction","currInteractionId","selectedSubPanelInterapptionId","stateKey","activeInterapptions","useCommunicationACW","actionDeclineInteraction","intService","actionSelectInteraction","automated","setSelectedInteraction","skipHolding","actionSelectWorkitemInteraction","actionGoOnQueue","handleToggle","actionCreateCall","selection","_getProperties","getProperties","contactId","makeCall","actionCreateEmail","_getProperties2","createEmail","actionCreateMessage","toAddressMessengerType","createMessage","actionLoadQueue","fetchQueueName","actionLoadParticipantName","participantId","noName","fetchNameFromParticipant","loadDivisionName","_callee4","_state$featureToggles","_cachedDivisionsMap$g","_context4","_callee3","divisionName","_context3","actionAnswerWorkitemInteraction","workitemInteraction","_error$payload","_displayError","actionDeclineWorkitemInteraction","decline","_error$payload2","_this$get2","holdingWorkitems","hold","unhold","_error$payload3","safeSet","configureAppProviders","providerConfigMap","getOwner","providerConfig","_buildProviderConfig","_buildAppProviderComputed","configureWorkerProviders","workerProviderConfigMap","_buildWorkerProviderComputed","configureDefaultPanels","_this1","shouldFetchDefaultPanelSettings","getOrganizationDefaultPanelSettings","requestInteraction","handleAnswerInteraction","requestWorkitem","workitemId","_closeSidebar","selectPanel","closePanel","_toggleSidebar","togglePanel","toggleCommunicationSidebarExpanded","bindCreateEvents","EMAIL_CONVERSATION_CREATED_EVENT","MESSAGE_CONVERSATION_CREATED_EVENT","CALL_CONVERSATION_CREATED_EVENT","ANSWER_INTERACTION_EVENT","WORKITEM_ASSIGNMENT_STATE_CHANGED_EVENT","unbindCreateEvents","off","processActiveRoutableChanges","requestedInteractionId","requestedWorkitem","selectedId","activeSelectedInteraction","wi","messageKey","messageKeyOptions","lastInbound","getTime","actionAnswerInteraction","_this10","isExternalCampaign","clipboard","formattedCustomerPhoneNumber","writeText","actionContextualScriptAvailabilityChanged","scriptAvailable","scripterMap","interactionScriptDetails","changeCount","activeIds","syncedScripterMap","actionOnAppPoolReady","actionOnAppAttentionCountChanged","actionOnContextualAvailableAppsChanged","resolvedApps","_step","panelCfgs","_iterator","_createForOfIteratorHelper","_step$value","compositeId","assets","buildV1IconAsset","actionOnHasConversationAppForCurrInteractionChanged","actionOnVisibleContextualAppsForCurrInteractionChanged","actionOnHasContextualFocusModeEnabledChanged","actionAppsForcedOpen","_appDefIds","_setMainstageFocused","actionOnSubPanelSelectionChanged","panelStateKey","actionFetchDefaultQueue","singularType","singularizeMediaType","getDefaultQueue","actionFetchQueue","didReceiveAttrs","debounce","willDestroyElement","actions","contextualScriptAvailabilityChanged","onAppPoolReady","onAppAttentionCountChanged","onContextualAvailableAppsChanged","onHasConversationAppForCurrInteractionChanged","onVisibleContextualAppsForCurrInteractionChanged","onHasContextualFocusModeEnabledChanged","focusModeEnabled","onAppsForcedOpen","appDefIds","onHasMainstageFocusModeEnabledChanged","onSubPanelSelectionChanged","answerInteraction","declineInteraction","selectInteraction","goOnQueue","createCall","displayError","getCanonicalContactSync","loadQueueName","fetchQueue","loadParticipantName","answerWorkitemInteraction","declineWorkitemInteraction","selectWorkitemInteraction","throttle","buildValidInterapption","typeId","fetchDefaultQueue","insertChatText","text","insertSmsText","strippedText","insertEmailText","onCloseSidebar","onToggleSidebar","participantUserId","connectedTime","isHeld","isConfined","isConfineLoading","isHoldLoading","isDisconnectLoading","isTransferLoading","isConferenceLoading","conversationType","controlType","loading","isInitiator","equal","isConsultant","isCall","isInteractionActive","initials","getInitials","connectedTimeDisplay","formatTimestampForDisplay","fetchData","actionConfine","warnClosureAction","actionUnconfine","actionHold","actionUnhold","actionDisconnect","actionTransfer","actionConference","actionMergeToConference","onConfine","onUnconfine","onHold","onUnhold","onDisconnect","onTransfer","onConference","onMergeToConference","classNameBindings","subtype","engagementSource","isDisconnected","isCampaign","priorityState","showExternalCampaignWarning","showBottomContainer","nameTooltip","connectedDuration","showExtraActions","extraSpacing","actionCopy","actionCloseSidebar","actionToggleSidebar","onCopy","attributeBindings","tagName","disabled","accent","superscript","ariaLabel","ariaPressed","ariaExpanded","ariaDisabled","effectiveAriaDisabled","tooltip","selectedOptionsIndex","tooltipId","selected","actionSelected","option","onOptionSelect","optionIndex","onAction","hidden","mutationObserver","determineVisibility","observer","MutationObserver","observe","characterData","childList","attributes","disconnect","children","canCreateCall","canCreateMessage","canShowActions","showSettings","showCall","showEmail","showMessaging","targetForAttr","for","doFocus","onClosePopover","querySelectorAll","isOpen","onTogglePopover","prop","popoverId","popover","querySelector","MessageNotificationsMixin","EmbeddedMessageEventHandlerMixin","safestring","_updateFrameUrl","isScriptAvailable","hasScriptViewPermission","frameUrl","queryParameter","isNotListeningOrAssistingAgent","interactionSupportsScripts","contentWindow","scriptReportCallback","onload","_updateFrameUrlOnChange","messageHandlers","toast","publishOnUserInteraction","clickHandler","sendMessage","sendEngageNotification","scriptexists","accessibleIconTextKey","baseKey","MESSAGING_SUBTYPES","getTextKey","accessibleStateTextKey","_this$get3","textKey","unreadMessageCount","unreadCount","accessibleTextKey","_this$get4","_this$get5","iconLabel","hasStateLabel","stateIconLabel","tooltipTextId","iconName","getIconName","ownKeys","getOwnPropertySymbols","getOwnPropertyDescriptors","defineProperties","toPrimitive","_toPrimitive","_toPropertyKey","_n","F","_hangUpCustomer2","NOTIFICATION_HANDLED_REJECTIONS","InteractionDropdownProps","WatchInteractionProperties","acdcallback","conversationModeService","acdchat","communication","internalMessaging","contactlist","phoneIntegrations","preferences","workitemModeService","clock","joinChat","_handleAgentEndedCallWithError","_handleConversationSummaryEvent","authUser","getPreference","_ref$scriptSize","scriptSize","setPreference","localPanelSizeMapStorageValue","getLocalStorageItem","localPanelSizeMapParsedStorageValue","isValidPanelSizeMap","_unused","getPreferenceStorageItem","_prevAppCtx","prevAppContext","__prevAppCtx","newAppContext","interactionChanged","didSelectNewInteraction","updatePrevInteraction","prevUseCommunicationACW","retrieveNotesHistory","prevInteraction","payloadForCheck","changedProperties","checkInteractionProperties","didInteractionUpdate","_mainstagePreferenceChanged","isCollapsed","isFocused","savePreference","didActiveInteractionsChange","interactionIds","Set","prevInteractionIds","removedInteractionIds","currId","removeInteractionMainstageLayoutsFromMemory","_activeInteractionsTimer","showProfileEventName","localStorage","removeItem","tearDown","updateCustomerParticipantName","ecId","_updateDivisionName","determineActiveAttendedTransfers","determineActiveDigitalConsults","updateMainstage","resetDropdowns","updateCallbackMediaSettings","fetchCommunicationBasedACWSetting","getDeploymentConfig","changed","divNameWorkitemsFT","changedMediaType","isNewlyConnected","_prevSelectedAppContext","prevActiveInteractionsLength","isWorkitemConnected","_prevInteractionIds","renderContextualCarousel","onMainstageSizeChanged","onMainstageCollapsedChanged","isMainstageFocused","_isMainstageFocused","externalContactDivisionName","onMainstageFocusedChanged","_endSessionShare","skipPreview","beginCall","phoneNumber","beginCallDefaultNumber","actionDisplayError","localPanelSizeMap","persistentPanelSizeMap","persistentMainstageMap","acdVoicemailPlayerVisible","room","isEndingChat","cobrowseV2EnabledCache","TtlCache","defaultTtl","isEndingSms","isTakingOver","showTakeoverConfirmModal","isLoadingAcwRequest","isCallbackDialing","isParking","mainstageSize","showMainstageSizer","isMainstageCollapsed","focusModeFt","canFocusMainstage","newPanelSizerFt","showMainstageFocused","mainstageSizes","MainstageSizes","mainstageSizeIcons","MainstageSizeIcons","currentActiveTransfers","currentActiveConsults","inviteOrWarmInviteConferenceParticipant","_timers","agentEndedCallsWithError","isStructuredMessage","callbackMediaSettings","_customerParticipantName","lastCallbackQueueId","notesHistoryRetrievedAt","showWorkitemTransferDropdown","showTransferDropdown","showConsultDropdown","showParkSmsDropdown","showConferenceDropdown","showCobrowseDropdown","showDialpadDropdown","showCallbackDialpadDropdown","fetchDialerPreviewDetails","dialerPreview","getContact","contactListId","contact","canMessageTakeover","mainstageTitleKey","titleKey","unknownKey","isCopilotImprovementsEnabled","hideTransferButtons","noPermissions","isWarmInviteCall","iAmMonitorOrCoach","isVideoActive","isSessionSharingActive","inviteOrWarmInviteConferenceParticipantHeader","inviteOrWarmInviteConferenceParticipantAction","inviteOrWarmInviteAddButtonIcon","inviteOrWarmInviteAddButtonTooltip","_rawCustomerParticipantName","rawParticipant","getRawParticipant","getRawParticipantName","_externalCanonicalContact","externalContactNameV2","customerParticipantNameTooltip","customer","customerParticipantName","rawName","ecName","showNumberInTooltip","isBlindTransferDisabled","canViewChat","otherParticipants","activeParticipantIds","connectedConferenceParticipants","isHostParticipant","excludeBlindTransferFilters","filtersToExclude","shouldExcludeUsers","shouldExcludeQueues","shouldExcludeExternals","additionalConsultTransferPermissions","targetDropdownConsultPlaceholderText","excludeConsultTransferFilters","includeConsultTransferFilters","filtersToInclude","shouldIncludeUsers","allowRawDropdownInputSelection","targetDropdownPlaceholderText","interactionScriptContainerState","isChat","isCallback","autoCallbackQueueId","activeTimer","activeTimerClass","activeTimerData","TimerTranslationKey","callback-timeout","callback-auto-start","callback-auto-end","countdownDurationClass","diff","isCallbackNearingStart","abs","isDialerCall","_p$attributes","dialerInteractionId","autoCallbackStartTime","_determineCallbackTime","autoCallbackEndTime","showCallbackCountdown","showAutoCallbackStartCountdown","showAutoCallbackEndCountdown","isAutoCallbackStartEligible","isAutoCallbackEndEligible","isWarmInviteCallInitiator","_currentUser$calls","currentUser","returnVal","calls","initialState","isAutoStartDispositioned","_currentUser$calls2","wrapupExpected","wrapupRequired","disconnectedTime","isAutoEndDispositioned","isEmail","isSms","isInternalProvider","isV2ChatProvider","isMessage","isConnected","isDialing","isTerminated","preferInteractionGUID","canAgentRequestACW","showAgentRequestACWButton","showAcdVoicemailAudioPlayer","showParkEmailButton","showParkSMSButton","showFinishCallback","isAlerting","hasCallback","isPreview","meetsCallRequirement","needsCallWrapup","showSkipCallback","isCallbackNumberDialing","isCallbackWaitingForContactData","phoneColumnsLength","numbers","phoneColumn","isCallbackNumberDisabled","enableAcdVoicemail","isRecordingPaused","securePause","recordingState","screenRecordingState","showAcdVoicemailButton","sessionShareClassNames","classes","stationIsWebrtc","phoneCallsWithErrors","webrtcConversation","getConversation","showHoldButton","showPhoneDisconnectButton","callHasEnded","hasAgentEndedThisInteraction","stationError","webRtcError","shouldShowDisconnectButton","callsError","interactionHasSipErrors","callSessionHasError","showChatRoom","hasRoom","isInternal","isV2Chat","activeConferenceParticipants","connectedParticipants","showDialpad","canConsultTransfer","digitalConsultEnabled","canSetupDigitalConsult","canBlindTransfer","showTransfer","showConsultTransfer","showConsultControls","consultControlsParticipant","_determineConsultControlsParticipant","onConsult","iAmConsultInitiator","iAmConsulted","consultAgentParticipant","consultInitiator","consultControlType","showSmsDisconnectButton","showSessionShare","consultActive","deploymentId","isCobrowseV2DeploymentEnabled","isCobrowseV2SetUpForWebMessaging","isVideoSetUpForWebMessaging","isCobrowseV2SetUpForVoice","isMCB","isGroupRing","disableMergeToConference","showCobrowseV2Button","disableCobrowseV2Button","showAcdVideoButton","disableAcdVideoButton","currentInteractionId","hasVideoActiveInOtherInteraction","activeInteraction","activeInteractionId","isInNonAcdVideo","sessionShareChatOrCallDisabled","panelSizeMap","panelSize","localPanelSizeAppContextKey","appContextPrecedenceStorageKeys","_i","_appContextPrecedence","appContextPrecedenceStorageKey","panelSizeClass","participantsForCurrentUser","current","callbacksForParticipantsForCurrentUser","activePanelContextKeys","allActiveInteractions","getInteractionPanelContextKey","interactionPanelContextKey","lastMessageTime","isSameOrBefore","isSkipCallbackDisabled","hasActiveCall","hasActiveCallback","hasCallbackNumbers","gt","hasMultipleCallbackNumbers","placedCalls","hasAttemptedCall","hasPlacedCalls","isPlacingCall","callbackNumberOptions","defaultCallbackNumberOption","addingCallbackNumbers","acdVoicemailTooltip","muteTooltip","skipACWTooltipTitle","customerBrowserDetails","customerDetails","isChrome","isEdgeChromium","hasChromeExtension","isStandAloneApplication","canScreenshare","canCobrowse","cobrowseType","isCustomerConfiguredForScreenShare","screenShareMisconfiguration","isCustomerConfiguredForCobrowse","cobrowseMisconfiguration","isAgentAllowedToCobrowse","canCobrowseCall","canCobrowseChat","isAgentAllowedToScreenShare","sessionShareStartTooltip","webMessagingCobrowseStartTooltip","isCoBrowse","disableShareButtonReason","isConfigured","disableVideoButton","disableShareButton","shouldShowSessionShareButton","enableAcdSessionShare","showSessionShareChatOrCall","isCopilotACWEnabled","callbacksInheritRoutingFromInboundCallToggle","showSnippetRecordingButton","snippetRecordingFT","snippetRecordingPerm","isSnippetRecordingActive","snippetRecordingState","isSnippetRecordingDisabled","setDivisionName","getCanonicalExternalContact","externalContact","_externalContact$divi","_i2","_WatchInteractionProp","buildValidMainstageLayout","toCheck","defaultLayout","mainstageCollapsed","mainstageFocused","_config$configuration","_config$configuration2","configurationVersion","cobrowse","notifyPropertyChange","getQueue","mediaSettings","callback","enableAutoDialAndEnd","newNotesHistoryRetrievedAt","getAllHistoricalACWNotes","notesHistory","notes","sort","endTime","MAINSTAGE_LAYOUT_STORAGE_KEY_INTERACTION_TYPES","currType","removeMemoryStorageItem","_this11","memoryMainstageMapKey","persistentMainstageMapKey","memoryMainstageMapValue","getMemoryStorageItem","mainstageLayout","_mainstageFocusedChanged","schedule","_this11$onMainstageSi","_this11$onMainstageCo","preferenceFromPersistentMap","setMemoryStorageItem","_this11$onMainstageSi2","_this11$onMainstageCo2","_this12","previousActiveTransfers","activeTransfers","canceledInteraction","transferResolved","leaveAcdRoom","mostRecentTransfer","modifiedBy","initiator","destination","_displayNotification","_this13","_this13$get","previousActiveConsults","activeConsults","_iterator2","_step2","otherParticipant","selfParticipant","previousConsult","_get","_ref9","_ref0","_previousConsult$othe","_ref5","_ref6","otherLatestMessage","otherWasConnected","_ref7","_ref8","selfLatestMessage","selfWasConnected","otherParticipantName","_get2","selfDisconnected","wasRecentlyTransferred","wasTakenOver","messageParams","doesRequireStructuredMessage","_endChat","_this14","endChat","_endSms","_this15","sms","endSms","_disconnect","_this16","_park","resumeTime","_this17","park","_errorResponse$errors","errorResponse","summaryEvt","summaryFromStorage","getItem","setItem","_toggleSecurePause","_pause","_toggleSnippetRecord","_this$get5$features","_snippetRecord","_this18","participantStatus","CONNECTED","answerChat","activateRoom","_copyInteractionUrl","_this19","_window$location","_copyExternalCustomerPhoneNumber","_beginSessionShare","_this20","customerId","initiateSessionShare","_ref1","_ref10","codeResponse","mediaRequestResponse","addCommunicationCode","sourceCommunicationId","trigger","_hold","_this21","confined","consultBoth","consultDestination","_mute","_this22","mute","_hangup","_hangUpCustomer","endCall","callId","_this23","disconnectParticipant","_this24","_t3","unpause","pause","pausing","_this25","_callee5","_this25$get","_this25$get$features","_t4","_context5","snippetRecord","_getInteractionOptions","forConference","PersonModel","QueueModel","GroupModel","RelateExternalContactModel","ExternalContactModel","rawPhoneType","phoneType","formatKey","_getIntegrationOptions","integrationKey","_this26","_callee6","transferType","isIntegrationTransfer","integrationTarget","_t5","_context6","getIntegrationTransferTarget","_navigateToConferenceRoster","timer","_document$querySelect","_inviteParticipantToConference","_warmInviteParticipantToConference","_conferenceDataSelected","_this27","participantsUri","_conferenceWarmInviteDataSelected","_this28","conferenceId","_blindTransferDataSelected","_this29","_callee7","_yield$_this29$_getIn","transferToType","success","_t6","_context7","_handleWorkitemTransfer","transfer","_openPopover","_displayApiError","sendNewRelicAction","_consultDataSelected","_this30","_callee8","participantForCurrentUser","_t7","_context8","setup","targetUserId","_consultCallDataSelected","_this31","_callee9","_yield$_this31$_getIn","_t8","_context9","initiateConsult","_mergeWarmInviteToConference","_this32","mergeToConference","_dismissParticipant","_this33","_cancelBlindTransfer","_this34","cancelTransfer","_this35","_callee0","transferOptions","errorMessage","_t9","_context0","_disconnectWorkitem","_this36","_parkWorkitem","_this37","_updateAcwRequest","_this38","agentCommunicationId","skipAcw","requestAcw","_holdAllOtherCalls","_this39","holdOtherConnectedCalls","allInteractions","currentInteraction","_currentInteraction$g","_beginCallback","_this40","callbackService","beginCallback","errorCode","addObject","_skipCallback","_this41","skipCallback","_muteParticipant","muted","_this42","_muteAllParticipants","_this43","fallbackMessageKey","responseJSON","exists","messageKeyOption","_ref11","titleParams","info","_beginCobrowseV2","_beginVideo","_beginScreenShareOrCoBrowse","_addCallbackNumberValueChange","_addCallbackNumbers","numbersToAdd","updateScheduleCallbackGadgetSessionStorage","_consultConfine","_this44","consultObject","_consultUnconfine","_this45","_consultDisconnect","_get3","_get4","latestMessage","cancelConsult","_consultTransfer","_this46","consultingAgent","initiatingAgent","transferFromParticipantId","transferToUserId","_consultConference","_this47","consultConference","_callbackDefaultNumber","defaultOption","callbackSettings","startTime","gracePeriod","normalizeTimerSeconds","_offerMessage","mode","sendMessageToHost","AppsV2","buildOfferMessageMessage","_this48","_options$savePreferen","prevMemoryMainstageMapValue","newPersistentMainstageMap","prevSize","prevCollapsedState","prevFocusedState","newSize","newCollapsedState","newFocusedState","_panelSizeChanged","_this49","newLocalPanelSizeMap","setLocalStorageItem","newPersistentPanelSizeMap","setPreferenceStorageItem","getQueueIdFromAppContext","isPef","_toggleMainstageCollapse","_this$onMainstageColl","toggleProperty","_setMainstageFocus","_sizeMainstage","_this$onMainstageSize","_messageTakeover","_this50","takeover","_autofocusPopover","_ref12","_options$find","popoverEl","searchRoot","el","getAttribute","firstOption","tabIndex","onToggleMainstageCollapse","onToggleMainstageFocus","autofocus","nextIsOpen","nextPropValue","onConsultConfine","onConsultUnconfine","onConsultDisconnect","onConsultTransfer","onConsultConference","onCopyExternalCustomerPhoneNumber","onCopyInteractionUrl","onAddCallbackNumbers","onAddCallbackNumberValueChange","onCancelCallbackNumbers","onConferenceDataSelected","onConferenceWarmInviteDataSelected","onBlindTransferDataSelected","onCancelBlindTransfer","onConsultDataSelected","onNavigateToConferenceRoster","onConferenceParticipantConnected","onPanelSizeChanged","onOfferMessage","_ref13","injectionMode","proposedMessage","onInsertChatText","onInsertSmsText","onInsertEmailText","onMute","onHangup","onMuteParticipant","onMuteAllParticipants","onDismissParticipant","onInviteParticipantToConference","onWarmInviteParticipantToConference","onToggleSecurePause","onToggleSnippetRecord","onEndChat","onPark","onEndSms","onOpenTakeoverConfirm","onCancelTakeoverConfirm","onConfirmTakeover","onCallbackDefaultNumber","onCallbackNumber","onSkipCallback","onBeginScreenShareOrCoBrowse","onBeginCobrowseV2","onBeginVideo","onToggleAcdVoicemail","onUpdateAcwRequest","onParkWorkitem","onDisconnectWorkitem","onReturnToActiveMode","returnToActiveMode","isConversationScriptAvailable","isContextualScriptAvailable","sizeMainstage","sizeMainstageKeydown","prev","changes","_i3","_WatchInteractionProp2","nextValue","prevValue","isEqual","hasKey","isNaN","LAYOUT_TEMPLATE_SETTINGS_NAMESPACE","appGroupKeys","PROFILE_PANEL_APP_ID","PROFILE_PANEL_PROVIDER_ID","TASK_MANAGEMENT_APP_ID","TASK_MANAGEMENT_PROVIDER_ID","guidFor","isBlank","defaultMetadataReporterConfig","initialReportDelay","reportInterval","shouldSendInitial","shouldSendPeriodic","appSortPriority","streaming","appsService","alerting","acdinitialization","appProviders","contextualLayoutTemplates","contextualLayoutTemplateContextMap","notesHistoryLength","agentPanelIsActive","_metadataReporterConfig","_telemetryTimer","_pendingActionTimers","_poolState","_viewStackConversationController","_carouselContextualController","_issuedAppRequests","ephemeralCarouselLayoutTemplateMap","persistentCarouselLayoutTemplateMap","visibleAppDefIds","autoScrollActions","autoOpenActions","hasLoadedPersistentCarouselLayoutTemplateMap","disposables","_prevAppProviders","_prevActiveInteractions","_prevRawActiveInteractions","_prevSelectedInteraction","_prevForcedPanelSelectionMap","_prevContextualInteractionScriptStateMap","_prevContextualLayoutTemplates","_prevAgentPanelIsActive","enableFocusMode","_validAppGroupKeys","validActiveInteractions","isAppContext","_validAppProviders","validAppProviders","currProvider","provider","isValidAppProvider","appProvider","providerId","interactionAppGroups","validAppGroupKeys","includeConversationGroup","includeContextualGroup","_loop","validActiveInteraction","interactionKey","conversationGroup","appGroupKey","contextualGroup","interactionAppGroup","contextual","orgDefaultPanelSettings","mediaType","_settings$mediaType","initialPanelSelection","_loop2","_Object$entries$_i","_Object$entries","computeTokensFromInteractionKey","appDefId","computeInterapptionCompositeId","nativeApps","matchesInteraction","_contextualInteractio","hasGadgetReplacement","hasScriptAvailable","slot","availableSizes","canUseFocusMode","nativeAppDefs","flatMap","_step3","_iterator3","_step3$value","carouselLayoutTemplateMap","currentTelemetryMetadata","getTelemetryMetadata","poolState","interactionAppGroupsObserver","hasContextualFocusModelEnabled","_this$get2$get","_this$get3$get","_step4","withTelemetryMetadata","AppLogDetails","getLogs","addRemote","logToStashLogger","workers","retryForAppsV2Workers","keepaliveForAppsV2Workers","_iterator4","wp","workerConfig","getWorkerConfig","loadMaxRetries","keepAlive","_getBootstrapWorkerData","_getActiveInteractions","AppPool","poolId","hostAppName","hostAppVersion","maxPoolSize","evictApp","appDiffer","deepEqualityAppDiffer","allowedSandboxValues","allowedPermissionsPolicyValues","telemetryAgent","addTelemetryEvent","groupTokens","interactionContext","serializableTelemetryMetadata","_addPageAction","appDisplayType","gcAppName","getBootstrapData","_session$get","_this3$getProperties","basicContext","langTag","envName","computeTokensFromGroupId","gcConversationAppContext","displayMode","__interaction_metadata__","gcWorkitemAppContext","toSerializableRecord","gcExternalContactAppContext","gcAnalyticsConversationAppContext","getSdkTelemetryDetails","_this3$get","selectedInteractionId","defaultTimeouts","getBootstrapWorkerData","_session$get2","_this3$getProperties2","computeGroupId","computeAppDefId","addMessageListener","createAppsV2SdkHandler","getSelectedInteraction","findInstanceState","buildFindInstanceState","findWorkerInstance","buildFindWorkerInstance","openPanel","transformedPanelId","_removePersistenceAppDefIdIgnoreList","_openPanels","getActiveConversationGroupId","sendMessageToGroup","sendMessageByInstanceId","notificationService","sendLegacyApiCall","handleAppApiCall","streamingService","proposeMessageTools","getHasConversationAppForCurrInteraction","getActiveInteractions","race","waitForAll","mapValidActiveInteractionsToConversations","addPoolStateChangeListener","_step5","_iterator5","_step5$value","attentionCount","_triggerOnAppAttentionCountChangedAction","AppViewStackHostLayoutController","getLayoutTemplate","groupState","_getConversationLayoutTemplate","AppCarouselHostLayoutController","previousLayoutTemplate","_getContextualLayoutTemplate","onLayoutTemplateUpdated","layoutTemplate","_prevContextualLayoutTemplate","_updatePersistenceContextListFromLayoutTemplateDiff","_syncPersistenceFocusFromLayoutUpdate","_saveContextualLayoutTemplate","_triggerLayoutActions","isValidLayoutTemplateMap","_correctPersistedCarouselLayoutTemplateMap","_triggerOnAppPoolReadyAction","isDefaultDelay","_sendTelemetryMetadata","onCarouselEnterFocusMode","dispose","onCarouselExitFocusMode","_cancelPendingActionTimers","willDestroy","cancelAll","_triggerOnHasContextualFocusModeEnabledChangedAction","_debouncedFunctions","_debounceLayoutUpdate","layoutKey","delay","_sendLayoutTelemetry","_telemetryUpdateQueue","_queueLayoutTelemetryUpdate","layout","getLayoutMetadata","layoutMetadata","_appPool$getPoolState","appPool","metadata","getPoolState","getInteractionBuckets","flattenedMetadata","newVisibleAppDefIds","items","visible","_triggerOnVisibleContextualAppsForCurrInteractionChangedAction","selectedInteractionGroupId","_step6","panelIds","autoOpenAppDefIds","autoOpenAppDefIdsToKeep","_iterator6","_loop4","appDefLookupIds","autoOpenLayoutTemplateItem","autoOpenTimer","_this6$_carouselConte","autoScrollAppDefIds","updateLayoutTemplate","_step7","newLayoutTemplate","cloneDeep","_iterator7","_loop3","autoOpenAppDefId","panelLayoutTemplateItem","_clearFocusModeForForcedPanel","_addAutoScrollAction","_ref14","autoScrollTimer","_this6$_carouselConte2","focusApp","_getOrCreateContextualLayoutTemplateContext","layoutTemplateContext","persistenceFocusAppDefId","persistenceAppDefIdIgnoreList","preservePersistenceFocusOnNextExit","_updatePersistenceFocusModeAppDefId","focusModeAppDefId","_setPreservePersistenceFocusOnNextExit","preserve","nextFocus","ctx","_ctx$persistenceFocus","panelAppDefId","_addPersistenceAppDefIdIgnoreList","_step8","contextualLayoutTemplate","_iterator8","_loop5","layoutTemplateItem","_step9","_iterator9","prevLayoutTemplate","prevLayoutTemplateItem","_ref15","_ref16","validAppContext","validAppContextType","storableLayoutTemplate","pruneInteractionIdAndType","_ref52","computeTokensFromInterapptionCompositeId","buildEphemeralStorableLayoutTemplate","ephemeralCarouselLayoutTemplateAppContextKey","newEphemeralCarouselLayoutTemplateMap","_ref17","_ref18","appContextKey","_appContextKey$split","_appContextKey$split2","appContextId","computeAppContextTypeFromInteractionType","contextualLayoutTemplateContext","newPersistentCarouselLayoutTemplateMap","focusModeAppDefIdOverride","_options$deactivateFi","shouldDeactivate","deactivateFilter","buildPersistentStorableLayoutTemplate","_saveLayoutTemplatePreferences","_this$_carouselContex","_step0","_iterator0","_loop6","_ref19","_addAutoOpenAction","lookupId","_logToStashLogger","appLogDetails","buildStashLoggerDetails","_evictApp","groupInstances","groupInstancesDetails","_ref20","_this9$get","_this9$get2","_ref21","currGroupId","appInstances","nonselectedContextualGroups","LRU","nonselectedConversationGroups","selectedContextualGroups","_this0$onAppPoolReady","_this$onAppAttentionC","_triggerOnHasConversationAppForCurrInteractionChangedAction","_this1$onHasConversat","_this10$onVisibleCont","selectedInteractionVisibleAppDefIds","_visibleAppDefIds$get","_this11$onHasContextu","_updateManagerState","appDefUpdate","conversationGroupId","contextualGroupId","_ref22","_ref23","updateAppDefs","keepLatest","_addAppProvider","_requestAppsFromProvider","_ref24","appConfigs","_updateResolvedApps","appProviderId","_removeAppProvider","providerIdToRemove","_removeIssuedAppRequests","_deleteProviderResolvedApps","_addInteraction","_ref25","_updateInteraction","_ref26","_removeInteraction","_manuallyRemoveNotesGadgetAttentionCount","providers","interactionRemoved","_deleteInteractionResolvedApps","_getProviderById","_ref27","_getAppDefsFromAppConfigs","_step1","_iterator1","_loop7","appConfig","isAppDefV2","_convertV1AppToV2AppDef","foundParams","URL_REPLACEMENTS","replacement","queryParamName","regExp","_updateControllerState","_this$_viewStackConve","_this$_carouselContex2","updateState","groupIds","activeGroupId","newResolvedApps","_provider$getAppGroup","_provider$getAppGroup2","_modifyResolvedApps","resolvedApp","additions","deleteFilter","model","appInstance","isTrustedApp","finalAppConfig","crypto","randomUUID","permissionsPolicy","bootstrapLenient","hooks","buildV2IconAsset","_providerUpdateAppConfigsCallback","requestId","_this17$_findIssuedAp","_findIssuedAppRequests","_this17$_findIssuedAp2","existingRequest","finalAppConfigs","_this17$_findIssuedAp3","_this17$_findIssuedAp4","currentRequest","outOfDateReason","_manuallySetNotesGadgetAttentionCount","newAttentionCount","_this$_getNotesGadget","_getNotesGadgetMetadata","setHeadlessAttentionCount","_this$_getNotesGadget2","removeHeadlessAttentionCount","appProviderChange","prevAppProviders","prevAppProvider","newAppProvider","interactionChange","prevInteractions","prevRawInteractions","rawInteractions","currInteractionType","newInteraction","prevRawInteractionKey","newRawInteractionKey","prevRawInteraction","newRawInteraction","isRawInteractionChange","prevInteractionType","newInteractionType","isModelTypeChanged","prevSelectedInteraction","prevSelected","currSelected","_this18$_carouselCont","prevAgentPanelIsActive","_step10","_iterator10","_loop8","_forcedPanelSelection","_prevForcedPanelSelec","validActiveInteractionType","validActiveInteractionKey","previousAppDefIds","forcedAppDefIdsToAdd","x","forcedAppDefIdsToRemove","validActiveContextualGroupIds","_ref28","_ref29","_ref30","_ref31","_ref32","_ref33","_appContextKey$split3","_appContextKey$split4","_ref34","_ref35","_ref36","_ref37","_contextualInteractio2","_prevContextualIntera","autoActivePanel","forcedAppDefIds","_this$_getNotesGadget3","currentAttentionCount","getHeadlessAttentionCount","appDefState","visibleAppDefId","_getPersistentContextualLayoutTemplate","initial","isDefaultLayoutTemplate","groupIdTokens","existingLayout","_buildInteractionSpecificLayoutFromGeneric","_step11","_iterator11","_loop0","findIndex","pinned","_step12","currNativeApp","_iterator12","_loop1","nativeApp","_ref38","validAppProvider","_validAppProvider","appAvailableSizes","_ref39","appCanUseFocusMode","autoScrollAppDefId","_ref40","forcedPanelSelection","_step13","_iterator13","_loop9","_ref41","_this19$get","sortPriority","_ref42","prevInteractionKey","_this$_findIssuedAppR","_this$_findIssuedAppR2","_requestAppsFromAsyncProgrammaticProvider","_this20$_findIssuedAp","_this20$_findIssuedAp2","appUpdCallback","exception","searchQuery","issuedAppRequests","matchesIssuedAppRequest","targetIssuedAppRequests","currRequest","reverse","attrs","_appSortPriority","_ref43","_ref44","_ref45","_ref45$getInteraction","interactionsMetadata","isActive","getInteractionAppMetadata","bucketCounts","currMetadata","conversationAppDefs","conversationRunningApps","conversationFailedApps","contextualAppDefs","contextualRunningApps","contextualFailedApps","currBucketName","currBucket","bucketMetadata","_ref46","_ref47","bucketName","_ref47$","currentInteractions","_ref48","currGroupType","currGroup","runningApps","renderedInstances","_ref49","appState","failedAppInstances","_layoutTemplate$focus","sizeCounts","small","medium","large","xlarge","focusModeAppName","replaceAll","_ref50","_ref51","counts","capitalize","issuedAppRequest","_tokens$map","_tokens$map2","_tokens$map3","_tokens$map4","_tokens$map7","_tokens$map8","conversationMediaTypes","genericLayoutTemplate","validAppProviderIds","_ref53","pruneUnknownProvidersFromLayout","removeDuplicateAppDefs","appDefIdPrecision","_ref54","_tokens$map5","_tokens$map6","computeTokensFromAppCompositeId","uniqueAppDefIds","_ref55","isUnique","templateMap","_ref56","_ref57","origLayout","newLayout","currLayoutItem","allowNativeProvider","isAppCarouselHostLayoutTemplate","panelsOverrideObject","hasContextualAppForCurrInteraction","_interactionScriptStateMap","isScriptAvailabilityPending","implicit","actionScriptAvailabilityChanged","actionOnHasContextualAppForCurrInteractionChanged","actionConfineConsultedParty","actionCompleteConsultTransfer","actionCancelConsultTransfer","scriptAvailabilityChanged","setOpenPanel","onHasContextualAppForCurrInteractionChanged","confineConsultedParty","completeConsultTransfer","cancelConsultTransfer","removeWrapperStyling","removePadding","_yield$_this$get$find","_yield$_this$get$find2","actionCancelTransfer","onCancelTransfer","consultInitiatorName","showCaseIcon","showAlertingTimeout","showInteractionButtons","toHide","hasAlertingConfigured","hasAlertingPriority","hasNonPrimaryAlertingPriority","loadConsultInitiatorName","animateAlertingTimeout","elapsed","timeRemaining","elapsedPercent","timeoutEl","style","animate","duration","easing","fill","focusAnswerButtons","requestFocus","_answer","_decline","onAnswer","preventDefault","stopPropagation","onDecline","alertingTimeEnd","timeoutValue","alertingStartTime","timeoutSeconds","alertTimeoutSeconds","dateAssignmentStateChanged","elapsedTime","timeRemainingMs","template","isSelected","iAmOnBargeIn","iAmOnCoach","iAmOnMonitor","mcbParticipantName","bargeLabel","coachLabel","monitorLabel","showInactivityTimeout","inactivityTimeout","supplementalState","inWrapup","shouldAlertDisconnected","isAttendedTransferring","hasInteractionStatus","actionViewConversation","INTL_KEY","BaseCard","class","isV2Provider","lastMessageWasCustomer","lastMessageText","cnt","isTyping","typingInteractions","acdAnnounceMonitoringFt","acdAnnounceMonitoringDigitalFt","interactionQueueId","queueName","_prevInteractionQueueId","associatedCaseId","_entities$0$case$id","_entities$","_entities$$case","canViewCasesViaRequest","canViewWorkitemCases","isWorkitem","caseOnModel","getCase","case","Boolean","_participants$find","currUserParticipantId","monitoredParticipantId","_p$calls","_p$calls$","disconnectType","iAmOnMonitorDigital","_participants$find2","_p$messages","_p$messages$","_participants$find3","coachedParticipantId","_p$calls2","_p$calls2$","_this$get3$find","bargedParticipantId","_p$calls3","_p$calls3$","isAlertingWorkitem","draftUpdate","_findBy","mcbedParticipantId","_currentUser$messages","_currentUser$messages2","_currentUser$calls$","_get$find$id","_get$find","_get$find$id2","_get2$find","_p$calls4","_p$calls4$","_p$messages2","_p$messages2$","invokeItemSelection","_selectItem","onSelectItem","emails","subject","isEditingDraft","lastReceived","filteredEmails","messageId","messagesSent","times","valueOf","mostRecent","_currentHoldMoment","otherConsultPartyName","heldStartTime","lastDialed","_heldStartTime","isConsultParticipantHolding","holdTime","consultTitleKey","connectedStates","isMuted","loadOtherConsultPartyName","iAmInitiator","statusCategory","dateDue","format","endForAll","leave","onEndForAll","onLeave","disableInviteParticipant","disableWarmInviteParticipant","onConnected","warmInvite","invite","muteAll","dismiss","onWarmInviteSelected","onInviteSelected","onDismiss","onMuteAll","ariaNameLabel","formattedNumber","formatAddressForDisplay","person","mutingDisabled","isAuthUser","onToggleMute","queueService","searchValue","pendingRequest","showTitle","_timer","queueFilter","contactFilter","recipients","recipientTags","createEmailDisabled","initQueue","_cancelTimer","_buildRecipientsStr","_createEmail","_this2$get","party","recipientsStr","validRecipients","isValidEmailAddress","handleRecipientSelected","actionClose","setDefaultQueue","pushObject","onQueueSelected","onRecipientSelected","onRecipientRemoved","removeAt","onRecipientRemovedByIndex","onCreateEmail","onSubmit","DEFAULT_SUB_MESSAGE_TYPE","NON_DEFAULT_SUB_MESSAGE_TYPES","AcdUtilitiesMixin","defaultSubMessageType","selectedSubMessageType","isSearchNumberValid","subMsgType","formatted","showNumberError","createMessageDisabled","hasDirectRoutingSmsAddress","directRoutingSmsAddresses","getContactFieldValuesByType","integration","subMessageTypes","sortedSubMessageTypes","localeCompare","_generateOptions","userHasDirectRoutingSmsAddress","fullQueue","recipientValue","formattedAddress","useUserFromAddress","directRouting","messageMediaSettings","useAgentAddressOutbound","_createMessage","subMessageType","recipientSelected","externalOrganization","e164Number","displayNumber","onSelectMessageType","_target$value","onCreateMessage","onToggleDialpad","onAddNumber","enableOutboundContact","enableCustomerIntent","customerIntentLabel","_firstInteraction$cus","firstInteraction","customerIntent","getStartTime","startA","startB","showCustomerIntent","showGroupBadges","hasDivision","interactionQueueIds","_findLast","findLast","contactFromGroupId","_externalContact$divi2","selectedWorkitemId","subMessageTypeClass","OUTBOUND_MEDIA_TYPES","EMAIL_TYPES","PHONE_TYPES","_popoverTargetClickHandler","_popoverTargetKeydownHandler","_popoverDismissHandler","_popoverFocusoutHandler","queues","defaultQueueIds","outboundPopoverVisible","creatingOutboundConversation","agentQueueId","hasOutboundOptions","outboundQueues","currentQueueId","effectiveQueueId","outboundOptions","getOutboundData","entryType","ensureQueueLoaded","reload","waitForQueue","rejectBy","ensureAgentQueueLoaded","loadDefaultQueues","defaultQueueResults","defaultQueues","resolution","getOutboundDataForEmails","getOutboundDataForPhones","customerPhoneNumbers","getCustomerPhones","entry","display","e164","acceptsSMS","entityType","customerEmails","getCustomerEmails","emailType","currentType","emailData","uniqBy","phones","customerPhones","phoneData","validSmsType","validCallType","isValidPhoneData","createOutboundInteraction","outboundRequest","getPopover","eId","bindPopoverTarget","targetId","listId","guxFocusFirstItem","targetEl","unbindPopoverTarget","bindPopover","focusListener","unbindPopover","relatedTarget","contains","processOutboundInteraction","_isWorkitem","showCallControls","showEmailDialog","showMessageDialog","_groupSortTimes","permCanCreateEmail","permCanSendMessage","permCanMakeCall","permCanViewExternalContacts","hasActiveInteraction","onQueueOrInteracting","interactionGroups","decoratedGroups","priorSortTimes","sortTimes","decorated","startTimestamps","ts","oldest","sortTimestamp","_persistGroupSortTimes","sortedGroups","sessionShareActive","actionGetCanonicalContactSync","currentKeys","nextKeys","unchanged","_cleanUpSortTimes","updatedSortTimes","didUpdateAttrs","onCloseDialpad","onCloseEmailDialog","onCloseMessageDialog","togglePopover","closePopover","_lastFrameUrl","currentFrameUrl","BASE_APP_CONFIG","GC_USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN","_intl","_apps","fullscreen","allowFullscreen","cobrowseInterapption","isFullScreen","_buildCobrowseInterapption","endFullScreen","appCfg","closeCobrowse","interaction.cobrowseSessionShareActive","interaction.sessionShareActiveOnLoad","interaction.isCobrowseV2Disconnected","interaction.isCobrowseV2","fullScreen","startFullScreen","onAppApiCall","apiCall","MediaRequestResponseState","attachTo","attachClickHandler","_displayDropdown","_popper","_targetEl","_onWindowClick","_onTargetClick","hide","selectProvider","once","destroy","Popper","placement","modifiers","flip","behavior","preventOverflow","padding","handleClick","handleOutsideClick","scheduleOnce","scheduleUpdate","attachTarget","isAttachTarget","isInsideComponent","isInsideAttachTarget","beginCobrowse","beginScreenShare","displayDropdown","sendNotification","openSection","showAvSettings","showCallForwarding","toggleSection","sectionName","acdVoicemailService","loadingVoicemail","voicemailId","transcription","transcriptionLocked","errorLoadingVoicemail","audioPlayerOptions","basicAudioPlayer","audioOutputDeviceId","noAcdVoicemailStreamAccess","getVoicemail","getVoicemailMediaInfo","mediaInfo","mediaUri","mediaFileUri","waveformData","audioObject","mediaUris","handleAsyncTranscription","getVoicemailWithTranscription","timeElapsed","createdDate","estimatedTimeForTranscription","audioRecordingDurationSeconds","runTimer","timers","newVoicemailId","scriptSizes","_joinChat","_updateCustomerParticipantName","oldInteractionId","_oldInteractionId","_resetDropdown","lastAutoCallbackQueueId","_updateCallbackMediaSettings","_determineActiveAttendedTransfers","prevForcedPanelTrackingMap","_didReceiveAttrsPrevForcedPanelTrackingMap","newForcedPanelTrackingMap","showWrapup","_shouldShowWrapup","forcedSelectionMap","newForcedSelectionMap","panelContextKey","prevData","newData","panelsOverride","isNotPopout","_componentDestroyed","_setUpCopyBtn","_setUpExternalCustomerPhoneNumberCopyBtn","interactionCopyBtn","customerPhoneNumberCopyBtn","requestTimeout","maxConferenceParticipantCounter","showConferenceInviteDropdown","showConferenceRoster","showHangupChoiceDropdown","interapptionPanels","showConsultTransferDropdown","isDialingClbk","showNumbersDropdownClbk","hideTransferButtonsObserver","hasNotesHistory","notEmpty","blindTransferDisabled","disabledScriptButton","autoStartIsDispositioned","autoEndIsDispositioned","autoDialTimeSeconds","autoEndTimeSeconds","isAlmostAutoCallbackStart","timeToAutoCallbackStart","alias","isContacting","showInteractionGUID","isCampaignCallback","isNotCampaignCallback","autoCallbackStartCountdownExpired","timeToAutoCallbackEnd","autoCallbackEndCountdownExpired","isAgentAllowedtoCobrowse","webrtcConversationTypes","SOFTPHONE","showNumber","enablePhoneHangupBtn","canShowProfile","shouldShowProfile","wasConference","showDTMFDialpad","transferringToParticipant","showCobrowseV2","beginScreenShareOrCoBrowse","staticPanelAttentionCounts","attentionCountObject","unionStaticAndInterapptionPanels","union","staticAndInterapptionPanelConfigs","panels","availablePanelsOverride","filteredPanels","staticAndInterapptionAttentionCounts","interapptionAttentionCountsByStateKey","screenShareConfigs","showTab","onclick","supplementalClassNames","staticPanelConfigs","panelConfigs","scriptToolTip","interapptionPanelConfigs","sortPriorityInterapptions","interapptionId","interapptionStateKey","panelResizerEnabled","_effectivePanelSelection","NONE_PANEL","flatten","orgDefaultPanelSetting","queryOverride","isProfilePanelAvailable","profilePanel","panelsOverrideObjectTx","origOverrides","initialPanelOverride","currPanelId","connectedTimeForDisplay","availablePanels","filterBy","isScriptPanelAvailable","typeIcon","beginCallbackDefaultNumberText","isSkipDisabledClbk","callbackNumbers","personGuid","holdTooltipTitle","muteTooltipTitle","isAgentAllowedToCobrowseCall","isAgentAllowedToCobrowseChat","canScreenShare","isAgentAllowedToScreenShareCall","isAgentAllowedToScreenShareChat","sessionShareStartVideoTooltip","isRequestingScreenShareOrCoBrowse","isRequestingVideo","isAgentDisconnectedFromSharedSession","isCustomerDisconnectedFromSharedSession","isSessionCodeRequired","restartable","drop","setForcedPanelSelection","panel","instrumentUserPanelSelection","newPanel","_computeHideTransferButtons","_getInteractionURL","Clipboard","_changeState","endCallForAll","handlePhoneStatusChange","_onBackToConferenceRoster","_onConferenceDataSelected","_onBlindTransferDataSelected","_yield$_this19$_getIn","_onTransferDataSelected","_yield$_this20$_getIn","_onDismissParticipant","_onCancelBlindTransfer","_callee1","_context1","_callee10","_context10","beginCallbackDefaultNumber","holdAllOtherCalls","endCallback","modelSet","property","_isInDOM","conversationIsDestroyed","getInteractionTypeFromCP","isFax","myselfAgent","partyIsUser","partyIsAgent","purpose","callbacks","isEmpty","chats","handleMissedTimedBoxTimer","Interaction","tmpInteractionModel","ownerInjection","interactionHasMissedTimer","windowInFocus","hosted","applicationHasFocus","hasFocus","timeDiff","timeCreated","onTransferDataSelected","onBackToConferenceRoster","onLeaveCall","onEndCallForAll","onUserInitiatedPanelSelection","staticPanels","isStaticPanel","focusTarget","instrumentPanelManagerStateUpdate","updatedMap","onPanelSelectionChanged","clearForcedPanelSelection","bubbleAction","toggleTransfer","toggleConsult","toggleConference","_callee11","_context11","_callee12","_t0","_context12","inviteParticipantToConference","toggleDTMFDialpad","toggleNumbers","toggleNumbersClbk","toggleMuteAudio","toggleSecurePause","changeState","popoverState","showingHangupDropdown","changeScriptSize","currentSize","currentSizeIndex","newSizeIndex","prefs","newPrefs","beginVideoShare","endSessionShare","triggerAction","actionContext","toggleAcdVoicemail","updateACWRequest","parkWorkitem","disconnectWorkitem","_unHoldAndSpeakTo","_hangUp","_changeDestinationState","_changeObjectState","customerName","waitingConfineCustomer","waitingConfineAgent","consultParticipant","isCustomerConfined","isAgentConfined","consultParticipantHeldTitle","consultAgentParticipantHeldTitle","consulteeNotConnected","stateStr","changeObjectState","unHoldAndSpeakTo","speakToBoth","speakToAgent","hangUp","morphConsultToConference","speakToConference","changeDestinationState","speakToCustomer","_x2","_x3","speakTo","unHold","_x4","userPanelSelectionMap","_prevSelectionState","_prevPanelContextKey","userPanelSelection","effectivePanelSelection","forced","_isPanelAvailable","userSelectionMap","cleanedUserSelectionMap","didRender","prevPanelContextKey","prevSelection","prevUserSelection","prevForcedSelection","prevInitialSelection","prevEffectiveSelection","effective","newPanelContextKey","newForcedSelection","newUserSelection","newInitialSelection","newEffectiveSelection","effectiveSelectionChanged","panelContextKeyChanged","prevPanel","onUserPanelSelection","showTooltip","setPanelSize","toggleTooltip","selectPanelSize","num","userClicked","subPanelSelectedAppId","_viewStackContextualController","_prevSubPanelSelectedAppId","_this2$getProperties","_this2$getProperties2","_this4$get","_this4$get2","_this5$onAppPoolReady","_triggerOnContextualAvailableAppsChangedAction","_this6$onContextualAv","_this7$onHasConversat","_triggerOnHasContextualAppForCurrInteractionChangedAction","_this8$onHasContextua","_this$_viewStackConte","_this12$_findIssuedAp","_this12$_findIssuedAp2","_this12$_findIssuedAp3","_this12$_findIssuedAp4","isModelTypeChange","prevSubPanelSelectedAppId","_handleSubPanelAppChange","previousLayoutTemplateItem","computeTokensFromCompositeId","_this$_viewStackConte2","_this15$_findIssuedAp","_this15$_findIssuedAp2","_ref19$getInteraction","_ref21$","appCount","runningAppCount","_trackedContacts","_name","_oldParticipant","_rawName","_getParticipant","boundFetchParticipantName","_fetchParticipantName","_getPassedParticipant","subscribeToExternalContact","trackedContacts","isTracked","addContactChangeListener","unSubscribetoExternalContacts","removeContactChangeListener","newConversation","newParticipantId","oldParticipant","newParticipant","ActiveCallEntry","handleActiveCallChanges","Model","ConversationModel","dropDataType","clearPanels","setPanels","sendToProfile","itemDropped","dropEvent","dataTransfer","getData","draggedConversation","droppedConversation","callsToMerge","mergeCalls","currentConversation","setActiveCall","_holdOtherActiveConversations","hostedContext","dismissNotification","sendToVoicemail","declineConference","groupCallBack","isMonitoring","isCoaching","isBarging","conversationIsAConsult","isGroup","consultOtherPartyModel","isDisconnectedAndNoError","conversationHasError","rawNumber","participantCount","isIncomingConference","shouldShowDialButton","isExternalCall","activeCallerName","durationFormatter","Intl","DurationFormat","readableDurationFormat","conversationStartTime","startTimeVal","toDate","diffInMS","seconds","floor","minutes","hours","durationInfo","showIndicator","showRecordingToolTipText","reopenClass","positionalParams","faxErrorInfo","faxTransmissionStatus","faxState","faxStatusMessage","faxErrors","statusMessage","localizeMessageKey","localizeArguments","currentPage","pageTotal","failMessage","succeedMessage","adminui","sendClose","sendAction","handleMessageEvent","sameHost","sameName","startMessageListener","elementId","stopMessageListener","modalConfig","actionCloseModal","popModal","closeModal","DEFAULT_ALERT_TIMEOUT","ring","acdvoicemail","alertingConversation","isOnConnectedCall","isOnConnectedAcdCall","phoneDisabled","webrtcShowingVideo","webrtcPhoneService","browserHidden","isScreenRecordingPopout","isInteractionViewOpen","publicApiUser","notificationOutputDeviceId","alertingInteractionToast","alertingWorkitemToast","alertingUcToast","connectedAcdCallToast","phoneDisabledToast","currentWebrtcVideoToast","phoneDisabledMessage","alertingUcVideoToast","shouldRing","ftAcdRingTimeout","alertingWorkitemRingTimeCache","_serviceWorkerRegistration","allowActionableNotifications","ignoreSoftphone","shouldIgnoreSoftphone","currentVideoInvitation","enableAlertablePresencesOverrides","presence","actionToVoicemail","actionAnswer","actionOpenAcdInteraction","getAlertType","_oldConversation","isAutoAnswerCall","loggedInUser","iAmAgent","conversationParticipants","currentUserParticipant","queueMediaSettings","transferSource","isTransferSourceACD","agentAASetting","acdAutoAnswer","queueAASetting","enableAutoAnswer","_loadConversationSettings","_onVideoInvitationReceived","_onVideoInvitationCancelled","invitation","fromUserId","_displayVideoInvitationToast","playRingtone","_cleanupVideoNotification","_registerServiceWorker","_initializeServiceWorkerListener","serviceWorker","registration","_event$data","isUcCall","focusWindow","getAlertRingTimeout","verifyTimeout","queueManualAlertingRingTime","_conversation$workite","workitemQueueId","ringTimeCache","cachedRingTimeForQueue","queueDetailsUrl","queueDetailsRes","ringTimeResVal","_queueMediaSettings","queueAlertingRingTime","_timeout","groupRingId","groupAlertTime","voicemailAlertTime","manualAnswerAlertToneSeconds","stack","getQueueMediaSettings","autoAnswerAlertToneSeconds","getGroupAlertTime","rotateCallsSecs","getUserAlertTime","alertTimeout","isAgentCall","isPresenceBusy","autoAnswer","alertTimout","stopRingtones","stopRingtone","displayIncomingAcdNotification","intlNS","answerText","openText","notificationOptions","showNotificationEverywhere","forceBrowserNotification","showCloseButton","hideAfter","messageStyle","tag","actionHandlers","openAcdInteraction","messageGroupDetails","messageName","groupRingCaller","otherPartyModel","otherParty","monitoredParticipantPerson","coachedParticipantPerson","bargedParticipantPerson","groupRingGroup","_otherPartyModel","fullMessage","caller","displayIncomingUcNotification","declineText","_title","_message","_notificationOptions","answerUcInteraction","voicemailUcInteraction","fallbackToInBrowser","EVENTS","INCOMING_CALL","userName","answerVideoInvitation","declineVideoInvitation","_answerVideoInvitation","_this$get$isHosted","removeVideoInvitation","openVoltPopout","_declineVideoInvitation","destroyNotification","displayIncomingWorkitemNotification","storedNotification","destroyActionableDesktopNotification","useNativeNotifications","supportsActionableNotifications","getNotifications","actionableNotifications","actionableNotification","manageUcNotification","hasDisplayedDesktopNotification","handleIncomingCall","truncateString","maximumLength","callerName","groupName","externalCaller","incomingCallerName","body","showNativeNotification","actionId","bringToForeground","currentConversationId","Notification","requestPermission","postMessage","translations","answerCall","declineCall","manageAcdNotification","isNotAcdInteraction","isUCVideo","handleIncomingAcdCall","participantForCustomer","activeQueue","truncatedName","truncatedQueueName","manageWorkitemNotification","browserIsHidden","handleAlerting","oldConversation","handleNotifications","oldConversationId","newConversationId","alertingLeader","voice","configured","buttonAlignment","modalSize","modalContent","ifcModalContent","ifcModalId","translatedConfig","modalClients","defaultTitle","parsedQueryParams","ifcModalRoute","displayedIfcModal","modalFrameData","queryStr","modalDataToQueryString","applyQueryOverrides","modalData","_cleanupDismissHandler","initialFocusSelector","_modalConfig$actions","_modalConfig$actions2","_modalConfig$actions3","negative","secondary","positive","actionOnModalPositiveClick","_modalConfig$actions4","actionOnModalSecondaryClick","_modalConfig$actions5","actionOnModalNegativeClick","_modalConfig$actions6","modal","getElementsByClassName","currData","dismissHandler","_this4$modalConfig","_this4$modalConfig$ac","removeListener","onModalPositiveClick","onModalSecondaryClick","onModalNegativeClick","AnchorTagComponent","httpRegex","decorateLabel","htmlSafe","Handlebars","Utils","escapeExpression","anchor","ariaHidden","registerAppCarouselToolbar","setLocale","enableNewAppSizer","registerAppCarouselView","defaultInternalSandboxOptions","AppEmbedComponent","onAppLoad","dasherize","finalSandboxOptions","appSandboxSettings","ariaHiddenAttr","hiddenAttr","configPolicy","viewId","buildViewId","appTitle","appMarkerClass","$lastFrame","lastFrameSrc","lastFrameLoaded","willInsertElement","$iframe","_monitorFrameLoad","willRender","_handlePostMessage","appApiHandler","isDestoyed","originalEvent","source","iframeWindow","buildApiLogMsg","evtOrigin","_validateMessageOrigin","expectedOrigin","failureReason","parseMessage","parseError","SDK_REPO_URL","lenientParseFailure","appsSdkEnabled","sandboxPermissions","hasSameOrigin","messagePrefix","expected","_normalizeUrl","parser","createElement","normalizedPort","IMG_TYPE_CFG_MAP","assetBasePath","closestSizeMaxMultiplierDelta","minSupplimentalRes","maxSupplimentalRes","tile","RASTER_IMG_KEY_REG_EXP","TITLE_MODES","titleMode","imgType","imgWidth","imgHeight","_sortedRasterMultipliers","cfg","allRasterImgs","rasterUrl","rasterKey","rasterMatch","exec","currRasterWidth","currRasterMultiplier","multiplier","_vectorImgUrl","defaultImgUrl","vectorImgUrl","allRasters","lowestDelta","currDelta","imgSrcSet","supImgs","svgSpriteHref","svgPropPath","imgClasses","classesPath","guxIconPropsPath","guxIconProps","_targetAppIframe","_targetAppWindow","_targetAppOrigin","_prevInstance","appInstanceMarkerClass","appInstanceId","appEmbedName","loaded","handler","onAppInstanceApiCall","reloadUpdatedApp","reloadFn","closeDeletedApp","closeFn","instanceStarting","currState","APP_STATES","RUNNING","compareTo","licenseUnavailable","APP_PROBLEMS","LICENSE_UNAVAILABLE","instanceUpdated","APP_UPDATED","instanceDeleted","APP_DELETED","exclusiveAppProblem","appVisible","prevAppInstance","currAppInstance","_unsubscribe","_subscribe","$iFrame","LIFECYCLE_HOOK_EVENT","_onLifecycleHook","hook","_sendAppNotification","LOADING","buildOutboundMsgPayload","poolStateClassName","inAutoLoadRetry","POOL_STATES","LOAD_FAILED","loadFailed","appNotFound","APP_NOT_FOUND","allocatingApp","ALLOCATING_SPACE","allocationFailureApp","ALLOCATION_FAILED","showPoolState","visibleInstanceId","SHOWING_APP","reloadApps","instanceIdToReload","hideApp","stopApp","showApp","instanceIdToStop","onDeletedAppClose","registerAppViewStack","PERFORMANCE_NAV_ORDER","menuSearchPaths","menuItemActivePathPrefixesMap","menu-search","menu-content-management","menu-performance-ddl","menu-partners","menu-admin","adminAccess","engage","documents","router","currentURL","showTinyNavDropdown","canSeeReports","appMenuItemsByFeatureCategory","activityLinkTitle","searchLinkTitle","myOrganizationLinkTitle","documentsLinkTitle","tasksLinkTitle","reportsLinkTitle","journeyAnalyticsLinkTitle","adminLinkTitle","performanceLinkTitle","appsLinkTitle","relateLinkTitle","leafItemClick","node","closeMenus","ensureRouteVisibility","leafItemClickEmpty","onDropdownChange","topLevelMenuItem","className","_buildAppMenuItems","standaloneAppPool","APPS_RELOADED_EVENT","_appsEnvChanged","findAllApps","standaloneApps","appMenuItemsByCategory","menuItem1","menuItem2","currApp","currCategory","currAppEntry","segment","activeTopLevelMenuItem","menu","menuItemBasePathsMap","basePaths","topLevelMatch","getActiveTopLevelMenuItem","adminEntries","useNewActivityRoute","pcDirectoryMenuItem","isHubEnabled","activityRoute","directoryMenuItems","linkData","directoryAppMenuItems","APP_FEATURE_CATEGORIES","DIRECTORY","open","documentsSegment","perfNav","perfNavEntry","isNewAgentsViewEnabled","currPerfNavItem","CodeUtils","generateClassName","wfmAdminEntry","subLinks","wfmAdminEntrySubLink","isIntraday","isRTA","isHA","isHS","wfmLink","navObj","isRouteMatch","isUrlMatch","perfAppMenuItems","CONTACT_CENTER_INSIGHTS","generalAppMenuItems","prevOpenSubMenuClassName","openSubMenuClassName","emberifyMenu","navEntries","performanceNav","adminNav","roles","any","ignoreDivisions","routeName","each","fromPlaceholder","isArchitect","isPerformanceEntry","lastSegment","handleShowTinyNavMenu","ensureRouteURl","isCurrentURL","generate","currChild","activePreference","defaultPreference","canOpenPreference","openPreference","changeTab","preferenceKey","handleTabKeydown","nextIndex","tabs","tabsArray","currentIndex","currentTarget","order","common","prefA","prefB","tab","string","preference","currentTab","enableDefaultQueues","checkboxName","val","changeSetting","sounds","ringer","digital","AutoSaveDevicesMixin","sound","webrtcSettings","volt","minCallVolume","minCallActiveRingerVolume","minPhoneRingVolume","minChatNotificationVolume","minInteractionNotificationVolume","defaultVolume","callVolume","ringerVolume","callActiveRingerVolume","chatNotificationVolume","interactionNotificationVolume","videoNotificationVolume","soundRunLater","advancedMicSettingsExpanded","skipServerUpdates","outputDevices","currentOutputDevice","autoGain","noiseSuppression","hasOutputDevices","ringtones","ringtoneSelection","videoIcon","loadVolumesForCurrentDevice","updateOutputTranslations","micPermissionGranted","ringerIsMuted","chatNotificationIsMuted","currentDeviceSanitizedLabel","currentDevice","deviceLabel","sanatizedLabel","sanitizeDeviceLabel","currentVolumes","volumes","outputDeviceChanged","phoneVolumeChange","newVolumes","updateSetting","_shouldUpdatePhoneVolumes","newPhoneVolumes","setAppVolumes","notificationVolumeChange","_shouldUpdateNotificationVolumes","newNotificationVolumes","videoNotificationVolumeChange","updateSettings","selectedDevice","currentWebrtcDevice","selectedDeviceIsCurrentOutput","volumeValueIsDefined","chatVolumes","updateVolumes","volumeValue","haveDevice","currentDeviceIsValid","validDevice","_validDevice","setCurrentDeviceToFirstInDeviceList","webrtcDevice","deviceHasIdAndLabel","getSystemDefaultDevice","updateAdvancedMicSettings","updatePropDebounced","toggleAdvancedMicSettings","toggleAutoGain","toggleNoiseSuppression","toggleEchoCancellation","changeOutputDevice","newDevice","playCallVolumeSound","_playSound","playCallActiveRingerSound","playRingerSound","playChatNotificationSound","playInteractionNotificationSound","toggleRingerMute","toggleMute","toggleChatSoundMute","toggleCallVolumeMinVolume","currentVolume","minVolume","toggleInteractionNotificationVolumeMinVolume","selectCallVolume","selectRingerVolume","selectCallActiveRingerVolume","selectChatNotificationVolume","selectInteractionNotificationVolume","selectVideoNotificationVolume","resetAllVolumes","changeRingtoneSelection","previewVolume","toggleVideoNotificationVolume","playVideoNotificationSound","playVideoNotificationPreview","stopAllSounds","stopSound","ringtone","volumeSetting","volume","volumeDecimalValue","outputDeviceId","playSound","runLater","ApplicationView","auditDrawerOpen","faxService","webrtcSdkService","frameService","emergencyLocation","primaryVoice","inbox","multipanelEnabled","videoActiveRoom","eLocation","showPreferencesModal","showNewInteractionDialog","activeTab","outboundMedia","showAlertingIcon","chatEnabled","showAdminAuditFooter","showIncomingAnswerToast","copyVoltConferenceBtn","standaloneHandlers","handlers","OpenWindowHandler","isActiveApp","activeStandaloneAppId","widgetHandlers","activeWidgetAppId","showLoader","trialSupport","answerAcdInteraction","answerUcCall","enable","Notify","notify","neverAgain","notificationPrompt","refreshApp","showAdminModal","closeWebrtcDebugModal","closeAdminModal","closeMobileModal","openPreferencesModal","closePreferencesModal","safeClosePreferencesModal","closeTrialSupport","dismissTrialSupport","endCallsAndInvalidateSession","endConversation","endAllSoftphoneSessions","immediatelyResubscribe","_registerTopics","engageNavigate","handleNavigation","engageRedirect","handleRedirect","engageRegisterNavEntries","registerNavEntries","engageDocumentFax","togglePanelSubstate","engageHelpURL","setHelpURL","engageInteract","engagePhoneSelection","engageSetBreadcrumb","setBreadcrumb","showInteractionDetails","relateNavigate","relateRedirect","relateRegisterNavEntries","answerVideo","declineVideo","pendingSession","callInfo","cancelPendingSession","_cancelPendingSession","closeRelateFrame","profileVerified","verificationRelevantData","onWidgetAppSelectionChange","widgetAppId","openAppsPanel","onWidgetAppInstanceApiCall","onStandaloneAppInstanceApiCall","setActiveTab","media","openAlertInbox","closePermissionsModal","requestAdditionalPermissions","alertingWorkitem","handleWorkitemAnsweredEvent","showNavbarAlert","showAppChrome","currentRouteClass","closeChatConversationView","currPoolState","currentRouteChanged","scrollTo","updateActiveRoute","askForNotificationsPermission","notificationsDisabled","promptEnabled","isSupported","needsPermission","_checkApplicationVersionTask","_ignoreEvent","_checkApplicationVersion","isFirstFire","currentVersionHtml","currentStreamingServiceVersion","html","remoteHtmlVersion","remoteStreamingServiceVersion","latestEnv","unescape","isHtmlDifferent","isStreamingServiceDifferent","initialAutoSelect","initialSelectedAppId","appSelectionChanged","widgetApps","_prevPool","_initialSelectAttempted","_processAppPoolAttr","_autoSelect","itemToggled","setActive","prevPool","currPool","_setWidgetApps","_onAppsReloaded","app1","app2","prefWidgetId","prefWidget","currShownAppId","hideCurrAppPromise","notifyFn","widgetAppTabConfigs","widgetApp","phoneService","acdEmailService","acdSmsService","layoutController","logMessage","buildLogMsg","getAppDef","def","messageHandlerChain","MessageHandlerChain","handlerId","HawkMessageHandler","ToastMessageHandler","MonitoringMessageHandler","LegacyMessageHandler","AssociateActivityHandler","emailService","smsService","messageEnvelope","chainResult","handleMessage","buildChainFailureLogDetails","updateGroupAppDefs","controller","_groupId","getAppUrl","DEFAULT_PROPERTIES","channelOneVolumeSetting","channelTwoVolumeSetting","masterVolume","playbackRate","isPlaying","totalDuration","currentTime","isMasterVolumeVisible","isChannelOneVolumeVisible","isChannelTwoVolumeVisible","annontationInputText","inErrorState","ignoredErrorCodes","retryable4xxCodes","newRecordingId","oldRecordingId","isBasic","isDarkTheme","channelOneVolume","channelOneSetting","master","channelTwoVolume","channelTwoSetting","isMasterVolumeMuted","isChannelOneMuted","isChannelTwoMuted","masterVolumeButtonId","channelOneParticipants","includePurposes","pickParticipantsByPurposes","channelTwoParticipants","totalDurationInMs","currentTimeInMs","loadingTotalDuration","loadingCurrentTime","qualityEngineChannelOneVolumeId","qualityEngineChannelTwoVolumeId","playOrPause","playing","play","handlePlaying","handlePaused","handlePositionChange","percent","newPosition","setPlaybackPosition","handleTimeUpdate","isMaster","handleDurationChange","handleEnded","setPlaybackRate","rate","downloadRecording","createAnnotation","annotationInputText","toggleMasterVolumeVisbility","toggleChannelOneVolumeVisibility","toggleChannelTwoVolumeVisibility","isRetryable","maxAttempts","setSinkId","showVolume","toggleShowVolume","percentComplete","click","percentPosition","offsetX","clientWidth","scaleSqrt","d3","select","viewBox","preserveAspectRatio","smoothedWaveformData","normalized","smoothed","renderWaveform","reRenderWaveform","destroyWaveform","barWidth","domain","range","chart","bar","selectAll","enter","append","remove","Howl","Howler","markAsRead","didEnd","loadingError","registerStopVoicemailHandler","playbackVolume","decimalValue","selectedOutputDevice","defaultOutputDevice","outputDeviceUpdate","restartSound","stopPlaying","newOutputDeviceId","setOutputDevice","togglePlay","seek","seekSound","registerHandler","setupSound","paths","getAttr","sources","howlOptions","html5","_onClockTick","loadingAudio","defaultOptions","onLoad","onplay","onPlay","onpause","onPause","onend","onEnd","_checkSoundDuration","Infinity","ontimeupdate","_duration","lastTimeValue","position","left","progressBar","marginLeft","offsetWidth","totalSeconds","didSeek","audioStream","backgroundColor","lineColor","canvasEl","canvasCtx","audioCtx","currentAnimationFrame","hasStarted","isInitialized","isVisualizing","canvas","getContext","_startVisualization","currentFrame","cancelAnimationFrame","_cleanupAnalyzer","_visualizeAudio","resetVisualization","AudioCtx","AudioContext","webkitAudioContext","resume","analyser","createAnalyser","minDecibels","maxDecibels","smoothingTimeConstant","createMediaStreamSource","connect","bufferLength","fftSize","dataArray","Uint8Array","clearRect","draw","currentCtx","currentCanvas","getByteTimeDomainData","fillStyle","fillRect","lineWidth","strokeStyle","beginPath","sliceWidth","moveTo","lineTo","stroke","auditDrawerTitle","setupFrameRouter","audit","authToken","messaging","addListener","handleLogger","toastIdFromClient","getUniqueToastId","toggleAuditDrawer","breadcrumbs","home","showBreadcrumbs","alternateRoute","PromiseLoadingMixin","chatFrame","fax","activeCall","activeFaxes","station","activeCallId","transferPerson","transferNumber","transferParticipants","numberInputType","showDropdown","loadingChat","reloading","addingParticipants","itemToDrop","faxOutbound","viewAssociateDashboard","isActiveFaxes","gte","promptForMerge","myGuid","personId","noStationSelected","stationSelected","needStation","showStationPicker","enableStationPicker","peerDisconnectedCall","myselfDisconnectedCall","roomJidToAddPartiesTo","partiesToGetAddedToChat","debouncePeriod","debounceTimers","participantsOnCall","peopleCache","dialpadShouldSendDtmf","callHistory","directory","dialpad","phoneSettings","followMeSettings","dropdowns","held","testing","canCallForward","callForwardingActive","offQueue","showEnableCallForwarding","enableRequireQueueDialpadLogic","showEmergencyLocation","onActiveCall","persistentConnectionActive","isPoppedOut","removeScrollAndShrinkDialPad","openStationPicker","toggleNewCallFaxPopover","closeStationPicker","callForwarding","cancelCallForwarding","disassociateStation","disconnectPersistentConnection","chooseStation","makeMergeRequest","cancelMerge","clearMergeData","resetProperties","changeActiveCall","addParticipant","dialNumber","toggleShowTransfer","toggleDropdown","selectPerson","getFieldValue","changeActivePanel","noop","isInputNumber","showTransferButtons","onCall","activeNonAcdCalls","_activePanelChanged","_setInitialPanel","panelKeys","isCallOnlyCurrentPanel","chatPartiesOnCall","peekRecord","eq","setupJidsAndRoom","_getHistoryConfig","canUseAssociateActivity","associateActivityTitle","callHistoryTitle","historyTitle","historyIcon","_this$_getHistoryConf","_this$_getHistoryConf2","partiesThatNeedToGetAdded","missingJids","jidId","joinRoom","head","getChatRoom","debounceTimer","addPartiesToRoom","chatService","addAllParticipantsToRoom","setRoomSubject","loadRoomHistory","iAmtheInitiator","connectedAndNotConfinedParticipants","isScreenMonitoringParticipant","numberOfChatParties","chatPartiesClasses","pickedPerson","timeline","showParticipants","makingCall","isOutboundGroupRing","isConferenceCall","isMultiParty","isBlindTransferCall","isIvrTransferCall","isConsultTransferCall","isOutboundCampaignCall","isCallbackCall","isOutbound","isMissed","wentToVoicemail","someoneElseAnswered","neverConnected","reachedVoicemail","callBack","telephone","toggleParticipants","showDisconnectReason","minutesPassed","last","callParties","callPartiesPromise","parties","PromiseArray","sortedCallParties","firstParty","secondParty","noCallParties","isSingleCallParty","redialGroupLabel","PromiseObject","_outboundCampaign","campaign","baseUri","campaignSelfUri","outboundCampaign","showContactControls","callStart","callTime","currDate","getCurrentDate","formatDateForDisplay","didInteract","callDuration","humanize","_getNameForVoicemail","doLookup","otherParties","addressDetailDisplay","fullName","dnis","ani","personNotDeleted","markRead","outboundCampaignName","titleForName","groupRingGroupName","personName","queuedConversationIds","disconnectedConversations","showingCallHistory","sortedHistory","aStart","bStart","aValue","bValue","fetchRecentHistory","fetchHistory","disconnectedConversationIds","conversationIdsToFetch","addObjects","$el","parents","shouldFetchNextBatch","truncateCallHistory","conversationsNotInStore","recentDisconnectedCalls","peekAll","content","fetchCallHistory","conversationsToFetch","isInit","fetchRecentCallHistory","latestCall","pop","missedCallEvent","scrollPosition","scrollHeight","scrollTop","scrollPositionByHeight","myParticipant","fetchMoreHistory","ExternalContactsMixin","showPresence","toggleHold","participantToHold","holdingYourself","handleOtherParticipantStatusChange","participantToMute","muteDisabled","participantToDisconnect","backgroundReload","isEmergencyNumber","formatRawNumber","formatOrLookupAddressForDisplay","showParticipantAddress","activeCallDisconnected","shouldAttachParticipantControls","isExternal","isConferenceStation","isParticipantAQueue","isAddressSip","isSipOnly","noUser","isConnecting","CarouselMenu","root","currItem","showIcons","onMenuChange","child","decorateMenuItem","parent","buildMenuTree","currItems","buildMenuItemViewModel","inSubMenu","menuNode","isBackNode","pick","back","forward","getPigeonMaxPriority","priorities","newTopicPriority","PRIORITY_MAXIMIZER","routingStatus","conversationsummary","other","outofoffice","geolocation","showMenu","enableCopyURLIcon","coaching","rollingLogCapture","isActivityPlanRulesEnabled","_route","pageBreadcrumbs","pubSubBindings","agentHome.openCoachingAppointmentModal","openCoachingAppointmentModal","agentHome.openCoachingAppointmentsInboxTab","openCoachingAppointments","agentHome.openLearningAssignmentsInboxTab","openLearningAssignments","page.breadcrumbs","updateBreadcrumbs","enableCopyUrlIcon","updateCopyIcon","helpPathChange","helpPath","setDocumentTitle","page.data","updatePageData","page.promptOnLeave","updatePromptOnLeave","phone.makeCall","makePhoneCall","fax.openFaxPanel","faxNumber","sidebar.expandCommunicationSidebar","expandCommunicationSidebar","sidebar.expandAcdPanel","session.proxyLogin","proxyLogin","logCaptureOnDemand.submit","submitRollingLogs","frameRouter","registerFrameRouter","prompt","callingPerson","onbehalfOfQueue","pageInfo","segments","enableCopyUrl","checkBreadcrumbAuthorized","breadcrumb","isBreadcrumbAuthorized","allOfThesePermissionsAreRequired","oneOfThesePermissionsAreRequired","validateAllPermissions","validateAnyPermissions","baseRoute","baseRouteForPath","crumbs","isHostPath","hasPath","isAuthorized","showAsLink","clientCrumb","normalizedBaseRoute","normalizedEntryPath","updateCopyURLIcon","nextRoute","getRouteWithoutParams","_title2","_message2","canAddLogCaptureOnDemand","postMessages","nav","navConfig","navForPath","adminMenu","engageKey","engageMenu","navParent","menuItem","navItem","extractPermissions","translateEngageMenu","adminKey","childMenuItem","mapAdminNavItem","translateAdminMenu","combinedBreadcrumbs","staticCrumbs","dynamicCrumbs","staticCrumbsNormalized","crumb","hasMenu","toggleMenu","isSidebarFullWidth","displayRoute","mappedNavItem","getAdminNavHref","external","adminNavItem","direct","dashboardHref","engageNavRoles","navRoles","checkArrayOfArray","permStr","PasswordRulesMixin","currentPassword","newPassword","newPasswordRepeat","isValidFromPasswordRulesPlugin","resetError","resetErrorMessages","resetSuccess","placeholderText","minPasswordLength","submit","submitDisabled","resetPassword","emptyValues","newPasswordError","passwordLengthError","maxPasswordLength","currentPasswordEmpty","newPasswordEmpty","resetPlugin","removeBehavior","attachBehavior","newPasswordStrengthIndicator","classList","cleanup","fipsEnvironments","ChangePinComponent","newPin","newPinRepeat","newPinError","maxPinLength","repeat","inputValid","verifyPin","flag","_verifyInputs","pinData","pin","resetValues","validate","newP","verify","regex","maxPinDigits","maxCount","charactersUsed","characterCount","isCallPane","chatCommands","collaborateChatConfig","freeSeatPreference","orgPreferences","collaborateChat","frameId","COLLABORATE_CHAT_FRAME_ID","PHONE","MAIN","chatInstance","initializeFrameRouter","handleCmdIFrame","frameRouterElement","setupCollaborateChatFrameRouter","setupCollaborateChatFrameEvents","getUpdatedPreference","collabChatPreference","showGithubEmbeds","setting","settingType","iframe","publishSideBarToCollabChat","sendCommandsToIframe","notifyCollaborateChat","COLLABORATE_CHAT_EVENTS","freeSeating","_rawIframe$contentDoc","rawIframe","contentDocument","triggerClick","listeners","toggleSidebar","popout","_ref3$payload","_popoutRoom","changeRoom","openRoom","changeFavorite","notifyCollaborateChatIFrame","favoriteChanged","updateWebDirectoryFavoriteState","_ref5$payload","_ref5$payload$rejoini","rejoining","joinRoomEvent","fromCollabChatCommand","_ref6$payload","command","commands","cmd","help","openVideoPane","handleCollaborateToast","collabChatIntegrationError","_ref7$payload","openPreferenceModal","openSoundPreference","collabChatToggleMute","_ref9$payload","mutedRooms","setRoomMuted","collabChatUpdatePreference","preferenceChanges","updatedPreference","pref","_regeneratorValues","collabChatStartedConference","trackRoomChange","collabChatPhoneFrameReady","firstChild","clearNotificationSidebar","directMessageAtMention","notificationTitle","notificationMessage","notificationDisabled","neverShowNotification","updateChatPreference","cancelAtMentionNotification","collabChatMessageReceived","messageRec","handleCollaborateChatMessage","collabChatUpdateSplatValue","theme","badgeColor","badgeText","bannerText","primaryButtonText","primaryButtonIcon","primaryButtonAction","secondaryButtonText","secondaryButtonAction","commandButton","isButton","useNewPersistentCallFt","showBookmarks","_boundResizeHandler","_boundFocusOutHandler","_handleOutsideClick","_handleFocusOut","_detachResizeListener","closeUserSettings","_updatePopoverTop","_this$element","getBoundingClientRect","setProperty","_attachResizeListener","_this$element2","toggleBookmarksPopover","closeBookmarks","currentPanel","bookmarkingEnabledFt","isCurrentPanel","buttonPanel","actionTogglePanel","panelName","events","hashProperty","hashChangeListener","navIsOpen","_monitoredAppPool","globalSearchOpen","moreOptionsOpen","_moreOptionsPopoverCleanup","continueOnQueue","checkQueue","presenceHistory","commandButtons","copilotButton","forceQueueDisabled","streamingDisconnected","_onAppsEnvChange","monitoredAppPool","widgetAppPool","_fetchWidgetApps","presenceListener","menuStructure","checkMenuPermissions","NavMenu","disableQueue","currentBreadcrumbValue","showAgentUIUnreadNumberLegacy","acdCount","workitemCount","showAgentUIUnreadNumber","isInteractionsEnabled","hasInteractions","canGoOnQueue","hasTrusteeAccess","isChatEnabled","isCallsEnabled","hashChangeHandler","updateHashProperty","owner","CommandButtonFactory","_buttonType","addQueueToggleSetup","popoverList","setupGuxPopoverListA11y","teardownGuxPopoverListA11y","button","output","_menuItem$hide","_menuItem$hide2","shouldHide","evaluateProviderExpression","evaluator","getEvaluator","subMenu","hashValue","removeHashProperty","queueToggleMoreMenu","queueToggleClick","queueToggleLabel","setPresence","setUsersPresence","navigateToSearch","notSearch","searchInput","getElementById","navigateToSearchButton","selectPhone","toggleMoreOptions","focusFirstGuxPopoverItem","closeMoreOptions","canSee","queueLabel","toggleQueue","_toggle$shadowRoot","inputDiv","shadowRoot","ACD_ALERTING_ELEMENT","hasAlertingAcdInteraction","hasAlertingNonAcdInteraction","hasNotifications","doFocusMethod","openAgentPanel","openChatPanel","openVoicePanel","skipToAlerting","callsTab","skipToNotification","notificationsContainer","skipToVoice","focusPanel","skipToChats","skipToMain","skipToInteractions","skipToPresenceSelector","userSettingsButton","userSettingContainer","mutationList","_observer","mutation","_document$getElementB","activeSelector","subtree","recentlyViewedPages","bookmarkPageTitle","_isDragging","_hasMoved","_startX","_startY","_draggedEl","_listEl","_boundMouseMove","_boundMouseUp","_boundMouseDown","_boundHashChangeHandler","draggedIndex","recentlyViewedExists","pages","properties","editingBookmarks","reorderAnnouncement","isRenameModalOpen","renameBookmarkTargetIndex","renameBookmarkTitle","existingBookmarksDetails","_bookmarksLoading","displayLimitReachedAlert","displayLimitReachedWarning","existing","bookmarks","bookmarkedPages","bookmarkDetails","bookmarkedUrls","isCurrentPageBookmarked","bookmarkedHashes","recentlyViewedPagesList","isBookmarked","refreshRecentPages","recentPages","_boundContextMenuClickCapture","attachMouseListeners","list","onMouseDown","clicked","closest","renameBookmarkEntry","targetIndex","newTitle","updated","previous","clientX","clientY","moveEvent","onMouseMove","upEvent","onMouseUp","getDragTargetIndex","rect","dx","dy","sqrt","sourceIndex","manageDraggedBookmarkOrder","_cleanupDrag","_entries$splice","_entries$splice2","moved","reorderBookmarks","errorKey","rank","_detachMouseListeners","addBookmarkEntry","alreadyBookmarked","removeBookmarkEntry","remaining","_handleHashChange","_handleEscapeKey","handleDragIconKeyDown","total","movedTitle","handle","addRemoveBookmark","currentUrl","editBookmarks","nowEditing","bookmarkRecentPage","recentPage","renameBookmark","bookmarkedPage","confirmRenameBookmark","cancelRenameBookmark","deleteBookmark","_bookmarkedPage","navigateToBookmark","transitionTo","handleRenameInputKeyDown","support","directoryCount","dismissed","submittingSearch","noRecentsYet","tetherConstraints","pageSearchResultsAll","pageSearchResults4","moreThanFourResults","viewAllPageResults","clearInput","_this$element$querySe","transitionToEntityDetail","_this$element$querySe2","collapse","_this$element$querySe3","handleSearchInput","togglePageResultsDisplay","pageCountPlural","directoryCountPlural","handleResizeEvent","pagesSearchTask","titleMatches","folderMatches","keywordMatches","navMenuMap","sorter","sortedTitles","sortedFolders","sortedKeywords","sortedResults","navMenuItem","itemTitle","itemKeywords","keywords","itemParent","parentFolder","itemTopParent","topParentFolder","strength","suggestSearchTask","focusResults","didCancel","performSuggestSearchTask","runSuggestQuery","submitSearch","_this$element$querySe4","types","suggest","models","modelResults","personFetchPromises","standardPersonIds","_integrationPhone$val","integrationPhone","_fetchPersonWithIntegrationPresence","settled","Logger","integrationConfig","getIntegration","_tetherPosition","_onResizeBound","handleChatFrameClick","createMenuMap","searchId","isQuerySpecifiedWithResults","_onInputFocusBound","_onOutsideClickBound","_onOutsideFocusBound","attachListeners","onInputFocus","detectOutsideClick","detectOutsideFocus","input","removeListeners","nameClicked","pageResultClicked","isFavorite","isDropdown","entityContactClicked","Tether","selectionStart","selectionEnd","_result","selectPage","targetRoute","externalLink","tabindex","keyDown","eventToString","duplicateObject","narrowWidth","subNavIsOpen","selectReturn","RESET_NAV","returnMainHandler","selectedMenu","selectedLink","activeLink","topLevelLink","_activeLink","availableMenuItems","agentPanelOpen","agentPanelActive","checkAgentPanel","matchingLinks","getMatchingLinks","findBestMatchingLink","activeMenu","getSelectedMenu","selectedSubMenu","subMenuItem","subSubMenuItem","subMenuOnly","topLevelLinks","evaluateExpression","expression","shouldHideExp","errorInfo","evaluateMenu","_menu","shouldShow","evaluatedSubMenu","tempMenuItem","evaluateApps","appItems","appMenuItemKeys","appsSubMenu","itemKey","appItem","topMenuLinks","appsMenuStructure","selectedTitle","previousMenuTitle","wasSubMenuOnly","triggerEvent","TOGGLE_SUBNAV_EVENT","TOGGLE_NAV_EVENT","menuButton","manageViewWidth","managePanel","expanded","closeNav","toggleNav","selectMenu","handleLinkAction","handleActivityLinkAction","returnMain","customImageLocation","altLink","exportNavConfiguration","Genesys","APP_SIDEBAR_PANEL_NAME_PREFIX","shownAppId","copilotFramework","getTelemetryAgent","guardedSendMessageByInstanceId","buildGuardedSendMessageByInstanceId","ModalMessageHandler","_window","gooseVersion","localProxy","buildCopilotFrameworkLogMsg","_this$getProperties","embedConfig","releaseEmbedConfig","GENESYS_HELP_DOMAIN","accessibilityEmbedConfig","helpDomain","contextualHelpUrl","contextualHelpAnchor","inboxUiVersion","currentDrawerId","panelFullWidth","panelDefinitions","PanelDefinitions","panelIsNotActive","acdCountLegacy","voiceEnabled","chatsEnabled","copilotFrameworkEnabled","notificationsEnabled","inboxLegacyEnabled","filteredPanelDefinitions","perms","expandPanel","persistent","hideHeader","defaultDrawerId","drawers","expandable","visibleDrawers","drawer","definition","selectDrawer","drawerId","subMenuOpen","toggleSubMenu","presenceSubscription","standardPresenceList","StandardPresenceList","userSettingsOpen","savedStatus","outOfOffice","scheduledOutOfOffice","ooo","startDate","avatarImageUrl","isE911Enabled","isMediaHelperMode","stationName","isRequestingOffQueueEnabled","currentPresenceDisplay","_person$get","_currentPresence$syst2","requestedPresenceId","requestedPrimaryKey","_futurePresenceDefini","activityPresence","futurePresenceDefinition","isRequestingOffQueue","systemPresence","primaryKey","secondaryKey","presenceMap","currentPresence","_currentPresence$syst","presenceChoices","foundPresence","secondaryPresences","_element$key","_currentPresence$syst3","foundSubPresence","presenceAriaLabel","presenceLastModified","primaryPresences","standardMap","onQueuePresence","presenceChoicesRaw","_futurePresenceDefini2","sortSecondaryStatuses","secondaryResult","presenceChoicesCombined","standard","outOfOfficePresence","sortByOrder","presenceLabelData","wrap","showStatus","showActivity","totalCalls","totalChats","totalEmails","isShowingActivitySummary","isPurecloudSource","isDefaultSource","isDefaultPresence","isTrustee","isStatusEnabled","isPresenceSelectorEnabled","isPhoneEnabled","isCallForwardingEnabled","isCallsForwarded","isActivateQueueEnabled","isMyFilesEnabled","isSecurityEnabled","ifNarrowPanel","_handleTabOut","_focusFirstElement","firstFocusable","_this$element3","focusableElements","lastFocusable","activeElement","shiftKey","showUpdateError","closeSidePanel","checkForNarrowSidePanel","changeStatus","setStatus","str","doc","DOMParser","parseFromString","textContent","toggleUserSettings","logout","_webrtc$get","confirmMessage","hasLegacySessions","hasActiveSoftphone","needsConfirmation","confirm","leaveRtcSessions","openPreferences","goToActivateQueues","goToFiles","goToStation","goToCallForwarding","goToProfile","goToProfileE911","changePresence","_person$get2","currentModifiedDate","modifiedDate","sendingPresence","sendOutOfOffice","endDate","isIndefinite","newOutOfOffice","setOutOfOffice","goToSecurity","menuOptionsArray","nonTranslatedTitle","titleAria","hasSubMenu","hasELocationInlineWarning","isEligibleForE911","eLocationIsEmpty","e911Warning","isOpenPresenceMenu","isOpenOutOfOfficeMenu","isOpenMyDetailsMenu","_lastOpenedSubMenu","isOpenMenu","menuOptions","_menuOptionsArray","subLabel","queueActivation","myFile","security","addObserver","_onMenuToggle","removeObserver","_focusOpenedSubMenu","_focusLastOpenedMenuItem","checked","first","myDetails","_this$element4","togglePresenceMenu","toggleOutOfOffice","toggleMyDetails","actionGoToActivateQueues","actionChangePresence","actionGoToFiles","actionGoToStation","actionGoToCallForwarding","actionSendOutOfOffice","actionGoToSecurity","closeMenuAction","changePresenceWrapper","changePresenceAction","userMenuAction","optionAction","isGeolocationEnabled","hasGeolocation","selfLocation","city","country","displayRelativeGeolocation","eLocationInlineWarning","street1ReadOnly","street2ReadOnly","cityReadOnly","stateReadOnly","zipcodeReadOnly","countryReadOnly","actionGoToProfileE911","presenceType","presenceKey","awayTypes","busyTypes","isRequestingPresenceOffQueue","presenceIcon","presenceClass","presenceIconWrapped","wrapped","optionId","noPhoneStationStyling","showOOOScheduled","fullAriaLabel","scheduledForText","formattedDate","closeSubMenuAction","padZero","padStart","splitHours","splitMinutes","EndOfTime","showOutOfOffice","clearStatusValue","showCustomEndDate","disableSave","startDateTime","startDateTimeJS","setHours","setMinutes","endDateTime","endDateTimeJS","endBeforeStartError","endBeforeCurrentError","setUpOutOfOffice","_outOfOffice$startDat","_outOfOffice$endDate","formatTime","indefinite","dateISO","dateJS","getHours","getMinutes","parseGuxDate","dateDetail","_dateDetail$split$map","_dateDetail$split$map2","year","month","day","KeyboardEvent","selectStartDate","date","selectEndDate","selectStartTime","_event$target","isValidValue","selectEndTime","_event$target2","changeClearStatus","setDate","getDate","endDateString","subMenuChoices","subTitle","_focusSubMenuRadio","openSubmenu","closeSubMenu","presenceOption","_presenceKeydownHandler","_presenceClickHandler","_mousedownHandler","_mouseIsDown","isOutOfOffice","isSubPresence","isExactMatch","isParentOfActive","radioButton","keydownHandler","presenceRadioSelection","mousedownHandler","selectedPresenceOption","actionOpenSubmenu","maxLength","localStatus","isSmallViewport","_mediaQuery","_mediaHandler","noPresenceData","presenceCallsTranslation","translationKey","presenceMessagingTranslation","presenceEmailsTranslation","presenceKeyModified","formatPresenceKeyForGux","mq","matchMedia","_debouncedChangeStatus","actionChangeStatus","actionGoToProfile","actionToggleUserSettings","trial","navV2IsOpen","mobileModalClasses","adminModalSrc","panelIsOpen","panelFullWidthAndOpen","shroudOn","showAgentWorkspaceRedirectModal","userPreferenceHideWorkspaceRedirectModal","showMobileAppOffer","alertingConversationLegacy","bannerActive","freeTrialStatusText","freeTrialDaysRemaining","isAgentView","setBannerClass","_setBannerClass","hasBannerClass","handleNavToggle","handleSubNavToggle","navMain","pageViewWidth","innerWidth","setPageSize","_recordCurrentPage","_commandNav$_router","_router","stored","hashesToRemove","filtered","trimmed","reindexed","recordRecentPage","_resizeHandler","_clickHandler","_hashChangeHandler","_transitionHandler","resizeHandler","transitionHandler","TRANSITION_EVENT","updateUserPreferenceHideWorkspaceRedirectModal","toggleUserPreferenceHideWorkspaceRedirectModal","closeAgentWorkspaceRedirectModal","confirmRedirectToAgentWorkspace","transitionToRoute","onDisplayTrialSupport","onGiveFeedback","onBetaSupport","homeOrg","loggedIntoHomeOrg","webrtSdk","bold","speaker","transferring","changeSpeaker","canUpdateConsult","changeSpeakerForConsult","endConsult","finishConsult","_endCall","consultParty","consultParticipantId","isSpeakerConsultParty","bothSpeaking","integrationsPresence","transferToParticipant","transferInputValue","canTransferToVoicemail","isSecurePauseLoading","conversationsArray","conferenceEnabled","proxiedModel","ObjectProxy","proxiedCheckedItems","eligibleCallsToMerge","showConversationControlsMenu","showMergeMenu","showAddParticipants","showDTMFDialpadDropdown","shouldShowDTMFDialpadButton","holdButtonDisabled","canBlindTransferAgent","canBlindTransferQueue","canBlindTransferExternal","canConsultTransferAgent","canConsultTransferQueue","canConsultTransferExternal","canTransfer","excludeFilters","shouldExcludeAgents","canBlindTransferSelectedParticipant","canConsultTransferSelectedParticipant","onMultipleCalls","activeIntegrationTab","GENESYS_SEARCH_TAB","resetConversationsMenu","clearOtherPanels","isRecording","haveTransferValue","isFlagged","canSecurePause","aRecordingIsActive","isCallConnected","hasSecurePausePermission","isNotInMonitoringOrCoaching","canRecord","isPaused","isSecurePauseEnd","conversationHasActiveParticipants","toggleSecurePauseTask","securePauseLoadingState","conversationParticipantIds","flagInteraction","flagActiveInteraction","unflagInteraction","_onVoiceMailTransferSelected","selectedUser","participantToTransfer","transferToVoicemail","onVoiceMailTransferSelected","setCheckStateOnRow","numberOfCalls","openDtmfDialPad","onCloseDropdown","performTransfer","havePerson","gcPerson","metric","_isGCOffline","consultTransfer","blindTransfer","unflag","toastStatusAnnouncer","toastAlertAnnouncer","announcer","clearAnnouncer","nextRegionIndex","Messenger","LocalMessenger","extraClasses","createAnnouncerRegion","appendChild","createToastAnnouncer","regions","pendingTimer","DesktopNotificationComponent","PERMANENT_NOTIFICATION_TYPES","needsServices","rawMessage","shouldShowPopup","shouldPlaySound","markdownToHtml","showNotification","hasActionHandlers","showBrowserNotification","showNativeChatNotification","showDesktopNotification","canShowNativeChatNotification","sCmd","cefQuery","onFailure","showToast","bounceDock","flashTaskbar","shouldNotify","isMobile","_getShouldPlaySound","escapeEntities","_HostedContextFunctions","notificationClickHandler","notifyClick","show","BrowserUtils","isSafari","setupBrowserNotificationMessage","emojifiedMessage","emojifyString","emojifyMarkdown","reg","updateBrowserNotification","newMessage","update","getBrowserActions","click .messenger-close","click .notification-text .read-more","click .notification-text .read-less","addListClasses","addToastAccessibility","isAcd","isAcdJid","soundId","services","leading","trailing","classesToAdd","cls","anchorEls","hasAttribute","closeText","closeBtn","messageEl","notificationTextEl","announcement","announceToast","hasRegistration","isHTMLSafe","setOwner","previewMedia","showTroubleshooter","fallBackToScreenShareStream","_handleDeviceChange","_cleanupPreview","_cleanupLocalMedia","localMedia","mediaOptions","getMediaOptions","camera","selectedCamera","microphone","selectedMicrophone","screenStream","createMedia","requestVideo","attachMediaStream","mirror","getScreenShareStream","LocalMedia","requestedTime","performance","startScreenShare","handleScreenShareError","showScreenShareConfirmation","positiveLabel","negativeLabel","clearSettingsModal","modalReturn","buttons","pushModal","buttonId","shareScreen","dontShareScreen","tryTroubleshoot","openSoundPreferences","LETTER_MAPPINGS","isPressed","attachSoundEvents","_triggerSound","removeSoundEvents","letters","hasLetters","isNumber","pressedObserver","decimalVolume","LETTER_TO_DIALPAD_NUMBER","h","k","z","+","layoutName","showCallInput","autoFocusCallInput","sendDtmf","showDialpadToggle","disableCallOnBehalfOfQueue","isAcdDTMF","showMakeCallButton","hideTargetDropdown","bypassPermissions","participantTags","isKeydownReset","queuedDTMF","dtmfTimer","pressed","canViewQueues","allEmergencyNumbers","includeFilters","allowOnlyEmergencyNumbers","requireQueue","telephonyDisabledForNonEmegergencyCall","requireQueueFT","multipleQueueParticipants","disableConferenceCall","conferenceParticipants","isPerson","selfInParticipantList","selfId","enableCallOnBehalfOfQueue","displayNumberWarning","enablePhoneOnSearchValue","allowOutboundExternalCall","allowOutboundUserCall","disablePhoneButton","noParticipants","queueInUse","emptyQueueField","disablePhoneOnSearchValue","shrinkDialpad","focusDialpad","dialpadNumbersContainer","_keypressResetTimers","pendingNumber","participantSelected","setPendingCallNumber","_makeCallTimer","actionValueChange","dialDtmfNumber","validState","_dialDtmfNumber","resetKeydown","handleKeydown","currentCallId","_bulkAddParticipants","bulkAddParticipants","_reset","_showCallError","_determineMakeCall","_makeConferenceCall","entityExists","entityNotContact","_makeCall","makeConferenceCall","showFeedbackErrorNotification","_value","onParticipantSelected","onParticipantRemoved","onParticipantRemoveByIndex","onHandleKeydown","onResetKeydown","onMakeCall","dragClass","dragLeave","dragOver","draggable","dragStart","setData","iframeState","otherParent","dropdownInfo","_verboseLogging","_verbose","attachWindowListener","setupFocusListener","onExternalIframeFocus","removeWindowListener","menuSelector","_menuSelectorClickHandler","hasInfo","broadcastDropdownChange","optionalClasses","bindings","optionalClassNameBindings","_windowClickHandler","targetIsInDom","targetChildOfDropdown","targetChildOfOther","attachOutsideClick","handleKeyDown","targetOutside","targetInput","listItem","toTimestampMs","_isAMomentObject","isMoment","ms","durationInMs","formatType","tick","tickingDuration","_formatDuration","staticDuration","startTimeNumber","endTimeNumber","newEnd","newStart","rawDuration","asMilliseconds","clampedMs","separateTimeDuration","finalDurationString","destroyIdlePopover","destroyTimeoutDuration","openMethod","popoverClass","parentRef","popoverRef","elementStates","destroyTimeout","AbortController","clickController","wrapperRef","parentElement","initializeEvents","actionSetReference","abort","destroyPopover","determinePopoverState","createPopover","applyPopoverClasses","setupPopoverEvents","clickEvents","focusEvents","hoverEvents","keyboardEvents","determinePopoverContent","signal","setPopoverPosition","capture","_target$getAttribute","setupOutsideClick","hideOnClick","resetPopoverContent","childNodes","createWrapper","spanWrapper","nodes","_wrapper2","_wrapper","setDestroyTimeout","clearTimeout","currentValue","hovering","focusing","setElementState","tabbableElements","change","checkState","targetBox","arrowSize","getComputedStyle","getPropertyValue","popoverBox","bottom","clientHeight","Evented","pageTitle","currentRoute","currentPageCrumbs","isHome","getMenuBreadcrumbs","lastBreadcrumb","showFreeTrialBanner","navStructure","copy","updateKnownCenterStageClientLinks","routeFeatureToggle","toggleForPath","stopOldAdmin","useRedirctFromOldAdmin","routeToggleOn","queryPath","adminPath","forOwn","heading","getIfNavLinkMatches","emberRoute","basePath","subRoute","localParam","existingParams","sendNavTree","handleNavigationMessage","routePrefix","_event$originalEvent","showModal","sendModalData","sendModalDismiss","_messageHandler","navTree","navMenu","findInCenterStage","navLink","navPath","isResponseManagementSublink","isQueueDetails","analytics","frameTimeout","hasAttemptedToLoad","hasAttemptedToReload","beginInitTime","nofityNewOutputDevice","goOffQueue","documentfax","initialized","_loadTimeoutTask","bootstrapTime","embeddedFrame","handleRouteChange","invalidatesession","checkUri","navigation","redirect","showinteractiondetails","handleToast","registernav","helpurl","COUNTRY_OPTIONS","editingElocation","showResetButton","showTitleIcons","showTitleInEditMode","saving","countryOptions","street1","street2","zipcode","isAddressEmpty","showNumberInTitle","updatedAddress","previewAddress","previewAddressIsEligible","previewAddressError","toolTipArrowId","toolTipHelpId","toolTipAlertInfoId","setField","field","updateElocationOnChange","countryTranslated","setUpdatedAddress","eLocationCopy","scheduleEmojiDom","_emojiDom","$this","emojifyDomUnicode","canViewVideo","videoTooltipTitle","linkProfile","compact","phoneServiceEnabled","phoneAvailable","isOneToOneOfflineOrBusy","isWebrtcEnabled","isVideoButtonEnabled","onContact","callEntity","useMediaProviders","startChat","launchWebrtc","isSelf","fieldPath","mailto","emailEnabled","tel","rel","phoneEnabled","showPhone","EntityContact","FlagMixin","callPromise","flagInteractionAction","EntityContactComponent","favorites","showChat","showFavorite","shouldTether","shouldDisplayDropdown","callConnecting","flaggingSupportEnabled","isRedial","tether","toggleFavorite","showPhoneSpinner","isExternalContact","recordRecentContact","entityData","callOrRedialLabel","phoneNumberDetails","isEntityFavoriteDecompEnabled","callConnected","componentCallIsActiveCall","personIsDeleted","favoriteEnabled","setExternalContactInfo","setupGroupPhoneNumber","setGroupNumber","enableFavoriteEvent","_onFavoriteEvent","hideChat","hasEmail","hasPhone","canDisplay","isContact","callTitle","setupTether","attachment","targetAttachment","to","removeTether","primary","primaryItem","notifyError","reportError","placeholderImages","isNameLatin","feature","hoverParent","applicationUrlPrefix","isPlaceholderImage","useInitialsPlaceholder","enableMiniCard","microCard","showMiniCard","imageLoadError","isHoveringCard","isHoveringImage","hoverTimer","isFirstHover","haveMediaProviders","mediaProviderComponent","useIntegrationBadges","integrationBadgesComponent","hovercardOffset","triggerShowMiniCard","_displayHoverCard","mouseEnterCard","onHoverChanged","mouseLeaveCard","_attachListeners","_removeListeners","isHovering","isOnline","chatPresence","chatPresenceClass","presenceLabel","eChatStatus","tetherSelector","tetherElementId","uniqueId","cardImageUrl","getProfilePicture","nameInitials","initialsPlaceholderSupported","commaIndex","spaceIndex","leftInitial","rightInitial","isPlaceholderImageAndUseInitials","showPresenceAndIsUser","entityIsGroup","entityDeleted","isSelfEntity","placeholderImage","profilePicture","deviceSize","sizeForDevice","exactMatch","sizes","ratio","devicePixelRatio","mouseEnter","mouseLeave","_createPopper","cardEl","arrow","_destroyPopper","_state","image","Image","clickedHoverCard","checkHoverState","isLinkable","subscribeToPresence","showStatusQuote","_managePresenceSubscription","imgEl","_onImgLoad","componentUpdated","_removePresenceSubscription","_animationRun","managePresenceSubscription","displayStatusQuote","imageUrl","_currentPresence","isStatusAnimating","animateOnPresenceChange","nextPresence","prevPresence","entityIsContact","modifyPlaceholderImage","autoSubscribe","locationClass","locationHoverText","noLocationHoverText","hoverText","showDepartment","showActions","clickToProfile","isSearchResult","phoneTooltip","entityTypeClass","entityIsPerson","entityIsQueue","entityIsMe","canContactEntity","useInitials","showOrganization","isClickable","_subscribePresence","subscribe","entityLocationData","eActivityPresenceClass","totalMessages","totalSocialExpression","ViewportMixin","requiredPermission","hasRequiredPermission","agentHasOnQueue","agentHasRequiredPermission","_subscribeToPresence","didEnterViewport","didExitViewport","_unsubscribeFromPresence","showPhones","showEmails","showAcceptsSMS","_getEmailTypes","modelKey","_getPhoneTypes","dropdownTitle","externalContactHasNoEmailAddresses","canUseNonE164","phoneTypeTranslated","phoneTypeId","typeName","externalContactHasNoPhoneNumbers","hasMultipleEmails","hasMultiplePhoneRecords","selectEntityWithEmail","onSelectEmail","selectEntityWithPhone","onSelectPhone","onPreventClick","engageanalytics","isDetailsLoaded","isDetailsLoading","canViewQueueDetails","getQueueData","generateCurrentInterval","joinedPromise","getQueueObservations","metrics","waitTimePromise","getQueueEstimatedWaitTime","callWaiting","callbackWaiting","chatWaiting","emailWaiting","messageWaiting","joinedData","waitTimeResults","getMetricCount","array","metricName","metricData","getOnQueueCounts","chain","partial","datum","qualifier","sum","joined","callData","callbackData","chatData","onQueueCount","idleCount","waitStr","queueData","agentData","callCount","callbackCount","chatCount","emailCount","messageCount","bestWaitTime","bestTime","formula","estimatedWaitTimeSeconds","getWaitTime","hr","sec","waitTime","addresses","includeCoverSheet","showFileTypeError","showRequiredFaxNumberError","faxParty","invalidFileTypeMessage","attachInstructions","observeFaxDocumentData","documentData","documentId","setFileInput","attachFileListeners","debounceTimerId","removeAttr","$hiddenFileInput","supportedTypes","isSupportedType","resetFiles","file","files","$faxNumberInput","numberIsEmpty","isFileAttached","noFilesAttached","faxForm","FormData","lastModifiedDate","validateFax","isValid","currentFileType","contentType","dragEnter","resetFormState","initiateFax","faxAddress","fileName","documentName","makeFaxRequest","updateActiveFaxes","_faxAddress","_purpose","makeUploadRequestWithHeaders","uploadDestinationUri","getActiveFaxes","handleFaxAddressInputChange","toggleCoverSheet","removeFile","chooseDocument","chooseFile","subjectSearchString","isSubmitting","isDisabled","_addBehavior","distList","natureType","natureTypes","requestPriority","requestPriorities","functionalityType","functionalityTypes","requestDescription","emptyFields","onLastConversationError","displayFeedbackForm","getRequest","desktopOS","desktopVersion","clientLocation","clientTimestamp","clientEmail","clientOrgName","clientLocale","clientType","clientVersion","desktopNotification","sendFeedback","showContactForm","updateNature","updatePriorities","updateFunctionality","updateSubject","updateDetails","minimized","isDragging","maxLeft","maxTop","_dragActive","_dragOffsetX","_dragOffsetY","minimize","setBounds","popback","toggleExpanded","setInitialPosition","_boundPointerMove","_handlePointerMove","_boundPointerUp","_handlePointerUp","_initDragHandles","_attachWindowResize","removeEvents","_detachWindowResize","_removeDragListeners","_boundPointerDown","_onPointerDown","onTopBar","onButton","_recalcMaxBounds","offsetLeft","offsetTop","setPointerCapture","pointerId","appScroll","navBar","navBarWidth","visibleHeight","innerHeight","isMinimized","widthPx","offsetHeight","newLeft","newTop","_event","useStored","_handleShowFloatingCallsChange","_onShowFloatingCallsChanged","activeConversation","incomingConversations","activeId","allCalls","conversationsCount","showMore","moreCount","_resetExpandedOnSingleCall","VOICEMAIL_CHOICES","emptyStationData","CallForwardingWrapper","callRoutes","currentStation","enableCallRoutes","isExternalVoicemail","toggleCallRoutes","save","toggled","showErrorNotification","selectUserStation","deselectUserStation","selectNumber","stationData","saveCallRoutes","selectStation","addStation","stations","removeStation","removeObject","noNewRoutes","updateVoicemail","externalVoicemailState","toAPIJSON","_checkForInternalDID","openWebrtcSettings","_updateCallForwarding","_buildCallRoutes","currentPhoneNumber","phoneField","cannotEnable","callsChanged","checkedTranslation","routeToSave","adjustVoicemail","addingNewCallRoute","_isInternalDIDError","targets","_code$split","_code$split2","errorType","callRoute","objectAt","saved","savingVoicemail","isInternalDID","loadingStation","isStation","isRemoteStation","stationGuid","isExtension","_station","timeoutMilliseconds","routeData","currentSearch","currentNumber","contactDropdownStates","toggleStationContactDropdown","stationId","dropdownStates","newStates","setupPopoverDismissHandler","isSelectedRoute","isLast","isOnlyRoute","attemptSave","isSameNumber","startsWithNumber","voicemailDisabled","_onCurrentSearchChange","_stationsSearchTimer","_runStationsSearch","stationsPromise","searchForStation","routes","routeIds","entitiesPromise","processEntities","displayValue","savedRoutes","showCheckbox","$target","is","rawUserIds","rawGroupIds","usersPromise","groupsPromise","usersUri","groupsUri","_yield$Promise$all","_yield$Promise$all2","apiUser","apiGroup","_address","typeText","publicationHasPayload","publication","exposeActiveClientAttribute","exposePubSubBindingsAttribute","frameRole","pageDataTitle","accessibilityLabel","frameRegionLabel","explicitLabel","activeClient","clientA","clientB","matchingClient","activeClientAttribute","pubSubBindingsAttribute","mediaProviders","_sidePanelClientEventListenerSetup","setupClientEventListeners","enableSidePanelClientEvents","publishClientAction","publishEvent","modalId","publishInvalidModal","publishModalData","publishModalDismiss","showIfcModal","ifcModalButtons","modalDetails","ifcModalData","getIfcModalButtonDetails","handleIfcModal","modalResult","publishModalPrimaryClick","publishModalSecondaryClick","publishModalTimeout","modalButtons","closureButtonText","handleModalEvent","requestedUrl","_routerMicrolib","resolvedHash","recognizer","recognize","clientChanged","resetStreamingSubscriptions","toastId","handleClickHandler","publishToastAction","ifcClientId","publishStreamingTopic","publishFavoriteTopic","unsubscribeTopics","connection","subscribedTopics","waitForProperty","unsubscribe","streamingTopicHandler","onStreamingTopicSubscribe","topicPriority","cloneStreamingErrorForPublish","handleForbiddenStreamingSubscriptionsRequest","onStreamingTopicUnsubscribe","operation","setupStreaming","setupMakeCall","callPersonById","setupStartChat","openChatRoomForPersonById","setupStartChatByJid","openChatRoomForJid","setupLaunchVideo","openChatRoomWithVideoForPersonById","_publication$payload","getProvider","_x5","setupFavoriteEntity","_publication$payload2","favoriteStatus","entityId","favoriteEntityById","unFavoriteEntityById","_x6","setupUpdateProfileImage","_publication$payload3","entityJid","confirmUploadImage","handleUpdateProfileImage","_x7","setupOpenHelp","openContextualHelpTab","_x8","setupSessionEntity","handleUserFieldUpdated","_x9","setupEmergencyLocationEntity","handleEmergencyAddrUpdated","_x0","extractTopicPermissionErrorParts","responseData","missingPerms","clientTopic","errorParts","streamingTopic","errorId","_callee13","_context13","handlePageDataForAccessibility","setupPageDataAccessibility","previousRoute","_accessibilityRoute","displayedModal","isGuxSidePanelBetaEnabled","legacyClientConfig","isSidePanelModal","sourceConfig","isSidePanelClient","sidePanelClients","resolvedClientConfig","applyQueryOverridesForPanel","applyQueryOverridesForModal","sidePanelData","modalClass","modalRoute","isLegacyModalEligible","isSidePanelOpen","isLegacyModalOpen","legacyRoute","sidePanelRoute","guxDismiss","modalType","closeModalHandler","modalDataHandler","onData","panelTitle","fromPageData","setRouter","_lastDisplayedModalForTitle","applyLegacyQueryOverrides","bindLegacyModalFrameListeners","syncSidePanelModal","__globalModalLegacyBindingsAttached","_syncSidePanelModal","hideModal","urlFormat","pathWithoutTrailingSlash","hashPath","toAppRelativeRoute","containerClassNames","translucentOverlay","overlayClassNames","headerText","confirmText","cancelText","showHeader","showFooter","extraClassNames","panelTemplate","panelTemplateProps","confirmDisabled","noCancel","sendConfirm","ret","sendCancel","resetSidePanel","bootstrapIcons","hovered","wfm","canEdit","userGuid","getPersonById","agentName","getAgentNameByIdWithState","dateFromNow","fromNow","isExplanationExpired","utc","explanationStatusText","canShowActionBtn","explanationDetail","explanationLen","dateFormat","changeReadState","isRead","explanation","adherenceExplanation","toggleNotificationState","hideDropdown","readAndViewDetails","getMessage","_msg","getScheduleUrl","updateExplanation","updateAdherenceExplanation","isNonEditable","defaultValue","clearText","changeCoachingNotificationReadState","coachingAppointment","viewDetails","toggleCoachingModal","readAndViewDevelopmentPlan","hasDevelopmentPlan","appsUri","startOf","devUri","developmentUri","attendeeName","attendee","appointment","attendees","att","coachingAttendees","localizedStatus","dateStart","formattedDateStart","isAfter","shouldShowInvalidMessage","isInvalid","inboxItem","actionType","updateOnDelete","appointmentId","recordFilter","voicemailFrame","voicemailFrameConfig","_groupVoicemails","groupVoicemailReadStatus","inCallControls","showReadOptions","voicemailFrameId","faxesFrameId","groupMailboxEnabled","canViewRecordings","faxesFrame","faxesFrameConfig","currentFilter","newExportsAvailable","newAlertsAvailable","canManageAlerts","isCopyStaticLinkEnabled","inboxPanelAttentionCounts","unreadVoicemails","unreadFaxes","unreadRecordings","unreadEvaluations","unreadTimeOffRequests","unreadShiftTradeRequests","unreadCoachingAppointments","unreadReportingExports","unreadReportingAlerts","unreadLearningAssignments","hasAdherenceExplanationAccess","unreadAdherenceExplanations","inboxPanelConfigs","hasVoicemailAccess","hasEvaluationAccess","hasTimeOffRequestAccess","hasShiftTradeRequestAccess","hasCoachingAppointmentAccess","hasLearningAssignmentAccess","hasReportingExportAccess","hasReportingAlertAccess","initVoicemailStandaloneConfig","updateGroupVoicemailUnreads","initFaxesStandaloneConfig","setupVoicemailFrameRouter","setupFaxesFrameRouter","handleVoicemailCallback","triggerForwardNotification","groupVoicemails","groupVm","callerAddress","currentTotal","validChoices","voicemails","faxes","recordings","evaluations","timeOffRequests","shiftTradeRequests","coachingAppointments","learningAssignments","reportingExports","reportingAlerts","explanations","comparator","truthyValue","falseValue","alertsComparator","evaluationsComparator","pageCount","recordingsPageCount","exportsPageCount","alertsPageCount","removedGroups","loadVoicemails","pageIndex","loadRecordings","pageNum","loadReportingExports","loadReportingExportsByPage","loadReportingAlerts","loadReportingAlertsByPage","changeNotificationPageNumber","loadCoachingAppointments","changeNotificationPageSize","goBackPage","decrementProperty","goNextPage","incrementProperty","toggleOptions","changeSelection","currentChoice","setRecordFilter","backPage","loadLearningAssignments","nextRecordingsPage","recordingsPageNumber","previousRecordingsPage","nextExportsPage","exportsPageNumber","previousExportsPage","nextAlertsPage","alertsPageNumber","previousAlertsPage","filterGroupVoicemails","groupData","removed","viewNewExports","viewNewAlerts","markAllAsUnread","toggleAllAlertsReadState","markAllAsRead","deleteAll","deleteAllAlertNotifications","handleKeyDownForLeftDropdown","handleKeyDownForRightDropdown","compared","filterEntity","isTimeOffRequestsLoading","adherenceExplanations","assignment","sorted","currentPageDisplay","disableNextButton","disableBackOriginal","lte","disableBackButton","disablePageNumber","disableRecordingsNextButton","disableRecordingsBackButton","disableRecordingsPageNumber","disableExportsNextButton","disableExportsBackButton","disableExportsPageNumber","disableAlertsNextButton","disableAlertsBackButton","disableAlertsPageNumber","_autoPageChange","setInitialPanel","setSelectionCoachingAppointments","inboxTabChoice","publishRecordFilterToVoicemailAppOnChange","publishToVoicemailFrame","publishRemovedGroupsToVoicemailAppOnChange","publishRecordFilterToFaxAppOnChange","publishToFaxFrame","hasCoachingAppointments","currentChoiceTitle","showVoicemails","showFaxes","showRecordings","showEvaluations","showTimeOffRequests","showShiftTradeRequests","showAdherenceExplanations","showCoachingAppointments","showLearningAssignments","showReportingExports","showReportingAlerts","selectedFaxes","hasCoachingUsability","hasCoachingOverdue","assignmentMessages","noUnreadAssignments","noReadAssignments","noAssignments","moduleAssignments","voicemailGroups","uniqueGroups","removedGroup","pushObjects","hasGroupVoicemails","unreadGroupVoicemailCount","hasChanges","newReadStatus","existingVoicemailIds","deletedGroupVoicemails","groupVM","existingReadStatus","vm","updateUnreadGroupVoicemails","showGroupVoicemailFilter","unselectAllFaxes","featureBranch","voicemailStandaloneUrl","voicemailStandaloneUI","faxesStandaloneUrl","faxesStandaloneUI","isGroupVoicemail","openChat","toggleRead","readEvaluation","evaluation","redacted","userAction","assignee","isPendingOrInProgress","showAgent","showAssignee","svgKey","linkContext","conversationDate","_renewExpiringExports","exportExpirationSummary","isRenewing","tooManyExpiredScheduledExports","expiringScheduledExportsCountDisplay","expiredScheduledExportsCountDisplay","isRenewDisabled","renewExpiringExports","expiringExportsResponse","days","openAssignment","learningAssignment","centerStageClients","learningAppUri","learningModules","assignmentUri","openDevelopmentPlan","isModuleOverdue","isOverdue","isFeatureToggleEnabled","isUnread","date2","hasSchedule","recording","setNotes","lt","saveDisabled","hasAlertSummary","canDeleteAlert","canEditAlert","canEditAlertRule","isAlertMuted","mutedUntil","isBefore","isAlertSnoozed","snoozedUntil","isSnoozingOrMutingAllowed","timeSinceCreation","relativeTimeThreshold","creationTime","isAlertRead","canViewLinkToInteractionDetails","canViewLinkToAgentStatusDetail","canViewLinkToQueuePerformanceDetail","canViewLinkToAgentPerformanceDetail","linkToDetailsPage","canViewInteractionDetails","canViewAgentStatusDetails","canViewAgentPerformanceDetails","canViewQueuePerformance","buildDetailPageRoute","deleteAlert","reportingAlert","cancelAlert","changeReportingAlertReadState","goToAlertRule","ruleId","snoozeAlert","snoozeOptions","dateEnd","updateReportingAlert","snoozed","dateSnoozedUntil","muteAlert","muteOptions","dateMutedUntil","_getId","setHasAlertSummary","alertSummary","ruleName","mainEntity","otherEntityDetails","ruleNameSeparator","inboxService","reportingAlertSummary","ReportingAlertSummary","getMainEntity","getOtherEntities","hasOtherEntityDetails","CATEGORY_AGGREGATES_VIEW_TYPES","copyExportButton","copyStaticLinkButton","canRunNow","hasStaticLink","canDeleteExport","canEditExport","isPdf","downloadAriaText","exportName","moreActionsAriaText","exportViewTranslationKey","viewType","isExportRead","didEmailFail","emailStatuses","isEmailPending","isEmailedExportFileTooLarge","emailErrorDescription","emailStatusesValues","emailStatusList","statusText","isEmailRecipientListPresent","percentageComplete","percentage","toFixed","percentageStyle","exportSchedule","convertCronScheduleToHuman","cronString","cronValues","humanValues","isSet","hour","minute","quarterday","monthday","deleteExport","reportingExport","cancelExport","changeReportingExportReadState","onDownload","downloadUrl","downloadId","downloadResponse","s3Url","issueRedirect","onCopyExportId","_setUpCopyButton","onCopyStaticLink","_setUpCopyLinkButton","onRunNow","runExport","_getStaticLink","copyButton","exportId","runId","btn","changeShiftTradeRequestReadState","shiftTradeRequest","readShiftTradeRequest","shiftTrade","initiatingUserId","initiatingUserName","getAgentNameById","initiatingDisplayedUserName","receivingUserId","receivingUserName","receivingDisplayedUserName","alternativeShiftUserName","areAgentsValid","isMyRequest","shiftTradeRequestStatus","shiftDate","initiatingShiftDate","isWeeklyTrade","weeklyTradeRange","weekStart","weekEnd","changeTimeOffRequestReadState","timeOffRequest","readTimeOffRequest","displayedAgentName","dateRangeDescription","rangeStart","rangeEnd","fullDatesRaw","fulldates","partialDatesRaw","partialdates","dates","rangePairs","datesLength","currentDate","nextDay","nextDate","rangePair","uniq","_getTeleComType","_getOtherParties","activeRecording","isEditable","stopPlayingVoicemail","getOtherParties","currentUserGuid","getTeleComType","toArray","participantIsAuthUser","participantDnisAndOtherPartyDnisEqual","toggleRename","cancelEditName","downloadMedia","fetchAudio","newWindow","openMedia","cannotCall","stopVoicemail","showSpinner","cannotMakeCall","confirmDelete","deleteAttachment","isVoicemail","deleteRecording","changeText","currentRead","inboxLink","toggleEditNotes","saveNotes","rollbackAttributes","isHoveredOrActive","copiedText","recordingName","calculatedName","getDefaultName","callerId","otherPartyName","otherPartyAddress","isNameNotDefault","isEditing","sameValue","isVoicemailParticipantInternal","isRecordingParticipantInternal","isPurecloudUser","personPromise","teleComType","personEmails","personPhones","phoneNumbers","formatTimeForDisplay","deleteTooltipText","callBackTooltipText","toggleReadTooltipText","isConference","isRemainingParticipant","groupImageUrl","remainingParticipants","isConferenceAndRecording","addressformatService","callerUser","defaultName","participantsCount","formattedCallerAddress","_this$recording","callerAddr","hideScrollbars","scrollBottomThreshold","onscroll","onScroll","scrollBottom","scrollThreshold","checkInfiniteScroll","infiniteScroll","isSmall","useLightIcon","iconUri","translation","locationMs","totalDurationMs","flipped","_prevInactivityTimeout","_status","_notifications","inactivityTimeoutFormatted","toLocaleString","hour12","getInactivityStatus","onStatusChanged","eventType","_eventType$options","secondsRemaining","getSecondsRemaining","_hideNotification","_onApproachingInactivityTimeout","_selectPanel","onApproachingInactivityTimeout","copyBtn","_getLogsString","logs","stringified","loggingOptions","localLevel","selectedOptions","itemsToLog","checkItemsAgainstOptions","toggleOption","isAuthenticated","offerMobileApp","onMobileOfferDecline","mobileOfferDeclined","MaintenancePage","reloadApp","hasDesc","messageKeys","rootKey","isUnrecoverableAppFailure","descKey","actionKey","_boundHandleOutsideClick","_boundHandleTargetClick","arrowElement","attachToEl","showingVideo","showingPurecloudVideo","showingMediaProvider","getVideoProviders","chatRoom","isGroupRoom","MenuItemComponent","showIcon","labelIdentifierClass","customClick","tgt","topClick","mobileVersion","appLink","appGreeting","checkMobileVersion","isApple","isAndroid","headerIcon","confirmLoading","initialFocus","dangerous","confirmAction","cancelAction","disableAction","setConfirmDisabled","setText","onCancel","onConfirm","rosterSidePanelService","rosterSelectionService","modeService","interapptionsStateService","mainstageLayoutService","sessionService","modes","hasModeSwitcher","currentMode","displayedMainStageMode","hasMainStageSelection","_pushedMainstageSize","_pushedMainstageCollapsed","_closeSidePanel","_openFilterPanel","modeId","componentName","panelComponent","panelKey","getModeFilterPanelKey","_headerAction","_searchQueryChange","_showAllHiddenItems","showAllHiddenItems","_sortOrderChange","_onMainstageFocusedChanged","_insertChatText","_this$get3$insertChat","_insertSmsText","_this$get4$insertSmsT","_insertEmailText","_this$get5$insertEmai","_this$get6","_loadDivisionName","_this$get7","_contextualScriptAvailabilityChanged","_this$get8","onFilter","onSelectMode","selectMode","onCloseSidePanel","onRosterSearchQueryChange","onRosterSortOrderChange","onShowAllHiddenItems","onHeaderAction","collapsed","agentUIBackendService","_fetchDefaultPanelSettingsWithRetry","resetFocused","_selection$id","toggleCollapse","toggleSizer","updateSize","itemCount","showItemCountBadge","maxItemCountBadgeDisplay","LETTER_TO_DIALPAD_DIGIT","showToggle","enableKeyboardInput","dialPadKeys","digit","subtitleTranslationKey","showDialPad","dtmfQueue","_dtmfTimer","isKeydownPrimed","_focusFirstDialKey","actionDigitPress","_scheduleDtmfFlush","_flushDtmfQueue","queued","digits","_toggleDialPad","_digitPress","_playDialTone","_callVolume","_getDialPadDigitHosts","_dialPadHostFromKeyboardEvent","composedPath","HTMLElement","_indexOfDialPadHost","_focusedDialPadHost","getRootNode","ShadowRoot","_moveDialPadFocusByArrow","hostFromEvent","hostFocused","DIALPAD_COLS","DIALPAD_KEY_COUNT","_digitsKeydown","mapped","digitFromKeyboardEvent","_digitsKeyup","onToggleDialPad","onDigitPress","onDigitsKeydown","onDigitsKeyup","descriptionKey","visual","_primaryAction","onPrimaryAction","onClose","rosterContextKey","header","searchPlaceholder","headerActions","searchConfig","filterConfig","DEFAULT_MODE_FILTER_PANEL_COMPONENT","sortConfig","DEFAULT_MODE_SORT_OPTIONS","defaultSortOrder","displaySearchQuery","visibleItems","resolvedAlertingGroups","modeLoading","isRosterItemPending","fetchDataError","isFilterActive","rosterEmptyStates","hiddenByFilterCount","isShowingHiddenByFilterBanner","actionShowAllHiddenItems","isRosterShowingLoading","isRosterShowingList","rosterEmptyStateKey","rosterActiveEmptyState","hasScrollDepth","_modeRosterScrollEl","_modeRosterScrollCleanup","_lastKnownExternalSearchQuery","_lastRosterContextKey","_searchDebounceTimer","contextKey","contextChanged","externalChanged","_cancelPendingSearchDebounce","_ensureScrollListenerAttached","_flushSearchQueryToParent","actionSearchQueryChange","actionFilter","actionSortOrderChange","_teardownScrollListener","scrollEl","syncScrollDepth","hasDepth","passive","_scrollToTop","_handleHeaderAction","_searchInput","onScrollContentsToTop","onSearchInput","onSortOrderChangeEvent","_target$value2","ModeModelFactory","fetchDataSchedule","fetchFnPopulatesAllItemsDirectly","rosterCardComponent","showSidebarItemCountBadge","hasInterapptions","communicationService","taskManagementService","externalContactsService","webrtcService","loggerService","queueToggleService","storeService","acdDisconnectedConversationIconsFT","acdFacebookIconUpdateFT","acdTwitterXIconUpdateFT","allItemsMapToValuesArray","allItems","cms","isWebrtcStation","hasPersistentConnection","useSdk","pendingSessions","hasPendingSession","autoAnswerCalls","_buildHeaderActions","_defaultQueueCache","_queueFetchCache","requestInteractionSelection","_navigator","selectItem","loadQueue","fetchParticipantName","convertToAppContexts","contexts","_registerRosterSelectionHandlers","initialize","triggerAutoAnswer","_handleAutoAnswer","_postSelect","_select","_postSelect2","_select2","_preSelect","registerHandlers","unholdInteraction","postSelect","holdInteraction","preSelect","callsToHold","findCallsToHoldOnSelect","_postSelect3","_select3","unholdWorkitem","holdWorkitem","toggleSettingsSidePanel","badge","countActiveFilterCategories","toggleFilterSidePanel","toggleOutboundSidePanel","unregisterHandlersForMode","teardown","_onMyConversationEvent","topicData","topicName","isTypingEvent","handleTypingEvent","processEvent","eventSource","_onDraftEvent","_onWorkitemEvent","prepareSubscriptionEventsFn","prepareSubscriptionTopicsFn","topics","fetchFn","activeConversations","activeWorkitem","fetchAll","_isAlive","fetchActive","signalReady","applySearchAndFilterFn","filterState","_item$participants","matchesActiveModeFilters","_item$workitem","_item$workitem2","plainString","participantHit","alertingGroups","buildAlertingGroups","_getItemId","itemIsAlerting","isItemAlerting","itemIsSelected","itemMatchesFilters","groupItemsFn","nonAlertingItems","_externalContactsServ","getExternalContactId","canonical","_group$items$","_externalContactsServ2","_canonical$get","gId","contactName","sortName","toLocaleLowerCase","fallback","_unholdInteraction","_holdInteraction","_x1","_x10","_unholdWorkitem","_callee14","_workitemInteraction$","_context14","unholdWorkitemInteraction","_x11","_x12","_holdWorkitem","_callee15","_workitemInteraction$2","_context15","holdWorkitemInteraction","_mode","_exportNames","_subscription","modeRosterFilterStateHasActiveSelection","mergeVisual","over","_over$variant","_over$icon","variant","mergeEmptyStateAction","_partial$labelKey","_partial$onAction","mergeResolvedEmptyState","_partial$titleKey","_partial$descriptionK","normalizeModeEmptyStates","defaults","noResultsBase","_mode$get","closeSpecificSidePanel","errorBase","noResults","buildDefaultRosterEmptyStatesForMode","resolveItemStartTimestamp","dateCreated","startTimestamp","resolveGroupName","groupSort","itemSort","timestamps","normalizeModeSearchConfig","normalizeModeFilterConfig","normalizeModeSortConfig","compareSortValues","numA","numB","sortItemsWithinGroup","sortGroups","isAlertingFn","aAlerting","bAlerting","aVal","bVal","compareResult","timestampA","getItemSortTimestamp","timestampB","itemsArrayToMap","ModeSubscriptionFactory","mainStageComponent","_rosterItemPendingTimer","_label","_searchPlaceholder","resolvedRosterEmptyStates","explicit","asArray","selectedItem","fullItem","applySortToGroups","sortCfg","_setupSubscription","_setupEvents","scheduleDataFetch","deleteItem","_attachConnectListener","rawItems","preFetchFn","postFetchFn","errorFetchFn","_cancelRosterItemPendingTimer","sortOption","firstItem","postConnectFn","_options","_items","hasSelection","setFocused","stateService","currentMap","newMap","_arr","_arr$_i","subscriptionTopics","subscriptionEvents","_connectListenerActive","_pendingScheduledFetchOnConnect","_registeredTopicsSnapshot","_hasTopicsRegistered","_registeredEventsSnapshot","_hasEventsRegistered","requiresConnection","_teardownEvents","_teardownConnectListener","_prioritizedTopics","prioritizedTopics","normal","unRegisterPriorityTopics","unRegisterTopics","_step2$value","_prioritizedTopics2","registerPriorityTopics","registerTopics","_step4$value","_onConnect","preConnectFn","ConversationMixin","makeRequest","orderBy","segmentFilters","predicates","dimension","operator","resolveItemDateDue","resolveItemPriority","_item$workitem$priori","INACTIVE_SORT_OPTIONS","_i$workitem","_i$workitem$priority","_i$workitem2","countInactiveFilterCategories","freeze","inactiveWorkitems","registerInactiveMode","unregisterInactiveMode","inactiveWorkitem","fetchInactive","_item$workitem8","_item$workitem9","statuses","_item$workitem3","routingStates","_item$workitem4","queueIds","_item$workitem5","worktypeIds","_item$workitem6","_item$workitem7","_item$workitem7$type","alertingItems","aTs","bTs","incomingCallId","INTERACTION_CHANNEL_OPTIONS","isAvailable","_filterState$channels","matchesAllFilters","_myselfAgent$callback2","_p$purpose2","_p$emails2","_myselfAgent$callback","_p$purpose","CallbackInteraction","CallInteraction","_p$emails","EmailInteraction","MessageInteraction","TRANSLATION_KEY_PREFIX","isMessageAvailable","createMessagingOption","matchesInteractionChannelFilter","_ret","matchesQueueFilter","participantQueueId","matchesDirectionFilter","communicationDirection","_oldParticipantKey","_trackedExternalContactId","_boundFetchName","_subscribeExternalContact","_unsubscribeExternalContact","previousId","trackedId","renderedItems","headerComponent","bodyComponent","alertingMode","sortedItems","headerContext","bodyContext","enrichedItems","GroupCard","_this$get$customerInt","qId","outboundContactGroup","_mode$createCall","_mode$createMessage","_mode$createEmail","_mode$displayError","_mode$fetchDefaultQue","_mode$fetchQueue","_mode$answer","_mode$decline","_mode$selectItem","_mode$loadQueue","_mode$loadParticipant","_mode$answer2","_mode$decline2","_mode$selectItem2","queueOptions","selectedChannels","selectedQueueIds","selectedDirection","interactionChannelOptions","availabilityContext","getAvailableInteractionChannelOptions","directionOptions","_interactionChannelDropdownHydrated","_queueDropdownHydrated","hasLocalChanges","localChannels","localQueueIds","localDirection","committedChannels","committedQueueIds","committedDirection","channelsSame","queueIdsSame","hasActiveFilters","_hydrateFromFilterState","_fetchQueues","_syncInteractionChannelDropdownValue","_syncQueueDropdownValue","_syncDropdownValue","dropdown","renderableQueueIds","_collectQueueIds","_filterState$queueIds","_interaction$particip","cached","missingIds","fetched","_buildFilterState","onChannelSelectionChange","onQueueSelectionChange","onDirectionChange","newFilterState","reset","statusOptions","worktypeOptions","routingStateOptions","selectedStatuses","selectedRoutingStates","selectedWorktypeIds","_dropdownsHydrated","localStatuses","localRoutingStates","localWorktypeIds","committedStatuses","committedRoutingStates","committedWorktypeIds","_collectStatusOptions","_collectWorktypeOptions","statusDropdown","routingStateDropdown","queueDropdown","worktypeDropdown","seen","_item$workitem3$type","_item$workitem4$type","onStatusSelectionChange","onRoutingStateSelectionChange","onWorktypeSelectionChange","ALL_OUTBOUND_OPTIONS","availabilityDependentKeys","OUTBOUND_AVAILABILITY_DEPENDENT_KEYS","availableOutboundOptions","hasMultipleOutboundOptions","currentOption","_ensureCurrentValueAvailable","isCurrentAvailable","_setValue","_complete","onValueChange","onComplete","queueInteractionType","queueSupplementalClasses","recipientSelectionMode","recipientPlaceholder","recipientLabel","recipientSupplementalClasses","hideRecipientTargetDropdown","enableDialpad","actionLabel","recipientFilter","recipientValidation","errorMessageKey","validation","isSubmitDisabled","severity","_recipientValue","_addRecipient","actionSubmit","_recipientSelected","_addNumber","_submit","busy","validateEmailInput","actionComplete","_payload$searchValue","validatePhoneNumberInput","formatEnabled","strict","_hasDirectRoutingSmsAddress","_payload$queue","_payload$queue2","_recipient$value","_selectType","messageType","onSelectType","_resolveCallTarget","bestPhoneNumber","_createdConversation","createdConversation","_this3$_resolveCallTa","FORM_TRANSLATION_PREFIX","ERROR_TRANSLATION_PREFIX","statusId","workbinId","dueDate","dateExpires","durationSeconds","ttlDate","submitError","worktypes","worktypesLoading","worktypesError","statusesLoading","statusesError","workbins","workbinsLoading","workbinsError","nameMaxLength","WORKITEM_NAME_MAX_LENGTH","descriptionMaxLength","WORKITEM_DESCRIPTION_MAX_LENGTH","formValues","worktypePlaceholderKey","statusPlaceholderKey","workbinPlaceholderKey","worktypesDisabled","statusesDisabled","workbinsDisabled","fieldErrors","validateCreateWorkitemForm","canSubmitCreateWorkitem","nameErrorKey","descriptionErrorKey","priorityErrorKey","dueDateErrorKey","dateExpiresErrorKey","durationSecondsErrorKey","ttlDateErrorKey","_loadWorktypes","_loadWorkbins","_loadDropdown","isApplicable","loadingKey","shouldApply","fetch","listKey","logLabel","fetchWorktypes","_loadStatuses","worktypeId","fetchWorktypeStatuses","fetchWorkbins","_setDateFromGuxEvent","_event$detail","normalizeGuxDate","serverMessage","buildCreateWorkitemPayload","createWorkitem","extractCreateWorkitemErrorMessage","onNameInput","onWorktypeChange","onStatusChange","_target$value3","onWorkbinChange","_target$value4","onDescriptionInput","_target$value5","onPriorityInput","_target$value6","onDurationSecondsInput","_target$value7","onDueDateChange","onDateExpiresChange","onTtlDateChange","placeholder","maxTags","inputClasses","valueIds","_tag$data$id","_tag$data","mockInteraction","hideOnClickOutside","hideOnKeyOutside","outsideClickListener","outsideKeyListener","checkFocusState","_element","determineOpen","updateSearch","_addTag","targetSelected","_addTags","_inputChange","_focusInput","targetRemoved","onTargetSelected","onAddTag","onBulkAddTags","onRemoveTag","onInputChange","onParkConfirm","parkExpirationTime","selectedDate","selectedTime","maxDate","minDate","maxDateOffset","maxDurationDays","parkingExpirationTime","combinedDateTime","_combineDateAndTime","dateTimeErrorMessage","_selectedTime$split$m","_selectedTime$split$m2","_selectedDate$split$m","_selectedDate$split$m2","createLocalISODateString","getFullYear","getMonth","getParkResumeDaysLimit","_initializeDates","toTimeString","onParkClick","onDateChange","newDate","onTimeChange","newTime","shouldAttach","tetherBoundingBox","tetherDropDownMenu","tetherClass","onMenuSelector","onMenu","setupTetherDropDown","hasParentBox","hasBoxMember","classPrefix","_hoverHandler","_tetherHoverHandler","tetherEl","showTetherDropDowns","headset","showMediaHelperStatus","showAudioControls","selectingWebrtcSettings","showTroubleshoot","showPhoneOptions","isoLocale","troubleshooterIframeAuthEnabled","callForwardingNumber","callForwardingExtension","webrtcTroubleshooterUrl","requireMediaHelper","attachOutsideListener","audioCallCapable","notShowAudioControls","canSelectDevices","stationIsWebrtcAndSelectingSettings","stationIsWebrtcAndNotSelectingSettings","showWebrtcControlsByDefault","showNoStationMessage","showNoStationSettingsMessage","canActivateQueues","canDeselectPhone","placingCallsExternallyIconText","closeMenu","activateQueues","changePhoneSettings","callVoicemail","toggleWebrtcSettings","openCallForwarding","toggleTroubleshoot","toggleBrowserAnswer","choices","headerKey","subLabelKey","subLabelAction","allowCheckboxDisable","_focusObserver","mainWorkTimer","savingTimer","successTimer","selectValue","handleSave","selectValueChecked","_waitForElementToBeReadyForFocus","_cleanupObserver","formElementType","isSelect","isCheckbox","shouldDisableCheckbox","IntersectionObserver","isIntersecting","intersectionRatio","threshold","_checkForElement","attempts","preferenceDefaults","soundsMuted","mediaExpanded","sortedAlpha","displayDensity","giphyKeyboard","selectRosterOrder","communicateAndPersistPreference","selectDisplayDensity","selectMediaExpanded","mediaToBoolean","changeSoundsMuted","changeGithubEmbeds","changeGiphyDefaultState","_loadPreferences","trySet","preferencesService","booleanToMediaState","embed","githubRepo","mediaExpandedOptions","displayDensityOptions","sortingOptions","giphyKeyboardOptions","notDesktop","showNotificationsSection","persistPreference","getPreferenceSettings","backupRoutingOptionChoices","selectedRoutingOptionUser","selectedRoutingOptionQueue","primaryBackupOptions","backupTimeUnits","directRoutingInputs","userPrimaryBackup","userPrimaryBackupOption","userSecondaryBackupOption","userBackupTimeUnitsDays","userBackupTimeUnitsHours","userBackupTimeUnitsMinutes","backedUpUsers","waitForVipAgent","rawSettings","agentWaitSeconds","waitForAgent","primaryBackup","initDirectRouting","_loadDirectRoutingSettings","_loadBackupUser","getUserBackupEntity","_loadBackupQueue","getQueueBackupEntity","getOwnSettings","processDirectRoutingSettings","userPrimaryBackupOptionType","_modifiedRoutingOptionChoices","routingOptions","waitSecondsCalculated","invalidWaitSecondsMin","invalidWaitSecondsMax","invalidWaitSeconds","enableSave","inputs","hasWaitForAgentChanged","hasWaitSecondsChanged","hasValidWaitSeconds","hasPrimaryBackupOptionChanged","hasSelectedPrimaryOption","secondaryBackupAvailable","showSecondaryBackup","hasSecondaryBackupOptionChanged","userDesiredSettings","waitSeconds","hasBackedUpUsers","showSkipTimeout","showBackupRoutingOptionUsers","showBackupRoutingOptionQueues","hasSelectedRoutingOptionUser","skipTimeout","canClearSettings","cannotEditSettings","disableClearSettings","selectedPrimaryBackup","searchBackupRoutingChoices","searchInfo","searchBackupType","searchDetail","backupType","getDirectRoutingEntities","clearSettings","newSettings","deleteOwnSettings","selectWaitForVipAgent","selectPrimaryBackup","selectPrimaryBackupOption","primaryBackupOption","searchRoutingOptions","userIsInputing","blankQueueSearch","hideBackupRoutingChoicesDropDown","userOptionWasClicked","preferenceOptionWasClicked","localName","selectSecondaryBackupOption","secondaryBackupOption","editBackupTimeUnits","timeUnit","showClearSettingsModal","saveChanges","updateOwnSettings","checkForUpdates","startOnLogin","allowGeolocation","orgHasGeolocation","downloadDirectory","isMac","isWindows","additionalPreferences","loadPreferences","getAdditionalPreferences","prefNames","requestDesktopPromise","notification_checkForUpdates","notification_autoStartOnLogin","permission_geolocation","hasDownloadDirectory","download_directory","shouldSetDesktopPreferences","prefDict","dict","changeDesktopPreferences","toggleCheckForUpdates","toggleStartOnLogin","toggleAllowGeolocation","browseForDownloadDirectory","newDirectory","applyFailed","selectLanguage","applyAndReload","setPreferredLanguage","languages","supportedLocales","canApplyAndReload","showCheckBrowser","hidePlaySound","hideSoundSelector","soundName","shouldShowBrowseForSound","bounceDockIcon","showGroupNotifications","soundOptions","useDesktopGroupNotificationSetting","disableProfileNotifications","bounceDockIconOptions","notification_playSound","notification_soundName","notification_bounceDockIcon","notification_showToast","notification_flashTaskbar","notification_showGroupNotifications","modifySoundOptions","opt","saveNotifyChange","changeGroupNotificationPreference","togglePlaySound","toggleShowToast","toggleShowGroupNotifications","toggleFlashTaskbar","toggleNotificationPrompt","chooseSound","chooseBounceDockIcon","browseForSound","newCustomLabel","playSoundSample","sendTestNotification","changeProfileNotificationSetting","saveGroupNotifyChange","notificationPreferences","toggleMic","toggleCamera","togglePrejoin","UP_KEYCODE","DOWN_KEYCODE","TAB_KEYCODE","getParent","$parent","regxp","which","$items","lastIndex","deviceProfilesV2","profileCopy","showEditPart","alertingLeaderEnabled","alertingLeaderStatus","showAlertingLeaderButton","_handleAlertingLeaderChange","isReadOnly","troubleshoot","outputDevice","tempProfileId","previousHeadsetState","profiles","selectedProfileId","defaultProfileId","isDefaultProfile","mediaState","cameras","microphones","disableDeviceVolumes","hasDevices","alternativeClientInUse","negotiatingCallControls","headsetConnectionStatus","headsetState","preservePreviousHeadsetState","showHeadsetStatus","showHeadsetOrchestration","showRetry","selectedProfile","selectedProfileName","profile","canEditProfile","defaultConfig","notificationDevice","validWithoutCamera","hasCamera","hasMic","openTroubleshoot","displayingTroubleshooter","nameInputError","ensureVideoPermissions","_onShowEditPartChanged","_focusTimer","_setFocus","setDefaultProfile","showEditProfile","cancelProfileEdit","saveProfileEdit","saveAndSelectProfile","useComputerSettings","setProfile","createNewProfile","deviceConfig","recentlyAddedDevices","clearRecentlyConnectedDevices","uuid","deleteProfile","profileId","changeProfile","canBeSelected","changeCamera","changeMicrophone","changeNotificationDevice","retryConnection","setUseHeadsets","setAlertingLeader","claimAlertingLeader","changeTempProfile","_width","newWidth","oldWidth","updateWidth","percentageWidth","$underlay","updatedWidth","isFiniteNumber","isFinite","isPositivePercentage","inRange","final","desktopRegionId","_setDefaultRegion","defaultDesktopRegionId","matchingEnv","PUBLIC_ENVS","desktopId","envStatus","env1","env2","setRegionId","regionId","chooseRegion","sendRegionToDesktop","isMouseDown","minHeight","toggleSize","attachCurrentHeight","minimizedChanged","searchResults","shareBtn","embedResults","hasSearched","selectedHelpPage","_searchHelp","searchDocumentation","_setUpShareBtn","searchHelp","loadHelpResult","backToResults","containerClass","ariaLabelledby","loop","roving","_rovingTabIndex","_initializeRovingTabIndex","_cleanupRovingTabIndex","existingInstance","refresh","container","rovingTabIndex","RovingTabIndex","clearTranslation","disableInputEnter","showDirectTransferToVoicemailDropdown","hideOnFocusOut","getInput","focusOutListener","ignoredElements","resetSearch","clearSelection","onInputEnter","transferToVoicemailClick","onKeypress","onTransferToVoicemail","onClearSelection","SkillGroupProfileComponent","EntityControllerMixin","isShowingGeneralModal","modalName","modalDescription","canEditSkillGroup","membershipHeader","selectTab","editGeneralInfo","updateGeneralField","fieldName","updateField","confirmGeneral","loadMembership","cancelGeneral","deleteGroup","skillgroup","currentDivisions","selectedDivisions","totalDivisions","divisions","canSelectAll","initListeners","initCurrentDivisions","getDivisions","handlePaginationChange","handleSelections","handleSearch","div","added","permanent","itemsPerPage","selectedRowIds","saveDivisions","addDivisionIds","removeDivisionIds","showSaveModal","previewValue","previewUrl","expressionDisplay","conditions","valid","con","invalid","condition","maximumExpressions","numberPreview","addCondition","exp","lastCondition","rules","skill","proficiency","lastRule","removeCondition","conditionOperation","op","skillConditions","prepareExpression","openCancelModal","closeCancelModal","closeSaveModal","routingSkillConditions","languageSkillConditions","rule","skillPropName","ruleType","newObj","childConditions","newCondition","comparators","Not","And","Or","compPlace","maximumConditions","updateConditionDisplay","addRule","removeRule","ruleOperation","skillChanged","hasEmptyFields","skillResults","languageResults","showSearchResults","searchvalue","placeHolder","skillSelected","clearSearch","searchInputUpdated","updateSearchOnChange","attachOutsideHandler","removeOutsideHandler","runSearch","languageSearch","skillSearch","retry","skills","skl","langs","lang","memberEntityId","bulkPerson","membership","isLoggedInUser","sessionPerson","fromStore","nameFromMember","images","primaryContactInfo","profilePlaceholder","memberIds","PagingMixin","JobMixin","peopleById","onSkillGroupMembersPageLoaded","onGroupChange","loadContentOnScroll","loadMoreMembersOnInit","_enqueueLoadMemberProfiles","loadMemberProfilesTask","openDivisionPicker","templateProps","removeDivision","displayDivisions","cIndex","rIndex","membershipCount","listingEl","containerHeight","listing","scroll","prior","enqueue","maxConcurrency","lighten","_activeSegment","activeSegment","throttleTime","nextUri","prefetchComplete","pageAttempts","prefetch","throttleSearch","scrollEventEl","$stationList","attachScrollListener","defaultStationNotCurrentStation","defaultStationId","currentStationId","defaultStationInUse","defaultStationUserId","hasDefaultStation","_doFetch","filterSearch","fetchNext","_opts","v4","mappedEntities","_mapStations","setNextUri","_maybeRefetch","lineAppearanceId","webRtcPersistentEnabled","associated","isNext","useDefaultStation","allowSameValueTags","allowCommaSeparatedParsing","inputRef","autofocusTag","oldSearch","inputId","focusInput","keyupHandler","inputHandler","actionInputFocus","didDestroyElement","_this$input","_this$input2","_this$input3","_this$input4","ref","_this$input6","_this$input5","_this$input7","actionAdd","actionInputChange","tags","arr","actionBulkAdd","resetInput","_this$input8","_tagKeyUp","actionRemove","_removeTag","onTagKeyUp","color","FILTER_KEY","showBack","backText","addButtonIcon","addButtonTooltip","searchPlaceholderText","allowRawInputSelection","additionalPermissions","searchValueIsValid","_showContent","activeFilter","filters","filterCount","storeConfig","baseStoreConfig","totalElements","pagination","disableInfiniteScroll","infiniteScrollLoading","requiredPersonPermissions","setFilters","fetchDataByFilter","_this$$","baseFilters","externalContactsFilter","relatePermission","savedFilter","createBaseFilters","createExternalContactsFilter","isFilterAvailable","allTotalElements","allContent","_Object$keys","_this3$interaction$wo","_this3$interaction$wo2","_yield$_this3$fetchDa","resetInfiniteScroll","sortSearchResults","aName","bName","_meta$total","userIds","userResults","alterUsersWithIntegration","getRecord","fetchNextData","nextContent","_yield$_this5$fetchDa","currentResults","actionBack","onDataRowSelected","onBack","onNumberSelected","onSearchChange","onClearSearch","_Object$keys2","onFilterChange","onInfiniteScroll","ConversationSummaryConfigData","socialExpression","props","_filterData","_filterStoreConfig","_conversationSummaryConfig","actionFilterChange","interactable","smsTooltipId","schemaTitle","titles","primaryTitle","secondaryTitle","address1","address2","postalCode","countryCode","organizationName","whatsAppIdDisplay","phoneNumberDisplay","phoneTypes","typeKey","emailTypes","showMoreMenu","bestContactPoint","noBestContactPointLabel","translatedInteractionType","contactPointLabel","contactPoints","viewProfileLink","abortController","fetchSchemaTitle","infoElement","actionNumberSelected","actionEmailSelected","phoneTypeKey","onEmailSelected","goToFullProfile","isInConversation","useEnhancedPermissions","userMissingPermissionMessageMap","routing:agent:onqueue","conversation:internalMessaging:accept","userMissingPermissionsText","missingPermissions","strings","missing","userMissingPermissionsLabel","canAgentGoOnQueue","agentHasRequiredPermissions","required","conversationSummaryData","conversationSummary","summaryData","summary","_getActiveCount","titleLabel","presenceLabelText","secondaryPresenceLabel","summaryTooltipId","invokeTransferToVoicemail","engageAnalyticsService","queueDetails","queueDetailsError","queueDetailSummary","waitingCount","lastDetailFetch","loadingQueueDetails","estimatedWaitTime","_details$waitTime$est","_details$waitTime","getBestDetails","estimatedWaitTimeLabel","availableAgentsCountLabel","available","_d$waitTime","shouldUpdate","_yield$_this$get$getQ","waitTimeMap","joinedDataMap","determineWaitTimeIntentKey","intent","_joinedDataMap$get","normalizedType","incoming","_ConversationSummaryC","getOnQueueCount","_data$stats","_data$stats2","hasOnQueueUsers","_metricData$stats$cou","thumbnailStyle","img","_a$resolution","_b$resolution","aResolution","bResolution","_filter","_paginationOptions","_conversationSummary","_queueDetails","QueueDetailMetric","QueueDetailQualifier","QueueWaitTimeFormula","HOUR","MINUTE","timeSince","_calculateElapsedTime","totalHours","unit","msSince","CHAT_TYPE_MESSAGES","markAllRead","clearAllEvents","newEvents","eventList","allAcknowledged","updateString","timelineSortedEvents","DirectMessageRenderer","RendererBase","fromPerson","runEmojify","contentTag","emojifyDom","TimelineMentionRenderer","roomSubject","roomName","MissedCallRenderer","showVoicemail","otherPartyGuid","callText","setCaller","callObject","otherPartyUserId","RendererComponentBase","acknowledged","timeAt","timeDisplay","toDateString","yesterday","sixDaysAgo","weekday","SparkIntl","dateTimeFormat","formatCalendar","updateTimeDisplay","markEventAcknowledged","RoomMessageRenderer","roomSubj","eventTypeIcons","mention","direct-message","room-message","missed-call","dateDisplay","isToday","isYesterday","isWithinWeek","ToggleItem","onchange","toggleItems","toggleItemConfigs","validItems","validateToggleItemFormat","itemConfig","toggleItem","idClassName","check","dataOn","dataOff","toggleParam","toggleRoomMute","adjustWidth","_didUpdateTimeoutLength","TooltipOnElement","_handleWindowClickBound","handleWindowClickEvent","backgroundColorClass","markerPositionClass","markerPosition","toggleButtonSelector","debugInfos","clientInfo","canExportRecording","clientJid","clientLogs","toggleInfo","conversationInfo","rerollColor","rerollParticipantColor","exportSnapshot","createSnapshot","sendDiagnostics","toggleRecording","exportRecording","handleDeviceChange","handleVolumeChange","attachMediaStreams","_sessionsListener","getAudioElement","createStreamWithTrack","audioEl","setDefaultOutputDevice","$audios","setLocalMedia","localeQuery","sendCurrentToken","sendTokenToClients","reSendTokenOnRefresh","Controller","isNonEmptyStringQueryParam","paramStr","sidebarService","initialPanel","_applyTheme","updateSparkTheme","updateCurrentRouteName","targetElement","documentElement","removeAttribute","EngageController","engageService","replaceRoute","setEngageActive","setEngageInactive","navigationEvent","navRoute","engageRouteToCollaborateRoute","redirectEvent","newRoute","internalLogs","FieldConfig","OrgModel","KEY_BLACKLIST","GROUP_BLACKLIST","ORG_BLACKLIST","PROFILE_BLACKLIST","_id","_initModelWithType","blacklist","section","fieldConfig","reopen","allowedValues","getFieldByKey","unknownProperty","getSectionByKey","splitFieldPath","sectionKey","fieldKey","splitField","getFieldListByType","fieldList","getFieldsByType","getAllowedValues","isFieldRepeatable","repeatable","isFieldReference","isFieldChoice","groupFieldConfig","getFieldConfig","personFieldConfig","extra","createFieldConfig","FieldSection","attachComputedEntries","getFieldPath","boundTo","boundToEach","getEntriesFromEntity","fieldPathClass","isFieldEmpty","writeable","readWritePermissions","write","instructionText","getEntityType","getI18nKey","serverKey","Field","labelKeys","customLabels","maxRepeat","i18nLabel","getI18nLabelKey","i18nKey","elemId","hhmmss","second","EUR","currency","minimumFractionDigits","maximumFractionDigits","USD","Helper","compute","versionOnly","hideSha","shaOnly","hideVersion","showExtended","versionExtendedRegExp","versionRegExp","shaRegExp","helper","valueBeforeSettled","maybePromise","_ensureLatestPromise","_wasSettled","_promise","_unsettle","_settle","_allowUpdates","recompute","emberDasherize","buildHelper","escape","_flairRegEx","namedArgs","hideIfText","emojiText","fullNameHelper","externalProfile","joinStrings","_toArray","joinCharacter","rest","onIntegrationConfigChange","integrationContactInfo","integrationConfigs","includeBadge","ACTION","registry","__loader","getRouteWithAction","actionName","emberArray","routerLib","currentRouteInfos","routeInfos","currentHandlerInfos","getRouteInfos","getRoutes","_actions","runInDebug","_getRouteWithAction","routeAction","_getRouteWithAction2","invocationArgs","singularize","makeAdminRedirectArgs","_ref$path","makeAdminV3RedirectArgs","_ref2$path","telephonyAdminKoUri","telephonyAdminUri","getTelephonyAdminTimeMachineUri","isLegacy","editUserRulesUi","listUserRulesUi","viewUserRulesUi","agentAdherenceDetailsModal","wemCoachingUi","wemCoachingUiAddExisting","wemLearningUi","iamAdminDeletePolicyModal","recognitionsUi","agentHomeContestDetailsUi","iamAdminDeleteSSOModal","iamAdminDeleteProviderCertificate","iamAdminDeleteOAuthClientModal","iamAdminChangeOAuthClientSecretModal","iamAdminDeleteRoleModal","iamAdminDivisionCreate","iamAdminDivisionDelete","iamAdminSaveRoleModal","iamAdminRestoreDefaultRoleModal","iamAdminPermissionConditionsModal","iamAdminRolesChangeMembershipModal","userRulesUi","iamAdminAuthorizedAppsActionModal","iamAdminAcknowledgeOAuthClientSecretSaveModal","iamAdminAuthAppsAuthorizeClientModal","iamAdminAuthAppsAddRolesModal","iamAdminRemoveExcludedAPIModal","iamAdminDisableLoginAcknowledgmentModal","iamAdminCreatePairModal","iamAdminDeletePairModal","iamAdminDisablePairModal","iamAdminPairWithGenesysModal","iamAdminDeleteTrustUserOrGroupModal","iamAdminDeleteMFADeviceModal","iamAdminSetDefaultMFADeviceModal","manageUserRulesUi","taskManagementParkedConversations","featureToggle","card","agoraUISearch","agoraUIPerson","agoraUICard","liveNow","outcomesMilestones","journeyShapingSegment","PEFActionMap","PEFContentOffer","PEFGlobalSettings","PEFAnalyticsVisitor","PEFAnalyticsActionMap","topicDefinitionsV2","programsDefinitions","staCategoryDefinitions","agentChecklistsUi","quality","staSettings","dictionaryFeedback","sentimentFeedback","reprocessInteractions","topicMinerUI","embeddedAnalyticsUi","analyticsUi","analyticsAdminUi","adminV3TelephonyDids","makeRedirectArgs","externalSourcesAdminUI","externalEventSchemasAdminUI","externalEventConfigurationsAdminUI","intentTaxonomyUI","directoryAdminGroups","directoryAdminProfileGroup","LocationsUI","customFieldsContacts","customFieldsExternalOrgs","adminV3WorkTeams","directoryAdminWorkTeams","messengerAdminConfigurationsV2","messengerAdminDeploymentsV2","rtsConfig","agentHome","operationsHub","performanceNotification","gamificationProfilesUi","gamificationSettingsUi","gamificationContestsUi","anomalyDetection","wfmSupervisor","wfmShrinkage","wfmHistoricalDataImport","wfmActivityPlanner","wfmMainForecast","wfmForecasts","wfmAdherenceAdjustments","wfmHistoricalAdherence","wfmCapacityPlanning","wfmWorkplans","wfmDecisionMetrics","wfmStaffingGroup","wfmTimeOff","wfmOpportunities","performanceExternalMetricDefinitions","scripterTemplatesUIOld","scripterUIOld","scripterTemplatesUI","scripterUI","messagingPlatformsUI","platformConfigs","supportedContentProfilesUi","threadingTimelineUi","smsNumberInventory","voiceNumberManagement","voiceNumberRedirection","voicePrefixBlocking","integrations","integrationsActions","messageRouting","oldAdminEmailDomains","adminEmailDomains","responseManagementUI","auditViewerUI","platformUsageUI","screenRecordingPlayback","authOrgsUI","partnersUI","agentUIPanelSettings","agentUIConversationCustomAttributes","agentUiQueueActivation","agentUIQueueList","agentUIQueueDetailsV2","pagePath","predictiveRoutingUiCustomKpis","predictiveRoutingUiRevenueKpis","agentUIUtilizationV2","agentUIWrapupCodesv2","agentUIAcdSkillsv2","agentAssistAdminUi","agentCopilotAdminUi","agenticVaUi","copilotConfigUi","guideBuilderUi","summaryWorkbench","refineResponse","logCaptureUI","operationalConsoleUI","multiOrgOverviewUI","orgPairingUI","replicationUI","userSwitchingUI","knowledgeWorkbenchArticleUI","knowledgeWorkbenchCategoryUI","knowledgeWorkbenchSourcesUI","knowledgeWorkbenchActivityUI","knowledgeConfigurationUI","knowledgeFabricContentUI","knowledgeOptimizerUI","architectComponentsUIOutcome","architectComponentsUIMilestone","architectComponentsUIDataTable","triggersUI","billingUI","contactsAndOrganizationsUI","iamAdminPeoplePermissions","iamAdminAccessManagement","iamAdminIdentity","iamUserSecurity","telephonyAdminOperatingSchedules","telephonyAdminCallRouting","telephonyAdminEmergencyGroups","telephonyAdminTopology","telephonyAdminMetrics","telephonyAdminMetricsKo","telephonyAdminTrunks","telephonyAdminSites","telephonyAdminEdgeGroups","telephonyAdminPremisesEdges","telephonyAdminCloudMedia","telephonyAdminPhoneManagement","telephonyAdminCertificateAuthorities","telephonyAdminExtensions","telephonyAdminDIDNumbers","telephonyAdminSettings","telephonyAdminCallerIdGroups","nerCustomEntitesUI","workAutomationWorkbins","workAutomationWorktypes","workAutomationSchemaBuilder","workAutomationWorkitems","workAutomationCaseplans","workAutomationCases","disconnectInteractions","socialListeningAdminUI","contentManagement","contentManagementAdmin","socialEscalationRulesUI","identityResolutionConfigUI","ruleBasedDecisionsRulesSchemas","ruleBasedDecisionsDecisionTables","usageUI","usersUi","audioHookMonitors","after","AnalyticsService","initializerFactory","ApplicationService","handlerMap","my-interactions-handler","MyInteractionsApiHandler","external-contacts-handler","ExternalContactsHandler","resource-center-handler","ResourceCenterHandler","directory-nav-handler","DirectoryNavHandler","toast-handler","ToastHandler","attention-count-handler","AttentionCountHandler","lifecycle-handler","LifecycleHandler","show-interaction-details-handler","ShowInteractionDetailsHandler","handlerKeys","currName","currFullName","instantiate","before","Route","AuthenticatedAuthorizedRouteMixin","_netUtils$getEnvDetai2","currentDomainName","setLocalhostApiDomain","_e","configureLocalhostAuthDomain","oauthProps","_netUtils$getEnvDetai","loadOauthProps","ChatFrameService","singleton","ChatService","ClockService","StyleNamespacingExtras","ContainerDebugAdapter","WebrtcSdkService","setupContainer","rootURL","baseURL","Configuration","load","Adaptive","Cookie","LocalStorage","setupSession","setupSessionRestoration","exportApplicationGlobal","theGlobal","globalName","classify","_register","PersonFieldConfig","GroupFieldConfig","OrgFieldConfig","ExternalContactFieldConfig","IntegrationsPresenceService","requirejs","entryName","providerName","singeleton","MainInitializer","Orgspan","registerDeprecationHandler","Provider","ZoomProvider","PureCloudProvider","TeamsProvider","MonitoringService","PhoneService","PigeonService","PreferencesService","emberAutoImportDynamic","registerSparkComponents","ScreenMonitorNotificationsService","deferReadiness","authUri","instanceProperties","authUriResults","apiUriResults","apiUri","purecloudV2BaseUri","cobrowseUriResults","cobrowseUri","purecloudUriResults","purecloudUri","purecloudAppsUri","streamingServiceUriResults","streamingServiceUri","advanceReadiness","SessionService","SidebarService","VideoConferenceDetailsService","WebrtcService","WebrtcSettings","agentScheduleService","checkAdherenceState","initializeScheduleUpdateListener","applicationController","debugBackburner","debugRsvp","ApplicationInstance","EntityContactGroupComponent","EntityImageDefaults","EntityHoverCard","EntityImageComponent","EntityLocationComponent","parentView","LinkComponent","routeTitle","updateRouteTitle","appRoute","forURL","screenRecordingService","HostedContext","parseRuntimeCustom","isLink","hasPhoneConversation","idlePersistent","pigeonService","reconnect","urlPrefix","initializeEmojiRendering","initializeMarkdownRendering","initializeFavicon","apiHandlers","apiHandlerKeys","currHandlerKey","_logged","nrOnError","hasQueryParam","TARGET_PRESENCE","BUSY","MEETING","OFFLINE","launchVideoImage","getTargetPresence","disabledMessage","gcPresence","chatUserPresence","loadData","showRunErrorNotification","haveAccess","canRunAction","allowMultipleMeetings","getJid","originalAction","_action","_args","haveEmbeddedClientAccess","PROVIDER_ID","openChatRoomWithVideo","showingVideoChanged","meetingUrl","createMeetingAndUpdateData","createTeamsMeeting","loadChatRoom","setTextareaStatus","agenda","scheduled","showErrorToast","_yield$_this4$phoneIn","joinUrl","teamsData","createInstantMeeting","meetingId","sendIntegrationVideoMessage","activeRoom","queryParamsToObject","keyValue","_keyValue","buildAuthUrl","authConfig","cancelTimer","setInterval","removeChild","clearInterval","createZoomMeeting","zoomData","Mixin","conversationModel","selectedWrapupCode","wrapupNotSaved","oldWrapupCode","skipAfterCallWork","isAfterCallWorkTimerExpired","isWrapupCodeSet","isNotesSet","activeCallWorkCompleted","activeCallWorkNeeded","canUseCommunicationACW","isWrapupPromptAgentRequested","isAfterCallWorkCompleted","isCommunicationAfterCallWorkCompleted","communicationMedia","communicationObj","isCommunicationAfterCallWorkRequested","isAfterCallWorkMandatory","wrapupPrompt","needsCallWrapUp","isNonDiscretionaryCompletion","isAfterCallWorkForcedTimeout","isAfterCallWorkTimeout","hasMissedTimer","isParked","interactionState","PARKED","DISCONNECTED","ALERTING","DIALING","CONTACTING","TERMINATED","isTransmitting","TRANSMITTING","lastInteractionTime","mostRecentMessage","startAlertingTime","alertingTimeRemaining","timeInQueue","timeInQueueDuration","acwStartTimer","acwTimeoutTimer","MACHINE_PARTICIPANTS","CUSTOMER_PARTICIPANTS","MEDIA_TYPES","isDigitalConsultEnabled","isCustomerParticipant","isMachineParticipant","isAgentParticipant","isCurrentUserOrMachineParticipant","hostParticipant","customerParticipants","agentParticipants","otherConnectedParticipants","isMonitored","isCoached","isBarged","isBargeParticipant","isScreenMonitor","allHumanConnectedParticipants","allConferenceParticipants","connectingQueue","trueCustomerParticipant","queueToQueueParticipant","resolveQueueToQueueVoiceParticipantForCustomer","omitConsultingForDigital","participantCaller","isCurrentUser","isExternalCustomer","isInternalCustomer","isBarge","nextConnectedParticipant","customerParticipant","getTrueCustomerIfMultipleCustomersExist","participantForCurrentAgent","getFirstStuckParticipant","currentUserParticipants","stuckParticipant","hasActivePrimary","_doesParticipantHaveActivePrimaryMedia","hasActiveSessionShare","_doesParticipantHaveActiveSessionShare","lastAlertingParticipant","lastNonDisconnectedParticipant","lastCurrentUserNeedingWrapup","wrapup","participantsForACD","participantForQueue","dialerParticipant","activeTransfer","activeAttendedTransfer","PROVIDER_MEDIATYPE","aggregateMedia","screenShares","mediaObj","allMedia","getMediaObject","mediaArray","mediaWithlatestConnectedTime","maxBy","unix","mediaWithlatestDisconnectedTime","maxConnectedTime","maxDisconnectedTime","activeMedia","sessionShareCode","isSessionSharing","isRequestingEndSessionShare","sessionShareDisconnectTimer","sessionShareExplicitlyInitiated","canScreenShareOnCall","canScreenShareOnChat","canCobrowseOnCall","canCobrowseOnChat","sessionShareState","customerShareState","hasSessionShareCode","isRequestingSessionShare","isSessionShareConnected","isSessionShareDisconnected","isRequestingNewSessionShare","isCustomerInSessionShare","isWaitingForAgentToConnect","isWaitingForCustomerToConnect","hasCustomerJoinedSessionShareRoom","hasAgentJoinedSessionShareRoom","sessionShareRoomJid","isRoomJid","mostRecentAgentSessionShare","mediaObject","mostRecentCustomerSessionShare","sessionShareType","isScreenShare","isVideoShare","mediaTypeIsScreenShare","mediaTypeIsCobrowse","mediaTypeIsVideo","hasScreenSharePermissionError","hasCobrowsePermissionError","hasVideoPermissionError","hasShareError","sessionShareConnectedTime","sessionShareDuration","activeMediaRequests","mediaRequestUri","_beforeModel","authenticationRoute","beforeModel","transition","_setupPromise","_waitForInFlightAuthentication","bootstrapPromise","BatchDataRequestsMixin","batchDataRequests","getUser","refreshUser","getChatUser","getGroup","initRoomCaching","objectId","getEntityObjectId","isPersonJid","passedInJidIsPerson","isSupervisorJid","closeActiveRoom","personRoom","ChatRoom","rooms","setupRoomContextV2","setupRoomContext","roomMuted","addChatTargetAsParticipant","isGroupJid","loadGroup","addParticipantToRoom","loadRoomSubject","isOneToOneRoom","getStreamingRoomInfo","updateRoomSubject","addRoomToCache","participantJids","cachedParticipants","cachedParticipant","cachedParticipantJid","removeParticipantFromRoom","MD_SPECIAL_CHAR_REG_EXP","roster","textarea","publicMappings","afk","collapseMedia","dnd","expandMedia","sendGiphyGif","openLastRoom","leaveCurrentRoom","muteRoom","oneToOne","popoutChatRoom","unmuteRoom","sendWhisper","startStopCobrowse","searchCommand","shortcutMappings","serviceCommands","mappings","mapping","inlineReplacement","cmd1","cmd2","val1","val2","filteredMappings","videoEnabled","docEnabled","giphyEnabled","_errorHandler","addChatCommand","checkForCommand","acdToggle","checkForShortcutCommand","exclusiveShortcut","inlineShortcuts","currMapping","firstIndex","currShortcut","matchResult","arg","leaveRooms","closeRoomAndClearCounts","rosters","adhocs","shareDoc","docName","sourceList","documentsList","shareData","sharedEntityType","sharedEntity","memberType","member","messageInput","sharingDoc","setTextareaValue","shareDocument","sharingUri","historyStack","lastJid","changeActiveRoom","joinCallImmediately","startVideoMuted","startAudioMuted","rollDice","cmdOptions","_match","_match2","tail","roll","dice","isMessageEdit","editMessage","_message$split","_message$split2","replaceText","replaceWith","prevMessage","corrects","disableMessagePendingForUploadFlag","_toggleAllMedia","setSessionUsersPresence","presenceString","getPresence","setOrganizationPresenceId","showLocation","zoom","lat","coords","latitude","lon","longitude","imgUrl","showError","showWeather","units","language","currently","precipProbability","mentionList","sendMessageToRoom","messageFailedToSend","stopCobrowse","startCobrowse","viewerUrl","getViewerUrl","onSessionStateChange","sessionState","newValue","isEnded","generateGuid","imageRegex","timeStampRegex","audioRegex","giphyRegex","imgurRegex","youtubeRegex","vimeoRegex","ghGistRegex","ghRepoRegex","twitterRegex","googleSlidesRegex","soundcloudRegex","getImageShortName","pattern","parseTimeStamp","timeStamp","mediaItems","giphies","audios","gists","repos","githubRepos","tweets","googleSlides","soundcloud","getLinks","gifv","webm","mp4","identifier","youtubeLinks","videoUrl","vimeoLinks","modelData","GithubItemModel","gist","repo","tweetId","tweetInfo","tweet","acdChatUser","isYou","compareJids","isAcdChatUser","chatUserId","acdChatUserId","isLastMessage","messageTime","displayDateRelativeToToday","messageDisplay","correction","isCorrection","ChatEvents","initialDataLoaded","historyDirty","handleHiddenRooms","hiddenRooms","_delayTime","StreamingService","streamingEvent","_firstConnectionEventTask","_loadProfileAfterRealtime","activeChat","isMeetingJid","isScreenRecordingJid","processHiddenRooms","checkActiveRoomAgainstHistory","stanza","isMention","_handleXMPPReferenceMention","getTargetRoomJid","isRoomVisible","focusRoom","removeRoomFromClosed","addRoomToDashboard","processNewChatMessage","messageModel","addMessage","savePersonalChats","savePersonalMentions","saveRoomChats","incrementUnreadGroupMessage","sendAcdNotification","subjectChange","roomModel","chatState","addResponder","removeResponder","personJid","referenceChildren","_handleMentionEvent","loadRoomAndUser","sendMentionNotification","inactiveRooms","_debounceHiddenRoomTask","logHiddenRoomCount","VIDEO_NOTIFICATION_WIDGET_TYPES","shouldShowMentionNotification","toastMessage","getNotificationVolume","getNotificationOutputDeviceId","shouldShowNotification","messageBody","showPopup","getNotificationTitle","widgetType","isBusyUser","isDuplicate","duplicate","targetRoomIsMuted","roomIsVisible","messageAlreadySeen","fromLoggedInUser","windowFocused","groupNotificationsEnabled","coveredByMessageNotification","chatUser","hasSystemMessagesEnabled","getRawDisplaySubject","messageDelayDefault","messageDelay","maxDelay","_splitOverSizedMessage","messageQueue","_convertSplitMessagesToWidgets","contents","sendSplitMessageQueue","_delayedMessageSender","unsentMessageQueue","_addFailedMessagesToRoom","splitWidget","_manuallyCreateStanzaForFailedMessage","ChatMessage","oid","widget","sendError","checkForMentions","setMessageReadState","childName","childPayload","findMessageById","messageCache","pendingMessage","pending","failedMessage","splitMessageData","splitMessageParent","splitMessageCache","oneToOneRoom","presenceSubscriptionCounter","chatField","chatStatus","hasChatStatus","hasMedia","listener","hasMediaInActiveChatRoom","callsUri","communicationUri","createCommunicationUri","communicationsUri","mediaId","participantUri","communicationsByTypeUri","consultUri","cancelOrConfineOrConference","endUrlPath","disconnectMediaTypeUri","getConversationUri","mergeToConferenceUri","monitorUri","takeoverUri","participantDetailsUri","participantWrapupUri","sessionShareCodeUri","expireSessionShareCodeUri","securityKey","participantWrapupCodesUri","participantCommunicationWrapupUri","replaceUri","getQueryStr","tagsUri","wrapUpUri","wrapUpCodesUri","messagesUri","sendChatMessageUri","sendTypingUri","draftUri","smsUri","smsHistoryUri","smsMessageDetailUri","smsMessageBatchUri","sendSMSMessageUri","requestACWUri","getDeploymentConfigUri","getSupportedContent","getIntegrationConfigUri","integrationId","getConversationSummaryFeedbackUri","summaryId","setupInternalMessageUri","arrayParameterCollection","forIn","defaultLogLevel","logRequest","correlation","logLevel","captureRequest","isError","statusCode","resolveRequest","isSuccessResponse","activeChats","CONVERSATION_STATES","userChats","currentChat","chatProvider","isInternalChatProvider","lastChatMessageTime","lastChatMessageWasCustomer","emailMessages","emailDraft","_shouldReloadMessages","activeEmails","allEmails","userEmails","currentEmail","emailProvider","isInternalEmailProvider","lastEmailTime","minimumLimit","maximumLimit","minItemsLimit","maxItemsLimit","minLengthLimit","maxLengthLimit","_isWithinLimit","valueKey","minLimitKey","maxLimitKey","minLimit","maxLimit","isMinimumWithinLimit","volatile","isMaximumWithinLimit","isMinItemsWithinLimit","isMaxItemsWithinLimit","isMinLengthWithinLimit","isMaxLengthWithinLimit","BROWSER_VERSION","UA","IS_CHROME","chrome","webstore","IS_FIREFOX","InstallTrigger","arrayComparerByDeviceId","otherArray","itemInOtherArray","diffListsByDeviceId","existingList","newList","itemsRemoved","itemsAdded","fullHd","canListDevices","hasCameraPermission","cameraList","hasMicPermission","microphoneList","hasMicrophone","hasEnumeratedDevices","callCapable","PC","gUM","supportWebAudio","RTCRtpTransceiver","webrtcAudioCallIssueKey","webrtcAudioCallIssueAriaKey","videoCallCapable","videoEl","supportVp8","canPlayType","outputDeviceList","resolutionList","canShareScreen","enumerationTimer","enumerateResolutions","deviceChangeHandler","_deviceChangeHandler","updateDefaultDevices","extended","resolutions","presetId","hd","triggerListUpdatedEvent","cameraCount","microphoneCount","outputDeviceCount","defaultDevice","addCamera","hasBrowserLabel","existingDeviceInList","addMicrophone","mic","deviceInfo","hasLabel","addOutputDevice","camerasDiff","microphonesDiff","outputDevicesDiff","paused","messageEvent","messageOptions","triggerMessageAction","excludedFieldSections","lastUploadedImage","editingPictures","cancelEditProfilePicture","editProfilePicture","cancelUpload","cancelEditPictures","setInitialFieldSections","fieldSections","excludedSections","readableSections","getReadableSections","WebrtcActionUtils","videoProviders","getProvidersForUser","isPresence","apiValue","presenceMapping","presenceService","acdDivisionPresenceProfileToggle","primaryPresence","presenceList","currentPresenceSource","integrationPresence","existingPresence","pres","presSource","existingPresenceDate","activitiesPresenceDate","isExistingPresenceLatest","isGCOffline","presenceDefinition","presenceModel","presences","outOfBandPresence","outOfBandPresences","findPresence","primaryPresenceSource","integrationLabel","secondaryPresence","fallbackLocale","languageLabels","formattedLocale","primaryStatusMessage","cityExists","regionExists","countryExists","isOffline","isAway","isBusy","isOfflineOrBusy","activityPresenceClass","profilePictureFieldKey","imageMappings","informal","missingFieldsCache","EntityMixin","_currentSection","_missingFieldsCache","pictureKey","fieldValue","profilePictureSizes","uploadedImages","stateString","_self","_missingFields","recordPropertyChange","changedSinceSave","_changedSinceSave","missingFields","getReferencedField","fieldId","referencedField","referencedLookup","fieldArray","reference","isFieldValueEmpty","removeFieldValue","currentFieldValue","object","currentState","stateName","adapterDidCommit","onSaveSuccess","onSaveError","_internalModal","internal","_internalModel","publicApiError","currentVersion","saveSection","overwrite","recordChange","currentField","fieldDef","tempId","getPermissableSections","getWriteableSections","getReadableFieldsForSection","getWriteableFieldsForSection","deleteField","del","linkUploadedImage","crop","imageInfo","uploadType","bbox","x2","y2","EvaluationsMixin","evaluationsAjax","getEvaluations","agentEvaluations","evaluatorEvaluations","assigneeEvaluations","agentId","evaluatorUri","agentFinishedUri","agentInReviewUri","assigneeUri","evaluatorRequest","requestAgentFinished","requestAgentInReview","requestAssignee","_ref$entities","changedDate","calibration","assignedDate","dateAssigneeChanged","EvaluationModel","_ref2$entities","releaseDate","_ref3$entities","_ref4$entities","evaluationIdSet","resultData","totalResult","queryResult","evaluationIsAdminContext","externalContactProfiles","hasMultipleExternalContactMatches","hasRelateAccess","isIncomingFromExternalContacts","isConnectedWithExternalContact","hasExternalContactProfiles","hasOneExternalContactProfile","_nameForInheritor","componentClassName","externalContactFullName","interactionEnded","FaxesMixin","getFaxes","FaxModel","readFax","changeFaxReadState","contentUri","contentLocationUri","markFaxesRead","markFaxesUnread","renameFax","deleteFaxes","deleteFax","downloadFax","didFlag","flagOperationInProcess","flaggedSelves","myParticipants","myFlaggedParticipants","flaggedReason","allowFlagChange","elapsedMs","flagCallHistoryInteraction","currentJobs","finishedJobs","_currentJobs","_finishedJobs","addJob","job","getJobData","jobId","retryJobId","handleJob","LOG_LEVELS","bindLogMethods","_bindEmberLogFunctions","_stashLogger","_Ember$Logger","bufferLog","_debugContainerKey","errorState","cachedTotal","extraParams","hasNextPage","loadPage","prevPage","hasPrevPage","ensureCorrectProperties","totalPages","haveContent","letterUpdate","letter","requirements","validationKey","maxAccountInactivity","minPasswordUpper","minPasswordLower","minPasswordDigits","minPasswordLetters","minPasswordSpecials","minPasswordAge","passwordExpirationTime","age","passwordLength","passwordRequirements","minChar","onKeyUp","weak","verdictLevel","verdictText","score","activated","wordNotEmail","wordLength","wordSimilarToUsername","wordSequences","wordTwoCharacterClasses","wordRepetitions","wordLowercase","wordUppercase","wordOneNumber","wordThreeNumbers","wordOneSpecialChar","wordTwoSpecialChar","wordUpperLowerCombo","wordLetterNumberCombo","wordLetterNumberCharCombo","intlAuthRule","intlAuthVerdict","verdict","ui","showErrors","showPopover","showProgressBar","showVerdictsInsideProgressBar","viewports","progress","scores","colors","verdicts","errorMessages","spanError","$password","pwstrength","word","removeClass","isActiveCallACD","isOutsideCall","myself","cleanupActiveCall","attemptingToCall","shouldPromptForMerge","callToMergeInto","mergeData","pendingCallNumber","openAgenWorkspaceRedirectModal","redirectToAgentWorkspace","determinePendingCallNumber","_participant","PURE_5487_require_queueFT","useRecordersState","deviceMuteEvent","deviceHoldEvent","holdRequested","deviceCallRejectedEvent","deviceCallAnsweredEvent","incomingCall","enableHeadsets","changeHeadsetSource","headsetSource","_handleValidationError","validationError","webrtcPhoneWithIssues","_callRequiresQueue","isGCUser","_validateCall","associatedConversationId","noStation","carrierPigeonConnected","_isEmergencyNumber","_throttledHoldOtherConversations","formatSipAddress","callFromQueueId","startSoftphoneSession","conversationsMadeByClient","updateActiveConversationEntry","outgoingCall","callArgs","conferences","conversationIds","toVoicemail","_throttledHandlePhoneStatusChange","_args9","convAPIVersion","participantType","myselfId","participantEntity","isQueue","_handleCallTransferred","placedConversation","otherPartyId","initiateTransfer","addressee","generateConversationsUrl","_throttledAnsweredSoundIncomingConversationRing","_answeredSoundIncomingConversationRing","_throttledAnswerWebrtc","_answerWebrtc","_throttledAnswer","_throttledAnswerSoftphoneConversation","acceptPendingSession","answerSoftphoneConversation","showNoStationSelected","_findPendingSessionsByConversationId","stationHasPersistentConnection","validateActionSucceeded","checkForNonACD","_throttledMute","setMute","skipHoldAll","_held","otherConversations","connectedConversations","otherConversation","isHoldable","_throttledHeld","setHold","_throttledRecord","_record","_makeFlagChange","_throttledEndCall","_throttledEndCallForAll","endCallById","_callee16","_context16","_endCallForAll","_callee17","_context17","conversationWithError","userCallSessionsWithErrors","removeConversationFromConversations","_endWebrtcCall","_callee18","_context18","notAfter","_throttledEndWebrtcCall","_callee19","_context19","generateConversationUrl","callbackConnected","generateCommunicationUrl","participantCallState","adhocState","responseText","fetchCallForwarding","getCallForwarding","hasPhoneNumber","_contactObservers","ringing","activeAcdCalls","conv","callState","callIsAlreadyConnnected","webrtcSessions","atLeastOneWebrtcConversation","isDefinedAndLengthGreaterThan","dialingOrContactingOrAlertingConversationsToProceed","thisClientMadeTheCall","waitingForSession","recentTransfers","thisBrowserIsTheOneToAnswerFrom","thisCallIsConference","_handleActiveConversationsUpdates","_throttledHandleActiveConversations","handleActiveConversationsUpdates","connectedNonAcdCalls","dialingOrIncomingConversation","newActiveCall","activeCallOngoing","dialingOutboundConversations","hasOutboundConversation","activeCallErrors","lastConversationError","hasIncomingConversations","_setHasIncomingConversations","hasActiveNonAcdCalls","incomingNonAcdConversations","acdCall","mostRecentlyConnectedConferenceCalls","isConnectedCall","myTime","onlyConnectedConversations","recentDisconnectedAgentCalls","recentDisconnectedNonAcdCalls","_shouldRemoveNonAcdConversation","conversationMarker","conversationsToRemove","callErrorToRemove","removeObjects","conversationModelTemp","interactionModelTemp","removeContactChangeListenersForInteraction","acdCallService","activeCalls","customerIntentInteraction","removeCustomerIntentListenerForInteraction","conferenceJid","leaveChatRoom","_throttledRemoveDisconnectedConversations","_removeDisconnectedConversations","participantOnUpdatedConversation","conversationHasErrors","conversationMadeByClient","conversationAcceptedOnClient","conversationWasMadeOrAcceptedOnClient","participantsForUser","updatedParticipantCall","getParticipantCall","conversationWasTerminatedNotDisconnected","disconnectedCalls","timeOutToRemove","thereArePendingSessions","_debouncedRemoveConversationFromConversations","debounceTime","thereIsAConnectedConversation","addOrGetConversation","updateConversationArray","conversationDetails","conversationExists","setInteractionModelMetadata","isUpdateValid","monitoredConversationsForErrors","nonAcdCalls","acdCalls","usersCallSessions","callSessions","participantIsUserAgent","participantIsCurrentUser","userParticipant","callsWithErrors","disconnectReasons","thereAreDisconnectReasons","re","disconnectErrors","disconnectTypeIsError","ERROR_WHITE_LIST","_onPigeonConnect","stationEvent","_stationEvent","_updateStationEvent","registerCPTopics","registeredTopics","conversationData","currentCallState","participantOnExistingConversation","participantCall","participantOnCall","participantIsNotVoicemail","isActiveOnCall","newCallState","_logConversationDetails","_updateModelForConsult","IGNORED_ERRORS","useMaxInboundVoiceCalls","displayIncomingNotification","handleParticipantCallError","endMoment","isRecent","hasThrownError","_testIsStationWebrtc","_throttledShowSipError","showSipError","messageText","phrase","showPersistentConnectionStateNotification","translateServerErrors","messageWithParams","fetchStation","newCode","webrtcDisconnectKey","_getWebrtcDisconnectTranslationKey","isAcdCall","updateStationEventTimeout","defaultStation","associatedStationNotDefault","defaultStationNamePromise","selectedStation","guidFromUri","chooseDefault","doLoginAssociationLogic","isFreeSeatOrg","_loginAssociationFreeSeat","_loginAssociation","doLogoutAssociationLogic","isAssociatedToDefault","associatedStation","lastAssociatedStation","lastAssociatedUser","defaultStationUser","userStationSettings","eventBody","_debouncedUpdateStationEvent","_handleUpdateStation","newStation","newStationId","currentStationIsNewStation","stationUri","addIndicatorForPromise","view","favicon","getAllBadgeCounts","currentPageNumber","isRetry","badgeCount","handleBadgeCountUpdate","clearRoomNotificationCounts","updateBadges","userJid","isSupervisorRoom","unseen","unseenCount","mentions","mentionsCount","setUnreadMessageCount","setFaviconBubbleText","presenceToRadixMapping","away","idle","offline","on_queue","out_of_office","radixMapping","mapUserToSortable","mapRoomToSortable","radix","SortChatUsersMixin","sortChatUsers","usersList","sortOneToOneRooms","getScrollParent","comp","css","enableViewport","enteredViewport","boundingClientRect","windowHeight","windowWidth","right","exitedViewport","_teardown","_setup","_bindEvents","_updateBoundingClientRect","scrollParent","scrollParentRef","$scrollParent","scrollHandler","_updateWindowSize","_scrollHandler","videoTooltipKey","haveNonPurecloudMediaProvider","_fixTooltips","videoTooltipTitleSr","numberOfParticipants","oneToOneChat","webrtcTarget","videoMediaProviders","hawkIsAvailable","realtimeIsAvailable","videoButtonEnabled","statReports","trackStatsLastStart","audioBitrateZero","audioBitrateIndicatesMute","wasMutedDuringLocalCheck","talkingWhileMuted","audioInputLevel","lastTrackStatsStart","lastTrackStatsEnd","hardwareAudioMute","wasMutedDuringLastCheck","_logHardwareMute","_sendLocalPerspective","perspective","sendDirectlyToAll","_createNewPerspective","trackStatsByTrackId","_getLocalPerspectiveOfParticipant","_checkLocalAudio","isScreenRecording","localAudio","bitrate","audioMuted","isPastMaxAudioInputLevelThreshold","isV2","showZeroAudioBitrateNotification","_checkTracks","remoteTracks","participantsByVideoTrack","screenTracks","statsMap","participantsHavePositiveBitrate","trackInfo","unknown","trackInfos","hasBitRate","isOneToOne","logInfo","_checkBandwidthForInteraction","_addLocalTrackStats","hasBandwidthIssue","intervalLoss","rtt","hasNotifiedBandwidthIssue","showBandwidthNotification","participantTrackInfos","localPerspective","mergeStatsPerspective","_sessionInterruptedTimeout","_handleConnectivityError","isSoftphone","ENGAGE_SCREEN_RECORDING","connectivityError","_sendParticipantInfo","msids","endpointId","getEndpointId","_onSessionConnectionTimeout","isConnectRetry","isCollaborate","retrySessionThatFailedToConnect","_removeParticipant","usePcConversationModelParticipants","_updateMajor","_connectionTimeout","_endOfCandidates","candidateBuffer","_candidateBuffer","candidates","_sessionInterrupted","interrupted","wasInterrupted","_setupSessionEvents","_getSessionPeer","creator","peer","_handleChannelMessage","useTrackBasedActions","handleRemoteTrackAdded","_handleSessionConnectionStateChange","_handlePeerStreamAdded","_handlePeerStreamRemoved","_handleMute","_handleUnmute","_handleTerminated","_handleHold","_handleResumed","startConnectionTimeout","connectionTimeout","collibriPayload","msgPayload","dominantSpeakerEndpoint","_handleDominantSpeakerChange","channelMessage","channelTopic","colibriClass","endpoints","lastNEndpoints","relayCandidatesTimeout","gatherStatsForSession","setOnChannel","checkChannelState","lastNChannel","onopen","interruptedTimeout","isOneToOneCollaborate","lostConnectionError","getNativePeerConnection","outgoingSessionRequests","_sendMuteStates","_removeOutgoingSessionRequestById","checkForListeners","handleRemoteStreamAdded","handleRemoteStreamRemoved","_removeSession","removeMappedSessionConversation","notifySessionEnded","ending","engageScreenShareError","alternativeSession","migrateVideoConversationToConference","bridgeDownError","hasPendingSessionRequest","selectedResolution","selectedNotificationDevice","sessionConversationMap","allowScreenRecordingInBrowser","checkConversationStates","requestReconnectCallback","conversationCreatePromise","hasShownHawkWarning","conversationsWithConversationId","softphoneConversations","hasActiveOrPendingSessions","videoConversationsMadeByClient","phoneConversations","shouldUseHawkByJid","shouldUseHawkByConversationType","shouldUseApiByJid","isSoftphoneJid","_defaultCallTimeoutLength","_softphoneCallTimeoutLength","attachEvents","_handleTalkerChangedEvent","invalidatingAuthSession","cbFn","blocker","isStationWebrtc","mapSessionToConversation","_checkRequestReconnect","_logConnectionDetails","streamingServiceConnected","_jingleConversationDance","stationConversation","_autoConferenceLater","_bindAndCreatePendingSession","fromJid","isIncoming","incomingConferenceCall","phoneConversation","rehandlebindAndCreate","existingPendingSession","createPendingSession","timeoutTask","requestForIncoming","cancelRtcSession","_noAnswer","showNoAnswerNotification","_notResponding","_getSimpleJid","_callTimeout","timeoutPendingSession","timeoutLength","_lastInterval","_generateInterval","newInterval","checkAutoConferenceLater","_hangupSound","hangupSound","_hangupSoundTimer","_answerSoftphoneTimer","_createConversation","WebrtcConversation","_getOrCreateConversation","speakers","updateTrackOwners","updateSpeakers","_startVideoViaApi","roomId","videoMuted","attachConversationId","getConversationTypeByJid","ENGAGE_SCREENSHARE","COLLABORATE_VIDEO","OfferToReceiveAudio","OfferToReceiveVideo","peerConstraints","requestRtcSession","initiateOpts","mediaPurpose","useApi","initiateRtcSession","attach","cancelPendingRtcSessions","getOrCreateConversation","oldPromise","executeFn","newPromise","_ref6$inferConversati","inferConversationType","searchConversationType","interruptions","activeSessions","ended","pcConversation","disconnects","peerID","endSessionsForRoom","joinConversation","addLocalParticipant","acceptSession","pendingSessionRequest","fn","endRtcSessions","denodeify","_autoAnswer","conversationsIdsToAutoAnswer","allConversationsToAutoAnswer","conversationProposesReceived","conversationsToAutoAnswer","sessionToAccept","accepted","answerVideoConversation","_handleIncomingWebrtcSoftphoneRequest","sessionInfo","getMostRecentlyConnectedConferenceCall","mostRecentlyConnectedConferenceCall","conversationAlreadySwapped","conferenceCallId","inboundAcdCallsToAutoAnswer","incomingCallbackCallsToAutoAnswer","videoConversationsToAutoAnswer","bargeMonitorCoachConversationsToAutoAnswer","pendingConversation","bargeMonitorCoachSession","manuallyAnsweredSoftphoneConversationsWithLatePropose","logIt","acceptRtcSession","screenRecordingConversations","_startScreenRecordingTask","screenRecordingConversation","_conversationId","participantJid","restartScreenTrackOnFailure","screenId","shouldRestartTrack","getVideoTrackForScreenId","newTrack","streamRef","_debugScreenRecordingInBrowser","_handleIncomingVideoSessionRequest","existingSession","sendVideoInvitation","answerVideoByInvitation","sendEventToDesktop","WEBRTC_CONNECTION_ANSWERED","incomingInvitations","WEBRTC_CONNECTION_DECLINED","rejectRtcSession","sendVideoNotificationWidget","handleVideoInvitation","invitations","cancelInvitationBySession","startVideoConversation","syncPendingRoomWithStreamingService","prepareVideoCall","newJid","showMigratingNotification","joinImmediately","_extractProperties","recordingTimeout","recordingDurationTimeout","debugTimeout","hideAudioTracks","hideVideoTracks","hasParticipants","debugWebrtc","_cleanup","webrtcDebugger","browserInfo","browserInfoPrefix","_buildInfos","_cleanupDebugInfo","debugInfo","sessionInfos","streamInfos","_addColorToParticipants","streamInfo","_associateStreamWithParticipant","_stringifyMedia","dInfo","sessions","streamString","trackOwners","dominantTracks","defaultCamera","defaultMicrophone","_recordSnapshots","_handleRecording","hex","getConversationDebugInfo","streamInfosToRemove","_addUpdateStreamInfos","_connectionState","_checkRemoteTracks","existingStreamInfosForSession","existingToRemove","hasVideo","hasAudio","_buildTrackInfo","bytesReceived","_processStats","googTrackId","received","shouldIgnoreEvent","disableSoftphone","onV2Connected","refreshIceServers","mediaChange","mediaData","existingMedia","mediaPresence","hasMsid","hasExistingMsid","realtimeRequestReconnect","requestReconnect","hawkRequestReconnect","requestWebrtcDump","upgradeMediaError","realtimeOnCancel","hawkOnCancel","handleMissedCall","realtimeOnHandled","onHandled","hawkOnHandled","_realtimeOnPropose","_onPropose","_hawkOnPropose","isRequestFromGjoll","tmpConversationId","canDoScreenRecording","hawkIncomingSession","handleIncomingSession","rtcSessionAccepted","realtimeIncomingSession","screenMetaData","acceptImmediately","getScreenRecordingMedia","metas","createMediaError","addSession","screenRecordingViaApi","_trackId","metaData","realtimeOutgoingRtcSession","outgoingRtcSession","hawkOutgoingRtcSession","bareJid","outgoingRtcSessionRejected","realtimeOutgoingRtcSessionProceed","targetJid","outgoingRtcSessionProceed","hawkOutgoingRtcSessionProceed","useHawk","peerConnectionConstraints","createRtcSession","HawkRtcSessionError","rtcSessionError","hawkTraceRtcSession","traceRtcSession","messageWithoutSession","knownSessions","hawkOnIceServers","probeNetwork","videoJoin","videoInfo","videoLeave","cancelInvitation","waitingForMedia","mediaRequestAnswered","localVideoNotReceived","orphanedScreenStreams","pendingCreateMediaPromise","micAutoGain","updateMicPref","initializeRetryDelay","_this$intl","_isInitialized","_createEmberDevice","defaultNotificationDevice","enumerateDevicesWhenAuthed","ensureAudioPermissions","ensureInitialized","micPrefs","advancedMicSettings","endOrphanedScreenStreams","_initializePromise","disableProactiveDevicePermissions","initializeLater","resolutionPromise","savedResolutionPresetId","savedResolution","micPreferencesPromise","_micPrefsFromWebrtcSettings","micSettings","resetDefaultDevices","existingPendingPromise","newPendingPromise","stopStream","ensureFullMediaPermissions","devicesActuallyChanged","getHostedScreenMedia","streamPromise","getShareableScreens","screens","multiMonitorScreenRecording","screen","isPrimary","getMediaStream","shareid","createTrackMetadata","screenInfo","platform","originX","originY","resolutionX","resolutionY","main","isMain","attemptsRemaining","defaultResolution","requestAudio","isChromeOrChromium","googNoiseReduction","googAudioMirroring","autoGainControl","googDucking","googHighpassFilter","getMediaErrorMessage","retries","detectSpeakingEvents","harkOptions","waitingForMediaTimeout","translationCode","showScreenShareError","initializeAfterEnumeration","_handleIncomingConversationsUpdates","invitationsWithSound","isRinging","getRingerOutputDeviceId","_handleStartingVideo","existingInvitation","getInvitationMessage","createInvitation","existingForRoom","isActiveRoom","WEBRTC_CONNECTION_INCOMING","translateCandidatePairDetails","candidateType","oCandidatePairDetails","turnServerAddress","candidatePairDetails","ipAddress","remote","old","_onStats","webrtcMediaDscp","portNumber","WEBRTC_CONNECTION_STARTED","_onTrace","flattenWebrtcObject","webrtcTraces","flatData","webrtcEventName","localAudioMuted","localVideoMuted","audioTrack","videoTrack","remoteAudioBitrateAverage","remoteVideoBitrateAverage","remoteAudioLossAverage","remoteVideoLossAverage","remoteAudioLostTotal","remoteVideoLostTotal","remoteAudioTracks","remoteVideoTracks","remoteAudioTrackCount","remoteVideoTrackCount","loss","lost","lastEvent","lastEventTime","lastEventValue","lastEventKind","_logConnectionEnded","conversationDuration","peerJid","customPayload","PROTOCOL_FIELD_NAME","OUTBOUND_MSG_EVENT_TYPE_FIELD_NAME","currMetadataFieldName","APPS_API_PROTOCOL","messagePayload","requireProtocol","API_ACTION_FIELD_NAME","actionDetails","PROTOCOL_AGENT_FIELD_NAME","PROTOCOL_AGENT_VERSION_FIELD_NAME","fieldToPrune","AppApiCall","protocolAgentName","protocolAgentVersion","internalPcCall","srcApp","srcAppInstance","AppState","ordinal","anotherState","errorMsg","BOOTSTRAPPING","STOPPING","STOPPED","LIFECYCLE_HOOKS","BOOTSTRAP","FOCUS","BLUR","STOP","APP_LIFECYCLE_CALLBACKS","BOOTSTRAPPED","STATE_CONFIGS","lifecycleDetails","maxDurationMillis","stateOptInPropName","broadcastHookName","appCallbackEventName","LIFECYCLE_ORDERED_APP_STATES","currStateName","state1","state2","AppInstance","instanceId","_currStateStartTimestamp","problem","lastUserAccessTimestamp","_stateTimeoutTimer","reportStoppedInteraction","_inAppInteraction","_appendAppInteraction","_startAppInteraction","_advanceState","bootstrapped","_triggerLifecycleHookEvent","stopped","setProblem","requestedState","requestedStateConfig","nextState","_getNextState","_convertStateToLifecycleEvent","_logInactiveAppStopped","_monitorTransitionalState","currStateConfig","currStateEntryTimestamp","maxDuration","timeInState","currStateIndex","_interactionStartTimestamp","_latestInteractionTimestamp","lifecycleEvent","_logAppInteraction","interactionStart","interactionDetails","timeSinceInteractionStart","timeSincePrevInteraction","interactionEnd","interactionDuration","commonAttrs","pcAppTypeId","pcAppId","pcAppInstanceId","pcAppDisplayType","pcAppInternallyHosted","InternallyHostedApp","pcAppFeatureCategory","pcAppProblemName","getURLTemplateQueryParams","queryParam","IDLE","poolName","getMaxActive","fetchAppsFn","loadRetryBaseMillis","loadRetryMaxBackoffMillis","reloadAppsIntervalMillis","reloadAppsRetryBaseMillis","stoppedInstanceRemovalInterval","renderedAppInstances","_loadAppsPromise","_showFailureRestoreAppId","_loadRetryAttempts","_loadRetryScheduled","_reloadFailureCount","skipLongRunningTasks","appAttentionCounts","runningInstances","_searchInstances","_renderedInstances","maxState","currInstance","totalAttentionCount","_fetchFailureLog","abortedCount","endpointFailureCount","instances","_loadApps","_findApp","_this3$_searchInstanc","_this3$_searchInstanc2","_setState","_allocateNewInstance","_this4$_searchInstanc","_this4$_searchInstanc2","runningInstance","_this5$_searchInstanc","_this5$_searchInstanc2","_monitorAppLifecycles","_reloadApps","internalLoadRetry","__fetchApps","latestApps","mergedApps","newApp","currNewApp","loadResult","restoreAppId","_logPoolEvent","forceReload","autoLoadRetry","loadRetryAttempt","autoAttempt","_scheduleAppReload","autoRetry","loadRetryScheduled","_retryInitialAppLoad","retryBase","retryAttempts","retryInterval","pow","maxRetryDuration","_loadRetryTask","timeoutVal","abortedAttempts","endpointAttempts","_decorateLogStatement","reloadInterval","reloadWait","reloadFailureCount","_reloadTimerTask","typeOfApps","isAjaxError","isAbortError","pendingInstance","_allocateSpace","existingInstances","sortedInstances","instanceToEvict","evictedAppId","_ref$instanceId","_ref$appId","_ref$states","_ref$maxState","instanceState","currInstanceState","specificInstance","_removeStopped","_monitorAppLifecyclesTask","stoppedInstances","logText","poolEvent","poolEventDetails","renderedApps","primitivePoolStateDetails","omitBy","poolStateDetails","Copyable","LIFECYCLE_DEFAULTS","ephemeral","LANG_TAG_URL_REPLACEMENT_TOKEN","DISPLAY_TYPES","STANDALONE","WIDGET","INTERAPPTION","FEATURE_CATEGORIES","ASSET_CATEGORIES","PC_CONVERSATION_ID_URL_REPLACEMENT_TOKEN","USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN","GC_INTERACTION_ID_URL_REPLACEMENT_TOKEN","GC_WORKITEM_ID_URL_REPLACEMENT_TOKEN","GC_INTERACTION_TYPE_URL_REPLACEMENT_TOKEN","TOKEN_REPLACEMENTS","_TOKEN_REPLACEMENTS","replacementProp","replacementValue","replacementToken","_ref2$","INTERAPPTION_PRIMARY_MEDIA_TYPE_FILTERS","INTERAPPTION_MESSAGE_SUB_TYPE_FILTERS","NO_SUPPORTED_COMMUNICATION_TYPE_FILTER","urlTemplate","envTld","displayType","featureCategory","gcTargetEnv","lifecycle","currReplacement","rawValue","deep","ownerMixin","Communication","comUpdate","updatableAttrs","updateProperties","_updatableAttrs","updatable","updatedValue","callbackUserName","hasSipErrors","codes","ignoredCodes","sipResponseCodes","verifyParticipantInteracted","callSegments","callSegmentsTypes","conversationParties","missedCall","wasCallback","wasOutboundCampaign","sentToVoicemail","callAnswered","groupRingCallerId","internalParticpantsWhoInteracted","callAnsweredBySomeoneElse","callEnd","allParticipants","nonVoicemail","me","internalParticipants","monitoredCallId","externalParticipants","stationParticipants","voicemailParticipant","ivrParticipants","queueParticipants","groupParticipantsWhoInteracted","partyFromConversation","outboundParticipant","inboundExternal","disconnectReason","disconnectTypeKey","isIvrTransfer","isOutboundCampaign","isBlindTransfer","isConsultTransfer","isPersonalVoicemail","isQueueCall","invalidNumber","groupRingParticipant","loadConversation","personParticipants","isGroupCall","fetchConversation","ChatMessageMedia","ChatMessageMixin","hasMentionLinks","unread","startOfBlock","endOfBlock","isYourLastMessage","splitMessageIndex","determineMessageEditability","isEditableTimeout","isSplitMessage","editableEndTime","meAction","startEditing","stopEditing","originalWidgetType","_originalWidgetType","animateChatIcon","maxWait","videoConferenceDetails","oneToOneTarget","rawSubject","pendingRoom","firstMessageTime","lastMessageTimeRadix","roomClosedTimeRadix","messageActivity","userActivity","loadingHistory","moreHistoryAvailable","moreForwardHistoryAvailable","acdCustomerParticipant","inputCache","isInRoster","participantsVisible","invited","joinScreenshareImmediately","deferredParticipants","roomOwners","setupProperties","authenticatedUserIsRoomOwner","isPersonOwner","showingVideoObserver","resizeNewPopout","resizeTo","videoPeers","videoConversation","videoRoomFull","haveId","haveName","isApiFieldConfigName","mapCanRemoveParticipant","participantList","isMember","isPersonIndividual","canRemove","isRoomOwner","sortedParticipants","isAdhocRoom","isAcdRoom","isSoftphoneRoom","processRoomDetails","isGroupOwner","isOwner","haveGroupData","clearMessageCache","pruneMessages","removeCachedItemsCount","takeRight","reconcileMessages","addHistoryMessages","processHistoryModels","filterSeenMessages","addSelfReference","insertHistory","sortChatMessages","processCorrections","processSplitMessageHistory","markConversationBlockBoundaries","updateFirstUnread","updateMessageTimes","bumpActivityCount","historyMessages","unshiftObjects","splitMessage","processSplitMessage","correctedMessage","shouldGroupMessages","firstUnread","splitMessageParentExists","SplitMessage","splitMessageId","addSplitMessage","msgId","isSupervisor","lastMessage","yourLast","oldMessage","updateMessageTimeRadix","updateClosedTimeRadix","removeParticipant","clearUnreadMessages","isUserInRoom","userjid","clearPending","existingMessage","setSendError","addDeferredParticipant","loadDeferredParticipants","markedAsRead","lengthInMinutes","selfUri","chatCommandStates","showIconTooltip","colorProfile","callsCommandStates","agentCommandStates","callsButtonTemplate","dataPanelToggleId","chatButtonTemplate","agentButtonTemplate","canHaveNumberBadge","noUnreadText","helpButtonTemplate","appsButtonTemplate","inboxButtonTemplate","bookmarksButtonTemplate","secondaryIconName","notificationsButtonTemplate","copilotButtonTemplate","iconOnly","accountSwitcherButtonTemplate","isWidgetAppsEnabled","isCopilotFrameworkEnabled","isNotificationsEnabled","pigeonConnection","isVideoState","chatCommandState","callsCommandState","customError","agentCommandState","showCallsUnreadBadge","showChatUnreadBadge","showAppsUnreadNumber","showInboxUnreadNumber","totalUnread","showNotificationsUnreadNumber","helpButtonData","callsButtonData","chatButtonData","appsButtonData","inboxButtonData","bookmarksButtonData","notificationsButtonData","accountSwitcherButtonData","showAccountSwitcher","agentButtonData","copilotButtonData","buttonData","belongsTo","async","additionalProperties","maybeLowerCase","maxParticipants","acwNotes","conversationInitiator","lastPartyTalkingTo","webrtcSession","lastConfinedParty","_recomputePartiesTimer","dialingTime","otherPartyJid","setOtherPartyJid","isOtherPartyPerson","iAmInitiatorOfConsult","otherPartyThatIsNotTheInitiator","partyId","initiatorId","otherParticipantsThatAreNotTheInitiator","aniName","otherPartyThatIsNotTheInitiatorModel","userGuidFromParticipant","setLastPartyTalkingTo","connectedParties","lastPartyTalkingToModel","consultOtherParty","initiatorModel","initiatorCall","initiatorConnected","otherPartyThatIsNotTheInitiatorCall","otherPartyThatIsNotTheInitiatorConnected","lastDisconnectedPartyModel","participantModels","isNotSelf","personFromStore","otherPartyNumber","notTerminatedOrDisconnected","isMonitor","isCoach","disconnectedParties","sortedDisconnectedParties","selfIsDisconnectedOrTerminated","myState","useDisconnectedParties","allParties","connectedOnConsult","firstCall","sortedParties","callStateA","callStateB","arePartiesDisconnected","recomputeParties","otherDisconnectedParty","isConsult","isOngoing","isIvr","otherPartiesNoEndTime","otherDisconnectedPartyModel","isDisconnectedQueueCall","setConsultInitiator","nonInitiatorNumber","myConsultId","nonInitiator","hasActiveAgent","isMe","isAgent","needsWrapup","isUser","myselfIsMonitor","myselfIsCoach","myselfIsBarged","bargedParticipant","myselfIsMCB","monitoredParticipant","coachedParticipant","isSelfMCB","errorInfoMessage","isDialingOrContacting","justMyselfOnCall","iAmContacting","theOtherPartyWhileContacting","howEnded","lowType","endedWithDisconnect","voicemailParties","others","consultParties","found","markCallAsConsult","consult","mostRecentEndTime","groupParticipant","currentTimestamp","_groupRingCaller","actualCaller","connectedToStationAndNotConference","anotherPartyIsStation","isStandaloneStation","anotherPartyIsVoicemail","connectedMedia","conversationHasActiveSessionShare","hasActiveMedia","trackConfinedParty","confinedParty","consultInitiatorLeftCall","findMedias","participantSelection","MEDIA_TYPE_COMPUTEDS","my","myMediaTypeKey","mixins","ChatsMixin","EmailsMixin","_DS$Model","hasMany","existingParticipant","normalize","participantsScreenRecording","activeStates","activeCommunications","allActiveCommunications","allActiveUserCommunications","participantComs","comType","activeUserCommunications","isAfterCallWorkRequired","queuId","userParticipants","acdParticipants","filteredParticipants","lastAcdParticipant","wrapupComplete","wrapupCode","MediaTypes","startHoldTime","autoGenerated","agentHasRead","evaluationForm","rescore","declinedReview","displayThumbnail","imageUri","department","organization","channelIdProperty","isNewChannel","changesIgnoredByAgent","agentRespondedToPrompt","screenName","PreferredPhoneContactOrder","PreferredEmailContactOrder","ENTITY_TYPE","schemaType","externalDataSources","externalOrganizationId","createDate","modifyDate","firstName","middleName","lastName","workPhone","cellPhone","homePhone","otherPhone","workEmail","personalEmail","otherEmail","twitterId","lineId","facebookId","whatsAppId","surveyOptOut","schema","customFields","contactType","mergedTo","mergedFrom","canonicalContact","mergeSet","isCurated","isIdentified","canonicalId","isCanonical","externalSystemUrl","lastUpdated","hasEmailAddresses","twitter","isSalesForce","phoneName","featureKey","featureKeyExt","featureKeyAcceptsSMS","bestEmailAddress","preferredEmailType","_bestEmailType","bestEmailType","_bestPhoneType","bestPhoneNumberDisplay","bestPhoneType","bestPhoneTypeKey","getEmailTitleFor","getPhoneTitleFor","_bestPhoneTypeKey","getRawPhoneType","hasEmailAddress","externalDataSourcesAlert","externalDataSource","salesforceLink","getSetter","websites","isOrganization","companyType","industry","primaryContactId","employeeCount","revenue","tickers","website1","website2","dateModified","workspace","createdBy","contentLength","filename","thumbnails","receiverAddress","isDefaultName","faxName","faxFrom","faxFile","ISSUE_REGEX","showEmbedConfirmation","showEmbed","isRepo","isGist","isIssue","issueNumber","issue","embedString","shouldEmbed","onSettingsChange","setEmbedPreference","overflowGroupId","sendEmailNotifications","disableEmailPii","stopRingingAfterRotations","includeEmailTranscriptions","languagePreference","COMPARATORS","BASE_GROUP","EqualTo","NotEqualTo","GreaterThan","GreaterThanOrEqualTo","LessThan","LessThanOrEqualTo","PROFICIENCIES","acdSkills","lastSavedExpression","parseExpression","isDynamicGroup","greeting","_expression","groupTypeValue","actualType","profilePictureURL","activeProfilePicture","x128","placeholderImageForSize","uploadedProfilePictures","uploadedInformalPhotos","groupVisibility","membershipVisible","includeOwners","areOwnersIncluded","groupEmailAddress","membershipSearchQuery","compiledQuery","generalSearchQuery","isDeleted","allowPermissionGroup","uniqueRoleCount","grantVersion","getGrants","rolesMap","grants","grant","membershipChange","guidOwner","individual","guidIndividual","currentPerson","ownerIds","setProfilePicture","profileImageSection","profileImage","deleteGrant","newSkill","languageSkill","routingSkill","opAnd","conOp","apiEndpoint","SessionShareMixin","connectedOnConsultArr","iAmConsultObject","currParticipant","isThereAConsultAgentParticipant","isConsultAgentParticipantConfined","isConsultAgentParticipantHeld","isConsultAgentParticipantMuted","isConsultAgentParticipantHolding","isConsultParticipantMuted","isConsultInitiatorMuted","isConsultInitiatorHolding","canTogglePause","_isOutbound","_distinguishPhoneType","phoneColumns","columnName","_createCallbackNumber","contactData","campaignId","skipEnabled","callbackTimeoutTime","currentCallback","skipDisabled","hasVoicemail","placedBlockedCalls","groupBy","agentAddedCallbackNumbers","parseAddress","dialedNumbers","numberToFormat","setCallbackTimeoutTime","isCurrentUserInConversation","chatTimer","animateChatNotifications","animateAcdIcon","draft","inlineAttachments","hasMessages","activeWorkflowParticipant","isFlowExecuting","flowFailed","agentEmail","flowStuck","ParticipantMixin","InteractionStateMixin","ACWMixin","TimersMixin","isGuid","_verifiedOnDisconnect","callbackScheduled","callbackDate","callbackTime","callbackTimeZone","callbackPhone","preferMyself","agentOwned","callbackQueue","isMuteLoading","isConsultConfineLoading","isConsultDisconnectLoading","isConsultTransferLoading","isConsultConferenceLoading","isSnippetRecordLoading","isMergeLoading","isMergeComplete","takeoverNotified","conferenceMaxParticipants","isRealtimeInteraction","mediaName","communicationForMedia","connectedCommunication","mediaChannels","isActiveConference","isAgentAssistACWEnabled","isMediaTypeSupported","assistantState","wasTransferCanceled","recentTransfer","wasTransferCompleted","wasTransferredTo","isActiveAttendedTransfer","currentParticipantState","communicationState","participantStatuses","fromEmail","fromName","messageTo","draftTo","toAddress","fromAddress","isSmsDefault","isCompleted","isPlacingCallTimer","MESSENGER_TYPE","_internalMessages","isInternalMessagingConnected","consultInitiatorState","consultAgentParticipantState","getLatestMessage","messageArray","messagesCurrentlyLoaded","getInteractionMessages","messageDetails","allowedInboundMedia","allowedOutboundMedia","lastCustomerMessage","lastAgentMessage","latestMessageRegardlessOfParticipant","smsTimer","isThirdPartyMessenger","latestMessageRegardlessOfParticipantWasCustomer","subdomain","getPcApplicationsSubdomain","LocationModel","BASE_LOCATION","imageHistory","contactPersonId","sublocationOrder","profileImages","imagex48","imagex96","imagex128","imagex200","x48","x96","x200","floorCount","subs","isFloor","deleted","hasContactPerson","contactPerson","_parent","containsRichAddress","setFloor","textBody","shortName","hasUnifiedCommunications","comms","hasChatEnabled","hasHipaaEnabled","hipaa","_orgDetails","orgDefaultCountryCode","orgDetails","defaultCountryCode","_orgPreferences","communicationMappings","screenshares","userUri","participantUpdate","updatedCommunications","newCommunication","BASE_PERSON_FIELDS","BASE_PERSON_EXPANDS","updates","sectionValue","clearProperties","changedKeys","originalKeys","sectionData","fieldKeys","pathKey","activityCounter","contactCenter","enterprise","contactCenterCount","enterpriseCount","Internal","InternalModel","_setupData","setupData","recordData","_recordData","hasRecord","_changedKeys","_data","__attributes","_updateChangedAttributes","_notifyProperties","ChatUserMixin","EntityPresenceMixin","_readWritePermissions","_directReports","_siblings","_superiors","namedPermissions","roleIds","expands","_activities","activities","_activityCall","_activityCallback","_activityChat","_activityWebChat","_activityEmail","showConversationSummaryIndicator","futurePresence","totalCallbacks","totalWebChats","activityValues","email_main","otherPhones","rawSocialGroups","rawOfficialGroups","socialGroups","getGroupsByType","officialGroups","distributionGroups","ownedGroups","manager","managerId","managerSiblings","siblings","otherRelationships","findByIds","groupedOtherRelationships","persons","groupedRelationships","personEntry","adminAssistants","_adminAssistantsRequest","cachedData","_adminAssistants","cachedIds","sameIds","promiseArray","_loadingSuperiors","_currentReportsRequest","directReportCount","cachedReports","attemptedToLoad","dataDiscrepancy","noDirectReports","doNotLoad","cachedIsSame","totalReports","_meta","selfAndSiblings","descendants","isAdmin","isContentUser","isContentAdmin","isNotBusy","isEngageUser","isEngageAgent","isEngageSupervisor","isCommunicateUser","clearDirectReportsCache","setPicture","setAgentPicture","imageSection","membershipIds","memberships","hasRecordForId","recordForId","getFieldPathForFieldValue","fieldPaths","actual","fieldType","filteredEntries","filteredPaths","setPrimaryContact","fieldData","getPresenceDefinition","deactivated","isSecondaryPresence","presenceDef","primaryIds","isSecondary","formatPresenceLanguageLabelLocale","builtIn","enBuiltIn","lookupKey","primaryLabel","createdAtA","createdAtB","hasSecondaryPresences","parentPresence","primaries","mapPresence","authorization","fieldConfigs","logCapture","isSuper","isCloned","logCaptureEnabled","expiration","userType","userState","inviteLastSent","welcomeSent","outboundMessagingAddresses","outboundEmailAddress","cannedResponseLibraries","recordingRetryCountMap","durationMilliseconds","audioSource","formatId","getSuggestedAudioTypeFrom","callRecordingUri","resultUri","resolver","pollingTimeout","apiName","userRecRetryCountKey","userRecRetryCurrent","recordingUri","thirtyDaysFromNow","originalRecordingStartTime","annotations","transcript","emailTranscript","fileState","restoreExpirationTime","estimatedTranscodeTimeMs","actualTranscodeTimeMs","archiveDate","archiveMedium","deleteDate","maxAllowedRestorationsForOrg","remainingRestorationsAllowedForOrg","isArchived","isRestored","isRestoring","isViewable","ISO_8601","download","_setLocation","downloadAllMediaUris","downloadUrls","_Object$values","mediaUriObject","_setLocInNewIFrame","loc","excerpt","_type","sharing","SkillGroupModel","nextMembersPage","_memberDivisions","memberDivisions","_skillGroupMembersRequest","mentionRegex","failedMessages","StationModel","webrtcForceTurn","persistentConnection","webRtcUserId","webRtcCallAppearances","webRtcRequireMediaHelper","isWebrtc","isGeneralUnrecoverableAppFailure","isSessionBootstrapFailure","GeneralUnrecoverableAppFailureTypes","SessionBootstrapSteps","UserModel","lastLogin","clientVersions","passwordSaved","sharingScreen","peerCount","pcParticipant","major","domId","hasConnected","zeroBitrateCount","positiveBitrateCount","pinnedId","getIncomingTracks","participantTrackInfo","isParticipantOnIncomingTrack","mediaTypes","incomingTrackId","participantInfo","participantIsOnTrack","sinks","isOnIncomingVideoTrack","incomingVideoTracks","speaking","incomingAudioTracks","screenStreamStart","showAvatar","avatarDisplay","hasOfflinePresence","connectionStatus","canBeMuted","inLastN","cameraStream","isV1","startedVideoMuted","associatedInteraction","screenTrack","cameraTrack","canUseTrackBasedActions","noVideoTrack","_getInteractionAvatarDisplay","noVideo","_loadEPCConversation","VoicemailMessageModel","audioRecordingSizeBytes","parentIds","note","copiedTo","copiedFrom","loadParticipants","groupEntity","loadEPCConversation","_userId","fetchCallerName","conversationStates","ConversationSessionEvents","ConversationAnalysis","currentCameraTrack","currentMicTrack","currentScreenTrack","pendingStreamInfos","conversationStart","hasPrepared","hasJoined","joinedWithoutMedia","preparingToJoin","foundedVideoNotifications","unfoundedVideoNotifications","currentLastN","screenRecordingStream","waitingForScreenStream","pinnedParticipantId","conversationService","participantPurpose","localCameraStream","localScreenStream","_participants","isAcdScreenShareViaHawk","ParticipantV2","pinnedParticipant","isPreparing","isIdle","isPending","isEnding","outgoing","mutedByOther","failedToConnectSession","hasPeers","localParticipant","_handleMediaChange","_removeListenerPeerTimer","cleanupLocalMedia","stopScreenShare","isGroupCollaborate","_updateMajorByLastN","rawTrackOwners","newMajor","majorParticipant","_getPerson","retryCount","repaired","participantMediaActiveInRoom","participantMedia","matchingMsid","participantInfos","repairRoomPresences","_addParticipant","videoPresence","audioPresence","Participant","knownParticipants","handleRemoteStreamIdentified","toggleAudioMuted","_checkLastN","_removeListenerPeer","_removeListenerPeers","listenerPeers","participantsWithoutMediaPresence","hasVideoTrack","hasAudioTrack","isVideoEnabled","isAudioEnabled","_selectEndpoint","pinnedEndpointMessage","pinnedEndpoint","_addScreenStream","addStream2","_updateMediaToPeers","clearPromises","newTrackPromises","switchStream","_addVideoBack","_updateLocalStreams","_removeLocalVideoTrack","_addEventsToLocalMedia","newMedia","notifyScreenShareStart","hardMuted","creatorId","unmute","removeScreenStream","notifyScreenShareStop","shouldRestoreCameraStream","toggleVideoMuted","localScreens","applyFilter","canMuteOthers","unshiftObject","screenshare","muteParticipant","sendDirectly","_addStreamToParticipant","audioTracks","videoTracks","assumeScreenshareStream","selectParticipant","_updateDominantStream","dominantStream","_dominantStream","dominantStreamIsLocal","dominantParticipant","dominantStreamIsScreenShare","showAvatarForDominantParticipant","_getSessionAcceptParams","_acceptSessionWithTrackBasedActions","senderCount","trackCount","accept","_acceptSessionWithStreamBasedActions","streamBasedActionsFallback","channelName","colibriPayload","toggleSharingScreen","forceStop","_removeStream","resumeVideo","disallowVideoUnmute","pauseVideo","muteAudio","unmuteAudio","setParticipantPin","shouldPin","targetParticipantId","streamType","originalValue","selectedParticipants","selectedParticipant","dumpCurrentState","snap","mutableGroupId","alternativeShift","agentNotification","otherNotificationIdsInGroup","afterModel","centerStageRouteRegex","centerStageShortRegex","resolveRoute","routeInfo","_transformCenterStageRoutes","fullNameWithoutType","NOOP_TRANSITION","Router","EmberRouter","locationType","titleDivider","isAborted","resetNamespace","baseClientPath","clientPath","currentRouteDidTransition","prevRouteName","_prevRouteName","instrumentSidebarPanel","newRouteName","restart","emergencyGroupId","adminuiService","toAdminHome","newAdminUrl","loadFreeTrial","didTransition","gotoRoute","UnprotectedRouteMixin","ApplicationRouteMixin","routeAfterAuthentication","onSessionInvalidationFailure","willTransition","postMessageRouteChange","linkTo","targetName","_window$location$hash","_window$location$hash2","queryString","queryParameters","openChatRoom","_arguments","originRoute","sessionAuthenticated","applyFrameworkDefault","stateRestore","popRestoreState","resolvePostAuthDestination","restoreStateUrl","applyPostAuthDestination","useFrameworkDefault","assignLocation","_releaseAttemptedTransition","sessionInvalidated","recordLogoutTime","authenticator","proxyLoginInfo","retrieveProxyLoginInfo","reloadUrl","queryParamsObj","refreshModel","_toggle$redirect","_toggle$makeRedirectA","redirectArgs","redirectRoute","deactivate","isTransitioning","finalizeQueryParamChange","finalParams","declared","alreadyPushed","qp","promptOnLeave","oldURL","newURL","getURL","queryParamsDidChange","CenterStageRoute","MODE_CAPTURE","ContentManagementRoute","controllerName","isLiveRoute","setupController","isSelectionMode","cmPath","observeSidebarExpansion","isWithinCM","isWithinEngage","isDirectoryRoute","isEngage","isSideBarExpanded","QUERY_REGEX","EMBEDDED_TARGETS","hashMatch","engagePath","interaction_id","timezone","locationURL","qualityPath","isEmbeddedEngageRoute","telephonyPath","kebabCase","wfmPath","IndexRoute","InteractionDetailRedirectRoute","adminAgentSegment","buildInteractionDetailRedirectPath","OAuth2LoginRoute","_authenticate","supportsRegions","getRegion","restoredRoute","getRestorableRoutePath","loadTranslations","resolvedModel","serializeRestoreState","rejectionDetails","authFailureReason","sensitive","LoginRoute","MaintenanceRoute","bootstrapErrorDetails","failedBootstrapStep","failureType","buildCommonTelemetryContext","_reloadApplication","paramsFor","contact_id","pcAuthUri","SkillGroupDetailRoute","ModelRouteMixin","appsProblem","unknownApp","currAppName","app_id","buildStandaloneAppLogMsg","initPoolState","rejectionPoolState","routeAppId","hashRoute","buildTag","PRODUCTION_LIKE_ENVS","_showTimeMachineModal","escapedBuildTag","buildNumber","templateName","DEFAULT_PARAMS","performSimpleKeywordSearch","queries","aggregations","addQuery","addQueries","addTagQuery","addAggregation","aggregation","addAggregations","setPaging","setTypes","setReturnFields","resourceTypes","SEARCH_FACET_KEYPATHS","profileSkills","hobbies","interests","certifications","SEARCH_QUERY_TYPES","SEARCH_QUERY_OPERATORS","SEARCH_AGGREGATE_TYPES","Service","suggestEndpoint","_searchUrl","_suggestUrl","_docUrl","normObj","_this$requestBuilder$","defaultAggregations","entityRequest","requestBuilder","facetsRequest","selectedTerms","searchField","aggregateResults","processFacets","performSuggestSearch","performCustomSearch","terms","facetName","orderKeys","RequestBuilder","searchService","_extractData","normalizeArrayResponse","included","toRemove","OUR_COOL_REQUEST_TYPES","ApplicationSerializer","RESTSerializer","isNewSerializerAPI","isPrimaryType","primaryTypeClass","primaryModelClass","groupKey","finalData","groupedData","normalizeSingleResponse","resolvedId","_resolveSinglePrimaryId","requestedId","EmbeddedRecordsMixin","PurecloudSerializer","serialized","attrsToSerialize","JSONSerializer","embedded","convo","EMPTY_MODEL_OBJECTS","_normalizeContact","_getPojo","jsonProfile","normalizeDeleteRecordResponse","_fillEmptyPropertiesWithModelObjects","normalizeQueryResponse","filledEntities","externalcontacts/contacts","pageOffset","emptyModel","emptyOrgModel","EMPTY_ORGANIZATION_MODEL","getOwnPropertyNames","_fillPropertyIfNecessary","defaultData","payloadValue","externalcontacts/external-organizations","normalizeFindRecordResponse","jsonapiPayload","getJabberId","generateGroupLinkIds","jId","orgGuid","search_key","idParts","groupLinks","RESERVED_TYPES","modelNameFromPayloadKey","extractSectionData","filterMissingFields","relationships","keyForRelationship","extractMeta","payloadKeyFromModelName","serializeAttribute","updateDebounce","_debounceLength","_updateInteractionModels","_headsetFeatures","_handleCallCreated","currentConversationIsCall","alertingCalls","_updateActiveCalls","updatedInteractions","filteredList","activeInteractionIds","oldInteractions","callInteraction","addCustomerIntentListenerForInteraction","_buildCallInteractionModel","scheduleRosterSync","cleanupScheduleCallbackGadgetSessionStorage","invalidateCaseCacheEntry","cleanupAfterWrapupGadgetSubmit","isSelectedInteraction","agentAssistChecksService","rawData","CALL_BLOCKED_CODES","CALL_ERROR_CODES","isCallbackActive","hasCallbackThatNeedsWrapup","hasWrapup","wrapupSkipped","callbackRequiresWrapup","ININ_OUTBOUND_PREVIEW_SKIPPED","isPlacingCallTimeout","blockedCalls","_processingChain","partCommIdMap","callBacksAnsweredByClient","_callbacksReadyPromise","_callbacksReadyResolve","sessionStorage","registerPromise","_initializeProcessingChain","_process3","_process2","_process","interactionProcessingChain","QueuedProcessingChain","lifecycleContainer","setProcessingChain","process","Conversation","contactObserver","addContactChangeListenersForInteraction","currModel","intentTargets","_intentTargets","_intentTargets$_i","ModelBuilder","interactionModel","commId","partId","triggerAutoAnswerNotification","checkAndSetCommAndPartId","prevCommId","prevPartId","isInitiallyConnected","callBlocked","alreadyShownNotification","_ref1$wrapup","newModelData","interactionIdx","callShouldBeActive","callbacksRequiringCallWrapUp","callParticipantsForCurrentUser","participantForCurrentUserCalls","ongoingCall","mostRecentCall","wrapupEndTime","hasWrappedUpMostRecentCall","isAgentRequestedACWFeatureOn","hasAgentCompletedOrSkippedACW","wrapupHandled","activeCallbacks","notResponding","subscribeToCallbackTopic","conversationTopic","registerMessageEvents","enqueueEvent","_fetchCallbacks","getAllActive","answerFromThisBrowser","isFullyAutomated","thisClientAnsweredTheCall","isDialerCampaign","isSkippingPreviewCampaign","submitAfterCallWork","_scheduleIsPlacingCallTimer","addCall","callBacksAnswerByClient","UriBuilder","webChats","_typingIndicators","_mediaRequestTimers","_answeredChats","_currentMessageQueue","_registeringChatTopics","_registeredInteractions","_messageCache","_chatsReadyPromise","_chatsReadyResolve","getActiveChats","fixJid","existingConvo","_scheduleChatCleanup","_cleanUpOldChats","chatsToRemove","deleteCachedMessage","_unregisterWebChatTopic","chatId","acdCustomerModel","joinAcdRoom","_room","declineChat","initMessages","loadMessages","agents","loadAgentInfo","hashSettled","_processMessages","currentMessages","bodyType","sending","_scheduleMessage","localId","lastMessageData","_sendNextQueuedMessage","localMessage","_sendMessageRequest","sendTypingIndicator","typingUri","getTypingIndicator","storeCachedMessage","retrieveCachedMessage","subscribeToExternallyAnsweredChats","answeredChats","_handleWebChatEvent","processingChain","prevRaw","insertAt","answered","isRegistered","_registerWebChatTopic","_shouldShowNotification","isActivePanel","_sendNotification","webchat","indicator","_handleMessageEvent","_handleTypingIndicatorEvent","_handleMemberChangeEvent","_handleMediaRequestEvent","senderId","haveChat","matchingIndex","_matchingMessageIndex","mediaRequestTimers","currentMediaRequest","_timeoutMediaRequest","mediaRequest","_deleteMediaRequest","doneLoadingActiveEmails","_emailsReadyPromise","_emailsReadyResolve","loadActiveEmails","_handleDraftEvent","emailTopic","draftTopic","topicsToRegister","fetchDraftForEmail","emailId","setDraftUpdate","draftToUpdate","_cleanUpOldEmails","_process4","isCurrentUserOnlyAScreenMonitor","agentParticipantId","newPayloadState","newPayloadStateAlertingOrConnected","currentInteractionEndState","isUnparked","isOutboundEmailInteraction","isValidUpdate","_initializationPromises","_resolver","additionalDelay","promisesToWaitFor","firstBatch","afterFirst","secondBatch","activeSms","checkedDeploymentIds","_messagesReadyPromise","_messagesReadyResolve","getActiveSms","_handleTypingEvent","platformType","normalizedMessage","configId","typingConfig","_handleTypingIndicator","additionalIds","hasTypingConfigForId","isTypingEnabledForConv","messenger","showUserTypingIndicator","setTypingIndicatorConfig","typing","typingIndicators","typingIndicatorForConvId","smsId","subscribeToTypingEventTopic","smsTopic","_getLatestMessasgeId","payloadMessages","_getMessagesFromInteraction","_getLatestMessage","latestMessageId","getSmsObjects","smsObjs","messageAlreadyAdded","toastNewMessage","rawPayload","isInbound","getMessageBody","customerParticipantId","rawConversation","sendAcdMessageNotification","_handleNewMessage","eventSrcFromAPI","newMessageEvt","verifyBeforeFetchingMessageDetails","smsIdsToLookup","isInstagram","canVerifyBeforeFetch","messageIdSet","notFoundMsgIds","getSMSDetails","foundMsg","smsMessagesFromCPToFill","newModelCreated","smsMessageDetails","smsDetail","msgFound","currentMessagesLength","newMessagesLength","_cleanUpOldSms","smsToRemove","sampleParticipant","smsMessagesFromCP","lastMessageId","isOutboundMessagingInteraction","currentMedia","currentDisconnect","previousDisconnect","prevParticipant","prevMedia","transitionedToRemoved","hasMediaAttachment","getInteraction","handleActiveInteractionOnCreate","continueOutBoundCreate","cancelOutboundCreate","useExistingConversation","BASE_URI","ACTIVE_ASSIGNMENT_STATES","WORKITEM_INTERACTION_CHANGED_EVENT","taskmanagement","canViewWorkitem","allWorkitems","alertingWorkitems","_processWorkitem","workItemsTopic","loadActiveWorkitems","_createProcessingChain","_process5","convertApiWorkitem","createWorkitemInteraction","currentWorkitemInteraction","workitemDetails","updatedWorkitem","getWorkitem","expandWorkitemInteractionDetails","_notifyWorkitemInteractionChanged","assignmentStateChange","oldValue","contactStateChange","addCustomerIntentListenerForWorkitem","_workitemInteraction$3","assigneeId","stateFromConnectedToDisconnected","notModifiedByAssignee","_cleanupOldWorkitem","acceptWorkitemInteraction","endWorkitemInteraction","parkWorkitemInteraction","assignWorkitem","getWorkitemById","getSchemaDetails","schemaId","schemaVersion","getSchemaById","handleWorkitemStateChangeEvent","oldState","_workitemInteraction$4","workbin","worktype","wordCharsRegex","nonDigitRegex","removeLeadingPlusRegex","itemToFormat","formatFieldConfigEntry","intlTelInputUtils","getExtension","formatNumber","numberFormat","E164","addressParts","lookupAddressFormatResultId","displayText","existingRecord","records","resolveAddressFormatResult","isEntity","formatSipAddressForDisplay","userHasAdminAccess","adminAuthorizedEntries","adminEntry","navTreeItem","engageSingleLinkSections","fullNav","normalizedAdminNav","normalizedEngageNav","combineAdminAndEngageNavs","fullNavTree","normalizeAdminNav","normalizeEngageNav","engageNav","adminNode","includeLinksFrom","desiredNode","engageNode","engageLink","engageIndex","adminLink","adminIndex","isMatch","combinedNav","normalizeAdminEntry","adminNavEntry","subLink","tree","normalizeAdminSubLink","adminNavSubLink","subSubLink","flattenSubLinks","singleLinkSection","overrideNameKey","loadingPromise","menuJSON","notificationType","embeddedAdminFrame","_this$menuJSON","menuItemsPath","getMenuPathToLocation","breadcrumbPath","getTranslatedText","currentPath","menuKeys","menuKey","menuItemPath","pathLength","getLocale","localeVal","defaultVal","loadAdminEntries","donutPermissions","featureService","domainAndEntity","lastIndexOf","requiredFeatures","menuSubItem","getFeatureToggles","isAccessible","authorize","allowed","isAuthed","_rule$split","_rule$split2","policies","isValidPolicy","availible","featureString","headingKey","subEntries","subheadingKey","processTreeNode","treeNode","subEntry","_classCallCheck","_defineProperties","_callSuper","_getPrototypeOf","ReferenceError","_assertThisInitialized","_possibleConstructorReturn","Reflect","construct","_isNativeReflectConstruct","_superPropBase","_setPrototypeOf","_Service","AgentAssistChecks","_inherits","_createClass","_this$session","_this$permissions","canViewCopilot","hasCopilotPermission","isSupportedMessagingType","_checkIfSmartAdvisorIsEnabled2","setAssistantState","_assistant$knowledgeS","_checkAssistant","_checkIfInteractionTypeIsEnabled","enabledChannels","NotificationType","ReminderNotification","category","startDateStr","getRoundedDiffMinutes","laterDate","earlierDate","round","isDateBefore","compareDate","formatShortMonthDay","dateString","outOfAdherenceNotification","scheduleUpdateNotifications","nextActivityNotifications","adherenceRegistered","scheduleUpdateRegistered","remindersCountdownInterval","getScheduleUpdateNotification","setScheduleUpdateNotification","removeScheduleUpdateNotification","getPersonGuid","checkIfValidUUID","loadAdherenceData","_adherenceData","_adherenceData2","_adherenceData3","adherenceData","handleNextActivityReminders","handleOutOfAdherenceState","adherenceState","scheduledActivityCategory","suppressOnTimeReminder","handleAdherenceChange","getRemindersCountdownText","inMinutes","youAreScheduledIntl","showRemindersCountdown","_reminder$notificatio","reminder","countdownText","shown","hideNotification","REMINDER","showAdherence","millis","getMilliseconds","getSeconds","timeoutMs","COUNTDOWN_UPDATE_PERIOD_SEC","adherenceTopic","showScheduleUpdates","scheduleUpdateTopic","handleScheduleUpdate","goToSchedule","_setHash","_this$nextActivityNot","SCHEDULE","_this$getScheduleUpda","OUT_OF_ADHERENCE","scheduleData","maxVisibilityDate","listSeparator","visibilityRange","_update$type","_this3$getScheduleUpd","notifyNew","shiftStartDates","_scheduleUpdate$shift","shifts","sortedDates","visibleDates","updateStartDate","visibleEndDate","_event$nextActivityRe","nextActivityReminders","nextActivity","activityStartDate","activityCategory","adherenceDataPresent","scheduledActivity","outOfAdherence","handleAdherenceAccessChange","handleScheduleUpdateAccessChange","hasAdherenceNotifyAccess","hasAdherenceAccess","hasScheduleUpdateAccess","hasAgentActivityAccess","isAgentScheduleVisibilityEnabled","AgentScheduleService","_agentScheduleService","isPanelSettingValid","typeValid","panelIdValid","buildUri","invalidSettings","RateLimitPromise","PromiseProxyMixin","isRateLimited","rateLimitResetTime","shouldRetryRequest","retryStringToNumber","retryResetTime","headerRateLimit","getHeader","foundKey","hasAuthorizationHeader","AjaxService","enableRetryHeaderParsing","enableAPIDomainRewrites","_makeRequest","_getFullHeadersHash","fullHeaders","_ajaxRequest","_shouldSendHeaders","trustedHosts","_scheduleRequest","retryTime","scheduleTime","reqUrl","addApiDomainIfMissing","isRootAPIRequest","apiDomain","canParseHeaders","retryDisabled","promiseProxy","shouldRetry","_logPossibleRetryEvent","getAllResponseHeaders","generateDetailedMessage","urlObject","headerCorrelationId","payloadCorrelationId","_pushModal","_modalStack","modalStack","newModal","_this$pushCancellable","pushCancellableModal","modalResolution","deferPromise","defaultsToOverride","removeModalById","resolveModal","_newModal$buttons","_newModal$buttons2","_newModal$buttons3","displayedModalConfig","_newModal$buttons4","_newModal$buttons5","_newModal$buttons6","modalContext","isContentsquareInitialized","initializeContentsquare","setupDimensions","setDimensions","setCustomAttribute","_uxa","orgShortName","sendContentsquareSessionVar","commonCtxt","applicationVersion","uiLanguage","webDirAgent","platformJsBrowserName","PlatformJS","platformJsBrowserVersion","platformJsProduct","platformJsManufacturer","manufacturer","platformJsLayout","platformJsOperatingSystem","os","platformJsDescription","BRIDGE_CONFIGURATION","deprecation","until","COOKIES","pageTitleService","dragging","iframeFocused","urlprefix","orgspanBaseUri","purecloudBaseUri","realtimeScriptUri","mobileQueryParameter","belowMobileThreshold","trialSupportDisplayed","showTrialSupport","debugSettings","offerMobilePreference","offerMobilePreferenceRetreived","currentYear","sparkTheme","currentPageTitle","checkForDebugMode","gatherEnvDetails","initIframeFocusListener","setVisibilityListener","PHONE_CONNECTED","hasRecentlyLostSubscriptions","_onNoLongerSubscribed","_onTopicsRegistered","_onHawkSubscriptionError","toggleWebTelemetry","webrtcSdkInvitation","videoRoomJid","videoJid","getVideoInvitationByUserJid","prepareOneToOne","inviteJid","_toggleWebTelemetry","pwt","warningData","modules","_webTelemetryTimer","deprecatingAlias","systemLocale","iso2LocaleCountry","focusHandler","blurHandler","nodeName","visibilityChange","mozHidden","msHidden","webkitHidden","visibilityHandler","windowBlurHandler","windowFocusHandler","pigeonUserSubscribed","pigeonUserSubcribed","_onPigeonUserSubscribed","_iframeFocusHandler","_iframeBlurHandler","_windowBlurHandler","_windowFocusHandler","_visibilityHandler","loadStreamingService","authenticated","scriptUri","runAsMediaHelper","testMediaHelperMode","alertableInteractionTypes","setupConnection","signalIceConnected","disableEOCShortCircuit","referenceStanza","originAppName","APP_NAME","originAppVersion","originAppId","splitHawkAndRealtime","useServerSidePings","enablePartialBulkResubscribe","customHeaders","Genesys-App","streamingServiceConnect","adminUIContext","systemTopicType","notified","syncStreamingConnectionToAuthState","displayTrialSupport","adminUiContext","uvOptions","feedback_tab_name","primary_color","link_color","default_mode","forum_id","routeType","routeId","localGCBAUri","changePreferredLanguage","_sendDiagnostics","checkForMobile","isMobilePhone","showTinyNavMenu","showContextualHelp","isInteractionPopout","isAdminRoute","setBridgeConfiguration","getQueryParams","debugCookie","buildDebugSettings","orgNameCookie","readOnlyCookie","SET_ATTENTION_COUNT_API_ACTION_NAME","canHandle","appApiCall","SHOW_PROFILE_APP_API_ACTION_NAME","SHOW_GROUP_APP_API_ACTION_NAME","routerService","_handleShowProfile","_handleShowGroup","_appApiCall$get","_appApiCall$get2","SHOW_EXTERNAL_CONTACT_PROFILE","SHOW_EXTERNAL_ORGANIZATION_PROFILE","ExternalContactsApiHandler","_handleShowExternalProfile","_handleShowExternalOrganizationProfile","apiActionDetails","permissionService","_ajaxGetExternalContactProfile","_ajaxGetExternalOrganizationProfile","orgUrl","contactUrl","APP_STOPPED_API_ACTION_NAME","APP_BOOTSTRAPPED_API_ACTION_NAME","SHOW_MY_INTERACTION_DETAILS","SHOW_MY_EVALUATION_DETAILS","_handleShowInteractionDetails","_handleShowEvaluation","_ajaxGetConversations","isParticipant","_navToInteractionRoute","evaluationId","_ajaxGetEvaluation","conversationUrl","evaluationUrl","routePath","OPEN_PANEL_API_ACTION_NAME","openPanelDemoAppURL","OpenPanelHandler","isActiveInterapption","appURL","OPEN_WINDOW_API_ACTION_NAME","targetUrl","isKnownUrl","isKnown","VALID_INJECTION_MODES","PROPOSE_MESSAGE_API_ACTION_NAME","ProposeMessageHandler","offerMessage","astResult","GAST","Text","convertToAST","SHOW_HELP_APP_API_ACTION_NAME","HIDE_HELP_APP_API_ACTION_NAME","SHOW_RC_ARTIFACT_APP_API_ACTION_NAME","apiAction","resourceCenterRelPath","showResourceCenterArtifact","SHOW_INTERACTION_DETAILS_VIEW","SHOW_TOAST_APP_API_ACTION_NAME","TOAST_MSG_PROPS","internalPropName","markdownMessage","TOAST_MSG_PROP_NAMES","REQUIRED_TOAST_MSG_PROP_NAMES","_this$_processToastPa","_processToastPayload","invalidProps","ignoredProps","validatedToastData","ignored","fullTag","requiredCount","filteredPickData","filteredData","pickBy","_checkPropValid","omit","_mapDataToInternalProperties","mapKeys","ConversationsMessageHandler","ConversationsListMessageHandler","renderedInstanceState","getWorkers","matchingWorker","workerInstance","guardInstance","AssociateActivityMessageType","_message$payload","_message$payload2","payloadIsCorrectType","typeCanBeHandled","_message$payload$type","_message$payload3","StartCall","StartEmail","StartMessage","NavigateToConversation","_startCall","_startEmail","_startMessage","_handle","emailAddress","msgEnvelope","isGetConversationsClientToHostMessage","_this$findWorkerInsta","srcId","asyncCommsPairKey","buildGetConversationsResponseHostToClientMessage","appsUtils","isOfferMessageMessage","appFilters","conversionResult","tempDiv","isVisible","HTML","stringifyFromAST","innerHTML","innerText","buildInjectMessageMessage","_tearDown","getStreamingClient","appSubs","isHawkClientToHostMessage","_this$findInstanceSta","_this$listeners$get","fail","renderedInstance","_handler","isWorkerTrusted","isTrusted","hawkPayload","versionPolyfill","isHawkEventPayload","addAppSubscription","removeAppSubscription","_getStreamingClient","logFailure","_args3","v2Promise","legacyHandlerActionNames","srcInstanceId","isSimpleModalClientToHostMessage","msgEnv","handlerResult","_showModal","_msg$payload","isTraceLoggerClientToHostMessage","isAddTelemetryEventClientToHostMessage","appType","stashLoggerDetails","_attributes","workerDefId","isOpenPanelHandlerMessage","isOpenPanelDemoApp","isInternallyHosted","isOpenWindowClientToHostMessage","isGcUrl","isWorkerInternallyHosted","openWindow","isNotificationToastClientToHostMessage","isConfirmToastClientToHostMessage","_messageEnvelope$mess","showNotificationToast","showConfirmToast","_showNotificationToast","_desktopNotification$","nType","notificationEl","getForceInAppToastOptions","buildToastTag","HTMLLIElement","_showConfirmToast","_msg$payload2","requestedToastId","PROTOCOL_LENIENT_INTERNAL_ACTION_NAMES","APP_PROTOCOL_CHECK_REG_EXG","ALLOWED_SANDBOX_VALUES","ALLOWED_PERMISSION_VALUES","LIFECYCLE_HOOK_KEYS","LIFECYCLE_KEYS","INTERAPPTION_PROP_MAPPING_CONFIG","destPath","convert","valueIn","typeIn","lifecycleObj","valueType","trustedOnly","APP_ASSET_CATEGORIES","standaloneAppPoolVisible","externalUrlExemptIntegrationTypeIds","standaloneMaxActivePoolSize","widgetMaxActivePoolSize","_bypassAppCache","globalApiHandlers","_findAllStandaloneApps","REMOTE_APPS_CACHE_TTL_MILLIS","_findAllWidgetApps","localMsgListener","contextualApiHandlers","_handleApiCall","normalizedConfig","APP_DISPLAY_TYPES","propError","configKeys","currKey","currPropConfig","_buildApp","_isValidApp","_handleLocalMsg","_isLocalMsg","msgSource","asyncHandlerPromise","availHandler","currHandler","_instrumentApiCall","msgFailureDetails","ApiCall","pcAppProtocol","pcAppProtocolAgentName","pcAppProtocolAgentVersion","_localMsgListener","_fetchAppsByType","_fetchAppsByTypeRemote","_remoteAppPromise","_remoteAppRequestTimestamp","allAppsPromise","lastRequestTs","_accumulateApps","appsUrl","primaryLocale","_getPrimaryLocale","validAppObjs","currIntegration","internallyHosted","_isInternallyHostedApp","integrationType","intlLocale","intlIsoLocale","appProps","_parseLangTagProp","_parseMultiValueProp","_parseProp","ucIntegrationKey","pbxPermission","getCurrentWindowOrigin","_parseBooleanProp","isNone","getEffectiveLnaPolicy","ucIntegrationId","currAssetCategory","currAssetCategoryCfg","currVector","currRasters","_extractRasterImgs","raster","assetCategory","imgs","currImgKey","parseResult","_validateApp","logMessageAppType","fullLogMsg","internalAppPath","internalAppSubdomain","subdomainType","internalAppQuery","externalUrl","isExternalDomain","invalidUrl","integrationTypeId","propVal","separator","validatedItems","_langTagRegExps","baseProp","langTagRelProp","baseObj","lenientLangTag","langTagRegExp","langKey","isJid","peopleQueue","groupQueue","checkCacheForEntity","queueEntity","cachedModel","possibleCache","possibleJid","isDirectoryId","scheduleQueues","_scheduleQueues","_handleQueues","clearQueue","processQueue","FL","resolveResults","keyId","bookmarkPageTitleService","adminPageTitle","nativePageTitle","sidePanelExpanded","currentSidePanel","currentStandaloneApp","framePageTitle","navMatch","findBestMatchingMenuItem","shortenedHash","configByPath","nativeEntry","BookmarkPageTitleService","_bookmarkPageTitleSer","_superPropGet","CASE_ASSOCIATION_MEMORY_CACHE_MAX_ENTRIES","NOOP_CASE_STORE","_isNoop","_caseAssociationStoreSingleton","_caseAssociationRosterLoadTail","_isContextDestroyed","_bumpCacheVersion","_getPersistedHit","_getPersistedHit2","caseStore","storedAt","_savePersistedHit","_savePersistedHit2","isNoop","storeWithReady","ready","_pruneExpiredHits2","cutoff","batch","_x17","_runBatchedCaseLoad","_runBatchedCaseLoad2","executed","_executeRosterCaseLoad","_executeRosterCaseLoad2","idsToLoad","_getRosterIdsNeedingCaseData","_loadIdsInBatches","_getRosterIdsNeedingCaseData2","persisted","_ctx$clearPersistedRe","_withCase$workitem$ca","_withCase$workitem$ca2","withCase","_persisted","_ctx$clearPersistedRe2","casesCache","wouldEvictOnNewKey","clearPersistedRehydrationNegativeForId","caseId","_loadIdsInBatches2","requestBody","_fetchAndCache","_fetchAndCache2","_requestBody$workitem","_doFetchAndCache","_x13","_x14","_x15","_x16","_doFetchAndCache2","_ctx$logger","_ctx$logger$warn","lastError","delayMs","attempt","_response$entities","_ctx$clearPersistedRe3","MAX_RETRIES","CaseAssociationServiceImpl","_key2","LruCache","preferEvictWhen","_helperContext","override","localforage","createInstance","storeName","getCaseAssociationStore","_caseStoreOrDefault","_pruneExpiredHits","_isServiceDestroyed","_clearPersistedRehydrationNegative","_persistedRehydrationNegative","_persistedRehydrationInFlight","_runBatchedCaseLoadScheduled","conversationIdOrWorkitemId","isAtCapacity","_schedulePersistedHitRehydration","activeRoute","activeCenterStageClients","activeClients","filterActiveClients","translatedClients","clientConfigList","client1","client2","allClientQueryParams","promptOnLeaveChanged","promptOnLeaveBeforeUnload","rawClients","computedConfig","pathGroups","pathClients","_this$findActiveClien","findActiveClient","_this$findActiveClien2","_getWindowHash","isEnabledClientRoute","isConfigEnabled","_getParsedQueryParams","sortedConfigList","candidateClients","enabledClient","featureExpression","toggles","addCommand","queuedChatCommands","emptyQueuedCommands","CacheChatRoomsMixin","collaborateChatBaseUrl","collaborateChatFrameConfig","collaborateChatIFrame","collaborateChatPhoneIFrame","collabChatMainInitialized","collabChatPhoneInitialized","collabChatPhoneReady","currentActiveRoomObs","preferRoom","notifyCollaborateChatPhoneIFrame","roomChanged","setCollaborateChatBaseUrl","setupCollaborateChatConfig","collabChatBranchQuery","parseFavoriteIFCPayload","entityFav","favoriteId","_ref2$payload","toastType","TOAST_TYPE","SUCCESS","ERROR","sidebarExpanded","applyPhoneChatLayoutCorrection","_this2$parseFavoriteI","updateFavoritesArrayOnFavorite","updateFavoritesArrayOnUnfavorite","deleteId","removeProperty","respondingTimeout","preferencePaths","BatchDataRequests","MessageSplitting","ChatCommandsMixin","supportedChatWidgets","analyticsService","widgets","firstRoomChosen","responding","popoutRoom","activeEmpty","messagesPerHistoryRequest","maxHistoryRequestSize","dashboardRooms","roomHistoryStack","replyMessage","collabChatShowChatSplat","canCorrectMessages","isExpanded","subscribeToStreamingEvents","subscribeToConnection","initializePreferences","mutedRoomsValue","roomHistoryStackValue","_chatNotificationVolume","_interactionNotificationVolume","_initNotificationVolumes","_setupRateLimitListener","_startWatchVideoParticipantCount","watchVideoParticipantCount","setMessageReply","_handleRateLimit","requestingJids","_notifyRosterRateLimit","respondingTimeoutId","sendChatState","toggleRoomMuted","getRecents","recents","clearRoomUnreadMessages","_d","sendMessageProxy","timeoutIdentifier","sendCallback","integrationData","sendChatMessageUrl","messageResponse","sendVideoProviderNotification","removeAttachment","fileDescriptor","cast","joinScreenShareRoomViaHawk","rejoiningRoom","timeoutPromise","checkJid","inviteToRoom","leaveRoom","setInactiveRequest","leaveRequest","setClosed","newRoom","makeNewEmptyRoom","addEmptyRoomObserver","len","roomIsDirty","addPersonToRoom","requestHistory","historyOptions","getMessages","markAsHistory","loadUsersForHistory","presenceId","dispatchCollabChatEvent","oldOpenRoom","syncUserChatData","syncAllRoomsLastMessageTime","getActiveChatsFromRealtime","activeRooms","activeChatsFromRealtime","lastActiveRoom","mostRecentActiveRoom","selectHighestAppearingActiveRoom","newActive","setActiveRoomId","removeRoomFromHistoryStack","addRoomToHistoryStack","deactivateRoom","setRoomInactive","replacementRoomJid","selectRoomPromise","getNextRoomFromActiveSection","selectedRoom","attemptRoomChange","deviceVolumes","activeRoomJid","newRoomJid","loadRecentHistoryForAllActiveRooms","loadRecentRoomHistory","loadRoomHistoryWithOptions","loadMoreRoomHistory","loadMoreRoomHistoryAfter","loadContextualRoomHistory","afterDate","beforePromise","requestRoomHistory","afterPromise","combinedMessages","_addHistoryMessages","_updateRoomStatus","_processHistoryResults","_resolveRealtimeConnected","chatFrameInitialized","canNotifyChatFrame","realtimeConnected","realtimeDisconnected","_resolveRealtimeDependentCalls","streamingConnectDeferred","setRoomDetails","deleteParticipantFromChatRoom","getRoomInfo","parseMessageBody","parseWidgetData","mentionEvent","directMessageEvent","roomMessageEvent","isActiveRoomJid","isChatVisible","collabParams","voltParams","routeUrl","mappedVoltParams","RoomPoppedOut","sendCmdToIFrame","collabChatInitialized","collabChatFrame","helpText","toCollabChatCommand","handleXMPPReferenceMention","handleMentionEvent","subscribedConference","videoParticipantCount","getVideoParticipantCount","halfHour","_pendulum","thisTick","_previousTick","_tick","getDay","totalItems","itemsPerPageOptions","activeCoachingModalId","getPageNumber","getTotalItems","getPageSize","patchCoachingNotification","notificationId","fullUrl","getCoachingNotifications","CoachingNotificationModel","getCoachingAppointment","getAttendees","attendeeIds","getFormattedDate","getFormattedStartTime","getFormattedEndTime","getEndTime","updatePaginationOnCreate","updatePaginationOnDelete","removeCoachingNotification","noOfPages","populateDataForCoachingModal","userPermissions","wizard","currentUserPermissions","appts","currentNotification","parsedBody","useDefaultCoachingService","loadAppointment","loadCobrowse","scriptUrl","getScript","cobrowseLoaded","PureCloud","startSharing","sharerSession","processCobrowseActivationFailure","isCustomerCobrowseConnected","DEFAULT_PANEL","commandNavService","currentDrawer","lastOpened","_loadPreferencesInFlight","_loadPreferencesQueued","callControlsTab","notificationsAttentionCount","handleHashChange","_persistNavState","getPreferencesOnChange","_canRestorePanel","panelDef","_performPersistPreferences","_this$get$findBy","panelDefinition","defaultDrawer","panelToStore","_last$expanded","CommandNavService","_commandNavService","INTERACTION_TYPE","validationWaitTime","getAllActiveConversations","communicationType","callNumber","recordOptions","afterCallWorkRequired","hasPlacedCallsInCallback","communicationWrapupSkipped","disconnectCall","getWrapUpCodes","getProvisionalACWNotes","provisional","loadParticipantPerson","getParticipantNotes","currentParticipantId","monitor","attributeToMonitor","expectedValue","requestUri","VALIDATION_INTERVAL","VALIDATION_TIMEOUT","actionHasSucceeded","actualValue","valResolve","destroyObserver","observerAdded","checkForSuccessUpdate","formattedExpectedValues","lowercaseValues","formatExpectedValue","actionSucceeded","createObserver","sessionCodeUrl","toId","fromId","mediaRequestOptions","toCommunicationId","fromCommunicationId","expireSessionShareCode","disconnectMediaType","sendSMSMessage","mediaIds","messagingTemplate","requestOptions","smsIds","deploymentConfigUri","getMessagingSettings","integrationIdConfigUri","createConversationSummaryFeedback","uris","contactList","conversationTimelines","conversationTimeline","sendTimeout","endingTimeout","curateMessage","isPigeon","_addToTimeline","clientTime","pigeonLog","participantObject","itemWithMessage","trace","createTrace","_onSessionAuthenticated","_handleConversationUpdate","initServiceProperties","_loadConversations","getActiveCommunicationsOnConversationForCurrentUser","hasActiveScreenRecording","unloadRecord","getActiveCommunicationsOnConversationForCurrentUserById","conversationsWithActiveScreenRecordingForCurrentUser","CookiesService","copilotBroadcastService","copilotHostSdk","_CopilotHostSDKFactory","CopilotHostSDK","_onHostRouteRequest","_onOpenCopilot","_onHideCopilot","Factory","onHideCopilot","onOpenCopilot","onHostRouteRequest","_destroyCopilotHostSdk","TOPIC_PREFIX","injectService","_trackedData","_handleCustomerIntentChanged","CONTACT_CHANGED_EVENT","_handleExternalContactChanged","CONTACT_MERGED_EVENT","_getExternalContactId","_getTrackedExternalContactIdForModel","trackedData","intentData","interactionModels","_fetchCustomerIntent","_response$entities$","_customerIntent$name","_watchCustomerIntent","_pigeon$get","priorityTopics","_unwatchCustomerIntent","_pigeon$get2","_this2$_getExternalCo","isEmberClass","trackedContactId","isNewSubscription","isNewModel","intentName","removeCustomerIntentListenerForInteractionByContactId","_getParticipantContactIdsForContactChange","changedContactId","_this$get$get","contactCallbackData","_applyCustomerIntentToTrackedModels","eventData","_eventData$contact","participantContactIds","trackedParticipantContactIds","sanitizedLabel","vanillaProfiles","deviceUpdateDelay","deviceChanges","recentlyConnectedDevices","profileSettingsPromise","currentMediaState","_handleMediaStateChange","_updateVolumes","_fetchProfiles","defaultExists","directorySettings","isInitialUpdate","hasMicPermissions","videoDevices","audioDevices","_updateProfileAvailability","_maybeFixSelectedProfile","_updateRecentlyConnectedDevices","_conditionallyShowToastForAddedDevices","matchingCamera","matchingOutputDevice","matchingMicrophone","matchingNotificationDevice","_findMatchingDevice","profileCameraIsNotDefault","selectableProfiles","currentProfile","hasOutputDeviceSupport","profileCamera","profileMic","profileOutputDevice","profileNotificationDevice","cameraValid","outputValid","notificationsValid","profileValid","cameraMatches","micMatches","outputDeviceMatches","notificationDeviceMatches","newDevices","_showNotificationForCurrentProfileNoLongerValid","setDevices","outputDeviceVolumes","notificationDeviceVolumes","_getVolumesForDevice","setCallVolume","volumeSettings","_getActionHandler","profileToSet","createProfile","showOptions","_openPhoneSettingsTab","deviceList","foundDevice","deviceA","_deviceMatches","deviceB","hasSameId","formattedNameA","formattedNameB","hasSameName","addedDevices","filteredSelectableProfiles","cur","yes","no","hasNonDefaultDevices","skipProfileSave","profileObj","settingsService","savedProfile","BACKUP_TYPES","API_URI","directRoutingSettings","ownDirectRoutingSettings","ownQueues","membersOfQueue","canViewOwnSettings","canEditOwnSettings","canDeleteOwnSettings","_ownSettings","ownSettings","_setOwnSettings","_clearOwnSettings","_noopOwnSettings","getEntityForOwnSettings","getBackedUpUsers","_getPrimaryBackup","desiredOwnSettings","_getDirectRoutingUsers","storeIds","resultIds","_getQueues","getOwnQueues","fetchDataWithRecursion","_arguments2","SEARCH_BODY","facetNameRequests","CONTENT_TYPE","currentSegment","hasDocuments","checkedHasDocuments","facetedSearch","searchBody","getSharedDocumentDetails","getDocumentDetails","deleteDocumentShares","checkHasDocuments","getEmergencyLocation","loadUserPrimaryNumber","primaryPhoneObject","softError","hardError","loadELocationEligibility","supported","clearElocation","did","refreshEmergencyLocation","defaultMessage","EmergencyLocationUtil","getErrorString","refreshAllEmergencylocationInfo","errObject","startPolling","pollingIntervalInMinutes","pollCounter","pollingIntervalId","_refreshAllEmergencylocationInfo","setElocation","newAddress","saveElocation","DIRECTORY_ROUTE","ANALYTICS_ROUTE","CM_ROUTE_REGEX","DIRECT_NAV_LINKS","setNavTreeLinkTo","directRegex","agentSchedule","isEngageActive","isEngageInteracting","unreadAlertsCount","navigationRoute","helpURL","ENGAGE_ROOT","localEnv","coreBuild","componentBuilds","componentParams","navEvent","isAnalyticsRoute","changeRoutingStatus","newPresence","isAvailableAndCanReceiveInteractions","selectQueues","notRespondingNotification","noActiveQueuesNotification","canReceiveInteractionsAvailable","isNotResponding","updateOnQueueStatus","handleOnQueue","nonPurecloudSource","getMyQueues","handleNoActiveQueuesNotification","disablePresenceSelector","handleNotRespondingState","outboundEntry","outboundCampaigns","breadcrumbData","checkEnv","TEAMS_LIMIT","USERS_URI","REPORTING_EXPORT_URI","URI_MAP","queue_observations","user_observations","user_aggregates","conversation_aggregates","conversation_details","evaluations_aggregates","flow_aggregates","executeQuery","endpointKey","granularity","intervals","startUtcHours","endUtcHours","isValidInterval","execDisjunctionAggregateQuery","idArr","dimensions","clauses","execAggregateQuery","getConversationAggregates","execConversationQueryV6","getUsers","includeInactive","includeDeleted","userOptions","uniqueIds","getUsersByIds","getTeamsByIds","chunk","team","searchUsersByName","getEvaluationForms","getEvaluationForm","getEvaluationFormVersions","getEvaluationsAggregates","getUserAggregates","getSurveyFormVersions","getSurveyForms","getSurveyFormsByIds","SURVEY_BULK_FORMS_URI","getAgentsActivities","agentUserIds","agentUserId","AGENTS_ACTIVITY_QUERY_URI","scheduleExport","getReportingExports","getAllReportingExports","updateExport","updateExportRun","deleteExportRun","cancelExportRun","getReportingAlerts","updateAlert","patchAlert","getInsightsSettings","getFlowAggregates","TOGGLE_EVENT","TOGGLE_ACTIVE_DRAWER_EVENT","TOGGLE_PANEL_EVENT","eventsService","EventsService","_eventsService","EXPANDED_PARTICIPANT_PURPOSES","oneWay","_handleContactChanged","participantsToExpand","_getContact","generalMessage","errorData","_buildTempInteractionModel","previousContactId","cause","createContactPojo","_watchContactForChanges","_updateTrackedContactsAndTopics","_unwatchContactForChanges","_invokeCallbacks","trackedContactIds","_trackedContacts$obje","trackedIds","staleContact","staleCanonicalId","freshContact","freshCanonicalId","freshCanonicalContact","_callbacks","faviconTag","iconTags","Tinycon","setOptions","abbreviate","crossOrigin","background","setBubble","setImage","_favorites","_rawFavorites","loadFavoritesForSessionPerson","loadFavoritesIntoChatRoster","initFavorites","addRoomToFavorites","promiseHash","getFavorites","setFavorites","_payload","_handleHiddenGroups","_findRoomFavorites","favoriteEntity","unfavoriteEntity","favorite","removeRoomFromFavorites","_ref3$errors","getFavoriteId","favJids","_findRoomFavoritesRecursively","_yield$_this1$ajax$re","recursiveFavJids","loadedIds","_currentUser","faxStatus","receiverDisplayName","internalUserName","_phoneNumber","hasFaxFailed","fileUpload","isSelectingDocument","subcribeToFaxTopic","faxTopic","_debouncedFetchFaxes","removeAfterDisconnect","conversationInActiveFaxes","itemState","itemIsDisconnected","setInternalReceiverAddress","showCompletedNotification","isPurposeFax","_isConversationFax","conversationClone","faxObject","_debouncedRemoveAfterDisconnect","coverSheet","timeZoneOffsetMinutes","utcOffset","getUploadUri","makeUploadRequest","uploadUri","upload","faxUploadWithHeaders","_endpointBaseUrl","_urlMaxLength","_features","_pending","_pendingRequest","_pendingOrgRequest","FEATURE_TOGGLE_OVERRIDES","_overrides","forceRequest","awaitAllRequestedToggles","_batchRequest","wrapPlatformPath","_fetch","allKnownFeatures","failure","fetchFailureReason","half","allResults","currResult","formData","processData","handleFullScreenChange","webkitIsFullScreen","mozFullScreen","msFullscreenElement","_boundHandleFullScreenChange","requestingElem","messengerElement","orgspanApp","elem","requestFullscreen","webkitRequestFullscreen","mozRequestFullScreen","msRequestFullscreen","exitFullscreen","webkitExitFullscreen","mozCancelFullScreen","msExitFullscreen","currentPosition","geoUtil","isEnabled","isSwitchedOn","intervalReference","isStarted","_desktopStart","setContext","_lastReport","lastReport","isGeolocationAvailable","_reportCurrentPosition","resultPosition","fetchCurrentPostion","refreshPublicApiUser","_isPrimary","_onPositionSaved","_onErrorSavingPosition","FULL_URL_REG_EXP","LOCALE_REDIRECT_REGEX","PC_HELP_FQDN","EVENT_NAMES","SHOW_RC_ARTIFACT","OPEN_CONTEXTUAL_HELP","centerStageFrame","generateContextualHelpUrl","previousContext","observeRoutes","getEngineHelp","transformedUrl","evtPayload","relPath","embededArtifactUrl","buildResourceCenterArtifactUrl","externalArtifactUrl","useSimplifiedTheme","requestedRelPath","_ref$useSimplifiedThe","throwBadRelPath","hashIndex","queryIndex","pathSegment","internalMsg","focused","_focusHandler","_blurHandler","teardownFocusListener","learning","cachedVoicemails","coachingTopicRegistered","learningTopicRegistered","exportsPageSize","alertsPageSize","learningTab","hasError","voicemailStandaloneUnreadVoicemails","voicemailStandaloneUnreadGroupVoicemails","cachedGroupVoicemails","faxStandaloneUnreadFaxes","faxSummaryTimers","sortingDesc","learningAssignmentsSortingDesc","wfmNotificationSortingDesc","reportingExportsSortingDesc","reportingAlertsSortingDesc","evaluationsSortingDesc","sortedRecordings","sortedTimeOffRequests","sortedShiftTradeRequests","sortedReportingExports","sortedReportingAlerts","sortedLearningAssignments","sortedEvaluations","sortedAdherenceExplanations","totalVoiceMailPages","legacyUnreadFaxes","isUndefined","isTrusteeOrg","canReceiveExplanationNotifications","loadInbox","loadInboxData","isCoachingEnabled","isLearningAssignmentEnabled","productsToCheck","buildInteractionDetailRoute","handleVoicemailChange","handleRecordingsChange","handleEvaluationsChange","handleFaxChange","handleWfmNotificationChange","handleReportingExportChange","handleReportingAlertChange","handleCoachingAppointmentChange","handleCoachingNotificationChange","handleLearningAssignmentChange","subscribeToV2Topics","reportingExportTopic","streamingPromise","coachingAppointmentTopic","coachingNotificationTopic","learningAssignmentTopic","wfmNotificationsTopic","loadExportExpirationSummary","loadFaxes","loadEvaluations","loadWfmNotifications","loadVoicemailMailbox","loadUserMailbox","userVMUnreads","groupVMUnreads","loadGroupMailbox","updateUnreadVoicemailsFromVoicemailStandalone","allBatches","groupIdBatches","groupMailboxPromises","groupUnreadCounts","groupMailboxEntities","groupUnreadCount","groupUnreadResult","partialSum","clearWfmNotifications","shouldLoadShiftTradeRequests","shouldLoadTimeOffRequests","shouldLoadAdherenceExplanation","shouldLoadNotifications","getLearningAssignments","expandAppointment","coachingUsabilityEnabled","loadCoachingAttendees","attendeeSet","attendeeResponse","voicemailsLoaded","currentPromise","_processVoicemails","shouldLoadVoicemails","_loadVoicemails","metaPageCount","voicemailRecords","hasPageBeenCachedYet","_setVoicemails","updateUnreadFaxFromFaxStandalone","shouldLoadExports","shouldLoadAlerts","successMessage","failureMessage","assignmentIndex","assignmentExists","currentNotifications","coachingNotification","changeType","missingNotifications","apptStart","apptEnd","coachingNotificationIndex","eventObject","appointmentResponse","handleWfmNotificationUpdate","shouldReloadTargetVoicemail","shouldAddNewVoicemail","shouldRemoveVoicemail","shouldMarkVoicemailUnread","shouldMarkVoicemailRead","modifiedByUserId","handleNewVoicemailChange","isGroupVoicemailCached","shouldIncrementUnreadCount","shouldDecrementUnreadCount","createCachedPage","voicemailsData","fetchGroupMailbox","cachedPage1","voicemailEvent","shouldLoadRecordings","latestRecordings","deletedRecording","shouldCheckUnread","shouldCreateFax","shouldRemoveFax","shouldUpdateFax","legacyHandleFaxChange","shouldLoadFaxes","deletedFax","exportIndex","alertIndex","ruleCreatorId","isAlertSummaryAvailable","sendExitingToast","detailPageRoute","alertingEntitiesOnly","generateToast","sendExitingAlarmNotification","recordingIndex","DEFAULT_PHONE_INTEGRATION_KEY","newRelicNamespace","presencePollIntervalSec","presenceIntervalTimers","presenceErrors","presencePollInterval","alreadyTriggeredPresenceInterval","triggerPresenceInterval","presenceUpdateInterval","pollingEnabled","_managePolling","removeAllPresenceIntervals","pollIntervalSec","presenceTimer","_handlePresenceInterval","hasSession","timerKey","removePresenceInterval","updateSessionData","sessionData","fetchedSession","filteredUsers","integrationUsers","integrationUsersIds","batchedIds","authError","_isPresenceStale","_handleBatchPresenceRequest","_handleAuthError","idParams","requestLatest","presenceUserList","presenceResponse","_handleIndividualPresenceResponse","isIntegrationAuthError","hasShownError","groupedUsers","presenceSources","_groupUsersByIntegration","presenceSource","phoneIntegration","usersGroupedByIntegration","HoldableInteractions","webrtcsdk","conversationsSettingsFetchAt","orgLevelConversationsSettings","communicationBasedACW","optimizeOrgFetching","autoAnswerWorkitemRingTimeCache","parkResumeDaysLimitCache","AAHoldingEnabled","typingChats","typingIndicatorForChat","respondingList","typingSms","smsInteraction","canSubscribeToSummary","buttonClass","iconClass","canCreate","iconType","fetchConversationsSettings","fetchAt","shouldFetch","_listenForAutoAnswer","_subscribeToSummaryTopic","_monitorInteractionsWithMissingParticipants","_unsubscribeFromSummaryTopic","panelStateHash","modalActiveTab","showInteractionModal","summaryTopic","cacheKey","cachedValue","getOrganizationLimits","parkResumeLimit","totalDays","_destroyAutoAnswerNotification","_answerInteraction","_declineInteraction","autoAnswerNotification","computeSessionShareConnected","activeRealtimeInteractions","autoAnswerSound","stopAnimateAcdIcon","_delayedStopAcdAnimation","activeConsultingInteractions","activeNonRealtimeInteractions","alertingInteractions","connectedInteractions","hasLiveInteractions","_missingParticipantsMap","prevMissingParticipants","missingParticipantsMap","extractNonCustomerCommunicationData","extractNonCustomerParticipantData","tickCount","communicationData","valueChanged","handleGoingOnQueueTask","setSessionShareConnected","updateOldWrapupCodes","checkDisconnectedChatRooms","disconnectedChats","_automated$skipHoldin","doesCurrentInteractionExist","currentInteractionDismissed","waitForTasks","selectedInteractionType","isCallToCall","_getHoldInteractionTask","_onAutoAnswer","queueAARingTime","autoAnswerToneKey","keepInternalMessageAlive","addServerPrefix","safeString","rtlLangs","INTL_LANGUAGES","localeCookieOptions","expires","IntlService","loadedPromise","baseLocale","_window$navigator","userLanguage","navLocale","updateIntlDateTimeCookieObserver","updateIntlDateTimeCookie","setIntlDateTimeCookie","_ref$duration","_ref$deleteCookie","deleteCookie","_ref$setCookie","setCookie","_setCookie","cookieStmt","generateCookieStatement","_ref2$protocol","_getCurrProtocol","_ref2$domain","getEnvCookieDomain","_ref2$userAgent","_getCurrUserAgent","isSameSiteNoneCompatible","cookie","isRTL","countryData","intlTelInputGlobals","getCountryData","iso2","isoRegionalLocale","_this$isoLocale$split","_this$isoLocale$split2","noEscape","_initialLocale","authLocale","_normalizeLocale","localeRootFallback","rootLocale","getWithServerKey","replacements","suppressError","missingMessage","locales","validLocales","safeLocale","dynamicCookieOptions","secure","sameSite","_loadedResolve","loadLanguage","_cache","addTranslations","setupServerTranslations","defaultRequest","localeRequest","defaultTranslationsResult","localeTranslationsResult","defaultTranslations","localeTranslations","server_translations","hasLearningAssessmentUI","typesParam","_isStarted","_loggers","browserLog","BrowserLog","_registerFrameLoggers","getOriginalLogger","levels","loggers","sizeLimit","buffer","_flushCallback","bypass","INTERNAL_VIDEO_PROVIDER_ID","defaultVideoProviders","activeProvider","createZoomMeetingHandler","createTeamsMeetingHandler","useLocalZoom","zoomCommand","handleLogout","teamsEnabled","teamsCommand","usingVideoProvider","zoomMeetingsEnabled","blockLogoutCb","userHasVideoMediaProviders","setCreateZoomMeetingHandler","removeCreateZoomMeetingHandler","setCreateTeamsMeetingHandler","removeCreateTeamsMeetingHandler","computedFromConfig","hasEmberTether","hasLiquidWormhole","hasLiquidTether","destinationElementId","dataHandler","TYPE_TO_CHAIN_KEY","customerIntentService","headsetService","acdInitializationService","storageService","ringService","soundService","_autoAnswerWorkitemRingTimeCache","_alertingToast","_alertingToastInteraction","_alertingInteractions","_requestedInteractionId","_emailProcessingChain","_messageProcessingChain","_callbackProcessingChain","_callProcessingChain","_partCommIdMap","_blockedCalls","_checkedDeploymentIds","_typingTimers","_callbackModels","_initReadyResolve","_callBacksAnsweredByClient","_initialized","_headsetEventSource","_headsetObserverRegistered","_headsetListenersUseWebrtcSdk","initPromise","deps","contactObservers","triggerAlertingNotification","_handleAlerting","holdExemptIds","emailChain","emailDraftShortCircuit","findOrCreateInteraction","emailFetchDraft","timedWrapupCheck","updateModelState","emailParkedNotification","nonVoiceAlertingRingtone","alertingNotification","externalContactInfo","externalContactListeners","updateRoster","selectRequestedInteraction","holdOnIntake","messageChain","messageRetrieveDetails","messageParkedNotification","messageTakeoverNotification","callbackChain","callbackDualModelCreate","registerCustomerIntent","updateCallbackModels","callbackCustomerIntent","callbackBlockedCallNotification","callbackUpdateModelsList","callbackCleanup","callbackNotifyPropertyChange","callChain","callFilterAndCreate","callExternalContactListeners","callTimedWrapup","callUpdateState","callAlertingRingtone","_registerHeadsetListeners","useWebrtcSdk","_attachHeadsetEventsForSource","_onWebrtcSdkUseSdkChanged","_detachHeadsetEvents","_onHeadsetDeviceMuteStatusChanged","_onHeadsetDeviceHoldStatusChanged","_onHeadsetDeviceEndedCall","_onHeadsetDeviceAnsweredCall","_onHeadsetDeviceRejectedCall","_getHeadsetEventSource","_isModeAlive","_getSelectedCallConversation","_stopVoiceAlerting","_playAutoAnswerTone","_holdIfAAHoldingEnabled","panelVisible","_isAutoAnswerCall","toastInteraction","_showAlertingToast","_retargetOrDismissAlertingToast","_dismissAlertingToast","rawVolume","_model$workitem","cachedRingTime","_playRingTimeOrDefault","_debouncedPlaySound","_pendingSoundService","_pendingSoundVolume","_playDefaultSound","_this$_pendingSoundSe","_this$_pendingSoundVo","_this$get$get2","aaHoldingEnabled","modelId","_payload$normalizedMe","_payload$normalizedMe2","_addTypingIndicator","_payload$normalizedMe3","_payload$normalizedMe4","_payload$normalizedMe5","_payload$normalizedMe6","_payload$normalizedMe7","_hasTypingConfigForId","_result$configuration","_result$configuration2","_result$configuration3","_result$configuration4","isTypingEnabled","_setTypingIndicatorConfig","_payload$normalizedMe8","_payload$normalizedMe9","_payload$normalizedMe0","_payload$normalizedMe1","existingIdx","removeTypingIndicator","resolveConversationType","_options$payload2","chainKey","_options$payload","consumeRequestedInteractionSelection","_chainKeys","_resolveInitReadyIfPending","callbackModels","answeredByClient","_callbackAutoAnswerTrigger","notifyCallbackAutoAnswerChange","trackCallbackAnsweredByClient","_stopDigitalAlerting","_notifyInteractionActionError","_errorKeys$type","fetchAllByType","interapptionModes","selectionMode","singleItemMap","expectedContexts","expectedType","CUSTOM_MAINSTAGE_MODE_IDS","MODE_ID_TO_INTERACTION_TYPE","_persistentDefaults","_ephemeral","_currentLayout","DEFAULT_MAINSTAGE_LAYOUT","currentCollapsed","_loadPersistentDefaults","_registerSelectionHandlers","MAINSTAGE_PREFERENCE_NAMESPACE","_onSelectionCommitted","_resolveEphemeralLayout","ephemeralMainstageKey","persistentDefaults","_applyUserChange","_cache$get","persistentMainstageKey","buildMainstageResizePageAction","LAST_MODE_PREF","_syncModesFromRegistrations","modeRegistrations","factory","ActiveMode","predicate","InactiveMode","HistoryMode","ExternalContactMode","_modes$find","_modes","selectedModeId","_restoreLastSelectedModeFromPreferences","injection","registrations","previousModes","newModes","keptIds","_hasMode","_selectFirstMode","firstMode","createRosterSelectedItem","rosterSelectedItemsEqual","resolveSelectionPayloadType","resolveSelectionHandlerKeys","resolveSelectionHandler","handlersByKey","handlerName","_handlersByKey$key","pendingModeId","_handlersByKey","_queue","_isProcessing","_drainScheduled","handlerKey","isSelectedOrPendingSelection","resolvers","rejecters","_scheduleDrain","_drainQueue","_processRequest","currentSelection","targetSelection","_runHandler","panelComponentName","panelContext","_activePanelKey","_options$panelKey","_options$panelKey2","createConversationModel","createInteractionFromConversation","ModelClass","_sessionService$get","manualRingTime","agentAlertTimeout","hasOtherActiveCalls","modelsToDestroy","buildModel","getCallState","tempInteraction","existingConversation","shouldDestroy","_ctx$payload","consultIds","isBlockedOrError","ALL_BLOCKED_ERROR_CODES","alreadyShown","isBlockedCode","_rosterSelectionServi","callRequiresWrapUp","payloadCopy","tracked","_mostRecentCall$after","_mostRecentCall$after2","_mostRecentCall$after3","participantCalls","afterCallWork","_ctx$prevRaw","_prevAgentParticipant","_prevAgentParticipant2","_ctx$payload2","_newAgentParticipant$","_newAgentParticipant$2","_ctx$payload3","prevParticipants","prevAgentParticipant","prevState","wasDisconnected","newParticipants","newAgentParticipant","isReconnecting","_ctx$payload4","getMessagesFromPayload","getLatestMessageId","latest","seenIds","getSubMessageType","_verifyBeforeFetchingMessageDetails","existingMessages","isNewMessage","_toastNewMessage","_smsDetail$normalized","_smsDetail$normalized2","_smsDetail$normalized3","_smsDetail$normalized4","transitionedToTakeover","hasParkedCommunicationForTransfer","comm","wasCommunicationAlertingInPreviousEvent","commKey","_comms$","_COMM_KEY_MAP$type","isUnparkedViaTransfer","_rosterSelectionServi2","_targets","_options$registerCust","_ModelClass","resolveInteractionModel","selectedPayload","_prevParticipant$call","_prevParticipant$call2","_prevParticipant$call3","prevCallState","agentParticipant","wasAlerting","participantTimeout","metadataSnapshot","activeMode","stateChange","currentLocation","WORKITEM_ACTIVE_STATES","WORKITEM_INACTIVE_STATES","_deps","_ctx$workitemInteract2","_ctx$workitemInteract3","_ctx$workitemInteract4","_ctx$workitemInteract","getInactiveMode","inactiveMode","activeItems","inactiveItems","isInactive","TASK_MANAGEMENT_QUERY_PAGE_SIZE","TASK_MANAGEMENT_QUERY_MAX_PAGES","_activeMode","_inactiveMode","workitemConvert","workitemStoreMerge","workitemAutoAnswer","workitemAlertingRingtone","workitemExternalContact","workitemCustomerIntent","workitemDisconnectNotification","workitemUpdateRoster","selectUnheldWorkitem","holdWorkitemOnIntake","workitemCleanup","changeAssignmentState","fetchByAssignmentStates","_workitem$schema","_workitem$schema2","_fetchAllQueryOptions","queryWorkbins","queryWorktypes","_response$entities2","getStatusesByWorktype","LogLevel","FEATURE_TOGGLE_NAME","MonitoringServiceImpl","INFO","_onFeatureToggleChanged","destroyMonitoring","_this$get$features","initializeWorker","initializeMonitoring","workerScheduler","throttlingMonitor","workerSchedulerInitialized","throttlingMonitorInitialized","WorkerScheduler","maxRetryAttempts","ThrottlingMonitor","windowMs","tickIntervalMs","onWindowSummary","_onWindowSummary","SERVICE_NAME","commonData","timerType","actualTicks","expectedTicks","reportType","cpuHoleDurationMs","nbMissingWindows","ticksDataString","reportTimestamp","_this$get8$features","isFeatureEnabled","enableMonitoring","disableMonitoring","_getNamePart","namePart","_getNames","familyName","givenName","_this$_getNames","givenNameInitial","familyNameInitial","_this$_getNames2","optionalMiddleName","DEFAULTS","getOptions","_trackNotification","isLegacyShowApi","actionHandlerCount","telemetry","hasTag","hasIcon","hasSoundId","hasClickHandler","hasMessageStyle","titleLength","messageLength","ParticipantNameService","_hasMedia","nameFromCall","_getNameForCall","nameFromMessage","_getNameForMessage","nameFromEmail","_getNameForEmail","_fetchNameFromParticipant","externalContactName","_fetchExternalContactName","_fetchUserName","_fetchExternalContactName2","_fetchUserName2","_fetchQueueName","commType","_message$toAddress","_message$fromAddress","addressNormalized","formatter","_call$direction","isPermissionInList","targetList","inList","listItems","checkDonutPermission","permissionValue","allowedOrgPermissions","targetDivision","isAllowed","permissionsToValidate","targetDomain","targetEntity","targetAction","domainPermissionMap","isAllowedOrgPermission","actionSet","matchesEntity","matchesAction","matchesDivision","shouldAllowBasedOnDivision","rolePermissions","trusteeOrg","directoryPermissions","hasSupervisorAccess","validateDirectoryPermission","permissionsList","permissionsSet","canCreateGroups","hasDirectoryPermissions","hasDonutPermission","canDeleteGroups","canInvitePeople","canUseGiphy","canViewTelemetry","canPark","canParkMessage","canViewExternalContactInteractionHistory","canEditQueues","canScreenRecordingParticipate","canRealtimeMonitorScreenParticipate","canViewConversationSettings","canSearchQueue","canViewWrapUpCode","canViewEvaluationForms","canViewSurveyForms","canViewCases","canViewCaseAssociation","canViewQueueObservations","canViewSurveysPerformance","canViewSurveysPerformanceDetail","canViewSkillsPerformance","canViewWrapupPerformance","canViewDnisPerformance","canViewFlowPerformance","canViewFlowAggregates","canViewFlows","canViewInsightConfigurations","canSearchFlows","canViewOutcomePerformance","canViewOutcomes","canViewAgentDevelopment","hasAgentSupervisorAccess","canViewAgentPerformance","canViewAgentPerformanceMe","canViewAgentStatus","canViewAgentWrapup","canViewAgentStatusMe","canViewAgentEvaluations","canViewAgentEvaluationsMe","canViewQueueActivity","canViewAgentQueueActivity","canViewDashboardConfigurations","canEditDashboardConfigurations","canMakePublicDashboards","canViewSkillsAndLanguages","canViewAlerting","canViewAcdScreenShare","canViewAcdCoBrowseForCall","canViewAgentAssistance","canViewAcdCoBrowseForChat","canViewAcdCoBrowseForWebMessaging","canViewAcdCoBrowseV2ForVoice","canViewAcdVideo","canViewAcdVideoForWebMessaging","canViewAgentActivity","isQueuePerformanceWidgetEnabled","canViewQueueMonitoring","canViewBusinessChat","canViewCollaborateVideo","canViewPublishedScripts","canViewAudits","hasAcdVoicemailAccess","hasAcdVoicemailStreamAccess","canViewGroupMailbox","hasEvaluationAggregateAccess","hasSupervisorShiftTradeRequestAccess","hasLearningAssignmentViewAccess","hasCoachingParticipate","hasAgentShiftTradeRequestAccess","hasAgentAdherenceNotifyAccess","hasAgentAlternativeShiftAccess","hasShrinkageViewAccess","hasAgentScheduleAccess","hasAgentScheduleNotificationAccess","hasAgentScheduleSyncAccess","canViewAnAgentsSchedule","canViewAnAgentsScheduleMe","canViewUsers","canEmailOnBehalfOfQueue","canForwardEmail","canSendMessageOnBehalfOfQueue","canViewWebMessaging","hasExternalContactsViewContactAccess","hasExternalContactsAddContactAccess","hasExternalContactsEditContactAccess","hasExternalContactsDeleteContactAccess","hasExternalContactsViewOrganizationAccess","hasExternalContactsAddOrganizationAccess","hasExternalContactsEditOrganizationAccess","hasExternalContactsDeleteOrganizationAccess","hasExternalContactsExternalEntityImportAccess","hasExternalContactsConversationAssociationPrivilege","hasConversationAssociationPrivilege","hasExternalContactsAddSchemaAccess","hasExternalContactsEditSchemaAccess","hasExternalContactsViewSchemaAccess","hasViewEvaluationAccess","hasAdherenceExplanationNotifyAccess","hasAdherenceExplanationViewAccess","hasAdherenceExplanationEditAccess","legacyUnifiedCommunicationsPermission","canCall","canDisassociateSelf","isBusinessUserOrSupervisor","canFax","canDeleteFiles","hasEngageAccess","hasContactCenter","canViewOutboundCampaigns","canSearchOutboundCampaigns","canViewContactLists","canViewAssociateDashboard","hasSavedFilterAccess","canCreateReportingExports","canEditReportingExports","canDeleteReportingExports","canViewStaticLink","canEditReportingAlerts","canEditReportingAlertRules","canDeleteReportingAlerts","canViewSupervisorStatusControls","canEditProfiles","canReadProfiles","canViewGroups","canEditGroups","canEditSkillGroups","canViewOAuthClients","canDeleteParticipantFromGroup","canViewZoomMeetings","canViewTeamsMeetings","canViewJourneyAggregates","canViewActionMaps","canViewTopicTrends","canViewBotAggregates","canViewDirectory","canTargetUserSearchOutsideOfDivision","canTargetQueueSearchOutsideOfDivision","canEditGroupTelephonySettings","hasPredictiveRoutingAccess","canViewIntegrationPresence","canEditOwnDirectRoutingSettings","canViewOwnDirectRoutingSettings","canDeleteOwnDirectRoutingSettings","canViewParkedEmails","canViewJourneyAnalytics","canViewSummary","canViewDirectTransferToVoicemail","canReceiveInteractionsAvailableOffQueue","canViewAgentGreetings","canViewCopilotFrameworkMessage","canSnippetRecord","canTakeoverMessage","allApps","_isValidIntegrationTab","canUseIncludeBadge","onAuthenticated","integrationConfigsInitialized","_fetchConfigs","configs","getIntegrationTabs","canViewThirdPartyPresence","getIntegrationFromSource","addressObj","createMeetingUrl","meeting","allConfigsPromise","_accumulateConfigs","configsUrl","_configs","validConfigObjs","_isValidIntegrationConfig","_mapIntegrationConfig","i10n","badgeIcons","light","dark","clientApp","hasUcIntegrationKey","canViewPbxTab","ActiveCallMixin","CallControlsMixin","CallForwardMixin","ConversationManagerMixin","EventsMixin","PhoneNotificationsMixin","StationMixin","UriBuilderMixin","_callsReadyPromise","_callsReadyResolve","currentCallHistory","_getCallState","_isInteractionActive","participantState","currConversation","losingCandidate","fetchActiveCallConversations","hasAppropriateStreamingConnection","logObject","table","isShowCallControlsViewOpen","showFloatingCalls","callPanelClosed","activeAcdCallState","hasIncomingNonAcdCalls","alertingCall","isAlertingCallACD","_loadEmergencyNumberPlans","plan","numberRange","bootstrapPurecloudApiOnAuth","delayedNotification","handleMuteParticipants","selectedUserUserId","voicemailPolicy","vmAdressString","isAny","eventFromTopic","_registerUserSessionTopicsV","_registerUserSessionTopicsWithPriorityV","topicKeepAlive","registerDebounce","customTopicNames","registerTopicsDebouncePeriod","checkForCarrierPigeonDelayPeriod","checkingCarrierPigeonSubscription","carrierPigeonExpiration","shortInterval","v2","sortedTopics","topicA","topicB","getTopicPriority","subscribeUrl","checkLastConnectionTimeHandler","checkLastConnectionTime","intervalValue","lastCarrierPigeonSubscription","customName","immediatelyRegisterPriorityTopics","customNames","registerTopic","unRegisterTopic","_observeTopics","_checkLastConnectionTimeHandler","keptTopics","kept","droppedTopics","truncateTopics","_registerUserSessionTopicsV2","_registerUserSessionTopics","triggerTopicEvent","carrierPigeonTopic","onMessage","ININ-Session","userTopics","requestedTopicsLength","cpConnected","_makeAjaxRequest","subscribedTopicsLength","subscribedUserTopics","unexpectedOrMissingUserTopics","xor","resolvePromise","rejectPromise","XMLHttpRequest","responseType","rej","onabort","_registerUserSessionTopicsWithPriorityV2","allPriorities","_args2","bulkSubscribe","isConnectionConnecting","carrierPigeonSubscribed","carrierPigeonMessage","streamingClientMessage","onV2Disconnect","_handlers","PIGEON_MAX_PRIORITY","lastPart","_subscribeTopic","_unsubscribeTopic","_message$eventBody","messageTopic","_handleTopicMessage","handlerInfo","DELEGATES","WeakMap","EVENT_FORWARDING_SETUP","WeakSet","_getDelegate","delegate","_setDelegate","delegator","originalTrigger","setupEventForwarding","_options$features","usePigeonV2","_this$_getDelegate","_this$_getDelegate2","_this$_getDelegate3","_this$_getDelegate4","_this$_getDelegate5","_this$_getDelegate6","_this$_getDelegate7","_this$_getDelegate8","_this$_getDelegate9","_this$_getDelegate0","_this$_getDelegate1","_DELEGATES$get","setUnknownProperty","_DELEGATES$get2","namespaces","syncEnabled","deferredPersistRequests","settingsPath","registerNamespaces","_initializeNamespace","_waitForAccessToken","_enableService","_disableService","_getPreference","persist","_setPreference","namespaceDelimiter","keyPath","previousSet","persistPreferences","currentNamespaceObject","pendingSet","_isNotDead","_enableSync","settingsUrl","preferencesToSync","_saveSettingsFromServer","profileSyncSupport","userPreferences","allLocalPreferences","retryAfterSave","savePromise","eventMap","trackedGuids","integrationpresence","subscribeToMyself","_getPresenceDefinition","testValue","_getTopicsForUser","_guidFromTopicName","refreshPeopleActivityState","watchAuthForSubscribe","bulkSubscribeToPresence","callbackKey","previousCallback","newCallback","isConflictError","_alertDeletedPresence","removeDeletedPresence","doUserPresenceStatusChanged","statusUpdate","isSourceOnUsableList","existingPresenceIndex","existingPresenceObj","presenceListStored","checkRequestingOffQueue","doUserPrimaryPresenceSourceChanged","newSource","isThirdPartySource","handleIntegrationPresenceEvent","presenceEvent","availablePresence","startOfTime","endOfTime","rightAboutMeow","handleRoutingStatusError","incomingPresenceEvent","conversationSummaryEvent","outOfOfficeEvent","outOfOfficeDef","routingStatusEvent","primaryPresenceEvent","geolocationEvent","_mapping","systemPresences","AVAILABLE","AWAY","BREAK","MEAL","TRAINING","ON_QUEUE","presenceDefinitions","outOfBandPresenceDefinitions","allPresences","allSecondaryPresences","allActivePresences","Presence","secondaryPresenceDefinitions","loadPresences","definitions","loadAllPresenceDefinitions","definitionIds","currentId","loadPresenceDefinitions","handlePresenceData","presenceTimeout","TimeoutPromise","localizePresenceString","online","not_responding","meal","training","break","getPresenceMappings","presenceStrFormatted","isPresenceOnQueue","rawPresence","mapHasPresence","mapHasSystemPresence","getPresenceFallback","localizePresence","languageLabel","matchingPrimaryPresence","selectPresence","setUsersStatus","logoffUser","tokensUrl","disassociateUserFromStation","stationUrl","_restoreState","inLogoutBounce","_isInLogoutBounce","_clearLogoutTime","baseLocation","searchString","internalRoute","prunedStateParamValue","firstChar","s3SafePathname","parsedStateParam","finalSearch","finalHash","cookieOptions","lastLogout","selectPhoneNotification","hasStation","popObject","BRIEF_URI","_validateDefaultQueue","clearDefaultQueue","validQueues","getQueues","doExactNameSearch","_buildQueueRequests","getQueuesBrief","resultsString","nameSearchString","isQueueIds","isDivisionIds","getQueueByUri","getWrapupCodes","updateUsers","updateUser","updateUserJoinedQueues","getAllUsers","getUserQueues","getAgentStatus","showSecondaryPresence","presenceOnly","routingStatusOnly","intlStatus","tis","timeInStatus","enStatusKey","getAgentEntities","getAgentInteractionCount","acw","RELATE_FRAME_ID","DEFAULT_ROUTE_MAP","relate-engine","organizations","edit","VERIFICATION_RELEVANT_DATA_MESSAGE","CONTACTS_ENDPOINT","CONVERSATIONS_ENDPOINT","REGISTER_SIDEBAR_STATE","sidebarState","EXTERNAL_CONTACT","CHANNEL_MODEL_TYPE","adapterCache","isRelateActive","relateFrameOrigin","profileVerificationEventName","onChangeInteraction","contactAssociationMap","contactDisassociationMap","interactionAssociatedContacts","interactionDisassociatedContacts","updateRelateFrame","hasSelectedInteraction","underscore","communicationPanelOpen","registerSidebarState","postVerificationRelevantDataV2","contextHelpUrls","associateConversationWithInteraction","verificationInteractionData","displayNotification","processFrameVerificationEvent","isClosedInteraction","relateIframe","associatedContacts","hasActiveAssociation","verified","wasAutoVerified","isVerified","activeProfileIsVerified","queryData","siz","ord","ringtoneIds","_playRingtoneTimeout","_ringing","phoneRingtoneSoundId","isPhoneRingtone","ignoreHeadset","ringerOutputDeviceId","interactionVolume","playDigitalRingtone","_timeoutSoundIncomingConversationRing","STOPPED_RINGING","callsLeft","soundObjects","logMsg","initRingerVolume","createRingtones","_ringerVolume","_interactionVolume","_callActiveRingerVolume","requiredPoolSize","html5PoolSize","ringtoneOptions","ringtoneNumber","browserRollingLog","BrowserRollingLog","addLoggers","_gatherLoggers","useMemoryStorage","chunks","_getChunkSize","_chunkMessages","clearMessages","currentChunk","itemSize","BadgeTrackingMixin","allRoomsInRoster","allRoomsWithMentionsOrUnseen","personUnseens","groupMentions","groupUnseens","roomHasMentions","roomHasUnseens","unseenPersonalMessages","unseenGroupMessages","unseenAdhocMessages","unseenGroupFavoritesMessages","favoriteGroups","unseenPersonalFavoritesMessages","personalFavorites","allUnseenGroupMessages","allUnseenDirectMessages","addRoomToClosed","reestablishPresenceToStreamingService","activatedRooms","recursivelyReactivateRooms","choice","getFirstNonDuplicateFromRoster","_wrapNativeSuper","Function","_isNativeFunction","Wrapper","_construct","BrowserScreenRecordingError","_Error","ScreenMediaService","_this$_getHostedConte","_getHostedContext","_isHosted","_debugScreenRecordingInBrowser2","_getMediaStreamWithAllMonitors","_stream","_track$getSettings","metadatas","_track","createMediaStream","_getVideoTrackForScreenId","_this$session$feature","_setupMonitorEvents","_screenMonitorStarted","_screenMonitorStopped","screenMonitorFtEnabled","gcbaVersionTimeoutMs","resetIntervalMs","recordingRetries","authenticatedGcba","authenticatedGcbaThroughExtension","gcbaAuthenticationRetryPeriodSeconds","_authRetryTimer","_versionTimeoutTimers","_retryResetTimers","_updateRecordingRetries","retryInfo","previousResetTimeout","warned","resetTimeout","_authenticateGcbaWithRetry","authPromise","authDeferred","retryPeriod","screenRecordingThroughExtension","_authenticateGcbaThroughExtension","_authenticateGcba","_doubleRetryPeriod","currentPeriod","gcbaId","jwt","_getGcbaId","_getJwtToken","_passJwtToken","_schedulePingingGcba","_getGcbaIdThroughExtension","_passJwtTokenThroughExtension","_sendMessageToExtension","_getGcbaVersion","timeoutTimer","versionPromise","_getGcbaVersionThroughExtension","_shouldUseNewTokenEndpoint","gcbaVersion","minor","_shouldScreenRecordWithGcba","useNewEndpoint","_t1","backgroundAssistantId","_getEnvironment","_getDomain","jwtToken","_t10","_t11","_logoutGcba","_t12","_logoutGcbaThroughExtension","_t13","_pingGcbaThroughExtension","GCBA_PING_INTERVAL_SECONDS","_pingGcba","_t14","_t15","_t16","_handleAuthChange","isSessionAuthenticated","shouldLogout","usingExtension","_handleExtensionAuth","_handleLoopbackAuth","_detectExtension","_t17","extensionReady","isAuthenticatedViaExtension","isAuthenticatedViaLoopback","_hasRequiredPermissionsForVersion","hasScreenRecordingPermission","hasRealtimeMonitorPermission","_fetchGcbaVersion","isEdge","iframedFn","isIframed","_gcbaConditionsLogged","_versionCheckPromise","EsaSessionService","dataStore","_bootstrapAccessToken","lastLoginDateFormatted","lastLoginDate","roleNames","readWritePermissionsDeferred","enabledFeatures","authInProgress","logoutInProgress","singleSignOutInProgress","blockers","_timeAuthenticated","_bootstrapPromise","hasAppAccess","hasDirectoryUserViewPermission","hasPermissionAndDivision","hasDivisions","regEx","isPermission","isPermissionWithDivisions","permissionDivisions","foundPermission","useModes","allowCreateWorkitemOutbound","useGCMFEAuth","cachedUseGCMFEAuth","ftUseGCMFEAuth","updateAccountSwitcherVisibility","_accountSwitcherVisibilityObserver","isTaskRunning","rewriteRootAPIRequests","createFieldConfigs","createPresences","loadAllowedOrgPermissions","loadOrgProducts","getOrganizationTranscriptSettings","transcriptSettings","settingsUri","forceDirectory","executeChain","stepDesc","getFeatures","processSync","trusteeBootstrap","establishSession","setupCarrierPigeon","updateAppSession","getPreferences","loggingConfig","logMsgPrefix","isChainStepFailure","origReason","legacyErrorCode","telemetryContext","loggableRequestFailureDetails","getLoggableRequestFailureDetails","requestFailureDetails","isAccessDeniedDueToPolicy","setServerTimeOffset","setupStoreData","groupAdapterOptions","onLegacySessionInvalidation","LOGOUT_PROMISE_PROP_NAME","logoutPromise","addRemoveBlockers","invalidatingSdkOrVolt","logoutSinceUnauthorized","sdkActiveSessions","getAllActiveSessions","sessionType","hasVoltSession","setObjects","cookieProxyPerson","shouldReload","superPerson","forceUpdate","v1Toggles","v1WhiteList","t0","serverDate","t1","t2","t3","clientSystemTimeSuspect","serverTimet1","clientTimet3","clientTimet0","offsetCalculated","subscription","channelId","xhrFields","withCredentials","baseExpands","oldPassword","_setupSessionInvalidationFailed","_forwardSessionInvalidationFailedEvent","_teardownSessionInvalidationFailed","reloadPerson","updatedEntityJid","foundPerson","_isDesktop","_isDesktopUnifiedPreferences","supportsUnifiedPreferences","canShowChatPreference","canShowAgentGreeting","canShowGeneralPreference","canShowPasswordPreference","canShowNotificationsPreference","isIE","isDesktop","isUnified","canShowVoiceMailPinPreference","canShowDirectRoutingPreference","_commonPreferenceComponents","direct_routing","agent_greeting","commonPreferences","components","canShow","commonPreferencesSortOrder","customPreferences","addPreference","existingPreference","newPreference","removePreference","otherPreferences","openChatPreference","openGeneralPreference","openLanguagePreference","openNotificationsPreference","openPasswordPreference","openVideoPreference","openVoiceMailPinPreference","getUserVoicemailEmailNotification","_yield$_this2$ajax$aj","setUserVoicemailEmailNotification","panelClasses","_restoredCommunicationPanel","communicationPanel","_appsUsageCount","allowedPopoutPanels","panelExpandedState","_widgetApps","_widgetAppsFailureReason","_widgetAppsAttentionCount","listViewActionHandler","activateListView","firstLoadOfAcdInteractions","substates","callControls","_loadStateFromPreferences","_addWindowResize","acdInteractions","agentAssistance","workitemsList","listView","addListenerForNoopTransitions","resizeDebounceTimer","hasActiveWorkitems","hasActiveWorkitemsWithFT","deferAppsDisplay","restrictSidebar","showAgentAssistance","showContactsInbox","showConversations","showNotificationInbox","showUser","showWebrtc","showAcdInteractions","showMeetings","showHelp","showWorkitemsList","showListView","communicationOffset","appPanelGeneralOffset","showApps","enableApps","sidebarCollapsed","enableAgentAssistance","enableInteractions","enableWorkitems","enableParkedConversations","restoredPanel","_isAppPanel","visibleChatRoom","saveSidebarStateToPreferences","isExpandable","subStatePanel","prevExpanded","_instrumentSidebarPanel","newExpanded","minimizeCommunicationSidebar","checkThresholds","registerListViewActionHandler","instrumentCall","currExpanded","setCommunicationSidebarState","isWorkitemsListPanel","isListViewPanel","_isBelowWidthThreshold","panelExpanded","_isBelowMobileThreshold","sidebarChangeType","additionalData","sidebarData","currPanel","currRouteName","interactionData","totalInteractionCount","propName","phoneRinging","digitalRinging","digitalSoundId","initSounds","maybeLog","_this$logger","handleForceStopRinging","_src","shouldHandleDigital","shouldHandlePhone","isRingtone","onStop","createSound","extraOptions","embeddedMute","ringtoneSelectionId","GLOBAL_ERROR","SILENCED_ERRORS","lengthInUtf8Bytes","MAX_INTERNAL_LOG_ITEMS","logCounts","failureCount","_originalLogger","conversationTimelineLogger","ExponentialIntervalGenerator","resetLogLimit","serverLevel","propertyToMatch","restrictedTypeConverter","sidebarPanel","timeSinceLogin","fullTypeConverter","logItem","itemToLog","_restrictTraceData","clientSessionId","allowedKeys","_itemToLog","keyFilter","extractRawData","_coerceToExtractable","maxDepth","_augmentSensitiveData","finalLogItem","wrappedSensitive","logOption","defaultAnswer","itemLogIndex","_isSilencedError","checkForSilence","SILENCED","silencedByStringMatch","silencedByRegex","silencedByMatcher","logResult","silencedError","skipSumoSend","_this$conversationTim","serverLogLevelIndex","logServer","logLocal","shiftObject","decreaseLogLimit","currentLimit","maxTracesByteLength","getTracesToLog","toLog","totalLogSize","logSize","saveLogs","_saveLogsTask","toSend","sendLogTraces","_resetLogsOnSuccessfulSave","exponentialBackoff","backOffTask","getInterval","StorageServiceImpl","memoryStorage","batches","ApplicationStore","Store","SearchStoreMixin","applicationAdapter","promiseLabel","latestCalls","batchLimit","mapLimit","bulkResults","didSaveRecord","internalModel","recordInfo","isSaving","updateGroup","connectOnLoad","connectionPromise","connectedV2","realtimePromise","v2Deferred","v2Connecting","useV2Only","pubsubV2","disableStreamingConnection","subscribers","inviteQueue","streamingClientInstance","_eventHandlers","connectionV2","getDefaultOptions","carrierPigeon","fetchGroupsOnConnect","fetchRosterOnConnect","focusV2","jidResource","jidRouting","offlineJoinNotifications","rawMessageIds","recentlyClosed","roomsV2","rtcLastN","rtcSessionSurvivability","addAllSubscriptions","authKey","socket","keepTryingOnFailure","subscriber","unsubscribeFromConnection","unsubscribeListeners","subscribeListeners","_subscribeV2Event","eventHandler","_cacheEvent","_unsubscribeV2Event","_setAPIStatus","_setRealtimeStatus","setInactive","inviteQueueRunning","_processInviteQueue","_getEnvDetails","_createStreamingClientInstance","connectionOptions","hawkJidResource","apiHost","streamingServiceApiUri","sc","constructStreamingClient","StreamingClient","_connectStreamingClient","scInstance","setMediaHandling","_loadRealtime","realtimeScript","Realtime","getElementsByTagName","realtime","makeWorkitemRequest","assignmentOperation","getWorktypeById","getWorkbinById","getStatusByIds","cachedEvents","sortedEvents","eventKey","renderer","roomMessages","roomEvent","callv2","missedCalls","callEvent","segmentEnd","eventId","freeTrialInfo","inActiveFreeTrial","showTrialSupportCenter","loadFreeTrialInfo","isTrialActive","trialInfo","daysRemaining","_onPigeonDisconnect","_onVideoConferenceDetailsUpdate","_subscribedConference","_subscribedConference2","activeParticipantCount","conferenceIndex","existingConference","conferenceDetails","_topicForConferenceId","_fetchConferenceDetails","newLength","conferenceToUnregister","conferenceDetailsPath","conferenceDetailsUrl","newConferenceDetails","existingConferenceDetails","_fetchConferenceDetails2","_newConferenceDetails","_newConferenceDetails2","_existingConferenceDe","_existingConferenceDe2","newVersion","existingVersion","resetConferences","userPart","audioElement","webrtcActiveRoom","isShowingVideo","shouldPopout","voltConference","voltOneToOne","Audio","addChatCommands","observerAddChatCommands","conferenceLink","createVideoConferenceLink","_generateOneToOneConferenceId","chatRoomJid","buildConferenceLinkUrl","userParts","sortedUsers","peerRoomJid","screenMedia","initService","isPersistentConnection","useNewPolyImplementation","useWebHidOnDesktopCyberAcoustics","useWebHidOnDesktopJabra","useWebHidOnDesktopVbet","useWebHidOnDesktopYealink","relevantFeatureTogglesFetched","necessaryFeatureToggles","featureToggleStates","phoneIncomingConversations","settingsPromise","initSdk","showPersistentFailureToasts","_sdkSoftphoneChange","_sdk$_config$allowedS","sdk","softphoneViaSdk","isCurrentlyEnabled","allowedSessionTypes","SessionTypes","softphone","addAllowedSessionType","removeAllowedSessionType","_settings$generalSett","_settings$generalSett2","_settings$generalSett3","_settings$generalSett4","_settings$generalSett5","_settings$generalSett6","currentToken","screenRecording","liveScreenMonitoring","collaborateVideo","GenesysCloudWebrtcSdk","disableAutoAnswer","autoAcceptPendingScreenRecordingRequests","autoAcceptPendingLiveScreenMonitoringRequests","useHeadsets","micAutoGainControl","generalSettings","micEchoCancellation","micNoiseSuppression","_handlePendingSession","_handleSessionStarted","_handleSessionEnded","_handleCancelPendingSession","_handleStationUpdate","_handleConversationsUpdate","_handleSdkError","_handleSettingsChanged","sdkVersion","VERSION","MediaHandling","reducedMedia","requestMediaPermissions","headsetEvents$","_inboundAcdCallsToAutoAnswer","pendingSessionAutoAnswer","_bargeCoachMonitorAutoAnswer","mySelfIsMonitorCoachBarge","_callbackCallsToAutoAnswer","_softphoneConversationsToAutoAnswer","logChangedAutoAnswerProps","simplifiedPendingSessions","simplifiedConversations","newPendingSessions","differenceWith","removedPendingSessions","newConversations","removedConversations","newAutoAnswerProps","_autoAnswerSoftphone","pendingSoftphoneSessions","sessionsToAccept","pendingSoftphoneSessionConversationIds","allPendingSessionTypes","_getSessionIdFromConversationId","micPermissionsRequested","displayLabel","_handleVideoPendingSession","_pendingSession$fromJ","videoInvitation","cancelledVideoInvitation","storedSessionId","remainingVideoInvitations","remainingPendingSessions","isScreenRecordingSession","_initializeScreenRecordingSession","isLiveScreenMonitoringSession","isObserver","_initializeLiveScreenMonitoringSession","_pollForActiveSoftphoneSession","hasActiveSession","_checkHasActiveSoftphoneSession","sdkError","_sdkError$details","SdkErrorTypes","_sdkError$details2","persistentState","_sdkError$details3","advMicSettings","sdkDefaults","updatedSettings","updateDefaultMediaSettings","updateActiveSessions","softphoneSessions","sessionManager","screenRecordingSession","_yield$_this0$get$get","getMediaStreamWithAllMonitors","screenRecordingMetadatas","mediaStream","liveScreenMonitoringSession","_yield$_this1$get$get","startParams","videoDeviceId","audioDeviceId","updateAudioVolume","findRemainingSessionsBasedOnParams","rejectPendingSession","matchesRequestedSessionType","endSession","endSessionParams","setAudioMute","heldOptions","setConversationHeld","forceTerminateSession","urlSearch","urlHash","disableParam","remainingInvitations","inv","defaultGeneralSettings","defaultDirectorySettings","alwaysPopoutVideo","userSettingsPromise","failedSettingsFetch","_fetchSettingsPromise","_updatePromise","_fetchSettings","_checkAndFixSettings","_updateSettings","_registerSettings","reallyWaitForToken","forceRefresh","retryOnFail","_settings","tokenGate","existingPromise","_this5$get","settingPath","pieces","topLevelKey","piece","WebrtcEvents","WebrtcMedia","WebrtcNotificationsMixin","WebrtcDebugger","WebrtcConversationManager","WebrtcStats","DeviceEnumerationMixin","_rtcPeerConnectionHasTrackFunctionality","activeBridge","roomFull","webrtcTroubleshooterCall","_hasTransceiverFunctionality","rtcPeerConnection","isScreenShareOverHawk","hasFunctionality","maxCapacity","DtlsSrtpKeyAgreement","RTPDataChannels","andyetFasterIce","googImprovedWifiBwe","googDscp","googSuspendBelowMinBitrate","googScreencastMinBitrate","googCombinedAudioVideoBwe","googCpuOveruseDetection","googCpuOveruseEncodeUsage","googCpuUnderuseThreshold","googCpuOverUseThreshold","initModelCache","_timeoutTurnServers","componentToUse","_onV2InitialConnection","canGetIceServers","serverCopy","triggerWebrtcDump","problemDesc","sendLog","facility","diagRequest","troubleshootingLog","requestDetailedStateDump","requestStateDump","sessionTimeouts","canConference","canUseWebrtcSoftphone","joinVideo","leaveVideo","showTrackRemovedNotification","trackOwner","notifyOfMute","muterName","WEBRTC_CONNECTION_ENDED","hangupNotification","failedTime","getAddon","_hashValue","hasher","Hashes","SHA256","salt","hex_hmac","_repairRoomPresences","updatePhoneAndNotificationVolumes","notificationOutputDevice","phoneOutputVolumesPromise","_getOutputDeviceVolumePreferences","notificationOutputVolumesPromise","phoneOutputDeviceVolumes","notificationOutputDeviceVolumes","updateChatVolumes","updatePhoneVolumes","_updateStationIceServersSettings","_createNetworkProbe","WebrtcTroubleshooter","SymmetricNatTest","_lastProbe","setIceTransportPolicy","lastProbe","relayOnly","iceFailure","emit","userMap","maxNotificationCount","isRouteChanged","explanationJobs","currentUrlObserver","registerExplanationJobTopic","unRegisterExplanationJobTopic","uid","usersToCache","shiftTradeNotifications","timeOffNotifications","explanationNotifications","processTimeOffNotification","canViewAlternativeShiftTradeNotification","processShiftTradeNotification","processExplanationNotification","processNotificationResult","updateNotificationGroupId","torId","timeOffRequestId","shiftTradeId","tradeId","weekDate","doCacheUser","WfmNotificationModel","initiatingUser","receivingUser","returnResult","findRequestByNotificationId","requests","existingShiftTradeRequest","existingTimeOffRequest","existingExplanationRequest","explanationId","scheduleInfo","loadSchedule","getScheduleInfo","buId","businessUnit","lengthMinutes","schedules","_schedules$agentSched","agentSchedules","_agentSchedule$shifts","publishedSchedules","_schedules$publishedS","publishedSchedule","getExplanationJobTopic","handleExplanationJobEvent","canViewNotification","CURRENT_PROP","BaseStore","EphemeralStore","legacyStorageKey","storageKey","AdaptiveStore","currEnvDetails","LocalStorageStore","storeProps","localStorageKey","cookieName","cookieExpirationTime","clearClientToken","updateLegacyStorage","manageLegacyToken","migrateFromLegacyStorage","legacyJson","currentJson","readAuthToken","storedJson","Transform","deserialize","deserialized","validToggle1","validToggle2","validToggle3","v1Toggle","v2Toggle","isInArray","isV1InArray","isV2InArray","v2Toggles","atlasToggle","pureToggle","aiToggle","aceToggle","wemToggle","uiToggle","allToggles","toggleKeys","v1Keys","platformToggle","v2Keys","_maybe","_conversation","_mediaChannels$","getCommunicationMediaChannelArray","COMMUNICATION_TYPE_SINGULAR","contactJSON","derived","hasMultipleCustomers","isCallOrCallbackOrEmail","communications","customerEndTime","lastParticipantEndTime","participantsArr","nonScreenMonitorUserParticipant","liveAcd","_isParticipantActive","sortedLiveAcd","_compareParticipantsByVoiceRecency","_isCurrentUserQueueToQueueInitiator","purposeDiff","stateDiff","_callStateScoreForQueueToQueue","peerAgents","sortedPeers","sortedAcd","_pickInitiatorQueueToQueueParticipant","otherAgents","_pickReceiverPeerAgent","interactionMetadata","metadataClone","mediaRoles","_voiceParticipantConnectedAtMs","fromCall","fromParticipant","_voiceParticipantEndedAtMs","connectedAtDiff","endedAtDiff","screenMonitoredParticipantId","screenMonitorings","CONNECTING","OFFERING","_cleanupAfterWrapupGadgetSubmit","removeAgentAssistSummaryFromLocalStorage","agentAssistSummaryData","agentAssistSummaryFromLocalStorage","removeAssistantState","extraHeaders","genesysAppName","AddressFormatResult","originalAddress","telParts","telNumber","INTERNATIONAL","jidMatch","phoneNumberMatch","queueIdMatch","queryParamSegments","keyValuePair","queryParamString","interactionDetailPath","_buildProviderComputed","providerInstance","currDependencies","_curr$value$split","_curr$value$split2","valueTag","portToValidate","defaultPort","portInt","_workerInstance","userVisible","validationChecks","invalidReason","validateRenderedInstance","invalidReasons","validations","_validations","validationConfig","reasons","LOG_ROOT_NAMESPACE","LOG_STANDALONE_APP_NAMESPACE","LOG_API_NAMESPACE","LOG_INTERAPPTIONS_NAMESPACE","LOG_COPILOT_FRAMEWORK_NAMESPACE","subNamespaces","currNamespace","_len2","_len3","_key3","_len4","_key4","logDetails","mask","asset","RASTER_PROP_PATTERN","rasterEntries","currProp","currRasterProp","currRasterValue","_images$","autoplay","disableContextMenu","oncontextmenu","styleName","LOCALHOST_HOSTNAME","LOCALHOST_PORT","LOCALHOST_REGION","USE_GC_MFE_AUTH_KEY","symbolEvaluator","symbolMap","identifiers","currIdentifier","ns","variable","nsSymbolEvaluator","expressionBuilder","mimeTypes","mp3","wav","probeAudioTypeCompatibilityFrom","suggested","browserama","mimeTypeKeys","mimeTypeValues","shouldInstallWebM","suggestedAudioType","desiredFormats","desiredMimeTypes","formatToAudioMimeType","suggestedMimeType","mimeTypeToFormat","whitespace","nonAlpha","classValue","startVideoConference","toggleShowingVideo","desktopWakeUp","desktopAsleep","clientInitialized","closeMainWindowVideo","_menuItem$subMenu","secondarySubMenuItem","countMatchingSegments","segments1","segments2","matchingSegments","minLength","menuItems","hashSegments","bestMatch","maxMatchingSegments","linkSegments","matching","altLinkSegments","altSegments","pageHash","menuMap","matchedMenuItem","dateTime","displayedDate","dateStyle","displayedTime","timeStyle","rawDate","today","formatString","_decideFormat","intervalStr","currentLocale","defineLocale","parentLocale","updateLocale","longDateFormat","LT","LTS","L","LLL","LLLL","lll","llll","months","_setTimeout","executeAt","secondsToPop","secondsFromNow","backburnerDebug","showTimersSecs","_backburnerDebugTimeoutFn","timesList","describeTimerCallback","timeMillis","methodName","configure","promiseMap","promiseList","sourceEntity","sourceCountry","displayGeolocation","splitOnSpacesOrComma","emailStr","supportSingleDomain","defaultEmailRe","singleDomainSupportRe","emailRe","emailAddresses","API_ERROR_MESSAGES","emojify","emojifyStringUnicode","htmlString","emoji","span","markdown","emojiNames","namedEmoji","setConfig","tag_type","only_crawl_id","img_dir","elements","MULTI_ENTITY_FIELDS","escapedString","theString","HTMLChars","char","literal_string","escaped","maxInterval","baselineInterval","_failures","_baselineInterval","_maxAdditionalInterval","expInterval","generatedMaxInterval","KNOWN_INBOUND_MESSAGE_SUBTYPES","getMessengerType","messengerType","messagingChannelType","messagingChannelTypes","mct","isNewId","getIdsFromExternalContact","freshContactSnapshot","channelRecord","_getChannelRecordInfo","interactionChannel","getInteractionChannel","getMessageChannelType","interactionChannelProperties","idAttribute","idOrIDs","getChannelRecordInfo","numberOfChanges","idPropertyName","setNewValuesInChannelRecord","channelRecordType","messagingChannelTypeFor","modelProperties","channelData","recordProp","USER_ID","getIdFrom","contactChannelIds","notExcluded","CHANNEL_RECORD_PROPERTIES","I18N_INFO","updateChannelInfoPrompt","updateChannelInfoPromptPlural","updateAllChannelInfoPrompt","newChannelPrompt","pleaseWaitForFullContactInfo","propertyChanged","ID","IDS","getIdentifier","getReverseWhitepagesLookupValue","getDisplayableName","displayOrScreenName","getDisplayOrScreenName","contactChannelIdValues","interactionIdValues","addedIds","newIdValues","idVal","addOrReplaceIdsInChannelRecord","_isSafeToFocus","Element","jqueryPseudoMatch","jqueryLastMatch","_queryElement","isSafe","pendingAuth","clearRequested","chainedPromise","suffix","semverParseResult","SEMVER_PARSER","_semverParseResult","pkgVersion","gitBranch","gitCommit","GeolocationUtil","supportsWindowsNativeGeolocation","requiresNativeGeolocation","getCurrentPosition","watchPosition","onPositionChangedFn","onErrorFn","clearWatch","watcher","getVisibleListItems","popoverElement","tryFocus","_popoverElement$shado","_applicationHasFocus","_hostType","_operatingSystem","_version","_hostRegion","_supportsRegions","_supportsUnifiedPreferences","_supportsJabra","_supportsWebHID","_additionalPreferences","_debouncedSetIdle","_lastStreamingConnection","setIdle","_lastIdleValue","_requiresNativeGeolocation","_supportsActionableNotifications","_supportsWindowsNativeGeolocationAPI","previousPresence","isScreenLockedOrSleep","hasUserAlreadyReturn","desktopSleptAt","assetURL","initData","supportsTerminationRequest","appInfo","hostType","operatingSystem","hostRegion","supportsNotificationActions","supportsJabra","supportsWebHID","supportsWindowsNativeGeolocationAPI","unifiedPreferenceSupport","supportsScreenMediaSelection","cefGetScreenMedia","getScreenMedia","isHostedProp","supportsWebHid","doTerminateApplication","completion","doTerminateNow","desktopPresence","streamingConnection","hidInput","attached","deviceName","doesAppHaveFocus","sendJabraEventToDesktop","deviceID","JABRA_EVENT","requestJabraDevices","matchedRegion","TERMINATED_CALL","MISSED_CALL","ENGAGEMENT_SOURCE_ICONS","messageTypesBaseKey","engagementSourceBaseKey","INTERACTION_ICON_NAMES","Unspecified","AppleMessagesForBusiness","Discord","Email","Facebook","FacebookMessenger","Glassdoor","GoogleBusinessProfile","Instagram","KakaoTalk","Line","LinkedIn","MicrosoftTeams","MobileChat","Other","QQ","Reddit","ServiceNow","SFDC","SMS","Snapchat","Telegram","Threads","Trustpilot","Viber","WebChat","WeChat","Weibo","WhatsApp","X","Yelp","YouTube","Zendesk","_locale$split","_locale$split2","localeSegment","regionSegment","jidSplit","WHITE_SPACE_KEYCODES","TAB","ENTER","SPACE","WHITE_SPACE_KEYS","CAP_ALPHA_KEYCODES","LOW_ALPHA_KEYCODES","NUM_KEYCODES","NAV_KEYCODES","LEFT_ARROW","UP_ARROW","RIGHT_ARROW","DOWN_ARROW","keyForKeyCode","keyCode","isAlphabet","isNavigation","isWhitespace","isEscape","isTab","fromCharCode","maxSize","victim","_pickEvictionVictim","_moveKeyToMru","_evictWhileOverMax","isApplicationRoute","defaultRender","md","link_open","renderToken","attrIndex","attrGet","isMailTo","attrPush","attrSet","render","markdownit","linkify","typographer","isMenuBranchActive","menuItemType","isObjectOrInstanceType","logWarn","isLeafMenuItemActive","formatRoutePath","isEmberRouteActive","isMenuBranchActivePathRoot","genUrlFn","urlFor","genUrlArgs","getMenuItemBasePaths","currBasePath","baseRoutePath","logError","logData","assertValidRouter","definitiveMatch","getRawAddress","getNameFrom","getModelProperties","idProperties","getDisplayablePhoneNumberFrom","_getChannelPropertiesFromInteraction","channelType","displayableName","twitterHandle","getChannelPropertiesFromExternalContact","getChannelPropertiesFromInteraction","present","hasCrucialChannelInfo","displayNameFrom","getTwitterDisplayNameFrom","svgIconKey","scopedId","nestedIdProperty","oldIdValue","newIdValue","valueStr","initialsSupported","OnlyLatinChars","buildSymbolMap","keyName","VALID_LOCAL_HOSTNAMES","ENV_TRANSITIONS","prod","DEPLOYMENT_ID_MAP","prod-apne1","prod-apne2","prod-aps1","prod-apse2","prod-cac1","prod-euc1","prod-euw1","prod-euw2","prod-usw2","REGION_TRANSLATION_KEY_MAP","SUPPORTED_GC_APP_SUBDOMAINS","getEnv","getDeploymentId","getRegionTranslationKey","getDesktopId","publicEnvFilter","serviceDiscovery","STABLE_PUBLIC_ENVS","parseRuntimeFromLocalPath","parseDeployedRuntime","newrelic","actionNameType","attrType","reservedKeys","attrKey","attrValueType","nowDate","timestampMs","givenDate","keyType","persistType","ALLOWED_VALUE_TYPES","safeOptions","MAX_SAFE_INTEGER","excludeUnderscoreKeys","excludeEmberServices","excludeEmberApplications","valueFilter","inputType","myTypeOf","_extractRawDataHelper","contextStack","currStackItem","currLevel","currIndex","currStack","buildNewContextStack","customJsonValue","propertyName","wrappedJsonError","baseError","newStackItem","INVALID_EMAIL_FORMAT_KEY","_deps$formatEnabled","valueToCheck","INVALID_NUMBER_FORMAT_KEY","hasInvalidRawRecipient","fetchExternalContactName","fetchUserName","AUTHZ_POLICY_DENIED_CODE","isCurrentDocument","restoredPath","getHash","NON_RESTORABLE_PATHS","_path$split","_path$split2","isNonRestorable","presenceA","presenceB","numPartA","numPartB","proxy","tap","MSG_NAMESPACE","_defaultLabel","_chain","_processingQueueMap","_buildErrorMessage","isValidProcessor","appendToChain","processor","_isLifecycleValid","workQueue","unshift","activeWorkItem","_checkForWork","emptyQueueIds","currQueue","_processEventThroughChain","_buildLoggerMessage","chainLabel","_safeLabel","chainIndex","_chainHelper","processorResult","processorResultType","processorLabel","EntityTypes","MetricTypes","DetailPageSubPath","_alertSummary$convers","_alertSummary$entitie","canViewPage","pageType","subPath","QUEUE","TEAM","USER","metricType","INTERVAL","alertingEntityIds","alertingEntityIdsLength","_this$args$alertSumma4","_this$args$alertSumma5","_this$args$alertSumma","_this$args$alertSumma2","_this$args$alertSumma3","keyString","isTitle","bodyKey","_entities$2","translate","_getOtherEntities","entityDetails","entityIds","entityObject","getTeams","flatEntries","_entry$","_queuesResponse$entit","queuesResponse","_getUsers","_usersResponse$result","usersResponse","_getTeams","_teamsResponse$result","teamsResponse","_generateToast","mainEntityRuleNameHtml","entitiesDetails","entityDetailsHtml","entityDetail","AdapterError","adapterError","payloadDetails","isInteger","statusInt","isUuid","getLoggableRequestFailureDetailsPartial","getAdapterErrorLoggableDetails","getAjaxErrorLoggableDetails","rawErrorResponse","UUID_REGEXP","_options$type","_options$loop","_options$enabled","_options$roving","updateFocusableElements","filterFocusables","setupMutationObserver","setupKeyboardListener","cleanupTabIndexes","zeroTabindexElements","defaultTabindexElement","dataset","defaultTabindex","attributeFilter","lastActiveElement","_cleanupScheduleCallbackGadgetSessionStorage","_updateScheduleCallbackGadgetSessionStorage","newCallbackNumbersByInteractionId","sessionStorageValue","prevCallbackNumbersByInteractionId","interactionIdsToRemove","_storage$getSessionSt","callbackNumbersByInteractionId","isSyncPromiseChainStep","chainLength","currChainStep","stepIndex","stepProgress","logPayload","providerKeyPrefix","entryDeps","validProviders","validProvider","oldProvider","runEvaluator","ttlMinutes","expirationTime","cachedItem","rejectOnTimeout","TIMEOUT_IDENTIFIER","NATIVE_PANELS","deprecatedConversationSummaryPanelIds","WRAPUP_GADGET_PANEL_ID","transformationMaps","shouldTransformPanelSetting","panelSetting","shouldTransformAppDefId","transformAppDefId","dependentFeatureToggles","reverseNotes","reverseWrapup","responses","scheduleCallback","reverseScheduleCallback","scripts","transformationDependentFeatureToggles","buildTransformationFtComputedDepKey","injectionPrefix","requiredTransform","transform","srcNativePanelMatch","findNativePanel","toSearch","nativePanel","currNativePanel","includedNativeProvider","normalizeTtl","cacheData","tearingDown","expiryCheck","_this$cacheData$key","ttl","currTimeMillis","effectiveTtl","expirationTimestamp","scheduleEviction","_this$cacheData$key2","removedExpirationTimestamp","nextExpirationTimestamp","clearEvictionTimer","timerRef","requestedTimestamp","getEarliestExpirationTimestamp","evictExpiredItems","cacheEntry","earliestExpiration","haystack","needle","_haystack","redirectUri","pathParts","matched","merged","paramsToRemove","newParams","branchPath","buildVoltPopoutUrl","windowName","DEFAULT_WINDOW_OPTIONS","getVoltOrigin","getLocalWebDirEnv","getVoltAppPath","appPath","ENGAGE_VIDEO","ENGAGE_VR","parseOptionalInteger","ok","isoDateToDateTime","isoToEpochSeconds","isNameValid","_err$payload","_err$responseJSON","_err$errorResponse","_err$jqXHR","_err$jqXHR$responseJS","_candidates","UTC","WORKITEM_NAME_MIN_LENGTH","WORKITEM_PRIORITY_MIN","WORKITEM_PRIORITY_MAX","WORKITEM_MAX_DAYS_FROM_NOW","SECONDS_PER_DAY","WORKITEM_MAX_DURATION_SECONDS","maxDateFromNow","setUTCDate","getUTCDate","isDateWithinMaxDays","isoDate","isSafeInteger","attachTextInputListeners","removeTextInputListeners","buildWorkerDef","webDirectoryOrigin","loadRetryDelayMillis","metaName","rawConfig","runningTests","axeAudit","@purecloud/ember-softphone-integration","ar","da","de","en-us","es","fi","fr-ca","fr","he","hi","it","ja","ko","nl","pl","pt-br","pt-pt","ru","sv","th","tr","uk","zh-cn","zh-tw"],"mappings":"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uhB,EAAMquhB,EAAYphjB,KAAI,SAAAqhjB,GAExB,IAAMjsjB,EAAK;AAEX,OADAA,EAAGmqjB,GAAkB8B,EACdjsjB;AAGXypjB,EAAcv1iB,IAAIq3iB,EAAK5thB,IA5MnBuuhB,CACI/B,EACAV,EACAK,EACAc,GAGA,OAAS1viB,EAGTuuiB,EAAcv1iB,IAAIw2iB,EAASZ,EAA6B5uiB,KA+JlD9c,EA9JcqrjB,EAAcphjB,IAAG,GAAAuP,OAAIsD,IA8JhC+K,EA9JwC6jiB,EAA6B5uiB,GA+JnFnZ,KAAKE,UAAU7D,KAAO2D,KAAKE,UAAUgkB,IA7JhCwjiB,EAAcv1iB,IAAG,GAAA0D,OAAIsD,GAAO4uiB,EAA6B5uiB;ACxJxD8b,EAAA44f,YAAG,CAAC,gCAAiC,qBAAsB;AAA5E,IAMMD,EAAS34f,EAAA24f,UAAG,CACd,wBACA,+BACA,oBACA,mCACA,2BACA,8BACA,gCACA,iBACA,4BACA,8CACA,sBACA,wBACA,gCACA,iBACA,+BACA,uCACA,oBACA,gCACA,+BACA,wBACA,+BACA,mCACA,iCACA,qBACA,gCACA,YACA,kCACA,kCAQEgqB,EAAS3ihB,EAAA2ihB,UAAG,CACd,8BACA,WACA,8BACA,mDACA,8BACA,4BACA,wBACA,4BACA,yBACA,iCACA,gCACA,mCACA,6BACA,4BACA,8BACA,4BACA,4CACA,gCACA,yBACA,oCACA,8BACA,uCACA,kCACA,sCACA,sCACA,+CACA,yCACA,0CACA,UACA,8BACA,4BACA,0CACA,6BACA,gCACA,sBACA,6BACA,2BACA,qCACA,qCACA,iCACA,iDACA,kDACA,4BACA,0BACA,iDACA,gBACA,uCACA,kCACA,gCACA,iCACA,YACA,6BACA,+BACA,oCACA,0BACA,4BACA,mCACA,4BACA,YACA,qBACA,4BACA,8BACA,+BACA,4BACA,YACA,kCACA,6CACA,oCACA,mCACA,sCACA,iCACA,+BACA,uBACA,6BACA,sBACA,yBACA,2BACA,mBACA,qCACA,+BACA,YACA,8BACA,sBACA,YACA,0CACA,yCACA,uCACA,SACA,oCA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","file":"web-directory.js","sourcesContent":["'use strict';\n\n\n","(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.adapter = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){\n/*\n *  Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar SDPUtils = require('sdp');\n\nfunction fixStatsType(stat) {\n  return {\n    inboundrtp: 'inbound-rtp',\n    outboundrtp: 'outbound-rtp',\n    candidatepair: 'candidate-pair',\n    localcandidate: 'local-candidate',\n    remotecandidate: 'remote-candidate'\n  }[stat.type] || stat.type;\n}\n\nfunction writeMediaSection(transceiver, caps, type, stream, dtlsRole) {\n  var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps);\n\n  // Map ICE parameters (ufrag, pwd) to SDP.\n  sdp += SDPUtils.writeIceParameters(\n      transceiver.iceGatherer.getLocalParameters());\n\n  // Map DTLS parameters to SDP.\n  sdp += SDPUtils.writeDtlsParameters(\n      transceiver.dtlsTransport.getLocalParameters(),\n      type === 'offer' ? 'actpass' : dtlsRole || 'active');\n\n  sdp += 'a=mid:' + transceiver.mid + '\\r\\n';\n\n  if (transceiver.rtpSender && transceiver.rtpReceiver) {\n    sdp += 'a=sendrecv\\r\\n';\n  } else if (transceiver.rtpSender) {\n    sdp += 'a=sendonly\\r\\n';\n  } else if (transceiver.rtpReceiver) {\n    sdp += 'a=recvonly\\r\\n';\n  } else {\n    sdp += 'a=inactive\\r\\n';\n  }\n\n  if (transceiver.rtpSender) {\n    var trackId = transceiver.rtpSender._initialTrackId ||\n        transceiver.rtpSender.track.id;\n    transceiver.rtpSender._initialTrackId = trackId;\n    // spec.\n    var msid = 'msid:' + (stream ? stream.id : '-') + ' ' +\n        trackId + '\\r\\n';\n    sdp += 'a=' + msid;\n    // for Chrome. Legacy should no longer be required.\n    sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n        ' ' + msid;\n\n    // RTX\n    if (transceiver.sendEncodingParameters[0].rtx) {\n      sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n          ' ' + msid;\n      sdp += 'a=ssrc-group:FID ' +\n          transceiver.sendEncodingParameters[0].ssrc + ' ' +\n          transceiver.sendEncodingParameters[0].rtx.ssrc +\n          '\\r\\n';\n    }\n  }\n  // FIXME: this should be written by writeRtpDescription.\n  sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n      ' cname:' + SDPUtils.localCName + '\\r\\n';\n  if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) {\n    sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n        ' cname:' + SDPUtils.localCName + '\\r\\n';\n  }\n  return sdp;\n}\n\n// Edge does not like\n// 1) stun: filtered after 14393 unless ?transport=udp is present\n// 2) turn: that does not have all of turn:host:port?transport=udp\n// 3) turn: with ipv6 addresses\n// 4) turn: occurring muliple times\nfunction filterIceServers(iceServers, edgeVersion) {\n  var hasTurn = false;\n  iceServers = JSON.parse(JSON.stringify(iceServers));\n  return iceServers.filter(function(server) {\n    if (server && (server.urls || server.url)) {\n      var urls = server.urls || server.url;\n      if (server.url && !server.urls) {\n        console.warn('RTCIceServer.url is deprecated! Use urls instead.');\n      }\n      var isString = typeof urls === 'string';\n      if (isString) {\n        urls = [urls];\n      }\n      urls = urls.filter(function(url) {\n        var validTurn = url.indexOf('turn:') === 0 &&\n            url.indexOf('transport=udp') !== -1 &&\n            url.indexOf('turn:[') === -1 &&\n            !hasTurn;\n\n        if (validTurn) {\n          hasTurn = true;\n          return true;\n        }\n        return url.indexOf('stun:') === 0 && edgeVersion >= 14393 &&\n            url.indexOf('?transport=udp') === -1;\n      });\n\n      delete server.url;\n      server.urls = isString ? urls[0] : urls;\n      return !!urls.length;\n    }\n  });\n}\n\n// Determines the intersection of local and remote capabilities.\nfunction getCommonCapabilities(localCapabilities, remoteCapabilities) {\n  var commonCapabilities = {\n    codecs: [],\n    headerExtensions: [],\n    fecMechanisms: []\n  };\n\n  var findCodecByPayloadType = function(pt, codecs) {\n    pt = parseInt(pt, 10);\n    for (var i = 0; i < codecs.length; i++) {\n      if (codecs[i].payloadType === pt ||\n          codecs[i].preferredPayloadType === pt) {\n        return codecs[i];\n      }\n    }\n  };\n\n  var rtxCapabilityMatches = function(lRtx, rRtx, lCodecs, rCodecs) {\n    var lCodec = findCodecByPayloadType(lRtx.parameters.apt, lCodecs);\n    var rCodec = findCodecByPayloadType(rRtx.parameters.apt, rCodecs);\n    return lCodec && rCodec &&\n        lCodec.name.toLowerCase() === rCodec.name.toLowerCase();\n  };\n\n  localCapabilities.codecs.forEach(function(lCodec) {\n    for (var i = 0; i < remoteCapabilities.codecs.length; i++) {\n      var rCodec = remoteCapabilities.codecs[i];\n      if (lCodec.name.toLowerCase() === rCodec.name.toLowerCase() &&\n          lCodec.clockRate === rCodec.clockRate) {\n        if (lCodec.name.toLowerCase() === 'rtx' &&\n            lCodec.parameters && rCodec.parameters.apt) {\n          // for RTX we need to find the local rtx that has a apt\n          // which points to the same local codec as the remote one.\n          if (!rtxCapabilityMatches(lCodec, rCodec,\n              localCapabilities.codecs, remoteCapabilities.codecs)) {\n            continue;\n          }\n        }\n        rCodec = JSON.parse(JSON.stringify(rCodec)); // deepcopy\n        // number of channels is the highest common number of channels\n        rCodec.numChannels = Math.min(lCodec.numChannels,\n            rCodec.numChannels);\n        // push rCodec so we reply with offerer payload type\n        commonCapabilities.codecs.push(rCodec);\n\n        // determine common feedback mechanisms\n        rCodec.rtcpFeedback = rCodec.rtcpFeedback.filter(function(fb) {\n          for (var j = 0; j < lCodec.rtcpFeedback.length; j++) {\n            if (lCodec.rtcpFeedback[j].type === fb.type &&\n                lCodec.rtcpFeedback[j].parameter === fb.parameter) {\n              return true;\n            }\n          }\n          return false;\n        });\n        // FIXME: also need to determine .parameters\n        //  see https://github.com/openpeer/ortc/issues/569\n        break;\n      }\n    }\n  });\n\n  localCapabilities.headerExtensions.forEach(function(lHeaderExtension) {\n    for (var i = 0; i < remoteCapabilities.headerExtensions.length;\n         i++) {\n      var rHeaderExtension = remoteCapabilities.headerExtensions[i];\n      if (lHeaderExtension.uri === rHeaderExtension.uri) {\n        commonCapabilities.headerExtensions.push(rHeaderExtension);\n        break;\n      }\n    }\n  });\n\n  // FIXME: fecMechanisms\n  return commonCapabilities;\n}\n\n// is action=setLocalDescription with type allowed in signalingState\nfunction isActionAllowedInSignalingState(action, type, signalingState) {\n  return {\n    offer: {\n      setLocalDescription: ['stable', 'have-local-offer'],\n      setRemoteDescription: ['stable', 'have-remote-offer']\n    },\n    answer: {\n      setLocalDescription: ['have-remote-offer', 'have-local-pranswer'],\n      setRemoteDescription: ['have-local-offer', 'have-remote-pranswer']\n    }\n  }[type][action].indexOf(signalingState) !== -1;\n}\n\nfunction maybeAddCandidate(iceTransport, candidate) {\n  // Edge's internal representation adds some fields therefore\n  // not all fieldѕ are taken into account.\n  var alreadyAdded = iceTransport.getRemoteCandidates()\n      .find(function(remoteCandidate) {\n        return candidate.foundation === remoteCandidate.foundation &&\n            candidate.ip === remoteCandidate.ip &&\n            candidate.port === remoteCandidate.port &&\n            candidate.priority === remoteCandidate.priority &&\n            candidate.protocol === remoteCandidate.protocol &&\n            candidate.type === remoteCandidate.type;\n      });\n  if (!alreadyAdded) {\n    iceTransport.addRemoteCandidate(candidate);\n  }\n  return !alreadyAdded;\n}\n\n\nfunction makeError(name, description) {\n  var e = new Error(description);\n  e.name = name;\n  // legacy error codes from https://heycam.github.io/webidl/#idl-DOMException-error-names\n  e.code = {\n    NotSupportedError: 9,\n    InvalidStateError: 11,\n    InvalidAccessError: 15,\n    TypeError: undefined,\n    OperationError: undefined\n  }[name];\n  return e;\n}\n\nmodule.exports = function(window, edgeVersion) {\n  // https://w3c.github.io/mediacapture-main/#mediastream\n  // Helper function to add the track to the stream and\n  // dispatch the event ourselves.\n  function addTrackToStreamAndFireEvent(track, stream) {\n    stream.addTrack(track);\n    stream.dispatchEvent(new window.MediaStreamTrackEvent('addtrack',\n        {track: track}));\n  }\n\n  function removeTrackFromStreamAndFireEvent(track, stream) {\n    stream.removeTrack(track);\n    stream.dispatchEvent(new window.MediaStreamTrackEvent('removetrack',\n        {track: track}));\n  }\n\n  function fireAddTrack(pc, track, receiver, streams) {\n    var trackEvent = new Event('track');\n    trackEvent.track = track;\n    trackEvent.receiver = receiver;\n    trackEvent.transceiver = {receiver: receiver};\n    trackEvent.streams = streams;\n    window.setTimeout(function() {\n      pc._dispatchEvent('track', trackEvent);\n    });\n  }\n\n  var RTCPeerConnection = function(config) {\n    var pc = this;\n\n    var _eventTarget = document.createDocumentFragment();\n    ['addEventListener', 'removeEventListener', 'dispatchEvent']\n        .forEach(function(method) {\n          pc[method] = _eventTarget[method].bind(_eventTarget);\n        });\n\n    this.canTrickleIceCandidates = null;\n\n    this.needNegotiation = false;\n\n    this.localStreams = [];\n    this.remoteStreams = [];\n\n    this._localDescription = null;\n    this._remoteDescription = null;\n\n    this.signalingState = 'stable';\n    this.iceConnectionState = 'new';\n    this.connectionState = 'new';\n    this.iceGatheringState = 'new';\n\n    config = JSON.parse(JSON.stringify(config || {}));\n\n    this.usingBundle = config.bundlePolicy === 'max-bundle';\n    if (config.rtcpMuxPolicy === 'negotiate') {\n      throw(makeError('NotSupportedError',\n          'rtcpMuxPolicy \\'negotiate\\' is not supported'));\n    } else if (!config.rtcpMuxPolicy) {\n      config.rtcpMuxPolicy = 'require';\n    }\n\n    switch (config.iceTransportPolicy) {\n      case 'all':\n      case 'relay':\n        break;\n      default:\n        config.iceTransportPolicy = 'all';\n        break;\n    }\n\n    switch (config.bundlePolicy) {\n      case 'balanced':\n      case 'max-compat':\n      case 'max-bundle':\n        break;\n      default:\n        config.bundlePolicy = 'balanced';\n        break;\n    }\n\n    config.iceServers = filterIceServers(config.iceServers || [], edgeVersion);\n\n    this._iceGatherers = [];\n    if (config.iceCandidatePoolSize) {\n      for (var i = config.iceCandidatePoolSize; i > 0; i--) {\n        this._iceGatherers.push(new window.RTCIceGatherer({\n          iceServers: config.iceServers,\n          gatherPolicy: config.iceTransportPolicy\n        }));\n      }\n    } else {\n      config.iceCandidatePoolSize = 0;\n    }\n\n    this._config = config;\n\n    // per-track iceGathers, iceTransports, dtlsTransports, rtpSenders, ...\n    // everything that is needed to describe a SDP m-line.\n    this.transceivers = [];\n\n    this._sdpSessionId = SDPUtils.generateSessionId();\n    this._sdpSessionVersion = 0;\n\n    this._dtlsRole = undefined; // role for a=setup to use in answers.\n\n    this._isClosed = false;\n  };\n\n  Object.defineProperty(RTCPeerConnection.prototype, 'localDescription', {\n    configurable: true,\n    get: function() {\n      return this._localDescription;\n    }\n  });\n  Object.defineProperty(RTCPeerConnection.prototype, 'remoteDescription', {\n    configurable: true,\n    get: function() {\n      return this._remoteDescription;\n    }\n  });\n\n  // set up event handlers on prototype\n  RTCPeerConnection.prototype.onicecandidate = null;\n  RTCPeerConnection.prototype.onaddstream = null;\n  RTCPeerConnection.prototype.ontrack = null;\n  RTCPeerConnection.prototype.onremovestream = null;\n  RTCPeerConnection.prototype.onsignalingstatechange = null;\n  RTCPeerConnection.prototype.oniceconnectionstatechange = null;\n  RTCPeerConnection.prototype.onconnectionstatechange = null;\n  RTCPeerConnection.prototype.onicegatheringstatechange = null;\n  RTCPeerConnection.prototype.onnegotiationneeded = null;\n  RTCPeerConnection.prototype.ondatachannel = null;\n\n  RTCPeerConnection.prototype._dispatchEvent = function(name, event) {\n    if (this._isClosed) {\n      return;\n    }\n    this.dispatchEvent(event);\n    if (typeof this['on' + name] === 'function') {\n      this['on' + name](event);\n    }\n  };\n\n  RTCPeerConnection.prototype._emitGatheringStateChange = function() {\n    var event = new Event('icegatheringstatechange');\n    this._dispatchEvent('icegatheringstatechange', event);\n  };\n\n  RTCPeerConnection.prototype.getConfiguration = function() {\n    return this._config;\n  };\n\n  RTCPeerConnection.prototype.getLocalStreams = function() {\n    return this.localStreams;\n  };\n\n  RTCPeerConnection.prototype.getRemoteStreams = function() {\n    return this.remoteStreams;\n  };\n\n  // internal helper to create a transceiver object.\n  // (which is not yet the same as the WebRTC 1.0 transceiver)\n  RTCPeerConnection.prototype._createTransceiver = function(kind, doNotAdd) {\n    var hasBundleTransport = this.transceivers.length > 0;\n    var transceiver = {\n      track: null,\n      iceGatherer: null,\n      iceTransport: null,\n      dtlsTransport: null,\n      localCapabilities: null,\n      remoteCapabilities: null,\n      rtpSender: null,\n      rtpReceiver: null,\n      kind: kind,\n      mid: null,\n      sendEncodingParameters: null,\n      recvEncodingParameters: null,\n      stream: null,\n      associatedRemoteMediaStreams: [],\n      wantReceive: true\n    };\n    if (this.usingBundle && hasBundleTransport) {\n      transceiver.iceTransport = this.transceivers[0].iceTransport;\n      transceiver.dtlsTransport = this.transceivers[0].dtlsTransport;\n    } else {\n      var transports = this._createIceAndDtlsTransports();\n      transceiver.iceTransport = transports.iceTransport;\n      transceiver.dtlsTransport = transports.dtlsTransport;\n    }\n    if (!doNotAdd) {\n      this.transceivers.push(transceiver);\n    }\n    return transceiver;\n  };\n\n  RTCPeerConnection.prototype.addTrack = function(track, stream) {\n    if (this._isClosed) {\n      throw makeError('InvalidStateError',\n          'Attempted to call addTrack on a closed peerconnection.');\n    }\n\n    var alreadyExists = this.transceivers.find(function(s) {\n      return s.track === track;\n    });\n\n    if (alreadyExists) {\n      throw makeError('InvalidAccessError', 'Track already exists.');\n    }\n\n    var transceiver;\n    for (var i = 0; i < this.transceivers.length; i++) {\n      if (!this.transceivers[i].track &&\n          this.transceivers[i].kind === track.kind) {\n        transceiver = this.transceivers[i];\n      }\n    }\n    if (!transceiver) {\n      transceiver = this._createTransceiver(track.kind);\n    }\n\n    this._maybeFireNegotiationNeeded();\n\n    if (this.localStreams.indexOf(stream) === -1) {\n      this.localStreams.push(stream);\n    }\n\n    transceiver.track = track;\n    transceiver.stream = stream;\n    transceiver.rtpSender = new window.RTCRtpSender(track,\n        transceiver.dtlsTransport);\n    return transceiver.rtpSender;\n  };\n\n  RTCPeerConnection.prototype.addStream = function(stream) {\n    var pc = this;\n    if (edgeVersion >= 15025) {\n      stream.getTracks().forEach(function(track) {\n        pc.addTrack(track, stream);\n      });\n    } else {\n      // Clone is necessary for local demos mostly, attaching directly\n      // to two different senders does not work (build 10547).\n      // Fixed in 15025 (or earlier)\n      var clonedStream = stream.clone();\n      stream.getTracks().forEach(function(track, idx) {\n        var clonedTrack = clonedStream.getTracks()[idx];\n        track.addEventListener('enabled', function(event) {\n          clonedTrack.enabled = event.enabled;\n        });\n      });\n      clonedStream.getTracks().forEach(function(track) {\n        pc.addTrack(track, clonedStream);\n      });\n    }\n  };\n\n  RTCPeerConnection.prototype.removeTrack = function(sender) {\n    if (this._isClosed) {\n      throw makeError('InvalidStateError',\n          'Attempted to call removeTrack on a closed peerconnection.');\n    }\n\n    if (!(sender instanceof window.RTCRtpSender)) {\n      throw new TypeError('Argument 1 of RTCPeerConnection.removeTrack ' +\n          'does not implement interface RTCRtpSender.');\n    }\n\n    var transceiver = this.transceivers.find(function(t) {\n      return t.rtpSender === sender;\n    });\n\n    if (!transceiver) {\n      throw makeError('InvalidAccessError',\n          'Sender was not created by this connection.');\n    }\n    var stream = transceiver.stream;\n\n    transceiver.rtpSender.stop();\n    transceiver.rtpSender = null;\n    transceiver.track = null;\n    transceiver.stream = null;\n\n    // remove the stream from the set of local streams\n    var localStreams = this.transceivers.map(function(t) {\n      return t.stream;\n    });\n    if (localStreams.indexOf(stream) === -1 &&\n        this.localStreams.indexOf(stream) > -1) {\n      this.localStreams.splice(this.localStreams.indexOf(stream), 1);\n    }\n\n    this._maybeFireNegotiationNeeded();\n  };\n\n  RTCPeerConnection.prototype.removeStream = function(stream) {\n    var pc = this;\n    stream.getTracks().forEach(function(track) {\n      var sender = pc.getSenders().find(function(s) {\n        return s.track === track;\n      });\n      if (sender) {\n        pc.removeTrack(sender);\n      }\n    });\n  };\n\n  RTCPeerConnection.prototype.getSenders = function() {\n    return this.transceivers.filter(function(transceiver) {\n      return !!transceiver.rtpSender;\n    })\n    .map(function(transceiver) {\n      return transceiver.rtpSender;\n    });\n  };\n\n  RTCPeerConnection.prototype.getReceivers = function() {\n    return this.transceivers.filter(function(transceiver) {\n      return !!transceiver.rtpReceiver;\n    })\n    .map(function(transceiver) {\n      return transceiver.rtpReceiver;\n    });\n  };\n\n\n  RTCPeerConnection.prototype._createIceGatherer = function(sdpMLineIndex,\n      usingBundle) {\n    var pc = this;\n    if (usingBundle && sdpMLineIndex > 0) {\n      return this.transceivers[0].iceGatherer;\n    } else if (this._iceGatherers.length) {\n      return this._iceGatherers.shift();\n    }\n    var iceGatherer = new window.RTCIceGatherer({\n      iceServers: this._config.iceServers,\n      gatherPolicy: this._config.iceTransportPolicy\n    });\n    Object.defineProperty(iceGatherer, 'state',\n        {value: 'new', writable: true}\n    );\n\n    this.transceivers[sdpMLineIndex].bufferedCandidateEvents = [];\n    this.transceivers[sdpMLineIndex].bufferCandidates = function(event) {\n      var end = !event.candidate || Object.keys(event.candidate).length === 0;\n      // polyfill since RTCIceGatherer.state is not implemented in\n      // Edge 10547 yet.\n      iceGatherer.state = end ? 'completed' : 'gathering';\n      if (pc.transceivers[sdpMLineIndex].bufferedCandidateEvents !== null) {\n        pc.transceivers[sdpMLineIndex].bufferedCandidateEvents.push(event);\n      }\n    };\n    iceGatherer.addEventListener('localcandidate',\n      this.transceivers[sdpMLineIndex].bufferCandidates);\n    return iceGatherer;\n  };\n\n  // start gathering from an RTCIceGatherer.\n  RTCPeerConnection.prototype._gather = function(mid, sdpMLineIndex) {\n    var pc = this;\n    var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer;\n    if (iceGatherer.onlocalcandidate) {\n      return;\n    }\n    var bufferedCandidateEvents =\n      this.transceivers[sdpMLineIndex].bufferedCandidateEvents;\n    this.transceivers[sdpMLineIndex].bufferedCandidateEvents = null;\n    iceGatherer.removeEventListener('localcandidate',\n      this.transceivers[sdpMLineIndex].bufferCandidates);\n    iceGatherer.onlocalcandidate = function(evt) {\n      if (pc.usingBundle && sdpMLineIndex > 0) {\n        // if we know that we use bundle we can drop candidates with\n        // ѕdpMLineIndex > 0. If we don't do this then our state gets\n        // confused since we dispose the extra ice gatherer.\n        return;\n      }\n      var event = new Event('icecandidate');\n      event.candidate = {sdpMid: mid, sdpMLineIndex: sdpMLineIndex};\n\n      var cand = evt.candidate;\n      // Edge emits an empty object for RTCIceCandidateComplete‥\n      var end = !cand || Object.keys(cand).length === 0;\n      if (end) {\n        // polyfill since RTCIceGatherer.state is not implemented in\n        // Edge 10547 yet.\n        if (iceGatherer.state === 'new' || iceGatherer.state === 'gathering') {\n          iceGatherer.state = 'completed';\n        }\n      } else {\n        if (iceGatherer.state === 'new') {\n          iceGatherer.state = 'gathering';\n        }\n        // RTCIceCandidate doesn't have a component, needs to be added\n        cand.component = 1;\n        // also the usernameFragment. TODO: update SDP to take both variants.\n        cand.ufrag = iceGatherer.getLocalParameters().usernameFragment;\n\n        var serializedCandidate = SDPUtils.writeCandidate(cand);\n        event.candidate = Object.assign(event.candidate,\n            SDPUtils.parseCandidate(serializedCandidate));\n\n        event.candidate.candidate = serializedCandidate;\n        event.candidate.toJSON = function() {\n          return {\n            candidate: event.candidate.candidate,\n            sdpMid: event.candidate.sdpMid,\n            sdpMLineIndex: event.candidate.sdpMLineIndex,\n            usernameFragment: event.candidate.usernameFragment\n          };\n        };\n      }\n\n      // update local description.\n      var sections = SDPUtils.getMediaSections(pc._localDescription.sdp);\n      if (!end) {\n        sections[event.candidate.sdpMLineIndex] +=\n            'a=' + event.candidate.candidate + '\\r\\n';\n      } else {\n        sections[event.candidate.sdpMLineIndex] +=\n            'a=end-of-candidates\\r\\n';\n      }\n      pc._localDescription.sdp =\n          SDPUtils.getDescription(pc._localDescription.sdp) +\n          sections.join('');\n      var complete = pc.transceivers.every(function(transceiver) {\n        return transceiver.iceGatherer &&\n            transceiver.iceGatherer.state === 'completed';\n      });\n\n      if (pc.iceGatheringState !== 'gathering') {\n        pc.iceGatheringState = 'gathering';\n        pc._emitGatheringStateChange();\n      }\n\n      // Emit candidate. Also emit null candidate when all gatherers are\n      // complete.\n      if (!end) {\n        pc._dispatchEvent('icecandidate', event);\n      }\n      if (complete) {\n        pc._dispatchEvent('icecandidate', new Event('icecandidate'));\n        pc.iceGatheringState = 'complete';\n        pc._emitGatheringStateChange();\n      }\n    };\n\n    // emit already gathered candidates.\n    window.setTimeout(function() {\n      bufferedCandidateEvents.forEach(function(e) {\n        iceGatherer.onlocalcandidate(e);\n      });\n    }, 0);\n  };\n\n  // Create ICE transport and DTLS transport.\n  RTCPeerConnection.prototype._createIceAndDtlsTransports = function() {\n    var pc = this;\n    var iceTransport = new window.RTCIceTransport(null);\n    iceTransport.onicestatechange = function() {\n      pc._updateIceConnectionState();\n      pc._updateConnectionState();\n    };\n\n    var dtlsTransport = new window.RTCDtlsTransport(iceTransport);\n    dtlsTransport.ondtlsstatechange = function() {\n      pc._updateConnectionState();\n    };\n    dtlsTransport.onerror = function() {\n      // onerror does not set state to failed by itself.\n      Object.defineProperty(dtlsTransport, 'state',\n          {value: 'failed', writable: true});\n      pc._updateConnectionState();\n    };\n\n    return {\n      iceTransport: iceTransport,\n      dtlsTransport: dtlsTransport\n    };\n  };\n\n  // Destroy ICE gatherer, ICE transport and DTLS transport.\n  // Without triggering the callbacks.\n  RTCPeerConnection.prototype._disposeIceAndDtlsTransports = function(\n      sdpMLineIndex) {\n    var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer;\n    if (iceGatherer) {\n      delete iceGatherer.onlocalcandidate;\n      delete this.transceivers[sdpMLineIndex].iceGatherer;\n    }\n    var iceTransport = this.transceivers[sdpMLineIndex].iceTransport;\n    if (iceTransport) {\n      delete iceTransport.onicestatechange;\n      delete this.transceivers[sdpMLineIndex].iceTransport;\n    }\n    var dtlsTransport = this.transceivers[sdpMLineIndex].dtlsTransport;\n    if (dtlsTransport) {\n      delete dtlsTransport.ondtlsstatechange;\n      delete dtlsTransport.onerror;\n      delete this.transceivers[sdpMLineIndex].dtlsTransport;\n    }\n  };\n\n  // Start the RTP Sender and Receiver for a transceiver.\n  RTCPeerConnection.prototype._transceive = function(transceiver,\n      send, recv) {\n    var params = getCommonCapabilities(transceiver.localCapabilities,\n        transceiver.remoteCapabilities);\n    if (send && transceiver.rtpSender) {\n      params.encodings = transceiver.sendEncodingParameters;\n      params.rtcp = {\n        cname: SDPUtils.localCName,\n        compound: transceiver.rtcpParameters.compound\n      };\n      if (transceiver.recvEncodingParameters.length) {\n        params.rtcp.ssrc = transceiver.recvEncodingParameters[0].ssrc;\n      }\n      transceiver.rtpSender.send(params);\n    }\n    if (recv && transceiver.rtpReceiver && params.codecs.length > 0) {\n      // remove RTX field in Edge 14942\n      if (transceiver.kind === 'video'\n          && transceiver.recvEncodingParameters\n          && edgeVersion < 15019) {\n        transceiver.recvEncodingParameters.forEach(function(p) {\n          delete p.rtx;\n        });\n      }\n      if (transceiver.recvEncodingParameters.length) {\n        params.encodings = transceiver.recvEncodingParameters;\n      } else {\n        params.encodings = [{}];\n      }\n      params.rtcp = {\n        compound: transceiver.rtcpParameters.compound\n      };\n      if (transceiver.rtcpParameters.cname) {\n        params.rtcp.cname = transceiver.rtcpParameters.cname;\n      }\n      if (transceiver.sendEncodingParameters.length) {\n        params.rtcp.ssrc = transceiver.sendEncodingParameters[0].ssrc;\n      }\n      transceiver.rtpReceiver.receive(params);\n    }\n  };\n\n  RTCPeerConnection.prototype.setLocalDescription = function(description) {\n    var pc = this;\n\n    // Note: pranswer is not supported.\n    if (['offer', 'answer'].indexOf(description.type) === -1) {\n      return Promise.reject(makeError('TypeError',\n          'Unsupported type \"' + description.type + '\"'));\n    }\n\n    if (!isActionAllowedInSignalingState('setLocalDescription',\n        description.type, pc.signalingState) || pc._isClosed) {\n      return Promise.reject(makeError('InvalidStateError',\n          'Can not set local ' + description.type +\n          ' in state ' + pc.signalingState));\n    }\n\n    var sections;\n    var sessionpart;\n    if (description.type === 'offer') {\n      // VERY limited support for SDP munging. Limited to:\n      // * changing the order of codecs\n      sections = SDPUtils.splitSections(description.sdp);\n      sessionpart = sections.shift();\n      sections.forEach(function(mediaSection, sdpMLineIndex) {\n        var caps = SDPUtils.parseRtpParameters(mediaSection);\n        pc.transceivers[sdpMLineIndex].localCapabilities = caps;\n      });\n\n      pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n        pc._gather(transceiver.mid, sdpMLineIndex);\n      });\n    } else if (description.type === 'answer') {\n      sections = SDPUtils.splitSections(pc._remoteDescription.sdp);\n      sessionpart = sections.shift();\n      var isIceLite = SDPUtils.matchPrefix(sessionpart,\n          'a=ice-lite').length > 0;\n      sections.forEach(function(mediaSection, sdpMLineIndex) {\n        var transceiver = pc.transceivers[sdpMLineIndex];\n        var iceGatherer = transceiver.iceGatherer;\n        var iceTransport = transceiver.iceTransport;\n        var dtlsTransport = transceiver.dtlsTransport;\n        var localCapabilities = transceiver.localCapabilities;\n        var remoteCapabilities = transceiver.remoteCapabilities;\n\n        // treat bundle-only as not-rejected.\n        var rejected = SDPUtils.isRejected(mediaSection) &&\n            SDPUtils.matchPrefix(mediaSection, 'a=bundle-only').length === 0;\n\n        if (!rejected && !transceiver.rejected) {\n          var remoteIceParameters = SDPUtils.getIceParameters(\n              mediaSection, sessionpart);\n          var remoteDtlsParameters = SDPUtils.getDtlsParameters(\n              mediaSection, sessionpart);\n          if (isIceLite) {\n            remoteDtlsParameters.role = 'server';\n          }\n\n          if (!pc.usingBundle || sdpMLineIndex === 0) {\n            pc._gather(transceiver.mid, sdpMLineIndex);\n            if (iceTransport.state === 'new') {\n              iceTransport.start(iceGatherer, remoteIceParameters,\n                  isIceLite ? 'controlling' : 'controlled');\n            }\n            if (dtlsTransport.state === 'new') {\n              dtlsTransport.start(remoteDtlsParameters);\n            }\n          }\n\n          // Calculate intersection of capabilities.\n          var params = getCommonCapabilities(localCapabilities,\n              remoteCapabilities);\n\n          // Start the RTCRtpSender. The RTCRtpReceiver for this\n          // transceiver has already been started in setRemoteDescription.\n          pc._transceive(transceiver,\n              params.codecs.length > 0,\n              false);\n        }\n      });\n    }\n\n    pc._localDescription = {\n      type: description.type,\n      sdp: description.sdp\n    };\n    if (description.type === 'offer') {\n      pc._updateSignalingState('have-local-offer');\n    } else {\n      pc._updateSignalingState('stable');\n    }\n\n    return Promise.resolve();\n  };\n\n  RTCPeerConnection.prototype.setRemoteDescription = function(description) {\n    var pc = this;\n\n    // Note: pranswer is not supported.\n    if (['offer', 'answer'].indexOf(description.type) === -1) {\n      return Promise.reject(makeError('TypeError',\n          'Unsupported type \"' + description.type + '\"'));\n    }\n\n    if (!isActionAllowedInSignalingState('setRemoteDescription',\n        description.type, pc.signalingState) || pc._isClosed) {\n      return Promise.reject(makeError('InvalidStateError',\n          'Can not set remote ' + description.type +\n          ' in state ' + pc.signalingState));\n    }\n\n    var streams = {};\n    pc.remoteStreams.forEach(function(stream) {\n      streams[stream.id] = stream;\n    });\n    var receiverList = [];\n    var sections = SDPUtils.splitSections(description.sdp);\n    var sessionpart = sections.shift();\n    var isIceLite = SDPUtils.matchPrefix(sessionpart,\n        'a=ice-lite').length > 0;\n    var usingBundle = SDPUtils.matchPrefix(sessionpart,\n        'a=group:BUNDLE ').length > 0;\n    pc.usingBundle = usingBundle;\n    var iceOptions = SDPUtils.matchPrefix(sessionpart,\n        'a=ice-options:')[0];\n    if (iceOptions) {\n      pc.canTrickleIceCandidates = iceOptions.substr(14).split(' ')\n          .indexOf('trickle') >= 0;\n    } else {\n      pc.canTrickleIceCandidates = false;\n    }\n\n    sections.forEach(function(mediaSection, sdpMLineIndex) {\n      var lines = SDPUtils.splitLines(mediaSection);\n      var kind = SDPUtils.getKind(mediaSection);\n      // treat bundle-only as not-rejected.\n      var rejected = SDPUtils.isRejected(mediaSection) &&\n          SDPUtils.matchPrefix(mediaSection, 'a=bundle-only').length === 0;\n      var protocol = lines[0].substr(2).split(' ')[2];\n\n      var direction = SDPUtils.getDirection(mediaSection, sessionpart);\n      var remoteMsid = SDPUtils.parseMsid(mediaSection);\n\n      var mid = SDPUtils.getMid(mediaSection) || SDPUtils.generateIdentifier();\n\n      // Reject datachannels which are not implemented yet.\n      if (rejected || (kind === 'application' && (protocol === 'DTLS/SCTP' ||\n          protocol === 'UDP/DTLS/SCTP'))) {\n        // TODO: this is dangerous in the case where a non-rejected m-line\n        //     becomes rejected.\n        pc.transceivers[sdpMLineIndex] = {\n          mid: mid,\n          kind: kind,\n          protocol: protocol,\n          rejected: true\n        };\n        return;\n      }\n\n      if (!rejected && pc.transceivers[sdpMLineIndex] &&\n          pc.transceivers[sdpMLineIndex].rejected) {\n        // recycle a rejected transceiver.\n        pc.transceivers[sdpMLineIndex] = pc._createTransceiver(kind, true);\n      }\n\n      var transceiver;\n      var iceGatherer;\n      var iceTransport;\n      var dtlsTransport;\n      var rtpReceiver;\n      var sendEncodingParameters;\n      var recvEncodingParameters;\n      var localCapabilities;\n\n      var track;\n      // FIXME: ensure the mediaSection has rtcp-mux set.\n      var remoteCapabilities = SDPUtils.parseRtpParameters(mediaSection);\n      var remoteIceParameters;\n      var remoteDtlsParameters;\n      if (!rejected) {\n        remoteIceParameters = SDPUtils.getIceParameters(mediaSection,\n            sessionpart);\n        remoteDtlsParameters = SDPUtils.getDtlsParameters(mediaSection,\n            sessionpart);\n        remoteDtlsParameters.role = 'client';\n      }\n      recvEncodingParameters =\n          SDPUtils.parseRtpEncodingParameters(mediaSection);\n\n      var rtcpParameters = SDPUtils.parseRtcpParameters(mediaSection);\n\n      var isComplete = SDPUtils.matchPrefix(mediaSection,\n          'a=end-of-candidates', sessionpart).length > 0;\n      var cands = SDPUtils.matchPrefix(mediaSection, 'a=candidate:')\n          .map(function(cand) {\n            return SDPUtils.parseCandidate(cand);\n          })\n          .filter(function(cand) {\n            return cand.component === 1;\n          });\n\n      // Check if we can use BUNDLE and dispose transports.\n      if ((description.type === 'offer' || description.type === 'answer') &&\n          !rejected && usingBundle && sdpMLineIndex > 0 &&\n          pc.transceivers[sdpMLineIndex]) {\n        pc._disposeIceAndDtlsTransports(sdpMLineIndex);\n        pc.transceivers[sdpMLineIndex].iceGatherer =\n            pc.transceivers[0].iceGatherer;\n        pc.transceivers[sdpMLineIndex].iceTransport =\n            pc.transceivers[0].iceTransport;\n        pc.transceivers[sdpMLineIndex].dtlsTransport =\n            pc.transceivers[0].dtlsTransport;\n        if (pc.transceivers[sdpMLineIndex].rtpSender) {\n          pc.transceivers[sdpMLineIndex].rtpSender.setTransport(\n              pc.transceivers[0].dtlsTransport);\n        }\n        if (pc.transceivers[sdpMLineIndex].rtpReceiver) {\n          pc.transceivers[sdpMLineIndex].rtpReceiver.setTransport(\n              pc.transceivers[0].dtlsTransport);\n        }\n      }\n      if (description.type === 'offer' && !rejected) {\n        transceiver = pc.transceivers[sdpMLineIndex] ||\n            pc._createTransceiver(kind);\n        transceiver.mid = mid;\n\n        if (!transceiver.iceGatherer) {\n          transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex,\n              usingBundle);\n        }\n\n        if (cands.length && transceiver.iceTransport.state === 'new') {\n          if (isComplete && (!usingBundle || sdpMLineIndex === 0)) {\n            transceiver.iceTransport.setRemoteCandidates(cands);\n          } else {\n            cands.forEach(function(candidate) {\n              maybeAddCandidate(transceiver.iceTransport, candidate);\n            });\n          }\n        }\n\n        localCapabilities = window.RTCRtpReceiver.getCapabilities(kind);\n\n        // filter RTX until additional stuff needed for RTX is implemented\n        // in adapter.js\n        if (edgeVersion < 15019) {\n          localCapabilities.codecs = localCapabilities.codecs.filter(\n              function(codec) {\n                return codec.name !== 'rtx';\n              });\n        }\n\n        sendEncodingParameters = transceiver.sendEncodingParameters || [{\n          ssrc: (2 * sdpMLineIndex + 2) * 1001\n        }];\n\n        // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams\n        var isNewTrack = false;\n        if (direction === 'sendrecv' || direction === 'sendonly') {\n          isNewTrack = !transceiver.rtpReceiver;\n          rtpReceiver = transceiver.rtpReceiver ||\n              new window.RTCRtpReceiver(transceiver.dtlsTransport, kind);\n\n          if (isNewTrack) {\n            var stream;\n            track = rtpReceiver.track;\n            // FIXME: does not work with Plan B.\n            if (remoteMsid && remoteMsid.stream === '-') {\n              // no-op. a stream id of '-' means: no associated stream.\n            } else if (remoteMsid) {\n              if (!streams[remoteMsid.stream]) {\n                streams[remoteMsid.stream] = new window.MediaStream();\n                Object.defineProperty(streams[remoteMsid.stream], 'id', {\n                  get: function() {\n                    return remoteMsid.stream;\n                  }\n                });\n              }\n              Object.defineProperty(track, 'id', {\n                get: function() {\n                  return remoteMsid.track;\n                }\n              });\n              stream = streams[remoteMsid.stream];\n            } else {\n              if (!streams.default) {\n                streams.default = new window.MediaStream();\n              }\n              stream = streams.default;\n            }\n            if (stream) {\n              addTrackToStreamAndFireEvent(track, stream);\n              transceiver.associatedRemoteMediaStreams.push(stream);\n            }\n            receiverList.push([track, rtpReceiver, stream]);\n          }\n        } else if (transceiver.rtpReceiver && transceiver.rtpReceiver.track) {\n          transceiver.associatedRemoteMediaStreams.forEach(function(s) {\n            var nativeTrack = s.getTracks().find(function(t) {\n              return t.id === transceiver.rtpReceiver.track.id;\n            });\n            if (nativeTrack) {\n              removeTrackFromStreamAndFireEvent(nativeTrack, s);\n            }\n          });\n          transceiver.associatedRemoteMediaStreams = [];\n        }\n\n        transceiver.localCapabilities = localCapabilities;\n        transceiver.remoteCapabilities = remoteCapabilities;\n        transceiver.rtpReceiver = rtpReceiver;\n        transceiver.rtcpParameters = rtcpParameters;\n        transceiver.sendEncodingParameters = sendEncodingParameters;\n        transceiver.recvEncodingParameters = recvEncodingParameters;\n\n        // Start the RTCRtpReceiver now. The RTPSender is started in\n        // setLocalDescription.\n        pc._transceive(pc.transceivers[sdpMLineIndex],\n            false,\n            isNewTrack);\n      } else if (description.type === 'answer' && !rejected) {\n        transceiver = pc.transceivers[sdpMLineIndex];\n        iceGatherer = transceiver.iceGatherer;\n        iceTransport = transceiver.iceTransport;\n        dtlsTransport = transceiver.dtlsTransport;\n        rtpReceiver = transceiver.rtpReceiver;\n        sendEncodingParameters = transceiver.sendEncodingParameters;\n        localCapabilities = transceiver.localCapabilities;\n\n        pc.transceivers[sdpMLineIndex].recvEncodingParameters =\n            recvEncodingParameters;\n        pc.transceivers[sdpMLineIndex].remoteCapabilities =\n            remoteCapabilities;\n        pc.transceivers[sdpMLineIndex].rtcpParameters = rtcpParameters;\n\n        if (cands.length && iceTransport.state === 'new') {\n          if ((isIceLite || isComplete) &&\n              (!usingBundle || sdpMLineIndex === 0)) {\n            iceTransport.setRemoteCandidates(cands);\n          } else {\n            cands.forEach(function(candidate) {\n              maybeAddCandidate(transceiver.iceTransport, candidate);\n            });\n          }\n        }\n\n        if (!usingBundle || sdpMLineIndex === 0) {\n          if (iceTransport.state === 'new') {\n            iceTransport.start(iceGatherer, remoteIceParameters,\n                'controlling');\n          }\n          if (dtlsTransport.state === 'new') {\n            dtlsTransport.start(remoteDtlsParameters);\n          }\n        }\n\n        // If the offer contained RTX but the answer did not,\n        // remove RTX from sendEncodingParameters.\n        var commonCapabilities = getCommonCapabilities(\n          transceiver.localCapabilities,\n          transceiver.remoteCapabilities);\n\n        var hasRtx = commonCapabilities.codecs.filter(function(c) {\n          return c.name.toLowerCase() === 'rtx';\n        }).length;\n        if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) {\n          delete transceiver.sendEncodingParameters[0].rtx;\n        }\n\n        pc._transceive(transceiver,\n            direction === 'sendrecv' || direction === 'recvonly',\n            direction === 'sendrecv' || direction === 'sendonly');\n\n        // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams\n        if (rtpReceiver &&\n            (direction === 'sendrecv' || direction === 'sendonly')) {\n          track = rtpReceiver.track;\n          if (remoteMsid) {\n            if (!streams[remoteMsid.stream]) {\n              streams[remoteMsid.stream] = new window.MediaStream();\n            }\n            addTrackToStreamAndFireEvent(track, streams[remoteMsid.stream]);\n            receiverList.push([track, rtpReceiver, streams[remoteMsid.stream]]);\n          } else {\n            if (!streams.default) {\n              streams.default = new window.MediaStream();\n            }\n            addTrackToStreamAndFireEvent(track, streams.default);\n            receiverList.push([track, rtpReceiver, streams.default]);\n          }\n        } else {\n          // FIXME: actually the receiver should be created later.\n          delete transceiver.rtpReceiver;\n        }\n      }\n    });\n\n    if (pc._dtlsRole === undefined) {\n      pc._dtlsRole = description.type === 'offer' ? 'active' : 'passive';\n    }\n\n    pc._remoteDescription = {\n      type: description.type,\n      sdp: description.sdp\n    };\n    if (description.type === 'offer') {\n      pc._updateSignalingState('have-remote-offer');\n    } else {\n      pc._updateSignalingState('stable');\n    }\n    Object.keys(streams).forEach(function(sid) {\n      var stream = streams[sid];\n      if (stream.getTracks().length) {\n        if (pc.remoteStreams.indexOf(stream) === -1) {\n          pc.remoteStreams.push(stream);\n          var event = new Event('addstream');\n          event.stream = stream;\n          window.setTimeout(function() {\n            pc._dispatchEvent('addstream', event);\n          });\n        }\n\n        receiverList.forEach(function(item) {\n          var track = item[0];\n          var receiver = item[1];\n          if (stream.id !== item[2].id) {\n            return;\n          }\n          fireAddTrack(pc, track, receiver, [stream]);\n        });\n      }\n    });\n    receiverList.forEach(function(item) {\n      if (item[2]) {\n        return;\n      }\n      fireAddTrack(pc, item[0], item[1], []);\n    });\n\n    // check whether addIceCandidate({}) was called within four seconds after\n    // setRemoteDescription.\n    window.setTimeout(function() {\n      if (!(pc && pc.transceivers)) {\n        return;\n      }\n      pc.transceivers.forEach(function(transceiver) {\n        if (transceiver.iceTransport &&\n            transceiver.iceTransport.state === 'new' &&\n            transceiver.iceTransport.getRemoteCandidates().length > 0) {\n          console.warn('Timeout for addRemoteCandidate. Consider sending ' +\n              'an end-of-candidates notification');\n          transceiver.iceTransport.addRemoteCandidate({});\n        }\n      });\n    }, 4000);\n\n    return Promise.resolve();\n  };\n\n  RTCPeerConnection.prototype.close = function() {\n    this.transceivers.forEach(function(transceiver) {\n      /* not yet\n      if (transceiver.iceGatherer) {\n        transceiver.iceGatherer.close();\n      }\n      */\n      if (transceiver.iceTransport) {\n        transceiver.iceTransport.stop();\n      }\n      if (transceiver.dtlsTransport) {\n        transceiver.dtlsTransport.stop();\n      }\n      if (transceiver.rtpSender) {\n        transceiver.rtpSender.stop();\n      }\n      if (transceiver.rtpReceiver) {\n        transceiver.rtpReceiver.stop();\n      }\n    });\n    // FIXME: clean up tracks, local streams, remote streams, etc\n    this._isClosed = true;\n    this._updateSignalingState('closed');\n  };\n\n  // Update the signaling state.\n  RTCPeerConnection.prototype._updateSignalingState = function(newState) {\n    this.signalingState = newState;\n    var event = new Event('signalingstatechange');\n    this._dispatchEvent('signalingstatechange', event);\n  };\n\n  // Determine whether to fire the negotiationneeded event.\n  RTCPeerConnection.prototype._maybeFireNegotiationNeeded = function() {\n    var pc = this;\n    if (this.signalingState !== 'stable' || this.needNegotiation === true) {\n      return;\n    }\n    this.needNegotiation = true;\n    window.setTimeout(function() {\n      if (pc.needNegotiation) {\n        pc.needNegotiation = false;\n        var event = new Event('negotiationneeded');\n        pc._dispatchEvent('negotiationneeded', event);\n      }\n    }, 0);\n  };\n\n  // Update the ice connection state.\n  RTCPeerConnection.prototype._updateIceConnectionState = function() {\n    var newState;\n    var states = {\n      'new': 0,\n      closed: 0,\n      checking: 0,\n      connected: 0,\n      completed: 0,\n      disconnected: 0,\n      failed: 0\n    };\n    this.transceivers.forEach(function(transceiver) {\n      states[transceiver.iceTransport.state]++;\n    });\n\n    newState = 'new';\n    if (states.failed > 0) {\n      newState = 'failed';\n    } else if (states.checking > 0) {\n      newState = 'checking';\n    } else if (states.disconnected > 0) {\n      newState = 'disconnected';\n    } else if (states.new > 0) {\n      newState = 'new';\n    } else if (states.connected > 0) {\n      newState = 'connected';\n    } else if (states.completed > 0) {\n      newState = 'completed';\n    }\n\n    if (newState !== this.iceConnectionState) {\n      this.iceConnectionState = newState;\n      var event = new Event('iceconnectionstatechange');\n      this._dispatchEvent('iceconnectionstatechange', event);\n    }\n  };\n\n  // Update the connection state.\n  RTCPeerConnection.prototype._updateConnectionState = function() {\n    var newState;\n    var states = {\n      'new': 0,\n      closed: 0,\n      connecting: 0,\n      connected: 0,\n      completed: 0,\n      disconnected: 0,\n      failed: 0\n    };\n    this.transceivers.forEach(function(transceiver) {\n      states[transceiver.iceTransport.state]++;\n      states[transceiver.dtlsTransport.state]++;\n    });\n    // ICETransport.completed and connected are the same for this purpose.\n    states.connected += states.completed;\n\n    newState = 'new';\n    if (states.failed > 0) {\n      newState = 'failed';\n    } else if (states.connecting > 0) {\n      newState = 'connecting';\n    } else if (states.disconnected > 0) {\n      newState = 'disconnected';\n    } else if (states.new > 0) {\n      newState = 'new';\n    } else if (states.connected > 0) {\n      newState = 'connected';\n    }\n\n    if (newState !== this.connectionState) {\n      this.connectionState = newState;\n      var event = new Event('connectionstatechange');\n      this._dispatchEvent('connectionstatechange', event);\n    }\n  };\n\n  RTCPeerConnection.prototype.createOffer = function() {\n    var pc = this;\n\n    if (pc._isClosed) {\n      return Promise.reject(makeError('InvalidStateError',\n          'Can not call createOffer after close'));\n    }\n\n    var numAudioTracks = pc.transceivers.filter(function(t) {\n      return t.kind === 'audio';\n    }).length;\n    var numVideoTracks = pc.transceivers.filter(function(t) {\n      return t.kind === 'video';\n    }).length;\n\n    // Determine number of audio and video tracks we need to send/recv.\n    var offerOptions = arguments[0];\n    if (offerOptions) {\n      // Reject Chrome legacy constraints.\n      if (offerOptions.mandatory || offerOptions.optional) {\n        throw new TypeError(\n            'Legacy mandatory/optional constraints not supported.');\n      }\n      if (offerOptions.offerToReceiveAudio !== undefined) {\n        if (offerOptions.offerToReceiveAudio === true) {\n          numAudioTracks = 1;\n        } else if (offerOptions.offerToReceiveAudio === false) {\n          numAudioTracks = 0;\n        } else {\n          numAudioTracks = offerOptions.offerToReceiveAudio;\n        }\n      }\n      if (offerOptions.offerToReceiveVideo !== undefined) {\n        if (offerOptions.offerToReceiveVideo === true) {\n          numVideoTracks = 1;\n        } else if (offerOptions.offerToReceiveVideo === false) {\n          numVideoTracks = 0;\n        } else {\n          numVideoTracks = offerOptions.offerToReceiveVideo;\n        }\n      }\n    }\n\n    pc.transceivers.forEach(function(transceiver) {\n      if (transceiver.kind === 'audio') {\n        numAudioTracks--;\n        if (numAudioTracks < 0) {\n          transceiver.wantReceive = false;\n        }\n      } else if (transceiver.kind === 'video') {\n        numVideoTracks--;\n        if (numVideoTracks < 0) {\n          transceiver.wantReceive = false;\n        }\n      }\n    });\n\n    // Create M-lines for recvonly streams.\n    while (numAudioTracks > 0 || numVideoTracks > 0) {\n      if (numAudioTracks > 0) {\n        pc._createTransceiver('audio');\n        numAudioTracks--;\n      }\n      if (numVideoTracks > 0) {\n        pc._createTransceiver('video');\n        numVideoTracks--;\n      }\n    }\n\n    var sdp = SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,\n        pc._sdpSessionVersion++);\n    pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n      // For each track, create an ice gatherer, ice transport,\n      // dtls transport, potentially rtpsender and rtpreceiver.\n      var track = transceiver.track;\n      var kind = transceiver.kind;\n      var mid = transceiver.mid || SDPUtils.generateIdentifier();\n      transceiver.mid = mid;\n\n      if (!transceiver.iceGatherer) {\n        transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex,\n            pc.usingBundle);\n      }\n\n      var localCapabilities = window.RTCRtpSender.getCapabilities(kind);\n      // filter RTX until additional stuff needed for RTX is implemented\n      // in adapter.js\n      if (edgeVersion < 15019) {\n        localCapabilities.codecs = localCapabilities.codecs.filter(\n            function(codec) {\n              return codec.name !== 'rtx';\n            });\n      }\n      localCapabilities.codecs.forEach(function(codec) {\n        // work around https://bugs.chromium.org/p/webrtc/issues/detail?id=6552\n        // by adding level-asymmetry-allowed=1\n        if (codec.name === 'H264' &&\n            codec.parameters['level-asymmetry-allowed'] === undefined) {\n          codec.parameters['level-asymmetry-allowed'] = '1';\n        }\n\n        // for subsequent offers, we might have to re-use the payload\n        // type of the last offer.\n        if (transceiver.remoteCapabilities &&\n            transceiver.remoteCapabilities.codecs) {\n          transceiver.remoteCapabilities.codecs.forEach(function(remoteCodec) {\n            if (codec.name.toLowerCase() === remoteCodec.name.toLowerCase() &&\n                codec.clockRate === remoteCodec.clockRate) {\n              codec.preferredPayloadType = remoteCodec.payloadType;\n            }\n          });\n        }\n      });\n      localCapabilities.headerExtensions.forEach(function(hdrExt) {\n        var remoteExtensions = transceiver.remoteCapabilities &&\n            transceiver.remoteCapabilities.headerExtensions || [];\n        remoteExtensions.forEach(function(rHdrExt) {\n          if (hdrExt.uri === rHdrExt.uri) {\n            hdrExt.id = rHdrExt.id;\n          }\n        });\n      });\n\n      // generate an ssrc now, to be used later in rtpSender.send\n      var sendEncodingParameters = transceiver.sendEncodingParameters || [{\n        ssrc: (2 * sdpMLineIndex + 1) * 1001\n      }];\n      if (track) {\n        // add RTX\n        if (edgeVersion >= 15019 && kind === 'video' &&\n            !sendEncodingParameters[0].rtx) {\n          sendEncodingParameters[0].rtx = {\n            ssrc: sendEncodingParameters[0].ssrc + 1\n          };\n        }\n      }\n\n      if (transceiver.wantReceive) {\n        transceiver.rtpReceiver = new window.RTCRtpReceiver(\n            transceiver.dtlsTransport, kind);\n      }\n\n      transceiver.localCapabilities = localCapabilities;\n      transceiver.sendEncodingParameters = sendEncodingParameters;\n    });\n\n    // always offer BUNDLE and dispose on return if not supported.\n    if (pc._config.bundlePolicy !== 'max-compat') {\n      sdp += 'a=group:BUNDLE ' + pc.transceivers.map(function(t) {\n        return t.mid;\n      }).join(' ') + '\\r\\n';\n    }\n    sdp += 'a=ice-options:trickle\\r\\n';\n\n    pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n      sdp += writeMediaSection(transceiver, transceiver.localCapabilities,\n          'offer', transceiver.stream, pc._dtlsRole);\n      sdp += 'a=rtcp-rsize\\r\\n';\n\n      if (transceiver.iceGatherer && pc.iceGatheringState !== 'new' &&\n          (sdpMLineIndex === 0 || !pc.usingBundle)) {\n        transceiver.iceGatherer.getLocalCandidates().forEach(function(cand) {\n          cand.component = 1;\n          sdp += 'a=' + SDPUtils.writeCandidate(cand) + '\\r\\n';\n        });\n\n        if (transceiver.iceGatherer.state === 'completed') {\n          sdp += 'a=end-of-candidates\\r\\n';\n        }\n      }\n    });\n\n    var desc = new window.RTCSessionDescription({\n      type: 'offer',\n      sdp: sdp\n    });\n    return Promise.resolve(desc);\n  };\n\n  RTCPeerConnection.prototype.createAnswer = function() {\n    var pc = this;\n\n    if (pc._isClosed) {\n      return Promise.reject(makeError('InvalidStateError',\n          'Can not call createAnswer after close'));\n    }\n\n    if (!(pc.signalingState === 'have-remote-offer' ||\n        pc.signalingState === 'have-local-pranswer')) {\n      return Promise.reject(makeError('InvalidStateError',\n          'Can not call createAnswer in signalingState ' + pc.signalingState));\n    }\n\n    var sdp = SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,\n        pc._sdpSessionVersion++);\n    if (pc.usingBundle) {\n      sdp += 'a=group:BUNDLE ' + pc.transceivers.map(function(t) {\n        return t.mid;\n      }).join(' ') + '\\r\\n';\n    }\n    sdp += 'a=ice-options:trickle\\r\\n';\n\n    var mediaSectionsInOffer = SDPUtils.getMediaSections(\n        pc._remoteDescription.sdp).length;\n    pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n      if (sdpMLineIndex + 1 > mediaSectionsInOffer) {\n        return;\n      }\n      if (transceiver.rejected) {\n        if (transceiver.kind === 'application') {\n          if (transceiver.protocol === 'DTLS/SCTP') { // legacy fmt\n            sdp += 'm=application 0 DTLS/SCTP 5000\\r\\n';\n          } else {\n            sdp += 'm=application 0 ' + transceiver.protocol +\n                ' webrtc-datachannel\\r\\n';\n          }\n        } else if (transceiver.kind === 'audio') {\n          sdp += 'm=audio 0 UDP/TLS/RTP/SAVPF 0\\r\\n' +\n              'a=rtpmap:0 PCMU/8000\\r\\n';\n        } else if (transceiver.kind === 'video') {\n          sdp += 'm=video 0 UDP/TLS/RTP/SAVPF 120\\r\\n' +\n              'a=rtpmap:120 VP8/90000\\r\\n';\n        }\n        sdp += 'c=IN IP4 0.0.0.0\\r\\n' +\n            'a=inactive\\r\\n' +\n            'a=mid:' + transceiver.mid + '\\r\\n';\n        return;\n      }\n\n      // FIXME: look at direction.\n      if (transceiver.stream) {\n        var localTrack;\n        if (transceiver.kind === 'audio') {\n          localTrack = transceiver.stream.getAudioTracks()[0];\n        } else if (transceiver.kind === 'video') {\n          localTrack = transceiver.stream.getVideoTracks()[0];\n        }\n        if (localTrack) {\n          // add RTX\n          if (edgeVersion >= 15019 && transceiver.kind === 'video' &&\n              !transceiver.sendEncodingParameters[0].rtx) {\n            transceiver.sendEncodingParameters[0].rtx = {\n              ssrc: transceiver.sendEncodingParameters[0].ssrc + 1\n            };\n          }\n        }\n      }\n\n      // Calculate intersection of capabilities.\n      var commonCapabilities = getCommonCapabilities(\n          transceiver.localCapabilities,\n          transceiver.remoteCapabilities);\n\n      var hasRtx = commonCapabilities.codecs.filter(function(c) {\n        return c.name.toLowerCase() === 'rtx';\n      }).length;\n      if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) {\n        delete transceiver.sendEncodingParameters[0].rtx;\n      }\n\n      sdp += writeMediaSection(transceiver, commonCapabilities,\n          'answer', transceiver.stream, pc._dtlsRole);\n      if (transceiver.rtcpParameters &&\n          transceiver.rtcpParameters.reducedSize) {\n        sdp += 'a=rtcp-rsize\\r\\n';\n      }\n    });\n\n    var desc = new window.RTCSessionDescription({\n      type: 'answer',\n      sdp: sdp\n    });\n    return Promise.resolve(desc);\n  };\n\n  RTCPeerConnection.prototype.addIceCandidate = function(candidate) {\n    var pc = this;\n    var sections;\n    if (candidate && !(candidate.sdpMLineIndex !== undefined ||\n        candidate.sdpMid)) {\n      return Promise.reject(new TypeError('sdpMLineIndex or sdpMid required'));\n    }\n\n    // TODO: needs to go into ops queue.\n    return new Promise(function(resolve, reject) {\n      if (!pc._remoteDescription) {\n        return reject(makeError('InvalidStateError',\n            'Can not add ICE candidate without a remote description'));\n      } else if (!candidate || candidate.candidate === '') {\n        for (var j = 0; j < pc.transceivers.length; j++) {\n          if (pc.transceivers[j].rejected) {\n            continue;\n          }\n          pc.transceivers[j].iceTransport.addRemoteCandidate({});\n          sections = SDPUtils.getMediaSections(pc._remoteDescription.sdp);\n          sections[j] += 'a=end-of-candidates\\r\\n';\n          pc._remoteDescription.sdp =\n              SDPUtils.getDescription(pc._remoteDescription.sdp) +\n              sections.join('');\n          if (pc.usingBundle) {\n            break;\n          }\n        }\n      } else {\n        var sdpMLineIndex = candidate.sdpMLineIndex;\n        if (candidate.sdpMid) {\n          for (var i = 0; i < pc.transceivers.length; i++) {\n            if (pc.transceivers[i].mid === candidate.sdpMid) {\n              sdpMLineIndex = i;\n              break;\n            }\n          }\n        }\n        var transceiver = pc.transceivers[sdpMLineIndex];\n        if (transceiver) {\n          if (transceiver.rejected) {\n            return resolve();\n          }\n          var cand = Object.keys(candidate.candidate).length > 0 ?\n              SDPUtils.parseCandidate(candidate.candidate) : {};\n          // Ignore Chrome's invalid candidates since Edge does not like them.\n          if (cand.protocol === 'tcp' && (cand.port === 0 || cand.port === 9)) {\n            return resolve();\n          }\n          // Ignore RTCP candidates, we assume RTCP-MUX.\n          if (cand.component && cand.component !== 1) {\n            return resolve();\n          }\n          // when using bundle, avoid adding candidates to the wrong\n          // ice transport. And avoid adding candidates added in the SDP.\n          if (sdpMLineIndex === 0 || (sdpMLineIndex > 0 &&\n              transceiver.iceTransport !== pc.transceivers[0].iceTransport)) {\n            if (!maybeAddCandidate(transceiver.iceTransport, cand)) {\n              return reject(makeError('OperationError',\n                  'Can not add ICE candidate'));\n            }\n          }\n\n          // update the remoteDescription.\n          var candidateString = candidate.candidate.trim();\n          if (candidateString.indexOf('a=') === 0) {\n            candidateString = candidateString.substr(2);\n          }\n          sections = SDPUtils.getMediaSections(pc._remoteDescription.sdp);\n          sections[sdpMLineIndex] += 'a=' +\n              (cand.type ? candidateString : 'end-of-candidates')\n              + '\\r\\n';\n          pc._remoteDescription.sdp =\n              SDPUtils.getDescription(pc._remoteDescription.sdp) +\n              sections.join('');\n        } else {\n          return reject(makeError('OperationError',\n              'Can not add ICE candidate'));\n        }\n      }\n      resolve();\n    });\n  };\n\n  RTCPeerConnection.prototype.getStats = function(selector) {\n    if (selector && selector instanceof window.MediaStreamTrack) {\n      var senderOrReceiver = null;\n      this.transceivers.forEach(function(transceiver) {\n        if (transceiver.rtpSender &&\n            transceiver.rtpSender.track === selector) {\n          senderOrReceiver = transceiver.rtpSender;\n        } else if (transceiver.rtpReceiver &&\n            transceiver.rtpReceiver.track === selector) {\n          senderOrReceiver = transceiver.rtpReceiver;\n        }\n      });\n      if (!senderOrReceiver) {\n        throw makeError('InvalidAccessError', 'Invalid selector.');\n      }\n      return senderOrReceiver.getStats();\n    }\n\n    var promises = [];\n    this.transceivers.forEach(function(transceiver) {\n      ['rtpSender', 'rtpReceiver', 'iceGatherer', 'iceTransport',\n          'dtlsTransport'].forEach(function(method) {\n            if (transceiver[method]) {\n              promises.push(transceiver[method].getStats());\n            }\n          });\n    });\n    return Promise.all(promises).then(function(allStats) {\n      var results = new Map();\n      allStats.forEach(function(stats) {\n        stats.forEach(function(stat) {\n          results.set(stat.id, stat);\n        });\n      });\n      return results;\n    });\n  };\n\n  // fix low-level stat names and return Map instead of object.\n  var ortcObjects = ['RTCRtpSender', 'RTCRtpReceiver', 'RTCIceGatherer',\n    'RTCIceTransport', 'RTCDtlsTransport'];\n  ortcObjects.forEach(function(ortcObjectName) {\n    var obj = window[ortcObjectName];\n    if (obj && obj.prototype && obj.prototype.getStats) {\n      var nativeGetstats = obj.prototype.getStats;\n      obj.prototype.getStats = function() {\n        return nativeGetstats.apply(this)\n        .then(function(nativeStats) {\n          var mapStats = new Map();\n          Object.keys(nativeStats).forEach(function(id) {\n            nativeStats[id].type = fixStatsType(nativeStats[id]);\n            mapStats.set(id, nativeStats[id]);\n          });\n          return mapStats;\n        });\n      };\n    }\n  });\n\n  // legacy callback shims. Should be moved to adapter.js some days.\n  var methods = ['createOffer', 'createAnswer'];\n  methods.forEach(function(method) {\n    var nativeMethod = RTCPeerConnection.prototype[method];\n    RTCPeerConnection.prototype[method] = function() {\n      var args = arguments;\n      if (typeof args[0] === 'function' ||\n          typeof args[1] === 'function') { // legacy\n        return nativeMethod.apply(this, [arguments[2]])\n        .then(function(description) {\n          if (typeof args[0] === 'function') {\n            args[0].apply(null, [description]);\n          }\n        }, function(error) {\n          if (typeof args[1] === 'function') {\n            args[1].apply(null, [error]);\n          }\n        });\n      }\n      return nativeMethod.apply(this, arguments);\n    };\n  });\n\n  methods = ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate'];\n  methods.forEach(function(method) {\n    var nativeMethod = RTCPeerConnection.prototype[method];\n    RTCPeerConnection.prototype[method] = function() {\n      var args = arguments;\n      if (typeof args[1] === 'function' ||\n          typeof args[2] === 'function') { // legacy\n        return nativeMethod.apply(this, arguments)\n        .then(function() {\n          if (typeof args[1] === 'function') {\n            args[1].apply(null);\n          }\n        }, function(error) {\n          if (typeof args[2] === 'function') {\n            args[2].apply(null, [error]);\n          }\n        });\n      }\n      return nativeMethod.apply(this, arguments);\n    };\n  });\n\n  // getStats is special. It doesn't have a spec legacy method yet we support\n  // getStats(something, cb) without error callbacks.\n  ['getStats'].forEach(function(method) {\n    var nativeMethod = RTCPeerConnection.prototype[method];\n    RTCPeerConnection.prototype[method] = function() {\n      var args = arguments;\n      if (typeof args[1] === 'function') {\n        return nativeMethod.apply(this, arguments)\n        .then(function() {\n          if (typeof args[1] === 'function') {\n            args[1].apply(null);\n          }\n        });\n      }\n      return nativeMethod.apply(this, arguments);\n    };\n  });\n\n  return RTCPeerConnection;\n};\n\n},{\"sdp\":2}],2:[function(require,module,exports){\n /* eslint-env node */\n'use strict';\n\n// SDP helpers.\nvar SDPUtils = {};\n\n// Generate an alphanumeric identifier for cname or mids.\n// TODO: use UUIDs instead? https://gist.github.com/jed/982883\nSDPUtils.generateIdentifier = function() {\n  return Math.random().toString(36).substr(2, 10);\n};\n\n// The RTCP CNAME used by all peerconnections from the same JS.\nSDPUtils.localCName = SDPUtils.generateIdentifier();\n\n// Splits SDP into lines, dealing with both CRLF and LF.\nSDPUtils.splitLines = function(blob) {\n  return blob.trim().split('\\n').map(function(line) {\n    return line.trim();\n  });\n};\n// Splits SDP into sessionpart and mediasections. Ensures CRLF.\nSDPUtils.splitSections = function(blob) {\n  var parts = blob.split('\\nm=');\n  return parts.map(function(part, index) {\n    return (index > 0 ? 'm=' + part : part).trim() + '\\r\\n';\n  });\n};\n\n// returns the session description.\nSDPUtils.getDescription = function(blob) {\n  var sections = SDPUtils.splitSections(blob);\n  return sections && sections[0];\n};\n\n// returns the individual media sections.\nSDPUtils.getMediaSections = function(blob) {\n  var sections = SDPUtils.splitSections(blob);\n  sections.shift();\n  return sections;\n};\n\n// Returns lines that start with a certain prefix.\nSDPUtils.matchPrefix = function(blob, prefix) {\n  return SDPUtils.splitLines(blob).filter(function(line) {\n    return line.indexOf(prefix) === 0;\n  });\n};\n\n// Parses an ICE candidate line. Sample input:\n// candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8\n// rport 55996\"\nSDPUtils.parseCandidate = function(line) {\n  var parts;\n  // Parse both variants.\n  if (line.indexOf('a=candidate:') === 0) {\n    parts = line.substring(12).split(' ');\n  } else {\n    parts = line.substring(10).split(' ');\n  }\n\n  var candidate = {\n    foundation: parts[0],\n    component: parseInt(parts[1], 10),\n    protocol: parts[2].toLowerCase(),\n    priority: parseInt(parts[3], 10),\n    ip: parts[4],\n    address: parts[4], // address is an alias for ip.\n    port: parseInt(parts[5], 10),\n    // skip parts[6] == 'typ'\n    type: parts[7]\n  };\n\n  for (var i = 8; i < parts.length; i += 2) {\n    switch (parts[i]) {\n      case 'raddr':\n        candidate.relatedAddress = parts[i + 1];\n        break;\n      case 'rport':\n        candidate.relatedPort = parseInt(parts[i + 1], 10);\n        break;\n      case 'tcptype':\n        candidate.tcpType = parts[i + 1];\n        break;\n      case 'ufrag':\n        candidate.ufrag = parts[i + 1]; // for backward compability.\n        candidate.usernameFragment = parts[i + 1];\n        break;\n      default: // extension handling, in particular ufrag\n        candidate[parts[i]] = parts[i + 1];\n        break;\n    }\n  }\n  return candidate;\n};\n\n// Translates a candidate object into SDP candidate attribute.\nSDPUtils.writeCandidate = function(candidate) {\n  var sdp = [];\n  sdp.push(candidate.foundation);\n  sdp.push(candidate.component);\n  sdp.push(candidate.protocol.toUpperCase());\n  sdp.push(candidate.priority);\n  sdp.push(candidate.address || candidate.ip);\n  sdp.push(candidate.port);\n\n  var type = candidate.type;\n  sdp.push('typ');\n  sdp.push(type);\n  if (type !== 'host' && candidate.relatedAddress &&\n      candidate.relatedPort) {\n    sdp.push('raddr');\n    sdp.push(candidate.relatedAddress);\n    sdp.push('rport');\n    sdp.push(candidate.relatedPort);\n  }\n  if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') {\n    sdp.push('tcptype');\n    sdp.push(candidate.tcpType);\n  }\n  if (candidate.usernameFragment || candidate.ufrag) {\n    sdp.push('ufrag');\n    sdp.push(candidate.usernameFragment || candidate.ufrag);\n  }\n  return 'candidate:' + sdp.join(' ');\n};\n\n// Parses an ice-options line, returns an array of option tags.\n// a=ice-options:foo bar\nSDPUtils.parseIceOptions = function(line) {\n  return line.substr(14).split(' ');\n};\n\n// Parses an rtpmap line, returns RTCRtpCoddecParameters. Sample input:\n// a=rtpmap:111 opus/48000/2\nSDPUtils.parseRtpMap = function(line) {\n  var parts = line.substr(9).split(' ');\n  var parsed = {\n    payloadType: parseInt(parts.shift(), 10) // was: id\n  };\n\n  parts = parts[0].split('/');\n\n  parsed.name = parts[0];\n  parsed.clockRate = parseInt(parts[1], 10); // was: clockrate\n  parsed.channels = parts.length === 3 ? parseInt(parts[2], 10) : 1;\n  // legacy alias, got renamed back to channels in ORTC.\n  parsed.numChannels = parsed.channels;\n  return parsed;\n};\n\n// Generate an a=rtpmap line from RTCRtpCodecCapability or\n// RTCRtpCodecParameters.\nSDPUtils.writeRtpMap = function(codec) {\n  var pt = codec.payloadType;\n  if (codec.preferredPayloadType !== undefined) {\n    pt = codec.preferredPayloadType;\n  }\n  var channels = codec.channels || codec.numChannels || 1;\n  return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate +\n      (channels !== 1 ? '/' + channels : '') + '\\r\\n';\n};\n\n// Parses an a=extmap line (headerextension from RFC 5285). Sample input:\n// a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\n// a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:toffset\nSDPUtils.parseExtmap = function(line) {\n  var parts = line.substr(9).split(' ');\n  return {\n    id: parseInt(parts[0], 10),\n    direction: parts[0].indexOf('/') > 0 ? parts[0].split('/')[1] : 'sendrecv',\n    uri: parts[1]\n  };\n};\n\n// Generates a=extmap line from RTCRtpHeaderExtensionParameters or\n// RTCRtpHeaderExtension.\nSDPUtils.writeExtmap = function(headerExtension) {\n  return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) +\n      (headerExtension.direction && headerExtension.direction !== 'sendrecv'\n          ? '/' + headerExtension.direction\n          : '') +\n      ' ' + headerExtension.uri + '\\r\\n';\n};\n\n// Parses an ftmp line, returns dictionary. Sample input:\n// a=fmtp:96 vbr=on;cng=on\n// Also deals with vbr=on; cng=on\nSDPUtils.parseFmtp = function(line) {\n  var parsed = {};\n  var kv;\n  var parts = line.substr(line.indexOf(' ') + 1).split(';');\n  for (var j = 0; j < parts.length; j++) {\n    kv = parts[j].trim().split('=');\n    parsed[kv[0].trim()] = kv[1];\n  }\n  return parsed;\n};\n\n// Generates an a=ftmp line from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeFmtp = function(codec) {\n  var line = '';\n  var pt = codec.payloadType;\n  if (codec.preferredPayloadType !== undefined) {\n    pt = codec.preferredPayloadType;\n  }\n  if (codec.parameters && Object.keys(codec.parameters).length) {\n    var params = [];\n    Object.keys(codec.parameters).forEach(function(param) {\n      if (codec.parameters[param]) {\n        params.push(param + '=' + codec.parameters[param]);\n      } else {\n        params.push(param);\n      }\n    });\n    line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\\r\\n';\n  }\n  return line;\n};\n\n// Parses an rtcp-fb line, returns RTCPRtcpFeedback object. Sample input:\n// a=rtcp-fb:98 nack rpsi\nSDPUtils.parseRtcpFb = function(line) {\n  var parts = line.substr(line.indexOf(' ') + 1).split(' ');\n  return {\n    type: parts.shift(),\n    parameter: parts.join(' ')\n  };\n};\n// Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeRtcpFb = function(codec) {\n  var lines = '';\n  var pt = codec.payloadType;\n  if (codec.preferredPayloadType !== undefined) {\n    pt = codec.preferredPayloadType;\n  }\n  if (codec.rtcpFeedback && codec.rtcpFeedback.length) {\n    // FIXME: special handling for trr-int?\n    codec.rtcpFeedback.forEach(function(fb) {\n      lines += 'a=rtcp-fb:' + pt + ' ' + fb.type +\n      (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') +\n          '\\r\\n';\n    });\n  }\n  return lines;\n};\n\n// Parses an RFC 5576 ssrc media attribute. Sample input:\n// a=ssrc:3735928559 cname:something\nSDPUtils.parseSsrcMedia = function(line) {\n  var sp = line.indexOf(' ');\n  var parts = {\n    ssrc: parseInt(line.substr(7, sp - 7), 10)\n  };\n  var colon = line.indexOf(':', sp);\n  if (colon > -1) {\n    parts.attribute = line.substr(sp + 1, colon - sp - 1);\n    parts.value = line.substr(colon + 1);\n  } else {\n    parts.attribute = line.substr(sp + 1);\n  }\n  return parts;\n};\n\nSDPUtils.parseSsrcGroup = function(line) {\n  var parts = line.substr(13).split(' ');\n  return {\n    semantics: parts.shift(),\n    ssrcs: parts.map(function(ssrc) {\n      return parseInt(ssrc, 10);\n    })\n  };\n};\n\n// Extracts the MID (RFC 5888) from a media section.\n// returns the MID or undefined if no mid line was found.\nSDPUtils.getMid = function(mediaSection) {\n  var mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0];\n  if (mid) {\n    return mid.substr(6);\n  }\n};\n\nSDPUtils.parseFingerprint = function(line) {\n  var parts = line.substr(14).split(' ');\n  return {\n    algorithm: parts[0].toLowerCase(), // algorithm is case-sensitive in Edge.\n    value: parts[1]\n  };\n};\n\n// Extracts DTLS parameters from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n//   get the fingerprint line as input. See also getIceParameters.\nSDPUtils.getDtlsParameters = function(mediaSection, sessionpart) {\n  var lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n      'a=fingerprint:');\n  // Note: a=setup line is ignored since we use the 'auto' role.\n  // Note2: 'algorithm' is not case sensitive except in Edge.\n  return {\n    role: 'auto',\n    fingerprints: lines.map(SDPUtils.parseFingerprint)\n  };\n};\n\n// Serializes DTLS parameters to SDP.\nSDPUtils.writeDtlsParameters = function(params, setupType) {\n  var sdp = 'a=setup:' + setupType + '\\r\\n';\n  params.fingerprints.forEach(function(fp) {\n    sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\\r\\n';\n  });\n  return sdp;\n};\n// Parses ICE information from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n//   get the ice-ufrag and ice-pwd lines as input.\nSDPUtils.getIceParameters = function(mediaSection, sessionpart) {\n  var lines = SDPUtils.splitLines(mediaSection);\n  // Search in session part, too.\n  lines = lines.concat(SDPUtils.splitLines(sessionpart));\n  var iceParameters = {\n    usernameFragment: lines.filter(function(line) {\n      return line.indexOf('a=ice-ufrag:') === 0;\n    })[0].substr(12),\n    password: lines.filter(function(line) {\n      return line.indexOf('a=ice-pwd:') === 0;\n    })[0].substr(10)\n  };\n  return iceParameters;\n};\n\n// Serializes ICE parameters to SDP.\nSDPUtils.writeIceParameters = function(params) {\n  return 'a=ice-ufrag:' + params.usernameFragment + '\\r\\n' +\n      'a=ice-pwd:' + params.password + '\\r\\n';\n};\n\n// Parses the SDP media section and returns RTCRtpParameters.\nSDPUtils.parseRtpParameters = function(mediaSection) {\n  var description = {\n    codecs: [],\n    headerExtensions: [],\n    fecMechanisms: [],\n    rtcp: []\n  };\n  var lines = SDPUtils.splitLines(mediaSection);\n  var mline = lines[0].split(' ');\n  for (var i = 3; i < mline.length; i++) { // find all codecs from mline[3..]\n    var pt = mline[i];\n    var rtpmapline = SDPUtils.matchPrefix(\n        mediaSection, 'a=rtpmap:' + pt + ' ')[0];\n    if (rtpmapline) {\n      var codec = SDPUtils.parseRtpMap(rtpmapline);\n      var fmtps = SDPUtils.matchPrefix(\n          mediaSection, 'a=fmtp:' + pt + ' ');\n      // Only the first a=fmtp:<pt> is considered.\n      codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {};\n      codec.rtcpFeedback = SDPUtils.matchPrefix(\n          mediaSection, 'a=rtcp-fb:' + pt + ' ')\n        .map(SDPUtils.parseRtcpFb);\n      description.codecs.push(codec);\n      // parse FEC mechanisms from rtpmap lines.\n      switch (codec.name.toUpperCase()) {\n        case 'RED':\n        case 'ULPFEC':\n          description.fecMechanisms.push(codec.name.toUpperCase());\n          break;\n        default: // only RED and ULPFEC are recognized as FEC mechanisms.\n          break;\n      }\n    }\n  }\n  SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(function(line) {\n    description.headerExtensions.push(SDPUtils.parseExtmap(line));\n  });\n  // FIXME: parse rtcp.\n  return description;\n};\n\n// Generates parts of the SDP media section describing the capabilities /\n// parameters.\nSDPUtils.writeRtpDescription = function(kind, caps) {\n  var sdp = '';\n\n  // Build the mline.\n  sdp += 'm=' + kind + ' ';\n  sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs.\n  sdp += ' UDP/TLS/RTP/SAVPF ';\n  sdp += caps.codecs.map(function(codec) {\n    if (codec.preferredPayloadType !== undefined) {\n      return codec.preferredPayloadType;\n    }\n    return codec.payloadType;\n  }).join(' ') + '\\r\\n';\n\n  sdp += 'c=IN IP4 0.0.0.0\\r\\n';\n  sdp += 'a=rtcp:9 IN IP4 0.0.0.0\\r\\n';\n\n  // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb.\n  caps.codecs.forEach(function(codec) {\n    sdp += SDPUtils.writeRtpMap(codec);\n    sdp += SDPUtils.writeFmtp(codec);\n    sdp += SDPUtils.writeRtcpFb(codec);\n  });\n  var maxptime = 0;\n  caps.codecs.forEach(function(codec) {\n    if (codec.maxptime > maxptime) {\n      maxptime = codec.maxptime;\n    }\n  });\n  if (maxptime > 0) {\n    sdp += 'a=maxptime:' + maxptime + '\\r\\n';\n  }\n  sdp += 'a=rtcp-mux\\r\\n';\n\n  if (caps.headerExtensions) {\n    caps.headerExtensions.forEach(function(extension) {\n      sdp += SDPUtils.writeExtmap(extension);\n    });\n  }\n  // FIXME: write fecMechanisms.\n  return sdp;\n};\n\n// Parses the SDP media section and returns an array of\n// RTCRtpEncodingParameters.\nSDPUtils.parseRtpEncodingParameters = function(mediaSection) {\n  var encodingParameters = [];\n  var description = SDPUtils.parseRtpParameters(mediaSection);\n  var hasRed = description.fecMechanisms.indexOf('RED') !== -1;\n  var hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1;\n\n  // filter a=ssrc:... cname:, ignore PlanB-msid\n  var ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n  .map(function(line) {\n    return SDPUtils.parseSsrcMedia(line);\n  })\n  .filter(function(parts) {\n    return parts.attribute === 'cname';\n  });\n  var primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc;\n  var secondarySsrc;\n\n  var flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID')\n  .map(function(line) {\n    var parts = line.substr(17).split(' ');\n    return parts.map(function(part) {\n      return parseInt(part, 10);\n    });\n  });\n  if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) {\n    secondarySsrc = flows[0][1];\n  }\n\n  description.codecs.forEach(function(codec) {\n    if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) {\n      var encParam = {\n        ssrc: primarySsrc,\n        codecPayloadType: parseInt(codec.parameters.apt, 10)\n      };\n      if (primarySsrc && secondarySsrc) {\n        encParam.rtx = {ssrc: secondarySsrc};\n      }\n      encodingParameters.push(encParam);\n      if (hasRed) {\n        encParam = JSON.parse(JSON.stringify(encParam));\n        encParam.fec = {\n          ssrc: primarySsrc,\n          mechanism: hasUlpfec ? 'red+ulpfec' : 'red'\n        };\n        encodingParameters.push(encParam);\n      }\n    }\n  });\n  if (encodingParameters.length === 0 && primarySsrc) {\n    encodingParameters.push({\n      ssrc: primarySsrc\n    });\n  }\n\n  // we support both b=AS and b=TIAS but interpret AS as TIAS.\n  var bandwidth = SDPUtils.matchPrefix(mediaSection, 'b=');\n  if (bandwidth.length) {\n    if (bandwidth[0].indexOf('b=TIAS:') === 0) {\n      bandwidth = parseInt(bandwidth[0].substr(7), 10);\n    } else if (bandwidth[0].indexOf('b=AS:') === 0) {\n      // use formula from JSEP to convert b=AS to TIAS value.\n      bandwidth = parseInt(bandwidth[0].substr(5), 10) * 1000 * 0.95\n          - (50 * 40 * 8);\n    } else {\n      bandwidth = undefined;\n    }\n    encodingParameters.forEach(function(params) {\n      params.maxBitrate = bandwidth;\n    });\n  }\n  return encodingParameters;\n};\n\n// parses http://draft.ortc.org/#rtcrtcpparameters*\nSDPUtils.parseRtcpParameters = function(mediaSection) {\n  var rtcpParameters = {};\n\n  // Gets the first SSRC. Note tha with RTX there might be multiple\n  // SSRCs.\n  var remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n      .map(function(line) {\n        return SDPUtils.parseSsrcMedia(line);\n      })\n      .filter(function(obj) {\n        return obj.attribute === 'cname';\n      })[0];\n  if (remoteSsrc) {\n    rtcpParameters.cname = remoteSsrc.value;\n    rtcpParameters.ssrc = remoteSsrc.ssrc;\n  }\n\n  // Edge uses the compound attribute instead of reducedSize\n  // compound is !reducedSize\n  var rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize');\n  rtcpParameters.reducedSize = rsize.length > 0;\n  rtcpParameters.compound = rsize.length === 0;\n\n  // parses the rtcp-mux attrіbute.\n  // Note that Edge does not support unmuxed RTCP.\n  var mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux');\n  rtcpParameters.mux = mux.length > 0;\n\n  return rtcpParameters;\n};\n\n// parses either a=msid: or a=ssrc:... msid lines and returns\n// the id of the MediaStream and MediaStreamTrack.\nSDPUtils.parseMsid = function(mediaSection) {\n  var parts;\n  var spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:');\n  if (spec.length === 1) {\n    parts = spec[0].substr(7).split(' ');\n    return {stream: parts[0], track: parts[1]};\n  }\n  var planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n  .map(function(line) {\n    return SDPUtils.parseSsrcMedia(line);\n  })\n  .filter(function(msidParts) {\n    return msidParts.attribute === 'msid';\n  });\n  if (planB.length > 0) {\n    parts = planB[0].value.split(' ');\n    return {stream: parts[0], track: parts[1]};\n  }\n};\n\n// Generate a session ID for SDP.\n// https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-5.2.1\n// recommends using a cryptographically random +ve 64-bit value\n// but right now this should be acceptable and within the right range\nSDPUtils.generateSessionId = function() {\n  return Math.random().toString().substr(2, 21);\n};\n\n// Write boilder plate for start of SDP\n// sessId argument is optional - if not supplied it will\n// be generated randomly\n// sessVersion is optional and defaults to 2\n// sessUser is optional and defaults to 'thisisadapterortc'\nSDPUtils.writeSessionBoilerplate = function(sessId, sessVer, sessUser) {\n  var sessionId;\n  var version = sessVer !== undefined ? sessVer : 2;\n  if (sessId) {\n    sessionId = sessId;\n  } else {\n    sessionId = SDPUtils.generateSessionId();\n  }\n  var user = sessUser || 'thisisadapterortc';\n  // FIXME: sess-id should be an NTP timestamp.\n  return 'v=0\\r\\n' +\n      'o=' + user + ' ' + sessionId + ' ' + version +\n        ' IN IP4 127.0.0.1\\r\\n' +\n      's=-\\r\\n' +\n      't=0 0\\r\\n';\n};\n\nSDPUtils.writeMediaSection = function(transceiver, caps, type, stream) {\n  var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps);\n\n  // Map ICE parameters (ufrag, pwd) to SDP.\n  sdp += SDPUtils.writeIceParameters(\n      transceiver.iceGatherer.getLocalParameters());\n\n  // Map DTLS parameters to SDP.\n  sdp += SDPUtils.writeDtlsParameters(\n      transceiver.dtlsTransport.getLocalParameters(),\n      type === 'offer' ? 'actpass' : 'active');\n\n  sdp += 'a=mid:' + transceiver.mid + '\\r\\n';\n\n  if (transceiver.direction) {\n    sdp += 'a=' + transceiver.direction + '\\r\\n';\n  } else if (transceiver.rtpSender && transceiver.rtpReceiver) {\n    sdp += 'a=sendrecv\\r\\n';\n  } else if (transceiver.rtpSender) {\n    sdp += 'a=sendonly\\r\\n';\n  } else if (transceiver.rtpReceiver) {\n    sdp += 'a=recvonly\\r\\n';\n  } else {\n    sdp += 'a=inactive\\r\\n';\n  }\n\n  if (transceiver.rtpSender) {\n    // spec.\n    var msid = 'msid:' + stream.id + ' ' +\n        transceiver.rtpSender.track.id + '\\r\\n';\n    sdp += 'a=' + msid;\n\n    // for Chrome.\n    sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n        ' ' + msid;\n    if (transceiver.sendEncodingParameters[0].rtx) {\n      sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n          ' ' + msid;\n      sdp += 'a=ssrc-group:FID ' +\n          transceiver.sendEncodingParameters[0].ssrc + ' ' +\n          transceiver.sendEncodingParameters[0].rtx.ssrc +\n          '\\r\\n';\n    }\n  }\n  // FIXME: this should be written by writeRtpDescription.\n  sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n      ' cname:' + SDPUtils.localCName + '\\r\\n';\n  if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) {\n    sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n        ' cname:' + SDPUtils.localCName + '\\r\\n';\n  }\n  return sdp;\n};\n\n// Gets the direction from the mediaSection or the sessionpart.\nSDPUtils.getDirection = function(mediaSection, sessionpart) {\n  // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv.\n  var lines = SDPUtils.splitLines(mediaSection);\n  for (var i = 0; i < lines.length; i++) {\n    switch (lines[i]) {\n      case 'a=sendrecv':\n      case 'a=sendonly':\n      case 'a=recvonly':\n      case 'a=inactive':\n        return lines[i].substr(2);\n      default:\n        // FIXME: What should happen here?\n    }\n  }\n  if (sessionpart) {\n    return SDPUtils.getDirection(sessionpart);\n  }\n  return 'sendrecv';\n};\n\nSDPUtils.getKind = function(mediaSection) {\n  var lines = SDPUtils.splitLines(mediaSection);\n  var mline = lines[0].split(' ');\n  return mline[0].substr(2);\n};\n\nSDPUtils.isRejected = function(mediaSection) {\n  return mediaSection.split(' ', 2)[1] === '0';\n};\n\nSDPUtils.parseMLine = function(mediaSection) {\n  var lines = SDPUtils.splitLines(mediaSection);\n  var parts = lines[0].substr(2).split(' ');\n  return {\n    kind: parts[0],\n    port: parseInt(parts[1], 10),\n    protocol: parts[2],\n    fmt: parts.slice(3).join(' ')\n  };\n};\n\nSDPUtils.parseOLine = function(mediaSection) {\n  var line = SDPUtils.matchPrefix(mediaSection, 'o=')[0];\n  var parts = line.substr(2).split(' ');\n  return {\n    username: parts[0],\n    sessionId: parts[1],\n    sessionVersion: parseInt(parts[2], 10),\n    netType: parts[3],\n    addressType: parts[4],\n    address: parts[5]\n  };\n};\n\n// a very naive interpretation of a valid SDP.\nSDPUtils.isValidSDP = function(blob) {\n  if (typeof blob !== 'string' || blob.length === 0) {\n    return false;\n  }\n  var lines = SDPUtils.splitLines(blob);\n  for (var i = 0; i < lines.length; i++) {\n    if (lines[i].length < 2 || lines[i].charAt(1) !== '=') {\n      return false;\n    }\n    // TODO: check the modifier a bit more.\n  }\n  return true;\n};\n\n// Expose public methods.\nif (typeof module === 'object') {\n  module.exports = SDPUtils;\n}\n\n},{}],3:[function(require,module,exports){\n(function (global){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n\n'use strict';\n\nvar adapterFactory = require('./adapter_factory.js');\nmodule.exports = adapterFactory({window: global.window});\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./adapter_factory.js\":4}],4:[function(require,module,exports){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n\n'use strict';\n\nvar utils = require('./utils');\n// Shimming starts here.\nmodule.exports = function(dependencies, opts) {\n  var window = dependencies && dependencies.window;\n\n  var options = {\n    shimChrome: true,\n    shimFirefox: true,\n    shimEdge: true,\n    shimSafari: true,\n  };\n\n  for (var key in opts) {\n    if (hasOwnProperty.call(opts, key)) {\n      options[key] = opts[key];\n    }\n  }\n\n  // Utils.\n  var logging = utils.log;\n  var browserDetails = utils.detectBrowser(window);\n\n  // Uncomment the line below if you want logging to occur, including logging\n  // for the switch statement below. Can also be turned on in the browser via\n  // adapter.disableLog(false), but then logging from the switch statement below\n  // will not appear.\n  // require('./utils').disableLog(false);\n\n  // Browser shims.\n  var chromeShim = require('./chrome/chrome_shim') || null;\n  var edgeShim = require('./edge/edge_shim') || null;\n  var firefoxShim = require('./firefox/firefox_shim') || null;\n  var safariShim = require('./safari/safari_shim') || null;\n  var commonShim = require('./common_shim') || null;\n\n  // Export to the adapter global object visible in the browser.\n  var adapter = {\n    browserDetails: browserDetails,\n    commonShim: commonShim,\n    extractVersion: utils.extractVersion,\n    disableLog: utils.disableLog,\n    disableWarnings: utils.disableWarnings\n  };\n\n  // Shim browser if found.\n  switch (browserDetails.browser) {\n    case 'chrome':\n      if (!chromeShim || !chromeShim.shimPeerConnection ||\n          !options.shimChrome) {\n        logging('Chrome shim is not included in this adapter release.');\n        return adapter;\n      }\n      logging('adapter.js shimming chrome.');\n      // Export to the adapter global object visible in the browser.\n      adapter.browserShim = chromeShim;\n      commonShim.shimCreateObjectURL(window);\n\n      chromeShim.shimGetUserMedia(window);\n      chromeShim.shimMediaStream(window);\n      chromeShim.shimSourceObject(window);\n      chromeShim.shimPeerConnection(window);\n      chromeShim.shimOnTrack(window);\n      chromeShim.shimAddTrackRemoveTrack(window);\n      chromeShim.shimGetSendersWithDtmf(window);\n      chromeShim.shimSenderReceiverGetStats(window);\n      chromeShim.fixNegotiationNeeded(window);\n\n      commonShim.shimRTCIceCandidate(window);\n      commonShim.shimMaxMessageSize(window);\n      commonShim.shimSendThrowTypeError(window);\n      break;\n    case 'firefox':\n      if (!firefoxShim || !firefoxShim.shimPeerConnection ||\n          !options.shimFirefox) {\n        logging('Firefox shim is not included in this adapter release.');\n        return adapter;\n      }\n      logging('adapter.js shimming firefox.');\n      // Export to the adapter global object visible in the browser.\n      adapter.browserShim = firefoxShim;\n      commonShim.shimCreateObjectURL(window);\n\n      firefoxShim.shimGetUserMedia(window);\n      firefoxShim.shimSourceObject(window);\n      firefoxShim.shimPeerConnection(window);\n      firefoxShim.shimOnTrack(window);\n      firefoxShim.shimRemoveStream(window);\n      firefoxShim.shimSenderGetStats(window);\n      firefoxShim.shimReceiverGetStats(window);\n      firefoxShim.shimRTCDataChannel(window);\n\n      commonShim.shimRTCIceCandidate(window);\n      commonShim.shimMaxMessageSize(window);\n      commonShim.shimSendThrowTypeError(window);\n      break;\n    case 'edge':\n      if (!edgeShim || !edgeShim.shimPeerConnection || !options.shimEdge) {\n        logging('MS edge shim is not included in this adapter release.');\n        return adapter;\n      }\n      logging('adapter.js shimming edge.');\n      // Export to the adapter global object visible in the browser.\n      adapter.browserShim = edgeShim;\n      commonShim.shimCreateObjectURL(window);\n\n      edgeShim.shimGetUserMedia(window);\n      edgeShim.shimPeerConnection(window);\n      edgeShim.shimReplaceTrack(window);\n      edgeShim.shimGetDisplayMedia(window);\n\n      // the edge shim implements the full RTCIceCandidate object.\n\n      commonShim.shimMaxMessageSize(window);\n      commonShim.shimSendThrowTypeError(window);\n      break;\n    case 'safari':\n      if (!safariShim || !options.shimSafari) {\n        logging('Safari shim is not included in this adapter release.');\n        return adapter;\n      }\n      logging('adapter.js shimming safari.');\n      // Export to the adapter global object visible in the browser.\n      adapter.browserShim = safariShim;\n      commonShim.shimCreateObjectURL(window);\n\n      safariShim.shimRTCIceServerUrls(window);\n      safariShim.shimCreateOfferLegacy(window);\n      safariShim.shimCallbacksAPI(window);\n      safariShim.shimLocalStreamsAPI(window);\n      safariShim.shimRemoteStreamsAPI(window);\n      safariShim.shimTrackEventTransceiver(window);\n      safariShim.shimGetUserMedia(window);\n\n      commonShim.shimRTCIceCandidate(window);\n      commonShim.shimMaxMessageSize(window);\n      commonShim.shimSendThrowTypeError(window);\n      break;\n    default:\n      logging('Unsupported browser!');\n      break;\n  }\n\n  return adapter;\n};\n\n},{\"./chrome/chrome_shim\":5,\"./common_shim\":7,\"./edge/edge_shim\":8,\"./firefox/firefox_shim\":11,\"./safari/safari_shim\":13,\"./utils\":14}],5:[function(require,module,exports){\n\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\nvar utils = require('../utils.js');\nvar logging = utils.log;\n\n/* iterates the stats graph recursively. */\nfunction walkStats(stats, base, resultSet) {\n  if (!base || resultSet.has(base.id)) {\n    return;\n  }\n  resultSet.set(base.id, base);\n  Object.keys(base).forEach(function(name) {\n    if (name.endsWith('Id')) {\n      walkStats(stats, stats.get(base[name]), resultSet);\n    } else if (name.endsWith('Ids')) {\n      base[name].forEach(function(id) {\n        walkStats(stats, stats.get(id), resultSet);\n      });\n    }\n  });\n}\n\n/* filter getStats for a sender/receiver track. */\nfunction filterStats(result, track, outbound) {\n  var streamStatsType = outbound ? 'outbound-rtp' : 'inbound-rtp';\n  var filteredResult = new Map();\n  if (track === null) {\n    return filteredResult;\n  }\n  var trackStats = [];\n  result.forEach(function(value) {\n    if (value.type === 'track' &&\n        value.trackIdentifier === track.id) {\n      trackStats.push(value);\n    }\n  });\n  trackStats.forEach(function(trackStat) {\n    result.forEach(function(stats) {\n      if (stats.type === streamStatsType && stats.trackId === trackStat.id) {\n        walkStats(result, stats, filteredResult);\n      }\n    });\n  });\n  return filteredResult;\n}\n\nmodule.exports = {\n  shimGetUserMedia: require('./getusermedia'),\n  shimMediaStream: function(window) {\n    window.MediaStream = window.MediaStream || window.webkitMediaStream;\n  },\n\n  shimOnTrack: function(window) {\n    if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in\n        window.RTCPeerConnection.prototype)) {\n      Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n        get: function() {\n          return this._ontrack;\n        },\n        set: function(f) {\n          if (this._ontrack) {\n            this.removeEventListener('track', this._ontrack);\n          }\n          this.addEventListener('track', this._ontrack = f);\n        },\n        enumerable: true,\n        configurable: true\n      });\n      var origSetRemoteDescription =\n          window.RTCPeerConnection.prototype.setRemoteDescription;\n      window.RTCPeerConnection.prototype.setRemoteDescription = function() {\n        var pc = this;\n        if (!pc._ontrackpoly) {\n          pc._ontrackpoly = function(e) {\n            // onaddstream does not fire when a track is added to an existing\n            // stream. But stream.onaddtrack is implemented so we use that.\n            e.stream.addEventListener('addtrack', function(te) {\n              var receiver;\n              if (window.RTCPeerConnection.prototype.getReceivers) {\n                receiver = pc.getReceivers().find(function(r) {\n                  return r.track && r.track.id === te.track.id;\n                });\n              } else {\n                receiver = {track: te.track};\n              }\n\n              var event = new Event('track');\n              event.track = te.track;\n              event.receiver = receiver;\n              event.transceiver = {receiver: receiver};\n              event.streams = [e.stream];\n              pc.dispatchEvent(event);\n            });\n            e.stream.getTracks().forEach(function(track) {\n              var receiver;\n              if (window.RTCPeerConnection.prototype.getReceivers) {\n                receiver = pc.getReceivers().find(function(r) {\n                  return r.track && r.track.id === track.id;\n                });\n              } else {\n                receiver = {track: track};\n              }\n              var event = new Event('track');\n              event.track = track;\n              event.receiver = receiver;\n              event.transceiver = {receiver: receiver};\n              event.streams = [e.stream];\n              pc.dispatchEvent(event);\n            });\n          };\n          pc.addEventListener('addstream', pc._ontrackpoly);\n        }\n        return origSetRemoteDescription.apply(pc, arguments);\n      };\n    } else {\n      // even if RTCRtpTransceiver is in window, it is only used and\n      // emitted in unified-plan. Unfortunately this means we need\n      // to unconditionally wrap the event.\n      utils.wrapPeerConnectionEvent(window, 'track', function(e) {\n        if (!e.transceiver) {\n          Object.defineProperty(e, 'transceiver',\n            {value: {receiver: e.receiver}});\n        }\n        return e;\n      });\n    }\n  },\n\n  shimGetSendersWithDtmf: function(window) {\n    // Overrides addTrack/removeTrack, depends on shimAddTrackRemoveTrack.\n    if (typeof window === 'object' && window.RTCPeerConnection &&\n        !('getSenders' in window.RTCPeerConnection.prototype) &&\n        'createDTMFSender' in window.RTCPeerConnection.prototype) {\n      var shimSenderWithDtmf = function(pc, track) {\n        return {\n          track: track,\n          get dtmf() {\n            if (this._dtmf === undefined) {\n              if (track.kind === 'audio') {\n                this._dtmf = pc.createDTMFSender(track);\n              } else {\n                this._dtmf = null;\n              }\n            }\n            return this._dtmf;\n          },\n          _pc: pc\n        };\n      };\n\n      // augment addTrack when getSenders is not available.\n      if (!window.RTCPeerConnection.prototype.getSenders) {\n        window.RTCPeerConnection.prototype.getSenders = function() {\n          this._senders = this._senders || [];\n          return this._senders.slice(); // return a copy of the internal state.\n        };\n        var origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n        window.RTCPeerConnection.prototype.addTrack = function(track, stream) {\n          var pc = this;\n          var sender = origAddTrack.apply(pc, arguments);\n          if (!sender) {\n            sender = shimSenderWithDtmf(pc, track);\n            pc._senders.push(sender);\n          }\n          return sender;\n        };\n\n        var origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n        window.RTCPeerConnection.prototype.removeTrack = function(sender) {\n          var pc = this;\n          origRemoveTrack.apply(pc, arguments);\n          var idx = pc._senders.indexOf(sender);\n          if (idx !== -1) {\n            pc._senders.splice(idx, 1);\n          }\n        };\n      }\n      var origAddStream = window.RTCPeerConnection.prototype.addStream;\n      window.RTCPeerConnection.prototype.addStream = function(stream) {\n        var pc = this;\n        pc._senders = pc._senders || [];\n        origAddStream.apply(pc, [stream]);\n        stream.getTracks().forEach(function(track) {\n          pc._senders.push(shimSenderWithDtmf(pc, track));\n        });\n      };\n\n      var origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n      window.RTCPeerConnection.prototype.removeStream = function(stream) {\n        var pc = this;\n        pc._senders = pc._senders || [];\n        origRemoveStream.apply(pc, [stream]);\n\n        stream.getTracks().forEach(function(track) {\n          var sender = pc._senders.find(function(s) {\n            return s.track === track;\n          });\n          if (sender) {\n            pc._senders.splice(pc._senders.indexOf(sender), 1); // remove sender\n          }\n        });\n      };\n    } else if (typeof window === 'object' && window.RTCPeerConnection &&\n               'getSenders' in window.RTCPeerConnection.prototype &&\n               'createDTMFSender' in window.RTCPeerConnection.prototype &&\n               window.RTCRtpSender &&\n               !('dtmf' in window.RTCRtpSender.prototype)) {\n      var origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n      window.RTCPeerConnection.prototype.getSenders = function() {\n        var pc = this;\n        var senders = origGetSenders.apply(pc, []);\n        senders.forEach(function(sender) {\n          sender._pc = pc;\n        });\n        return senders;\n      };\n\n      Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n        get: function() {\n          if (this._dtmf === undefined) {\n            if (this.track.kind === 'audio') {\n              this._dtmf = this._pc.createDTMFSender(this.track);\n            } else {\n              this._dtmf = null;\n            }\n          }\n          return this._dtmf;\n        }\n      });\n    }\n  },\n\n  shimSenderReceiverGetStats: function(window) {\n    if (!(typeof window === 'object' && window.RTCPeerConnection &&\n        window.RTCRtpSender && window.RTCRtpReceiver)) {\n      return;\n    }\n\n    // shim sender stats.\n    if (!('getStats' in window.RTCRtpSender.prototype)) {\n      var origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n      if (origGetSenders) {\n        window.RTCPeerConnection.prototype.getSenders = function() {\n          var pc = this;\n          var senders = origGetSenders.apply(pc, []);\n          senders.forEach(function(sender) {\n            sender._pc = pc;\n          });\n          return senders;\n        };\n      }\n\n      var origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n      if (origAddTrack) {\n        window.RTCPeerConnection.prototype.addTrack = function() {\n          var sender = origAddTrack.apply(this, arguments);\n          sender._pc = this;\n          return sender;\n        };\n      }\n      window.RTCRtpSender.prototype.getStats = function() {\n        var sender = this;\n        return this._pc.getStats().then(function(result) {\n          /* Note: this will include stats of all senders that\n           *   send a track with the same id as sender.track as\n           *   it is not possible to identify the RTCRtpSender.\n           */\n          return filterStats(result, sender.track, true);\n        });\n      };\n    }\n\n    // shim receiver stats.\n    if (!('getStats' in window.RTCRtpReceiver.prototype)) {\n      var origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n      if (origGetReceivers) {\n        window.RTCPeerConnection.prototype.getReceivers = function() {\n          var pc = this;\n          var receivers = origGetReceivers.apply(pc, []);\n          receivers.forEach(function(receiver) {\n            receiver._pc = pc;\n          });\n          return receivers;\n        };\n      }\n      utils.wrapPeerConnectionEvent(window, 'track', function(e) {\n        e.receiver._pc = e.srcElement;\n        return e;\n      });\n      window.RTCRtpReceiver.prototype.getStats = function() {\n        var receiver = this;\n        return this._pc.getStats().then(function(result) {\n          return filterStats(result, receiver.track, false);\n        });\n      };\n    }\n\n    if (!('getStats' in window.RTCRtpSender.prototype &&\n        'getStats' in window.RTCRtpReceiver.prototype)) {\n      return;\n    }\n\n    // shim RTCPeerConnection.getStats(track).\n    var origGetStats = window.RTCPeerConnection.prototype.getStats;\n    window.RTCPeerConnection.prototype.getStats = function() {\n      var pc = this;\n      if (arguments.length > 0 &&\n          arguments[0] instanceof window.MediaStreamTrack) {\n        var track = arguments[0];\n        var sender;\n        var receiver;\n        var err;\n        pc.getSenders().forEach(function(s) {\n          if (s.track === track) {\n            if (sender) {\n              err = true;\n            } else {\n              sender = s;\n            }\n          }\n        });\n        pc.getReceivers().forEach(function(r) {\n          if (r.track === track) {\n            if (receiver) {\n              err = true;\n            } else {\n              receiver = r;\n            }\n          }\n          return r.track === track;\n        });\n        if (err || (sender && receiver)) {\n          return Promise.reject(new DOMException(\n            'There are more than one sender or receiver for the track.',\n            'InvalidAccessError'));\n        } else if (sender) {\n          return sender.getStats();\n        } else if (receiver) {\n          return receiver.getStats();\n        }\n        return Promise.reject(new DOMException(\n          'There is no sender or receiver for the track.',\n          'InvalidAccessError'));\n      }\n      return origGetStats.apply(pc, arguments);\n    };\n  },\n\n  shimSourceObject: function(window) {\n    var URL = window && window.URL;\n\n    if (typeof window === 'object') {\n      if (window.HTMLMediaElement &&\n        !('srcObject' in window.HTMLMediaElement.prototype)) {\n        // Shim the srcObject property, once, when HTMLMediaElement is found.\n        Object.defineProperty(window.HTMLMediaElement.prototype, 'srcObject', {\n          get: function() {\n            return this._srcObject;\n          },\n          set: function(stream) {\n            var self = this;\n            // Use _srcObject as a private property for this shim\n            this._srcObject = stream;\n            if (this.src) {\n              URL.revokeObjectURL(this.src);\n            }\n\n            if (!stream) {\n              this.src = '';\n              return undefined;\n            }\n            this.src = URL.createObjectURL(stream);\n            // We need to recreate the blob url when a track is added or\n            // removed. Doing it manually since we want to avoid a recursion.\n            stream.addEventListener('addtrack', function() {\n              if (self.src) {\n                URL.revokeObjectURL(self.src);\n              }\n              self.src = URL.createObjectURL(stream);\n            });\n            stream.addEventListener('removetrack', function() {\n              if (self.src) {\n                URL.revokeObjectURL(self.src);\n              }\n              self.src = URL.createObjectURL(stream);\n            });\n          }\n        });\n      }\n    }\n  },\n\n  shimAddTrackRemoveTrackWithNative: function(window) {\n    // shim addTrack/removeTrack with native variants in order to make\n    // the interactions with legacy getLocalStreams behave as in other browsers.\n    // Keeps a mapping stream.id => [stream, rtpsenders...]\n    window.RTCPeerConnection.prototype.getLocalStreams = function() {\n      var pc = this;\n      this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n      return Object.keys(this._shimmedLocalStreams).map(function(streamId) {\n        return pc._shimmedLocalStreams[streamId][0];\n      });\n    };\n\n    var origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n    window.RTCPeerConnection.prototype.addTrack = function(track, stream) {\n      if (!stream) {\n        return origAddTrack.apply(this, arguments);\n      }\n      this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n      var sender = origAddTrack.apply(this, arguments);\n      if (!this._shimmedLocalStreams[stream.id]) {\n        this._shimmedLocalStreams[stream.id] = [stream, sender];\n      } else if (this._shimmedLocalStreams[stream.id].indexOf(sender) === -1) {\n        this._shimmedLocalStreams[stream.id].push(sender);\n      }\n      return sender;\n    };\n\n    var origAddStream = window.RTCPeerConnection.prototype.addStream;\n    window.RTCPeerConnection.prototype.addStream = function(stream) {\n      var pc = this;\n      this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n      stream.getTracks().forEach(function(track) {\n        var alreadyExists = pc.getSenders().find(function(s) {\n          return s.track === track;\n        });\n        if (alreadyExists) {\n          throw new DOMException('Track already exists.',\n              'InvalidAccessError');\n        }\n      });\n      var existingSenders = pc.getSenders();\n      origAddStream.apply(this, arguments);\n      var newSenders = pc.getSenders().filter(function(newSender) {\n        return existingSenders.indexOf(newSender) === -1;\n      });\n      this._shimmedLocalStreams[stream.id] = [stream].concat(newSenders);\n    };\n\n    var origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n    window.RTCPeerConnection.prototype.removeStream = function(stream) {\n      this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n      delete this._shimmedLocalStreams[stream.id];\n      return origRemoveStream.apply(this, arguments);\n    };\n\n    var origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n    window.RTCPeerConnection.prototype.removeTrack = function(sender) {\n      var pc = this;\n      this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n      if (sender) {\n        Object.keys(this._shimmedLocalStreams).forEach(function(streamId) {\n          var idx = pc._shimmedLocalStreams[streamId].indexOf(sender);\n          if (idx !== -1) {\n            pc._shimmedLocalStreams[streamId].splice(idx, 1);\n          }\n          if (pc._shimmedLocalStreams[streamId].length === 1) {\n            delete pc._shimmedLocalStreams[streamId];\n          }\n        });\n      }\n      return origRemoveTrack.apply(this, arguments);\n    };\n  },\n\n  shimAddTrackRemoveTrack: function(window) {\n    if (!window.RTCPeerConnection) {\n      return;\n    }\n    var browserDetails = utils.detectBrowser(window);\n    // shim addTrack and removeTrack.\n    if (window.RTCPeerConnection.prototype.addTrack &&\n        browserDetails.version >= 65) {\n      return this.shimAddTrackRemoveTrackWithNative(window);\n    }\n\n    // also shim pc.getLocalStreams when addTrack is shimmed\n    // to return the original streams.\n    var origGetLocalStreams = window.RTCPeerConnection.prototype\n        .getLocalStreams;\n    window.RTCPeerConnection.prototype.getLocalStreams = function() {\n      var pc = this;\n      var nativeStreams = origGetLocalStreams.apply(this);\n      pc._reverseStreams = pc._reverseStreams || {};\n      return nativeStreams.map(function(stream) {\n        return pc._reverseStreams[stream.id];\n      });\n    };\n\n    var origAddStream = window.RTCPeerConnection.prototype.addStream;\n    window.RTCPeerConnection.prototype.addStream = function(stream) {\n      var pc = this;\n      pc._streams = pc._streams || {};\n      pc._reverseStreams = pc._reverseStreams || {};\n\n      stream.getTracks().forEach(function(track) {\n        var alreadyExists = pc.getSenders().find(function(s) {\n          return s.track === track;\n        });\n        if (alreadyExists) {\n          throw new DOMException('Track already exists.',\n              'InvalidAccessError');\n        }\n      });\n      // Add identity mapping for consistency with addTrack.\n      // Unless this is being used with a stream from addTrack.\n      if (!pc._reverseStreams[stream.id]) {\n        var newStream = new window.MediaStream(stream.getTracks());\n        pc._streams[stream.id] = newStream;\n        pc._reverseStreams[newStream.id] = stream;\n        stream = newStream;\n      }\n      origAddStream.apply(pc, [stream]);\n    };\n\n    var origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n    window.RTCPeerConnection.prototype.removeStream = function(stream) {\n      var pc = this;\n      pc._streams = pc._streams || {};\n      pc._reverseStreams = pc._reverseStreams || {};\n\n      origRemoveStream.apply(pc, [(pc._streams[stream.id] || stream)]);\n      delete pc._reverseStreams[(pc._streams[stream.id] ?\n          pc._streams[stream.id].id : stream.id)];\n      delete pc._streams[stream.id];\n    };\n\n    window.RTCPeerConnection.prototype.addTrack = function(track, stream) {\n      var pc = this;\n      if (pc.signalingState === 'closed') {\n        throw new DOMException(\n          'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n          'InvalidStateError');\n      }\n      var streams = [].slice.call(arguments, 1);\n      if (streams.length !== 1 ||\n          !streams[0].getTracks().find(function(t) {\n            return t === track;\n          })) {\n        // this is not fully correct but all we can manage without\n        // [[associated MediaStreams]] internal slot.\n        throw new DOMException(\n          'The adapter.js addTrack polyfill only supports a single ' +\n          ' stream which is associated with the specified track.',\n          'NotSupportedError');\n      }\n\n      var alreadyExists = pc.getSenders().find(function(s) {\n        return s.track === track;\n      });\n      if (alreadyExists) {\n        throw new DOMException('Track already exists.',\n            'InvalidAccessError');\n      }\n\n      pc._streams = pc._streams || {};\n      pc._reverseStreams = pc._reverseStreams || {};\n      var oldStream = pc._streams[stream.id];\n      if (oldStream) {\n        // this is using odd Chrome behaviour, use with caution:\n        // https://bugs.chromium.org/p/webrtc/issues/detail?id=7815\n        // Note: we rely on the high-level addTrack/dtmf shim to\n        // create the sender with a dtmf sender.\n        oldStream.addTrack(track);\n\n        // Trigger ONN async.\n        Promise.resolve().then(function() {\n          pc.dispatchEvent(new Event('negotiationneeded'));\n        });\n      } else {\n        var newStream = new window.MediaStream([track]);\n        pc._streams[stream.id] = newStream;\n        pc._reverseStreams[newStream.id] = stream;\n        pc.addStream(newStream);\n      }\n      return pc.getSenders().find(function(s) {\n        return s.track === track;\n      });\n    };\n\n    // replace the internal stream id with the external one and\n    // vice versa.\n    function replaceInternalStreamId(pc, description) {\n      var sdp = description.sdp;\n      Object.keys(pc._reverseStreams || []).forEach(function(internalId) {\n        var externalStream = pc._reverseStreams[internalId];\n        var internalStream = pc._streams[externalStream.id];\n        sdp = sdp.replace(new RegExp(internalStream.id, 'g'),\n            externalStream.id);\n      });\n      return new RTCSessionDescription({\n        type: description.type,\n        sdp: sdp\n      });\n    }\n    function replaceExternalStreamId(pc, description) {\n      var sdp = description.sdp;\n      Object.keys(pc._reverseStreams || []).forEach(function(internalId) {\n        var externalStream = pc._reverseStreams[internalId];\n        var internalStream = pc._streams[externalStream.id];\n        sdp = sdp.replace(new RegExp(externalStream.id, 'g'),\n            internalStream.id);\n      });\n      return new RTCSessionDescription({\n        type: description.type,\n        sdp: sdp\n      });\n    }\n    ['createOffer', 'createAnswer'].forEach(function(method) {\n      var nativeMethod = window.RTCPeerConnection.prototype[method];\n      window.RTCPeerConnection.prototype[method] = function() {\n        var pc = this;\n        var args = arguments;\n        var isLegacyCall = arguments.length &&\n            typeof arguments[0] === 'function';\n        if (isLegacyCall) {\n          return nativeMethod.apply(pc, [\n            function(description) {\n              var desc = replaceInternalStreamId(pc, description);\n              args[0].apply(null, [desc]);\n            },\n            function(err) {\n              if (args[1]) {\n                args[1].apply(null, err);\n              }\n            }, arguments[2]\n          ]);\n        }\n        return nativeMethod.apply(pc, arguments)\n        .then(function(description) {\n          return replaceInternalStreamId(pc, description);\n        });\n      };\n    });\n\n    var origSetLocalDescription =\n        window.RTCPeerConnection.prototype.setLocalDescription;\n    window.RTCPeerConnection.prototype.setLocalDescription = function() {\n      var pc = this;\n      if (!arguments.length || !arguments[0].type) {\n        return origSetLocalDescription.apply(pc, arguments);\n      }\n      arguments[0] = replaceExternalStreamId(pc, arguments[0]);\n      return origSetLocalDescription.apply(pc, arguments);\n    };\n\n    // TODO: mangle getStats: https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamstats-streamidentifier\n\n    var origLocalDescription = Object.getOwnPropertyDescriptor(\n        window.RTCPeerConnection.prototype, 'localDescription');\n    Object.defineProperty(window.RTCPeerConnection.prototype,\n        'localDescription', {\n          get: function() {\n            var pc = this;\n            var description = origLocalDescription.get.apply(this);\n            if (description.type === '') {\n              return description;\n            }\n            return replaceInternalStreamId(pc, description);\n          }\n        });\n\n    window.RTCPeerConnection.prototype.removeTrack = function(sender) {\n      var pc = this;\n      if (pc.signalingState === 'closed') {\n        throw new DOMException(\n          'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n          'InvalidStateError');\n      }\n      // We can not yet check for sender instanceof RTCRtpSender\n      // since we shim RTPSender. So we check if sender._pc is set.\n      if (!sender._pc) {\n        throw new DOMException('Argument 1 of RTCPeerConnection.removeTrack ' +\n            'does not implement interface RTCRtpSender.', 'TypeError');\n      }\n      var isLocal = sender._pc === pc;\n      if (!isLocal) {\n        throw new DOMException('Sender was not created by this connection.',\n            'InvalidAccessError');\n      }\n\n      // Search for the native stream the senders track belongs to.\n      pc._streams = pc._streams || {};\n      var stream;\n      Object.keys(pc._streams).forEach(function(streamid) {\n        var hasTrack = pc._streams[streamid].getTracks().find(function(track) {\n          return sender.track === track;\n        });\n        if (hasTrack) {\n          stream = pc._streams[streamid];\n        }\n      });\n\n      if (stream) {\n        if (stream.getTracks().length === 1) {\n          // if this is the last track of the stream, remove the stream. This\n          // takes care of any shimmed _senders.\n          pc.removeStream(pc._reverseStreams[stream.id]);\n        } else {\n          // relying on the same odd chrome behaviour as above.\n          stream.removeTrack(sender.track);\n        }\n        pc.dispatchEvent(new Event('negotiationneeded'));\n      }\n    };\n  },\n\n  shimPeerConnection: function(window) {\n    var browserDetails = utils.detectBrowser(window);\n\n    // The RTCPeerConnection object.\n    if (!window.RTCPeerConnection && window.webkitRTCPeerConnection) {\n      window.RTCPeerConnection = function(pcConfig, pcConstraints) {\n        // Translate iceTransportPolicy to iceTransports,\n        // see https://code.google.com/p/webrtc/issues/detail?id=4869\n        // this was fixed in M56 along with unprefixing RTCPeerConnection.\n        logging('PeerConnection');\n        if (pcConfig && pcConfig.iceTransportPolicy) {\n          pcConfig.iceTransports = pcConfig.iceTransportPolicy;\n        }\n\n        return new window.webkitRTCPeerConnection(pcConfig, pcConstraints);\n      };\n      window.RTCPeerConnection.prototype =\n          window.webkitRTCPeerConnection.prototype;\n      // wrap static methods. Currently just generateCertificate.\n      if (window.webkitRTCPeerConnection.generateCertificate) {\n        Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n          get: function() {\n            return window.webkitRTCPeerConnection.generateCertificate;\n          }\n        });\n      }\n    }\n    if (!window.RTCPeerConnection) {\n      return;\n    }\n\n    var origGetStats = window.RTCPeerConnection.prototype.getStats;\n    window.RTCPeerConnection.prototype.getStats = function(selector,\n        successCallback, errorCallback) {\n      var pc = this;\n      var args = arguments;\n\n      // If selector is a function then we are in the old style stats so just\n      // pass back the original getStats format to avoid breaking old users.\n      if (arguments.length > 0 && typeof selector === 'function') {\n        return origGetStats.apply(this, arguments);\n      }\n\n      // When spec-style getStats is supported, return those when called with\n      // either no arguments or the selector argument is null.\n      if (origGetStats.length === 0 && (arguments.length === 0 ||\n          typeof arguments[0] !== 'function')) {\n        return origGetStats.apply(this, []);\n      }\n\n      var fixChromeStats_ = function(response) {\n        var standardReport = {};\n        var reports = response.result();\n        reports.forEach(function(report) {\n          var standardStats = {\n            id: report.id,\n            timestamp: report.timestamp,\n            type: {\n              localcandidate: 'local-candidate',\n              remotecandidate: 'remote-candidate'\n            }[report.type] || report.type\n          };\n          report.names().forEach(function(name) {\n            standardStats[name] = report.stat(name);\n          });\n          standardReport[standardStats.id] = standardStats;\n        });\n\n        return standardReport;\n      };\n\n      // shim getStats with maplike support\n      var makeMapStats = function(stats) {\n        return new Map(Object.keys(stats).map(function(key) {\n          return [key, stats[key]];\n        }));\n      };\n\n      if (arguments.length >= 2) {\n        var successCallbackWrapper_ = function(response) {\n          args[1](makeMapStats(fixChromeStats_(response)));\n        };\n\n        return origGetStats.apply(this, [successCallbackWrapper_,\n          arguments[0]]);\n      }\n\n      // promise-support\n      return new Promise(function(resolve, reject) {\n        origGetStats.apply(pc, [\n          function(response) {\n            resolve(makeMapStats(fixChromeStats_(response)));\n          }, reject]);\n      }).then(successCallback, errorCallback);\n    };\n\n    // add promise support -- natively available in Chrome 51\n    if (browserDetails.version < 51) {\n      ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n          .forEach(function(method) {\n            var nativeMethod = window.RTCPeerConnection.prototype[method];\n            window.RTCPeerConnection.prototype[method] = function() {\n              var args = arguments;\n              var pc = this;\n              var promise = new Promise(function(resolve, reject) {\n                nativeMethod.apply(pc, [args[0], resolve, reject]);\n              });\n              if (args.length < 2) {\n                return promise;\n              }\n              return promise.then(function() {\n                args[1].apply(null, []);\n              },\n              function(err) {\n                if (args.length >= 3) {\n                  args[2].apply(null, [err]);\n                }\n              });\n            };\n          });\n    }\n\n    // promise support for createOffer and createAnswer. Available (without\n    // bugs) since M52: crbug/619289\n    if (browserDetails.version < 52) {\n      ['createOffer', 'createAnswer'].forEach(function(method) {\n        var nativeMethod = window.RTCPeerConnection.prototype[method];\n        window.RTCPeerConnection.prototype[method] = function() {\n          var pc = this;\n          if (arguments.length < 1 || (arguments.length === 1 &&\n              typeof arguments[0] === 'object')) {\n            var opts = arguments.length === 1 ? arguments[0] : undefined;\n            return new Promise(function(resolve, reject) {\n              nativeMethod.apply(pc, [resolve, reject, opts]);\n            });\n          }\n          return nativeMethod.apply(this, arguments);\n        };\n      });\n    }\n\n    // shim implicit creation of RTCSessionDescription/RTCIceCandidate\n    ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n        .forEach(function(method) {\n          var nativeMethod = window.RTCPeerConnection.prototype[method];\n          window.RTCPeerConnection.prototype[method] = function() {\n            arguments[0] = new ((method === 'addIceCandidate') ?\n                window.RTCIceCandidate :\n                window.RTCSessionDescription)(arguments[0]);\n            return nativeMethod.apply(this, arguments);\n          };\n        });\n\n    // support for addIceCandidate(null or undefined)\n    var nativeAddIceCandidate =\n        window.RTCPeerConnection.prototype.addIceCandidate;\n    window.RTCPeerConnection.prototype.addIceCandidate = function() {\n      if (!arguments[0]) {\n        if (arguments[1]) {\n          arguments[1].apply(null);\n        }\n        return Promise.resolve();\n      }\n      return nativeAddIceCandidate.apply(this, arguments);\n    };\n  },\n\n  fixNegotiationNeeded: function(window) {\n    utils.wrapPeerConnectionEvent(window, 'negotiationneeded', function(e) {\n      var pc = e.target;\n      if (pc.signalingState !== 'stable') {\n        return;\n      }\n      return e;\n    });\n  },\n\n  shimGetDisplayMedia: function(window, getSourceId) {\n    if (!window.navigator || !window.navigator.mediaDevices ||\n        'getDisplayMedia' in window.navigator.mediaDevices) {\n      return;\n    }\n    // getSourceId is a function that returns a promise resolving with\n    // the sourceId of the screen/window/tab to be shared.\n    if (typeof getSourceId !== 'function') {\n      console.error('shimGetDisplayMedia: getSourceId argument is not ' +\n          'a function');\n      return;\n    }\n    window.navigator.mediaDevices.getDisplayMedia = function(constraints) {\n      return getSourceId(constraints)\n        .then(function(sourceId) {\n          var widthSpecified = constraints.video && constraints.video.width;\n          var heightSpecified = constraints.video && constraints.video.height;\n          var frameRateSpecified = constraints.video &&\n            constraints.video.frameRate;\n          constraints.video = {\n            mandatory: {\n              chromeMediaSource: 'desktop',\n              chromeMediaSourceId: sourceId,\n              maxFrameRate: frameRateSpecified || 3\n            }\n          };\n          if (widthSpecified) {\n            constraints.video.mandatory.maxWidth = widthSpecified;\n          }\n          if (heightSpecified) {\n            constraints.video.mandatory.maxHeight = heightSpecified;\n          }\n          return window.navigator.mediaDevices.getUserMedia(constraints);\n        });\n    };\n    window.navigator.getDisplayMedia = function(constraints) {\n      utils.deprecated('navigator.getDisplayMedia',\n          'navigator.mediaDevices.getDisplayMedia');\n      return window.navigator.mediaDevices.getDisplayMedia(constraints);\n    };\n  }\n};\n\n},{\"../utils.js\":14,\"./getusermedia\":6}],6:[function(require,module,exports){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\nvar utils = require('../utils.js');\nvar logging = utils.log;\n\n// Expose public methods.\nmodule.exports = function(window) {\n  var browserDetails = utils.detectBrowser(window);\n  var navigator = window && window.navigator;\n\n  var constraintsToChrome_ = function(c) {\n    if (typeof c !== 'object' || c.mandatory || c.optional) {\n      return c;\n    }\n    var cc = {};\n    Object.keys(c).forEach(function(key) {\n      if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n        return;\n      }\n      var r = (typeof c[key] === 'object') ? c[key] : {ideal: c[key]};\n      if (r.exact !== undefined && typeof r.exact === 'number') {\n        r.min = r.max = r.exact;\n      }\n      var oldname_ = function(prefix, name) {\n        if (prefix) {\n          return prefix + name.charAt(0).toUpperCase() + name.slice(1);\n        }\n        return (name === 'deviceId') ? 'sourceId' : name;\n      };\n      if (r.ideal !== undefined) {\n        cc.optional = cc.optional || [];\n        var oc = {};\n        if (typeof r.ideal === 'number') {\n          oc[oldname_('min', key)] = r.ideal;\n          cc.optional.push(oc);\n          oc = {};\n          oc[oldname_('max', key)] = r.ideal;\n          cc.optional.push(oc);\n        } else {\n          oc[oldname_('', key)] = r.ideal;\n          cc.optional.push(oc);\n        }\n      }\n      if (r.exact !== undefined && typeof r.exact !== 'number') {\n        cc.mandatory = cc.mandatory || {};\n        cc.mandatory[oldname_('', key)] = r.exact;\n      } else {\n        ['min', 'max'].forEach(function(mix) {\n          if (r[mix] !== undefined) {\n            cc.mandatory = cc.mandatory || {};\n            cc.mandatory[oldname_(mix, key)] = r[mix];\n          }\n        });\n      }\n    });\n    if (c.advanced) {\n      cc.optional = (cc.optional || []).concat(c.advanced);\n    }\n    return cc;\n  };\n\n  var shimConstraints_ = function(constraints, func) {\n    if (browserDetails.version >= 61) {\n      return func(constraints);\n    }\n    constraints = JSON.parse(JSON.stringify(constraints));\n    if (constraints && typeof constraints.audio === 'object') {\n      var remap = function(obj, a, b) {\n        if (a in obj && !(b in obj)) {\n          obj[b] = obj[a];\n          delete obj[a];\n        }\n      };\n      constraints = JSON.parse(JSON.stringify(constraints));\n      remap(constraints.audio, 'autoGainControl', 'googAutoGainControl');\n      remap(constraints.audio, 'noiseSuppression', 'googNoiseSuppression');\n      constraints.audio = constraintsToChrome_(constraints.audio);\n    }\n    if (constraints && typeof constraints.video === 'object') {\n      // Shim facingMode for mobile & surface pro.\n      var face = constraints.video.facingMode;\n      face = face && ((typeof face === 'object') ? face : {ideal: face});\n      var getSupportedFacingModeLies = browserDetails.version < 66;\n\n      if ((face && (face.exact === 'user' || face.exact === 'environment' ||\n                    face.ideal === 'user' || face.ideal === 'environment')) &&\n          !(navigator.mediaDevices.getSupportedConstraints &&\n            navigator.mediaDevices.getSupportedConstraints().facingMode &&\n            !getSupportedFacingModeLies)) {\n        delete constraints.video.facingMode;\n        var matches;\n        if (face.exact === 'environment' || face.ideal === 'environment') {\n          matches = ['back', 'rear'];\n        } else if (face.exact === 'user' || face.ideal === 'user') {\n          matches = ['front'];\n        }\n        if (matches) {\n          // Look for matches in label, or use last cam for back (typical).\n          return navigator.mediaDevices.enumerateDevices()\n          .then(function(devices) {\n            devices = devices.filter(function(d) {\n              return d.kind === 'videoinput';\n            });\n            var dev = devices.find(function(d) {\n              return matches.some(function(match) {\n                return d.label.toLowerCase().indexOf(match) !== -1;\n              });\n            });\n            if (!dev && devices.length && matches.indexOf('back') !== -1) {\n              dev = devices[devices.length - 1]; // more likely the back cam\n            }\n            if (dev) {\n              constraints.video.deviceId = face.exact ? {exact: dev.deviceId} :\n                                                        {ideal: dev.deviceId};\n            }\n            constraints.video = constraintsToChrome_(constraints.video);\n            logging('chrome: ' + JSON.stringify(constraints));\n            return func(constraints);\n          });\n        }\n      }\n      constraints.video = constraintsToChrome_(constraints.video);\n    }\n    logging('chrome: ' + JSON.stringify(constraints));\n    return func(constraints);\n  };\n\n  var shimError_ = function(e) {\n    if (browserDetails.version >= 64) {\n      return e;\n    }\n    return {\n      name: {\n        PermissionDeniedError: 'NotAllowedError',\n        PermissionDismissedError: 'NotAllowedError',\n        InvalidStateError: 'NotAllowedError',\n        DevicesNotFoundError: 'NotFoundError',\n        ConstraintNotSatisfiedError: 'OverconstrainedError',\n        TrackStartError: 'NotReadableError',\n        MediaDeviceFailedDueToShutdown: 'NotAllowedError',\n        MediaDeviceKillSwitchOn: 'NotAllowedError',\n        TabCaptureError: 'AbortError',\n        ScreenCaptureError: 'AbortError',\n        DeviceCaptureError: 'AbortError'\n      }[e.name] || e.name,\n      message: e.message,\n      constraint: e.constraint || e.constraintName,\n      toString: function() {\n        return this.name + (this.message && ': ') + this.message;\n      }\n    };\n  };\n\n  var getUserMedia_ = function(constraints, onSuccess, onError) {\n    shimConstraints_(constraints, function(c) {\n      navigator.webkitGetUserMedia(c, onSuccess, function(e) {\n        if (onError) {\n          onError(shimError_(e));\n        }\n      });\n    });\n  };\n\n  navigator.getUserMedia = getUserMedia_;\n\n  // Returns the result of getUserMedia as a Promise.\n  var getUserMediaPromise_ = function(constraints) {\n    return new Promise(function(resolve, reject) {\n      navigator.getUserMedia(constraints, resolve, reject);\n    });\n  };\n\n  if (!navigator.mediaDevices) {\n    navigator.mediaDevices = {\n      getUserMedia: getUserMediaPromise_,\n      enumerateDevices: function() {\n        return new Promise(function(resolve) {\n          var kinds = {audio: 'audioinput', video: 'videoinput'};\n          return window.MediaStreamTrack.getSources(function(devices) {\n            resolve(devices.map(function(device) {\n              return {label: device.label,\n                kind: kinds[device.kind],\n                deviceId: device.id,\n                groupId: ''};\n            }));\n          });\n        });\n      },\n      getSupportedConstraints: function() {\n        return {\n          deviceId: true, echoCancellation: true, facingMode: true,\n          frameRate: true, height: true, width: true\n        };\n      }\n    };\n  }\n\n  // A shim for getUserMedia method on the mediaDevices object.\n  // TODO(KaptenJansson) remove once implemented in Chrome stable.\n  if (!navigator.mediaDevices.getUserMedia) {\n    navigator.mediaDevices.getUserMedia = function(constraints) {\n      return getUserMediaPromise_(constraints);\n    };\n  } else {\n    // Even though Chrome 45 has navigator.mediaDevices and a getUserMedia\n    // function which returns a Promise, it does not accept spec-style\n    // constraints.\n    var origGetUserMedia = navigator.mediaDevices.getUserMedia.\n        bind(navigator.mediaDevices);\n    navigator.mediaDevices.getUserMedia = function(cs) {\n      return shimConstraints_(cs, function(c) {\n        return origGetUserMedia(c).then(function(stream) {\n          if (c.audio && !stream.getAudioTracks().length ||\n              c.video && !stream.getVideoTracks().length) {\n            stream.getTracks().forEach(function(track) {\n              track.stop();\n            });\n            throw new DOMException('', 'NotFoundError');\n          }\n          return stream;\n        }, function(e) {\n          return Promise.reject(shimError_(e));\n        });\n      });\n    };\n  }\n\n  // Dummy devicechange event methods.\n  // TODO(KaptenJansson) remove once implemented in Chrome stable.\n  if (typeof navigator.mediaDevices.addEventListener === 'undefined') {\n    navigator.mediaDevices.addEventListener = function() {\n      logging('Dummy mediaDevices.addEventListener called.');\n    };\n  }\n  if (typeof navigator.mediaDevices.removeEventListener === 'undefined') {\n    navigator.mediaDevices.removeEventListener = function() {\n      logging('Dummy mediaDevices.removeEventListener called.');\n    };\n  }\n};\n\n},{\"../utils.js\":14}],7:[function(require,module,exports){\n/*\n *  Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar SDPUtils = require('sdp');\nvar utils = require('./utils');\n\nmodule.exports = {\n  shimRTCIceCandidate: function(window) {\n    // foundation is arbitrarily chosen as an indicator for full support for\n    // https://w3c.github.io/webrtc-pc/#rtcicecandidate-interface\n    if (!window.RTCIceCandidate || (window.RTCIceCandidate && 'foundation' in\n        window.RTCIceCandidate.prototype)) {\n      return;\n    }\n\n    var NativeRTCIceCandidate = window.RTCIceCandidate;\n    window.RTCIceCandidate = function(args) {\n      // Remove the a= which shouldn't be part of the candidate string.\n      if (typeof args === 'object' && args.candidate &&\n          args.candidate.indexOf('a=') === 0) {\n        args = JSON.parse(JSON.stringify(args));\n        args.candidate = args.candidate.substr(2);\n      }\n\n      if (args.candidate && args.candidate.length) {\n        // Augment the native candidate with the parsed fields.\n        var nativeCandidate = new NativeRTCIceCandidate(args);\n        var parsedCandidate = SDPUtils.parseCandidate(args.candidate);\n        var augmentedCandidate = Object.assign(nativeCandidate,\n            parsedCandidate);\n\n        // Add a serializer that does not serialize the extra attributes.\n        augmentedCandidate.toJSON = function() {\n          return {\n            candidate: augmentedCandidate.candidate,\n            sdpMid: augmentedCandidate.sdpMid,\n            sdpMLineIndex: augmentedCandidate.sdpMLineIndex,\n            usernameFragment: augmentedCandidate.usernameFragment,\n          };\n        };\n        return augmentedCandidate;\n      }\n      return new NativeRTCIceCandidate(args);\n    };\n    window.RTCIceCandidate.prototype = NativeRTCIceCandidate.prototype;\n\n    // Hook up the augmented candidate in onicecandidate and\n    // addEventListener('icecandidate', ...)\n    utils.wrapPeerConnectionEvent(window, 'icecandidate', function(e) {\n      if (e.candidate) {\n        Object.defineProperty(e, 'candidate', {\n          value: new window.RTCIceCandidate(e.candidate),\n          writable: 'false'\n        });\n      }\n      return e;\n    });\n  },\n\n  // shimCreateObjectURL must be called before shimSourceObject to avoid loop.\n\n  shimCreateObjectURL: function(window) {\n    var URL = window && window.URL;\n\n    if (!(typeof window === 'object' && window.HTMLMediaElement &&\n          'srcObject' in window.HTMLMediaElement.prototype &&\n        URL.createObjectURL && URL.revokeObjectURL)) {\n      // Only shim CreateObjectURL using srcObject if srcObject exists.\n      return undefined;\n    }\n\n    var nativeCreateObjectURL = URL.createObjectURL.bind(URL);\n    var nativeRevokeObjectURL = URL.revokeObjectURL.bind(URL);\n    var streams = new Map(), newId = 0;\n\n    URL.createObjectURL = function(stream) {\n      if ('getTracks' in stream) {\n        var url = 'polyblob:' + (++newId);\n        streams.set(url, stream);\n        utils.deprecated('URL.createObjectURL(stream)',\n            'elem.srcObject = stream');\n        return url;\n      }\n      return nativeCreateObjectURL(stream);\n    };\n    URL.revokeObjectURL = function(url) {\n      nativeRevokeObjectURL(url);\n      streams.delete(url);\n    };\n\n    var dsc = Object.getOwnPropertyDescriptor(window.HTMLMediaElement.prototype,\n                                              'src');\n    Object.defineProperty(window.HTMLMediaElement.prototype, 'src', {\n      get: function() {\n        return dsc.get.apply(this);\n      },\n      set: function(url) {\n        this.srcObject = streams.get(url) || null;\n        return dsc.set.apply(this, [url]);\n      }\n    });\n\n    var nativeSetAttribute = window.HTMLMediaElement.prototype.setAttribute;\n    window.HTMLMediaElement.prototype.setAttribute = function() {\n      if (arguments.length === 2 &&\n          ('' + arguments[0]).toLowerCase() === 'src') {\n        this.srcObject = streams.get(arguments[1]) || null;\n      }\n      return nativeSetAttribute.apply(this, arguments);\n    };\n  },\n\n  shimMaxMessageSize: function(window) {\n    if (window.RTCSctpTransport || !window.RTCPeerConnection) {\n      return;\n    }\n    var browserDetails = utils.detectBrowser(window);\n\n    if (!('sctp' in window.RTCPeerConnection.prototype)) {\n      Object.defineProperty(window.RTCPeerConnection.prototype, 'sctp', {\n        get: function() {\n          return typeof this._sctp === 'undefined' ? null : this._sctp;\n        }\n      });\n    }\n\n    var sctpInDescription = function(description) {\n      var sections = SDPUtils.splitSections(description.sdp);\n      sections.shift();\n      return sections.some(function(mediaSection) {\n        var mLine = SDPUtils.parseMLine(mediaSection);\n        return mLine && mLine.kind === 'application'\n            && mLine.protocol.indexOf('SCTP') !== -1;\n      });\n    };\n\n    var getRemoteFirefoxVersion = function(description) {\n      // TODO: Is there a better solution for detecting Firefox?\n      var match = description.sdp.match(/mozilla...THIS_IS_SDPARTA-(\\d+)/);\n      if (match === null || match.length < 2) {\n        return -1;\n      }\n      var version = parseInt(match[1], 10);\n      // Test for NaN (yes, this is ugly)\n      return version !== version ? -1 : version;\n    };\n\n    var getCanSendMaxMessageSize = function(remoteIsFirefox) {\n      // Every implementation we know can send at least 64 KiB.\n      // Note: Although Chrome is technically able to send up to 256 KiB, the\n      //       data does not reach the other peer reliably.\n      //       See: https://bugs.chromium.org/p/webrtc/issues/detail?id=8419\n      var canSendMaxMessageSize = 65536;\n      if (browserDetails.browser === 'firefox') {\n        if (browserDetails.version < 57) {\n          if (remoteIsFirefox === -1) {\n            // FF < 57 will send in 16 KiB chunks using the deprecated PPID\n            // fragmentation.\n            canSendMaxMessageSize = 16384;\n          } else {\n            // However, other FF (and RAWRTC) can reassemble PPID-fragmented\n            // messages. Thus, supporting ~2 GiB when sending.\n            canSendMaxMessageSize = 2147483637;\n          }\n        } else if (browserDetails.version < 60) {\n          // Currently, all FF >= 57 will reset the remote maximum message size\n          // to the default value when a data channel is created at a later\n          // stage. :(\n          // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n          canSendMaxMessageSize =\n            browserDetails.version === 57 ? 65535 : 65536;\n        } else {\n          // FF >= 60 supports sending ~2 GiB\n          canSendMaxMessageSize = 2147483637;\n        }\n      }\n      return canSendMaxMessageSize;\n    };\n\n    var getMaxMessageSize = function(description, remoteIsFirefox) {\n      // Note: 65536 bytes is the default value from the SDP spec. Also,\n      //       every implementation we know supports receiving 65536 bytes.\n      var maxMessageSize = 65536;\n\n      // FF 57 has a slightly incorrect default remote max message size, so\n      // we need to adjust it here to avoid a failure when sending.\n      // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1425697\n      if (browserDetails.browser === 'firefox'\n           && browserDetails.version === 57) {\n        maxMessageSize = 65535;\n      }\n\n      var match = SDPUtils.matchPrefix(description.sdp, 'a=max-message-size:');\n      if (match.length > 0) {\n        maxMessageSize = parseInt(match[0].substr(19), 10);\n      } else if (browserDetails.browser === 'firefox' &&\n                  remoteIsFirefox !== -1) {\n        // If the maximum message size is not present in the remote SDP and\n        // both local and remote are Firefox, the remote peer can receive\n        // ~2 GiB.\n        maxMessageSize = 2147483637;\n      }\n      return maxMessageSize;\n    };\n\n    var origSetRemoteDescription =\n        window.RTCPeerConnection.prototype.setRemoteDescription;\n    window.RTCPeerConnection.prototype.setRemoteDescription = function() {\n      var pc = this;\n      pc._sctp = null;\n\n      if (sctpInDescription(arguments[0])) {\n        // Check if the remote is FF.\n        var isFirefox = getRemoteFirefoxVersion(arguments[0]);\n\n        // Get the maximum message size the local peer is capable of sending\n        var canSendMMS = getCanSendMaxMessageSize(isFirefox);\n\n        // Get the maximum message size of the remote peer.\n        var remoteMMS = getMaxMessageSize(arguments[0], isFirefox);\n\n        // Determine final maximum message size\n        var maxMessageSize;\n        if (canSendMMS === 0 && remoteMMS === 0) {\n          maxMessageSize = Number.POSITIVE_INFINITY;\n        } else if (canSendMMS === 0 || remoteMMS === 0) {\n          maxMessageSize = Math.max(canSendMMS, remoteMMS);\n        } else {\n          maxMessageSize = Math.min(canSendMMS, remoteMMS);\n        }\n\n        // Create a dummy RTCSctpTransport object and the 'maxMessageSize'\n        // attribute.\n        var sctp = {};\n        Object.defineProperty(sctp, 'maxMessageSize', {\n          get: function() {\n            return maxMessageSize;\n          }\n        });\n        pc._sctp = sctp;\n      }\n\n      return origSetRemoteDescription.apply(pc, arguments);\n    };\n  },\n\n  shimSendThrowTypeError: function(window) {\n    if (!(window.RTCPeerConnection &&\n        'createDataChannel' in window.RTCPeerConnection.prototype)) {\n      return;\n    }\n\n    // Note: Although Firefox >= 57 has a native implementation, the maximum\n    //       message size can be reset for all data channels at a later stage.\n    //       See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n\n    function wrapDcSend(dc, pc) {\n      var origDataChannelSend = dc.send;\n      dc.send = function() {\n        var data = arguments[0];\n        var length = data.length || data.size || data.byteLength;\n        if (dc.readyState === 'open' &&\n            pc.sctp && length > pc.sctp.maxMessageSize) {\n          throw new TypeError('Message too large (can send a maximum of ' +\n            pc.sctp.maxMessageSize + ' bytes)');\n        }\n        return origDataChannelSend.apply(dc, arguments);\n      };\n    }\n    var origCreateDataChannel =\n      window.RTCPeerConnection.prototype.createDataChannel;\n    window.RTCPeerConnection.prototype.createDataChannel = function() {\n      var pc = this;\n      var dataChannel = origCreateDataChannel.apply(pc, arguments);\n      wrapDcSend(dataChannel, pc);\n      return dataChannel;\n    };\n    utils.wrapPeerConnectionEvent(window, 'datachannel', function(e) {\n      wrapDcSend(e.channel, e.target);\n      return e;\n    });\n  }\n};\n\n},{\"./utils\":14,\"sdp\":2}],8:[function(require,module,exports){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar utils = require('../utils');\nvar filterIceServers = require('./filtericeservers');\nvar shimRTCPeerConnection = require('rtcpeerconnection-shim');\n\nmodule.exports = {\n  shimGetUserMedia: require('./getusermedia'),\n  shimPeerConnection: function(window) {\n    var browserDetails = utils.detectBrowser(window);\n\n    if (window.RTCIceGatherer) {\n      if (!window.RTCIceCandidate) {\n        window.RTCIceCandidate = function(args) {\n          return args;\n        };\n      }\n      if (!window.RTCSessionDescription) {\n        window.RTCSessionDescription = function(args) {\n          return args;\n        };\n      }\n      // this adds an additional event listener to MediaStrackTrack that signals\n      // when a tracks enabled property was changed. Workaround for a bug in\n      // addStream, see below. No longer required in 15025+\n      if (browserDetails.version < 15025) {\n        var origMSTEnabled = Object.getOwnPropertyDescriptor(\n            window.MediaStreamTrack.prototype, 'enabled');\n        Object.defineProperty(window.MediaStreamTrack.prototype, 'enabled', {\n          set: function(value) {\n            origMSTEnabled.set.call(this, value);\n            var ev = new Event('enabled');\n            ev.enabled = value;\n            this.dispatchEvent(ev);\n          }\n        });\n      }\n    }\n\n    // ORTC defines the DTMF sender a bit different.\n    // https://github.com/w3c/ortc/issues/714\n    if (window.RTCRtpSender && !('dtmf' in window.RTCRtpSender.prototype)) {\n      Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n        get: function() {\n          if (this._dtmf === undefined) {\n            if (this.track.kind === 'audio') {\n              this._dtmf = new window.RTCDtmfSender(this);\n            } else if (this.track.kind === 'video') {\n              this._dtmf = null;\n            }\n          }\n          return this._dtmf;\n        }\n      });\n    }\n    // Edge currently only implements the RTCDtmfSender, not the\n    // RTCDTMFSender alias. See http://draft.ortc.org/#rtcdtmfsender2*\n    if (window.RTCDtmfSender && !window.RTCDTMFSender) {\n      window.RTCDTMFSender = window.RTCDtmfSender;\n    }\n\n    var RTCPeerConnectionShim = shimRTCPeerConnection(window,\n        browserDetails.version);\n    window.RTCPeerConnection = function(config) {\n      if (config && config.iceServers) {\n        config.iceServers = filterIceServers(config.iceServers);\n      }\n      return new RTCPeerConnectionShim(config);\n    };\n    window.RTCPeerConnection.prototype = RTCPeerConnectionShim.prototype;\n  },\n  shimReplaceTrack: function(window) {\n    // ORTC has replaceTrack -- https://github.com/w3c/ortc/issues/614\n    if (window.RTCRtpSender &&\n        !('replaceTrack' in window.RTCRtpSender.prototype)) {\n      window.RTCRtpSender.prototype.replaceTrack =\n          window.RTCRtpSender.prototype.setTrack;\n    }\n  },\n  shimGetDisplayMedia: function(window, preferredMediaSource) {\n    if (!('getDisplayMedia' in window.navigator) ||\n        !window.navigator.mediaDevices ||\n        'getDisplayMedia' in window.navigator.mediaDevices) {\n      return;\n    }\n    var origGetDisplayMedia = window.navigator.getDisplayMedia;\n    window.navigator.mediaDevices.getDisplayMedia = function(constraints) {\n      return origGetDisplayMedia.call(window.navigator, constraints);\n    };\n    window.navigator.getDisplayMedia = function(constraints) {\n      utils.deprecated('navigator.getDisplayMedia',\n          'navigator.mediaDevices.getDisplayMedia');\n      return origGetDisplayMedia.call(window.navigator, constraints);\n    };\n  }\n};\n\n},{\"../utils\":14,\"./filtericeservers\":9,\"./getusermedia\":10,\"rtcpeerconnection-shim\":1}],9:[function(require,module,exports){\n/*\n *  Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar utils = require('../utils');\n// Edge does not like\n// 1) stun: filtered after 14393 unless ?transport=udp is present\n// 2) turn: that does not have all of turn:host:port?transport=udp\n// 3) turn: with ipv6 addresses\n// 4) turn: occurring muliple times\nmodule.exports = function(iceServers, edgeVersion) {\n  var hasTurn = false;\n  iceServers = JSON.parse(JSON.stringify(iceServers));\n  return iceServers.filter(function(server) {\n    if (server && (server.urls || server.url)) {\n      var urls = server.urls || server.url;\n      if (server.url && !server.urls) {\n        utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n      }\n      var isString = typeof urls === 'string';\n      if (isString) {\n        urls = [urls];\n      }\n      urls = urls.filter(function(url) {\n        var validTurn = url.indexOf('turn:') === 0 &&\n            url.indexOf('transport=udp') !== -1 &&\n            url.indexOf('turn:[') === -1 &&\n            !hasTurn;\n\n        if (validTurn) {\n          hasTurn = true;\n          return true;\n        }\n        return url.indexOf('stun:') === 0 && edgeVersion >= 14393 &&\n            url.indexOf('?transport=udp') === -1;\n      });\n\n      delete server.url;\n      server.urls = isString ? urls[0] : urls;\n      return !!urls.length;\n    }\n  });\n};\n\n},{\"../utils\":14}],10:[function(require,module,exports){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\n// Expose public methods.\nmodule.exports = function(window) {\n  var navigator = window && window.navigator;\n\n  var shimError_ = function(e) {\n    return {\n      name: {PermissionDeniedError: 'NotAllowedError'}[e.name] || e.name,\n      message: e.message,\n      constraint: e.constraint,\n      toString: function() {\n        return this.name;\n      }\n    };\n  };\n\n  // getUserMedia error shim.\n  var origGetUserMedia = navigator.mediaDevices.getUserMedia.\n      bind(navigator.mediaDevices);\n  navigator.mediaDevices.getUserMedia = function(c) {\n    return origGetUserMedia(c).catch(function(e) {\n      return Promise.reject(shimError_(e));\n    });\n  };\n};\n\n},{}],11:[function(require,module,exports){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar utils = require('../utils');\n\nmodule.exports = {\n  shimGetUserMedia: require('./getusermedia'),\n  shimOnTrack: function(window) {\n    if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in\n        window.RTCPeerConnection.prototype)) {\n      Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n        get: function() {\n          return this._ontrack;\n        },\n        set: function(f) {\n          if (this._ontrack) {\n            this.removeEventListener('track', this._ontrack);\n            this.removeEventListener('addstream', this._ontrackpoly);\n          }\n          this.addEventListener('track', this._ontrack = f);\n          this.addEventListener('addstream', this._ontrackpoly = function(e) {\n            e.stream.getTracks().forEach(function(track) {\n              var event = new Event('track');\n              event.track = track;\n              event.receiver = {track: track};\n              event.transceiver = {receiver: event.receiver};\n              event.streams = [e.stream];\n              this.dispatchEvent(event);\n            }.bind(this));\n          }.bind(this));\n        },\n        enumerable: true,\n        configurable: true\n      });\n    }\n    if (typeof window === 'object' && window.RTCTrackEvent &&\n        ('receiver' in window.RTCTrackEvent.prototype) &&\n        !('transceiver' in window.RTCTrackEvent.prototype)) {\n      Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n        get: function() {\n          return {receiver: this.receiver};\n        }\n      });\n    }\n  },\n\n  shimSourceObject: function(window) {\n    // Firefox has supported mozSrcObject since FF22, unprefixed in 42.\n    if (typeof window === 'object') {\n      if (window.HTMLMediaElement &&\n        !('srcObject' in window.HTMLMediaElement.prototype)) {\n        // Shim the srcObject property, once, when HTMLMediaElement is found.\n        Object.defineProperty(window.HTMLMediaElement.prototype, 'srcObject', {\n          get: function() {\n            return this.mozSrcObject;\n          },\n          set: function(stream) {\n            this.mozSrcObject = stream;\n          }\n        });\n      }\n    }\n  },\n\n  shimPeerConnection: function(window) {\n    var browserDetails = utils.detectBrowser(window);\n\n    if (typeof window !== 'object' || !(window.RTCPeerConnection ||\n        window.mozRTCPeerConnection)) {\n      return; // probably media.peerconnection.enabled=false in about:config\n    }\n    // The RTCPeerConnection object.\n    if (!window.RTCPeerConnection) {\n      window.RTCPeerConnection = function(pcConfig, pcConstraints) {\n        if (browserDetails.version < 38) {\n          // .urls is not supported in FF < 38.\n          // create RTCIceServers with a single url.\n          if (pcConfig && pcConfig.iceServers) {\n            var newIceServers = [];\n            for (var i = 0; i < pcConfig.iceServers.length; i++) {\n              var server = pcConfig.iceServers[i];\n              if (server.hasOwnProperty('urls')) {\n                for (var j = 0; j < server.urls.length; j++) {\n                  var newServer = {\n                    url: server.urls[j]\n                  };\n                  if (server.urls[j].indexOf('turn') === 0) {\n                    newServer.username = server.username;\n                    newServer.credential = server.credential;\n                  }\n                  newIceServers.push(newServer);\n                }\n              } else {\n                newIceServers.push(pcConfig.iceServers[i]);\n              }\n            }\n            pcConfig.iceServers = newIceServers;\n          }\n        }\n        return new window.mozRTCPeerConnection(pcConfig, pcConstraints);\n      };\n      window.RTCPeerConnection.prototype =\n          window.mozRTCPeerConnection.prototype;\n\n      // wrap static methods. Currently just generateCertificate.\n      if (window.mozRTCPeerConnection.generateCertificate) {\n        Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n          get: function() {\n            return window.mozRTCPeerConnection.generateCertificate;\n          }\n        });\n      }\n\n      window.RTCSessionDescription = window.mozRTCSessionDescription;\n      window.RTCIceCandidate = window.mozRTCIceCandidate;\n    }\n\n    // shim away need for obsolete RTCIceCandidate/RTCSessionDescription.\n    ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n        .forEach(function(method) {\n          var nativeMethod = window.RTCPeerConnection.prototype[method];\n          window.RTCPeerConnection.prototype[method] = function() {\n            arguments[0] = new ((method === 'addIceCandidate') ?\n                window.RTCIceCandidate :\n                window.RTCSessionDescription)(arguments[0]);\n            return nativeMethod.apply(this, arguments);\n          };\n        });\n\n    // support for addIceCandidate(null or undefined)\n    var nativeAddIceCandidate =\n        window.RTCPeerConnection.prototype.addIceCandidate;\n    window.RTCPeerConnection.prototype.addIceCandidate = function() {\n      if (!arguments[0]) {\n        if (arguments[1]) {\n          arguments[1].apply(null);\n        }\n        return Promise.resolve();\n      }\n      return nativeAddIceCandidate.apply(this, arguments);\n    };\n\n    // shim getStats with maplike support\n    var makeMapStats = function(stats) {\n      var map = new Map();\n      Object.keys(stats).forEach(function(key) {\n        map.set(key, stats[key]);\n        map[key] = stats[key];\n      });\n      return map;\n    };\n\n    var modernStatsTypes = {\n      inboundrtp: 'inbound-rtp',\n      outboundrtp: 'outbound-rtp',\n      candidatepair: 'candidate-pair',\n      localcandidate: 'local-candidate',\n      remotecandidate: 'remote-candidate'\n    };\n\n    var nativeGetStats = window.RTCPeerConnection.prototype.getStats;\n    window.RTCPeerConnection.prototype.getStats = function(\n      selector,\n      onSucc,\n      onErr\n    ) {\n      return nativeGetStats.apply(this, [selector || null])\n        .then(function(stats) {\n          if (browserDetails.version < 48) {\n            stats = makeMapStats(stats);\n          }\n          if (browserDetails.version < 53 && !onSucc) {\n            // Shim only promise getStats with spec-hyphens in type names\n            // Leave callback version alone; misc old uses of forEach before Map\n            try {\n              stats.forEach(function(stat) {\n                stat.type = modernStatsTypes[stat.type] || stat.type;\n              });\n            } catch (e) {\n              if (e.name !== 'TypeError') {\n                throw e;\n              }\n              // Avoid TypeError: \"type\" is read-only, in old versions. 34-43ish\n              stats.forEach(function(stat, i) {\n                stats.set(i, Object.assign({}, stat, {\n                  type: modernStatsTypes[stat.type] || stat.type\n                }));\n              });\n            }\n          }\n          return stats;\n        })\n        .then(onSucc, onErr);\n    };\n  },\n\n  shimSenderGetStats: function(window) {\n    if (!(typeof window === 'object' && window.RTCPeerConnection &&\n        window.RTCRtpSender)) {\n      return;\n    }\n    if (window.RTCRtpSender && 'getStats' in window.RTCRtpSender.prototype) {\n      return;\n    }\n    var origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n    if (origGetSenders) {\n      window.RTCPeerConnection.prototype.getSenders = function() {\n        var pc = this;\n        var senders = origGetSenders.apply(pc, []);\n        senders.forEach(function(sender) {\n          sender._pc = pc;\n        });\n        return senders;\n      };\n    }\n\n    var origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n    if (origAddTrack) {\n      window.RTCPeerConnection.prototype.addTrack = function() {\n        var sender = origAddTrack.apply(this, arguments);\n        sender._pc = this;\n        return sender;\n      };\n    }\n    window.RTCRtpSender.prototype.getStats = function() {\n      return this.track ? this._pc.getStats(this.track) :\n          Promise.resolve(new Map());\n    };\n  },\n\n  shimReceiverGetStats: function(window) {\n    if (!(typeof window === 'object' && window.RTCPeerConnection &&\n        window.RTCRtpSender)) {\n      return;\n    }\n    if (window.RTCRtpSender && 'getStats' in window.RTCRtpReceiver.prototype) {\n      return;\n    }\n    var origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n    if (origGetReceivers) {\n      window.RTCPeerConnection.prototype.getReceivers = function() {\n        var pc = this;\n        var receivers = origGetReceivers.apply(pc, []);\n        receivers.forEach(function(receiver) {\n          receiver._pc = pc;\n        });\n        return receivers;\n      };\n    }\n    utils.wrapPeerConnectionEvent(window, 'track', function(e) {\n      e.receiver._pc = e.srcElement;\n      return e;\n    });\n    window.RTCRtpReceiver.prototype.getStats = function() {\n      return this._pc.getStats(this.track);\n    };\n  },\n\n  shimRemoveStream: function(window) {\n    if (!window.RTCPeerConnection ||\n        'removeStream' in window.RTCPeerConnection.prototype) {\n      return;\n    }\n    window.RTCPeerConnection.prototype.removeStream = function(stream) {\n      var pc = this;\n      utils.deprecated('removeStream', 'removeTrack');\n      this.getSenders().forEach(function(sender) {\n        if (sender.track && stream.getTracks().indexOf(sender.track) !== -1) {\n          pc.removeTrack(sender);\n        }\n      });\n    };\n  },\n\n  shimRTCDataChannel: function(window) {\n    // rename DataChannel to RTCDataChannel (native fix in FF60):\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=1173851\n    if (window.DataChannel && !window.RTCDataChannel) {\n      window.RTCDataChannel = window.DataChannel;\n    }\n  },\n\n  shimGetDisplayMedia: function(window, preferredMediaSource) {\n    if (!window.navigator || !window.navigator.mediaDevices ||\n        'getDisplayMedia' in window.navigator.mediaDevices) {\n      return;\n    }\n    window.navigator.mediaDevices.getDisplayMedia = function(constraints) {\n      if (!(constraints && constraints.video)) {\n        var err = new DOMException('getDisplayMedia without video ' +\n            'constraints is undefined');\n        err.name = 'NotFoundError';\n        // from https://heycam.github.io/webidl/#idl-DOMException-error-names\n        err.code = 8;\n        return Promise.reject(err);\n      }\n      if (constraints.video === true) {\n        constraints.video = {mediaSource: preferredMediaSource};\n      } else {\n        constraints.video.mediaSource = preferredMediaSource;\n      }\n      return window.navigator.mediaDevices.getUserMedia(constraints);\n    };\n    window.navigator.getDisplayMedia = function(constraints) {\n      utils.deprecated('navigator.getDisplayMedia',\n          'navigator.mediaDevices.getDisplayMedia');\n      return window.navigator.mediaDevices.getDisplayMedia(constraints);\n    };\n  }\n};\n\n},{\"../utils\":14,\"./getusermedia\":12}],12:[function(require,module,exports){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar utils = require('../utils');\nvar logging = utils.log;\n\n// Expose public methods.\nmodule.exports = function(window) {\n  var browserDetails = utils.detectBrowser(window);\n  var navigator = window && window.navigator;\n  var MediaStreamTrack = window && window.MediaStreamTrack;\n\n  var shimError_ = function(e) {\n    return {\n      name: {\n        InternalError: 'NotReadableError',\n        NotSupportedError: 'TypeError',\n        PermissionDeniedError: 'NotAllowedError',\n        SecurityError: 'NotAllowedError'\n      }[e.name] || e.name,\n      message: {\n        'The operation is insecure.': 'The request is not allowed by the ' +\n        'user agent or the platform in the current context.'\n      }[e.message] || e.message,\n      constraint: e.constraint,\n      toString: function() {\n        return this.name + (this.message && ': ') + this.message;\n      }\n    };\n  };\n\n  // getUserMedia constraints shim.\n  var getUserMedia_ = function(constraints, onSuccess, onError) {\n    var constraintsToFF37_ = function(c) {\n      if (typeof c !== 'object' || c.require) {\n        return c;\n      }\n      var require = [];\n      Object.keys(c).forEach(function(key) {\n        if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n          return;\n        }\n        var r = c[key] = (typeof c[key] === 'object') ?\n            c[key] : {ideal: c[key]};\n        if (r.min !== undefined ||\n            r.max !== undefined || r.exact !== undefined) {\n          require.push(key);\n        }\n        if (r.exact !== undefined) {\n          if (typeof r.exact === 'number') {\n            r. min = r.max = r.exact;\n          } else {\n            c[key] = r.exact;\n          }\n          delete r.exact;\n        }\n        if (r.ideal !== undefined) {\n          c.advanced = c.advanced || [];\n          var oc = {};\n          if (typeof r.ideal === 'number') {\n            oc[key] = {min: r.ideal, max: r.ideal};\n          } else {\n            oc[key] = r.ideal;\n          }\n          c.advanced.push(oc);\n          delete r.ideal;\n          if (!Object.keys(r).length) {\n            delete c[key];\n          }\n        }\n      });\n      if (require.length) {\n        c.require = require;\n      }\n      return c;\n    };\n    constraints = JSON.parse(JSON.stringify(constraints));\n    if (browserDetails.version < 38) {\n      logging('spec: ' + JSON.stringify(constraints));\n      if (constraints.audio) {\n        constraints.audio = constraintsToFF37_(constraints.audio);\n      }\n      if (constraints.video) {\n        constraints.video = constraintsToFF37_(constraints.video);\n      }\n      logging('ff37: ' + JSON.stringify(constraints));\n    }\n    return navigator.mozGetUserMedia(constraints, onSuccess, function(e) {\n      onError(shimError_(e));\n    });\n  };\n\n  // Returns the result of getUserMedia as a Promise.\n  var getUserMediaPromise_ = function(constraints) {\n    return new Promise(function(resolve, reject) {\n      getUserMedia_(constraints, resolve, reject);\n    });\n  };\n\n  // Shim for mediaDevices on older versions.\n  if (!navigator.mediaDevices) {\n    navigator.mediaDevices = {getUserMedia: getUserMediaPromise_,\n      addEventListener: function() { },\n      removeEventListener: function() { }\n    };\n  }\n  navigator.mediaDevices.enumerateDevices =\n      navigator.mediaDevices.enumerateDevices || function() {\n        return new Promise(function(resolve) {\n          var infos = [\n            {kind: 'audioinput', deviceId: 'default', label: '', groupId: ''},\n            {kind: 'videoinput', deviceId: 'default', label: '', groupId: ''}\n          ];\n          resolve(infos);\n        });\n      };\n\n  if (browserDetails.version < 41) {\n    // Work around http://bugzil.la/1169665\n    var orgEnumerateDevices =\n        navigator.mediaDevices.enumerateDevices.bind(navigator.mediaDevices);\n    navigator.mediaDevices.enumerateDevices = function() {\n      return orgEnumerateDevices().then(undefined, function(e) {\n        if (e.name === 'NotFoundError') {\n          return [];\n        }\n        throw e;\n      });\n    };\n  }\n  if (browserDetails.version < 49) {\n    var origGetUserMedia = navigator.mediaDevices.getUserMedia.\n        bind(navigator.mediaDevices);\n    navigator.mediaDevices.getUserMedia = function(c) {\n      return origGetUserMedia(c).then(function(stream) {\n        // Work around https://bugzil.la/802326\n        if (c.audio && !stream.getAudioTracks().length ||\n            c.video && !stream.getVideoTracks().length) {\n          stream.getTracks().forEach(function(track) {\n            track.stop();\n          });\n          throw new DOMException('The object can not be found here.',\n                                 'NotFoundError');\n        }\n        return stream;\n      }, function(e) {\n        return Promise.reject(shimError_(e));\n      });\n    };\n  }\n  if (!(browserDetails.version > 55 &&\n      'autoGainControl' in navigator.mediaDevices.getSupportedConstraints())) {\n    var remap = function(obj, a, b) {\n      if (a in obj && !(b in obj)) {\n        obj[b] = obj[a];\n        delete obj[a];\n      }\n    };\n\n    var nativeGetUserMedia = navigator.mediaDevices.getUserMedia.\n        bind(navigator.mediaDevices);\n    navigator.mediaDevices.getUserMedia = function(c) {\n      if (typeof c === 'object' && typeof c.audio === 'object') {\n        c = JSON.parse(JSON.stringify(c));\n        remap(c.audio, 'autoGainControl', 'mozAutoGainControl');\n        remap(c.audio, 'noiseSuppression', 'mozNoiseSuppression');\n      }\n      return nativeGetUserMedia(c);\n    };\n\n    if (MediaStreamTrack && MediaStreamTrack.prototype.getSettings) {\n      var nativeGetSettings = MediaStreamTrack.prototype.getSettings;\n      MediaStreamTrack.prototype.getSettings = function() {\n        var obj = nativeGetSettings.apply(this, arguments);\n        remap(obj, 'mozAutoGainControl', 'autoGainControl');\n        remap(obj, 'mozNoiseSuppression', 'noiseSuppression');\n        return obj;\n      };\n    }\n\n    if (MediaStreamTrack && MediaStreamTrack.prototype.applyConstraints) {\n      var nativeApplyConstraints = MediaStreamTrack.prototype.applyConstraints;\n      MediaStreamTrack.prototype.applyConstraints = function(c) {\n        if (this.kind === 'audio' && typeof c === 'object') {\n          c = JSON.parse(JSON.stringify(c));\n          remap(c, 'autoGainControl', 'mozAutoGainControl');\n          remap(c, 'noiseSuppression', 'mozNoiseSuppression');\n        }\n        return nativeApplyConstraints.apply(this, [c]);\n      };\n    }\n  }\n  navigator.getUserMedia = function(constraints, onSuccess, onError) {\n    if (browserDetails.version < 44) {\n      return getUserMedia_(constraints, onSuccess, onError);\n    }\n    // Replace Firefox 44+'s deprecation warning with unprefixed version.\n    utils.deprecated('navigator.getUserMedia',\n        'navigator.mediaDevices.getUserMedia');\n    navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError);\n  };\n};\n\n},{\"../utils\":14}],13:[function(require,module,exports){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n'use strict';\nvar utils = require('../utils');\n\nmodule.exports = {\n  shimLocalStreamsAPI: function(window) {\n    if (typeof window !== 'object' || !window.RTCPeerConnection) {\n      return;\n    }\n    if (!('getLocalStreams' in window.RTCPeerConnection.prototype)) {\n      window.RTCPeerConnection.prototype.getLocalStreams = function() {\n        if (!this._localStreams) {\n          this._localStreams = [];\n        }\n        return this._localStreams;\n      };\n    }\n    if (!('getStreamById' in window.RTCPeerConnection.prototype)) {\n      window.RTCPeerConnection.prototype.getStreamById = function(id) {\n        var result = null;\n        if (this._localStreams) {\n          this._localStreams.forEach(function(stream) {\n            if (stream.id === id) {\n              result = stream;\n            }\n          });\n        }\n        if (this._remoteStreams) {\n          this._remoteStreams.forEach(function(stream) {\n            if (stream.id === id) {\n              result = stream;\n            }\n          });\n        }\n        return result;\n      };\n    }\n    if (!('addStream' in window.RTCPeerConnection.prototype)) {\n      var _addTrack = window.RTCPeerConnection.prototype.addTrack;\n      window.RTCPeerConnection.prototype.addStream = function(stream) {\n        if (!this._localStreams) {\n          this._localStreams = [];\n        }\n        if (this._localStreams.indexOf(stream) === -1) {\n          this._localStreams.push(stream);\n        }\n        var pc = this;\n        stream.getTracks().forEach(function(track) {\n          _addTrack.call(pc, track, stream);\n        });\n      };\n\n      window.RTCPeerConnection.prototype.addTrack = function(track, stream) {\n        if (stream) {\n          if (!this._localStreams) {\n            this._localStreams = [stream];\n          } else if (this._localStreams.indexOf(stream) === -1) {\n            this._localStreams.push(stream);\n          }\n        }\n        return _addTrack.call(this, track, stream);\n      };\n    }\n    if (!('removeStream' in window.RTCPeerConnection.prototype)) {\n      window.RTCPeerConnection.prototype.removeStream = function(stream) {\n        if (!this._localStreams) {\n          this._localStreams = [];\n        }\n        var index = this._localStreams.indexOf(stream);\n        if (index === -1) {\n          return;\n        }\n        this._localStreams.splice(index, 1);\n        var pc = this;\n        var tracks = stream.getTracks();\n        this.getSenders().forEach(function(sender) {\n          if (tracks.indexOf(sender.track) !== -1) {\n            pc.removeTrack(sender);\n          }\n        });\n      };\n    }\n  },\n  shimRemoteStreamsAPI: function(window) {\n    if (typeof window !== 'object' || !window.RTCPeerConnection) {\n      return;\n    }\n    if (!('getRemoteStreams' in window.RTCPeerConnection.prototype)) {\n      window.RTCPeerConnection.prototype.getRemoteStreams = function() {\n        return this._remoteStreams ? this._remoteStreams : [];\n      };\n    }\n    if (!('onaddstream' in window.RTCPeerConnection.prototype)) {\n      Object.defineProperty(window.RTCPeerConnection.prototype, 'onaddstream', {\n        get: function() {\n          return this._onaddstream;\n        },\n        set: function(f) {\n          if (this._onaddstream) {\n            this.removeEventListener('addstream', this._onaddstream);\n          }\n          this.addEventListener('addstream', this._onaddstream = f);\n        }\n      });\n      var origSetRemoteDescription =\n          window.RTCPeerConnection.prototype.setRemoteDescription;\n      window.RTCPeerConnection.prototype.setRemoteDescription = function() {\n        var pc = this;\n        if (!this._onaddstreampoly) {\n          this.addEventListener('track', this._onaddstreampoly = function(e) {\n            e.streams.forEach(function(stream) {\n              if (!pc._remoteStreams) {\n                pc._remoteStreams = [];\n              }\n              if (pc._remoteStreams.indexOf(stream) >= 0) {\n                return;\n              }\n              pc._remoteStreams.push(stream);\n              var event = new Event('addstream');\n              event.stream = stream;\n              pc.dispatchEvent(event);\n            });\n          });\n        }\n        return origSetRemoteDescription.apply(pc, arguments);\n      };\n    }\n  },\n  shimCallbacksAPI: function(window) {\n    if (typeof window !== 'object' || !window.RTCPeerConnection) {\n      return;\n    }\n    var prototype = window.RTCPeerConnection.prototype;\n    var createOffer = prototype.createOffer;\n    var createAnswer = prototype.createAnswer;\n    var setLocalDescription = prototype.setLocalDescription;\n    var setRemoteDescription = prototype.setRemoteDescription;\n    var addIceCandidate = prototype.addIceCandidate;\n\n    prototype.createOffer = function(successCallback, failureCallback) {\n      var options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n      var promise = createOffer.apply(this, [options]);\n      if (!failureCallback) {\n        return promise;\n      }\n      promise.then(successCallback, failureCallback);\n      return Promise.resolve();\n    };\n\n    prototype.createAnswer = function(successCallback, failureCallback) {\n      var options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n      var promise = createAnswer.apply(this, [options]);\n      if (!failureCallback) {\n        return promise;\n      }\n      promise.then(successCallback, failureCallback);\n      return Promise.resolve();\n    };\n\n    var withCallback = function(description, successCallback, failureCallback) {\n      var promise = setLocalDescription.apply(this, [description]);\n      if (!failureCallback) {\n        return promise;\n      }\n      promise.then(successCallback, failureCallback);\n      return Promise.resolve();\n    };\n    prototype.setLocalDescription = withCallback;\n\n    withCallback = function(description, successCallback, failureCallback) {\n      var promise = setRemoteDescription.apply(this, [description]);\n      if (!failureCallback) {\n        return promise;\n      }\n      promise.then(successCallback, failureCallback);\n      return Promise.resolve();\n    };\n    prototype.setRemoteDescription = withCallback;\n\n    withCallback = function(candidate, successCallback, failureCallback) {\n      var promise = addIceCandidate.apply(this, [candidate]);\n      if (!failureCallback) {\n        return promise;\n      }\n      promise.then(successCallback, failureCallback);\n      return Promise.resolve();\n    };\n    prototype.addIceCandidate = withCallback;\n  },\n  shimGetUserMedia: function(window) {\n    var navigator = window && window.navigator;\n\n    if (!navigator.getUserMedia) {\n      if (navigator.webkitGetUserMedia) {\n        navigator.getUserMedia = navigator.webkitGetUserMedia.bind(navigator);\n      } else if (navigator.mediaDevices &&\n          navigator.mediaDevices.getUserMedia) {\n        navigator.getUserMedia = function(constraints, cb, errcb) {\n          navigator.mediaDevices.getUserMedia(constraints)\n          .then(cb, errcb);\n        }.bind(navigator);\n      }\n    }\n  },\n  shimRTCIceServerUrls: function(window) {\n    // migrate from non-spec RTCIceServer.url to RTCIceServer.urls\n    var OrigPeerConnection = window.RTCPeerConnection;\n    window.RTCPeerConnection = function(pcConfig, pcConstraints) {\n      if (pcConfig && pcConfig.iceServers) {\n        var newIceServers = [];\n        for (var i = 0; i < pcConfig.iceServers.length; i++) {\n          var server = pcConfig.iceServers[i];\n          if (!server.hasOwnProperty('urls') &&\n              server.hasOwnProperty('url')) {\n            utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n            server = JSON.parse(JSON.stringify(server));\n            server.urls = server.url;\n            delete server.url;\n            newIceServers.push(server);\n          } else {\n            newIceServers.push(pcConfig.iceServers[i]);\n          }\n        }\n        pcConfig.iceServers = newIceServers;\n      }\n      return new OrigPeerConnection(pcConfig, pcConstraints);\n    };\n    window.RTCPeerConnection.prototype = OrigPeerConnection.prototype;\n    // wrap static methods. Currently just generateCertificate.\n    if ('generateCertificate' in window.RTCPeerConnection) {\n      Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n        get: function() {\n          return OrigPeerConnection.generateCertificate;\n        }\n      });\n    }\n  },\n  shimTrackEventTransceiver: function(window) {\n    // Add event.transceiver member over deprecated event.receiver\n    if (typeof window === 'object' && window.RTCPeerConnection &&\n        ('receiver' in window.RTCTrackEvent.prototype) &&\n        // can't check 'transceiver' in window.RTCTrackEvent.prototype, as it is\n        // defined for some reason even when window.RTCTransceiver is not.\n        !window.RTCTransceiver) {\n      Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n        get: function() {\n          return {receiver: this.receiver};\n        }\n      });\n    }\n  },\n\n  shimCreateOfferLegacy: function(window) {\n    var origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n    window.RTCPeerConnection.prototype.createOffer = function(offerOptions) {\n      var pc = this;\n      if (offerOptions) {\n        if (typeof offerOptions.offerToReceiveAudio !== 'undefined') {\n          // support bit values\n          offerOptions.offerToReceiveAudio = !!offerOptions.offerToReceiveAudio;\n        }\n        var audioTransceiver = pc.getTransceivers().find(function(transceiver) {\n          return transceiver.sender.track &&\n              transceiver.sender.track.kind === 'audio';\n        });\n        if (offerOptions.offerToReceiveAudio === false && audioTransceiver) {\n          if (audioTransceiver.direction === 'sendrecv') {\n            if (audioTransceiver.setDirection) {\n              audioTransceiver.setDirection('sendonly');\n            } else {\n              audioTransceiver.direction = 'sendonly';\n            }\n          } else if (audioTransceiver.direction === 'recvonly') {\n            if (audioTransceiver.setDirection) {\n              audioTransceiver.setDirection('inactive');\n            } else {\n              audioTransceiver.direction = 'inactive';\n            }\n          }\n        } else if (offerOptions.offerToReceiveAudio === true &&\n            !audioTransceiver) {\n          pc.addTransceiver('audio');\n        }\n\n\n        if (typeof offerOptions.offerToReceiveVideo !== 'undefined') {\n          // support bit values\n          offerOptions.offerToReceiveVideo = !!offerOptions.offerToReceiveVideo;\n        }\n        var videoTransceiver = pc.getTransceivers().find(function(transceiver) {\n          return transceiver.sender.track &&\n              transceiver.sender.track.kind === 'video';\n        });\n        if (offerOptions.offerToReceiveVideo === false && videoTransceiver) {\n          if (videoTransceiver.direction === 'sendrecv') {\n            videoTransceiver.setDirection('sendonly');\n          } else if (videoTransceiver.direction === 'recvonly') {\n            videoTransceiver.setDirection('inactive');\n          }\n        } else if (offerOptions.offerToReceiveVideo === true &&\n            !videoTransceiver) {\n          pc.addTransceiver('video');\n        }\n      }\n      return origCreateOffer.apply(pc, arguments);\n    };\n  }\n};\n\n},{\"../utils\":14}],14:[function(require,module,exports){\n/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar logDisabled_ = true;\nvar deprecationWarnings_ = true;\n\n/**\n * Extract browser version out of the provided user agent string.\n *\n * @param {!string} uastring userAgent string.\n * @param {!string} expr Regular expression used as match criteria.\n * @param {!number} pos position in the version string to be returned.\n * @return {!number} browser version.\n */\nfunction extractVersion(uastring, expr, pos) {\n  var match = uastring.match(expr);\n  return match && match.length >= pos && parseInt(match[pos], 10);\n}\n\n// Wraps the peerconnection event eventNameToWrap in a function\n// which returns the modified event object (or false to prevent\n// the event).\nfunction wrapPeerConnectionEvent(window, eventNameToWrap, wrapper) {\n  if (!window.RTCPeerConnection) {\n    return;\n  }\n  var proto = window.RTCPeerConnection.prototype;\n  var nativeAddEventListener = proto.addEventListener;\n  proto.addEventListener = function(nativeEventName, cb) {\n    if (nativeEventName !== eventNameToWrap) {\n      return nativeAddEventListener.apply(this, arguments);\n    }\n    var wrappedCallback = function(e) {\n      var modifiedEvent = wrapper(e);\n      if (modifiedEvent) {\n        cb(modifiedEvent);\n      }\n    };\n    this._eventMap = this._eventMap || {};\n    this._eventMap[cb] = wrappedCallback;\n    return nativeAddEventListener.apply(this, [nativeEventName,\n      wrappedCallback]);\n  };\n\n  var nativeRemoveEventListener = proto.removeEventListener;\n  proto.removeEventListener = function(nativeEventName, cb) {\n    if (nativeEventName !== eventNameToWrap || !this._eventMap\n        || !this._eventMap[cb]) {\n      return nativeRemoveEventListener.apply(this, arguments);\n    }\n    var unwrappedCb = this._eventMap[cb];\n    delete this._eventMap[cb];\n    return nativeRemoveEventListener.apply(this, [nativeEventName,\n      unwrappedCb]);\n  };\n\n  Object.defineProperty(proto, 'on' + eventNameToWrap, {\n    get: function() {\n      return this['_on' + eventNameToWrap];\n    },\n    set: function(cb) {\n      if (this['_on' + eventNameToWrap]) {\n        this.removeEventListener(eventNameToWrap,\n            this['_on' + eventNameToWrap]);\n        delete this['_on' + eventNameToWrap];\n      }\n      if (cb) {\n        this.addEventListener(eventNameToWrap,\n            this['_on' + eventNameToWrap] = cb);\n      }\n    },\n    enumerable: true,\n    configurable: true\n  });\n}\n\n// Utility methods.\nmodule.exports = {\n  extractVersion: extractVersion,\n  wrapPeerConnectionEvent: wrapPeerConnectionEvent,\n  disableLog: function(bool) {\n    if (typeof bool !== 'boolean') {\n      return new Error('Argument type: ' + typeof bool +\n          '. Please use a boolean.');\n    }\n    logDisabled_ = bool;\n    return (bool) ? 'adapter.js logging disabled' :\n        'adapter.js logging enabled';\n  },\n\n  /**\n   * Disable or enable deprecation warnings\n   * @param {!boolean} bool set to true to disable warnings.\n   */\n  disableWarnings: function(bool) {\n    if (typeof bool !== 'boolean') {\n      return new Error('Argument type: ' + typeof bool +\n          '. Please use a boolean.');\n    }\n    deprecationWarnings_ = !bool;\n    return 'adapter.js deprecation warnings ' + (bool ? 'disabled' : 'enabled');\n  },\n\n  log: function() {\n    if (typeof window === 'object') {\n      if (logDisabled_) {\n        return;\n      }\n      if (typeof console !== 'undefined' && typeof console.log === 'function') {\n        console.log.apply(console, arguments);\n      }\n    }\n  },\n\n  /**\n   * Shows a deprecation warning suggesting the modern and spec-compatible API.\n   */\n  deprecated: function(oldMethod, newMethod) {\n    if (!deprecationWarnings_) {\n      return;\n    }\n    console.warn(oldMethod + ' is deprecated, please use ' + newMethod +\n        ' instead.');\n  },\n\n  /**\n   * Browser detector.\n   *\n   * @return {object} result containing browser and version\n   *     properties.\n   */\n  detectBrowser: function(window) {\n    var navigator = window && window.navigator;\n\n    // Returned result object.\n    var result = {};\n    result.browser = null;\n    result.version = null;\n\n    // Fail early if it's not a browser\n    if (typeof window === 'undefined' || !window.navigator) {\n      result.browser = 'Not a browser.';\n      return result;\n    }\n\n    if (navigator.mozGetUserMedia) { // Firefox.\n      result.browser = 'firefox';\n      result.version = extractVersion(navigator.userAgent,\n          /Firefox\\/(\\d+)\\./, 1);\n    } else if (navigator.webkitGetUserMedia) {\n      // Chrome, Chromium, Webview, Opera.\n      // Version matches Chrome/WebRTC version.\n      result.browser = 'chrome';\n      result.version = extractVersion(navigator.userAgent,\n          /Chrom(e|ium)\\/(\\d+)\\./, 2);\n    } else if (navigator.mediaDevices &&\n        navigator.userAgent.match(/Edge\\/(\\d+).(\\d+)$/)) { // Edge.\n      result.browser = 'edge';\n      result.version = extractVersion(navigator.userAgent,\n          /Edge\\/(\\d+).(\\d+)$/, 2);\n    } else if (window.RTCPeerConnection &&\n        navigator.userAgent.match(/AppleWebKit\\/(\\d+)\\./)) { // Safari.\n      result.browser = 'safari';\n      result.version = extractVersion(navigator.userAgent,\n          /AppleWebKit\\/(\\d+)\\./, 1);\n    } else { // Default fallthrough: not supported.\n      result.browser = 'Not a supported browser.';\n      return result;\n    }\n\n    return result;\n  }\n};\n\n},{}]},{},[3])(3)\n});\n","import { assign } from '@ember/polyfills';\nimport { reject, defer } from 'rsvp';\nimport { set } from '@ember/object';\nimport { camelize } from '@ember/string';\nimport { inject as service } from '@ember/service';\nimport DS from 'ember-data';\nimport { pluralize } from 'ember-inflector';\nimport { BASE_GROUP_FIELDS } from '../models/group';\nimport { BASE_PERSON, FULL_PERSON } from '../models/person';\nimport SearchAdapterMixin from '../search/adapter-mixin';\nimport { buildAuthHeaders } from '../utils/adapter-auth-headers';\n\nconst HASH_LENGTH_LIMIT = 4976;\n\nconst versions = {\n    people: 'v2',\n    groups: 'v2',\n    locations: 'v1',\n    users: 'v1',\n    messages: 'v1',\n    notifications: 'v1'\n};\n\nconst ApplicationAdapter = DS.RESTAdapter.extend(SearchAdapterMixin, {\n    logger: service('stash-logger'),\n    session: service(),\n    application: service(),\n\n    defaultSerializer: 'application',\n\n    namespace: 'api',\n\n    get headers() {\n        /* eslint-disable dot-notation */\n        let hash = window.location.hash;\n\n        hash = hash.length > HASH_LENGTH_LIMIT ? hash.slice(0, HASH_LENGTH_LIMIT) : hash;\n\n        const headers = {\n            'ININ-Client-Path': hash\n        };\n\n        return buildAuthHeaders(this.session, this.application, headers);\n    },\n\n    // Override ajax method to ensure headers are always included\n    ajax(url, type, options) {\n        const hash = options || {};\n        hash.url = url;\n        hash.type = type;\n        hash.dataType = 'json';\n        hash.context = this;\n\n        // Force headers to be included\n        const headers = this.headers;\n        hash.headers = Object.assign({}, headers, hash.headers || {});\n\n        return this._super(url, type, options);\n    },\n\n    shouldReloadAll() {\n        return true;\n    },\n\n    shouldBackgroundReloadRecord() {\n        return false;\n    },\n\n    normalizeErrorResponse(status, headers, payload) {\n        // Ember Data 3.28: ensure payload is a plain object, not an Error instance\n        // or other non-serializable object\n        let normalizedPayload = payload;\n\n        if (payload instanceof Error) {\n            normalizedPayload = {\n                title: payload.name || 'Error',\n                detail: payload.message || String(payload),\n                status: String(status)\n            };\n        } else if (typeof payload !== 'object' || payload === null) {\n            normalizedPayload = {\n                title: 'Error',\n                detail: String(payload),\n                status: String(status)\n            };\n        } else if (Array.isArray(payload)) {\n            // Already in errors array format\n            return this._super(status, headers, { errors: payload });\n        }\n\n        // Force json-api error format\n        const data = {\n            errors: [normalizedPayload]\n        };\n        return this._super(status, headers, data);\n    },\n\n    modelFor(type) {\n        return this.pathForType(type);\n    },\n\n    pathForType(type) {\n        if (type.modelName) {\n            type = type.modelName;\n        }\n\n        type = camelize(type);\n        return pluralize(type);\n    },\n\n    createRecord(store, type, record) {\n        var snapshot = record._createSnapshot();\n        var data = store.serializerFor(type.modelName).serialize(snapshot, { includeId: true });\n        return this.ajax(this.buildURL(type.modelName), 'POST', { data: data });\n    },\n\n    updateRecord(store, type, snapshot) {\n        let data = {};\n        store.serializerFor(type.modelName).serializeIntoHash(data, type, snapshot);\n        if (data[type.modelName]) {\n            data = data[type.modelName];\n        }\n        set(data, 'version', snapshot.attr('version'));\n        return this.ajax(this.urlForUpdateRecord(snapshot.id, type.modelName), 'POST', { data: data });\n    },\n\n    buildURL(type, id) {\n        return this._directoryUrl(type, id);\n    },\n\n    findRecord(store, type, id, snapshot) {\n        let data = {};\n        const traditional = true;\n\n        if (type.modelName === 'person') {\n            data = Object.assign({}, data, FULL_PERSON);\n        } else {\n            data = Object.assign({}, data, { fl: '*' });\n        }\n\n        return this.ajax(this.buildURL(type.modelName, id, snapshot, 'findRecord'), 'GET', { data, traditional });\n    },\n\n    findQuery() {\n        return this.query(...arguments);\n    },\n\n    entityEndpoint(path, type, id) {\n        let modelEndpoint = this.pathForType(type);\n        let apiVersion = versions[modelEndpoint];\n        let host = !!this.host ? this.host : '';\n        if (type === 'person') {\n            return `${host}/platform/directory/${this.namespace}/${apiVersion}/${modelEndpoint}/${id}/${path}`;\n        }\n\n        return `${host}/${this.namespace}/${apiVersion}/${modelEndpoint}/${id}/${path}`;\n    },\n\n    findMultiEntity(store, params, requestType) {\n        if (!params) {\n            params = { limit: 25, fl: '*', _entity: 'all', facets: '*' };\n        }\n\n        if (requestType === 'search') {\n            // new style search instead of query\n            params = Object.assign({}, params, {\n                returnFields: [...BASE_PERSON.fl.split(','), ...BASE_GROUP_FIELDS]\n            });\n            return this.performSearch(params);\n        }\n\n        return reject(new Error('old style search has been removed. Please update to new search'));\n    },\n\n    findFavorites(store, type, id, params) {\n        return this.findFavoritesV3(store, type, id, params);\n    },\n\n    findFavoritesV3(store, type, id, params = {}) {\n        let modelEndpoint = this.pathForType('person');\n        let host = !!this.host ? this.host : '';\n        const url = `${host}/directory/${this.namespace}/v3/${modelEndpoint}/${id}/favorites`;\n        const deferred = defer();\n        this._findFavoritesV3(url, params)\n            .then(res => {\n                this._handleFavorites(res, [], deferred, params, url, 1);\n            })\n            .catch(error => {\n                this.logger.error('Error trying to find favorites:', {\n                    error,\n                    params\n                });\n                deferred.resolve([]);\n            });\n        return deferred.promise;\n    },\n\n    _findFavoritesV3(url, params, page = 1) {\n        const count = 25;\n        const offset = count * (page - 1);\n        params = assign({}, params, {\n            offset,\n            limit: count\n        });\n        return this.ajax(url, 'GET', { data: params, cache: false });\n    },\n\n    _handleFavorites(data, collection, deferred, params, url, page) {\n        const results = data.res;\n        if (results && results.length === 0) {\n            return deferred.resolve(collection);\n        }\n\n        collection = [].concat(collection, results);\n\n        const nextPage = page + 1;\n        return this._findFavoritesV3(url, params, nextPage)\n            .then(data => {\n                return this._handleFavorites(data, collection, deferred, params, url, nextPage);\n            })\n            .catch(error => {\n                this.logger.error('Error while loading favorites:', {\n                    error,\n                    params,\n                    page: nextPage,\n                    currentCount: collection.length\n                });\n                deferred.resolve(collection);\n            });\n    },\n\n    forwardVoicemail(voicemail, recipient, type, params = {}) {\n        let host = !!this.host ? this.host : '';\n        const url = `${host}/platform/${this.namespace}/v2/voicemail/messages`;\n        params = Object.assign({}, params, {\n            voicemailMessageId: voicemail,\n            userId: type === 'person' ? recipient : null,\n            groupId: type === 'group' ? recipient : null\n        });\n        return this.ajax(url, 'POST', { data: params, cache: false });\n    },\n\n    _findDirectReports(url, page = 1) {\n        const count = 25;\n        const offset = count * (page - 1);\n        return this.ajax(url, 'GET', {\n            data: { count, offset, fl: BASE_PERSON.fl }\n        });\n    },\n\n    _handleReports(data, collection, deferred, url, page) {\n        const results = data.res;\n\n        if (results && results.length === 0) {\n            return deferred.resolve(collection);\n        }\n\n        collection = [].concat(collection, results);\n\n        const nextPage = page + 1;\n        return this._findDirectReports(url, nextPage)\n            .then(data => {\n                return this._handleReports(data, collection, deferred, url, nextPage);\n            })\n            .catch(error => {\n                this.logger.error('Error while loading directs report page', {\n                    error,\n                    page: nextPage,\n                    currentCount: collection.length\n                });\n                deferred.resolve(collection);\n            });\n    },\n\n    findDirectReports(store, type, id, params) {\n        if (!params) {\n            params = { fl: '*' };\n        }\n\n        const deferred = defer();\n        const url = this.entityEndpoint('directReports', type, id);\n        this._findDirectReports(url, 1)\n            .then(data => {\n                return this._handleReports(data, [], deferred, url, 1);\n            })\n            .catch(error => {\n                this.logger.error('Error while attempting to find reports', {\n                    error,\n                    id\n                });\n                deferred.resolve([]);\n            });\n        return deferred.promise;\n    },\n\n    findSuperiors(store, type, id, params) {\n        if (!params) {\n            params = { fl: '*' };\n        }\n\n        var url = this.entityEndpoint('superiors', type, id);\n        return this.ajax(url, 'GET', { data: params });\n    },\n\n    urlForUpdateRecord(id, type) {\n        let modelEndpoint = this.pathForType(type);\n        let apiVersion = versions[modelEndpoint];\n        let url = `/${this.namespace}/${apiVersion}/${modelEndpoint}`;\n        if (id) {\n            url += `/${id}`;\n        }\n\n        return url;\n    },\n\n    _directoryUrl(type, id) {\n        let modelEndpoint = this.pathForType(type);\n        let apiVersion = versions[modelEndpoint];\n        let url = `/${this.namespace}/${apiVersion}/${modelEndpoint}`;\n        if (type === 'person') {\n            url = `/platform/directory${url}`;\n        }\n\n        if (id) {\n            url += `/${id}`;\n        }\n\n        return url;\n    }\n});\n\nexport default ApplicationAdapter;\n","import { inject as service } from '@ember/service';\nimport { reads } from '@ember/object/computed';\nimport DS from 'ember-data';\nimport { buildAuthHeaders, mergeAuthHeaders } from '../utils/adapter-auth-headers';\n\nconst { RESTAdapter } = DS;\n\nexport default RESTAdapter.extend({\n    session: service(),\n    application: service(),\n\n    host: reads('application.purecloudV2BaseUri'),\n    namespace: 'api/v2',\n\n    get headers() {\n        return buildAuthHeaders(this.session, this.application);\n    },\n\n    // Ember 3.28: a bare `get headers()` getter is not reliably read by Ember Data's internal\n    // request machinery, so headers must also be force-merged here (mirrors application.js/purecloud.js).\n    ajaxOptions(url, type, hash) {\n        hash = this._super(url, type, hash);\n        return mergeAuthHeaders(hash, this.headers);\n    },\n\n    updateRecord(store, type, snapshot) {\n        const data = {};\n        const serializer = store.serializerFor(type.modelName);\n\n        serializer.serializeIntoHash(data, type, snapshot);\n\n        const id = snapshot.id;\n        const url = this.buildURL(type.modelName, id, snapshot, 'updateRecord');\n\n        let method = 'PUT';\n        if (snapshot.adapterOptions && snapshot.adapterOptions.patch) {\n            method = 'PATCH';\n        }\n\n        return this.ajax(url, method, { data: data });\n    },\n\n    urlForFindRecord(id) {\n        // the id provided should be the the user guid\n        return `${this.host}/${this.namespace}/users/${id}/callforwarding`;\n    },\n\n    urlForUpdateRecord(id) {\n        return this.urlForFindRecord(id);\n    },\n\n    // Typically we wouldnt rewrite this private function, but we need to modify how errors are extracted\n    // See: https://github.com/emberjs/data/issues/4934\n    handleResponse(status, headers, payload, requestData) {\n        let data = {};\n        if (payload && status !== 200) {\n            data.errors = [payload];\n        } else {\n            data = payload;\n        }\n        return this._super(status, headers, data, requestData);\n    }\n});\n","import { resolve } from 'rsvp';\nimport { inject as service } from '@ember/service';\nimport ApplicationAdapter from './application';\nimport moment from '../utils/dates';\nimport _ from 'lodash';\n\nexport default ApplicationAdapter.extend({\n    session: service(),\n    application: service(),\n\n    paging: {\n        pageSize: 25,\n        pageNumber: 1\n    },\n    queryDefaults: {\n        currentInterval: moment(),\n        previousInterval: moment().subtract(1, 'week')\n    },\n\n    query(store, typeClass, query) {\n        // Because this adapter is janky and stores state,\n        // we need to reset state values when the call-history\n        // component inits -- this way, when more data is requestsed\n        // it starts from the current day instead of progressively\n        // fetch intervals further back.\n        if (query.resetIntervals) {\n            this.set('queryDefaults.currentInterval', moment());\n            this.set('queryDefaults.previousInterval', moment().subtract(1, 'week'));\n            this.set('paging.pageNumber', 1);\n        }\n\n        if (query.findLatestCalls) {\n            return this._fetchLatestCalls(...arguments);\n        }\n\n        return this._fetchHistory(...arguments);\n    },\n\n    /**\n     * _fetchLatestCalls - Fetch the latest calls\n     * @return Promise\n     */\n    _fetchLatestCalls() {\n        const guid = this.get('session.person.guid');\n        if (!guid) {\n            return resolve([]);\n        }\n        const data = {\n            interval: `${moment().subtract(4, 'hours').toISOString()}/${moment().add(4, 'hours').toISOString()}`\n        };\n        return this.ajax(this.getHistoryPath(), 'GET', { data });\n    },\n\n    /**\n     * _fetchHistory - Fetch the history in a given interval. This method handles paging and adjusting the interval parameter\n     * depending on how many entities are returned so that subsequent calls will fetch previous conversations.\n     * @param  {Object}  query     The default query passed in.\n     * @return {Promise}\n     */\n    _fetchHistory(...params) {\n        let query = params[2];\n        const guid = this.get('session.person.guid');\n        if (!guid) {\n            return resolve([]);\n        }\n        const queryDefaults = this.queryDefaults;\n        const meta = _.merge(queryDefaults, query);\n        const paging = this.paging;\n        const data = {\n            interval: `${meta.previousInterval.toISOString()}/${meta.currentInterval.toISOString()}`,\n            pageSize: paging.pageSize,\n            pageNumber: paging.pageNumber\n        };\n        return this.ajax(this.getHistoryPath(), 'GET', { data }).then(data => {\n            if (data.entities && data.entities.length === this.get('paging.pageSize')) {\n                this.incrementPageNumber();\n            } else {\n                this.decrementWeek();\n            }\n            return data;\n        });\n    },\n\n    /**\n     * incrementPageNumber - Increments the page number\n     */\n    incrementPageNumber() {\n        this.set('paging.pageNumber', this.get('paging.pageNumber') + 1);\n    },\n\n    /**\n     * decrementWeek - Modifies interval to previous week\n     */\n    decrementWeek() {\n        this.set('paging.pageNumber', 1);\n        let currentInterval = this.get('queryDefaults.currentInterval');\n        let previousInterval = this.get('queryDefaults.previousInterval');\n        this.set('queryDefaults.currentInterval', currentInterval.subtract(1, 'week'));\n        this.set('queryDefaults.previousInterval', previousInterval.subtract(1, 'week'));\n    },\n\n    /**\n     * getHistoryPath - Generates history uri for xhr\n     */\n    getHistoryPath() {\n        return this.application.pcV2Uri('api/v2/conversations/calls/history?expand=externalcontact');\n    }\n});\n","import Schema from './schema';\n\nexport default Schema.extend({\n    namespace: '/platform/api/v2/externalcontacts/contacts'\n});\n","import PurecloudAdapter from './purecloud';\n\nexport default PurecloudAdapter.extend({\n    namespace: 'api/v2',\n    defaultSerializer: 'conversation',\n\n    findHasMany(store, snapshot, url, relationship) {\n        const type = relationship.type;\n\n        switch (type) {\n            case 'recording':\n                return this.store.query('recording', { conversationId: snapshot.id });\n            default:\n                return this._super(...arguments);\n        }\n    }\n});\n","import { inject as service } from '@ember/service';\nimport { not } from '@ember/object/computed';\nimport { resolve } from 'rsvp';\nimport PurecloudAdapter from '../purecloud';\nimport { addPageAction } from 'web-directory/utils/newrelic';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nconst STRICT = true;\nconst EXPAND = 'externalOrganization,externalDataSources,division';\nconst PHONE_LOOKUP_EXPAND = 'contacts.externalOrganization,externalDataSources';\nconst TIME_OUT = 15000; // public API takes 10 seconds to time out - but adding a little more than 10 as fudge factor\nconst QUERY_MAX_LENGTH = 256;\nconst ORIGINATOR = 'web-directory';\n\nexport default PurecloudAdapter.extend(LoggerMixin, {\n    logger: service('stash-logger'),\n    application: service(),\n    relate: service(),\n    addressformat: service(),\n    permissions: service(),\n\n    namespace: 'api/v2',\n\n    defaultSerializer: 'externalcontacts/contact',\n\n    pathForType: function () {\n        return 'externalcontacts/contacts';\n    },\n\n    cannotViewExternalContacts: not('permissions.hasExternalContactsViewContactAccess'),\n\n    createRecord(store, type, record) {\n        this.relate.clearCachedAdapter();\n        const data = Object.assign(store.serializerFor(type.modelName).serialize(record, { includeId: true }), {\n            originator: ORIGINATOR\n        });\n        return this.ajax(this.buildURL(type.modelName), 'POST', { data: data });\n    },\n\n    findRecord(store, type, id) {\n        const urlAndModel = this.buildURL(type.modelName);\n        const params = `?${new URLSearchParams({ expand: EXPAND }).toString()}`;\n\n        return this.ajax(`${urlAndModel}/${id}${params}`, 'GET', { timeout: TIME_OUT });\n    },\n\n    deleteRecord() {\n        const returnValue = this._super(...arguments);\n        this.relate.clearCachedAdapter();\n        return returnValue;\n    },\n\n    query(store, type, queryParams) {\n        const addressFormat = this.addressformat;\n\n        let { searchTerm, pageNumber, pageSize, expandField, sortOrder, originator, subType } = queryParams;\n        const hasValidSearchTerm = searchTerm && typeof searchTerm === 'string';\n        const isValidPhoneNumber = addressFormat.isValidNumber(searchTerm, null, STRICT);\n\n        // only attempt to phone format search strings that look like phone numbers and contain only phone number like characters\n        const containsOnlyPhoneNumberChars = /^(\\+|\\d|\\)|\\(|\\.|-|\\s)+$/gim.test(searchTerm);\n\n        // only mutate search if not wrapped in \"\"\n        const isExactSearch = /^\"(.*)\"$/.test(searchTerm);\n        if (isExactSearch) {\n            // Log exact search occurrences for tracking usage\n            addPageAction('externalContactExactSearch', {\n                userId: this.get('session.user.id'),\n                orgId: this.get('session.org.guid')\n            });\n        } else if (containsOnlyPhoneNumberChars && isValidPhoneNumber) {\n            searchTerm = addressFormat.formatAddress(searchTerm);\n        }\n\n        let data = {};\n        if (expandField) {\n            data.expand = expandField;\n        }\n        if (originator) {\n            data.originator = originator;\n        }\n        if (subType) {\n            data.subType = subType;\n        }\n        let url = this.buildURL(type.modelName);\n\n        if (this.cannotViewExternalContacts) {\n            // Logging a failure of the permissions check here is unnecessary because this is merely the ultimate\n            // backstop to catch unpermitted external contaxts service calls. It's the responsibility of the caller\n            // to handle the response and either log and/or alert the user.  See RELATE-1776\n            return resolve({});\n        }\n\n        if (queryParams.useLookupService) {\n            // Use the \"reverse whitepages\" search endpoint\n            url = this.application.pcUri(`api/v2/externalcontacts/reversewhitepageslookup`);\n\n            data.lookupVal = searchTerm;\n            if (expandField) {\n                data.expand = PHONE_LOOKUP_EXPAND;\n            }\n            if (originator) {\n                data.originator = originator;\n            }\n        } else {\n            if (hasValidSearchTerm) {\n                const term = encodeURI(searchTerm.replace('tel:', ''));\n\n                try {\n                    if (term.length > QUERY_MAX_LENGTH) {\n                        throw new Error('Query length limit encountered');\n                    }\n                } catch (error) {\n                    this.logger.error(`ACD: Attempted to send query larger than limit. From: ${originator} `, error);\n                }\n\n                data.q = decodeURI(term.substr(0, QUERY_MAX_LENGTH)); // remove characters beyond limit\n            }\n            if (pageNumber) {\n                data.pageNumber = pageNumber;\n            }\n            if (pageSize) {\n                data.pageSize = pageSize;\n            }\n            if (sortOrder) {\n                data.sortOrder = sortOrder;\n            }\n            if (originator) {\n                data.originator = originator;\n            }\n        }\n        if (queryParams.bypassCache) {\n            return this.relate.findMatchingExternalContacts(searchTerm, pageNumber, pageSize, expandField, originator);\n        }\n        return this.relate.getCachedAdapter({ url, data, TIME_OUT }, this);\n    }\n});\n","import { inject as service } from '@ember/service';\nimport PurecloudAdapter from '../purecloud';\nconst EXPAND = 'externalDataSources';\n\nconst TIME_OUT = 10000;\nconst ORIGINATOR = 'web-directory';\n\nexport default PurecloudAdapter.extend({\n    relate: service(),\n\n    namespace: 'api/v2',\n    defaultSerializer: 'externalcontacts/organizations',\n\n    pathForType: function () {\n        return 'externalcontacts/organizations';\n    },\n\n    createRecord(store, type, record) {\n        this.relate.clearCachedAdapter();\n        const data = Object.assign(store.serializerFor(type.modelName).serialize(record, { includeId: true }), {\n            originator: ORIGINATOR\n        });\n        return this.ajax(this.buildURL(type.modelName), 'POST', { data: data });\n    },\n\n    findRecord(store, type, id) {\n        const urlAndModel = this.buildURL(type.modelName);\n        const params = `?${new URLSearchParams({ expand: EXPAND }).toString()}`;\n\n        return this.ajax(`${urlAndModel}/${id}${params}`, 'GET', { timeout: TIME_OUT }); // msec - we saw ~100 msec latency for this call in DCA testing.  This ought to cover it.\n    },\n\n    updateRecord(store, type, snapshot) {\n        const id = snapshot.id;\n        const url = this.buildURL(type.modelName) + '/' + id;\n        const dataType = 'json';\n        const data = Object.assign(this.serialize(snapshot, { includeId: true }), { originator: ORIGINATOR });\n\n        return this.ajax(url, 'PUT', { dataType, data });\n    },\n\n    deleteRecord() {\n        const returnValue = this._super(...arguments);\n        this.relate.clearCachedAdapter();\n        return returnValue;\n    },\n\n    query(store, type, queryParams) {\n        const url = this.buildURL(type.modelName);\n        let searchTerm = queryParams.searchTerm;\n        let pageNumber = queryParams.pageNumber;\n        let pageSize = queryParams.pageSize;\n        let originator = queryParams.originator;\n\n        let data = {};\n        data.expand = EXPAND;\n\n        if (searchTerm) {\n            data.q = searchTerm.replace('tel:', ''); // Strip the 'tel:', if any\n        }\n        if (pageNumber) {\n            data.pageNumber = pageNumber;\n        }\n        if (pageSize) {\n            data.pageSize = pageSize;\n        }\n        if (originator) {\n            data.originator = originator;\n        }\n        return this.relate.getCachedAdapter({ url, data, TIME_OUT }, this);\n    }\n});\n","import { inject as service } from '@ember/service';\nimport DS from 'ember-data';\nimport { buildAuthHeaders, mergeAuthHeaders } from '../utils/adapter-auth-headers';\n\nexport default DS.RESTAdapter.extend({\n    application: service(),\n    session: service(),\n\n    get headers() {\n        return buildAuthHeaders(this.session, this.application);\n    },\n\n    // Ember 3.28: a bare `get headers()` getter is not reliably read by Ember Data's internal\n    // request machinery, so headers must also be force-merged here (mirrors application.js/purecloud.js).\n    ajaxOptions(url, type, hash) {\n        hash = this._super(url, type, hash);\n        return mergeAuthHeaders(hash, this.headers);\n    },\n\n    urlForFindRecord() {\n        return this.application.pcV2Uri(`api/v2/geolocations/settings`);\n    }\n});\n","import { resolve } from 'rsvp';\nimport { inject as service } from '@ember/service';\nimport DS from 'ember-data';\nimport { buildAuthHeaders, mergeAuthHeaders } from '../utils/adapter-auth-headers';\n\nexport default DS.RESTAdapter.extend({\n    session: service(),\n    application: service(),\n\n    get headers() {\n        return buildAuthHeaders(this.session, this.application);\n    },\n\n    // Ember 3.28: a bare `get headers()` getter is not reliably read by Ember Data's internal\n    // request machinery, so headers must also be force-merged here (mirrors application.js/purecloud.js).\n    ajaxOptions(url, type, hash) {\n        hash = this._super(url, type, hash);\n        return mergeAuthHeaders(hash, this.headers);\n    },\n\n    updateRecord(store, type, snapshot) {\n        var data = {};\n        var serializer = store.serializerFor(type.modelName);\n\n        serializer.serializeIntoHash(data, type, snapshot);\n\n        var id = snapshot.id;\n        var url = this.buildURL(type.modelName, id, snapshot, 'updateRecord');\n\n        if (url.indexOf('undefined') !== -1 || !this.get('session.person.guid')) {\n            // ignore this by resolving undefined. something trying to save geolocation when not authenticated\n            return resolve();\n        }\n\n        return this.ajax(url, 'PATCH', { data: data });\n    },\n\n    urlForUpdateRecord(id) {\n        return this.application.pcV2Uri(`api/v2/users/${this.get('session.person.guid')}/geolocations/${id}`);\n    },\n\n    handleResponse(status) {\n        let response = this._super(...arguments);\n        if (response && response.name && response.name === 'Error') {\n            response.code = status;\n        }\n        return response;\n    }\n});\n","import { inject as service } from '@ember/service';\nimport { reads } from '@ember/object/computed';\nimport DS from 'ember-data';\nimport { buildAuthHeaders, mergeAuthHeaders } from '../utils/adapter-auth-headers';\n\nexport default DS.RESTAdapter.extend({\n    session: service(),\n    application: service(),\n\n    host: reads('application.purecloudV2BaseUri'),\n    namespace: `api/v2`,\n\n    get headers() {\n        return buildAuthHeaders(this.session, this.application);\n    },\n\n    // Ember 3.28: a bare `get headers()` getter is not reliably read by Ember Data's internal\n    // request machinery, so headers must also be force-merged here (mirrors application.js/purecloud.js).\n    ajaxOptions(url, type, hash) {\n        hash = this._super(url, type, hash);\n        return mergeAuthHeaders(hash, this.headers);\n    },\n\n    urlForFindRecord(id) {\n        return this._baseUrl(id);\n    },\n\n    urlForUpdateRecord(id) {\n        return this._baseUrl(id);\n    },\n\n    updateRecord(store, type, snapshot) {\n        let data = {};\n        let serializer = store.serializerFor(type.modelName);\n\n        serializer.serializeIntoHash(data, type, snapshot);\n\n        let id = snapshot.id;\n        let url = this.buildURL(type.modelName, id, snapshot, 'updateRecord');\n\n        return this.ajax(url, 'PATCH', { data: data.groupPolicy });\n    },\n\n    handleResponse(status, headers, payload, requestData) {\n        if (status < 400) {\n            return this._super(...arguments);\n        }\n\n        payload.errors = [\n            {\n                status,\n                title: payload.message,\n                details: payload\n            }\n        ];\n\n        return this._super(status, headers, payload, requestData);\n    },\n\n    _baseUrl(guid) {\n        return `${this.host}/${this.namespace}/voicemail/groups/${guid}/policy`;\n    }\n});\n","import { reads } from '@ember/object/computed';\nimport { Promise } from 'rsvp';\nimport { inject as service } from '@ember/service';\nimport DS from 'ember-data';\nimport { buildAuthHeaders, mergeAuthHeaders } from '../utils/adapter-auth-headers';\n\nconst { RESTAdapter } = DS;\n\nexport default RESTAdapter.extend({\n    session: service(),\n    application: service(),\n    store: service(),\n\n    host: reads('application.purecloudV2BaseUri'),\n    directoryHost: reads('application.orgspanBaseUri'),\n    namespace: 'api/v2',\n    platformNameSpace: 'platform/api/v2',\n\n    get headers() {\n        return buildAuthHeaders(this.session, this.application);\n    },\n\n    buildQuery() {\n        return {\n            fl: '*'\n        };\n    },\n\n    baseUrl() {\n        return `${this.host}/${this.platformNameSpace}/groups`;\n    },\n\n    urlForFindRecord(id) {\n        return `${this.baseUrl()}/${id}/profile`;\n    },\n\n    urlForUpdateRecord(id) {\n        return `${this.baseUrl()}/${id}/profile`;\n    },\n\n    entityEndpoint(endpoint, type, id) {\n        return `${this.baseUrl()}/${id}/${endpoint}`;\n    },\n\n    urlForFindMany() {\n        return `${this.host}/${this.namespace}/profiles/groups`;\n    },\n\n    findRecord(store, type, id, snapshot) {\n        const url = this.buildURL(type.modelName, id, snapshot, 'findRecord');\n        const traditional = true;\n        const data = Object.assign({}, data, { fields: '*' });\n        return this.ajax(url, 'GET', { data, traditional }).then(gProfile => {\n            if (snapshot.record.get('version') && gProfile.version !== snapshot.attr('version')) {\n                snapshot.record.set('version', gProfile.version);\n            }\n\n            /*\n                Is this a new Group?\n                When creating a group by default there is only one owner so\n                the member count will always be 1 on a create.  The bevy service\n                is eventually consistent so we may have a member count of 0\n                after our next GET.  Therefore we set the memberCount to 1\n                by default.\n            */\n            if (\n                gProfile.general.memberCount[0].value === 0 &&\n                gProfile.individuals.individuals.length === 0 &&\n                gProfile.owners.owners.length === 1\n            ) {\n                gProfile.general.memberCount[0].value = 1;\n            }\n\n            return gProfile;\n        });\n    },\n\n    // Need to overwrite so that we can provide the version on all updates\n    // and make sure data isn't key'd by type\n    updateRecord(store, type, snapshot) {\n        let data = {};\n        const groupSerializer = store.serializerFor(type.modelName);\n        groupSerializer.serializeIntoHash(data, type, snapshot);\n\n        if (this.get('session.features.groupProileNoIndividualsSave') && data.group.individuals) {\n            return this.store.findRecord('group-policy', data.group.guid).then(policy => {\n                data = this.generateGroupProfilePayload(groupSerializer, data, policy);\n\n                if (data[type.modelName]) {\n                    data = data[type.modelName];\n                }\n                return this.ajax(this.urlForUpdateRecord(snapshot.id, type.modelName), 'PUT', { data: data });\n            });\n        } else {\n            data = this.generateGroupProfilePayload(groupSerializer, data);\n\n            if (data[type.modelName]) {\n                data = data[type.modelName];\n            }\n            return this.ajax(this.urlForUpdateRecord(snapshot.id, type.modelName), 'PUT', { data: data });\n        }\n    },\n\n    deleteRecord(store, type, snapshot) {\n        let id = snapshot.id;\n        return this.ajax(this.buildURL(type.modelName, id, snapshot, 'deleteRecord'), 'DELETE', {\n            dataType: 'text'\n        }).then(() => {\n            // After a delete using the public API we need to go get that deleted group\n            // to keep ember-data happy.\n            const jIdNumber = this.getJidIdNumber(snapshot.record.data.contactInfo.chat[0].value.jid);\n            return this.getDeletedGroup(jIdNumber);\n        });\n    },\n\n    ajaxOptions(url, type) {\n        let hash = this._super(...arguments);\n        // Our apis are silly...\n        if (type && type.toLowerCase() === 'delete') {\n            hash.dataType = 'text';\n        }\n        // Ember 3.28: a bare `get headers()` getter is not reliably read by Ember Data's internal\n        // request machinery, so headers must also be force-merged here (mirrors application.js/purecloud.js).\n        hash = mergeAuthHeaders(hash, this.headers);\n        return hash;\n    },\n\n    findMany(store, type, ids, snapshots) {\n        const url = this.buildURL(type.modelName, ids, snapshots, 'findMany');\n\n        let uuids = '';\n        let jIds = '';\n        let urlWithAppendedIds = '';\n        let urlDeletedWithAppendedIds = `${this.baseUrl()}/bulk/deleted?jabberId=`;\n\n        ids.forEach(id => {\n            // accepts jIds or ids\n            if (id.indexOf('-') > -1) {\n                uuids = uuids.concat(id, ',');\n            } else {\n                id = this.getJidIdNumber(id);\n                jIds = jIds.concat(id, ',');\n            }\n        });\n\n        if (uuids.length > 0) {\n            uuids = uuids.substring(0, uuids.length - 1);\n            urlWithAppendedIds = urlWithAppendedIds.concat('id=', uuids);\n            urlWithAppendedIds = `${url}?${urlWithAppendedIds}`;\n        } else if (jIds.length > 0) {\n            jIds = jIds.substring(0, jIds.length - 1);\n            urlWithAppendedIds = urlWithAppendedIds.concat('jabberId=', jIds);\n            urlWithAppendedIds = `${url}?${urlWithAppendedIds}`;\n            urlDeletedWithAppendedIds = urlDeletedWithAppendedIds.concat(jIds);\n        } else {\n            urlWithAppendedIds = `${url}`;\n        }\n\n        /*\n            When using public API / bevy deleted groups are not returned yet they are needed.\n            We need to make speical request to get those deleted groups.  WebRtc provides a list\n            that is used to fill out is roster...in the form of jabberIds.  As part of this\n            we need to evaluate the jabberIds that are missing in the initial GET request,\n            find the missing deleted ones and make a request to get those deleted groups.\n        */\n        if (jIds.length > 0) {\n            return this.ajax(urlWithAppendedIds, 'GET').then(activeResults => {\n                return this.getDeletedGroups(urlDeletedWithAppendedIds, activeResults);\n            });\n        }\n\n        return this.ajax(urlWithAppendedIds, 'GET');\n    },\n\n    getDeletedGroups(deleteUrl, groupsResults) {\n        return new Promise(resolve => {\n            this.ajax(deleteUrl, 'GET').then(deletedGroups => {\n                deletedGroups.entities.forEach(g => {\n                    groupsResults.entities.push(this.normalizeDeletedGroup(g));\n                });\n                return resolve(groupsResults);\n            });\n        });\n    },\n\n    getDeletedGroup(id) {\n        const getUrl = `${this.baseUrl()}/bulk/deleted?jabberId=${id}`;\n        return new Promise(resolve => {\n            this.ajax(getUrl, 'GET').then(deletedGroup => {\n                return resolve(deletedGroup);\n            });\n        });\n    },\n\n    findFavorites() {\n        const adapter = this.store.adapterFor('application');\n        return adapter.findFavorites(...arguments);\n    },\n\n    findGroupMembership(id, params) {\n        const query = params;\n\n        if (typeof params.offset === 'number' && params.limit) {\n            query.pageNumber = 1 + Math.ceil(params.offset / params.limit);\n            query.pageSize = params.limit;\n        }\n        const url = `${this.baseUrl()}/${id}/members`;\n        return this.ajax(url, 'GET', { data: params });\n    },\n\n    generateGroupProfilePayload(groupSerializer, json, vmPolicy) {\n        let gProfile = json.group;\n\n        gProfile.organizationId = this.get('session.org.guid');\n        gProfile.id = gProfile.guid;\n        delete gProfile.guid;\n\n        if (gProfile.mt) {\n            delete gProfile.mt;\n        }\n\n        if (gProfile.meta) {\n            delete gProfile.meta;\n        }\n\n        delete gProfile.membershipDraft;\n\n        if (gProfile.general.needsCommit) {\n            delete gProfile.general.needsCommit;\n        }\n\n        if (gProfile.general.exchangeSync) {\n            delete gProfile.general.exchangeSync;\n        }\n\n        if (gProfile.general.links && gProfile.general.links.length > 0) {\n            groupSerializer.cleanGroupLinkIds(gProfile.general.links);\n        }\n\n        if (\n            gProfile.contactInfo.email &&\n            gProfile.contactInfo.email.length > 0 &&\n            gProfile.contactInfo.email[0].value == ''\n        ) {\n            delete gProfile.contactInfo.email;\n        }\n\n        if (!Array.isArray(gProfile.contactInfo.groupNumber)) {\n            delete gProfile.contactInfo.groupNumber;\n        }\n\n        if (gProfile.contactInfo.phone) {\n            delete gProfile.contactInfo.phone;\n        }\n\n        if (gProfile.contactInfo.groupNumber && gProfile.contactInfo.groupNumber.length > 0) {\n            if (gProfile.contactInfo.groupNumber[0].labelKey) {\n                delete gProfile.contactInfo.groupNumber[0].labelKey;\n            }\n\n            if (!this.hasGroupPhone(gProfile.contactInfo.groupNumber[0])) {\n                delete gProfile.contactInfo.groupNumber;\n            }\n        }\n\n        // The members API already adds individuals to groups,  we\n        // do not send the individuals to keep the request size down.\n        if (this.get('session.features.groupProileNoIndividualsSave') && gProfile.individuals) {\n            // The exception is when a voicemail policy of SEQUENTIAL is in place,\n            // then the individuals must be sent to maintain the order of individuals.\n            if (!vmPolicy || vmPolicy.data.groupAlertType !== 'SEQUENTIAL') {\n                delete gProfile.individuals;\n            }\n        }\n\n        return gProfile;\n    },\n\n    hasGroupPhone(numberInfo) {\n        const hasNumber = numberInfo.value && numberInfo.value.number && numberInfo.value.number !== '';\n        const hasExtension = numberInfo.value && numberInfo.value.extension && numberInfo.value.extension !== '';\n\n        if (hasNumber || hasExtension) {\n            return true;\n        }\n\n        return false;\n    },\n\n    getJidIdNumber(jid) {\n        return jid.indexOf('@') > -1 ? jid.split('@')[0] : jid;\n    },\n\n    normalizeDeletedGroup(deletedGroup) {\n        deletedGroup.general = {\n            name: [\n                {\n                    value: deletedGroup.name,\n                    labelKey: 'name'\n                }\n            ],\n            groupType: [\n                {\n                    value: deletedGroup.type === 'offical' ? 'groups.offical' : deletedGroup.type,\n                    labelKey: 'groupType'\n                }\n            ],\n            memberCount: [\n                {\n                    value: deletedGroup.memberCount,\n                    labelKey: 'memberCount'\n                }\n            ]\n        };\n        deletedGroup.contactInfo = {\n            chat: [\n                {\n                    value: {\n                        jid: deletedGroup.chat.jabberId\n                    },\n                    labelKey: 'chat'\n                }\n            ]\n        };\n        delete deletedGroup.name;\n        delete deletedGroup.chat;\n        delete deletedGroup.groupType;\n        delete deletedGroup.memberCount;\n\n        return deletedGroup;\n    }\n});\n","import { inject as service } from '@ember/service';\nimport { reads } from '@ember/object/computed';\nimport { set } from '@ember/object';\nimport { hash, resolve } from 'rsvp';\nimport DS from 'ember-data';\nimport { BASE_LOCATION_FIELDS } from '../models/location';\nimport { buildAuthHeaders, mergeAuthHeaders } from '../utils/adapter-auth-headers';\n\nconst { RESTAdapter } = DS;\n\nexport default RESTAdapter.extend({\n    session: service(),\n    application: service(),\n\n    host: reads('application.purecloudV2BaseUri'),\n    namespace: 'api/v2',\n\n    get headers() {\n        return buildAuthHeaders(this.session, this.application);\n    },\n\n    // Ember 3.28: a bare `get headers()` getter is not reliably read by Ember Data's internal\n    // request machinery, so headers must also be force-merged here (mirrors application.js/purecloud.js).\n    ajaxOptions(url, type, hashArg) {\n        hashArg = this._super(url, type, hashArg);\n        return mergeAuthHeaders(hashArg, this.headers);\n    },\n\n    buildQuery() {\n        return {\n            expand: BASE_LOCATION_FIELDS.join(',')\n        };\n    },\n\n    baseUrl(id) {\n        return `${this.host}/${this.namespace}/locations/${id}`;\n    },\n\n    urlForUpdateRecord(id) {\n        return this.baseUrl(id);\n    },\n\n    urlForFindRecord(id) {\n        // the id provided should be the the user guid\n        return this.baseUrl(id);\n    },\n\n    urlForHasMany(id) {\n        return `${this.baseUrl(id)}/sublocations`;\n    },\n\n    // Need to overwrite the private function to load activities we need\n    findRecord(store, type, id, snapshot) {\n        const url = this.buildURL(type.modelName, id, snapshot, 'findRecord');\n        const query = this.buildQuery(snapshot);\n        return hash({\n            location: this.ajax(url, 'GET', { data: query }),\n            floors: this.ajax(this.urlForHasMany(id), 'GET', { data: query }).catch(() => resolve({}))\n        });\n    },\n\n    // Need to overwrite so that we can provide the version on all updates\n    // and make sure data isnt key'd by type\n    updateRecord(store, type, snapshot) {\n        let data = {};\n        store.serializerFor(type.modelName).serializeIntoHash(data, type, snapshot);\n        if (data[type.modelName]) {\n            data = data[type.modelName];\n        }\n        set(data, 'version', snapshot.attr('version'));\n        return this.ajax(this.urlForUpdateRecord(snapshot.id, type.modelName), 'PUT', { data: data });\n    },\n\n    handleResponse(status, headers, payload, requestData) {\n        if (status < 400) {\n            return this._super(...arguments);\n        }\n\n        payload.errors = [\n            {\n                status,\n                title: payload.message,\n                details: payload\n            }\n        ];\n\n        return this._super(status, headers, payload, requestData);\n    }\n});\n","import { inject as service } from '@ember/service';\nimport ApplicationAdapter from './application';\n\nexport default ApplicationAdapter.extend({\n    application: service(),\n\n    buildURL() {\n        return this.application.pcV2Uri('api/v2/organizations/me');\n    }\n});\n","import { inject as service } from '@ember/service';\nimport { reads } from '@ember/object/computed';\nimport { reject, all } from 'rsvp'; // resolve - keep for future implementation\nimport { set } from '@ember/object';\nimport DS from 'ember-data';\n\nimport { batchEntityIds } from '../services/store';\nimport { BASE_PERSON } from '../models/person';\nimport { buildAuthHeaders, mergeAuthHeaders } from '../utils/adapter-auth-headers';\n\nconst { RESTAdapter } = DS;\n\nexport default RESTAdapter.extend({\n    ajaxService: service('ajax'),\n    session: service(),\n    application: service(),\n    integrationsPresenceSvc: service('integrations-presence'),\n\n    host: reads('application.purecloudV2BaseUri'),\n\n    namespace: 'api/v2',\n\n    get headers() {\n        return buildAuthHeaders(this.session, this.application);\n    },\n\n    // Ember 3.28: a bare `get headers()` getter is not reliably read by Ember Data's internal\n    // request machinery, so headers must also be force-merged here (mirrors application.js/purecloud.js).\n    // This covers `findMany`/`findSuperiors`/`findDirectReports`/`_loadActivities`, which call\n    // `this.ajax(...)` directly. `findRecord` goes through `ajaxService`, which injects auth itself.\n    ajaxOptions(url, type, hash) {\n        hash = this._super(url, type, hash);\n        return mergeAuthHeaders(hash, this.headers);\n    },\n\n    buildQuery() {\n        return {\n            fl: '*',\n            expand: BASE_PERSON.expand\n        };\n    },\n\n    baseUrl(id) {\n        return `${this.host}/${this.namespace}/users/${id}`;\n    },\n\n    urlForUpdateRecord(id) {\n        return `${this.baseUrl(id)}/profile`;\n    },\n\n    urlForFindRecord(id) {\n        // the id provided should be the the user guid\n        return `${this.baseUrl(id)}/profile`;\n    },\n\n    urlForFindMany() {\n        return `${this.host}/${this.namespace}/profiles/users`;\n    },\n\n    // Need to overwrite the private function to load activities we need\n    findRecord(store, type, id, options) {\n        const url = this.buildURL(type.modelName, id, options, 'findRecord');\n        const query = this.buildQuery(options);\n\n        const usingIntegrationSource =\n            options && options.adapterOptions && options.adapterOptions.integrationPresenceSource;\n\n        const extraExpandArr = options && options.adapterOptions && options.adapterOptions.extraExpands;\n\n        if (extraExpandArr && extraExpandArr.length > 0) {\n            query.expand = `${query.expand},${extraExpandArr.join()}`;\n        }\n\n        // use the provided presence source\n        if (usingIntegrationSource) {\n            query.integrationPresenceSource = options.adapterOptions.integrationPresenceSource;\n            query.expand = `${query.expand},integrationPresence`;\n        }\n\n        return this.ajaxService.ajaxGet(url, { data: query });\n    },\n\n    // Need to overwrite so that we can provide the version on all updates\n    // and make sure data isnt key'd by type\n    updateRecord(store, type, snapshot) {\n        let data = {};\n        store.serializerFor(type.modelName).serializeIntoHash(data, type, snapshot);\n        if (data[type.modelName]) {\n            data = data[type.modelName];\n        }\n        set(data, 'version', snapshot.attr('version'));\n        return this.ajax(this.urlForUpdateRecord(snapshot.id, type.modelName), 'PUT', { data: data });\n    },\n\n    // allows looking up by jid or by guid, but not both\n    findMany(store, type, ids, snapshotsOrOptions) {\n        const url = this.buildURL(type.modelName, ids, snapshotsOrOptions, 'findMany');\n\n        const guids = ids.filter(id => id.indexOf('@') === -1);\n        const jids = ids.filter(id => id.indexOf('@') > -1);\n\n        if (jids.length > 0 && guids.length > 0) {\n            return reject(new Error('Mixed jid and guid person lookup'));\n        }\n        if (jids.length > 0) {\n            return this._findMany(url, jids, 'jids', snapshotsOrOptions);\n        }\n        if (guids.length > 0) {\n            return this._findMany(url, guids, 'guids', snapshotsOrOptions);\n        }\n\n        return reject(new Error('findMany person without ids'));\n    },\n\n    findFavorites() {\n        const adapter = this.store.adapterFor('application');\n        return adapter.findFavorites(...arguments);\n    },\n\n    findSuperiors(store, id, params) {\n        const url = `${this.baseUrl(id)}/superiors`;\n        return this.ajax(url, 'GET', {\n            data: params\n        }).then(superiors => {\n            if (!superiors || !superiors.length) {\n                return [];\n            }\n            return this.findMany(store, 'person', superiors.mapBy('id'));\n        });\n    },\n\n    findDirectReports(store, id, params) {\n        const url = `${this.baseUrl(id)}/directreports`;\n        return this.ajax(url, 'GET', {\n            data: params\n        }).then(directReports => {\n            if (!directReports || !directReports.length) {\n                return [];\n            }\n            return this.findMany(store, 'person', directReports.mapBy('id'));\n        });\n    },\n\n    _findMany(url, ids, type, options) {\n        let key = 'id';\n        if (type === 'jids') {\n            key = 'jid';\n        }\n        let baseRequestData = {\n            fl: '*',\n            expand: BASE_PERSON.expand\n        };\n        let batchAmount = 25;\n        // use the provided presence source\n        let usingIntegrationSource =\n            options && options.adapterOptions && options.adapterOptions.integrationPresenceSource;\n        // use the provided presence source\n        if (usingIntegrationSource) {\n            baseRequestData.integrationPresenceSource = options.adapterOptions.integrationPresenceSource;\n            baseRequestData.expand = `${baseRequestData.expand},integrationPresence`;\n        }\n        const promises = batchEntityIds(ids, batchAmount).map(ids => {\n            const requestData = Object.assign({}, baseRequestData, {\n                [key]: ids.join(',')\n            });\n            // TODO: keep for future implementation\n            // if (this.get('session.features.enableUIAjaxRetryHeader')) {\n            //     let promise = this.get('ajaxService').raw(url, {\n            //         method: 'GET',\n            //         contentType: 'application/json',\n            //         data: requestData,\n            //         dataType: 'json',\n            //         retry: true\n            //     });\n            //     return promise.then(({ response }) => resolve(response)).catch(({ response }) => reject(response));\n            // } else {}\n            return this.ajax(url, 'GET', {\n                data: requestData\n            });\n        });\n        return all(promises).then(res => {\n            let data = {\n                entities: res.map(d => d.entities).flat()\n            };\n            if (usingIntegrationSource) {\n                data.meta = {\n                    integrationSource:\n                        options && options.adapterOptions && options.adapterOptions.integrationPresenceSource,\n                    usingIntegrationSource: true\n                };\n            }\n            return data;\n        });\n    },\n\n    _loadActivities(id) {\n        const url = `${this.host}/${this.namespace}/users/${id}`;\n        return this.ajax(url, 'GET', {\n            data: {\n                expand: BASE_PERSON.expand\n            }\n        });\n    },\n\n    handleResponse(status, headers, payload, requestData) {\n        if (status < 400) {\n            return this._super(...arguments);\n        }\n\n        payload.errors = [\n            {\n                status,\n                title: payload.message,\n                details: payload\n            }\n        ];\n\n        return this._super(status, headers, payload, requestData);\n    }\n});\n","import { inject as service } from '@ember/service';\nimport { reads } from '@ember/object/computed';\nimport PurecloudAdapter from './purecloud';\n\nexport default PurecloudAdapter.extend({\n    session: service(),\n    permissions: service(),\n    application: service(),\n    host: reads('application.purecloudV2BaseUri'),\n    namespace: 'api/v2',\n\n    buildQuery(snapshot) {\n        let query = {\n            state: 'deleted'\n        };\n\n        if (snapshot.adapterOptions && snapshot.adapterOptions.expand) {\n            query.expand = snapshot.adapterOptions.expand;\n        }\n\n        return query;\n    },\n\n    urlForQuery() {\n        if (this.get('permissions.canTargetUserSearchOutsideOfDivision')) {\n            return `${this.host}/${this.namespace}/users/search/conversation/target`;\n        } else {\n            return `${this.host}/${this.namespace}/users/search`;\n        }\n    },\n\n    findBelongsTo(store, snapshot, link, relationship) {\n        // We only support person belongsTo relationship for profiles\n        const adapter = this.store.adapterFor(relationship.type);\n        return adapter.findRecord(store, store.modelFor('person'), snapshot.id, snapshot);\n    },\n\n    buildURL(modelName, id, modelClass, requestType, snapshotOrQuery) {\n        if (requestType === 'query') {\n            return this.urlForQuery(id, 'public-api-user', snapshotOrQuery);\n        }\n        const host = this.host ? this.host : '';\n        return `${host}/${this.namespace}/${this.pathForType('users')}/${id}`;\n    },\n\n    /**\n     * Overridden to support our custom seach API\n     * This is copied directly from the ember-data codebase:\n     * https://github.com/emberjs/data/blob/v2.16.0/addon/adapters/rest.js#L541\n     */\n    query(store, type, query) {\n        let url = this.buildURL(type.modelName, null, null, 'query', query);\n        return this.ajax(url, 'POST', { data: query });\n    }\n});\n","import { get } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport DS from 'ember-data';\nimport { buildAuthHeaders } from '../utils/adapter-auth-headers';\n\nexport default DS.RESTAdapter.extend({\n    application: service(),\n    session: service(),\n\n    defaultSerializer: 'purecloud',\n\n    host: '/platform',\n    namespace: 'api',\n\n    get headers() {\n        const headers = {\n            'Content-Type': 'application/json'\n        };\n\n        return buildAuthHeaders(this.session, this.application, headers);\n    },\n\n    shouldReloadAll() {\n        return true;\n    },\n\n    shouldBackgroundReloadRecord() {\n        return false;\n    },\n\n    modelFor(type) {\n        return this.pathForType(type);\n    },\n\n    normalizeErrorResponse(status, headers, payload) {\n        if (payload && typeof payload === 'object') {\n            return [\n                {\n                    status: `${status}`,\n                    title: payload.code,\n                    detail: {\n                        message: payload.message,\n                        contextId: payload.contextId\n                    }\n                }\n            ];\n        }\n\n        return [{ status, payload }];\n    },\n\n    ajaxOptions(url, type, hash) {\n        // https://github.com/emberjs/data/issues/1398\n        // https://github.com/emberjs/data/blob/v2.7.0/addon/adapters/rest.js#L1065\n        hash = this._super(url, type, hash);\n\n        if (type === 'DELETE') {\n            hash.dataType = 'text';\n        }\n\n        // Ember 3.28: Ensure headers are included (native getters may not work with get())\n        const headers = this.headers;\n        if (headers) {\n            hash.headers = Object.assign({}, headers, hash.headers || {});\n        }\n\n        return hash;\n    },\n\n    // TODO: replace this private function with request type hooks\n    buildURL(modelName, id, snapshot, requestType) {\n        if (requestType === 'query' && modelName === 'voicemail-message') {\n            return this._super(...arguments);\n        }\n\n        const objId = id ? `/${id}` : '';\n        const path = `${this.namespace}/${this.pathForType(modelName)}${objId}`;\n        const url = this.application.pcV2Uri(path);\n        return url;\n    },\n\n    updateRecord(store, type, record) {\n        var data = this.serialize(record, {\n            includeId: true\n        });\n        var id = get(record, 'id');\n\n        if (type.modelName === 'voicemail-message') {\n            return this.ajax(this.buildURL(type.modelName, id), 'PATCH', { data: data });\n        }\n        return this.ajax(this.buildURL(type.modelName, id), 'PUT', { data: data });\n    },\n\n    deleteRecord(store, type, record) {\n        const id = get(record, 'id');\n        const url = this.buildURL(type.modelName, id);\n        return this.ajax(url, 'DELETE', { dataType: 'text' });\n    }\n});\n","import { inject as service } from '@ember/service';\nimport { reads } from '@ember/object/computed';\nimport RSVP from 'rsvp';\nimport PurecloudAdapter from './purecloud';\n\nconst TARGET_QUEUE_SEARCH_PERMISSION = 'conversation:communication:target';\nconst DIVISION_PERMITTED_URL = 'api/v2/authorization/divisionspermitted/paged/me';\nconst DIVISION_LIMIT_URL = 'api/v2/authorization/divisions/limit';\n\nexport default PurecloudAdapter.extend({\n    application: service(),\n    session: service(),\n    permissions: service(),\n\n    host: reads('application.purecloudV2BaseUri'),\n    namespace: 'api/v2',\n\n    divisionLimit: null,\n\n    pathForType: function (type) {\n        switch (type) {\n            case 'divisionAgnostic':\n                return 'routing/queues/divisionviews';\n            case 'myQueues':\n                return 'routing/queues/me';\n            default:\n                return 'routing/queues';\n        }\n    },\n\n    async query(store, type, query) {\n        let fetchDivisions = false;\n        let path = this.buildURL(type);\n\n        // Do not mutate the incoming `query` object.\n        // Callers (e.g. target-dropdown pagination) may persist and reuse it.\n        const data = Object.assign({}, query);\n        data.name = data.name ? data.name.toLowerCase() : '';\n\n        if (data.divisionAgnostic) {\n            path = this.buildURL('divisionAgnostic');\n            delete data.divisionAgnostic;\n            if (this.get('permissions.canTargetQueueSearchOutsideOfDivision')) {\n                fetchDivisions = true;\n            }\n        } else if (!this.get('permissions.canTargetQueueSearchOutsideOfDivision')) {\n            // Handle case where permission is actually false\n            // When permission is false revert back to fetching across all divisions\n            path = this.buildURL('divisionAgnostic');\n            delete data.divisionAgnostic;\n        }\n\n        if (data.myQueuesOnly) {\n            path = `${this.buildURL('myQueues')}`;\n            fetchDivisions = false;\n        }\n\n        if (data.workitemDivisionId) {\n            data.divisionId = data.workitemDivisionId;\n            delete data.workitemDivisionId;\n        } else if (fetchDivisions) {\n            const response = await this.fetchDivisionsForTargetQueueSearch();\n            const results = response && response.entities ? response.entities : [];\n            const divisionIds = results.map(entity => entity.id);\n            if (divisionIds.length > 0) {\n                data.divisionId = divisionIds.join(',');\n            }\n        }\n\n        return this.ajax(path, 'GET', { data });\n    },\n\n    getDivisionLimits() {\n        const url = this.application.pcV2Uri(DIVISION_LIMIT_URL);\n        return RSVP.resolve(this.divisionLimit || this.ajax(url, 'GET'));\n    },\n\n    async fetchDivisionsForTargetQueueSearch() {\n        const divisionLimit = await this.getDivisionLimits();\n        const pageSize = divisionLimit || 25;\n        this.set('divisionLimit', pageSize);\n        const url = this.application.pcV2Uri(DIVISION_PERMITTED_URL);\n        return this.ajax(url, 'GET', {\n            data: {\n                pageSize,\n                permission: TARGET_QUEUE_SEARCH_PERMISSION\n            }\n        });\n    },\n\n    findRecord(store, type, id, snapshot) {\n        if (snapshot.adapterOptions && snapshot.adapterOptions.divisionAware) {\n            const path = this.buildURL('divisionAgnostic');\n            return this.ajax(path, 'GET', { data: { id } });\n        }\n        return this._super(...arguments);\n    }\n});\n","import PurecloudAdapter from './purecloud';\n\nexport default PurecloudAdapter.extend({\n    pathForType: function () {\n        return 'v2/userrecordings';\n    },\n\n    findAll: function (store, type) {\n        return this.ajax(this.buildURL(type.modelName) + '?expand=conversation', 'GET');\n    }\n});\n","import { inject as service } from '@ember/service';\nimport { A } from '@ember/array';\nimport { Promise } from 'rsvp';\nimport { run } from '@ember/runloop';\nimport { assign } from '@ember/polyfills';\nimport moment from 'moment';\nimport DS from 'ember-data';\nimport PurecloudAdapter from './purecloud';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nconst retentionAttributes = ['archiveDate', 'deleteDate'];\n\nexport default PurecloudAdapter.extend(LoggerMixin, {\n    ajax: service(),\n    intl: service(),\n    pigeon: service(),\n    namespace: 'api/v2',\n    defaultSerializer: 'recording',\n\n    buildUrl(uri) {\n        const host = this.host;\n        const namespace = this.namespace;\n        const prefix = `${host}/${namespace}`;\n        return uri ? `${prefix}/${uri}` : prefix;\n    },\n\n    urlForQuery(params) {\n        const conversationId = params.conversationId;\n        return this.buildUrl(`conversations/${conversationId}/recordings`);\n    },\n\n    urlForQueryRecord(params) {\n        const id = params.id;\n        const conversationId = params.conversationId;\n        return this.buildUrl(`conversations/${conversationId}/recordings/${id}`);\n    },\n\n    topicForQuery(params) {\n        const conversationId = params.conversationId;\n        return Promise.resolve(`conversations.${conversationId}.recordings`);\n    },\n\n    topicForQueryRecord(params) {\n        const id = params.id;\n        const conversationId = params.conversationId;\n        return `conversations.${conversationId}.recordings.${id}`;\n    },\n\n    query(store, type, params) {\n        const conversationId = params.conversationId;\n        const query = assign({}, params);\n        delete query.conversationId;\n        delete query.id;\n        delete query.userId;\n        const pigeon = this.pigeon;\n        const url = this.urlForQuery(params);\n        if (conversationId) {\n            return this.topicForQuery(params).then(topic => {\n                pigeon.registerPriorityTopic(topic);\n                const isStreamingConnected = pigeon.isStreamingConnected();\n                const awaitTopicEvent = this._awaitTopicEvent(topic, isStreamingConnected);\n                return this._httpGetWithRetry(url, query, awaitTopicEvent).finally(() =>\n                    pigeon.unRegisterPriorityTopic(topic)\n                );\n            });\n        } else {\n            this.logger.debug('Must specify conversationId when calling adapters/recording#query', {\n                params\n            });\n        }\n    },\n\n    queryRecord(store, type, params) {\n        const id = params.id;\n        const conversationId = params.conversationId;\n        const query = assign({}, params);\n        delete query.conversationId;\n        if (id && conversationId) {\n            const pigeon = this.pigeon;\n            const url = this.urlForQueryRecord(params);\n            const topic = this.topicForQueryRecord(params);\n            pigeon.registerPriorityTopic(topic);\n            const isStreamingConnected = pigeon.isStreamingConnected();\n            const awaitTopicEvent = this._awaitTopicEvent(topic, isStreamingConnected);\n\n            return this._httpGetWithRetry(url, query, awaitTopicEvent).finally(() =>\n                pigeon.unRegisterPriorityTopic(topic)\n            );\n        } else {\n            this.logger.debug(\n                'Must specify recording id and conversationId when calling adapters/recording#queryRecord',\n                {\n                    params\n                }\n            );\n        }\n    },\n\n    updateRecord(store, type, snapshot) {\n        const recordingId = snapshot.id;\n        const recordingAttrs = snapshot.serialize();\n        const conversationId = recordingAttrs.conversationId;\n\n        if (!this._didChangeRetentionAttributes(snapshot)) {\n            // resolve w/ undefined so the store thinks it was successful\n            // https://www.emberjs.com/api/ember-data/2.14/classes/DS.Adapter/methods/updateRecord?anchor=updateRecord\n            return Promise.resolve();\n        }\n\n        // PUT /api/v2/conversations/{conversationId}/recordings/{recordingId}\n        // will remove existing archive/delete values if not provided\n        // we must provide the existing values for archiveDate and deleteDate\n        // if they are present\n        const data = retentionAttributes.reduce(\n            (acc, attr) => {\n                if (recordingAttrs[attr]) {\n                    acc[attr] = recordingAttrs[attr];\n                }\n                return acc;\n            },\n            { recordingId, conversationId }\n        );\n\n        const url = this.buildUrl(`conversations/${conversationId}/recordings/${recordingId}`);\n        const accepts = { json: 'application/json' };\n        const ajax = this.ajax;\n\n        return ajax.put(url, { data, accepts });\n    },\n\n    _httpGetWithRetry(url, data, awaitTopicEvent) {\n        const args = arguments;\n        const accepts = { json: 'application/json', plain: 'text/plain' };\n        const ajax = this.ajax;\n\n        return ajax.raw(url, { data, accepts, dataType: 'text' }).then(res => {\n            const jqXHR = res.jqXHR;\n            const response = res.response;\n            const status = jqXHR.status;\n\n            switch (status) {\n                case 200:\n                    return JSON.parse(response);\n                case 202:\n                    return this._handleHttpAccepted(awaitTopicEvent).then(() => this._httpGetWithRetry(...args));\n            }\n        });\n    },\n\n    _handleHttpAccepted(awaitTopicEvent) {\n        return new Promise((resolve, reject) => {\n            const RECORDING_UPDATE_TIMEOUT = 5 * 60 * 1000; // 5 minutes\n            const pid = run.later(() => {\n                // for long-running recording transcode jobs\n                const intl = this.intl;\n                const logger = this.logger;\n                const err = new DS.TimeoutError([\n                    {\n                        code: 'recordings.errors.transcode.timeout',\n                        title: intl.t('recordings.errors.transcode.timeout.title'),\n                        description: intl.t('recordings.errors.transcode.timeout.detail')\n                    }\n                ]);\n                logger.error('RECORDING: error - timeout handling recording', {\n                    error: err\n                });\n                reject(err);\n            }, RECORDING_UPDATE_TIMEOUT);\n\n            awaitTopicEvent.then(res => {\n                run.cancel(pid);\n                resolve(res);\n            });\n        });\n    },\n\n    _awaitTopicEvent(topic, isStreamingConnected) {\n        const pigeon = this.pigeon;\n        const topicParts = topic.split('.');\n        const eventName = topicParts[topicParts.length - 1];\n        if (isStreamingConnected) {\n            return new Promise(resolve => {\n                pigeon.one(eventName, this, response => {\n                    resolve(response);\n                });\n            });\n        }\n        return Promise.resolve();\n    },\n\n    _didChangeRetentionAttributes(snapshot) {\n        const attributeChanges = snapshot.changedAttributes();\n        return (\n            A(Object.keys(attributeChanges))\n                .filter(key => A(retentionAttributes).includes(key))\n                .filter(key => {\n                    const oldVal = attributeChanges[key][0];\n                    const newVal = attributeChanges[key][1];\n                    // if both are truthy values, check if they are on the same day\n                    // when at least one is not truthy, compare their boolean values\n                    const isSameDay = !moment(oldVal).isSame(moment(newVal), 'day');\n                    const boolEqual = !!oldVal === !!newVal;\n                    return !!oldVal && !!newVal ? isSameDay : !boolEqual;\n                }).length > 0\n        );\n    }\n});\n","import { inject as service } from '@ember/service';\nimport { reads } from '@ember/object/computed';\nimport DS from 'ember-data';\nimport { buildAuthHeaders, mergeAuthHeaders } from '../utils/adapter-auth-headers';\n\nconst { RESTAdapter } = DS;\n\nexport default RESTAdapter.extend({\n    session: service(),\n    application: service(),\n\n    host: reads('application.purecloudV2BaseUri'),\n    namespace: 'api/v2',\n\n    get headers() {\n        return buildAuthHeaders(this.session, this.application);\n    },\n\n    // Ember 3.28: a bare `get headers()` getter is not reliably read by Ember Data's internal\n    // request machinery, so headers must also be force-merged here (mirrors application.js/purecloud.js).\n    ajaxOptions(url, type, hash) {\n        hash = this._super(url, type, hash);\n        return mergeAuthHeaders(hash, this.headers);\n    },\n\n    urlForFindRecord(id) {\n        return `${this.host}/${this.namespace}/routing/skillgroups/${id}`;\n    }\n});\n","import PurecloudAdapter from './purecloud';\n\nexport default PurecloudAdapter.extend({\n    pathForType: function () {\n        return 'v2/stations';\n    }\n});\n","import ApplicationAdapter from './application';\n\nvar UserAdapter = ApplicationAdapter.extend({\n    findQuery: function (store, type, query) {\n        return this.ajax(this.buildURL(type), 'GET', { data: query });\n    }\n});\n\nexport default UserAdapter;\n","import PurecloudAdapter from './purecloud';\n\nexport default PurecloudAdapter.extend({\n    pathForType() {\n        return 'v2/voicemail/messages';\n    },\n\n    urlForQuery() {\n        return `${this.host}/${this.namespace}/v2/voicemail/search`;\n    },\n\n    updateRecord() {\n        return this._super(...arguments);\n    },\n\n    // Override private function (copying default impl)\n    // so we can 'POST' to the API\n    // TODO: Remove ds-improved-ajax lands\n    query(store, type, query) {\n        const url = this.buildURL(type.modelName, null, null, 'query', query);\n\n        if (this.sortQueryParams) {\n            query = this.sortQueryParams(query);\n        }\n\n        return this.ajax(url, 'POST', { data: query });\n    },\n\n    // Use this in place of:\n    //   methodForRequest\n    //   dataForRequest\n    // TODO: Remove ds-improved-ajax lands\n    sortQueryParams(query) {\n        return {\n            pageSize: query.pageSize || 15,\n            pageNumber: query.pageNumber || 1,\n            sortOrder: 'DESC',\n            sortBy: 'createdTime',\n            query: [\n                {\n                    type: 'EXACT',\n                    fields: ['owner'],\n                    value: 'ALL'\n                },\n                {\n                    type: 'EXACT',\n                    fields: ['deleted'],\n                    value: 'false'\n                }\n            ]\n        };\n    }\n});\n","import { reads, readOnly } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport EmberObject, { computed } from '@ember/object';\nimport RSVP from 'rsvp';\nimport { perm } from '../utils/boolean-expressions';\nimport { GC_LANG_TAG_URL_REPLACEMENT_TOKEN } from '../models/app';\n\nconst AgentAssistProvider = EmberObject.extend({\n    ajax: service(),\n    application: service(),\n    intl: service(),\n    session: service(),\n    id: 'builtInAgentAssistInterapptionsProvider',\n    type: 'programmatic',\n    trustedProvider: true,\n    assetPrefix: reads('application.urlprefix'),\n    products: readOnly('session.products'),\n    isAgentAssistProductEnabled: computed('products', function () {\n        return this.products.some(product => product.id === 'agentAssist');\n    }),\n    async getAppConfigs(appContext /*, updateAppConfigsCallback*/) {\n        // A missing context can't be type-guaranteed, so render nothing.\n        if (!appContext) return RSVP.resolve([]);\n        const { type: appContextType, payload } = appContext;\n        if (appContextType !== 'conversation') return RSVP.resolve([]);\n\n        let apps = [];\n        // TODO: Use the interaction details to decide what apps, if any are applicable\n        // TODO: you can use updateAppConfigsCallbackto change apps based on interaction state, if desired\n\n        // Fail early\n        if (\n            !this._isSupportedMediaType(payload) ||\n            !(await this._checkIfAgentAssistIsEnabled(payload)) ||\n            !this.isAgentAssistProductEnabled\n        ) {\n            return RSVP.resolve([]);\n        }\n        apps.push({\n            id: 'agent-assist',\n            name: 'Agent Assist CCAI',\n            sandbox: ['allow-same-origin', 'allow-scripts', 'allow-popups', 'allow-forms'],\n            path: `agent-assist/#/?host=pc&locale=${GC_LANG_TAG_URL_REPLACEMENT_TOKEN}&iid=${payload.id}`,\n            // url: 'http://localhost:4000/agent-assist/',\n            monochromicIcon: {\n                vector: `${this.assetPrefix || '/'}assets/images/svg/voicebot.svg`\n            }\n        });\n\n        return RSVP.resolve(apps);\n    },\n\n    // Check for interaction type -> if call, return true\n    _isSupportedMediaType(interaction) {\n        let result = false;\n        let interactionType = interaction.get('type');\n\n        if (interactionType === 'call') {\n            result = true;\n        }\n        return result;\n    },\n\n    // Check if Agent Assist is enabled for this queue\n    async _checkIfAgentAssistIsEnabled(interaction) {\n        const queueId = interaction.get('participantForCurrentUser.queueId');\n        return await this._checkIfQueueHasAssistant(queueId, interaction);\n    },\n\n    // Call queues API to check if this queue has an assistant assigned to it\n    _checkIfQueueHasAssistant(queueId, interaction) {\n        const url = this.application.pcV2Uri(`api/v2/routing/queues/${queueId}/assistant`);\n        return new Promise(resolve => {\n            this.ajax\n                .request(url)\n                .then(result => {\n                    // For call interactions, verify the assistant vendor\n                    if (interaction.get('type') === 'call') {\n                        const assistantUrl = this.application.pcV2Uri(`api/v2/assistants/${result.assistant.id}`);\n                        return this.ajax\n                            .request(assistantUrl)\n                            .then(assistant => {\n                                if (\n                                    assistant.knowledgeSuggestionConfig &&\n                                    assistant.knowledgeSuggestionConfig.vendorName === 'GoogleDialogflow' &&\n                                    this._checkAssistantState(result.assistant.state)\n                                ) {\n                                    return resolve(true);\n                                }\n                                return resolve(false);\n                            })\n                            .catch(() => {\n                                return resolve(false);\n                            });\n                    } else {\n                        if (this._checkAssistantState(result.assistant.state)) {\n                            return resolve(true);\n                        }\n                        return resolve(false);\n                    }\n                })\n                .catch(() => {\n                    return resolve(false);\n                });\n        });\n    },\n\n    // Check Assistant State field for this assistant\n    _checkAssistantState(state) {\n        // Check if the new state field exists (i.e. the FT is turned on for this org)\n        if (state) {\n            return state === 'Active';\n        }\n        // State field does not exist - this means FT is not turned on so we can enable AA\n        else {\n            return true;\n        }\n    }\n});\n\nexport const boolExpr = perm('assistants:queue:view');\n\nexport default AgentAssistProvider;\n","import EmberObject, { computed } from '@ember/object';\nimport { Registry, inject } from '@ember/service';\nimport { and, perm } from 'web-directory/utils/boolean-expressions';\nimport { AppDef } from '@genesys/apps-v2-host';\nimport { resolve } from 'rsvp';\nimport { AppProvider } from 'web-directory/components/acd-interactions-panel/interapptions-manager-v2/component';\nimport ComputedProperty from '@ember/object/computed';\n\nexport type Inject<T extends keyof Registry> = ComputedProperty<Registry[T]>;\nexport type CannedResponseGadgetObjectDef = AppProvider & {\n    application: Inject<'application'>;\n    intl: Inject<'intl'>;\n    gadgetTargetOrigin: ComputedProperty<string, string>;\n};\n\nexport default EmberObject.extend<unknown, EmberObject, CannedResponseGadgetObjectDef, unknown>({\n    // Injections\n    application: inject('application'),\n    intl: inject('intl'),\n    // Attributes\n    id: 'cannedResponsesProvider',\n    type: 'programmatic',\n    group: 'contextual',\n    trustedProvider: true,\n    monitorInteractionUpdates: true,\n    gadgetTargetOrigin: computed<string>(\n        'application.runtime',\n        function (this: EmberObject & CannedResponseGadgetObjectDef) {\n            const application = this.get('application');\n            if (application.runtime.local) {\n                return `https://apps.${application.runtime.publicDomainName}`;\n            }\n            return window.location.origin;\n        }\n    ),\n    getAppConfigs(appContext) {\n        const appDefs: AppDef[] = [];\n\n        const urlParams = new URLSearchParams(window.location.search);\n        const cannedResponseGadgetVersion = urlParams.get('cannedResponseGadgetVersion');\n        const gadgetOrigin = this.get('gadgetTargetOrigin');\n        const local = cannedResponseGadgetVersion === 'local';\n        const url = cannedResponseGadgetVersion\n            ? local\n                ? `http://localhost:9092/responseManagement/#/agentPanel`\n                : `${gadgetOrigin}/responseManagement/${cannedResponseGadgetVersion}/#/agentPanel`\n            : `${gadgetOrigin}/responseManagement/#/agentPanel`;\n\n        if (appContext && appContext.type === 'conversation') {\n            // Moved here because if payload.get is not called on a conversation it will blow up. ie: called on a workItem\n            const myselfIsCoachOrMonitor =\n                appContext.payload.get('myselfIsMonitor') ||\n                appContext.payload.get('myselfIsCoach') ||\n                appContext.payload.get('myselfIsMonitorV2');\n            if (!myselfIsCoachOrMonitor) {\n                appDefs.push(buildCannedResponsesGadgetDef(url, this.get('intl').t('purecloud.responses.responses')));\n            }\n        }\n        return resolve(appDefs);\n    }\n});\n\nexport const boolExpr = and(perm('responses:library:view'), perm('responses:response:view'));\n\nconst buildCannedResponsesGadgetDef = (url: string, displayName?: string): AppDef => {\n    return {\n        id: 'responses',\n        displayName,\n        type: 'iframe',\n        monochromicIcon: {\n            type: 'sparkV3SvgSprite',\n            classNames: ['quote-left']\n        },\n        trustedDataPassing: true,\n        startBehavior: 'lazy',\n        lifecycleConfig: {\n            bootstrap: true,\n            // Added a longer bootstrap timeout to handle reduced network conditions\n            bootstrapTimeoutMillis: 15000,\n            bootstrapReadyTimeoutMillis: 15000,\n            loadTimeoutMillis: 15000\n        },\n        allow: ['clipboard-write'],\n        sandbox: [\n            'allow-same-origin',\n            'allow-scripts',\n            'allow-modals',\n            'allow-popups',\n            'allow-forms',\n            'allow-downloads'\n        ],\n        src: new URL(url)\n    };\n};\n","import EmberObject, { computed } from '@ember/object';\nimport { inject } from '@ember/service';\nimport { AppDef } from '@genesys/apps-v2-host';\nimport { resolve } from 'rsvp';\nimport { AppContext } from 'web-directory/utils/apps';\nimport { validatePortNumber } from 'web-directory/utils/app-provider';\nimport { and, ft } from 'web-directory/utils/boolean-expressions';\n\nexport default EmberObject.extend({\n    application: inject('application'),\n    intl: inject('intl'),\n    session: inject('session'),\n    permissions: inject('permissions'),\n    id: 'caseGadgetProvider',\n    type: 'programmatic',\n    group: 'contextual',\n    trustedProvider: true,\n    monitorInteractionUpdates: true,\n    gadgetTargetOrigin: computed<string>('application.runtime', function () {\n        const runtimeEnv = this.get('application.runtime');\n        if (runtimeEnv.local) {\n            return `https://apps.${runtimeEnv.publicDomainName}`;\n        }\n        return window.location.origin;\n    }),\n    getAppConfigs(appContext?: AppContext) {\n        const appDefs: AppDef[] = [];\n        // Opt out of any context we don't explicitly support. Ember doesn't enforce the\n        // appContext contract, so a missing context means we can't guarantee the type and\n        // must not show the app — only the conversation/workitem contexts opt in here.\n        if (!appContext || (appContext.type !== 'conversation' && appContext.type !== 'workitem')) {\n            return resolve(appDefs);\n        }\n        if (this.validatePermissions(requiredPermissions)) {\n            appDefs.push(\n                buildCaseGadgetDef({\n                    gadgetOrigin: this.get('gadgetTargetOrigin'),\n                    displayName: this.get('intl').t('purecloud.acdInteraction.case')\n                })\n            );\n        }\n        return resolve(appDefs);\n    },\n\n    validatePermissions(permissions: string[]): boolean {\n        const permissionsService = this.get('permissions');\n        return permissions.some(permission => permissionsService.validateDonutPermission(permission));\n    }\n});\n\nexport const boolExpr = and(ft('PURE-6320_case_agent_ui'), ft('PURE-6320_case_management'));\n\nexport const requiredPermissions = ['caseManagement:caseReference:view', 'caseManagement:caseExternalContact:view'];\n\n// Allow use of specific versions of the case gadget via query parameters of Web Directory:\n//  - If caseGadgetsVersion is set to local, use localhost version of the gadget (which runs on port 4800 by default, but could be overridden using workitemGadgetPort)\n//  - If caseGadgetsVersion is set to something else than local, then it's considered as a time machine version.\n//    For example, a timemachine version is available for branch WORKITEMS-1234-sample-branch-name\n//    So, if Web Directory URL is used with ?caseGadgetsVersion=WORKITEMS-1234-sample-branch-name\n//    this time machine version is displayed to the user\nconst getGadgetUrl = (gadgetOrigin: string) => {\n    const urlParams = new URLSearchParams(window.location.search);\n    const version = urlParams?.get('caseGadgetsVersion') || '';\n    if (!version) {\n        return `${gadgetOrigin}/task-management-case-gadgets/#/gadgets/case-panel`;\n    }\n    if (version === 'local') {\n        return `https://localhost:${validatePortNumber(\n            urlParams.get('workitemGadgetPort') || '',\n            4800\n        )}/#/gadgets/case-panel`;\n    }\n    if (version.match(/^https?:\\/\\//)) {\n        return version;\n    }\n    return `${gadgetOrigin}/task-management-case-gadgets/${version}/#/gadgets/case-panel`;\n};\n\nconst buildCaseGadgetDef = ({ gadgetOrigin, displayName }: { gadgetOrigin: string; displayName: string }): AppDef => {\n    return {\n        id: 'caseGadget',\n        displayName,\n        monochromicIcon: {\n            type: 'sparkV3SvgSprite',\n            classNames: ['fa/briefcase-regular']\n        },\n        type: 'iframe',\n        startBehavior: 'lazy',\n        src: new URL(getGadgetUrl(gadgetOrigin)),\n        sandbox: ['allow-scripts', 'allow-same-origin', 'allow-popups', 'allow-forms', 'allow-downloads'],\n        trustedDataPassing: true,\n        lifecycleConfig: {\n            bootstrap: true,\n            bootstrapTimeoutMillis: 15000,\n            bootstrapReadyTimeoutMillis: 15000,\n            loadTimeoutMillis: 15000,\n            focus: true,\n            blur: true,\n            stop: true\n        }\n    };\n};\n","import EmberObject, { computed } from '@ember/object';\nimport { inject } from '@ember/service';\nimport { IframeAppDef } from '@genesys/apps-v2-host';\nimport { AppContext } from 'web-directory/utils/apps';\nimport { perm } from 'web-directory/utils/boolean-expressions';\nimport { typeOf } from '@ember/utils';\nimport { getCommunicationType } from 'web-directory/utils/acd';\nimport { validatePortNumber } from 'web-directory/utils/app-provider';\n\nconst CoPilotProvider = EmberObject.extend({\n    application: inject('application'),\n    intl: inject('intl'),\n    session: inject('session'),\n    agentAssistChecks: inject('agent-assist-checks' as any),\n    id: 'coPilotProvider',\n    type: 'programmatic',\n    group: 'contextual',\n    trustedProvider: true,\n    monitorInteractionUpdates: true,\n    assetPrefix: computed.reads('application.urlprefix'),\n    products: computed.readOnly('session.products'),\n    gadgetTargetOrigin: computed<string>('application.runtime', function () {\n        const runtimeEnv = this.get('application.runtime');\n        if (runtimeEnv.local) {\n            return `https://apps.${runtimeEnv.publicDomainName}`;\n        }\n        return window.location.origin;\n    }),\n\n    isCoPilotProductEnabled: computed('products', function () {\n        return this.get('products').some((product: { id: string }) => product.id === 'agentCopilot');\n    }),\n\n    async getAppConfigs(appContext: AppContext) {\n        // A missing context can't be type-guaranteed, so render nothing.\n        if (!appContext || appContext.type !== 'conversation') return [];\n\n        const { payload } = appContext;\n        const appDefs: IframeAppDef[] = [];\n        if (\n            !this.get('agentAssistChecks')._isSupportedMediaType(payload) ||\n            !(await this.get('agentAssistChecks')._checkIfSmartAdvisorIsEnabled(payload)) ||\n            !this.get('isCoPilotProductEnabled')\n        ) {\n            return [];\n        }\n        if (appContext && appContext.type === 'conversation' && typeOf(appContext.payload) === 'instance') {\n            const locale = this.get('intl').get('isoLocale') || 'en-us';\n            appDefs.push(\n                buildCoPilotGadgetDef(\n                    this.get('gadgetTargetOrigin'),\n                    this.get('intl').t('coPilot.title'),\n                    appContext,\n                    locale\n                )\n            );\n        }\n        return appDefs;\n    }\n});\n\nconst getCopilotGadgetUrl = (gadgetOrigin: string) => {\n    const urlParams = new URLSearchParams(window.location.search);\n    const version = urlParams?.get('copilotGadgetVersion') || '';\n    if (!version) {\n        return `${gadgetOrigin}/smart-advisor-ui`;\n    }\n    if (version === 'local') {\n        return `http://localhost:${validatePortNumber(urlParams.get('copilotGadgetPort') || '', 4200)}/smart-advisor`;\n    }\n    if (version.match(/^https?:\\/\\//)) {\n        return version;\n    }\n    return `${gadgetOrigin}/smart-advisor-ui/${version}`;\n};\n\nconst buildCoPilotGadgetDef = (\n    gadgetOrigin: string,\n    displayName: string,\n    appContext: Extract<AppContext, { type: 'conversation' }>,\n    locale: string\n): IframeAppDef => {\n    return {\n        id: 'co-pilot',\n        displayName,\n        type: 'iframe',\n        sandbox: [\n            'allow-same-origin',\n            'allow-scripts',\n            'allow-modals',\n            'allow-popups',\n            'allow-forms',\n            'allow-downloads',\n            'allow-presentation'\n        ],\n        src: new URL(\n            `${getCopilotGadgetUrl(gadgetOrigin)}/#/smart-advisor/?host=cx&appsV2=true&iid=${\n                appContext.id\n            }&interactionType=${getCommunicationType(appContext.payload)}&locale=${locale}`\n        ),\n        monochromicIcon: {\n            type: 'sparkV3SvgSprite',\n            classNames: ['lightbulb']\n        },\n        startBehavior: 'lazy',\n        trustedDataPassing: true,\n        lifecycleConfig: {\n            bootstrap: true,\n            focus: true,\n            blur: true,\n            stop: true\n        }\n    };\n};\n\nexport const boolExpr = perm('assistants:copilot:view');\nexport default CoPilotProvider;\n","// Imports\nimport EmberObject, { computed } from '@ember/object';\nimport { inject } from '@ember/service';\nimport { typeOf } from '@ember/utils';\nimport { IframeAppDef } from '@genesys/apps-v2-host';\nimport { Communication } from '@genesys/genesys-cloud-conversation-utils';\nimport Ember from 'ember';\nimport appUtils, { AppContext } from 'web-directory/utils/apps';\nimport { or, perm } from 'web-directory/utils/boolean-expressions';\nimport { isTesting } from 'web-directory/utils/testing';\n\nconst PROVIDER_LOG_NAMESPACE = 'Cobrowse Provider';\n\nexport default EmberObject.extend({\n    id: 'cobrowseProvider',\n    type: 'programmatic',\n    group: 'contextual',\n    trustedProvider: true,\n    monitorInteractionUpdates: true,\n    intl: inject('intl'),\n    stashLogger: inject('stash-logger'),\n    application: inject('application'),\n    ajax: inject('ajax'),\n    interactionService: inject('interaction'),\n    session: inject('session'),\n    useMultipanel: computed.reads('session.useMultipanel'),\n    gadgetTargetOrigin: computed<string>('application.runtime', function () {\n        const runtimeEnv = this.get('application.runtime');\n        if (runtimeEnv.local) {\n            return `https://apps.${runtimeEnv.publicDomainName}`;\n        }\n        return window.location.origin;\n    }),\n\n    init() {\n        this._super();\n        Ember.run(() => {\n            this.get('interactionService').on('beginCobrowseV2', this, Ember.run.bind(this, '_createCobrowseSession'));\n        });\n    },\n\n    getAvailableAppSizes: () => ['medium', 'large', 'xlarge'],\n    getCanUseFocusMode: () => true,\n\n    async getAppConfigs(interaction: AppContext) {\n        if (\n            interaction &&\n            interaction.type === 'conversation' &&\n            typeOf(interaction.payload) === 'instance' &&\n            interaction.payload.get('isConnected') &&\n            this.get('useMultipanel')\n        ) {\n            const activeSession = this._getActiveCobrowseSession(interaction);\n\n            if (activeSession) {\n                interaction.payload.set('cobrowseSessionCreationInProgress', false);\n                this._setCobrowseStatusActive(interaction);\n                return [\n                    buildCobrowseIframeApp(\n                        this.get('gadgetTargetOrigin'),\n                        this.get('intl').t('purecloud.acdInteraction.cobrowseNext.cobrowse')\n                    )\n                ];\n            }\n\n            if (!interaction.payload.get('cobrowseSessionCreationInProgress')) {\n                this._setCobrowseStatusInactive(interaction);\n            }\n\n            return [];\n        }\n\n        return [];\n    },\n\n    async _createCobrowseSession(interaction: any) {\n        if (!interaction || typeOf(interaction) !== 'instance' || interaction.get('workitem')) {\n            return;\n        }\n\n        const targetConversation: Extract<AppContext, { type: 'conversation' }> = {\n            type: 'conversation',\n            payload: interaction as any,\n            id: interaction.id\n        };\n\n        try {\n            targetConversation.payload.set('cobrowseSessionCreationInProgress', true);\n            this._setCobrowseStatusActive(targetConversation);\n            // Make API call to create a cobrowse session for the conversation.\n            const url = this.get('application').pcV2Uri(`api/v2/conversations/${interaction.id}/cobrowse`);\n            const response = await this.get('ajax').post(url);\n            if (!response.id) {\n                this._handleCobrowseError(targetConversation);\n            }\n        } catch (error) {\n            this._handleCobrowseError(targetConversation);\n        } finally {\n            // To re-enable the button back in case where POST request returns 200 but hawk fails to update\n            Ember.run.later(\n                () => {\n                    if (targetConversation.payload.get('cobrowseSessionCreationInProgress')) {\n                        this._handleCobrowseError(targetConversation);\n                    }\n                },\n                isTesting ? 100 : 5000\n            );\n        }\n    },\n\n    _handleCobrowseError(interaction: Extract<AppContext, { type: 'conversation' }>) {\n        this.get('stashLogger').error(\n            appUtils.buildInterapptionsLogMsg('Failed to create cobrowse session.', PROVIDER_LOG_NAMESPACE),\n            {\n                interaction,\n                remoteData: {\n                    interactionId: interaction.id,\n                    type: interaction.type\n                }\n            }\n        );\n        interaction.payload.set('cobrowseSessionCreationInProgress', false);\n        this._setCobrowseStatusInactive(interaction);\n    },\n\n    _getActiveCobrowseSession(interaction: Extract<AppContext, { type: 'conversation' }>): Communication | undefined {\n        const agent = interaction.payload.get('participantForCurrentUser');\n\n        if (!agent || !agent.cobrowsesessions) {\n            return;\n        }\n\n        const cobrowseSessions = agent.cobrowsesessions;\n        const activeSession = cobrowseSessions.find(\n            (session: { state: string }) => session.state === 'connected' || session.state === 'contacting'\n        );\n        return activeSession;\n    },\n\n    _setCobrowseStatusActive(interaction: Extract<AppContext, { type: 'conversation' }>) {\n        interaction.payload.setProperties({\n            cobrowseSessionShareActive: true,\n            sessionShareActiveOnLoad: true,\n            isCobrowseV2: true,\n            isCobrowseV2Disconnected: false\n        });\n    },\n\n    _setCobrowseStatusInactive(interaction: Extract<AppContext, { type: 'conversation' }>) {\n        interaction.payload.setProperties({\n            cobrowseSessionShareActive: false,\n            sessionShareActiveOnLoad: false,\n            isCobrowseV2: false,\n            isCobrowseV2Disconnected: true\n        });\n    }\n});\n\nconst buildCobrowseIframeApp = (gadgetOrigin: string, displayName?: string): IframeAppDef => {\n    return {\n        id: 'cobrowse',\n        displayName: displayName,\n        type: 'iframe',\n        sandbox: [\n            'allow-same-origin',\n            'allow-scripts',\n            'allow-modals',\n            'allow-popups',\n            'allow-forms',\n            'allow-presentation'\n        ],\n        src: new URL(`${gadgetOrigin}/cobrowse-next/viewer.html?appsV2=true`),\n        monochromicIcon: {\n            type: 'sparkV3SvgSprite',\n            classNames: ['custom/co-browse']\n        },\n        startBehavior: 'eager',\n        trustedDataPassing: true,\n        lifecycleConfig: {\n            bootstrap: true,\n            focus: true,\n            blur: true,\n            stop: true\n        }\n    };\n};\n\nexport const boolExpr = or(perm('conversation:cobrowse:add'), perm('conversation:cobrowseVoice:add'));\n","// Imports\nimport EmberObject, { computed } from '@ember/object';\nimport { inject } from '@ember/service';\nimport { and, ft, perm } from 'web-directory/utils/boolean-expressions';\nimport { AppDef } from '@genesys/apps-v2-host';\nimport { AppContext } from 'web-directory/utils/apps';\nimport { typeOf } from '@ember/utils';\nimport { resolve } from 'rsvp';\nimport { Participant } from '@genesys/genesys-cloud-conversation-utils';\n\ntype ParticipantWithInternalMessages = Participant & { internalMessages: [{ id: string; state: string }] };\n\nexport default EmberObject.extend({\n    // Injections\n    application: inject('application'),\n    intl: inject('intl'),\n    // Attributes\n    id: 'consultGadgetProvider',\n    type: 'programmatic',\n    group: 'contextual',\n    trustedProvider: true,\n    monitorInteractionUpdates: true,\n    // Derived\n    gadgetTargetOrigin: computed<string>('application.runtime', function () {\n        const runtimeEnv = this.get('application.runtime');\n        if (runtimeEnv.local) {\n            return `https://apps.${runtimeEnv.publicDomainName}`;\n        }\n        return window.location.origin;\n    }),\n    // Methods\n    getAppConfigs(interaction: AppContext) {\n        const appDefs: AppDef[] = [];\n        const urlParams = new URLSearchParams(window.location.search);\n        const consultGadgetVersion = urlParams.get('consultGadgetVersion');\n        const gadgetOrigin = this.get('gadgetTargetOrigin');\n        const local = consultGadgetVersion === 'local';\n        const url = consultGadgetVersion\n            ? local\n                ? 'https://localhost:3001/consult-gadget.html'\n                : `${gadgetOrigin}/consult-gadget/${consultGadgetVersion}/consult-gadget.html`\n            : `${gadgetOrigin}/consult-gadget/consult-gadget.html`;\n\n        if (\n            interaction &&\n            interaction.type === 'conversation' &&\n            typeOf(interaction.payload) === 'instance' &&\n            interaction.payload.get('type') === 'message'\n        ) {\n            const currentParticipant = interaction.payload.get('participantForCurrentUser');\n            const currentParticipantInternalMessage = currentParticipant.internalMessages?.[0];\n\n            // Current participant has no internal message communications\n            if (!currentParticipantInternalMessage) {\n                return resolve(appDefs);\n            }\n\n            const peerId = currentParticipantInternalMessage.peerId;\n            const participants = interaction.payload.get('participants') as ParticipantWithInternalMessages[];\n            const peerParticipant =\n                peerId &&\n                participants.find(\n                    participant =>\n                        participant.internalMessages?.length > 0 && participant.internalMessages[0].id === peerId\n                );\n            const peerParticipantInternalMessage = peerParticipant && peerParticipant.internalMessages?.[0];\n\n            // Peer participant can't be found or has no internal message communications\n            if (!peerParticipantInternalMessage) {\n                return resolve(appDefs);\n            }\n\n            // Show gadgets on both sides after the consultant (which can be both participants) has accepted\n            if (\n                currentParticipantInternalMessage.state !== 'alerting' &&\n                peerParticipantInternalMessage.state !== 'alerting'\n            ) {\n                appDefs.push(buildConsultGadgetDef(url, this.get('intl').t('purecloud.digitalConsultation')));\n            }\n        }\n\n        return resolve(appDefs);\n    }\n});\n\nexport const boolExpr = and(ft('PURE-5007_digitalConsult'), perm('conversation:internalMessaging:view'));\n\nconst buildConsultGadgetDef = (url: string, displayName?: string): AppDef => {\n    return {\n        id: 'consultConversationGadget',\n        displayName,\n        monochromicIcon: {\n            type: 'sparkV3SvgSprite',\n            classNames: ['legacy/agent-group']\n        },\n        type: 'iframe',\n        startBehavior: 'lazy',\n        src: new URL(url),\n        sandbox: ['allow-scripts', 'allow-downloads', 'allow-same-origin', 'allow-popups'],\n        trustedDataPassing: true,\n        lifecycleConfig: {\n            bootstrap: true,\n            bootstrapTimeoutMillis: 15000,\n            bootstrapReadyTimeoutMillis: 15000,\n            loadTimeoutMillis: 15000,\n            focus: true,\n            blur: true,\n            stop: true\n        }\n    };\n};\n","import Ember from 'ember';\nimport { computed } from '@ember/object';\nimport { bool } from '../utils/boolean-expressions';\nimport { AppContext } from 'web-directory/utils/apps';\nimport { AppDef } from '@genesys/apps-v2-host';\nimport { ApplicationService } from '@web-directory/services';\nimport { assertNever } from 'web-directory/utils/types';\nimport { validatePortNumber } from 'web-directory/utils/app-provider';\n\nconst { inject, RSVP } = Ember;\n\nconst hasAdditionalCustomerInformation = (interaction: any) => {\n    const LEGACY_PARTICIPANT_DATA_CARD_KEY_PREFIX = 'conversationSummary.participantData.';\n    const PARTICIPANT_DATA_CARD_KEY_PREFIX = 'conversationDetails.participantData.';\n    const PARTICIPANT_DATA_CARD_KEY_PREFIXES = [\n        LEGACY_PARTICIPANT_DATA_CARD_KEY_PREFIX,\n        PARTICIPANT_DATA_CARD_KEY_PREFIX\n    ];\n    const customerParticipantData = interaction.get('participantForCustomer.attributes') || {};\n    return Object.keys(customerParticipantData).some(key =>\n        PARTICIPANT_DATA_CARD_KEY_PREFIXES.some(prefix => key.startsWith(prefix))\n    );\n};\n\nconst ConversationDetailsInterapptionsProvider = Ember.Object.extend({\n    // Injections\n    application: inject.service('application'),\n    intl: inject.service('intl'),\n    permissions: inject.service('permissions'),\n\n    // Attributes\n    id: 'conversationDetailsInterapptionsProvider',\n    type: 'programmatic',\n    group: 'contextual',\n    trustedProvider: true,\n    monitorInteractionUpdates: true,\n\n    // Derived\n    runtimeEnv: computed('application.envDetails.runtime', function () {\n        return (this.get('application') as ApplicationService).get('runtime') || undefined;\n    }),\n    gadgetTargetOrigin: computed<string>('application.runtime', function () {\n        const runtimeEnv = this.get('application.runtime');\n        if (runtimeEnv.local) {\n            return `https://apps.${runtimeEnv.publicDomainName}`;\n        }\n        return window.location.origin;\n    }),\n\n    // Methods\n    getAppConfigs(appContext: AppContext) {\n        // A missing context can't be type-guaranteed, so render nothing.\n        if (!appContext) {\n            return RSVP.resolve([]);\n        }\n        const { type } = appContext;\n        switch (type) {\n            case 'conversation': {\n                const { payload } = appContext;\n                const appDefs: AppDef[] = [];\n                // do not show Conversation Details if I am monitoring or coaching the conversation\n                if (\n                    payload.get('myselfIsMonitor') ||\n                    payload.get('myselfIsCoach') ||\n                    payload.get('myselfIsMonitorV2')\n                ) {\n                    return appDefs;\n                }\n\n                const permissions = this.get('permissions');\n                const agentHasViewPermission = permissions.validateDonutPermission('agentUI:conversationSummary:view');\n\n                const hasParticipantData = hasAdditionalCustomerInformation(payload);\n\n                if (agentHasViewPermission) {\n                    if (hasParticipantData || payload.get('isChat')) {\n                        // set app as conversation details\n                        appDefs.push(\n                            buildConversationDetailsGadgetDef({\n                                gadgetOrigin: this.get('gadgetTargetOrigin'),\n                                displayName: this.get('intl').t('purecloud.acdInteraction.conversationSummary')\n                            })\n                        );\n                    }\n                } else if (payload.get('isChat')) {\n                    // set app as interaction details\n                    appDefs.push(\n                        buildConversationDetailsGadgetDef({\n                            gadgetOrigin: this.get('gadgetTargetOrigin'),\n                            displayName: this.get('intl').t('purecloud.acdInteraction.details.details'),\n                            route: `interaction-details`\n                        })\n                    );\n                }\n                return RSVP.resolve(appDefs);\n            }\n            case 'workitem':\n            case 'externalContact':\n            case 'analyticsConversation': {\n                return RSVP.resolve([]);\n            }\n            default: {\n                assertNever(type);\n            }\n        }\n    }\n});\n\nconst buildConversationDetailsGadgetDef = ({\n    gadgetOrigin,\n    displayName,\n    route = ''\n}: {\n    gadgetOrigin: string;\n    displayName: string;\n    route?: string;\n}): AppDef => {\n    // Allow to use specific versions for the Conversation Details gadget via query parameters of Web Directory:\n    //  - If conversationDetailsVersion is set to local, use localhost version of the gadget (which runs on port 3000 by default, but could be overridden using conversationDetailsPort)\n    //  - If conversationDetailsVersion is set to something else than local, then it's considered as a time machine version.\n    const urlParams = new URLSearchParams(window.location.search);\n    const version = urlParams?.get('conversationDetailsVersion') || '';\n    const url =\n        version === 'local'\n            ? `http://localhost:${validatePortNumber(urlParams.get('conversationDetailsPort') || '', 3000)}/#/`\n            : version\n            ? `${gadgetOrigin}/conversation-details/${version}/#/`\n            : `${gadgetOrigin}/conversation-details/#/`;\n    return {\n        id: 'conversation-details',\n        displayName,\n        type: 'iframe',\n        monochromicIcon: {\n            type: 'sparkV3SvgSprite',\n            classNames: ['user-directory']\n        },\n        startBehavior: 'lazy',\n        sandbox: ['allow-scripts', 'allow-same-origin', 'allow-forms'],\n        src: new URL(`${url}${route}`),\n        trustedDataPassing: true,\n        lifecycleConfig: {\n            bootstrap: true,\n            stop: true\n        }\n    };\n};\n\nexport const boolExpr = bool('true');\n\nexport default ConversationDetailsInterapptionsProvider;\n","// Imports\nimport EmberObject, { computed } from '@ember/object';\nimport { inject } from '@ember/service';\nimport { AppDef } from '@genesys/apps-v2-host';\nimport { AppContext } from 'web-directory/utils/apps';\nimport { typeOf } from '@ember/utils';\nimport { resolve } from 'rsvp';\nimport { bool } from 'web-directory/utils/boolean-expressions';\n\nexport default EmberObject.extend({\n    // Injections\n    application: inject('application'),\n    intl: inject('intl'),\n    // Attributes\n    id: 'emailGadgetProvider',\n    type: 'programmatic',\n    group: 'conversation',\n    trustedProvider: true,\n    monitorInteractionUpdates: true,\n    // Derived\n    gadgetTargetOrigin: computed<string>('application.runtime', function () {\n        const runtimeEnv = this.get('application.runtime');\n        if (runtimeEnv.local) {\n            return `https://apps.${runtimeEnv.publicDomainName}`;\n        }\n        return window.location.origin;\n    }),\n    // Methods\n    getAppConfigs(interaction: AppContext) {\n        const appDefs: AppDef[] = [];\n        const urlParams = new URLSearchParams(window.location.search);\n        const emailGadgetVersion = urlParams.get('emailGadgetVersion');\n        const gadgetOrigin = this.get('gadgetTargetOrigin');\n        const local = emailGadgetVersion === 'local';\n        const url = emailGadgetVersion\n            ? local\n                ? 'https://localhost:3000/email-gadget.html'\n                : `${gadgetOrigin}/email-gadget/${emailGadgetVersion}/email-gadget.html`\n            : `${gadgetOrigin}/email-gadget/email-gadget.html`;\n\n        if (interaction && interaction.type === 'conversation' && typeOf(interaction.payload) === 'instance') {\n            if (interaction.payload.get('type') === 'email' && interaction.payload.get('isInternalProvider')) {\n                appDefs.push(buildEmailGadgetDef(url, this.get('intl').t('purecloud.email')));\n            }\n        }\n        return resolve(appDefs);\n    }\n});\n\nexport const boolExpr = bool('true');\n\nconst buildEmailGadgetDef = (url: string, displayName?: string): AppDef => {\n    return {\n        id: 'emailConversationGadget',\n        displayName,\n        monochromicIcon: {\n            type: 'sparkV3SvgSprite',\n            classNames: ['roster-email']\n        },\n        type: 'iframe',\n        src: new URL(url),\n        sandbox: ['allow-scripts', 'allow-downloads', 'allow-same-origin', 'allow-popups', 'allow-modals'],\n        allow: ['clipboard-write'],\n        trustedDataPassing: true,\n        startBehavior: 'lazy',\n        lifecycleConfig: {\n            bootstrap: true,\n            bootstrapTimeoutMillis: 30000,\n            bootstrapReadyTimeoutMillis: 30000,\n            loadTimeoutMillis: 30000,\n            focus: true,\n            blur: true,\n            stop: true\n        }\n    };\n};\n","import { inject as service } from '@ember/service';\nimport { reads } from '@ember/object/computed';\nimport { assign } from '@ember/polyfills';\nimport EmberObject, { computed } from '@ember/object';\nimport RSVP from 'rsvp';\nimport { typeOf, isPresent } from '@ember/utils';\nimport {\n    PC_ENV_URL_REPLACEMENT_TOKEN,\n    GC_LANG_TAG_URL_REPLACEMENT_TOKEN,\n    GC_TARGET_ENV_REPLACEMENT_TOKEN,\n    GC_HOST_ORIGIN_REPLACEMENT_TOKEN\n} from '../models/app';\nimport { and, or, perm } from '../utils/boolean-expressions';\n\nconst JOURNEY_HAWK_BASE_PATH = '/journey-micro/gpe-ui-holistic-customer-journey';\nconst JOURNEY_HAWK_LOCAL_PROXY_PATH = window.location.origin + '/__hcj/#/sessions';\nconst BASE_GADGET_PARAMS = {\n    environment: PC_ENV_URL_REPLACEMENT_TOKEN,\n    gcTargetEnvironment: GC_TARGET_ENV_REPLACEMENT_TOKEN,\n    gcHostOrigin: GC_HOST_ORIGIN_REPLACEMENT_TOKEN,\n    locale: GC_LANG_TAG_URL_REPLACEMENT_TOKEN\n};\nconst HOLISTIC_JOURNEY_HAWK_PARAMS = { ...BASE_GADGET_PARAMS };\nconst HolisticJourneyInterapptionsProvider = EmberObject.extend({\n    application: service(),\n    intl: service(),\n    permissions: service(),\n    session: service(),\n    assetPrefix: reads('application.urlprefix'),\n\n    id: 'builtInHolisticJourneyInterapptionsProvider',\n    type: 'programmatic',\n    trustedProvider: true,\n    monitorInteractionUpdates: true,\n    canUseClientV2: computed('session.features', function () {\n        return this.getFeatureToggle('CPR-615');\n    }),\n\n    getAppConfigs(appContext) {\n        // A missing context can't be type-guaranteed, so render nothing.\n        if (!appContext) return RSVP.resolve([]);\n        const { type: appContextType, payload } = appContext;\n        if (appContextType !== 'conversation') return RSVP.resolve([]);\n\n        let apps = [];\n\n        let externalContactId = payload.get('participantForCustomer.externalContactId');\n        externalContactId =\n            typeOf(externalContactId) === 'string' && isPresent(externalContactId) ? externalContactId.trim() : null;\n        const permissions = this.permissions;\n        const hasPermission = permissions.validateDonutPermission('externalContacts:session:view');\n\n        if (hasPermission && externalContactId) {\n            apps.push(\n                this._getHcjHawkConfig({\n                    loadClientV2: this.canUseClientV2 ? '1' : '0',\n                    externalContactId\n                })\n            );\n        }\n\n        return RSVP.resolve(apps);\n    },\n\n    getFeatureToggle(toggle) {\n        return this.get('session.features') && this.get('session.features')[toggle];\n    },\n\n    _getHcjHawkConfig(holisticJourneyHawkParams) {\n        const hcjVersion = new URLSearchParams(window.location.search).get('hcjVersion');\n        const query = this._buildGadgetQueryString(HOLISTIC_JOURNEY_HAWK_PARAMS, holisticJourneyHawkParams);\n        const icon = {\n            guxIcon: {\n                name: 'customer-journey',\n                decorative: true\n            }\n        };\n\n        const config = {\n            id: 'agent-narrow-composite-journey-gadget',\n            name: this.intl.t('predictiveEngagement.gadgets.holisticJourneyGadget.title'),\n            sandbox: ['allow-same-origin', 'allow-scripts', 'allow-popups', 'allow-forms'],\n            icon,\n            monochromicIcon: icon\n        };\n\n        if (hcjVersion === 'localProxy') {\n            config.url = `${JOURNEY_HAWK_LOCAL_PROXY_PATH}${query}`;\n        } else {\n            config.path = `${JOURNEY_HAWK_BASE_PATH}${hcjVersion ? `/${hcjVersion}` : ''}/#/sessions`;\n            config.query = query;\n        }\n\n        return config;\n    },\n\n    _buildGadgetQueryString(...paramObjs) {\n        let result = '';\n\n        let params = assign({}, ...paramObjs);\n\n        let paramCount = 0;\n        Object.keys(params).forEach(currParam => {\n            let currValue = params[currParam];\n            result += `${paramCount > 0 ? '&' : '?'}${encodeURIComponent(currParam)}=`;\n            if (typeOf(currValue) === 'string' && currValue.indexOf('{{') === 0) {\n                // Don't encode interpolated param values, they'll be handled by the apps model\n                result += currValue;\n            } else {\n                result += encodeURIComponent(currValue);\n            }\n\n            paramCount++;\n        });\n\n        return result;\n    }\n});\n\nexport const boolExpr = or(\n    and(perm('journey:session:view'), perm('journey:event:view')),\n    and(perm('externalContacts:session:view'), perm('journey:event:view'))\n);\n\nexport default HolisticJourneyInterapptionsProvider;\n","import EmberObject from '@ember/object';\nimport { inject } from '@ember/service';\nimport appUtils, { AppContext, InteractionAppContext } from '../utils/apps';\nimport { getCommunicationType } from 'web-directory/utils/acd';\nimport { INTERAPPTION_COMMUNICATION_TYPE_FILTERS } from '../models/app';\nimport { InterapptionModel } from '@web-directory/services';\n\nconst PROVIDER_LOG_NAMESPACE = 'Integration Interapptions Provider';\n\nexport const INTEGRATIONS_INTERAPPTIONS_PROVIDER_ID = 'builtInIntegrationsInterapptionsProvider';\n\nconst IntegrationsInterapptionsProvider = EmberObject.extend({\n    // Injections\n    apps: inject('apps'),\n    stashLogger: inject('stash-logger'),\n\n    // Attributes\n    id: INTEGRATIONS_INTERAPPTIONS_PROVIDER_ID,\n    type: 'programmatic',\n    trustedProvider: true,\n    monitorInteractionUpdates: true,\n\n    _cachedApps: null as InterapptionModel[] | null,\n\n    // For now, all integrations can be run at all sizes.  This may become configurable in the future.\n    getAvailableAppSizes: () => ['small', 'medium', 'large', 'xlarge'],\n    // Integrations should all support Focus Mode\n    getCanUseFocusMode: () => true,\n\n    // Methods\n\n    /**\n     * Fetches interapptions for a given interaction ID.\n     *\n     * @param interactionId - The ID of the interaction.\n     * @returns A promise that resolves to an array of Interapption objects.\n     */\n    fetchInterapptions(interactionId: string): Promise<InterapptionModel[]> {\n        return this.get('apps')\n            .findAllInterapptions()\n            .then(apps => {\n                this.set('_cachedApps', apps);\n                return apps;\n            })\n            .catch((reason: any) => {\n                this.get('stashLogger').error(\n                    appUtils.buildInterapptionsLogMsg(\n                        'Failed to fetch interapption defs from service - falling back to the cached list of apps.',\n                        PROVIDER_LOG_NAMESPACE\n                    ),\n                    {\n                        reason,\n                        remoteData: {\n                            interactionId\n                        }\n                    }\n                );\n                return this.get('_cachedApps') || [];\n            });\n    },\n\n    /**\n     * Retrieves the application configurations based on the provided app context.\n     * Interapptions are access controlled by groups (ad-hoc) or permissions (premium).\n     *\n     * @param appContext The application context.\n     * @returns A promise that resolves to an array of filtered Interapptions.\n     */\n    getAppConfigs(appContext: AppContext): Promise<InterapptionModel[]> {\n        // A missing context can't be type-guaranteed, so render nothing.\n        if (!appContext || (appContext.type !== 'conversation' && appContext.type !== 'workitem')) {\n            return Promise.resolve([]);\n        }\n\n        /*\n         * Interapptions are assumed included unless a filter is specified and fails.\n         * Filters are applied as logical ANDs.\n         */\n        return this.fetchInterapptions(appContext.id).then(interapptions => {\n            return interapptions.filter(\n                currInterapption =>\n                    this._filterForQueue(currInterapption, appContext) &&\n                    this._filterForInteraction(currInterapption, appContext)\n            );\n        });\n    },\n\n    _filterForInteraction(interapption: InterapptionModel, appContext: InteractionAppContext): boolean {\n        const { payload: interaction, type: appContextType, id: interactionId } = appContext;\n        if (appContextType === 'workitem') {\n            const enableWorkitem = interapption.get('enableWorkitem');\n            if (typeof enableWorkitem !== 'boolean') {\n                this.get('stashLogger').debug(\n                    appUtils.buildInterapptionsLogMsg(\n                        'Unsupported enableWorkitem type. Interaction Widget will be filtered out.',\n                        PROVIDER_LOG_NAMESPACE\n                    ),\n                    {\n                        interaction,\n                        remoteData: {\n                            interactionId,\n                            type: appContextType\n                        }\n                    }\n                );\n                return false;\n            }\n            return enableWorkitem;\n        }\n\n        const enabledCommunicationTypes = interapption.get('enabledCommunicationTypes');\n\n        if (enabledCommunicationTypes && enabledCommunicationTypes.length > 0) {\n            // If 'none' is included in the list of enabled communication types, then it will not be displayed for any conversation.\n            if (enabledCommunicationTypes.includes('none')) return false;\n\n            const currInteractionCommType = getCommunicationType(interaction);\n\n            if (!INTERAPPTION_COMMUNICATION_TYPE_FILTERS.includes(currInteractionCommType)) {\n                this.get('stashLogger').debug(\n                    appUtils.buildInterapptionsLogMsg(\n                        'Unsupported Interaction commmunication type.  Interaction Widget will be filtered out.',\n                        PROVIDER_LOG_NAMESPACE\n                    ),\n                    {\n                        interaction,\n                        remoteData: {\n                            interactionId,\n                            type: interaction.get('type')\n                        }\n                    }\n                );\n            }\n\n            if (!currInteractionCommType || !enabledCommunicationTypes.includes(currInteractionCommType)) {\n                return false;\n            }\n        }\n        return true;\n    },\n    _filterForQueue(interapption: InterapptionModel, appContext: InteractionAppContext): boolean {\n        const { payload: interaction, type: appContextType } = appContext;\n        /* Filter by queue:\n         *\n         * Here, we use the current user's queue rather than the customer for a few reasons:\n         * * The original customer queue is not updated on transfers\n         * * The interapptions can change in response to queue transfers (Consult, bad IVR route, etc.)\n         * * Transfers to a direct user inherit the queue ID of the transfer-requesting agent.\n         *\n         * In the future, we could add different queue filtering mechanisms:\n         * * Queue matched at any point in conversation history\n         * * Any Agent queue (all or active)\n         */\n        const enabledQueueIds = interapption.get('enabledQueueIds');\n        if (enabledQueueIds && enabledQueueIds.length > 0) {\n            let currQueueId: string | undefined;\n            if (appContextType === 'workitem') {\n                currQueueId = interaction && interaction.agent?.queueId;\n            } else if (appContextType === 'conversation') {\n                currQueueId =\n                    interaction.get('participantForCurrentUser.queueId') ||\n                    interaction.get('participantForQueue.queueId');\n            }\n            return (\n                typeof currQueueId === 'string' &&\n                !!currQueueId.trim().length &&\n                enabledQueueIds.includes(currQueueId.trim())\n            );\n        }\n        return true;\n    }\n});\n\nexport const boolExpr = 'bool:true';\n\nexport default IntegrationsInterapptionsProvider;\n","// Imports\nimport EmberObject, { computed } from '@ember/object';\nimport { inject } from '@ember/service';\nimport { AppDef } from '@genesys/apps-v2-host';\nimport { AppContext } from 'web-directory/utils/apps';\nimport { typeOf } from '@ember/utils';\nimport { resolve } from 'rsvp';\n\nexport default EmberObject.extend({\n    // Injections\n    application: inject('application'),\n    intl: inject('intl'),\n    // Attributes\n    id: 'messagingGadgetProvider',\n    type: 'programmatic',\n    group: 'conversation',\n    trustedProvider: true,\n    monitorInteractionUpdates: true,\n    // Derived\n    gadgetTargetOrigin: computed<string>('application.runtime', function () {\n        const runtimeEnv = this.get('application.runtime');\n        if (runtimeEnv.local) {\n            return `https://apps.${runtimeEnv.publicDomainName}`;\n        }\n        return window.location.origin;\n    }),\n    // Methods\n    getAppConfigs(interaction: AppContext) {\n        const appDefs: AppDef[] = [];\n        const urlParams = new URLSearchParams(window.location.search);\n        const messagingGadgetVersion = urlParams.get('messagingGadgetVersion');\n        const gadgetOrigin = this.get('gadgetTargetOrigin');\n        const local = messagingGadgetVersion === 'local';\n        const url = messagingGadgetVersion\n            ? local\n                ? 'https://localhost:3000/messaging-gadget.html'\n                : `${gadgetOrigin}/messaging-gadget/${messagingGadgetVersion}/messaging-gadget.html`\n            : `${gadgetOrigin}/messaging-gadget/messaging-gadget.html`;\n\n        if (interaction && interaction.type === 'conversation' && typeOf(interaction.payload) === 'instance') {\n            if (interaction.payload.get('type') === 'message') {\n                appDefs.push(buildMessagingGadgetDef(url, this.get('intl').t('purecloud.message')));\n            }\n        }\n        return resolve(appDefs);\n    }\n});\n\nexport const boolExpr = 'bool:true';\n\nconst buildMessagingGadgetDef = (url: string, displayName?: string): AppDef => {\n    return {\n        id: 'messagingConversationGadget',\n        displayName,\n        monochromicIcon: {\n            type: 'sparkV3SvgSprite',\n            classNames: ['legacy/roster-sms']\n        },\n        type: 'iframe',\n        startBehavior: 'lazy',\n        src: new URL(url),\n        sandbox: ['allow-scripts', 'allow-downloads', 'allow-same-origin', 'allow-popups'],\n        trustedDataPassing: true,\n        lifecycleConfig: {\n            bootstrap: true,\n            bootstrapTimeoutMillis: 15000,\n            bootstrapReadyTimeoutMillis: 15000,\n            loadTimeoutMillis: 15000,\n            focus: true,\n            blur: true,\n            stop: true\n        },\n        allow: ['microphone']\n    };\n};\n","// Imports\nimport EmberObject, { computed } from '@ember/object';\nimport { inject } from '@ember/service';\nimport { IframeAppDef } from '@genesys/apps-v2-host';\nimport { AppContext } from 'web-directory/utils/apps';\nimport { typeOf } from '@ember/utils';\nimport { validatePortNumber } from 'web-directory/utils/app-provider';\n\nexport default EmberObject.extend({\n    // Injections\n    application: inject('application'),\n    intl: inject('intl'),\n    // Attributes\n    id: 'notesGadgetProvider',\n    type: 'programmatic',\n    group: 'contextual',\n    trustedProvider: true,\n    monitorInteractionUpdates: true,\n    // Derived\n    gadgetTargetOrigin: computed<string>('application.runtime', function () {\n        const runtimeEnv = this.get('application.runtime');\n        if (runtimeEnv.local) {\n            return `https://apps.${runtimeEnv.publicDomainName}`;\n        }\n        return window.location.origin;\n    }),\n    // Methods\n    async getAppConfigs(appContext: AppContext) {\n        const appDefs: IframeAppDef[] = [];\n        if (appContext && appContext.type === 'conversation' && typeOf(appContext.payload) === 'instance') {\n            const myselfIsMonitorV2 = appContext.payload.get('myselfIsMonitorV2');\n            const myselfIsCoachOrMonitor =\n                appContext.payload.get('myselfIsMonitor') || appContext.payload.get('myselfIsCoach');\n            if (!myselfIsCoachOrMonitor || myselfIsMonitorV2) {\n                appDefs.push(\n                    buildNotesGadgetDef(\n                        this.get('gadgetTargetOrigin'),\n                        this.get('intl').t('purecloud.acdInteraction.notes')\n                    )\n                );\n            }\n        }\n        return appDefs;\n    }\n});\n\nexport const boolExpr = 'bool:true';\n\nconst getGadgetUrl = (gadgetOrigin: string) => {\n    const urlParams = new URLSearchParams(window.location.search);\n    const version = urlParams?.get('notesGadgetVersion') || '';\n    if (!version) {\n        return `${gadgetOrigin}/acw-gadgets-notes/index.html`;\n    }\n    if (version === 'local') {\n        return `https://localhost:${validatePortNumber(urlParams.get('notesGadgetPort') || '', 4041)}`;\n    }\n    if (version.match(/^https?:\\/\\//)) {\n        return version;\n    }\n    return `${gadgetOrigin}/acw-gadgets-notes/${version}/index.html`;\n};\n\nconst buildNotesGadgetDef = (gadgetOrigin: string, displayName?: string): IframeAppDef => {\n    // Allow to use specific versions for the Notes gadget via query parameters of Web Directory:\n    //  - If notesGadgetVersion is set to local, use localhost version of the gadget (which runs on port 4041 by default, but could be overridden using notesGadgetPort)\n    //  - If notesGadgetVersion is set to something else than local, then it's considered as a time machine version.\n    //    For example, for Notes, a timemachine version is available for branch feature/AURA-34-genesys-cloud-api-helper\n    //    So, if Web Directory URL is used with ?notesGadgetVersion=feature/AURA-34-genesys-cloud-api-helper\n    //    this time machine version is displayed to the user\n\n    return {\n        id: 'notesGadget',\n        displayName,\n        monochromicIcon: {\n            type: 'sparkV3SvgSprite',\n            classNames: ['notes']\n        },\n        type: 'iframe',\n        startBehavior: 'lazy',\n        src: new URL(getGadgetUrl(gadgetOrigin)),\n        sandbox: ['allow-scripts', 'allow-downloads', 'allow-same-origin', 'allow-popups'],\n        trustedDataPassing: true,\n        lifecycleConfig: {\n            bootstrap: true,\n            focus: true,\n            blur: true,\n            stop: true,\n            // For Wrapup and Notes gadget views, the bootstrap period is extended to 15s to keep the \"loading\" AppsV2 message a little bit longer\n            // in case the Wrapup complete panel load takes longer to initialize.\n            // On Wrapup gadget side, 2s before this 15s delay expires, the bootstrap event is sent and the \"loader\" from the gadget is displayed\n            // in case the full data is not yet available (pure defense case, will hopefully never happen in \"real life\").\n            // This mechanism is in place to avoid the weird UI effect where the \"loading\" AppsV2 message will be replaced with the \"loading\" from gadget\n            bootstrapTimeoutMillis: 15000,\n            bootstrapReadyTimeoutMillis: 15000,\n            loadTimeoutMillis: 15000\n        }\n    };\n};\n","import Ember from 'ember';\nimport { computed } from '@ember/object';\nimport { inject } from '@ember/service';\nimport { perm } from '../utils/boolean-expressions';\nimport { AppContext } from 'web-directory/utils/apps';\n\nconst localhostOrigin = 'https://localhost:4444';\n\nconst ProfilePanelProvider = Ember.Object.extend({\n    intl: inject('intl'),\n    session: inject('session'),\n    application: inject('application'),\n\n    id: 'builtInExternalContactsInterapptionsProvider',\n    type: 'programmatic',\n\n    trustedProvider: true,\n    monitorInteractionUpdates: true,\n\n    canSupportWorkItems: computed.reads('session.features.PURE-6191'),\n\n    useLocalProfilePanel: computed<boolean>('application.runtime', function () {\n        const isLowers = ['dev', 'test'].includes(this.get('application.runtime.env'));\n        const runningWebDirectoryLocally = this.get('application.runtime.local');\n\n        return this.getVersion() === 'local' && (isLowers || runningWebDirectoryLocally);\n    }),\n\n    targetOrigin: computed<string>('useLocalProfilePanel', function () {\n        if (this.get('useLocalProfilePanel')) {\n            return localhostOrigin;\n        }\n\n        // This is only included as the URL constructor needs a valid base.\n        // When running Web-Directory locally, this base is ignored and the environment public name is used.\n        return window.location.origin;\n    }),\n\n    getVersion(): string | undefined {\n        const url = new URLSearchParams(window.location.search);\n\n        return url.get('externalContactsACDBranch') || undefined;\n    },\n\n    url: computed<URL>(\n        'application.runtime.local',\n        'session.accessToken',\n        'targetOrigin',\n        'useLocalProfilePanel',\n        function () {\n            const branch = this.getVersion() === 'local' ? undefined : this.getVersion();\n            const useLocalProfilePanel = this.get('useLocalProfilePanel');\n            const url = new URL(\n                useLocalProfilePanel ? '' : `/profile-panel-ui/${branch ? `${branch}/` : ''}`,\n                this.get('targetOrigin')\n            );\n\n            url.searchParams.set('isAppsV2', 'true');\n            return url;\n        }\n    ),\n\n    buildProfilePanelDef() {\n        return [\n            {\n                id: 'external-contact-acd-profile-panel',\n                displayName: this.get('intl').t('purecloud.acdInteraction.relate.profile'),\n                type: 'iframe',\n                monochromicIcon: {\n                    type: 'sparkV3SvgSprite',\n                    classNames: ['user-circle']\n                },\n                startBehavior: 'lazy',\n                lifecycleConfig: {\n                    bootstrap: true,\n                    bootstrapTimeoutMillis: 15000,\n                    bootstrapReadyTimeoutMillis: 15000,\n                    loadTimeoutMillis: 15000,\n                    focus: true,\n                    blur: true,\n                    stop: true\n                },\n                trustedDataPassing: true,\n                sandbox: [\n                    'allow-same-origin',\n                    'allow-scripts',\n                    'allow-modals',\n                    'allow-popups',\n                    'allow-forms',\n                    'allow-downloads'\n                ],\n                src: this.get('url')\n            }\n        ];\n    },\n\n    getAppConfigs(appContext?: AppContext) {\n        // Apps must opt in per context. Ember doesn't enforce the appContext contract, so a\n        // missing context means we can't guarantee the type and must not show the panel.\n        // Only conversation (and workitem when the FT is enabled) are certified today;\n        // externalContact / analyticsConversation must be added explicitly once the panel supports them.\n        if (!appContext) {\n            return Ember.RSVP.resolve([]);\n        }\n\n        if (appContext.type === 'conversation') {\n            return Ember.RSVP.resolve(this.buildProfilePanelDef());\n        }\n\n        if (appContext.type === 'workitem' && this.get('canSupportWorkItems')) {\n            return Ember.RSVP.resolve(this.buildProfilePanelDef());\n        }\n\n        return Ember.RSVP.resolve([]);\n    }\n});\n\nexport const boolExpr = perm('externalContacts:contact:view');\n\nexport default ProfilePanelProvider;\n","import EmberObject, { computed } from '@ember/object';\nimport { inject } from '@ember/service';\nimport { perm } from '../utils/boolean-expressions';\nimport { resolve } from 'rsvp';\nimport { AppContext } from 'web-directory/utils/apps';\nimport { IframeAppDef } from '@genesys/apps-v2-host';\nimport { validatePortNumber } from 'web-directory/utils/app-provider';\n\nexport default EmberObject.extend({\n    // Injections\n    application: inject('application'),\n    intl: inject('intl'),\n    permissions: inject('permissions'),\n\n    // Attributes\n    id: 'scheduleCallbackGadgetProvider',\n    type: 'programmatic',\n    group: 'contextual',\n    trustedProvider: true,\n    monitorInteractionUpdates: true,\n\n    // Derived\n    gadgetTargetOrigin: computed<string>('application.runtime', function () {\n        const runtimeEnv = this.get('application.runtime');\n\n        if (runtimeEnv.local) {\n            return `https://apps.${runtimeEnv.publicDomainName}`;\n        }\n\n        return window.location.origin;\n    }),\n\n    // Methods\n    getAppConfigs(appContext: AppContext) {\n        // A missing context can't be type-guaranteed, so render nothing.\n        if (!appContext || appContext.type !== 'conversation') {\n            return resolve([]);\n        }\n\n        const { payload } = appContext;\n        const appDefs: IframeAppDef[] = [];\n        const permissions = this.get('permissions');\n        const agentHasPermission = permissions.validateDonutPermission('conversation:callback:create');\n        const myselfIsCoachOrMonitor =\n            payload.get('myselfIsCoach') || payload.get('myselfIsMonitor') || payload.get('myselfIsMonitorV2');\n        const isCallOrCallback = payload.get('isCall') || payload.get('isCallback');\n        const isInConsult = payload.get('iAmConsultInitiator') && payload.get('isThereAConsultAgentParticipant');\n\n        if (agentHasPermission && isCallOrCallback && !isInConsult && !myselfIsCoachOrMonitor) {\n            appDefs.push(\n                buildScheduleCallbackGadgetDef({\n                    gadgetOrigin: this.get('gadgetTargetOrigin'),\n                    displayName: this.get('intl').t('purecloud.acdInteraction.scheduleCallback.title')\n                })\n            );\n        }\n\n        return resolve(appDefs);\n    }\n});\n\nconst getGadgetUrl = (gadgetOrigin: string) => {\n    const urlParams = new URLSearchParams(window.location.search);\n    const version = urlParams?.get('scheduleCallbackGadgetVersion') || '';\n\n    if (!version) {\n        return `${gadgetOrigin}/schedule-callback-gadget/`;\n    }\n\n    if (version === 'local') {\n        return `http://localhost:${validatePortNumber(urlParams.get('scheduleCallbackGadgetPort') || '', 5173)}/`;\n    }\n\n    // If string starts with either \"http://\" or \"https://\"\n    if (version.match(/^https?:\\/\\//)) {\n        return version;\n    }\n\n    return `${gadgetOrigin}/schedule-callback-gadget/${version}/`;\n};\n\nconst buildScheduleCallbackGadgetDef = ({\n    gadgetOrigin,\n    displayName\n}: {\n    gadgetOrigin: string;\n    displayName: string;\n}): IframeAppDef => {\n    return {\n        id: 'scheduleCallbackGadget',\n        displayName,\n        type: 'iframe',\n        monochromicIcon: {\n            type: 'sparkV3SvgSprite',\n            classNames: ['calendar-add']\n        },\n        startBehavior: 'lazy',\n        sandbox: ['allow-scripts', 'allow-same-origin', 'allow-forms', 'allow-popups'],\n        src: new URL(getGadgetUrl(gadgetOrigin)),\n        trustedDataPassing: true,\n        lifecycleConfig: {\n            bootstrap: true,\n            stop: true\n        }\n    };\n};\n\nexport const boolExpr = perm('conversation:callback:create');\n","import EmberObject, { computed } from '@ember/object';\nimport { Registry, inject } from '@ember/service';\nimport { and, perm } from 'web-directory/utils/boolean-expressions';\nimport { AppDef } from '@genesys/apps-v2-host';\nimport { resolve } from 'rsvp';\nimport { AppProvider } from 'web-directory/components/acd-interactions-panel/interapptions-manager-v2/component';\nimport ComputedProperty from '@ember/object/computed';\nimport { AppContext } from 'web-directory/utils/apps';\nimport { AppCarouselHostLayoutTemplateItemSize } from '@genesys/apps-v2-host-layout';\n\ntype Inject<T extends keyof Registry> = ComputedProperty<Registry[T]>;\ntype ScripterGadgetProviderDefault = AppProvider & {\n    application: Inject<'application'>;\n    intl: Inject<'intl'>;\n    session: Inject<'session'>;\n    gadgetTargetOrigin: ComputedProperty<string, string>;\n    getAvailableAppSizes?: (appDefId: string) => undefined | AppCarouselHostLayoutTemplateItemSize[];\n    getCanUseFocusMode?: (appDefId: string) => boolean;\n    getAppGroup: (appDef: AppDef) => 'conversation' | 'contextual' | undefined;\n    features: ComputedProperty<any, any>;\n};\ntype ScriptProviderConfig = {\n    id: string;\n    group: AppProvider['group'];\n    startBehavior: AppDef['startBehavior'];\n    shouldBuild: (appContext: AppContext, features: Record<string, boolean>) => boolean;\n    route: (appContext: AppContext) => string;\n};\ntype ScripterProviderSelf = EmberObject & ScripterGadgetProviderDefault;\ntype ScripterAppDef = AppDef & { group?: 'conversation' | 'contextual' };\n\nconst buildScripterUrl = (origin: string, route: string) => {\n    const urlParams = new URLSearchParams(window.location.search);\n    const scripterGadgetVersion = urlParams.get('scripterGadgetVersion');\n    const local = scripterGadgetVersion === 'local';\n    return scripterGadgetVersion\n        ? local\n            ? `http://localhost:9091/scripter/#/${route}`\n            : `${origin}/scripter/${scripterGadgetVersion}/#/${route}`\n        : `${origin}/scripter/#/${route}`;\n};\n// shouldBuild predicates must be stable for the lifetime of an interaction.\n// With monitorInteractionUpdates on, any input that flips mid-interaction\n// tears down the iframe and remounts it cold. Only gate on inputs set at\n// interaction creation (e.g. myselfIsMonitorV2) or where attach/detach is\n// the desired lifecycle (e.g. workitem.scriptId). myselfIsMonitor,\n// myselfIsCoach, and the consult flags are intentionally NOT checked here —\n// they flip mid-interaction.\n//\n// payload.get is only safe after the appContext.type guard in each\n// shouldBuild; reading payload fields off a workItem context will throw.\nconst scriptProviderConfigs: ScriptProviderConfig[] = [\n    {\n        id: 'voice',\n        group: 'conversation',\n        startBehavior: 'eager',\n        route: function (appContext) {\n            return `interaction/${appContext.id}`;\n        },\n        shouldBuild: function (appContext, features) {\n            if (appContext.type !== 'conversation') return false;\n            if (!features['PURE-6186_Scripter_Gadget_GCUI']) return false;\n            if (appContext.payload.get('myselfIsMonitorV2')) return false;\n            const interactionType = appContext.payload.get('type');\n            return interactionType === 'call' || interactionType === 'callback';\n        }\n    },\n    {\n        id: 'digital',\n        group: 'contextual',\n        startBehavior: 'lazy',\n        route: function (appContext) {\n            return `interaction/${appContext.id}`;\n        },\n        shouldBuild: function (appContext, features) {\n            if (appContext.type !== 'conversation') return false;\n            if (!features['PURE-6186_Scripter_Gadget_GCUI']) return false;\n            if (appContext.payload.get('myselfIsMonitorV2')) return false;\n            const interactionType = appContext.payload.get('type');\n            return interactionType !== 'call' && interactionType !== 'callback';\n        }\n    },\n    {\n        id: 'workItem',\n        group: 'contextual',\n        startBehavior: 'lazy',\n        route: function (appContext) {\n            return `workItem/${appContext.id}`;\n        },\n        shouldBuild: function (appContext) {\n            if (appContext.type !== 'workitem') return false;\n            return !!appContext.payload.workitem.scriptId;\n        }\n    }\n];\n\nconst buildScripterGadgetDef = (url: string, displayName?: string): ScripterAppDef => {\n    return {\n        id: 'scripts',\n        displayName,\n        type: 'iframe',\n        icon: {\n            type: 'sparkV3SvgSprite',\n            classNames: ['scripter']\n        },\n        trustedDataPassing: true,\n        // Going with eager as this is as close as we can get to existing behavior.\n        startBehavior: 'lazy',\n        lifecycleConfig: {\n            bootstrap: true,\n            stop: true,\n            stopTimeoutMillis: 5000,\n            // Added a longer bootstrap timeout to handle reduced network conditions\n            bootstrapTimeoutMillis: 15000,\n            bootstrapReadyTimeoutMillis: 15000,\n            loadTimeoutMillis: 15000\n        },\n        allow: ['clipboard-write'],\n        sandbox: [\n            'allow-same-origin',\n            'allow-scripts',\n            'allow-modals',\n            'allow-popups',\n            'allow-forms',\n            'allow-downloads'\n        ],\n        src: new URL(url)\n    };\n};\n\nexport default EmberObject.extend<unknown, EmberObject, ScripterGadgetProviderDefault, unknown>({\n    // Injections\n    application: inject('application'),\n    intl: inject('intl'),\n    session: inject('session'),\n    // Attributes\n    type: 'programmatic',\n    trustedProvider: true,\n    monitorInteractionUpdates: true,\n    id: 'scriptsProvider',\n    features: computed.readOnly('session.features'),\n    gadgetTargetOrigin: computed<string>('application.runtime', function (this: ScripterProviderSelf) {\n        const application = this.get('application');\n        if (application.runtime.local) {\n            return `https://apps.${application.runtime.publicDomainName}`;\n        }\n        return window.location.origin;\n    }),\n    getAvailableAppSizes: () => ['small', 'medium', 'large', 'xlarge'],\n    getCanUseFocusMode: () => true,\n    getAppGroup(this: ScripterProviderSelf, _appDef) {\n        const appDef = _appDef as ScripterAppDef;\n        return appDef.group;\n    },\n    getAppConfigs(this: ScripterProviderSelf, appContext) {\n        const appDefs: AppDef[] = [];\n        // A missing context can't be type-guaranteed, so render nothing.\n        if (!appContext) {\n            return resolve(appDefs);\n        }\n        const gadgetOrigin = this.get('gadgetTargetOrigin');\n        const foundProviderConfig = scriptProviderConfigs.find(c => c.shouldBuild(appContext, this.get('features')));\n        if (foundProviderConfig) {\n            const url = buildScripterUrl(gadgetOrigin, foundProviderConfig.route(appContext));\n            const scripterAppDef = buildScripterGadgetDef(url, this.get('intl').t('purecloud.acdInteraction.scripts'));\n            scripterAppDef.group = foundProviderConfig.group;\n            scripterAppDef.startBehavior = foundProviderConfig.startBehavior;\n            appDefs.push(scripterAppDef);\n        }\n        return resolve(appDefs);\n    }\n});\n\nexport const boolExpr = and(perm('scripter:publishedScript:view'));\n","import { inject as service } from '@ember/service';\nimport { reads, readOnly } from '@ember/object/computed';\nimport EmberObject, { computed } from '@ember/object';\nimport RSVP from 'rsvp';\nimport { and, perm, not } from '../utils/boolean-expressions';\nimport {\n    GC_LANG_TAG_URL_REPLACEMENT_TOKEN,\n    GC_CONVERSATION_ID_URL_REPLACEMENT_TOKEN,\n    PC_ENV_URL_REPLACEMENT_TOKEN\n} from '../models/app';\nimport { getCommunicationType } from 'web-directory/utils/acd';\n\nconst SmartAdvisorProvider = EmberObject.extend({\n    application: service(),\n    intl: service(),\n    session: service(),\n    agentAssistChecks: service('agent-assist-checks'),\n    id: 'builtInSmartAdvisorInterapptionsProvider',\n    type: 'programmatic',\n    trustedProvider: true,\n    assetPrefix: reads('application.urlprefix'),\n    products: readOnly('session.products'),\n    monitorInteractionUpdates: true,\n\n    isSmartAdvisorProductEnabled: computed('products', function () {\n        const supportedProducts = ['assistants', 'cloudCX2', 'agentAssistOmni', 'agentAssistDigital'];\n        return this.products.some(product => supportedProducts.includes(product.id));\n    }),\n\n    async getAppConfigs(appContext /*, updateAppConfigsCallback*/) {\n        // A missing context can't be type-guaranteed, so render nothing.\n        if (!appContext) return RSVP.resolve([]);\n        const { type: appContextType, payload } = appContext;\n        if (appContextType !== 'conversation') return RSVP.resolve([]);\n\n        let apps = [];\n        // TODO: Use the interaction details to decide what apps, if any are applicable\n        // TODO: you can use updateAppConfigsCallbackto change apps based on interaction state, if desired\n        // Fail early\n        if (\n            !this.agentAssistChecks._isSupportedMediaType(payload) ||\n            !(await this.agentAssistChecks._checkIfSmartAdvisorIsEnabled(payload)) ||\n            !this.isSmartAdvisorProductEnabled\n        ) {\n            return RSVP.resolve([]);\n        }\n        apps.push({\n            id: 'smart-advisor',\n            name: this.intl.t('smartAdvisor.title'),\n            sandbox: ['allow-same-origin', 'allow-scripts', 'allow-popups', 'allow-forms'],\n            path: `smart-advisor-ui/#/smart-advisor/?host=cx&locale=${GC_LANG_TAG_URL_REPLACEMENT_TOKEN}&iid=${GC_CONVERSATION_ID_URL_REPLACEMENT_TOKEN}&pcEnvironment=${PC_ENV_URL_REPLACEMENT_TOKEN}&interactionType=${getCommunicationType(\n                payload\n            )}`,\n            // url: 'http://localhost:4000/smart-advisor/',\n            monochromicIcon: {\n                vector: `${this.assetPrefix || '/'}assets/images/svg/lightbulb.svg`\n            }\n        });\n\n        return RSVP.resolve(apps);\n    }\n});\nexport const boolExpr = and(perm('assistants:queue:view'), not(perm('assistants:copilot:view')));\nexport default SmartAdvisorProvider;\n","// Imports\nimport EmberObject, { computed } from '@ember/object';\nimport { inject } from '@ember/service';\nimport { typeOf } from '@ember/utils';\nimport { IframeAppDef } from '@genesys/apps-v2-host';\nimport { run } from '@ember/runloop';\nimport appUtils, { AppContext } from 'web-directory/utils/apps';\nimport { and, ft, perm } from 'web-directory/utils/boolean-expressions';\nimport { getVoltFeatureBranch, isVoltLocalhost } from 'web-directory/utils/volt-popout';\nimport { isTesting } from 'web-directory/utils/testing';\n\nconst PROVIDER_LOG_NAMESPACE = 'Video Provider';\n\nexport default EmberObject.extend({\n    id: 'videoProvider',\n    type: 'programmatic',\n    group: 'contextual',\n    trustedProvider: true,\n    monitorInteractionUpdates: true,\n    intl: inject('intl'),\n    stashLogger: inject('stash-logger'),\n    application: inject('application'),\n    ajax: inject('ajax'),\n    interactionService: inject('interaction'),\n    session: inject('session'),\n    useMultipanel: computed.reads('session.useMultipanel'),\n    gadgetTargetOrigin: computed<string>('application.runtime', function () {\n        const runtimeEnv = this.get('application.runtime');\n        if (runtimeEnv.local) {\n            return `https://apps.${runtimeEnv.publicDomainName}`;\n        }\n        return window.location.origin;\n    }),\n\n    init() {\n        this._super();\n        run(() => {\n            this.get('interactionService').on('beginVideo', this, run.bind(this, '_createVideo'));\n        });\n    },\n\n    getAvailableAppSizes: () => ['medium', 'large', 'xlarge'],\n    getCanUseFocusMode: () => true,\n\n    async getAppConfigs(interaction: AppContext) {\n        if (\n            interaction &&\n            interaction.type === 'conversation' &&\n            typeOf(interaction.payload) === 'instance' &&\n            this.get('useMultipanel')\n        ) {\n            if (!interaction.payload.get('isConnected')) {\n                interaction.payload.set('isVideoActive', false);\n                return [];\n            }\n\n            const roomJid = this._getActiveVideoRoomJid(interaction);\n\n            if (roomJid) {\n                interaction.payload.set('videoConferenceCreationInProgress', false);\n                interaction.payload.set('isVideoActive', true);\n                return [\n                    buildVideoIframeApp(\n                        isVoltLocalhost() ? 'https://localhost:8443' : this.get('gadgetTargetOrigin'),\n                        this.get('intl').t('purecloud.acdInteraction.acdVideo.video'),\n                        roomJid\n                    )\n                ];\n            }\n\n            if (!interaction.payload.get('videoConferenceCreationInProgress')) {\n                interaction.payload.set('isVideoActive', false);\n            }\n        }\n        return [];\n    },\n\n    async _createVideo(interaction: any) {\n        if (!interaction || typeOf(interaction) !== 'instance' || interaction.get('workitem')) {\n            return;\n        }\n\n        const targetConversation: Extract<AppContext, { type: 'conversation' }> = {\n            type: 'conversation',\n            payload: interaction as any,\n            id: interaction.id\n        };\n\n        try {\n            targetConversation.payload.set('videoConferenceCreationInProgress', true);\n            targetConversation.payload.set('isVideoActive', true);\n            const communicationId = targetConversation.payload.get('agentCommunicationId');\n\n            // Make API call to create a video conference for the conversation.\n            const url = this.get('application').pcV2Uri(\n                `api/v2/conversations/videos/${interaction.id}/agentconference/communications/${communicationId}`\n            );\n\n            const response = await this.get('ajax').post(url);\n            if (!response.communicationId) {\n                this._handleVideoError(targetConversation);\n            }\n        } catch (e) {\n            this._handleVideoError(targetConversation);\n        } finally {\n            // To re-enable the button back in case where POST request returns 200 but hawk fails to update\n            run.later(\n                () => {\n                    if (targetConversation.payload.get('videoConferenceCreationInProgress')) {\n                        this._handleVideoError(targetConversation);\n                    }\n                },\n                isTesting ? 100 : 5000\n            );\n        }\n    },\n\n    _handleVideoError(interaction: Extract<AppContext, { type: 'conversation' }>) {\n        this.get('stashLogger').error(\n            appUtils.buildInterapptionsLogMsg('Failed to create video conference.', PROVIDER_LOG_NAMESPACE),\n            {\n                interaction,\n                remoteData: {\n                    interactionId: interaction.id,\n                    type: interaction.type\n                }\n            }\n        );\n        interaction.payload.set('videoConferenceCreationInProgress', false);\n        interaction.payload.set('isVideoActive', false);\n    },\n\n    _getActiveVideoRoomJid(interaction: Extract<AppContext, { type: 'conversation' }>): string | undefined {\n        const agent = interaction.payload.get('participantForCurrentUser');\n        if (!agent || !agent.videos) {\n            return;\n        }\n        const videos = agent.videos;\n        const activeConference = videos.find(\n            (conference: { state: string }) => conference.state === 'connected' || conference.state === 'contacting'\n        );\n        return activeConference?.context;\n    }\n});\n\nconst buildVideoIframeApp = (gadgetOrigin: string, displayName?: string, roomJId?: string): IframeAppDef => {\n    const voltUrl = `${gadgetOrigin}/volt/${\n        getVoltFeatureBranch() ? getVoltFeatureBranch() + '/' : ''\n    }#/media/${roomJId}?appsV2=true`;\n    return {\n        id: 'video',\n        displayName: displayName,\n        type: 'iframe',\n        sandbox: [\n            'allow-same-origin',\n            'allow-scripts',\n            'allow-modals',\n            'allow-popups',\n            'allow-forms',\n            'allow-presentation'\n        ],\n        allow: ['camera', 'microphone', 'display-capture', 'autoplay'],\n        src: new URL(voltUrl),\n        monochromicIcon: {\n            type: 'sparkV3SvgSprite',\n            classNames: ['toolbar-video']\n        },\n        startBehavior: 'eager',\n        trustedDataPassing: true,\n        lifecycleConfig: {\n            bootstrap: true,\n            focus: true,\n            blur: true,\n            stop: true,\n            // Added a longer bootstrap timeout to handle reduced network conditions\n            bootstrapTimeoutMillis: 15000,\n            bootstrapReadyTimeoutMillis: 15000,\n            loadTimeoutMillis: 15000\n        }\n    };\n};\n\nexport const boolExpr = and(ft('PURE-5422_video-chat-ftv2'), perm('conversation:video:add'));\n","// Imports\nimport EmberObject, { computed } from '@ember/object';\nimport { bool } from '../utils/boolean-expressions';\nimport { inject } from '@ember/service';\nimport { AppDef } from '@genesys/apps-v2-host';\nimport { resolve } from 'rsvp';\nimport { validatePortNumber } from 'web-directory/utils/app-provider';\nimport { AppContext, WorkitemAppContext } from 'web-directory/utils/apps';\n\nexport default EmberObject.extend({\n    // Injections\n    application: inject('application'),\n    intl: inject('intl'),\n    permissions: inject('permissions'),\n    session: inject('session'),\n    // Attributes\n    id: 'workitemDetailsGadgetProvider',\n    type: 'programmatic',\n    group: 'conversation',\n    trustedProvider: true,\n    monitorInteractionUpdates: true,\n    // Derived\n    gadgetTargetOrigin: computed<string>('application.runtime', function () {\n        const runtimeEnv = this.get('application.runtime');\n        if (runtimeEnv.local) {\n            return `https://apps.${runtimeEnv.publicDomainName}`;\n        }\n        return window.location.origin;\n    }),\n    // Methods\n    getAppConfigs(interaction: AppContext) {\n        const appDefs: AppDef[] = [];\n        if (interaction?.type === 'workitem' && this.validatePermissions(requiredPermissions, interaction)) {\n            appDefs.push(\n                buildWorkitemDetailsGadgetDef({\n                    gadgetOrigin: this.get('gadgetTargetOrigin'),\n                    displayName: this.get('intl').t('purecloud.acdInteraction.workitem.workitemDetails')\n                })\n            );\n        }\n        return resolve(appDefs);\n    },\n\n    validatePermissions(permissions: string[], interaction: WorkitemAppContext): boolean {\n        const permissionsService = this.get('permissions');\n        return permissions.every(permission =>\n            permissionsService.validateDonutPermission(\n                permission,\n                interaction.payload.workitem.divisionId || (interaction.payload.workitem as any).division?.id\n            )\n        );\n    }\n});\n\nexport const requiredPermissions = ['workitems:workitem:view'];\n\nexport const boolExpr = bool('true');\n\nconst WORKITEM_GADGETS_SERVICE_NAME = 'task-management-workitem-gadgets';\n\n// Allow use of specific versions of the workitem details gadget via query parameters of Web Directory:\n//  - If workitemsGadgetsVersion is set to local, use localhost version of the gadget (which runs on port 4800 by default, but could be overridden using workitemGadgetPort)\n//  - If workitemsGadgetsVersion is set to something else than local, then it's considered as a time machine version.\n//    For example, a timemachine version is available for branch WORKITEMS-1234-sample-branch-name\n//    So, if Web Directory URL is used with ?workitemsGadgetsVersion=WORKITEMS-1234-sample-branch-name\n//    this time machine version is displayed to the user\nconst getGadgetUrl = (gadgetOrigin: string) => {\n    const urlParams = new URLSearchParams(window.location.search);\n    const version = urlParams?.get('workitemsGadgetsVersion') || '';\n    if (!version) {\n        return `${gadgetOrigin}/${WORKITEM_GADGETS_SERVICE_NAME}/#/gadgets/details`;\n    }\n    if (version === 'local') {\n        return `https://localhost:${validatePortNumber(\n            urlParams.get('workitemGadgetPort') || '',\n            4800\n        )}/#/gadgets/details`;\n    }\n    if (version.match(/^https?:\\/\\//)) {\n        return version;\n    }\n    return `${gadgetOrigin}/${WORKITEM_GADGETS_SERVICE_NAME}/${version}/#/gadgets/details`;\n};\n\nconst buildWorkitemDetailsGadgetDef = ({\n    gadgetOrigin,\n    displayName\n}: {\n    gadgetOrigin: string;\n    displayName: string;\n}): AppDef => {\n    return {\n        id: 'workitemDetailsGadget',\n        displayName,\n        monochromicIcon: {\n            type: 'sparkV3SvgSprite',\n            classNames: ['fa/clipboard-list-regular']\n        },\n        type: 'iframe',\n        startBehavior: 'lazy',\n        src: new URL(getGadgetUrl(gadgetOrigin)),\n        sandbox: [\n            'allow-scripts',\n            'allow-same-origin',\n            'allow-modals',\n            'allow-forms',\n            'allow-popups',\n            'allow-downloads'\n        ],\n        trustedDataPassing: true,\n        lifecycleConfig: {\n            bootstrap: true,\n            bootstrapTimeoutMillis: 15000,\n            bootstrapReadyTimeoutMillis: 15000,\n            loadTimeoutMillis: 15000,\n            focus: true,\n            blur: true,\n            stop: true\n        }\n    };\n};\n","// Imports\nimport EmberObject, { computed } from '@ember/object';\nimport { bool } from '../utils/boolean-expressions';\nimport { inject } from '@ember/service';\nimport { AppDef } from '@genesys/apps-v2-host';\nimport { resolve } from 'rsvp';\nimport { validatePortNumber } from 'web-directory/utils/app-provider';\nimport { AppContext } from 'web-directory/utils/apps';\n\nexport default EmberObject.extend({\n    // Injections\n    permissions: inject('permissions'),\n    application: inject('application'),\n    intl: inject('intl'),\n    session: inject('session'),\n    // Attributes\n    id: 'builtInTaskmanagementInterapptionsProvider',\n    type: 'programmatic',\n    group: 'contextual',\n    trustedProvider: true,\n    monitorInteractionUpdates: true,\n    // Derived\n    gadgetTargetOrigin: computed<string>('application.runtime', function () {\n        const runtimeEnv = this.get('application.runtime');\n        if (runtimeEnv.local) {\n            return `https://apps.${runtimeEnv.publicDomainName}`;\n        }\n        return window.location.origin;\n    }),\n\n    // Methods\n    getAppConfigs(interaction: AppContext) {\n        const appDefs: AppDef[] = [];\n        if (interaction?.type === 'workitem' && interaction.payload.workitem.assignmentState !== 'Alerting') {\n            if (this.validatePermissions(requiredStatusPermissions, interaction)) {\n                appDefs.push(\n                    buildWorkitemStatusGadgetDef({\n                        gadgetOrigin: this.get('gadgetTargetOrigin'),\n                        displayName: this.get('intl').t('purecloud.acdInteraction.workitem.workitemStatus')\n                    })\n                );\n            }\n            if (this.validatePermissions(requiredWrapupPermissions, interaction)) {\n                appDefs.push(\n                    buildWorkitemWrapupGadgetDef({\n                        gadgetOrigin: this.get('gadgetTargetOrigin'),\n                        displayName: this.get('intl').t('purecloud.acdInteraction.workitem.workitemWrapup')\n                    })\n                );\n            }\n        }\n        return resolve(appDefs);\n    },\n\n    validatePermissions(permissions: string[], interaction: Extract<AppContext, { type: 'workitem' }>): boolean {\n        const permissionsService = this.get('permissions');\n        return permissions.every(permission =>\n            permissionsService.validateDonutPermission(permission, interaction.payload.workitem.divisionId)\n        );\n    }\n});\n\nexport const boolExpr = bool('true');\n\nexport const requiredStatusPermissions = [\n    'workitems:workitem:view',\n    'workitems:workitem:edit',\n    'workitems:status:view'\n];\n\nexport const requiredWrapupPermissions = [\n    'workitems:workitem:view',\n    'workitems:wrapup:view',\n    'workitems:wrapupSelf:edit',\n    'routing:queue:view'\n];\n\nconst WORKITEM_GADGETS_SERVICE_NAME = 'task-management-workitem-gadgets';\n\n// Allow use of specific versions of the gadget via query parameters of Web Directory:\n//  - If workitemsGadgetsVersion is set to local, use localhost version of the gadget (which runs on port 4800 by default, but could be overridden using workitemGadgetPort)\n//  - If workitemsGadgetsVersion is set to something else than local, then it's considered as a time machine version.\n//    For example, a timemachine version is available for branch WORKITEMS-1234-sample-branch-name\n//    So, if Web Directory URL is used with ?workitemsGadgetsVersion=WORKITEMS-1234-sample-branch-name\n//    this time machine version is displayed to the user\nconst getGadgetUrl = (gadgetOrigin: string, gadgetRoute: string) => {\n    const urlParams = new URLSearchParams(window.location.search);\n    const version = urlParams?.get('workitemsGadgetsVersion') || '';\n    if (!version) {\n        return `${gadgetOrigin}/${WORKITEM_GADGETS_SERVICE_NAME}/#/gadgets/${gadgetRoute}`;\n    }\n    if (version === 'local') {\n        return `https://localhost:${validatePortNumber(\n            urlParams.get('workitemGadgetPort') || '',\n            4800\n        )}/#/gadgets/${gadgetRoute}`;\n    }\n    if (version.match(/^https?:\\/\\//)) {\n        return version;\n    }\n    return `${gadgetOrigin}/${WORKITEM_GADGETS_SERVICE_NAME}/${version}/#/gadgets/${gadgetRoute}`;\n};\n\nconst buildBaseWorkitemGadgetDef = ({\n    id,\n    displayName,\n    gadgetOrigin,\n    gadgetRoute,\n    iconClassNames\n}: {\n    id: string;\n    displayName: string;\n    gadgetOrigin: string;\n    gadgetRoute: string;\n    iconClassNames: string[];\n}): AppDef => {\n    return {\n        id,\n        displayName,\n        monochromicIcon: {\n            type: 'sparkV3SvgSprite',\n            classNames: iconClassNames\n        },\n        type: 'iframe',\n        startBehavior: 'lazy',\n        src: new URL(getGadgetUrl(gadgetOrigin, gadgetRoute)),\n        sandbox: ['allow-scripts', 'allow-same-origin', 'allow-popups', 'allow-forms', 'allow-downloads'],\n        trustedDataPassing: true,\n        lifecycleConfig: {\n            bootstrap: true,\n            bootstrapTimeoutMillis: 15000,\n            bootstrapReadyTimeoutMillis: 15000,\n            loadTimeoutMillis: 15000,\n            focus: true,\n            blur: true,\n            stop: true\n        }\n    };\n};\n\nconst buildWorkitemStatusGadgetDef = ({\n    gadgetOrigin,\n    displayName\n}: {\n    gadgetOrigin: string;\n    displayName: string;\n}): AppDef => {\n    return buildBaseWorkitemGadgetDef({\n        id: 'taskmanagement-status-panel',\n        displayName,\n        gadgetOrigin,\n        gadgetRoute: 'status',\n        iconClassNames: ['configuration']\n    });\n};\n\nconst buildWorkitemWrapupGadgetDef = ({\n    gadgetOrigin,\n    displayName\n}: {\n    gadgetOrigin: string;\n    displayName: string;\n}): AppDef => {\n    return buildBaseWorkitemGadgetDef({\n        id: 'taskmanagement-wrapup-panel',\n        displayName,\n        gadgetOrigin,\n        gadgetRoute: 'wrapup',\n        iconClassNames: ['clipboard-success']\n    });\n};\n","// Imports\nimport EmberObject, { computed } from '@ember/object';\nimport { inject } from '@ember/service';\nimport { IframeAppDef } from '@genesys/apps-v2-host';\nimport { AppContext } from 'web-directory/utils/apps';\nimport { validatePortNumber } from 'web-directory/utils/app-provider';\nimport { typeOf } from '@ember/utils';\n\nexport default EmberObject.extend({\n    // Injections\n    application: inject('application'),\n    intl: inject('intl'),\n    session: inject('session'),\n    // Attributes\n    id: 'wrapupCodesGadgetProvider',\n    type: 'programmatic',\n    group: 'contextual',\n    trustedProvider: true,\n    monitorInteractionUpdates: true,\n    popoutAuthForIframes: computed.readOnly('session.popoutAuthForIframes'),\n    // Derived\n    gadgetTargetOrigin: computed<string>('application.runtime', function () {\n        const runtimeEnv = this.get('application.runtime');\n        if (runtimeEnv.local) {\n            return `https://apps.${runtimeEnv.publicDomainName}`;\n        }\n        return window.location.origin;\n    }),\n    // Methods\n    async getAppConfigs(appContext: AppContext) {\n        const appDefs: IframeAppDef[] = [];\n        // If appContext is not a conversation (workitem) then the wrapup panel is not displayed\n        if (appContext && appContext.type === 'conversation' && typeOf(appContext.payload) === 'instance') {\n            // Do not show wrapup panel if I am monitoring or coaching the conversation\n            if (\n                appContext.payload.get('myselfIsMonitor') ||\n                appContext.payload.get('myselfIsCoach') ||\n                appContext.payload.get('myselfIsMonitorV2')\n            ) {\n                return appDefs;\n            }\n            // Do not show wrapup panel for some specific outbound cases, otherwise show it\n            const hideAfterCallWork =\n                appContext.payload.get('dialerPreview') &&\n                appContext.payload.get('hasActiveCallback') &&\n                !appContext.payload.get('isExternalCampaign') &&\n                (!(appContext.payload.get('participantForCurrentUser.calls')?.length > 0) ||\n                    appContext.payload.get('hasActiveCall'));\n            if (!hideAfterCallWork) {\n                appDefs.push(\n                    buildWrapupCodesGadgetDef({\n                        gadgetOrigin: this.get('gadgetTargetOrigin'),\n                        displayName: this.get('intl').t('purecloud.acdInteraction.wrapupCode'),\n                        popoutAuthForIframes: this.get('popoutAuthForIframes')\n                    })\n                );\n            }\n        }\n        return appDefs;\n    }\n});\n\nexport const boolExpr = 'bool:true';\n\n// Allow to use specific versions for the Wrapup gadget via query parameters of Web Directory:\n//  - If wrapupGadgetVersion is set to local, use localhost version of the gadget (which runs on port 4040 by default, but could be overridden using wrapupGadgetPort)\n//  - If wrapupGadgetVersion is set to something else than local, then it's considered as a time machine version.\n//    For example, for wrapup, a timemachine version is available for branch feature/AURA-34-genesys-cloud-api-helper\n//    So, if Web Directory URL is used with ?wrapupGadgetVersion=feature/AURA-34-genesys-cloud-api-helper\n//    this time machine version is displayed to the user\nconst getGadgetUrl = (gadgetOrigin: string) => {\n    const urlParams = new URLSearchParams(window.location.search);\n    const version = urlParams?.get('wrapupGadgetVersion') || '';\n    if (!version) {\n        return `${gadgetOrigin}/acw-gadgets-wrap-up/index.html`;\n    }\n    if (version === 'local') {\n        return `https://localhost:${validatePortNumber(urlParams.get('wrapupGadgetPort') || '', 4040)}`;\n    }\n    if (version.match(/^https?:\\/\\//)) {\n        return version;\n    }\n    return `${gadgetOrigin}/acw-gadgets-wrap-up/${version}/index.html`;\n};\n\nconst buildWrapupCodesGadgetDef = ({\n    gadgetOrigin,\n    displayName,\n    popoutAuthForIframes = true\n}: {\n    gadgetOrigin: string;\n    displayName: string;\n    popoutAuthForIframes: boolean;\n}): IframeAppDef => {\n    const urlSearchParams = new URLSearchParams({ usePopupAuth: popoutAuthForIframes.toString() });\n    return {\n        id: 'wrapupCodesGadget',\n        displayName,\n        monochromicIcon: {\n            type: 'sparkV3SvgSprite',\n            classNames: ['clipboard-success']\n        },\n        type: 'iframe',\n        startBehavior: 'lazy',\n        src: new URL(`${getGadgetUrl(gadgetOrigin)}?${urlSearchParams}`),\n        sandbox: ['allow-scripts', 'allow-downloads', 'allow-same-origin', 'allow-popups', 'allow-forms'],\n        allow: ['clipboard-write'],\n        trustedDataPassing: true,\n\n        lifecycleConfig: {\n            bootstrap: true,\n            focus: true,\n            blur: true,\n            stop: true,\n            // For Wrapup and Notes gadget views, the bootstrap period is extended to 15s to keep the \"loading\" AppsV2 message a little bit longer\n            // in case the Wrapup complete panel load takes longer to initialize.\n            // On Wrapup gadget side, 2s before this 15s delay expires, the bootstrap event is sent and the \"loader\" from the gadget is displayed\n            // in case the full data is not yet available (pure defense case, will hopefully never happen in \"real life\").\n            // This mechanism is in place to avoid the weird UI effect where the \"loading\" AppsV2 message will be replaced with the \"loading\" from gadget\n            bootstrapTimeoutMillis: 15000,\n            bootstrapReadyTimeoutMillis: 15000,\n            loadTimeoutMillis: 15000\n        }\n    };\n};\n","import { inject as service } from '@ember/service';\nimport { computed } from '@ember/object';\nimport { _backburner as backburner } from '@ember/runloop';\nimport Application from '@ember/application';\nimport Ember from 'ember';\nimport Resolver from './resolver';\nimport defineModifier from 'ember-concurrency-test-waiter/define-modifier';\nimport loadInitializers from 'ember-load-initializers';\nimport config from './config/environment';\nimport { parseQueryParams } from './utils/query-parser';\n\n// genesys-spark components will be registered via dynamic import\n// to avoid module resolution race conditions with ember-auto-import\n\n/* eslint-disable no-unused-vars */\n// These imports shouldn't need to be assigned to variables, but without\n// importing this way, babel 6 will load them in after the iframe-coordinator\n// module, defeating the point of the polyfills.\nimport shim from '@webcomponents/custom-elements/src/native-shim';\nimport elements from '@webcomponents/custom-elements';\n/* eslint-enable no-unused-vars */\nimport iframeCoordinator from 'iframe-coordinator';\n\n// Enable the iframe-coordinator custom elements\niframeCoordinator.registerCustomElements();\n\nimport { defineCustomElements } from '@genesys/genesys-cloud-webcomponents';\ndefineCustomElements();\n\n/* eslint-disable */\n\nimport HostedContext from './utils/hosted-context';\n\n/* eslint-enable */\n\nif (config.APP && config.APP.LOG_RUNLOOP_STACKTRACE) {\n    backburner.DEBUG = true;\n}\n\nif (config.APP && config.APP.LOG_BINDINGS) {\n    Ember.LOG_BINDINGS = true;\n}\n\n// allows ember concurrency tasks to use withTestWaiter()\ndefineModifier();\n\nconst App = Application.extend(config.APP, {\n    cookies: service('cookies'),\n    stashLogger: service('stash-logger'),\n    applicationService: service('application'),\n    customEvents: {\n        // frame-router events from iframe-coordinator library\n        navRequest: 'navRequest',\n        notifyRequest: 'notifyRequest',\n        modalRequest: 'modalRequest',\n        // Pagination events from inbox-v2\n        pageChanged: 'pageChanged',\n        itemsPerPageChanged: 'itemsPerPageChanged',\n        // GCW Events\n        favoriteEvent: 'favoriteEvent',\n        contactEvent: 'contactEvent',\n        navigateToProfileEvent: 'navigateToProfileEvent',\n        // GUX Events\n        guxdismiss: 'guxdismiss'\n    },\n    checkAccessibility: () => {\n        if (window.axeLive) {\n            window.axeLive.run({\n                runOnly: {\n                    type: 'tag',\n                    values: ['wcag2a', 'wcag2aa', 'wcag21aa']\n                }\n            });\n        }\n    },\n\n    modulePrefix: config.modulePrefix,\n    podModulePrefix: config.podModulePrefix,\n    Resolver,\n\n    entityTypes: ['person', 'group'], //TODO - 10/12/14 - Is this used anymore?\n\n    currentRouteName: null, // Set by ApplicationController\n\n    debug: false,\n\n    init() {\n        this.initVersion();\n        this.initContext();\n        return this._super(...arguments);\n    },\n\n    isImpersonating: computed('session.person.id', function () {\n        var proxyPersonId = this.cookies.read('proxyPerson');\n\n        if (proxyPersonId) {\n            return proxyPersonId === this.get('session.person.id');\n        }\n\n        return false;\n    }),\n\n    iframed() {\n        try {\n            return window.self !== window.top;\n        } catch (e) {\n            return true;\n        }\n    },\n\n    initVersion() {\n        Ember.libraries.register('PureCloud Collaborate', this.semver);\n\n        if (!Ember.ENV.LOG_VERSION) {\n            console.debug('PureCloud Collaborate', this.semver);\n        }\n\n        const libs = this.libs || {};\n        Object.keys(libs).forEach(key => {\n            const version = libs[key];\n            Ember.libraries.register(key, version);\n            if (!Ember.ENV.LOG_VERSION) {\n                console.debug(key, version);\n            }\n        });\n    },\n\n    initContext() {\n        var params = parseQueryParams();\n\n        if (params.context === 'adminui' && this.iframed()) {\n            // we don't want to hide the navigation 'chrome' unless iframed\n            this.set('context', 'adminui');\n        } else {\n            this.set('context', 'directory');\n        }\n    },\n\n    // Debugging utility functions...not for use in app logic\n    controllerFor(name) {\n        return this.instance.lookup(`controller:${name}`);\n    },\n\n    // Debugging utility functions...not for use in app logic\n    serviceFor(name) {\n        return this.instance.lookup(`service:${name}`);\n    },\n\n    // Debugging utility functions...not for use in app logic\n    componentFor(id) {\n        return this.instance.lookup('-view-registry:main')[id];\n    },\n\n    listAsync() {\n        this.resolveRegistration('util:debug-backburner').logTimerQueue();\n        this.resolveRegistration('util:debug-rsvp').logPendingPromises();\n    },\n\n    promiseStackFor(id) {\n        this.resolveRegistration('util:debug-rsvp').lookupPromiseStack(id);\n    }\n});\n\nloadInitializers(App, config.modulePrefix);\n\nError.stackTraceLimit = 100;\n\nexport default App;\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"RIF5BWNA\",\"block\":\"[[[10,0],[14,0,\\\"application-loading\\\"],[12],[1,\\\"\\\\n    \\\"],[1,[34,0]],[1,\\\"\\\\n    \\\"],[1,[34,1]],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"auth-loading\\\",\\\"icon-bootstrap\\\"]]\",\"moduleName\":\"web-directory/application-loading/template.hbs\",\"isStrictMode\":false});","import $ from 'jquery';\nimport { inject as service } from '@ember/service';\nimport { computed } from '@ember/object';\nimport { bind } from '@ember/runloop';\nimport RSVP from 'rsvp';\nimport _ from 'lodash';\nimport { REQUEST_TELEMETRY_APP_SUBSECTIONS } from 'web-directory/services/ajax';\nimport Base from 'ember-simple-auth/authenticators/base';\nimport { isUnauthorizedError } from 'ember-ajax/errors';\nimport { POLICY_ACCESS_DENIED_TYPE, SESSION_BOOTSTRAP_ERROR_TYPE } from '../services/session';\nimport serviceDiscoveryWeb from '@genesys/service-discovery-web-internal';\nimport { Host } from '@genesys/gc-mfe-auth';\nimport pcUiAuth from '@purecloud/pc-ui-auth/dist/host';\nimport { AUTH_CONFIG } from '../utils/auth-constants';\nimport netUtils from '../utils/net';\nimport {\n    removeQueryParams,\n    buildRedirectUri,\n    extractQueryParamsByPrefix,\n    mergeQueryParams\n} from '../utils/url-helpers';\nimport { coordinatedAuthenticate } from '../utils/gc-auth-coordinator';\nimport config from '../config/environment';\nimport { getGenesysAppName } from '../utils/genesys-app-name';\n\nexport default Base.extend({\n    ajax: service(),\n    cookies: service(),\n    session: service(),\n    storage: service(),\n    stashLogger: service('stash-logger'),\n    purecloudOauth: service(),\n    applicationService: service('application'),\n\n    // properties formerly from ESA authorizer\n    _authData: null,\n\n    // Flag to track whether a bootstrap retry is pending. When true,\n    // _establishLocalSession's failure path will NOT clear _bootstrapAccessToken,\n    // avoiding a null window that fires downstream observers. (ATLAS-2431)\n    _willRetryBootstrap: false,\n    _ajaxPrefilters: null,\n    _ajaxErrors: null,\n    _onClient401Handler: null,\n    _onAccountSwitchRequestHandler: null,\n\n    init() {\n        this._super(...arguments);\n        this._ajaxPrefilters = $.Callbacks();\n        $.ajaxPrefilter('+*', this._ajaxPrefilters.fire);\n        this._ajaxErrors = $.Callbacks();\n        $(document).ajaxError(this._ajaxErrors.fire);\n    },\n\n    // Check existing authentication\n    restore(data) {\n        if (this.get('session.useGCMFEAuth')) {\n            /*\n             * Reject restore on the gc-mfe-auth path so ESA transitions to\n             * login-oauth, where authenticate() acquires the session.\n             *\n             * Resolving here would not require the token itself — _establishLocalSession\n             * installs it and session.accessToken falls back to _bootstrapAccessToken —\n             * so all restore() would need is to have gc-mfe-auth hand back its existing\n             * session. Two things block that today:\n             *\n             * 1. There is no side-effect-free way to ask. Host exposes no session\n             *    accessor (getEstablishedToken is private), and Host.authenticate()\n             *    starts an OAuth or account-switcher redirect when no session exists.\n             *    Running that inside ESA's restore phase bypasses login-oauth, which\n             *    owns the region-chooser check, the mobile-app offer, and the error\n             *    routing for bootstrap failure, no-access and policy-denied.\n             * 2. ESA would not call restore() on a later load anyway. It only invokes\n             *    the authenticator when the store holds an `authenticator` name, and\n             *    session-stores/application.js skips persisting on this path because\n             *    there is no access_token to write.\n             *\n             * Tracked in ATLAS-2428. (ATLAS-2418)\n             */\n            return RSVP.reject();\n        } else {\n            return this.pcuiauth_restore(data);\n        }\n    },\n\n    pcuiauth_restore(data) {\n        var accessToken = null;\n        if (data && typeof data === 'object') {\n            accessToken = data.access_token;\n        }\n\n        if (!accessToken) {\n            return RSVP.reject();\n        } else {\n            return this._establishLocalSession(accessToken).then(() => {\n                const result = {};\n                AUTH_CONFIG.OAUTH_STORE_PROPS.forEach(key => {\n                    if (key in data) {\n                        result[key] = data[key];\n                    }\n                });\n                return result;\n            });\n        }\n    },\n\n    // Helper methods for window.location access (can be mocked in tests)\n    _getLocationHash() {\n        return window.location.hash;\n    },\n\n    _getLocationPathname() {\n        return window.location.pathname;\n    },\n\n    _getLocationSearch() {\n        return window.location.search;\n    },\n\n    _getLocationHostname() {\n        return window.location.hostname;\n    },\n\n    _replaceHistoryState(newUrl) {\n        window.history.replaceState({}, '', newUrl);\n    },\n\n    _setLocationHash(hash) {\n        window.location.hash = hash;\n    },\n\n    /**\n     * Captures the frame path override params (center-stage-*) from the current\n     * location search into session storage, so they survive the OAuth redirect that\n     * drops the search string. No-op when there are none.\n     */\n    _saveFramePathOverrides() {\n        const overrides = extractQueryParamsByPrefix(this._getLocationSearch(), AUTH_CONFIG.FRAME_PATH_OVERRIDE_PREFIX);\n        if (overrides) {\n            this.storage.setSessionStorageItem(AUTH_CONFIG.FRAME_PATH_OVERRIDE_SEARCH_KEY, overrides);\n        }\n    },\n\n    /**\n     * Merges any stashed frame path overrides back into the given search string.\n     * Keys already present in the search win, so a same-tab paste (where the\n     * overrides never left the URL) is unaffected.\n     *\n     * @param {string} search - The search string to merge into (with/without leading \"?\")\n     * @returns {string} - The merged search string (with leading \"?\" if non-empty)\n     */\n    _restoreFramePathOverrides(search) {\n        const stashed = this.storage.getSessionStorageItem(AUTH_CONFIG.FRAME_PATH_OVERRIDE_SEARCH_KEY);\n        if (!stashed) {\n            return search;\n        }\n        return mergeQueryParams(search, stashed);\n    },\n\n    // Attempt user authentication\n    authenticate(options) {\n        // Save fragment to session storage -- must be done before FT check or the fragment gets lost when it's falsy\n        const locationHash = this._getLocationHash();\n        if (locationHash && locationHash.length > 1 && locationHash !== '#/login-oauth') {\n            this.storage.setSessionStorageItem(AUTH_CONFIG.REDIRECT_FRAGMENT_KEY, locationHash);\n        }\n\n        if (this.get('session.useGCMFEAuth')) {\n            const host = this.get('gcAuthHost');\n            if (!host) {\n                return RSVP.reject({ reason: 'gcAuthHostUnavailable' });\n            }\n\n            return new RSVP.Promise((resolve, reject) => {\n                const redirectUrl = this._buildRedirectUri();\n\n                // Overwrite fragment if this is a time machine URL\n                const locationPathname = this._getLocationPathname();\n                let match = locationPathname.match(AUTH_CONFIG.TIMEMACHINE_PATH_REGEX);\n                if (match) {\n                    const timeMachineFragment = `${AUTH_CONFIG.TIMEMACHINE_FRAGMENT_PREFIX}${match[1]}`;\n                    this.storage.setSessionStorageItem(AUTH_CONFIG.REDIRECT_FRAGMENT_KEY, timeMachineFragment);\n                }\n\n                // Capture frame path override params (center-stage-*) before the OAuth\n                // redirect. The redirect_uri is normalized to just /directory/, so the\n                // search string — and these overrides with it — is dropped on the round\n                // trip. Stash them so they can be restored to the search on bootstrap,\n                // before the center-stage-frame service reads them at construction.\n                this._saveFramePathOverrides();\n\n                const authOptions = { redirectTo: redirectUrl };\n\n                // Extract account switcher query parameters from URL\n                const searchParams = new URLSearchParams(this._getLocationSearch());\n                const orgName = searchParams.get('orgName');\n                const email = searchParams.get('email');\n\n                // Only add account switcher params if both orgName and email are present\n                if (orgName && email) {\n                    authOptions.orgName = orgName;\n                    authOptions.email = email;\n\n                    // Map hostname to region name\n                    const hostname = this._getLocationHostname();\n                    let regionName;\n\n                    if (hostname === 'localhost' || hostname.startsWith('localhost:')) {\n                        regionName = 'dev';\n                    } else {\n                        // Extract region from hostname (e.g., apps.inindca.com -> inindca)\n                        const match = hostname.match(/apps\\.([^.]+)\\./);\n                        regionName = match ? match[1] : undefined;\n                    }\n\n                    if (regionName) {\n                        authOptions.regionName = regionName;\n                    }\n                }\n\n                this._gcMfeAuthenticateAndBootstrap(host, authOptions, false)\n                    .then(() => {\n                        // Bootstrap succeeded — safe to clean up the redirect fragment\n                        // and frame path overrides from session storage now that they're\n                        // no longer needed for retries.\n                        this.storage.removeSessionStorageItem(AUTH_CONFIG.REDIRECT_FRAGMENT_KEY);\n                        this.storage.removeSessionStorageItem(AUTH_CONFIG.FRAME_PATH_OVERRIDE_SEARCH_KEY);\n\n                        const finalOptions = {};\n                        AUTH_CONFIG.OAUTH_STORE_PARAMS.forEach(key => {\n                            if (key in options) {\n                                finalOptions[key] = options[key];\n                            }\n                        });\n\n                        resolve(finalOptions);\n                    })\n                    .catch(err => {\n                        console.error('err', err);\n                        reject(this._buildAuthRejection(err));\n                    });\n            });\n        } else {\n            return this.pcuiauth_authenticate(options);\n        }\n    },\n\n    // Attempt user authentication\n    pcuiauth_authenticate(options) {\n        return new RSVP.Promise((resolve, reject) => {\n            if (options && (options.error === 'access_denied' || options.scope)) {\n                // Rejecting if the user didn't grant access\n                // Also rejecting if the user granted limited states (for now)\n\n                // No need to redirect to oauth; action will handle\n                reject({ reason: 'noAccess' });\n            } else if (options && options.access_token) {\n                this._establishLocalSession(options.access_token)\n                    .then(() => {\n                        // Internal OAuth2 Auth Successful\n\n                        if (options.state) {\n                            this.purecloudOauth.deserializeRestoreState(options.state);\n                        }\n\n                        /* pick oauth props from the url */\n                        const finalOptions = {};\n                        AUTH_CONFIG.OAUTH_STORE_PARAMS.forEach(key => {\n                            if (key in options) {\n                                finalOptions[key] = options[key];\n                            }\n                        });\n\n                        /* add expiry time before persisting to storage */\n                        if (finalOptions && finalOptions.expires_in) {\n                            finalOptions.token_expiry_time_millis =\n                                this._getCurrMillis() + finalOptions.expires_in * 1000;\n                            finalOptions.token_expiry_time_iso_string = new Date(\n                                finalOptions.token_expiry_time_millis\n                            ).toISOString();\n                        }\n\n                        resolve(finalOptions);\n                    })\n                    .catch(reason => {\n                        if (\n                            reason &&\n                            (reason.type === POLICY_ACCESS_DENIED_TYPE || reason.type === SESSION_BOOTSTRAP_ERROR_TYPE)\n                        ) {\n                            reject({\n                                reason: reason.type,\n                                failedStep: reason.failedStep,\n                                status: reason.status\n                            });\n                            return;\n                        }\n\n                        reject({ reason: 'localSessionFailure' });\n                    });\n            } else {\n                // Initiate OAuth2 Authentication\n                try {\n                    let stateParam = options ? options.state : undefined;\n\n                    // If the user loaded a timemachine URL directly (e.g.\n                    // /directory/<version>/index.html), the timemachine info\n                    // lives in the pathname, not the hash. Infer the correct\n                    // state so the redirect lands back in timemachine mode.\n                    const locationPathname = this._getLocationPathname();\n                    const match = locationPathname.match(AUTH_CONFIG.TIMEMACHINE_PATH_REGEX);\n                    if (match) {\n                        stateParam = `${AUTH_CONFIG.TIMEMACHINE_FRAGMENT_PREFIX}${match[1]}`;\n                    }\n\n                    let authUrl = this._buildAuthUrl(true, stateParam);\n\n                    reject({\n                        authUrl,\n                        reason: 'noToken'\n                    });\n                } catch (err) {\n                    reject({\n                        reason: err && err.message ? err.message : 'invalidAuthEndpoint'\n                    });\n                }\n            }\n        });\n    },\n\n    // Logout\n    invalidate() {\n        // If and when the returned promise is resolved, the token store will be cleaned automatically by ESA\n        return new RSVP.Promise(resolve => {\n            RSVP.allSettled([this._destroyLocalSession(), this._super()]).then(() => {\n                this.deauthorizeAllDomainRequests();\n\n                resolve();\n            });\n        });\n    },\n\n    /**\n     * Extracts the authData from the provided string (or defaults to window.location.hash)\n     *\n     * @returns an object containing the decoded values from the escaped, encoded,\n     * query string style hash params returned by the PC OAuth endpoint.\n     */\n    extractAuthData(hash) {\n        if (typeof hash === 'undefined' && window && window.location) {\n            hash = window.location.hash;\n        }\n\n        if (!hash) {\n            return {};\n        }\n\n        hash = decodeURI(hash.trim());\n        if (hash.indexOf('#') === 0) {\n            hash = hash.slice(1);\n        }\n\n        return hash.split('&').reduce((accumulator, currPair) => {\n            let tokens = currPair.split('=').map(currToken => window.decodeURIComponent(currToken));\n\n            if (tokens[0] && tokens[0].trim().length > 0) {\n                accumulator[tokens[0]] = tokens.length > 1 ? tokens[1] : undefined;\n            }\n\n            return accumulator;\n        }, {});\n    },\n\n    buildAuthorizeUrl(stateParam, org) {\n        return this._buildAuthUrl(true, stateParam, org);\n    },\n\n    buildLogoutUrl() {\n        return this._buildAuthUrl(false);\n    },\n\n    /**\n     * Clean any browser storage (cookies, localStorage, etc) that is not\n     * managed by ESA.\n     */\n    cleanCustomBrowserStorage() {\n        // TECHDEBT: Clear any legacy, pre-oauth, pre-PC cookies\n        // NOTE: this read has never resolved — `cookies` is the ember-cookies service,\n        // which has no `session` property, so this clears nothing. Pre-dates the ESA\n        // refactor; left alone here to keep this fix scoped to 401 handling.\n        this.cookies.clear(this.get('applicationService.cookies.session'));\n        this.storage.removeSessionStorageItem(AUTH_CONFIG.REDIRECT_FRAGMENT_KEY);\n    },\n\n    /**\n     * Performs the gc-mfe-auth token acquisition and session bootstrap.\n     * If the first attempt fails with a bootstrap error (e.g., API rate limiting),\n     * retries once by clearing the active session to force a fresh OAuth flow\n     * and get a new token with a fresh rate limit counter.\n     *\n     * @param {Object} host - The gc-mfe-auth Host instance\n     * @param {Object} authOptions - Authentication options (redirectUrl, orgName, etc.)\n     * @param {boolean} clearSession - Whether to clear the session before authenticating\n     * @returns {RSVP.Promise} Resolves on successful bootstrap, rejects with structured error\n     */\n    _gcMfeAuthenticateAndBootstrap(host, authOptions, clearSession) {\n        return coordinatedAuthenticate(host, authOptions, clearSession)\n            .then(session => {\n                if (!session) {\n                    // gc-mfe-auth returned void — it's handling an OAuth redirect.\n                    // Delay the rejection to give the redirect time to complete.\n                    // If the redirect doesn't happen within 5s, reject so the app\n                    // can show an error rather than hanging indefinitely.\n                    return new RSVP.Promise((_resolve, _reject) => {\n                        setTimeout(() => {\n                            _reject({\n                                reason: 'noAuthToken'\n                            });\n                        }, 5000);\n                    });\n                }\n\n                var accessToken = null;\n                if (session.token && session.token.value) {\n                    // Get access token\n                    accessToken = session.token.value;\n\n                    // Remove switcher query params\n                    const cleanedSearch = removeQueryParams(\n                        this._getLocationSearch(),\n                        AUTH_CONFIG.ACCOUNT_SWITCHER_PARAMS\n                    );\n                    // Restore any frame path override params (center-stage-*) that were\n                    // captured before the OAuth redirect dropped the search string. If\n                    // they already survived (e.g. same-tab paste), merging is a no-op.\n                    const restoredSearch = this._restoreFramePathOverrides(cleanedSearch);\n                    const currentHash = this._getLocationHash();\n                    this._replaceHistoryState(this._getLocationPathname() + restoredSearch + currentHash);\n\n                    // Restore fragment from session storage.\n                    // Note: we do NOT remove the fragment here — it must survive in session\n                    // storage in case bootstrap fails and we retry with a session clear,\n                    // which triggers an OAuth redirect. The fragment is cleaned up after\n                    // bootstrap succeeds (in authenticate's .then handler).\n                    const storedFragment = this.storage.getSessionStorageItem(AUTH_CONFIG.REDIRECT_FRAGMENT_KEY);\n                    const alreadyInTimeMachine =\n                        AUTH_CONFIG.TIMEMACHINE_PATH_REGEX.test(this._getLocationPathname()) &&\n                        storedFragment &&\n                        storedFragment.startsWith(AUTH_CONFIG.TIMEMACHINE_FRAGMENT_PREFIX);\n                    if (storedFragment && !alreadyInTimeMachine) {\n                        this._setLocationHash(storedFragment);\n                    }\n                }\n\n                if (!accessToken) {\n                    return RSVP.reject({ reason: 'noAuthToken' });\n                } else {\n                    return this._establishLocalSession(accessToken);\n                }\n            })\n            .catch(err => {\n                // If bootstrap failed and we haven't already retried with a session clear,\n                // try once more with a fresh token. This handles the case where the current\n                // token is rate-limited (429) — clearing the session forces a new OAuth flow\n                // which yields a token with a fresh rate limit counter.\n                if (!clearSession && err && err.type === SESSION_BOOTSTRAP_ERROR_TYPE) {\n                    this.stashLogger.warn('Bootstrap failed, retrying with session clear to obtain a fresh token', {\n                        remoteData: {\n                            failedStep: err.failedStep,\n                            status: err.status\n                        }\n                    });\n\n                    // Signal to _establishLocalSession's catch block that it should NOT\n                    // clear _bootstrapAccessToken — we're about to replace it with a\n                    // fresh token. Clearing it creates a null window that fires downstream\n                    // observers (webrtc-sdk, webrtc-settings) and leaves them in an\n                    // unrecoverable state. (ATLAS-2431)\n                    this._willRetryBootstrap = true;\n\n                    // Re-save the redirect fragment before retrying. The failed bootstrap's\n                    // cleanup path (cleanCustomBrowserStorage) removes it from session storage,\n                    // but we need it to survive the OAuth redirect that the retry will trigger.\n                    const locationHash = this._getLocationHash();\n                    if (locationHash && locationHash.length > 1 && locationHash !== '#/login-oauth') {\n                        this.storage.setSessionStorageItem(AUTH_CONFIG.REDIRECT_FRAGMENT_KEY, locationHash);\n                    }\n                    // Also re-check for time machine URLs in the pathname\n                    const locationPathname = this._getLocationPathname();\n                    const tmMatch = locationPathname.match(AUTH_CONFIG.TIMEMACHINE_PATH_REGEX);\n                    if (tmMatch) {\n                        const timeMachineFragment = `${AUTH_CONFIG.TIMEMACHINE_FRAGMENT_PREFIX}${tmMatch[1]}`;\n                        this.storage.setSessionStorageItem(AUTH_CONFIG.REDIRECT_FRAGMENT_KEY, timeMachineFragment);\n                    }\n                    // Re-save frame path overrides so they survive the retry's OAuth redirect\n                    this._saveFramePathOverrides();\n\n                    // Reset localSessionDeferred so _establishLocalSession can run again\n                    // with the new token from the retry\n                    this.localSessionDeferred = null;\n\n                    return this._gcMfeAuthenticateAndBootstrap(host, authOptions, true).finally(() => {\n                        this._willRetryBootstrap = false;\n                    });\n                }\n\n                this._willRetryBootstrap = false;\n                return RSVP.reject(err);\n            });\n    },\n\n    /**\n     * Converts an error from _gcMfeAuthenticateAndBootstrap into the structured\n     * rejection format expected by login-oauth.js.\n     *\n     * @param {Object} err - The error from the authenticate/bootstrap flow\n     * @returns {Object} Structured rejection with reason, failedStep, and status\n     */\n    _buildAuthRejection(err) {\n        if (err && err.type === SESSION_BOOTSTRAP_ERROR_TYPE) {\n            return {\n                reason: SESSION_BOOTSTRAP_ERROR_TYPE,\n                failedStep: err.failedStep,\n                status: err.status\n            };\n        } else if (err && err.type === POLICY_ACCESS_DENIED_TYPE) {\n            return {\n                reason: POLICY_ACCESS_DENIED_TYPE,\n                failedStep: err.failedStep,\n                status: err.status\n            };\n        } else {\n            return {\n                reason: err && err.message ? err.message : 'authError'\n            };\n        }\n    },\n\n    _establishLocalSession(accessToken) {\n        if (this.localSessionDeferred) {\n            return this.localSessionDeferred.promise;\n        }\n\n        this.localSessionDeferred = RSVP.defer();\n\n        this.authorizeAllDomainRequests({ access_token: accessToken });\n\n        this.set('session._bootstrapAccessToken', accessToken);\n        this.session\n            .authenticateWithSession()\n            .then(() => {\n                return this.get('session.publicApiUser') ? true : RSVP.reject('unknownSessionId');\n            })\n            .catch(details => {\n                if (this.get('session.user.isSuper') || this.get('session.user.isTrustee')) {\n                    console.warn('Session Bootstrap failed for superuser.  Granting access but please diagnose.');\n                    return true;\n                }\n\n                return RSVP.reject(details);\n            })\n            .then(() => {\n                // Remove them all for good measure\n                this.removeAuthCookie();\n                this.localSessionDeferred.resolve();\n            })\n            .catch(async details => {\n                // Attempt to log the error immediately; unless we know the access token is invalid\n                if (\n                    !details ||\n                    (details.type !== SESSION_BOOTSTRAP_ERROR_TYPE && details.type !== POLICY_ACCESS_DENIED_TYPE) ||\n                    (!details.legacyInvalidSessionToken && details.status !== 403)\n                ) {\n                    await this.ensureLogsSent();\n                }\n\n                this.set('session.hasAppAccess', false);\n\n                // Only clear _bootstrapAccessToken if we are NOT going to retry with a\n                // fresh token. Clearing it creates a null window that fires accessToken\n                // observers, which causes downstream services (webrtc-sdk, webrtc-settings,\n                // preferences) to start work with a null token and never recover.\n                // The retry path in _gcMfeAuthenticateAndBootstrap will overwrite\n                // _bootstrapAccessToken with the fresh token from the new auth attempt.\n                if (!this._willRetryBootstrap) {\n                    this.set('session._bootstrapAccessToken', null);\n                }\n\n                this.cleanCustomBrowserStorage();\n\n                this.deauthorizeAllDomainRequests();\n                this.localSessionDeferred.reject(details);\n            });\n\n        return this.localSessionDeferred.promise;\n    },\n\n    _destroyLocalSession() {\n        return RSVP.resolve()\n            .then(() => {\n                if (this.get('session.useGCMFEAuth')) {\n                    const host = this.get('gcAuthHost');\n                    if (host) {\n                        return host.clearActiveSession().catch(err => {\n                            console.warn('clearActiveSession failed during logout', err);\n                        });\n                    } else {\n                        console.warn('gcAuthHost not available during session destruction');\n                    }\n                }\n            })\n            .then(() => {\n                this.set('session._bootstrapAccessToken', null);\n                this.cleanCustomBrowserStorage();\n            });\n    },\n\n    _buildAuthUrl(login, stateParamValue, targetOrg) {\n        const baseAuthUri = this.get('applicationService.authUri');\n        const clientId = this.get('oauthProps.clientId');\n\n        if (!baseAuthUri || baseAuthUri.trim().length === 0) {\n            throw new Error('missingAuthUri');\n        }\n\n        if (!clientId || clientId.trim().length === 0) {\n            throw new Error('unknownClientId');\n        }\n\n        var oauthParams = {\n            response_type: 'token',\n            client_id: clientId,\n            enableRegionSwitching: true\n        };\n\n        // redirect_uri param — use buildRedirectUri to normalize the pathname\n        // to only the first path segment (e.g. /directory/), avoiding branch\n        // paths like /directory/feature/BRANCH_NAME/ that won't match the\n        // registered OAuth redirect_uri.\n        oauthParams.redirect_uri = this._buildRedirectUri();\n\n        // state param\n        if (login && stateParamValue) {\n            oauthParams.state = stateParamValue;\n        }\n\n        // target used for proxy login\n        if (targetOrg) {\n            oauthParams.target = targetOrg;\n        }\n\n        // Build Auth URL\n        let authUrl = baseAuthUri;\n        authUrl += login === true ? AUTH_CONFIG.LOGIN_PATH : AUTH_CONFIG.LOGOUT_PATH;\n\n        if (authUrl.indexOf('?') === -1) {\n            authUrl += '?';\n        } else {\n            authUrl += '&';\n        }\n\n        authUrl += $.param(oauthParams, true);\n\n        return authUrl;\n    },\n\n    _buildRedirectUri() {\n        const location = {\n            origin: window.location.origin,\n            protocol: window.location.protocol,\n            host: window.location.host,\n            pathname: window.location.pathname\n        };\n\n        return buildRedirectUri(location);\n    },\n\n    /**\n     * These cookies are extremely legacy and pre-date even oauth.\n     * Our backend services \"should not\" still be honoring them but we'll continue to force delete them in case a legacy client logs in.\n     * If/When ININ-Auth-Api support is fully removed, we should be safe to finally kill this off\n     */\n    removeAuthCookie() {\n        const cookies = this.cookies;\n        // Clean up any previously-set, now invalid cookies\n        cookies.clear(AUTH_CONFIG.AUTH_COOKIE_NAME);\n        cookies.clear(AUTH_CONFIG.AUTH_COOKIE_NAME, { path: '/' });\n        cookies.clear(AUTH_CONFIG.AUTH_COOKIE_NAME, { path: '/realtime' });\n    },\n\n    /*\n     * Attempt to immediately flush all queued logs\n     */\n    async ensureLogsSent() {\n        // Logs need to go out when the session screws up, before anything else\n        // happens, but ignore errors from this itself\n        // As long as its not an invalid sesson...\n        try {\n            await this.stashLogger.immediateSaveLogs();\n        } catch (_e) {\n            // We are ignoring this, continue with rejection\n        }\n    },\n\n    // exposed for test mocking\n    _getCurrMillis() {\n        return Date.now();\n    },\n\n    /*\n     * Bring over functions from deprecated authorizer, following Ember Simple Auth upgrade\n     */\n\n    /**\n     * Returns true if:\n     * The current environment is development\n     * The current environment is proxied to a PC deployed env\n     * The provided url is on or a sub-domain of the PC TLD.\n     *\n     * Currently, this utility doesn't require that the provided url be remote.\n     * This allows you to be serving locally off of `localhost.mypurcloud.com:4300`\n     * and append the auth token to a `localhost:4300/sca` url.\n     */\n    _isAbsPathOfProxiedEnv(url) {\n        if (!url) {\n            return false;\n        }\n\n        let result = false;\n\n        let envDetails = this.get('applicationService.envDetails');\n        if (config.environment === 'development' && envDetails && envDetails.local) {\n            // Currently proxying.  Test if url is our tgt env\n            try {\n                let tgtEnvDetails = netUtils.getEnvDetails(url);\n\n                result = envDetails.env === tgtEnvDetails.env;\n            } catch (unknownEnv) {\n                result = false;\n            }\n        }\n\n        return result;\n    },\n\n    _isWhitelistedUrl(url) {\n        return !!url && url.indexOf(this.get('applicationService.purecloudV2BaseUri')) === 0;\n    },\n\n    _isGcPublicApiUrl(url) {\n        if (!url) {\n            return false;\n        }\n        const pubApiBase = this.get('applicationService.purecloudV2BaseUri');\n        const pubApiProxyBase = this.get('applicationService.purecloudBaseUri');\n        return [pubApiBase, pubApiProxyBase].some(currBase => {\n            return currBase && typeof currBase === 'string' && url.indexOf(currBase) === 0;\n        });\n    },\n\n    _handleUnauthorizedRequests(event, jqXHR, settings, thrownError) {\n        /*\n         * isAuthenticated/logoutInProgress checks avoid handling expected 401s and logging false positives in sumo.\n         *\n         * Ex:\n         *   Attempting restore with an expired token\n         *   Ajax request failing after logout requested\n         */\n        if (\n            jqXHR.status === 401 &&\n            !jqXHR.skipPurecloudUnauthorizedCheck &&\n            !!this.get('session.isAuthenticated') &&\n            !this.get('session.logoutInProgress') &&\n            (settings.crossDomain === false ||\n                this._isWhitelistedUrl(settings.url) ||\n                this._isAbsPathOfProxiedEnv(settings.url))\n        ) {\n            /*\n             * Attempt to log this 401 immediately.  If it succeeds, we have a service that is throwing a\n             * 401 that is out of sync with public-api wrt authentication.  The log will make it to\n             * sumo and will not be a false positive.  If it fails due to rate limiting, we're reloading\n             * unconditionally at the moment, so no need to buffer it.\n             */\n            this._sendXhrErrorDetails(settings, thrownError, jqXHR).finally(() => {\n                // Request a new token (remember me) or logout\n                this.session.invalidate({\n                    unauthorized: true\n                });\n            });\n        }\n    },\n\n    /**\n     * Handles a 401 reported by an embedded iframe client.\n     *\n     * The client's token may be stale while ours is still good, so this reports the\n     * event and only invalidates when the report itself comes back unauthorized,\n     * which confirms our own token is dead too.\n     */\n    _handleClientUnauthorizedError(clientId) {\n        const message = `${clientId} reported invalid 401 event. No logout will be triggered.`;\n\n        return this._sendErrorMessage({ message }).catch(error => {\n            // Checking if the session is actually invalid.\n            if (isUnauthorizedError(error)) {\n                this.session.invalidate({\n                    unauthorized: true\n                });\n            }\n        });\n    },\n\n    /**\n     * Reports the details of a 401 so an out-of-sync service can be diagnosed.\n     *\n     * Always resolves. Callers chain session invalidation off this promise, and a\n     * throw here would silently strip the app of its ability to recover from a 401\n     * — which is exactly what happened when this method went missing. (ATLAS-2429)\n     */\n    _sendXhrErrorDetails(settings, thrownError = '', xhr = {}) {\n        const message =\n            '401 encountered while trying to access URL. Automatically requesting new token for user. Check local machine logs.';\n\n        // eslint-disable-next-line no-console\n        console.error(message, {\n            settings,\n            thrownError\n        });\n\n        try {\n            // Don't log to sumo in dev mode\n            if (this.get('applicationService.runtime.local')) {\n                return RSVP.resolve();\n            }\n\n            // Defaulted and non-jqXHR arguments reach this method, so don't assume the API.\n            const correlationId =\n                typeof xhr.getResponseHeader === 'function' ? xhr.getResponseHeader('inin-correlation-id') : null;\n\n            return this._sendErrorMessage(\n                JSON.stringify({\n                    message,\n                    correlationId\n                })\n            );\n        } catch (e) {\n            // eslint-disable-next-line no-console\n            console.error('Failed to report 401 details; continuing with invalidation', e);\n            return RSVP.resolve();\n        }\n    },\n\n    /**\n     * Posts a diagnostic trace for an auth failure.\n     *\n     * The request opts out of the 401 handler via `skipPurecloudUnauthorizedCheck`,\n     * otherwise reporting a 401 could trigger another 401 and recurse.\n     */\n    _sendErrorMessage(messageData) {\n        const url = this.applicationService.pcV2Uri('api/v2/diagnostics/trace');\n\n        return this.ajax.post(url, {\n            beforeSend: jqXHR => {\n                // Add a flag to this request to bypass infinite 401 checking\n                jqXHR.skipPurecloudUnauthorizedCheck = true;\n            },\n            dataType: 'text',\n            data: JSON.stringify({\n                app: {\n                    appId: 'collaborate-ui',\n                    appVersion: this.get('applicationService.semver')\n                },\n                traces: [\n                    {\n                        level: 'ERROR',\n                        time: new Date().toString(),\n                        message: messageData,\n                        topic: 'collaborate-ui.service:session'\n                    }\n                ]\n            })\n        });\n    },\n\n    _addHeadersPrefilter(options, original, jqXHR) {\n        if (!options.crossDomain || this._isWhitelistedUrl(options.url) || this._isAbsPathOfProxiedEnv(options.url)) {\n            const excludeAuthHeaderForFax = this.isFaxUpload(options.url);\n            const headers = this._buildHeaders(this._authData);\n\n            if (excludeAuthHeaderForFax && headers.Authorization) {\n                // fax upload using Darth service has its own authentication headers\n                delete headers.Authorization;\n            }\n\n            _.forEach(headers, (headerValue, headerName) => {\n                jqXHR.setRequestHeader(headerName, headerValue);\n            });\n        }\n\n        if (this._isGcPublicApiUrl(options.url)) {\n            const headerTokens = [...this.appContextHeaderTokens];\n\n            // App Subsection\n            // Read the `original` options param which are the unmodified options from the caller\n            if (\n                original &&\n                typeof original === 'object' &&\n                Object.prototype.hasOwnProperty.call(original, REQUEST_TELEMETRY_APP_SUBSECTIONS)\n            ) {\n                const subsection = original[REQUEST_TELEMETRY_APP_SUBSECTIONS];\n                // Delete this prop so it doesn't get sent with the request\n                delete original[REQUEST_TELEMETRY_APP_SUBSECTIONS];\n\n                let subsectionTokens = Array.isArray(subsection)\n                    ? subsection\n                    : typeof subsection === 'string'\n                    ? [subsection]\n                    : null;\n\n                if (!subsectionTokens || subsectionTokens.some(curr => typeof curr !== 'string')) {\n                    // log and ignore when encountering any invalid subsection types\n                    this.stashLogger.error('Received invalid subsection for Genesys-App header', {\n                        remoteData: {\n                            type: typeof subsection,\n                            subsection\n                        }\n                    });\n                } else {\n                    // This check is strictly for dev logging\n                    // We drop slashes when building the final header value\n                    if (subsectionTokens.some(currToken => currToken.includes('/'))) {\n                        this.stashLogger.warn('Dropping invalid \"/\" char found in Genesys-App header subsection', {\n                            remoteData: {\n                                type: typeof subsection,\n                                subsection\n                            }\n                        });\n                    }\n                    headerTokens.push(...subsectionTokens);\n                }\n            }\n\n            // Escape `/` with `_` as slashes are our token separators\n            const finalHeader = headerTokens.map(curr => curr.trim().replace(/\\//g, '_')).join('/');\n            jqXHR.setRequestHeader('Genesys-App', finalHeader);\n        }\n    },\n\n    // Build Genesys-App header tokens for API requests\n    // Format: ['directory-webui', 'version-info', 'browser|desktop']\n    appContextHeaderTokens: computed(\n        'applicationService.semver',\n        'applicationService.hostedContext.isHostedProp',\n        'applicationService.isPopout',\n        function () {\n            const appName = getGenesysAppName({\n                semver: this.get('applicationService.semver'),\n                isHosted: this.get('applicationService.hostedContext.isHostedProp'),\n                isPopout: this.get('applicationService.isPopout')\n            });\n            // Split the full name into tokens: \"directory-webui/11.1.0/browser\" → ['directory-webui', '11.1.0', 'browser']\n            return appName ? appName.split('/') : ['directory-webui'];\n        }\n    ),\n\n    gcAuthHost: computed(\n        'session.useGCMFEAuth',\n        'oauthProps.clientId',\n        'applicationService.semver',\n        'applicationService.hostedContext.isHostedProp',\n        'applicationService.isPopout',\n        function () {\n            if (this.get('session.useGCMFEAuth')) {\n                return new Host(\n                    this.get('oauthProps.clientId'),\n                    getGenesysAppName({\n                        semver: this.get('applicationService.semver'),\n                        isHosted: this.get('applicationService.hostedContext.isHostedProp'),\n                        isPopout: this.get('applicationService.isPopout')\n                    })\n                );\n            }\n        }\n    ),\n\n    authorizeAllDomainRequests: function (authData) {\n        this.set('_authData', authData);\n\n        this._ajaxPrefilters.add(this._addHeadersPrefilter.bind(this));\n        this._ajaxErrors.add(bind(this, '_handleUnauthorizedRequests'));\n\n        const onClient401 = msg => {\n            if (msg.origin === window.origin) {\n                this._handleClientUnauthorizedError(msg.client);\n            } else {\n                this.stashLogger.warn('Received unexpected cross-orgin 401 notification from iframe client', {\n                    client: msg.client,\n                    origin: msg.origin\n                });\n                this._handleClientUnauthorizedError(msg.client);\n            }\n        };\n\n        const onAccountSwitchRequest = message => {\n            /**\n             * interface AccountSwitchRequestMessage {\n             *   authOptions: {\n             *     allowAccountSelection?: boolean;\n             *     orgName: string;\n             *     redirectUrl?: string;\n             *     regionName: string;\n             *     email: string;\n             *   };\n             *   client: string;\n             *   origin: string;\n             * }\n             */\n\n            // Get regional hostname\n            let regionName = message.authOptions.regionName;\n            let environments;\n\n            try {\n                environments = serviceDiscoveryWeb.getEnvironments({});\n\n                if (!environments || !Array.isArray(environments)) {\n                    throw new Error('Service discovery returned invalid data');\n                }\n            } catch (error) {\n                this.stashLogger.error('Failed to get environments from service discovery', { error });\n                return;\n            }\n\n            let environment = environments.find(env => env.name === regionName);\n\n            if (!environment && regionName === 'localhost') {\n                environment = {\n                    name: 'localhost',\n                    env: 'localhost',\n                    region: 'us-east-1',\n                    status: 'stable',\n                    publicDomainName: 'localhost:4300',\n                    publicDomainAliases: []\n                };\n            }\n\n            // Validate parameters\n            if (!environment || !environment.publicDomainName) {\n                this.stashLogger.error('Received invalid region name for account switch request', {\n                    regionName: message.authOptions.regionName\n                });\n                return;\n            } else if (!message.authOptions.orgName || !message.authOptions.email) {\n                this.stashLogger.error('Received invalid account switch request - missing orgName or email', {\n                    message\n                });\n                return;\n            }\n\n            // Redirect to requested app\n            let hostname = environment.publicDomainName;\n            if (regionName !== 'localhost') {\n                hostname = `apps.${environment.publicDomainName}`;\n            }\n            const appsLink = `https://${hostname}${window.location.pathname}?${new URLSearchParams({\n                orgName: message.authOptions.orgName,\n                email: message.authOptions.email\n            }).toString()}`;\n            window.location.href = appsLink;\n        };\n\n        // Store handlers for cleanup\n        this.set('_onClient401Handler', onClient401);\n        this.set('_onAccountSwitchRequestHandler', onAccountSwitchRequest);\n\n        if (this.get('session.useGCMFEAuth')) {\n            const host = this.gcAuthHost;\n            if (host) {\n                host.onClient401(onClient401);\n                host.onAccountSwitchRequest(onAccountSwitchRequest);\n            } else {\n                this.stashLogger.error('GC Auth Host is not available');\n            }\n        } else {\n            pcUiAuth.onClient401(onClient401);\n        }\n    },\n\n    deauthorizeAllDomainRequests: function () {\n        this.set('_authData', null);\n\n        this._ajaxPrefilters.empty();\n        this._ajaxErrors.empty();\n\n        // Clean up event handlers to prevent memory leaks\n        if (this.get('session.useGCMFEAuth')) {\n            const host = this.gcAuthHost;\n            if (host && this._onClient401Handler) {\n                // Note: gc-mfe-auth may not provide an off/removeListener method\n                // If memory leaks occur, this may need to be addressed in the library\n                this.set('_onClient401Handler', null);\n                this.set('_onAccountSwitchRequestHandler', null);\n            }\n        }\n    },\n\n    /**\n     * Builds the headers object for jQuery AJAX prefilter requests.\n     * Migrated from the removed authorizer (ESA 4.x removes the authorizer concept).\n     */\n    _buildHeaders(authData) {\n        const HASH_LENGTH_LIMIT = 4976;\n        let hash = window.location.hash;\n\n        hash = hash.length > HASH_LENGTH_LIMIT ? hash.slice(0, HASH_LENGTH_LIMIT) : hash;\n\n        const headers = {\n            'ININ-Client-Path': hash\n        };\n\n        if (authData && authData.access_token) {\n            headers['Authorization'] = `bearer ${authData.access_token}`;\n        }\n\n        return headers;\n    },\n\n    /**\n     * Returns true if the URL is a fax upload endpoint (Darth service),\n     * which uses its own authentication headers.\n     */\n    isFaxUpload(url) {\n        return !!url && url.indexOf('fax-uploads') > -1;\n    }\n});\n","import RSVP from 'rsvp';\nimport DirectoryAuthenticator from './directory';\n\nexport default DirectoryAuthenticator.extend({\n    restore(data) {\n        return RSVP.resolve(data);\n    },\n\n    // Fake out user authentication\n    authenticate(options) {\n        return this._super(options);\n    }\n});\n","import FrameRouter from 'web-directory/components/frame-router/component';\nimport { FrameRouterElement } from 'iframe-coordinator';\nimport { Maybe } from 'web-directory/types';\nimport { inject } from '@ember/service';\nimport { task } from 'ember-concurrency';\nimport { parseQueryParams } from 'web-directory/utils/query-parser';\n\n// Constants for account switcher configuration\nconst ACCOUNT_SWITCHER_CONFIG = {\n    LOCALHOST_HOSTNAME: 'localhost',\n    LOCALHOST_PORT: '4200',\n    DEFAULT_DEV_HOSTNAME: 'https://apps.inindca.com',\n    APP_PATH: '/account-switcher',\n    EMBEDDED_PATH: '/embedded/'\n};\n\nexport default FrameRouter.extend({\n    classNames: ['account-switcher-frame-router'],\n    intlService: inject('intl'),\n    purecloudOauth: inject('purecloud-oauth' as any),\n    logger: inject('stash-logger'),\n    route: '/',\n    frame: null as Maybe<FrameRouterElement>,\n\n    // Helper methods for window.location access (can be mocked in tests)\n    _getLocationHostname(): string {\n        return window.location.hostname;\n    },\n\n    _getLocationOrigin(): string {\n        return window.location.origin;\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        // Use requestAnimationFrame to ensure DOM is fully rendered\n        // This is more reliable than an arbitrary timeout\n        requestAnimationFrame(() => {\n            requestAnimationFrame(() => {\n                try {\n                    if (!this.isDestroyed && !this.isDestroying) {\n                        this.get('setupFrames').perform();\n                    }\n                } catch (error: any) {\n                    this.get('logger').error('Account Switcher Frame Router - Unable to initialize.', error);\n                }\n            });\n        });\n    },\n\n    /**\n     * Helper function to generate TimeMachine URL for account-switcher.\n     * Allows using cleaner query parameters like ?account-switcher=123\n     * instead of the full escaped path.\n     *\n     * @param version - The version identifier or 'local' for local development\n     * @returns The complete URL for the account-switcher\n     */\n    timeMachineUrl(version: string): string {\n        const isLocalhost = this._getLocationHostname() === ACCOUNT_SWITCHER_CONFIG.LOCALHOST_HOSTNAME;\n\n        // Handle 'local' version\n        if (version === 'local') {\n            if (!isLocalhost) {\n                console.warn(\n                    'The \"local\" version can only be used when running on localhost. Using default URL instead.'\n                );\n                version = 'embedded';\n            } else {\n                // For local development - adjust port as needed\n                return `https://${ACCOUNT_SWITCHER_CONFIG.LOCALHOST_HOSTNAME}:${ACCOUNT_SWITCHER_CONFIG.LOCALHOST_PORT}${ACCOUNT_SWITCHER_CONFIG.APP_PATH}${ACCOUNT_SWITCHER_CONFIG.EMBEDDED_PATH}`;\n            }\n        }\n\n        // Determine hostname\n        const hostname = isLocalhost ? ACCOUNT_SWITCHER_CONFIG.DEFAULT_DEV_HOSTNAME : this._getLocationOrigin();\n\n        // Build URL\n        if (version) {\n            return `${hostname}${ACCOUNT_SWITCHER_CONFIG.APP_PATH}/${version}${ACCOUNT_SWITCHER_CONFIG.EMBEDDED_PATH}`;\n        } else {\n            return `${hostname}${ACCOUNT_SWITCHER_CONFIG.APP_PATH}${ACCOUNT_SWITCHER_CONFIG.EMBEDDED_PATH}`;\n        }\n    },\n\n    /**\n     * Initializes this host frame with the client including\n     * the environmental data required by the client.\n     */\n    setupFrames: task(function* (this: any) {\n        try {\n            yield this.get('setupStreaming').perform();\n        } catch (error: any) {\n            this.get('logger').error('Account Switcher Frame Router - Failed to establish streaming proxy.', error);\n        }\n\n        // Default URL\n        let appUrl = `${window.location.origin}/account-switcher/embedded/`;\n\n        // Check for query parameter override for debugging/diagnosis\n        // Usage: ?account-switcher=123 or ?account-switcher=local\n        const queryParams = parseQueryParams() as Record<string, string>;\n        const urlOverride = queryParams['account-switcher'];\n\n        appUrl = this.timeMachineUrl(urlOverride || '');\n\n        const clientConfig = {\n            clients: {\n                'account-switcher': {\n                    url: appUrl,\n                    assignedRoute: '',\n                    sandbox: 'allow-storage-access-by-user-activation'\n                }\n            },\n            envData: {\n                locale: this.get('intlService').get('isoLocale'),\n                hostRootUrl: window.location.origin,\n                custom: {\n                    oauth_client_id: this.get('purecloudOauth').getClientId()\n                }\n            }\n        };\n        (this.element as FrameRouterElement).clientConfig = clientConfig;\n\n        this.setupToasts();\n\n        this.set('frame', this.element as FrameRouterElement);\n    }),\n\n    /**\n     * Publish a message to the client.\n     *\n     * @param topic to publish on.\n     * @param payload data to publish.\n     */\n    publishToClient(topic: string, payload: any) {\n        (this.element as FrameRouterElement).publish({\n            topic,\n            payload\n        });\n    }\n});\n","import { getOwner } from '@ember/application';\nimport Component from '@ember/component';\nimport { computed, defineProperty, get, getProperties } from '@ember/object';\nimport { debounce, later } from '@ember/runloop';\nimport { inject } from '@ember/service';\nimport { typeOf } from '@ember/utils';\nimport { AppPool } from '@genesys/apps-v2-host';\nimport type { CommunicationType, WorkitemInteraction } from '@genesys/genesys-cloud-conversation-utils';\nimport Ember from 'ember';\nimport RSVP from 'rsvp';\nimport { CALL_CONVERSATION_CREATED_EVENT } from 'web-directory/services/acdcall';\nimport { EMAIL_CONVERSATION_CREATED_EVENT } from 'web-directory/services/acdemail';\nimport { MESSAGE_CONVERSATION_CREATED_EVENT } from 'web-directory/services/acdsms';\nimport { WORKITEM_ASSIGNMENT_STATE_CHANGED_EVENT } from 'web-directory/services/acdworkitem';\nimport { ANSWER_INTERACTION_EVENT } from 'web-directory/services/interaction';\nimport type { Conversation, Maybe } from 'web-directory/types';\nimport { singularizeMediaType } from 'web-directory/utils/acd-ts';\nimport { _buildAppProviderComputed, _buildProviderConfig } from 'web-directory/utils/app-provider';\nimport { _buildWorkerProviderComputed } from 'web-directory/utils/worker-provider';\nimport appUtils, { AppContext, AppDefV1Asset } from 'web-directory/utils/apps';\nimport { isDestroyed } from 'web-directory/utils/objects';\nimport safeSet from 'web-directory/utils/safeSet';\nimport SimpleCache from 'web-directory/utils/simple-cache';\nimport { isTesting } from 'web-directory/utils/testing';\nimport {\n    PanelSetting,\n    addNativeProvider,\n    standardTransformationFtComputedDepKey,\n    transformPanelId,\n    transformPanelSetting\n} from 'web-directory/utils/transform-panels';\nimport { assertNever } from 'web-directory/utils/types';\nimport { AppProvider, ResolvedApp } from '../acd-interactions-panel/interapptions-manager-v2/component';\nimport { computeInteractionKey, getInteractionType } from './interapptions-manager-v2/component';\nimport type { CaseAssociationEntities } from 'web-directory/types/case-types';\n\ntype PanelSettings = Record<string, PanelSetting>;\n\ntype ConversationTask = {\n    type: 'conversation';\n    // TODO: The actual type is an ember model, InteractionModel; use when this type is available.\n    conversation: any;\n};\n\ntype WorkitemTask = {\n    type: 'workitem';\n    workitem: WorkitemInteraction;\n};\n\nexport type InteractionTask = ConversationTask | WorkitemTask;\n\nexport type ScriptState = {\n    scriptAvailable: boolean;\n    changeCount: number;\n};\n\ntype CreateRequestResponse = {\n    conversationId: string;\n};\n\ntype SelectedInteractionTaskComputedResult = null | InteractionTask;\ntype ActiveInteractionTasksComputedResult = InteractionTask[];\n\nexport default Component.extend({\n    /**\n     * using both the `acd-interactions-panel and acd-interactions-panel-v2 so we can continue to have the old component\n     * styling be applied without duplicate code, and also apply styling specific to the new version without\n     * affecting the old.\n     *\n     * Todo: remove one of the classes when single panel is removed (useMultipanel)\n     */\n    classNames: ['acd-interactions-panel', 'acd-interactions-panel-v2', 'chat-panel'],\n\n    acdemail: inject('acdemail'),\n    acdsms: inject('acdsms'),\n    acdcall: inject('acdcall'),\n    acdworkitem: inject('acdworkitem'),\n    agentUIBackend: inject('agent-ui-backend'),\n    ajax: inject('ajax'),\n    application: inject('application'),\n    apps: inject('apps'),\n    externalContacts: inject('external-contacts'),\n    interaction: inject('interaction'),\n    intl: inject('intl'),\n    logger: inject('stash-logger'),\n    notification: inject('notification'),\n    participantName: inject('participant-name'),\n    permissions: inject('permissions'),\n    phone: inject('phone'),\n    queue: inject('queue'),\n    queueToggle: inject('queueToggle'),\n    session: inject('session'),\n    sidebar: inject('sidebar'),\n    commandNav: inject('command-nav'),\n    store: inject('store'),\n    webrtc: inject('webrtc'),\n    webrtcSdk: inject('webrtcSdk'),\n    caseAssociation: inject('case-association'),\n\n    /**\n     * @Attribute\n     * Flag for if the ACD sidebar panel is active (sidebar.showAcdInteractions)\n     */\n    active: false,\n\n    /**\n     * @Attribute\n     * Flag for if the application is in popout mode (e.g. PEF, popout chat, etc)\n     */\n    isPopout: false,\n\n    /**\n     * @Attribute\n     * Flag for if the user's presence is currently \"On Queue\"\n     */\n    onQueue: false,\n\n    /**\n     * @Attribute\n     * The interaction model currently selected in roster\n     */\n    selectedInteraction: null as any,\n\n    /**\n     * @Attribute\n     * The workitem interaction currently selected in roster\n     */\n    selectedWorkitem: null as Maybe<WorkitemInteraction>,\n\n    /**\n     * @Attribute\n     * E911 config data\n     */\n    emergencyLocationData: null as any,\n\n    /**\n     * @Attribute\n     * Flag for is E911 is currently enabled\n     */\n    emergencyLocationOn: null as any,\n\n    /**\n     * @Attribute\n     * Flag for if the Hawk websocket is connected\n     */\n    streamingConnected: false,\n\n    /**\n     * An outbound conversation guid that was created via user action\n     * and should be set as selected once active\n     */\n    requestedInteraction: null as Maybe<string>,\n\n    /**\n     * ID of a workitem that should be set as selected\n     */\n    requestedWorkitemId: null as Maybe<string>,\n\n    /**\n     * Default panel settings which will be fetched for the agent UI backend\n     * on component init\n     */\n    _defaultPanelSettings: null as Maybe<PanelSettings>,\n\n    /**\n     * Full set of registered interapption providers\n     */\n    interapptionProviders: null as any,\n\n    /**\n     * Full set of registered workers providers\n     */\n    workerProviders: null as any,\n\n    cachedDivisionsMap: new SimpleCache<string | undefined>(),\n\n    /**\n     * CannedResponse controls\n     */\n    cannedResponseChatText: null as Maybe<string>,\n    cannedResponseSmsText: null as Maybe<string>,\n    cannedResponseEmailText: null as Maybe<string>,\n    structuredMessage: null as Maybe<string>,\n\n    /**\n     * The state of the communication sidebar. True if fully expanded.\n     */\n    communicationSidebarExpanded: computed.bool('sidebar.communicationSidebarExpanded'),\n\n    defaultPanelSettings: computed(\n        '_defaultPanelSettings',\n        standardTransformationFtComputedDepKey,\n        function (this: any): PanelSettings {\n            const features = this.get('session').get('features');\n            const basePanelSettings = (this.get('_defaultPanelSettings') ?? {}) as PanelSettings;\n            return Object.fromEntries(\n                Object.entries(basePanelSettings).map(([key, currSetting]) => {\n                    const transformedPanel = transformPanelSetting(currSetting, features);\n\n                    if (transformedPanel.type === 'BuiltIn') {\n                        // Append the native provider, if needed.\n                        // Safe to call even if the panelId already includes the native provider\n                        transformedPanel.panelId = addNativeProvider(transformedPanel.panelId);\n                    }\n\n                    return [key, transformedPanel];\n                })\n            );\n        }\n    ),\n\n    /**\n     * v2 Interapption providers for both conversational and contextual gadgets\n     */\n    v2InterapptionProviders: computed('interapptionProviders', 'useAppsV2ConversationInterapptionManager', function () {\n        const useAppsV2ConversationInterapptionManager = this.get('useAppsV2ConversationInterapptionManager');\n        const interapptionProviders: AppProvider[] = this.get('interapptionProviders');\n        return (interapptionProviders || []).filter(curr => {\n            const type = curr.group || 'contextual';\n            switch (type) {\n                case 'conversation':\n                    return useAppsV2ConversationInterapptionManager;\n                case 'contextual':\n                    return true;\n                default:\n                    assertNever(type);\n            }\n        });\n    }),\n\n    appPoolV2: null as AppPool | null,\n    attentionCountPerCompositeId: {} as Record<string, number>,\n    hasConversationAppForCurrInteraction: false,\n    visibleContextualAppsForCurrInteraction: [] as string[],\n    hasContextualFocusModeEnabled: false,\n    hasMainstageFocusModeEnabled: false,\n\n    /**\n     * Interapptions active for subpanels\n     */\n    activeSubPanelInterapptions: null as Maybe<any[]>,\n\n    /**\n     * Key for currently selected subpanel Interapption\n     */\n    selectedSubPanelInterapptionStateKey: null as Maybe<string>,\n\n    /**\n     * Map of interaction script availability\n     */\n    contextualInteractionScriptStateMap: {} as Record<string, ScriptState>,\n\n    /**\n     * The task (conversation, workitem, etc.) currently selected in roster\n     */\n    selectedInteractionTask: computed(\n        'selectedInteraction',\n        'selectedWorkitem',\n        function (): SelectedInteractionTaskComputedResult {\n            const conversation = this.get('selectedInteraction');\n            if (conversation) {\n                return {\n                    type: 'conversation',\n                    conversation\n                };\n            }\n\n            const workitem: WorkitemInteraction = this.get('selectedWorkitem');\n            if (workitem) {\n                return {\n                    type: 'workitem',\n                    workitem\n                };\n            }\n\n            return null;\n        }\n    ),\n    // TODO: Eventually, we should just use InteractionTasks instead of AppContexts in interapption-manager\n    selectedAppContext: computed('selectedInteractionTask', 'activeAppContexts', function (): null | AppContext {\n        const selectedInteractionTask: SelectedInteractionTaskComputedResult = this.get('selectedInteractionTask');\n        if (!selectedInteractionTask) {\n            return null;\n        }\n\n        let selectedTaskId: null | string = null;\n\n        const { type } = selectedInteractionTask;\n        switch (type) {\n            case 'conversation':\n                if (selectedInteractionTask.conversation && get(selectedInteractionTask.conversation, 'id')) {\n                    selectedTaskId = selectedInteractionTask.conversation.id;\n                }\n                break;\n            case 'workitem':\n                if (selectedInteractionTask.workitem.id) {\n                    selectedTaskId = selectedInteractionTask.workitem.id;\n                }\n                break;\n            default:\n                assertNever(type);\n        }\n\n        if (!selectedTaskId) {\n            return null;\n        }\n\n        return (\n            (this.get('activeAppContexts') as AppContext[]).find(\n                currAppContext => currAppContext.id === selectedTaskId\n            ) || null\n        );\n    }),\n\n    activeInteractionTasks: computed(\n        'activeInteractions',\n        'activeInteractions.@each.__interaction_metadata__',\n        'activeWorkitems.@each.workitem',\n        function (): ActiveInteractionTasksComputedResult {\n            let conversations: any[] = this.get('activeInteractions');\n            let workitems: WorkitemInteraction[] = this.get('activeWorkitems');\n\n            let tasks: InteractionTask[] = [];\n\n            if (Array.isArray(conversations)) {\n                const conversationTasks: ConversationTask[] = conversations.map(conversation => {\n                    return { type: 'conversation', conversation };\n                });\n                tasks.push(...conversationTasks);\n            }\n\n            if (workitems) {\n                const workitemTasks: WorkitemTask[] = workitems.map((workitem: WorkitemInteraction) => {\n                    return { type: 'workitem', workitem };\n                });\n                tasks.push(...workitemTasks);\n            }\n\n            return tasks;\n        }\n    ),\n    // TODO: Eventually, just use InteractionTask instances instead of AppContext in interapption-manager\n    activeAppContexts: computed('activeInteractionTasks', function (): AppContext[] {\n        const activeInteractionTasks: ActiveInteractionTasksComputedResult = this.get('activeInteractionTasks');\n        if (!activeInteractionTasks) {\n            return [];\n        }\n\n        return activeInteractionTasks\n            .map<AppContext>(curr => {\n                const type = curr.type;\n                switch (type) {\n                    case 'conversation':\n                        return {\n                            type: 'conversation',\n                            payload: curr.conversation,\n                            id: get(curr.conversation, 'id')\n                        };\n                    case 'workitem':\n                        return {\n                            type: 'workitem',\n                            payload: curr.workitem,\n                            id: curr.workitem.id\n                        };\n                    default:\n                        assertNever(type);\n                }\n                // defensively filter out any malformed tasks that don't have an id property; should not occur.\n            })\n            .filter(currAppContext => currAppContext.id);\n    }),\n\n    forcedPanelSelectionMap: computed('activeAppContexts', standardTransformationFtComputedDepKey, function (): Record<\n        string,\n        string[]\n    > {\n        const activeAppContexts: AppContext[] = this.get('activeAppContexts');\n        const features = this.get('session').get('features');\n        const baseForcedPanelSelectionMap = activeAppContexts\n            .filter((appContext): appContext is Extract<AppContext, { type: 'conversation' }> => {\n                return appContext.type === 'conversation';\n            })\n            .reduce<Record<string, string[]>>((result, appContext) => {\n                const forcedPanels: string[] = [];\n                if (appContext.payload.get('isDisconnected') || appContext.payload.get('isTerminated')) {\n                    forcedPanels.push('wrapupCodesGadget&wrapupCodesGadgetProvider');\n                }\n                const requiresStructuredMessage = this._doesRequireStructuredMessage(appContext.payload);\n                if (requiresStructuredMessage) {\n                    forcedPanels.push('responses&native');\n                }\n                const internalMessagesForCurrentUser = appContext.payload.get(\n                    'participantForCurrentUser.internalMessages'\n                );\n                if (internalMessagesForCurrentUser && internalMessagesForCurrentUser.length > 0) {\n                    forcedPanels.push('consultConversationGadget&consultGadgetProvider');\n                }\n\n                // Auto-open video and cobrowse panels when sessions become active.\n                // This ensures users don't need to manually click to open the panel when a session starts.\n                // This serves as a workaround until we have official support for pinning panels.\n                if (appContext.payload.get('isVideoActive')) {\n                    forcedPanels.push('video&videoProvider');\n                }\n\n                if (appContext.payload.get('cobrowseSessionShareActive')) {\n                    forcedPanels.push('cobrowse&cobrowseProvider');\n                }\n                result[computeInteractionKey(appContext.id, getInteractionType(appContext))] = forcedPanels;\n                return result;\n            }, {});\n\n        // Transform the panel ids as needed\n        return Object.fromEntries(\n            Object.entries(baseForcedPanelSelectionMap).map(([key, forcedPanels]) => {\n                if (forcedPanels.length === 0) {\n                    return [key, []];\n                }\n\n                return [key, forcedPanels.map(panelId => addNativeProvider(transformPanelId(panelId, features)))];\n            })\n        );\n    }),\n\n    /**\n     * State object for panel and sub-components. This houses permissions, feature toggles,\n     * and other state flags used throughout Agent UI to avoid injections everywhere.\n     */\n    state: computed(\n        'selectedInteraction',\n        'selectedWorkitem',\n        'useScripterGadget',\n        'interaction.{activeInteractions,isOnQueue,isTypingInteractions}',\n        'acdworkitem.activeWorkitems',\n        'isPopout',\n        'session.person.id',\n        'streamingConnected',\n        'active',\n        'emergencyLocationData',\n        'emergencyLocationOn',\n        'permissions.{canEmailOnBehalfOfQueue,canSendMessageOnBehalfOfQueue,phoneEnabled,hasExternalContactsViewContactAccess,canViewQueue,canViewCustomerIntents,canViewCaseAssociation}',\n        'externalContacts.contacts.[]',\n        'hideInteractionButtons.[]',\n        'acdemail.draftUpdateHash.[]',\n        'session.useMultipanel',\n        'caseAssociation.{caseAssociationRequestFT,caseAgentWorkitemUIFT}',\n        'session.features.{PURE-6462_CustomerIntents,PURE-5268_digital_messaging_inactivity_handling,PURE-3835,PURE-6191,PURE-5534_OpenMessagingEngagementSourceTagging,PURE-7349_acdConferenceMS3-phase-1}',\n        function (this: any): any {\n            return {\n                // For now, we'll pass just the conversation down as the \"interaction\" for child components\n                // Eventually, we should differentiate between conversations and workitems with either\n                // multiple properties or a discriminated union (InteractionTask)\n                selectedInteraction: this.get('selectedInteraction'),\n                selectedWorkitem: this.get('selectedWorkitem'),\n                activeInteractions: this.get('interaction.activeInteractions'),\n                activeWorkitems: this.get('acdworkitem.activeWorkitems'),\n                isOnQueue: this.get('interaction.isOnQueue'),\n                isPopout: this.get('isPopout'),\n                currentUserId: this.get('session.person.id'),\n                streamingConnected: this.get('streamingConnected'),\n                acdPanelOpen: this.get('active'),\n                isTypingInteractions: this.get('interaction.isTypingInteractions'),\n                hideInteractionButtons: this.get('hideInteractionButtons'),\n                draftUpdateHash: this.get('acdemail.draftUpdateHash'),\n                useMultipanel: this.get('session.useMultipanel'),\n                useNewNav: this.get('session.useNewNav'),\n                externalContacts: {\n                    contacts: this.get('externalContacts.contacts')\n                },\n                e911: {\n                    emergencyLocationData: this.get('emergencyLocationData'),\n                    emergencyLocationOn: this.get('emergencyLocationOn')\n                },\n                permissions: {\n                    canCreateEmail: this.get('permissions.canEmailOnBehalfOfQueue'),\n                    canSendMessage: this.get('permissions.canSendMessageOnBehalfOfQueue'),\n                    canMakeCall: this.get('permissions.phoneEnabled'),\n                    canViewExternalContacts: this.get('permissions.hasExternalContactsViewContactAccess'),\n                    canViewQueue: this.get('permissions.canViewQueue'),\n                    canViewCustomerIntents: this.get('permissions.canViewCustomerIntents')\n                },\n                featureToggles: {\n                    acdAnswerFocusFix: this.get('session.features.acdAnswerFocusFix'),\n                    acdExternalContactDivNameFT: this.get('session.features.PURE-3835'),\n                    acdExternalContactWorkitemsDivNameFT: this.get('session.features.PURE-6191'),\n                    acdAnnounceMonitoring: this.get('session.features.acdAnnounceMonitoring'),\n                    acdAnnounceMonitoringDigital: this.get('session.features.acdAnnounceMonitoringDigital'),\n                    acdEngagementSourcesFT: this.get('session.features.PURE-5534_OpenMessagingEngagementSourceTagging'),\n                    acdWarmConferencePhase1FT: this.get('session.features.PURE-7349_acdConferenceMS3-phase-1'),\n                    agentAddressOnBehalfOfQueue: this.get('session.features.agentAddressOnBehalfOfQueue'),\n                    useScripterGadget: this.get('useScripterGadget'),\n                    inactivityTimeoutFT: this.get('session.features.PURE-5268_digital_messaging_inactivity_handling'),\n                    caseAssociationRequestFT: this.get('caseAssociation.caseAssociationRequestFT'),\n                    caseAgentWorkitemUIFT: this.get('caseAssociation.caseAgentWorkitemUIFT')\n                }\n            };\n        }\n    ),\n\n    /**\n     * An array of call interactions that are currently alerting\n     */\n    alertingCallInteractions: computed(\n        'interaction.activeInteractions.[]',\n        'interaction.activeInteractions.@each.{isCall,isAlerting}',\n        function (): any[] {\n            const interactions = this.get('interaction.activeInteractions');\n            return interactions.filter((interaction: any) => {\n                if (!get(interaction, 'isCall')) {\n                    return false;\n                } else if (!get(interaction, 'isAlerting')) {\n                    return false;\n                }\n                return true;\n            });\n        }\n    ),\n\n    /**\n     * An array of alerting, call interactions needing a WebRTC session\n     */\n    interactionsNeedingSession: computed(\n        'alertingCallInteractions.[]',\n        'phone.station.{isWebrtc,persistentConnection}',\n        'phone.persistentConnectionActive',\n        'webrtc.pendingSessions.[]',\n        'webrtcSdk.pendingSessions.[]',\n        'webrtcSdk.useSdk',\n        function (): any[] {\n            if (!this.get('phone.station.isWebrtc')) {\n                return [];\n            } else if (this.get('phone.persistentConnectionActive')) {\n                return [];\n            } else if (this.get('phone.station.persistentConnection')) {\n                // PCM-1827: if we have PC enabled and we didn't receive a session,\n                // assume that a PC somewhere else is established (like a media-helper instance)\n                return [];\n            }\n\n            const alertingCallInteractions: any[] = this.get('alertingCallInteractions') || [];\n            return alertingCallInteractions.filter((interaction: any) => {\n                const id: string = get(interaction, 'id');\n                const hasPendingSesion: boolean = this.get('webrtcSdk.useSdk')\n                    ? !!this.get('webrtcSdk.pendingSessions').findBy('conversationId', id)\n                    : !!this.get('webrtc.pendingSessions').findBy('callInfo.conversationId', id);\n\n                return !hasPendingSesion;\n            });\n        }\n    ),\n\n    /**\n     * An array of conversation guids to hide answer/decline controls for\n     */\n    hideInteractionButtons: computed(\n        'interactionsNeedingSession.[]',\n        'interaction.activeInteractions.[]',\n        'interaction.activeInteractions.@each.acceptedByClient',\n        'webrtc.inboundAcdCallsToAutoAnswer.[]',\n        function (): string[] {\n            const interactions: any[] = this.get('interaction.activeInteractions') || [];\n            return interactions.reduce((acc: string[], interaction: any) => {\n                const id: string = get(interaction, 'id');\n                const interactionsNeedingSession: any[] = this.get('interactionsNeedingSession');\n                const needsSession = !!interactionsNeedingSession.find((int: any) => id === get(int, 'id'));\n                const acceptedByClient: boolean = get(interaction, 'acceptedByClient');\n                const shouldAutoAnswer: boolean = this.get('webrtc.inboundAcdCallsToAutoAnswer').findBy('id', id);\n                if (needsSession || acceptedByClient || shouldAutoAnswer) {\n                    acc.push(id);\n                }\n                return acc;\n            }, []);\n        }\n    ),\n\n    /**\n     * Case cache version; when it changes, roster cards re-read from getCaseForInteraction.\n     * Passed down as an attribute (not in state) to match other panel→roster data flow.\n     */\n    caseCacheVersion: computed.readOnly('caseAssociation.cacheVersion'),\n\n    /**\n     * Function to get cached case for an interaction id. Passed down as an attribute to roster/cards.\n     */\n    getCaseForInteraction: computed('caseAssociation', function (): (id: string) => Maybe<CaseAssociationEntities> {\n        const caseAssociation = this.get('caseAssociation');\n        return (id: string) => caseAssociation?.getCachedCase(id) ?? null;\n    }),\n\n    /**\n     * Read only reference to all active agent conversations\n     */\n    activeInteractions: null as any,\n\n    /**\n     * @Attribute\n     * Read only reference to all active workitems\n     */\n    activeWorkitems: null as Maybe<WorkitemInteraction[]>,\n\n    /**\n     * Flag that toggles between v1 and v2 interapptions manager\n     */\n    useAppsV2ConversationInterapptionManager: true,\n\n    /**\n     * Returns an object of interactions keys by interaction id\n     */\n    activeInteractionsMetadataMap: computed('activeInteractions.@each.__interaction_metadata__', function (): Record<\n        string,\n        Conversation\n    > {\n        let result = {};\n        const interactions = this.get('activeInteractions');\n        if (interactions && typeOf(interactions) === 'array') {\n            result = interactions.reduce((acc: Record<string, Conversation>, currInteraction: any) => {\n                const currInteractionId = currInteraction ? currInteraction.get('id') : null;\n                if (currInteractionId) {\n                    acc[currInteractionId] = currInteraction.get('__interaction_metadata__');\n                }\n\n                return acc;\n            }, {});\n        }\n\n        return result;\n    }),\n\n    /**\n     * Returns the id of the selected subPanel Interapption\n     */\n    selectedSubPanelInterapptionId: computed(\n        'selectedSubPanelInterapptionStateKey',\n        'activeSubPanelInterapptions',\n        function (): Maybe<string> {\n            const stateKey = this.get('selectedSubPanelInterapptionStateKey');\n            const activeInterapptions = this.get('activeSubPanelInterapptions');\n            const interapption = activeInterapptions.findBy('stateKey', stateKey);\n            if (interapption) return interapption.get('id');\n            return null;\n        }\n    ),\n\n    /**\n     * Returns whether user has the org setting to enforce ACW at the communication level enabled\n     */\n    useCommunicationACW: computed.readOnly('selectedInteraction.useCommunicationACW'),\n\n    /**\n     * @Action\n     * Decline a given interaction.\n     * @param interaction - The Ember model for the interaction\n     */\n    actionDeclineInteraction(interaction: any) {\n        const intService = this.get('interaction');\n        intService.get('_declineInteraction').perform(interaction);\n    },\n\n    /**\n     * @action\n     * Given a given interaction focus in the UI.\n     *\n     * @note\n     * If the incoming interaction is `null` then we will NOT affect active workitems.\n     * If the incoming interaction is not `null` then we will set the workitem interact\n     * to `null`.\n     *\n     * @param interaction the Ember model for the interaction\n     * @param automated `true` if the selection was not initiated manually by the user, but instead initiated from our processing\n     */\n    actionSelectInteraction(interaction: any, automated = false) {\n        const tasks = [\n            this.get('interaction')\n                .setSelectedInteraction(interaction, { automated, skipHolding: this.get('isPopout') })\n                .catch(error =>\n                    this.get('logger').error('ACD: There was an error selecting a new interaction', {\n                        remoteData: { error, id: interaction ? interaction.id : 'No interaction provided' }\n                    })\n                )\n        ];\n        if (interaction && !automated) {\n            tasks.push(this.actionSelectWorkitemInteraction(null));\n        }\n        return RSVP.all(tasks);\n    },\n\n    /**\n     * @Action\n     * Toggle the user's \"on queue\" presence if streaming service is connected.\n     */\n    actionGoOnQueue() {\n        if (this.get('streamingConnected')) {\n            this.get('queueToggle').handleToggle();\n        }\n    },\n\n    /**\n     * @Action\n     * Initiate an outbound voice call on behalf of a queue.\n     * @param selection - phone number object bound in UI\n     * @returns make call request promise\n     */\n    actionCreateCall(selection: any) {\n        const number = get(selection, 'e164');\n        const { id: contactId, queue } = getProperties(selection, 'id', 'queue');\n        return this.get('phone').makeCall(number, null, queue, contactId);\n    },\n\n    /**\n     * @Action\n     * Initiate an outbound email on behalf of a queue.\n     * @param selection - email object bound in UI\n     * @returns create email request promise\n     */\n    actionCreateEmail(selection: any) {\n        const { email, id: contactId, queue } = getProperties(selection, 'email', 'id', 'queue');\n        return this.get('acdemail').createEmail(queue.id, email, contactId);\n    },\n\n    /**\n     * @Action\n     * Initiate an outbound message on behalf of a queue.\n     * TODO: create type for selection when typing interaction-outbound-contact\n     * @param selection - message object bound in UI\n     * @returns create message request promise\n     */\n    actionCreateMessage(selection: any) {\n        const options = {\n            queueId: selection.queue.id,\n            entity: {\n                id: get(selection, 'id'),\n                value: get(selection, 'e164'),\n                entity: {\n                    type: get(selection, 'entityType')\n                }\n            },\n            toAddressMessengerType: 'sms'\n        };\n        const useExistingConversation = true;\n        return this.get('acdsms').createMessage(options, useExistingConversation);\n    },\n\n    /**\n     * @Action\n     * Load the queue name for specific queue\n     * @param queueId - the queue guid\n     * @returns the queue name\n     */\n    async actionLoadQueue(queueId: string): Promise<string> {\n        if (queueId) {\n            try {\n                const name = await this.get('participantName').fetchQueueName(queueId);\n                if (name) {\n                    return name;\n                }\n            } catch (error) {\n                this.get('logger').error('ACD: Could not fetch queue name', { error });\n            }\n        }\n        return this.get('intl').t('purecloud.acdInteraction.unknown');\n    },\n\n    /**\n     * @Action\n     * Load the name for a given participant.\n     * @param interaction - interaction model\n     * @param participantId - participant guid\n     * @returns the participant name\n     */\n    async actionLoadParticipantName(interaction: any, participantId: string): Promise<string> {\n        const conversation: Conversation = get(interaction, '__interaction_metadata__');\n        const participants = conversation.participants || [];\n        const participant = participants.find(p => p.id === participantId);\n        const noName = this.get('intl').t('purecloud.acdInteraction.noName');\n\n        if (!participant) {\n            return noName;\n        }\n\n        try {\n            const name = await this.get('participantName').fetchNameFromParticipant(participant);\n            if (name) {\n                return name;\n            }\n        } catch (error) {\n            this.get('logger').error('ACD: Could not load participant name', { error });\n        }\n\n        return noName;\n    },\n\n    /**\n     * @Action\n     * @param Interaction - conversation model\n     * @returns the participant name\n     */\n    async loadDivisionName(divisionId: string | undefined): Promise<string | undefined> {\n        const state = this.get('state');\n        const acdExternalContactDivNameFT = state.featureToggles?.acdExternalContactDivNameFT;\n        if (acdExternalContactDivNameFT && divisionId && divisionId !== '*') {\n            const cachedDivisionsMap = this.get('cachedDivisionsMap');\n            return (\n                cachedDivisionsMap.get(divisionId) ??\n                (async () => {\n                    try {\n                        const url = this.get('application').pcV2Uri(\n                            `platform/api/v2/authorization/divisions/${divisionId}`\n                        );\n                        const division = await this.get('ajax').ajaxGet(url);\n                        const divisionName = division?.name;\n                        cachedDivisionsMap.set(divisionId, division?.name);\n                        return divisionName;\n                    } catch {}\n                })()\n            );\n        }\n        return;\n    },\n\n    /**\n     * @Action\n     * Answer a given workitem interaction.\n     * @param {WorkitemInteraction} workitemInteraction - workitem interaction model\n     */\n    actionAnswerWorkitemInteraction(workitemInteraction: WorkitemInteraction) {\n        this.actionSelectWorkitemInteraction(workitemInteraction);\n        this.get('acdworkitem')\n            .answer(workitemInteraction)\n            .catch((error: any) => {\n                if (error.payload?.code === 'too.many.requests.retry.after') {\n                    this._displayError('purecloud.acdInteraction.workitem.errors.rateLimit');\n                } else {\n                    this._displayError('purecloud.acdInteraction.workitem.errors.answer');\n                }\n            });\n    },\n\n    /**\n     * @Action\n     * Decline a given workitem interaction.\n     * @param {WorkitemInteraction} workitemInteraction - workitem interaction model\n     */\n    actionDeclineWorkitemInteraction(workitemInteraction: WorkitemInteraction) {\n        this.actionSelectWorkitemInteraction(workitemInteraction);\n        this.get('acdworkitem')\n            .decline(workitemInteraction)\n            .catch((error: any) => {\n                if (error.payload?.code === 'too.many.requests.retry.after') {\n                    this._displayError('purecloud.acdInteraction.workitem.errors.rateLimit');\n                } else {\n                    this._displayError('purecloud.acdInteraction.workitem.errors.decline');\n                }\n            });\n    },\n\n    /**\n     * @action\n     * Focuses the given workitem as the selected workitem.\n     *\n     * @note\n     * If the incoming workitem is `null` then we will NOT affect active interactions.\n     * If the incoming workitem is not `null` then we will set the active interaction to `null`\n     *\n     * @param workitem the incoming workitem to set as the selected interaction\n     * @param automated `true` if the selection was not initiated manually by the user, but instead initiated from our processing\n     */\n    actionSelectWorkitemInteraction(workitem: Maybe<WorkitemInteraction>, automated = false): RSVP.Promise<any> {\n        const tasks = [];\n        const skipHolding = this.get('isPopout');\n        if (!skipHolding) {\n            // the workitems that we want to hold based on id selection and current assignmentState needing to be connected\n            const holdingWorkitems = (this.get('activeWorkitems') ?? []).filter(\n                item => workitem?.id !== item.id && item.workitem.assignmentState === 'Connected'\n            );\n\n            tasks.push(\n                ...holdingWorkitems.map(item =>\n                    this.get('acdworkitem')\n                        .hold(item)\n                        .catch((error: any) => {\n                            this.get('logger').debug('ACD: Error holding workitem interaction.', { error });\n                        })\n                )\n            );\n        }\n\n        if (workitem) {\n            if (!automated) {\n                // if we are selecting a workitem, reset the interactions\n                tasks.push(this.actionSelectInteraction(null));\n            }\n\n            // only need to unhold if the current workitem is held\n            if (workitem.workitem.assignmentState === 'Held') {\n                tasks.push(\n                    this.get('acdworkitem')\n                        .unhold(workitem)\n                        .catch((error: any) => {\n                            this.get('logger').debug('ACD: Error un-holding workitem interaction.', { error });\n                            if (error.payload?.code === 'too.many.requests.retry.after') {\n                                this._displayError('purecloud.acdInteraction.workitem.errors.rateLimit');\n                            } else {\n                                this._displayError('purecloud.acdInteraction.workitem.errors.select');\n                            }\n                        })\n                );\n            }\n        }\n\n        safeSet(this, 'selectedWorkitem', workitem ?? null);\n        return RSVP.all(tasks);\n    },\n\n    /**\n     * @Init\n     * Configure the providers for interapption panels.\n     */\n    configureAppProviders() {\n        const providerConfigMap = getOwner(this).lookup('app-provider:provider-config-map');\n        const providerConfig = _buildProviderConfig(providerConfigMap, this.get('logger'));\n        // _buildAppProviderComputed returns a computed-property descriptor, so it\n        // must be installed with defineProperty. Using this.set() would store the\n        // descriptor as a plain value, making this.get('interapptionProviders')\n        // return the descriptor (not the array) and breaking `.filter`. See\n        // ember-3-migration spec.\n        defineProperty(this, 'interapptionProviders', _buildAppProviderComputed(providerConfig));\n    },\n\n    /**\n     * @Init\n     * Configure the providers for AppsV2 Workers.\n     */\n    configureWorkerProviders() {\n        const workerProviderConfigMap = getOwner(this).lookup('worker-provider:provider-config-map');\n        const providerConfig = _buildProviderConfig(workerProviderConfigMap, this.get('logger'));\n        // Computed descriptor — install via defineProperty, not set(). See above.\n        defineProperty(this, 'workerProviders', _buildWorkerProviderComputed(providerConfig));\n    },\n\n    /**\n     * @Init\n     * Configure the default sub-panels to show.\n     */\n    configureDefaultPanels() {\n        const shouldFetchDefaultPanelSettings =\n            this.get('permissions').validateDonutPermission('agentUI:defaultPanels:view');\n\n        if (!isTesting && shouldFetchDefaultPanelSettings) {\n            this.get('agentUIBackend')\n                .getOrganizationDefaultPanelSettings()\n                .catch((error: Error) => {\n                    this.get('logger').error(\n                        'Failed initial attempt to load the org-level default panel settings, retrying...',\n                        { error }\n                    );\n                    return new RSVP.Promise(resolve => later(resolve, 1000)).then(() =>\n                        this.get('agentUIBackend').getOrganizationDefaultPanelSettings()\n                    );\n                })\n                .then((settings: any) => {\n                    this.set('_defaultPanelSettings', settings && typeof settings === 'object' ? settings : {});\n                })\n                .catch((error: Error) => {\n                    this.get('logger').error('Failed to load the org-level default panel settings', { error });\n                });\n        }\n    },\n\n    /**\n     * Event handler for conversation created events. Will set the newly\n     * created conversation as the 'requestedInteraction for selection.\n     * @param opts - an object containing a conversation id\n     */\n    requestInteraction(opts: CreateRequestResponse) {\n        const conversationId: string = opts.conversationId;\n        if (conversationId) {\n            this.set('requestedInteraction', conversationId);\n        }\n    },\n\n    /**\n     * Event handler to handle when a conversation is answered and should\n     * be selected.\n     * @param opts - an object containing the answered interaction\n     */\n    handleAnswerInteraction(opts: any) {\n        if (opts.interaction) {\n            this.actionSelectInteraction(opts.interaction);\n        }\n    },\n\n    /**\n     * Event handler for workitem unpark events. Will set the\n     * currently unparked workitem as a 'requestedWorkitem' for selection.\n     * @param workitemId - ID of a workitem to be selected\n     */\n    requestWorkitem(workitemId: string) {\n        if (workitemId) {\n            this.set('requestedWorkitemId', workitemId);\n        }\n    },\n\n    /**\n     * closes the panel from the sidebar service\n     */\n    _closeSidebar() {\n        if (this.get('session').get('useNewNav')) {\n            this.get('commandNav').selectPanel('panel-not-active');\n        } else {\n            this.get('sidebar').closePanel();\n        }\n    },\n\n    /**\n     * toggles the panel from the sidebar service\n     */\n    _toggleSidebar() {\n        if (this.get('session').get('useNewNav')) {\n            this.get('commandNav').togglePanel();\n        } else {\n            this.get('sidebar').toggleCommunicationSidebarExpanded();\n        }\n    },\n\n    /**\n     * @Init\n     * Bind event creation to requestInteraction handler.\n     */\n    bindCreateEvents() {\n        this.get('acdemail').on(EMAIL_CONVERSATION_CREATED_EVENT, this, this.requestInteraction);\n        this.get('acdsms').on(MESSAGE_CONVERSATION_CREATED_EVENT, this, this.requestInteraction);\n        this.get('acdcall').on(CALL_CONVERSATION_CREATED_EVENT, this, this.requestInteraction);\n        this.get('interaction').on(ANSWER_INTERACTION_EVENT, this, this.handleAnswerInteraction);\n        this.get('acdworkitem').on(WORKITEM_ASSIGNMENT_STATE_CHANGED_EVENT, this, this.requestWorkitem);\n    },\n\n    /**\n     * @WillDestroyElement\n     * Unbind event creation to requestInteraction handler.\n     */\n    unbindCreateEvents() {\n        this.get('acdemail').off(EMAIL_CONVERSATION_CREATED_EVENT, this, this.requestInteraction);\n        this.get('acdsms').off(MESSAGE_CONVERSATION_CREATED_EVENT, this, this.requestInteraction);\n        this.get('acdcall').off(CALL_CONVERSATION_CREATED_EVENT, this, this.requestInteraction);\n        this.get('interaction').off(ANSWER_INTERACTION_EVENT, this, this.handleAnswerInteraction);\n        this.get('acdworkitem').off(WORKITEM_ASSIGNMENT_STATE_CHANGED_EVENT, this, this.requestWorkitem);\n    },\n\n    /**\n     * @DidReceiveAttrs\n     * Determine in changes to active interactions/workitems should result in\n     * changes to selected interaction/workitem.\n     */\n    processActiveRoutableChanges() {\n        const activeInteractions = this.get('activeInteractions') || [];\n        const requestedInteractionId = this.get('requestedInteraction');\n        const requestedInteraction =\n            requestedInteractionId && activeInteractions.length\n                ? activeInteractions.find((interaction: any) => interaction.id === requestedInteractionId)\n                : null;\n\n        if (requestedInteractionId && requestedInteraction && !isDestroyed(requestedInteraction)) {\n            this.actionSelectInteraction(requestedInteraction, true);\n            this.actionSelectWorkitemInteraction(null, true);\n            this.set('requestedInteraction', null);\n            return;\n        }\n\n        // If a workitem was requested, look it up and set it as active.\n        // If not, or if it isn't found in the active array, continue on.\n        const requestedWorkitemId = this.get('requestedWorkitemId');\n        const activeWorkitems = this.get('activeWorkitems') || [];\n        if (requestedWorkitemId) {\n            const requestedWorkitem = activeWorkitems.find(workitem => workitem.id === requestedWorkitemId);\n            if (requestedWorkitem) {\n                this.actionSelectInteraction(null, true);\n                this.actionSelectWorkitemInteraction(requestedWorkitem, true);\n                this.set('requestedWorkitemId', null);\n                return;\n            }\n        }\n\n        // If an interaction is currently selected and not destroyed, check to\n        // make sure if it's still in the active array or if we're transitioning\n        // from call to callback (or vice versa).\n        const selectedInteraction = this.get('selectedInteraction');\n        if (selectedInteraction && !isDestroyed(selectedInteraction)) {\n            const selectedId = get(selectedInteraction, 'id');\n            const activeSelectedInteraction = activeInteractions.find(\n                (interaction: any) => get(interaction, 'id') === selectedId\n            );\n\n            // If the interaction wasn't found, set the active to empty and exit.\n            // Otherwise, we'll hit an error below as we can't determine type.\n            if (!activeSelectedInteraction) {\n                this.actionSelectInteraction(null, true);\n                this.actionSelectWorkitemInteraction(null, true);\n                return;\n            }\n\n            // Compare the types and set selected accordingly.\n            if (get(activeSelectedInteraction, 'type') !== get(selectedInteraction, 'type')) {\n                this.actionSelectInteraction(activeSelectedInteraction, true);\n                this.actionSelectWorkitemInteraction(null, true);\n            }\n\n            return;\n        }\n\n        // If the currently selected workitem is requested and still active, exit.\n        const selectedWorkitem = this.get('selectedWorkitem');\n        if (selectedWorkitem && activeWorkitems.find(wi => wi.id === selectedWorkitem.id)) {\n            return;\n        }\n\n        // If we've made it this far, we need to find an interaction to select,\n        // so take the first interaction in the active interactions array.\n        if (activeInteractions.length > 0) {\n            this.actionSelectInteraction(activeInteractions[0], true);\n            this.actionSelectWorkitemInteraction(null, true);\n            return;\n        }\n\n        // If there were no active interactions, look for an active workitem.\n        if (activeWorkitems.length > 0) {\n            this.actionSelectWorkitemInteraction(activeWorkitems[0], true);\n            this.actionSelectInteraction(null, true);\n            return;\n        }\n\n        // If we didn't find an interaction or workitem, set selected to null.\n        this.actionSelectInteraction(null, true);\n        this.actionSelectWorkitemInteraction(null, true);\n    },\n\n    /**\n     * Display a toast Error notification\n     * @param messageKey  The message translation key\n     * @param messageKeyOptions Translation options for given key\n     */\n    _displayError(messageKey: string, messageKeyOptions?: Record<string, any>) {\n        const message = this.get('intl').t(messageKey, messageKeyOptions);\n        this.get('notification').error(null, message, {});\n    },\n\n    _doesRequireStructuredMessage: function (interaction: any) {\n        const lastInbound = interaction.get('lastCustomerMessage');\n        if (interaction.get('subMessageType') === 'whatsapp' && lastInbound) {\n            // Check if last inbound message is older than 24 hours (24h * 60min * 60s * 1000ms)\n            return new Date(lastInbound.timestamp).getTime() <= Date.now() - 24 * 60 * 60 * 1000;\n        }\n        return false;\n    },\n\n    /**\n     * @Action\n     * Answer a given interaction. If the interaction is part of an external campaign,\n     * copy the customer phone number to the user's clipboard for convenience.\n     * @param interaction - The Ember model for the interaction\n     */\n    actionAnswerInteraction(interaction: any) {\n        const intService = this.get('interaction');\n        this.actionSelectInteraction(interaction);\n        intService.get('_answerInteraction').perform(interaction);\n        const isExternalCampaign = get(interaction, 'isExternalCampaign');\n        if (isExternalCampaign && navigator && navigator.clipboard) {\n            const formattedCustomerPhoneNumber = get(interaction, 'formattedCustomerPhoneNumber');\n            navigator.clipboard.writeText(formattedCustomerPhoneNumber).catch(err => {\n                this.get('logger').warn('Failed to copy phone number.', err);\n            });\n        }\n    },\n\n    useScripterGadget: computed.bool('session.features.PURE-6186_Scripter_Gadget_GCUI'),\n\n    /**\n     * @Action\n     * Handle changes to contextual script availability\n     * @param scriptAvailable - flag for script availability\n     */\n    actionContextualScriptAvailabilityChanged(scriptAvailable: boolean) {\n        const scripterMap = this.get('contextualInteractionScriptStateMap');\n        const selectedInteraction = this.get('selectedInteraction');\n        const interactionId = get(selectedInteraction, 'id');\n\n        if (interactionId) {\n            let interactionScriptDetails = scripterMap[interactionId];\n\n            if (!interactionScriptDetails) {\n                interactionScriptDetails = scripterMap[interactionId] = {\n                    scriptAvailable: false,\n                    changeCount: 0\n                };\n            }\n\n            interactionScriptDetails.scriptAvailable = scriptAvailable;\n            interactionScriptDetails.changeCount++;\n        }\n\n        const activeIds = this.get('activeInteractions').map((interaction: any) => {\n            return get(interaction, 'id');\n        });\n\n        const syncedScripterMap: Record<string, ScriptState> = activeIds.reduce(\n            (acc: Record<string, any>, currInteractionId: string) => {\n                if (scripterMap.hasOwnProperty(currInteractionId)) {\n                    acc[currInteractionId] = scripterMap[currInteractionId];\n                }\n\n                return acc;\n            },\n            {}\n        );\n\n        this.set('contextualInteractionScriptStateMap', syncedScripterMap);\n    },\n\n    /**\n     * @Action\n     * Set Interapption Pool V2\n     */\n    actionOnAppPoolReady(appPoolV2: AppPool) {\n        this.set('appPoolV2', appPoolV2);\n    },\n\n    /**\n     * @Action\n     * Set Attention Count per Composite Id\n     */\n    actionOnAppAttentionCountChanged(attentionCountPerCompositeId: Record<string, number>) {\n        this.set('attentionCountPerCompositeId', attentionCountPerCompositeId);\n    },\n\n    /**\n     * @Action\n     * Set Contextual Interapption App Defs\n     * @param appDefs - the availabler app defs V2\n     */\n    actionOnContextualAvailableAppsChanged(resolvedApps: ResolvedApp[]) {\n        const panelCfgs: any[] = [];\n        for (const { compositeId, appDef } of resolvedApps) {\n            const assets: Partial<{ icon: AppDefV1Asset; monochromicIcon: AppDefV1Asset }> = {};\n            if (appDef.monochromicIcon) {\n                assets.monochromicIcon = appUtils.buildV1IconAsset(appDef.monochromicIcon);\n            }\n            if (appDef.icon) {\n                assets.icon = appUtils.buildV1IconAsset(appDef.icon);\n            }\n            const app = Ember.Object.create({\n                id: compositeId,\n                name: appDef.displayName || appDef.id,\n                assets,\n                // Prune off the interactionId and interactionType so that panelManager will track state\n                // at the interaction \"type\" level vs the \"instance\" level\n                stateKey: compositeId.split('&').slice(2).join('&')\n            });\n            panelCfgs.push(app);\n        }\n        this.set('activeSubPanelInterapptions', panelCfgs);\n    },\n\n    /**\n     * @Action\n     * Set HasConversationAppForCurrInteraction value\n     */\n    actionOnHasConversationAppForCurrInteractionChanged(hasConversationAppForCurrInteraction: boolean) {\n        this.set('hasConversationAppForCurrInteraction', hasConversationAppForCurrInteraction);\n    },\n\n    /**\n     * @Action\n     * Set VisibleContextualAppsForCurrInteraction value\n     */\n    actionOnVisibleContextualAppsForCurrInteractionChanged(visibleContextualAppsForCurrInteraction: string[]) {\n        this.set('visibleContextualAppsForCurrInteraction', visibleContextualAppsForCurrInteraction);\n    },\n\n    /**\n     * @Action\n     * Set hasContextualFocusModeEnabled value\n     */\n    actionOnHasContextualFocusModeEnabledChanged(hasContextualFocusModeEnabled: boolean) {\n        this.set('hasContextualFocusModeEnabled', hasContextualFocusModeEnabled);\n    },\n\n    /**\n     * @action\n     *\n     * @param _appDefIds - the app def ids that were forced open\n     */\n    actionAppsForcedOpen(_appDefIds: string[]) {\n        this._setMainstageFocused(false);\n    },\n\n    /**\n     * @Action\n     * Handle changes to sub panel selection\n     * @param panelStateKey - key for selected sub-panel\n     */\n    actionOnSubPanelSelectionChanged(panelStateKey: string) {\n        this.set('selectedSubPanelInterapptionStateKey', panelStateKey ? panelStateKey : null);\n    },\n\n    /**\n     * @Action\n     * Load the default queue for a given media type.\n     * @param communicationType - the communication media type to check for\n     * @returns RSVP promise for the default queue\n     */\n    actionFetchDefaultQueue(type: CommunicationType) {\n        const singularType = singularizeMediaType(type);\n        return this.get('queue').getDefaultQueue(singularType);\n    },\n\n    actionFetchQueue(queueId: string, options: any = {}) {\n        return this.get('store').findRecord('queue', queueId, options);\n    },\n\n    _setMainstageFocused(value: boolean) {\n        this.set('hasMainstageFocusModeEnabled', value);\n    },\n\n    init() {\n        this._super(...arguments);\n\n        this.set('appPoolV2', null);\n        this.set('attentionCountPerCompositeId', {});\n        this.set('activeSubPanelInterapptions', []);\n        this.set('contextualInteractionScriptStateMap', {});\n        this.set('_defaultPanelSettings', {});\n\n        this.configureAppProviders();\n        this.configureWorkerProviders();\n        this.configureDefaultPanels();\n        this.bindCreateEvents();\n    },\n\n    didReceiveAttrs() {\n        debounce(this, this.processActiveRoutableChanges, 100);\n    },\n\n    willDestroyElement() {\n        this.unbindCreateEvents();\n        this._super(...arguments);\n    },\n\n    actions: {\n        contextualScriptAvailabilityChanged(scriptAvailable: boolean) {\n            this.actionContextualScriptAvailabilityChanged(scriptAvailable);\n        },\n        onAppPoolReady(appPoolV2: AppPool) {\n            this.actionOnAppPoolReady(appPoolV2);\n        },\n        onAppAttentionCountChanged(attentionCountPerCompositeId: Record<string, number>) {\n            this.actionOnAppAttentionCountChanged(attentionCountPerCompositeId);\n        },\n        onContextualAvailableAppsChanged(resolvedApps: ResolvedApp[]) {\n            this.actionOnContextualAvailableAppsChanged(resolvedApps);\n        },\n        onHasConversationAppForCurrInteractionChanged(hasConversationAppForCurrInteraction: boolean) {\n            this.actionOnHasConversationAppForCurrInteractionChanged(hasConversationAppForCurrInteraction);\n        },\n        onVisibleContextualAppsForCurrInteractionChanged(visibleContextualAppsForCurrInteraction: string[]) {\n            this.actionOnVisibleContextualAppsForCurrInteractionChanged(visibleContextualAppsForCurrInteraction);\n        },\n        onHasContextualFocusModeEnabledChanged(focusModeEnabled: boolean) {\n            this.actionOnHasContextualFocusModeEnabledChanged(focusModeEnabled);\n        },\n        onAppsForcedOpen(appDefIds: string[]) {\n            this.actionAppsForcedOpen(appDefIds);\n        },\n        onHasMainstageFocusModeEnabledChanged(value: boolean) {\n            this._setMainstageFocused(value);\n        },\n        onSubPanelSelectionChanged(panelStateKey: string) {\n            this.actionOnSubPanelSelectionChanged(panelStateKey);\n        },\n        answerInteraction(interaction: any) {\n            this.actionAnswerInteraction(interaction);\n        },\n        declineInteraction(interaction: any) {\n            this.actionDeclineInteraction(interaction);\n        },\n        selectInteraction(interaction: any) {\n            this.actionSelectInteraction(interaction);\n        },\n        goOnQueue() {\n            this.actionGoOnQueue();\n        },\n        createCall(selection: any) {\n            return this.actionCreateCall(selection);\n        },\n        createEmail(selection: any) {\n            return this.actionCreateEmail(selection);\n        },\n        createMessage(selection: any) {\n            return this.actionCreateMessage(selection);\n        },\n        displayError(error: string, options: Record<string, any>) {\n            this._displayError(error, options);\n        },\n        getCanonicalContactSync(externalContactId: string) {\n            return this.get('externalContacts').getCanonicalContactSync(externalContactId);\n        },\n        loadQueueName(queueId: string) {\n            return this.actionLoadQueue(queueId);\n        },\n        loadDivisionName(divisionId: string | undefined): Promise<string | undefined> {\n            return this.loadDivisionName(divisionId);\n        },\n        fetchQueue(queueId: string, options: any = {}) {\n            return this.actionFetchQueue(queueId, options);\n        },\n        loadParticipantName(interaction: Conversation, participantId: string) {\n            return this.actionLoadParticipantName(interaction, participantId);\n        },\n        answerWorkitemInteraction(workitem: WorkitemInteraction) {\n            this.actionAnswerWorkitemInteraction(workitem);\n        },\n        declineWorkitemInteraction(workitem: WorkitemInteraction) {\n            this.actionDeclineWorkitemInteraction(workitem);\n        },\n        selectWorkitemInteraction(workitem: WorkitemInteraction) {\n            Ember.run.throttle(this, this.actionSelectWorkitemInteraction, workitem, 1000);\n        },\n        buildValidInterapption(typeId: string, id: string, config: any, trustedProvider?: boolean): any {\n            return this.get('apps').buildValidInterapption(typeId, id, config, trustedProvider);\n        },\n        fetchDefaultQueue(type: CommunicationType) {\n            return this.actionFetchDefaultQueue(type);\n        },\n        insertChatText(text: string) {\n            this.set('cannedResponseChatText', text);\n        },\n        insertSmsText(response: { strippedText?: string; structuredMessage?: string }) {\n            this.set('cannedResponseSmsText', response.strippedText);\n            this.set('structuredMessage', response.structuredMessage);\n        },\n        insertEmailText(text: string) {\n            this.set('cannedResponseEmailText', text);\n        },\n\n        /**\n         * Invoked when the user decides to completely close, or hide, the sidebar from the view\n         */\n        onCloseSidebar() {\n            this._closeSidebar();\n        },\n\n        /**\n         * Invoked when the user decides to toggle (expand/collapse) the sidebar from the view\n         */\n        onToggleSidebar() {\n            this._toggleSidebar();\n        }\n    }\n});\n","import Component from '@ember/component';\nimport { computed, get } from '@ember/object';\nimport { next } from '@ember/runloop';\nimport { inject } from '@ember/service';\nimport { Participant } from '@genesys/genesys-cloud-conversation-utils';\nimport { warnClosureAction } from 'web-directory/utils/acd-ts';\nimport { getInitials } from 'web-directory/utils/names';\nimport safeSet from 'web-directory/utils/safeSet';\nimport { run } from '@ember/runloop';\nimport { formatTimestampForDisplay } from 'web-directory/utils/date-time';\n\nexport type ConsultControlType = 'consultant' | 'initiator' | null;\n\nexport default Component.extend({\n    classNames: ['interaction-consult-controls'] as const,\n\n    store: inject('store'),\n    intl: inject('intl'),\n    logger: inject('stashLogger'),\n    session: inject('session'),\n\n    /**\n     * @attribute\n     * @optional\n     *\n     * The user id corresponding to the agent being consulted\n     */\n    participantUserId: undefined as any | undefined,\n\n    /**\n     * @attribute\n     * @optional\n     *\n     * The name of the user corresponding to the agent being consulted\n     */\n    name: undefined as string | object | undefined,\n\n    /**\n     * @attribute\n     */\n    connectedTime: undefined as string | undefined,\n\n    /**\n     * @attribute\n     *\n     * `true` if the consulting participant is currently being held\n     */\n    isHeld: false,\n\n    /**\n     * @attribute\n     *\n     * `true` if the consulting participant has been confined by the initiating agent\n     */\n    isConfined: false,\n\n    /**\n     * @attribute\n     *\n     * `true` if the user has initiating a (un)confine request and the button needs to\n     * display the loading state\n     */\n    isConfineLoading: false,\n\n    /**\n     * @attribute\n     *\n     * `true` if the user has initiating a (un)hold request and the button needs to\n     * display the loading state\n     */\n    isHoldLoading: false,\n\n    /**\n     * @attribute\n     *\n     * `true` if the user has initiating a disconnect of the consult and the button\n     * needs to display the loading state\n     */\n    isDisconnectLoading: false,\n\n    /**\n     * @attribute\n     *\n     * `true` if the user has initiated a transfer request to the consulting agent\n     */\n    isTransferLoading: false,\n\n    /**\n     * @attribute\n     *\n     * `true` if the user has initiated a interaction morph to a conference\n     */\n    isConferenceLoading: false,\n\n    /**\n     * @attribute\n     * the type of conversation being consulted with.\n     */\n    conversationType: undefined as undefined | string,\n\n    /**\n     * @attribute\n     * the type of controls to render for the user. The control type will determine some of the\n     * controls visibility on the bar. A control type as the initiator will offer more control\n     * than a control type of consultant.\n     */\n    controlType: 'initiator' as ConsultControlType,\n\n    /**\n     * `true` if the data needed for this component is being loaded.\n     * Defaults to `true` to prevent the template from accessing properties\n     * that are not available on init.\n     */\n    loading: true,\n\n    /**\n     * This value should not be passed through, we need to fetch this local to this component.\n     */\n    participant: undefined as undefined | Participant,\n\n    /**\n     * `true` if the control type is of initiator, it will affect some of the buttons that can be\n     * rendered in the consult bar.\n     */\n    isInitiator: computed.equal('controlType', 'initiator'),\n\n    /**\n     * `true` if the control type is of consultant, it will affect some of the buttons that can be\n     * rendered in the consult bar.\n     */\n    isConsultant: computed.equal('controlType', 'consultant'),\n\n    /**\n     * `true` if the conversation is a call, it will affect some of the buttons that can be\n     * rendered in the consult bar.\n     */\n    isCall: computed.equal('conversationType', 'call'),\n\n    /**\n     * `true` if the conversation is not disconnected, terminated, parked or has not completed ACW\n     * rendered in the consult bar.\n     */\n    isInteractionActive: false,\n\n    /**\n     * Returns the initials of the participant computed by the model.\n     * We need to substring the first two characters because some characters\n     * won't compute correctly and will cause a long string of initials\n     *\n     * @note due to the external and internal users handling their name value differently,\n     * we need to check what the type of the name is and parse it differently.\n     */\n    initials: computed('name', 'participant', 'participant.name', function () {\n        let name = this.get('name');\n\n        const participant = this.get('participant');\n        if (participant) {\n            name = get(participant, 'name');\n        }\n\n        // sometimes the name will be an object we need to stringify\n        if (typeof name === 'object' && name.toString) {\n            name = name.toString();\n        }\n\n        return name ? getInitials(name) : null;\n    }),\n\n    /*\n     * The display for the agents connected time to show when the user hovers over the\n     * consulting agents timer\n     */\n    connectedTimeDisplay: computed('connectedTime', function () {\n        // connectedTime is expected to be an ISO string or undefined\n        const connectedTime = this.get('connectedTime');\n        if (!connectedTime) return null;\n\n        return formatTimestampForDisplay(connectedTime);\n    }),\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n        const participant = this.get('participant');\n        const participantId = this.get('participantUserId');\n        if (participantId && participant?.id !== participantId) {\n            this.fetchData(participantId);\n        } else {\n            this.set('loading', false);\n        }\n    },\n\n    /**\n     * Fetches the data based on the user id provided.\n     *\n     * @note we only need to fetch the user information if the participant is an internal\n     * user. That is due to the lack of needed information on the participant object when\n     * the participant is internal. External users have all the needed information on their\n     * object, however.\n     */\n    async fetchData(userId: string) {\n        this.set('loading', true);\n        try {\n            const data = await this.get('store').findRecord('person', userId);\n            if (data) {\n                next(this, () => safeSet(this, 'participant', data));\n            } else {\n                throw new Error('Participant could not be found');\n            }\n        } catch (error) {\n            this.get('logger').error('There was an issue finding the consulting participant', { error });\n        }\n        run(() => {\n            this.set('loading', false);\n        });\n    },\n\n    /**\n     * @action\n     *\n     * Initiator: Invoked when the user pressed the \"Hold\" button as the initiator. Action should be provided\n     * by the implementing parent.\n     */\n    actionConfine: () => warnClosureAction('actionConfine'),\n\n    /**\n     * @action\n     *\n     * Initiator: Invoked when the user pressed the \"Unhold\"/\"Resume\" button as the initiator. Action should be provided\n     * by the implementing parent.\n     */\n    actionUnconfine: () => warnClosureAction('actionUnconfine'),\n\n    /**\n     * @action\n     *\n     * Consultant: Invoked when the user pressed the \"Hold\" button as the consultant. Action should be provided\n     * by the implementing parent.\n     */\n    actionHold: () => warnClosureAction('actionHold'),\n\n    /**\n     * @action\n     *\n     * Consultant: Invoked when the user pressed the \"Unhold\"/\"Resume\" button as the consultant. Action should be provided\n     * by the implementing parent.\n     */\n    actionUnhold: () => warnClosureAction('actionUnhold'),\n\n    /**\n     * @action\n     *\n     * Invoked when the user pressed the \"Disconnect\" button. Action should be provided\n     * by the implementing parent.\n     */\n    actionDisconnect: () => warnClosureAction('actionDisconnect'),\n\n    /**\n     * @action\n     *\n     * Invoked when the user pressed the \"Transfer\" button. Action should be provided\n     * by the implementing parent.\n     */\n    actionTransfer: () => warnClosureAction('actionTransfer'),\n\n    /**\n     * @action\n     *\n     * Invoked when the user pressed the \"Conference\" button. Action should be provided\n     * by the implementing parent.\n     */\n    actionConference: () => warnClosureAction('actionConference'),\n\n    /**\n     * @action\n     *\n     * Invoked when the user pressed the \"Merge to Conference\" button in a Warm-Invite call. Action should be provided\n     * by the implementing parent.\n     */\n    actionMergeToConference: () => warnClosureAction('actionMergeToConference'),\n\n    actions: {\n        onConfine() {\n            this.actionConfine();\n        },\n\n        onUnconfine() {\n            this.actionUnconfine();\n        },\n\n        onHold() {\n            this.actionHold();\n        },\n\n        onUnhold() {\n            this.actionUnhold();\n        },\n\n        onDisconnect() {\n            this.actionDisconnect();\n        },\n\n        onTransfer() {\n            this.actionTransfer();\n        },\n\n        onConference() {\n            this.actionConference();\n        },\n\n        onMergeToConference() {\n            this.actionMergeToConference();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"EqUtNOrL\",\"block\":\"[[[10,0],[14,0,\\\"thumbnail-container\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,1],[[[1,\\\"        \\\"],[10,\\\"gux-radial-loading\\\"],[14,\\\"context\\\",\\\"input\\\"],[15,\\\"screenreader-text\\\",[28,[37,2],[\\\"common.loading\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[1,[28,[35,3],null,[[\\\"participant\\\",\\\"text\\\",\\\"iconName\\\"],[[33,4],[33,5],[52,[28,[37,6],[[33,5]],null],\\\"user\\\",null]]]]],[1,\\\"\\\\n\\\"]],[]]],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"data-container\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"top-container\\\"],[12],[1,\\\"\\\\n        \\\"],[10,2],[14,0,\\\"name\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,1],[[[1,\\\"                \\\"],[1,[28,[35,2],[\\\"common.loading\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,4,[\\\"name\\\"]],[[[1,\\\"                \\\"],[1,[33,4,[\\\"name\\\"]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,7],[[[1,\\\"                \\\"],[1,[34,7]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                \\\"],[1,[28,[35,2],[\\\"purecloud.acdInteraction.noName\\\"],null]],[1,\\\"\\\\n            \\\"]],[]]]],[]]]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"bottom-container\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,8],[[[1,\\\"            \\\"],[10,2],[14,1,\\\"consult-control-time-connected\\\"],[14,0,\\\"time-connected\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,9],null,[[\\\"startTime\\\"],[[33,8]]]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"consult-control-time-connected\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,2],[\\\"purecloud.acdInteraction.connectedSince\\\"],[[\\\"connectedTime\\\"],[[33,10]]]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[10,2],[14,0,\\\"time-connected not-connected\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,2],[\\\"purecloud.acdInteraction.notConnected\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"\\\\n\\\"],[41,[33,11],[[[6,[39,12],null,[[\\\"accent\\\"],[\\\"error\\\"]],[[\\\"default\\\"],[[[[1,\\\"                \\\"],[1,[28,[35,2],[\\\"purecloud.acdInteraction.onHoldByHost\\\"],null]],[1,\\\"\\\\n\\\"]],[]]]]]],[]],[[[41,[33,13],[[[6,[39,12],null,[[\\\"accent\\\"],[\\\"error\\\"]],[[\\\"default\\\"],[[[[1,\\\"                \\\"],[1,[28,[35,2],[\\\"purecloud.acdInteraction.onHold\\\"],null]],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"        \\\"]],[]],null]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"actions-container\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,14],[[[41,[28,[37,15],[[33,16],[33,8]],null],[[[41,[33,17],[[[41,[33,11],[[[1,\\\"                    \\\"],[10,\\\"gux-button\\\"],[14,1,\\\"consult-control-unconfine-button\\\"],[14,0,\\\"interaction-consult-unconfine-btn\\\"],[15,\\\"disabled\\\",[36,18]],[15,\\\"onclick\\\",[28,[37,19],[[30,0],\\\"onUnconfine\\\"],null]],[15,\\\"aria-label\\\",[28,[37,2],[\\\"purecloud.acdInteraction.unhold\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,18],[[[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin loading-indicator interaction-consult-control-loading-indicator\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[1,[28,[35,2],[\\\"purecloud.acdInteraction.unhold\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,\\\"gux-button\\\"],[14,1,\\\"consult-control-confine-button\\\"],[14,0,\\\"interaction-consult-confine-btn\\\"],[15,\\\"disabled\\\",[36,18]],[15,\\\"onclick\\\",[28,[37,19],[[30,0],\\\"onConfine\\\"],null]],[15,\\\"aria-label\\\",[28,[37,2],[\\\"purecloud.acdInteraction.hold\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,18],[[[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin loading-indicator interaction-consult-control-loading-indicator\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[1,[28,[35,2],[\\\"purecloud.acdInteraction.hold\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[]],[[[41,[33,20],[[[41,[33,13],[[[1,\\\"                    \\\"],[10,\\\"gux-button\\\"],[14,1,\\\"consult-control-unhold-button\\\"],[14,0,\\\"interaction-consult-unhold-btn\\\"],[15,\\\"disabled\\\",[36,21]],[15,\\\"onclick\\\",[28,[37,19],[[30,0],\\\"onUnhold\\\"],null]],[15,\\\"aria-label\\\",[28,[37,2],[\\\"purecloud.acdInteraction.unhold\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,21],[[[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin loading-indicator interaction-consult-control-loading-indicator\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[1,[28,[35,2],[\\\"purecloud.acdInteraction.unhold\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,\\\"gux-button\\\"],[14,1,\\\"consult-control-hold-button\\\"],[14,0,\\\"interaction-consult-hold-btn\\\"],[15,\\\"disabled\\\",[36,21]],[15,\\\"onclick\\\",[28,[37,19],[[30,0],\\\"onHold\\\"],null]],[15,\\\"aria-label\\\",[28,[37,2],[\\\"purecloud.acdInteraction.hold\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,21],[[[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin loading-indicator interaction-consult-control-loading-indicator\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[1,[28,[35,2],[\\\"purecloud.acdInteraction.hold\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"]],[]],null]],[]]]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,17],[[[1,\\\"            \\\"],[10,\\\"gux-button\\\"],[14,1,\\\"consult-control-transfer-button\\\"],[14,0,\\\"interaction-consult-transfer-btn\\\"],[15,\\\"aria-label\\\",[28,[37,2],[\\\"purecloud.acdInteraction.transfer\\\"],null]],[15,\\\"disabled\\\",[36,22]],[15,\\\"onclick\\\",[28,[37,19],[[30,0],\\\"onTransfer\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,22],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin loading-indicator interaction-consult-control-loading-indicator\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[1,[28,[35,2],[\\\"purecloud.acdInteraction.transfer\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,15],[[33,17],[33,16],[33,8]],null],[[[1,\\\"            \\\"],[10,\\\"gux-button\\\"],[14,1,\\\"consult-control-conference-button\\\"],[14,0,\\\"interaction-consult-conference-btn\\\"],[15,\\\"disabled\\\",[36,23]],[15,\\\"aria-label\\\",[28,[37,2],[\\\"purecloud.acdInteraction.conferencing.startConference\\\"],null]],[15,\\\"onclick\\\",[28,[37,19],[[30,0],\\\"onConference\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,23],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin loading-indicator interaction-consult-control-loading-indicator\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[1,[28,[35,2],[\\\"purecloud.acdInteraction.conferencing.startConference\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null],[1,\\\"    \\\\n    \\\"],[10,\\\"gux-button\\\"],[14,1,\\\"consult-control-disconnect-button\\\"],[14,0,\\\"interaction-consult-disconnect-btn\\\"],[15,\\\"disabled\\\",[36,24]],[15,\\\"onclick\\\",[28,[37,19],[[30,0],\\\"onDisconnect\\\"],null]],[15,\\\"aria-label\\\",[28,[37,2],[\\\"purecloud.disconnect\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,24],[[[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin loading-indicator interaction-consult-control-loading-indicator\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[1,[28,[35,2],[\\\"purecloud.disconnect\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"if\\\",\\\"loading\\\",\\\"t\\\",\\\"target-dropdown/thumbnail\\\",\\\"participant\\\",\\\"initials\\\",\\\"not\\\",\\\"name\\\",\\\"connectedTime\\\",\\\"duration-format\\\",\\\"connectedTimeDisplay\\\",\\\"isConfined\\\",\\\"common-badge\\\",\\\"isHeld\\\",\\\"isInteractionActive\\\",\\\"and\\\",\\\"isCall\\\",\\\"isInitiator\\\",\\\"isConfineLoading\\\",\\\"action\\\",\\\"isConsultant\\\",\\\"isHoldLoading\\\",\\\"isTransferLoading\\\",\\\"isConferenceLoading\\\",\\\"isDisconnectLoading\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel-v2/interaction-consult-controls/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { Maybe } from 'web-directory/types';\nimport { warnClosureAction } from 'web-directory/utils/acd-ts';\n\ntype HeaderAction = {\n    /**\n     * The icon to display in the action button. The icons are utilizing the `gux-icon` component and\n     * will be the value that is provided for `icon-name` in said component.\n     * Can be used in tandem with `text`\n     */\n    icon?: string;\n\n    /**\n     * The text to display as a tooltip when the action is hovered or focused\n     */\n    tooltip?: string;\n\n    /**\n     * `true` if the action is currently disabled or any reason and cannot be\n     * interacted with\n     */\n    disabled?: boolean;\n\n    /**\n     * The text to display within the action button. Can be used in tandem with `icon`\n     */\n    text?: string;\n\n    /**\n     * The accent of button to render. Essentially determines the color scheme.\n     */\n    accent?: 'primary' | 'danger';\n};\n\nexport type HeaderActionGroup = HeaderAction[];\n\nexport default Component.extend({\n    /**\n     * The class to be applied to this component upon render\n     */\n    classNames: ['interaction-header-v2'] as const,\n\n    /**\n     * Class bindings to be conditionally applied to the component.\n     */\n    classNameBindings: ['extraSpacing:extra-spacing'] as const,\n\n    /**\n     * @attribute\n     *\n     * The type of interaction being rendered into the header\n     */\n    type: null as Maybe<string>,\n\n    /**\n     * @attribute\n     *\n     * The subtype of interaction being rendered if applicable\n     */\n    subtype: null as Maybe<string>,\n\n    /**\n     * @attribute\n     *\n     * The engagementSource for the (open messaging) interaction if applicable\n     */\n    engagementSource: null,\n\n    /**\n     * @attribute\n     *\n     * `true` if the interaction has been disconnected. The icon will render differently based on\n     * being connected or disconnected.\n     */\n    isDisconnected: false,\n\n    /**\n     * @attribute\n     *\n     * `true` if the interaction is determined to be apart of a campaign. The icon will change to be\n     * of a preview type if this is the case.\n     */\n    isCampaign: false,\n\n    /**\n     * @attribute\n     *\n     * `true` if the interaction is currently being held\n     */\n    isHeld: false,\n\n    /**\n     * @attribute\n     *\n     * `true` if the agent is currently be confined by an initiating agent of the interaction. Typically\n     * used only for consults\n     */\n    isConfined: false,\n\n    /**\n     * @attribute\n     *\n     * the state that should take priority for visibility to the user. Typically the user wants to see the\n     * state that they are in control over as priority, with the other being the fallback.\n     *\n     * i.e. if a consulting agent is both held and confined, they want to see that they are held first\n     * so they know what they have control over, if they unhold then they will see they are being\n     * confined.\n     */\n    priorityState: 'held' as 'held' | 'confined',\n\n    /**\n     * @attribute\n     *\n     * `true` if the external campaign warning should be showing in the header to warn users about\n     * dialing externally\n     */\n    showExternalCampaignWarning: false,\n\n    /**\n     * @attribute\n     *\n     * `true` if the bottom container of the header should be displayed. The bottom container\n     * shows the interactions duration and hold states. We may not want to show this information\n     * for specific interactions such as workitems.\n     */\n    showBottomContainer: true,\n\n    /**\n     * @attribute\n     *\n     * The name to display within the header showing what interaction the user has selected in this moment\n     */\n    name: null as Maybe<string>,\n\n    /**\n     * @attribute\n     *\n     * The tooltip to render when the name has been hovered or focused upon.\n     */\n    nameTooltip: null as Maybe<string>,\n\n    /**\n     * @attribute\n     *\n     * The division name of the external contact if it exists.\n     */\n    divisionName: null as Maybe<string>,\n\n    /**\n     * @attribute\n     *\n     * The feature toggle to display the external contact division name.\n     */\n    acdExternalContactDivNameFT: false,\n\n    /**\n     * @attribute\n     *\n     * The feature toggle to display engagement source icons for open messaging interactions (PURE-5534)\n     */\n    acdEngagementSourcesFT: false,\n\n    /**\n     * @attribute\n     *\n     * The time that the interaction was determined to be in a connected state for the first time\n     */\n    connectedTime: null as Maybe<number>,\n\n    /**\n     * @attribute\n     *\n     * The display friendly value of the `connectedTime` above provided by the parent\n     */\n    connectedTimeDisplay: null as Maybe<string>,\n\n    /**\n     * @attribute\n     *\n     * The current duration that the interaction has been connected for\n     */\n    connectedDuration: null as Maybe<number>,\n\n    /**\n     * @attribute\n     *\n     * The state of the communication sidebar. True if fully expanded.\n     */\n    communicationSidebarExpanded: null as Maybe<boolean>,\n\n    /**\n     * @attribute\n     *\n     * `true` if the extra actions for the side panel state should be visible to the user. Typically decided\n     * by if the application is in a \"popout\" state.\n     */\n    showExtraActions: false,\n\n    /**\n     * @attribute\n     *\n     * `true` if the extra spacing should be applied to the header. Typically decided\n     * by if the application is being rendered in the new navigation system\n     */\n    extraSpacing: false,\n\n    /**\n     * @action\n     *\n     * Invoked when the copy action takes place in the header\n     */\n    actionCopy: () => warnClosureAction('actionCopy'),\n\n    /**\n     * @action\n     *\n     * Invoked when the user decides to close the sidebar entirely using the \"hide\" action\n     */\n    actionCloseSidebar: () => warnClosureAction('actionCloseSidebar'),\n\n    /**\n     * @action\n     *\n     * Invoked when the user decides to toggle the sidebar (expand/collapse)\n     */\n    actionToggleSidebar: () => warnClosureAction('actionToggleSidebar'),\n\n    actions: {\n        /**\n         * Invoked when the user initiates the copy action from the header\n         */\n        onCopy() {\n            this.actionCopy();\n        },\n\n        /**\n         * Invoked when the user decides to completely close, or hide, the sidebar from the view\n         */\n        onCloseSidebar() {\n            this.actionCloseSidebar();\n        },\n\n        /**\n         * Invoked when the user decides to toggle (expand/collapse) the sidebar from the view\n         */\n        onToggleSidebar() {\n            this.actionToggleSidebar();\n        }\n    }\n});\n","import { computed } from '@ember/object';\nimport Component from '@ember/component';\nimport { Maybe } from 'web-directory/types';\n\ntype ActionButtonAccent = 'primary' | 'secondary' | 'danger';\n\n/**\n * @notes\n * instead of using `onclick` (or other on<event>) during the implementation, custom components that use\n * interactive elements in ember as an alias do not work with the `on` portion prefixed. When wanting to\n * add a listener to the events you should drop the `on` and just use `click`.\n *\n * @usage\n * {{acd-interactions-panel-v2/interaction-header/header-button click=(action 'onEvent')}}\n */\nexport default Component.extend({\n    /**\n     * List of class names to be applied to the component on render\n     */\n    classNames: ['interaction-header-button'] as const,\n\n    /**\n     * List of dynamic class names that will change based on the corresponding property values\n     */\n    classNameBindings: ['accent'] as const,\n\n    /**\n     * List of dynamic attributes that will change based on the corresponding property values\n     */\n    attributeBindings: [\n        'accent',\n        'type',\n        'disabled',\n        'effectiveAriaDisabled:aria-disabled',\n        'superscript',\n        'ariaLabel',\n        'ariaPressed',\n        'ariaExpanded'\n    ] as const,\n\n    /**\n     * The element that this component should render as when created\n     */\n    tagName: 'button' as const,\n\n    /**\n     * The type of the button for html semantic reasons\n     */\n    type: 'button' as const,\n\n    /**\n     * @attribute\n     *\n     * `true` if the component should not be interacted with\n     */\n    disabled: false,\n\n    /**\n     * @attribute\n     *\n     * The color the button should render as. Defaults to primary\n     */\n    accent: 'primary' as ActionButtonAccent,\n\n    /**\n     * @attribute\n     *\n     * the additional context to add to the button that will appear in the top right\n     * corner of the button as a bubble with the content provided.\n     */\n    superscript: undefined as Maybe<string>,\n\n    /**\n     * @attribute\n     *\n     * The aria-label state of the control, used in attribute binding\n     */\n    ariaLabel: undefined as string | undefined,\n\n    /**\n     * @attribute\n     *\n     * The aria-pressed state of the control, used in attribute binding\n     */\n    ariaPressed: undefined as 'true' | 'false' | undefined,\n\n    /**\n     * @attribute\n     *\n     * The aria-expanded state of the control, used in attribute binding\n     */\n    ariaExpanded: undefined as 'true' | 'false' | undefined,\n\n    /**\n     * @attribute\n     *\n     * The aria-disabled state of the control, used in effectiveAriaDisabled computed property\n     */\n    ariaDisabled: undefined as 'true' | 'false' | undefined,\n\n    /**\n     * Computed value to determine aria-disabled, used in attribute binding\n     */\n    effectiveAriaDisabled: computed('disabled', 'ariaDisabled', function (): 'true' | 'false' | undefined {\n        if (this.get('disabled')) return 'true';\n        return this.get('ariaDisabled');\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"ZQsy0ZdD\",\"block\":\"[[[18,1,null]],[\\\"&default\\\"],false,[\\\"yield\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel-v2/interaction-header/header-button/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { next } from '@ember/runloop';\nimport { computed } from '@ember/object';\nimport { warnClosureAction } from 'web-directory/utils/acd-ts';\n\ntype ActionButtonAccent = 'primary';\n\ntype DropdownOption = {\n    text: string;\n    value: string;\n};\n\n/**\n * @notes\n * instead of using `onclick` (or other on<event>) during the implementation, custom components that use\n * interactive elements in ember as an alias do not work with the `on` portion prefixed. When wanting to\n * add a listener to the events you should drop the `on` and just use `click`.\n *\n * @usage\n * {{acd-interactions-panel-v2/interaction-header/header-dropdown click=(action 'onEvent')}}\n */\nexport default Component.extend({\n    /**\n     * List of class names to be applied to the component on render\n     */\n    classNames: ['interaction-header-dropdown'] as const,\n\n    /**\n     * List of dynamic class names that will change based on the corresponding property values\n     */\n    classNameBindings: ['accent'] as const,\n\n    /**\n     * List of dynamic attributes that will change based on the corresponding property values\n     */\n    attributeBindings: ['accent', 'disabled', 'disabled:aria-disabled'] as const,\n\n    /**\n     * @attribute\n     *\n     * `true` if the component should not be interacted with\n     */\n    disabled: false,\n\n    /**\n     * @attribute\n     *\n     * The color the button should render as. Defaults to primary\n     */\n    accent: 'primary' as ActionButtonAccent,\n\n    /**\n     * @attribute\n     */\n    options: [] as DropdownOption[],\n\n    /**\n     * @attribute\n     */\n    tooltip: undefined as string | undefined,\n\n    /**\n     * @attribute\n     */\n    selectedOptionsIndex: undefined as undefined | number,\n\n    /**\n     * used to create a unique id for the tooltip and header button\n     */\n    tooltipId: computed('elementId', function () {\n        return `${this.get('elementId')}-header-dropdown-button`;\n    }),\n\n    selected: computed('options', 'selectedOptionsIndex', function () {\n        if (typeof this.get('selectedOptionsIndex') === 'number') {\n            return this.get('options')[this.get('selectedOptionsIndex')];\n        }\n    }),\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n        // if we were given options and nothing has been selected, we need to provide a default\n        if (!this.get('selected') && this.get('options')?.length) {\n            next(this, () => {\n                this.set('selectedOptionsIndex', 0);\n            });\n        }\n    },\n\n    /**\n     * @action\n     */\n    actionSelected: (option: DropdownOption) => warnClosureAction('actionSelected', option),\n\n    actions: {\n        onOptionSelect(optionIndex: number) {\n            this.set('selectedOptionsIndex', optionIndex);\n        },\n\n        onAction() {\n            if (this.get('selected')) {\n                this.actionSelected(this.get('selected'));\n            }\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"N9gvDmAi\",\"block\":\"[[[6,[39,0],null,[[\\\"id\\\",\\\"class\\\",\\\"disabled\\\",\\\"click\\\"],[[33,1],\\\"dropdown-display-button\\\",[33,2],[28,[37,3],[[30,0],\\\"onAction\\\"],null]]],[[\\\"default\\\"],[[[[1,\\\"    \\\"],[18,3,null],[1,\\\"\\\\n\\\\n    \\\"],[10,2],[14,0,\\\"dropdown-display-button__text\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[33,5,[\\\"text\\\"]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"\\\\n\\\"],[41,[33,7],[[[1,\\\"    \\\"],[10,\\\"gux-tooltip\\\"],[14,0,\\\"dropdown-display-button__tooltip\\\"],[15,\\\"for\\\",[36,1]],[12],[1,\\\"\\\\n        \\\"],[1,[34,7]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[6,[39,0],null,[[\\\"class\\\",\\\"disabled\\\"],[\\\"dropdown-trigger-button\\\",[33,2]]],[[\\\"default\\\"],[[[[1,\\\"    \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"dropdown-icon dropdown-display-button__icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/chevron-down\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\\n\\\"],[6,[39,8],null,null,[[\\\"default\\\"],[[[[1,\\\"        \\\"],[10,0],[14,0,\\\"interaction-header-dropdown-container\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,10],[[28,[37,10],[[33,11]],null]],null],null,[[[1,\\\"                \\\"],[10,\\\"button\\\"],[14,\\\"popover-action\\\",\\\"close\\\"],[14,0,\\\"btn btn-link\\\"],[15,\\\"onclick\\\",[28,[37,3],[[30,0],\\\"onOptionSelect\\\",[30,2]],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[30,1,[\\\"text\\\"]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[1,2]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]]],[]]]]]],[\\\"option\\\",\\\"index\\\",\\\"&default\\\"],false,[\\\"acd-interactions-panel-v2/interaction-header/header-button\\\",\\\"tooltipId\\\",\\\"disabled\\\",\\\"action\\\",\\\"yield\\\",\\\"selected\\\",\\\"if\\\",\\\"tooltip\\\",\\\"dynamic-popover\\\",\\\"each\\\",\\\"-track-array\\\",\\\"options\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel-v2/interaction-header/header-dropdown/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { Maybe } from 'web-directory/types';\nimport { run } from '@ember/runloop';\n\nexport default Component.extend({\n    /**\n     * List of class names to be applied to the component during render\n     */\n    classNames: ['interaction-header-group'] as const,\n\n    /**\n     * List of dynamic class names to be applied to component affected by\n     * their corresponding property.\n     */\n    classNameBindings: ['hidden'] as const,\n\n    /**\n     * `true` if the there is content detected from within the group.\n     * defaults to true to avoid any millisecond rendering oddities\n     */\n    hidden: true,\n\n    /**\n     * reference to a lightweight observer detecting when the children of the element\n     * have been updated so we can track visibility based on element children\n     */\n    mutationObserver: null as Maybe<MutationObserver>,\n\n    didInsertElement() {\n        this._super(...arguments);\n        if (this.element) {\n            this.determineVisibility();\n\n            const observer = new MutationObserver(() => this.determineVisibility());\n            observer.observe(this.element, {\n                characterData: false,\n                childList: true,\n                attributes: false\n            });\n            this.set('mutationObserver', observer);\n        }\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        const observer = this.get('mutationObserver');\n        if (observer) {\n            observer.disconnect();\n            this.set('mutationObserver', null);\n        }\n    },\n\n    /**\n     * Determines if this element should be hidden or not based on the elements\n     * children length.\n     *\n     * @param element the element to track the children of\n     */\n    determineVisibility() {\n        run(() => {\n            this.set('hidden', this.element ? !this.element.children.length : true);\n        });\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"a5b/XXrP\",\"block\":\"[[[18,1,null]],[\\\"&default\\\"],false,[\\\"yield\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel-v2/interaction-header/header-group/template.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"6+eTSwYo\",\"block\":\"[[[1,[28,[35,0],null,[[\\\"type\\\",\\\"subtype\\\",\\\"engagementSource\\\",\\\"state\\\",\\\"isDisconnected\\\",\\\"isCampaign\\\",\\\"size\\\",\\\"acdEngagementSourcesFT\\\"],[[33,1],[33,2],[33,3],[33,4],[33,5],[33,6],\\\"large\\\",[33,7]]]]],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"data-container\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"top-container\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"h2\\\"],[14,1,\\\"interaction-header-participant-name\\\"],[14,0,\\\"participant-name\\\"],[15,\\\"aria-label\\\",[29,[[36,8]]]],[12],[1,\\\"\\\\n            \\\"],[1,[34,9]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,11],[[33,12],[33,13]],null],[[[41,[28,[37,14],[[28,[37,15],[[28,[37,16],[[33,1],\\\"workitem\\\"],null]],null],[33,17]],null],[[[6,[39,18],null,null,[[\\\"default\\\"],[[[[1,\\\"                    \\\"],[1,[34,12]],[1,\\\"\\\\n\\\"]],[]]]]]],[]],null]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,8],[[[1,\\\"            \\\"],[10,\\\"gux-tooltip\\\"],[14,1,\\\"interaction-header-participant-name-tooltip\\\"],[14,\\\"for\\\",\\\"interaction-header-participant-name\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[34,8]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[51,[28,[37,14],[[28,[37,16],[[33,1],\\\"callback\\\"],null],[28,[37,16],[[33,1],\\\"workitem\\\"],null]],null]],[[[1,\\\"            \\\"],[10,\\\"button\\\"],[15,\\\"onclick\\\",[28,[37,20],[[30,0],\\\"onCopy\\\"],null]],[14,0,\\\"copy-action-button\\\"],[15,\\\"aria-label\\\",[28,[37,21],[\\\"purecloud.acdInteraction.copyLink\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"copy\\\"],[15,\\\"screenreader-text\\\",[28,[37,21],[\\\"purecloud.acdInteraction.copyLink\\\"],null]],[12],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,21],[\\\"purecloud.acdInteraction.copyLink\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,22],[[[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[14,1,\\\"interaction-header-campaign-warning\\\"],[14,0,\\\"external-campaign-warning\\\"],[14,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[15,\\\"screenreader-text\\\",[28,[37,21],[\\\"purecloud.acdInteraction.callbacks.externalCampaign\\\"],null]],[12],[13],[1,\\\"\\\\n            \\\"],[10,\\\"gux-tooltip\\\"],[14,1,\\\"interaction-header-campaign-warning-tooltip\\\"],[14,\\\"for\\\",\\\"interaction-header-campaign-warning\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,21],[\\\"purecloud.acdInteraction.callbacks.externalCampaign\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,23],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"bottom-container\\\"],[12],[1,\\\"\\\\n            \\\"],[10,2],[14,1,\\\"interaction-header-time-connected\\\"],[14,0,\\\"time-connected\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,5],[[[1,\\\"                    \\\"],[1,[28,[35,24],null,[[\\\"durationInMs\\\"],[[33,25]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[1,[28,[35,24],null,[[\\\"startTime\\\"],[[33,26]]]]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,\\\"gux-tooltip\\\"],[14,1,\\\"interaction-header-time-connected-tooltip\\\"],[14,\\\"for\\\",\\\"interaction-header-time-connected\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[34,27]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,16],[[33,1],\\\"call\\\"],null],[[[41,[33,28],[[[6,[39,29],null,[[\\\"class\\\",\\\"accent\\\"],[\\\"interaction-header-confined-badge\\\",\\\"error\\\"]],[[\\\"default\\\"],[[[[1,\\\"                        \\\"],[1,[28,[35,21],[\\\"purecloud.acdInteraction.onHoldByHost\\\"],null]],[1,\\\"\\\\n\\\"]],[]]]]]],[]],[[[41,[33,30],[[[6,[39,29],null,[[\\\"class\\\",\\\"accent\\\"],[\\\"interaction-header-hold-badge\\\",\\\"error\\\"]],[[\\\"default\\\"],[[[[1,\\\"                        \\\"],[1,[28,[35,21],[\\\"purecloud.acdInteraction.onHold\\\"],null]],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"                \\\"]],[]],null]],[]]]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"actions-container\\\"],[12],[1,\\\"\\\\n    \\\"],[18,1,null],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,32],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"extra-actions-container\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-button\\\"],[14,1,\\\"interaction-header-hide-button\\\"],[14,\\\"role\\\",\\\"button\\\"],[14,\\\"accent\\\",\\\"ghost\\\"],[15,\\\"aria-label\\\",[28,[37,21],[\\\"common.hide\\\"],null]],[15,\\\"onclick\\\",[28,[37,20],[[30,0],\\\"onCloseSidebar\\\"],null]],[12],[1,\\\"\\\\n\\\"],[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"chevron-left\\\"],[15,\\\"screenreader-text\\\",[28,[37,21],[\\\"common.hide\\\"],null]],[12],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"gux-tooltip\\\"],[14,1,\\\"interaction-header-hide-button-tooltip\\\"],[14,\\\"for\\\",\\\"interaction-header-hide-button\\\"],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,[28,[35,21],[\\\"common.hide\\\"],null]],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[14,0,\\\"interaction-header-toggle-view-button-wrapper\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-button\\\"],[14,1,\\\"interaction-header-toggle-view-button\\\"],[14,\\\"role\\\",\\\"button\\\"],[14,\\\"accent\\\",\\\"ghost\\\"],[15,\\\"aria-label\\\",[52,[33,33],[28,[37,21],[\\\"common.collapse\\\"],null],[28,[37,21],[\\\"common.expand\\\"],null]]],[15,\\\"aria-expanded\\\",[52,[33,33],[33,34],[33,35]]],[15,\\\"onclick\\\",[28,[37,20],[[30,0],\\\"onToggleSidebar\\\"],null]],[12],[1,\\\"\\\\n\\\"],[41,[33,33],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/arrow-down-left-and-arrow-up-right-to-center-regular\\\"],[15,\\\"screenreader-text\\\",[28,[37,21],[\\\"common.collapse\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/arrow-up-right-and-arrow-down-left-from-center-regular\\\"],[15,\\\"screenreader-text\\\",[28,[37,21],[\\\"common.expand\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,\\\"gux-tooltip\\\"],[14,1,\\\"interaction-header-toggle-view-button-tooltip\\\"],[14,\\\"for\\\",\\\"interaction-header-toggle-view-button\\\"],[12],[1,\\\"\\\\n                \\\"],[10,1],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,33],[[[1,\\\"                        \\\"],[1,[28,[35,21],[\\\"common.collapse\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[1,[28,[35,21],[\\\"common.expand\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"&default\\\"],false,[\\\"acd-interactions-panel-v2/interaction-type-icon\\\",\\\"type\\\",\\\"subtype\\\",\\\"engagementSource\\\",\\\"state\\\",\\\"isDisconnected\\\",\\\"isCampaign\\\",\\\"acdEngagementSourcesFT\\\",\\\"nameTooltip\\\",\\\"name\\\",\\\"if\\\",\\\"and\\\",\\\"divisionName\\\",\\\"acdExternalContactDivNameFT\\\",\\\"or\\\",\\\"not\\\",\\\"eq\\\",\\\"acdExternalContactWorkitemsDivNameFT\\\",\\\"tags-input/label\\\",\\\"unless\\\",\\\"action\\\",\\\"t\\\",\\\"showExternalCampaignWarning\\\",\\\"showBottomContainer\\\",\\\"duration-format\\\",\\\"connectedDuration\\\",\\\"connectedTime\\\",\\\"connectedTimeDisplay\\\",\\\"isConfined\\\",\\\"common-badge\\\",\\\"isHeld\\\",\\\"yield\\\",\\\"showExtraActions\\\",\\\"communicationSidebarExpanded\\\",\\\"‘true’\\\",\\\"‘false’\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel-v2/interaction-header/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport type { GuxPopoverCustomEvent } from 'genesys-spark-components';\nimport { doFocus } from 'web-directory/utils/focus-management';\n\nconst PopoverProperties = ['showSettings', 'showCall', 'showEmail', 'showMessaging'] as const;\ntype PopoverProperty = (typeof PopoverProperties)[number];\n\nexport default Component.extend({\n    classNames: ['interaction-roster-header'] as const,\n\n    /**\n     * @attribute\n     */\n    canCreateCall: false,\n\n    /**\n     * @attribute\n     */\n    canCreateMessage: false,\n\n    /**\n     * @attribute\n     */\n    canCreateEmail: false,\n\n    /**\n     * @attribute\n     */\n    canShowActions: false,\n\n    /**\n     * @attribute\n     */\n    currentUserId: null as string | null,\n\n    /**\n     * @attribute\n     */\n    emergencyLocationData: null,\n\n    /**\n     * @attribute\n     */\n    emergencyLocationOn: false,\n\n    /**\n     * @attribute\n     */\n    acdPanelOpen: false,\n\n    /**\n     * @attribute\n     */\n    agentAddressOnBehalfOfQueue: false,\n\n    /**\n     * `true` if the settings popover is currently being rendered\n     */\n    showSettings: false,\n\n    /**\n     * `true` if the outbound call popover is currently being rendered\n     */\n    showCall: false,\n\n    /**\n     * `true` if the outbound email popover is currently being rendered\n     */\n    showEmail: false,\n\n    /**\n     * `true` if the outbound messaging popover is currently being rendered\n     */\n    showMessaging: false,\n\n    guxdismiss(event: GuxPopoverCustomEvent<void>) {\n        const targetForAttr = event.target.for;\n        doFocus(this, `#${targetForAttr}`);\n        this.onClosePopover();\n    },\n\n    onClosePopover() {\n        document.querySelectorAll('gux-popover').forEach((element: any) => {\n            element.isOpen = false;\n            // For Aria Expanded Labels\n            this.setProperties({\n                showSettings: false,\n                showCall: false,\n                showEmail: false,\n                showMessaging: false\n            });\n        });\n    },\n\n    actions: {\n        onTogglePopover(prop: PopoverProperty, popoverId: string) {\n            const popover: any = document.querySelector(popoverId);\n            if (!popover) return;\n            popover.isOpen = !popover.isOpen;\n            this.set(prop, !this.get(prop)); // For Aria Expanded Labels\n        },\n\n        onClosePopover(prop: PopoverProperty, popoverId: string) {\n            const popover: any = document.querySelector(popoverId);\n            if (!popover) return;\n            popover.isOpen = false;\n            this.set(prop, false); // For Aria Expanded Labels\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"A8HOnRfn\",\"block\":\"[[[10,\\\"h2\\\"],[14,0,\\\"header-text\\\"],[14,1,\\\"interactions-heading\\\"],[12],[1,\\\"\\\\n    \\\"],[1,[28,[35,0],[\\\"purecloud.acdInteraction.activeConversations\\\"],null]],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"interaction-roster-header-buttons\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"button-container\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"button\\\"],[14,1,\\\"interaction-settings-popover-target\\\"],[15,\\\"aria-label\\\",[28,[37,0],[\\\"components.navMenu.preferences\\\"],null]],[15,\\\"aria-expanded\\\",[52,[33,2],\\\"true\\\",\\\"false\\\"]],[14,0,\\\"interaction-roster-header-btn settings-toggle\\\"],[15,\\\"onclick\\\",[28,[37,3],[[30,0],\\\"onTogglePopover\\\",\\\"showSettings\\\",\\\"#interaction-settings-popover\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"settings\\\"],[15,\\\"screenreader-text\\\",[28,[37,0],[\\\"components.navMenu.preferences\\\"],null]],[12],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"interaction-settings-popover-target\\\"],[14,\\\"placement\\\",\\\"bottom\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,0],[\\\"components.navMenu.preferences\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"gux-popover\\\"],[14,\\\"position\\\",\\\"bottom-start\\\"],[14,1,\\\"interaction-settings-popover\\\"],[14,\\\"for\\\",\\\"interaction-settings-popover-target\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,2],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"interaction-settings-popover-container\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"interaction-settings-header\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                        \\\"],[10,\\\"h3\\\"],[14,0,\\\"interaction-settings-header-text\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,0],[\\\"purecloud.acdInteraction.interactionSettings.header\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\\n                    \\\"],[10,0],[14,0,\\\"interaction-settings-section\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[34,4]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\\n                    \\\"],[10,0],[14,0,\\\"interaction-settings-section\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[34,5]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,6],[[[41,[33,7],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"button-container\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"button\\\"],[14,1,\\\"interaction-new-call-outbound-target\\\"],[14,0,\\\"interaction-roster-header-btn new-call new-outbound\\\"],[15,\\\"aria-label\\\",[28,[37,0],[\\\"purecloud.startNewCallTooltip\\\"],null]],[15,\\\"aria-expanded\\\",[52,[33,8],\\\"true\\\",\\\"false\\\"]],[15,\\\"onclick\\\",[28,[37,3],[[30,0],\\\"onTogglePopover\\\",\\\"showCall\\\",\\\"#interaction-new-call-outbound-popover\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"phone\\\"],[15,\\\"screenreader-text\\\",[28,[37,0],[\\\"purecloud.startNewCallTooltip\\\"],null]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"interaction-new-call-outbound-target\\\"],[14,\\\"placement\\\",\\\"bottom\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,0],[\\\"purecloud.startNewCallTooltip\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\\n                \\\"],[10,\\\"gux-popover\\\"],[14,\\\"position\\\",\\\"bottom-start\\\"],[14,1,\\\"interaction-new-call-outbound-popover\\\"],[14,\\\"for\\\",\\\"interaction-new-call-outbound-target\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,8],[[[1,\\\"                        \\\"],[10,0],[14,0,\\\"dialpad-dropdown add-participants interaction-outbound-popover-container\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,9],null,[[\\\"showDialpadToggle\\\",\\\"showTitle\\\",\\\"actionClose\\\"],[true,true,[28,[37,3],[[30,0],\\\"onClosePopover\\\",\\\"showCall\\\",\\\"#interaction-new-call-outbound-popover\\\"],null]]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[33,10],[[[1,\\\"                                \\\"],[1,[28,[35,11],null,[[\\\"showTitle\\\",\\\"showResetButton\\\",\\\"personId\\\",\\\"emergencyLocationData\\\"],[true,false,[33,12],[33,13]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,14],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"button-container\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"button\\\"],[14,1,\\\"interaction-new-email-outbound-target\\\"],[14,0,\\\"interaction-roster-header-btn new-email new-outbound\\\"],[15,\\\"aria-label\\\",[28,[37,0],[\\\"purecloud.startNewEmailTooltip\\\"],null]],[15,\\\"aria-expanded\\\",[52,[33,15],\\\"true\\\",\\\"false\\\"]],[15,\\\"onclick\\\",[28,[37,3],[[30,0],\\\"onTogglePopover\\\",\\\"showEmail\\\",\\\"#interaction-new-email-outbound-popover\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"message-email\\\"],[15,\\\"screenreader-text\\\",[28,[37,0],[\\\"purecloud.startNewEmailTooltip\\\"],null]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"interaction-new-email-outbound-target\\\"],[14,\\\"placement\\\",\\\"bottom\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,0],[\\\"purecloud.startNewEmailTooltip\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\\n                \\\"],[10,\\\"gux-popover\\\"],[14,\\\"position\\\",\\\"bottom-start\\\"],[14,1,\\\"interaction-new-email-outbound-popover\\\"],[14,\\\"for\\\",\\\"interaction-new-email-outbound-target\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,15],[[[1,\\\"                        \\\"],[10,0],[14,0,\\\"interaction-outbound-popover-container\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,16],null,[[\\\"showTitle\\\",\\\"actionClose\\\"],[true,[28,[37,3],[[30,0],\\\"onClosePopover\\\",\\\"showEmail\\\",\\\"#interaction-new-email-outbound-popover\\\"],null]]]]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,17],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"button-container\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"button\\\"],[14,1,\\\"interaction-new-message-outbound-target\\\"],[14,0,\\\"interaction-roster-header-btn new-message new-outbound\\\"],[15,\\\"aria-label\\\",[28,[37,0],[\\\"purecloud.startNewSmsInteractionTooltip\\\"],null]],[15,\\\"aria-expanded\\\",[52,[33,18],\\\"true\\\",\\\"false\\\"]],[15,\\\"onclick\\\",[28,[37,3],[[30,0],\\\"onTogglePopover\\\",\\\"showMessaging\\\",\\\"#interaction-new-message-outbound-popover\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"sms\\\"],[15,\\\"screenreader-text\\\",[28,[37,0],[\\\"purecloud.startNewSmsInteractionTooltip\\\"],null]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"interaction-new-message-outbound-target\\\"],[14,\\\"placement\\\",\\\"bottom\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,0],[\\\"purecloud.startNewSmsInteractionTooltip\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\\n                \\\"],[10,\\\"gux-popover\\\"],[14,\\\"position\\\",\\\"bottom-start\\\"],[14,1,\\\"interaction-new-message-outbound-popover\\\"],[14,\\\"for\\\",\\\"interaction-new-message-outbound-target\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,18],[[[1,\\\"                        \\\"],[10,0],[14,0,\\\"interaction-outbound-popover-container\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,19],null,[[\\\"showTitle\\\",\\\"actionClose\\\",\\\"agentAddressOnBehalfOfQueue\\\"],[true,[28,[37,3],[[30,0],\\\"onClosePopover\\\",\\\"showMessaging\\\",\\\"#interaction-new-message-outbound-popover\\\"],null],[33,20]]]]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null],[13]],[],false,[\\\"t\\\",\\\"if\\\",\\\"showSettings\\\",\\\"action\\\",\\\"components/application-preferences/interactions\\\",\\\"device-selection-with-preview\\\",\\\"canShowActions\\\",\\\"canCreateCall\\\",\\\"showCall\\\",\\\"dial-pad\\\",\\\"emergencyLocationOn\\\",\\\"emergency-location\\\",\\\"currentUserId\\\",\\\"emergencyLocationData\\\",\\\"canCreateEmail\\\",\\\"showEmail\\\",\\\"acd-interactions-panel/interaction-create-email\\\",\\\"canCreateMessage\\\",\\\"showMessaging\\\",\\\"acd-interactions-panel/interaction-create-message\\\",\\\"agentAddressOnBehalfOfQueue\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel-v2/interaction-roster/interaction-roster-header/template.hbs\",\"isStrictMode\":false});","import LoggerMixin from 'web-directory/mixins/logger';\nimport MessageNotificationsMixin from 'web-directory/mixins/chat-service/message-notifications';\nimport EmbeddedMessageEventHandlerMixin from 'web-directory/mixins/embedded-message-event-handler';\nimport Component from '@ember/component';\nimport { inject } from '@ember/service';\nimport { computed, observer } from '@ember/object';\nimport { warnClosureAction } from 'web-directory/utils/acd';\n\nexport default Component.extend(LoggerMixin, MessageNotificationsMixin, EmbeddedMessageEventHandlerMixin, {\n    classNames: ['interaction-script'],\n    tagName: 'iframe',\n    attributeBindings: ['role', 'allow', 'title'],\n    role: 'presentation',\n    allow: ['clipboard-write'],\n    title: computed('intl', function () {\n        return this.get('intl').safestring('purecloud.acdInteraction.scripts');\n    }),\n\n    didInsertElement() {\n        this._super(...arguments);\n        this._updateFrameUrl(this.get('frameUrl'));\n    },\n\n    isScriptAvailable: (interaction: any) => warnClosureAction('isScriptAvailable', interaction),\n\n    intl: inject('intl'),\n    session: inject('session'),\n    permissions: inject('permissions'),\n\n    hasScriptViewPermission: computed.reads('permissions.canViewPublishedScripts'),\n\n    frameUrl: computed('selectedInteraction', 'intl.isoLocale', 'session.publicApiUser.id', function () {\n        const pathName = '/scripter/';\n        const queryParameter = `?locale=${this.get('intl.isoLocale')}&user=${this.get('session.publicApiUser.id')}`;\n        const interactionId = this.get('selectedInteraction.id');\n        const isNotListeningOrAssistingAgent = !this.get('selectedInteraction.myselfIsMonitorV2');\n        const interactionSupportsScripts =\n            this.isScriptAvailable(this.get('selectedInteraction')) &&\n            (this.get('selectedInteraction.isCall') ||\n                this.get('selectedInteraction.isCallback') ||\n                this.get('selectedInteraction.isChat') ||\n                this.get('selectedInteraction.isSms') ||\n                this.get('selectedInteraction.isEmail')) &&\n            isNotListeningOrAssistingAgent;\n\n        let hash = '#';\n        if (this.get('hasScriptViewPermission') && interactionId && interactionSupportsScripts) {\n            hash = `#interactionId=${interactionId}`;\n        }\n\n        const url = `${pathName}${queryParameter}${hash}`;\n\n        this.get('logger').debug('Scripter component - handleLocationChange change', url);\n\n        return url;\n    }),\n\n    // Uses location.replace to update the url (rather than binding to \"src\")\n    //  in order to prevent the URL change from adding an entry to the page history\n    //  and allowing the browser back button to reverse it.\n    _updateFrameUrl: function (this: any, newUrl: string) {\n        // If the frame isn't ready yet, set a callback for later\n        if (!this.element.contentWindow) {\n            this.element.onload = () => {\n                this._updateFrameUrl(newUrl);\n                this.element.onload = null;\n            };\n        } else {\n            this.element.contentWindow.location.replace(newUrl);\n            const interactionId = this.get('selectedInteraction.id');\n            if (interactionId && (!newUrl || !newUrl.includes(`#interactionId=${interactionId}`))) {\n                // Scripter is not applicable for this interaction (i.e. permissions/interaction type)\n                // Dispatch an event so the parent component does not indefinitely wait on script resolution\n                const scriptReportCallback = this.get('scriptAvailabilityChanged');\n                if (typeof scriptReportCallback === 'function') {\n                    scriptReportCallback(false);\n                }\n            }\n        }\n    },\n    _updateFrameUrlOnChange: observer('frameUrl', function (this: any) {\n        this._updateFrameUrl(this.get('frameUrl'));\n    }),\n\n    //These handlers are used by the EmbeddedMessageEventHandlerMixin when the message type matches the key\n    messageHandlers: {\n        toast(this: any, data: any) {\n            if (data.publishOnUserInteraction) {\n                data.clickHandler = () => {\n                    this.sendMessage('publish', data.publishOnUserInteraction);\n                };\n            }\n            this.sendEngageNotification(data);\n        },\n        scriptexists(this: any, data: any) {\n            const scriptReportCallback = this.get('scriptAvailabilityChanged');\n            if (typeof scriptReportCallback === 'function') {\n                scriptReportCallback(data);\n            }\n        }\n    }\n});\n","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { inject } from '@ember/service';\nimport { IntlService } from '@web-directory/services';\nimport { RosterCardState } from 'web-directory/components/acd-interactions-panel/interaction-card-v2/base-card/component';\nimport { Maybe } from 'web-directory/types';\nimport { getIconName, getTextKey } from 'web-directory/utils/interaction-icons';\nimport { MESSAGING_SUBTYPES } from 'web-directory/utils/supported-messaging-subtypes';\ninterface InteractionTypeIcon {\n    intl: IntlService;\n    type: Maybe<string>;\n    subtype: Maybe<MessagingSubtype>;\n    engagementSource: Maybe<string>;\n    state: Maybe<RosterCardState>;\n    isDisconnected: boolean;\n    isCampaign: boolean;\n    acdEngagementSourcesFT: Maybe<boolean>;\n}\n\ntype IconSize = 'small' | 'medium' | 'large';\ntype MessagingSubtype = (typeof MESSAGING_SUBTYPES)[number];\n\nexport default Component.extend({\n    /**\n     * The classes to be applied to the component upon render\n     */\n    classNames: ['interaction-type-icon-v2'] as const,\n\n    /**\n     * Bindings of attributes to apply to the component upon render\n     */\n    attributeBindings: ['tooltipTextId:id'] as const,\n\n    /**\n     * The classes to be dynamically applied to the component based on the values\n     * of the corresponding properties\n     */\n    classNameBindings: ['iconName', 'size'] as const,\n\n    /**\n     * The html element to be rendered for this component. Default is `div`\n     */\n    tagName: 'span' as const,\n\n    /**\n     * translation service used to translate the accessibility keys in the component\n     */\n    intl: inject('intl'),\n\n    /**\n     * @attribute\n     *\n     * Feature toggle to display engagement source icons for open messaging interactions (PURE-5534)\n     */\n    acdEngagementSourcesFT: false,\n\n    /**\n     * @attribute\n     *\n     * The interaction type of the icon being displayed. The type changes the base icon\n     */\n    type: null as Maybe<string>,\n\n    /**\n     * @attribute\n     *\n     * The subtype of the interaction. Not applicable to all interaction types.\n     */\n    subtype: null as Maybe<MessagingSubtype>,\n\n    /**\n     * @attribute\n     *\n     * The state of the interaction (Held, Draft, Wrapup, etc.)\n     */\n    state: null as Maybe<RosterCardState>,\n\n    /**\n     * @attribute\n     *\n     * The engagement source of an open messaging interaction or undefined, if available\n     */\n    engagementSource: null,\n\n    /**\n     * @attribute\n     *\n     * `true` if the interaction has been marked as disconnected. Changes what icon is rendered if so.\n     */\n    isDisconnected: false,\n\n    /**\n     * @attribute\n     *\n     * `true` if the interaction is a part of a campaign. This will change the icon to be of preview variety.\n     */\n    isCampaign: false,\n\n    /**\n     * @attribute\n     *\n     * The size of the icon based on presets to keep the values consistent\n     */\n    size: 'small' as IconSize,\n\n    /**\n     * The locale key to use for accessibility reasons based on provided values\n     */\n    accessibleIconTextKey: computed(\n        'acdEngagementSourcesFT',\n        'engagementSource',\n        'isCampaign',\n        'subtype',\n        'type',\n        function (this: Component & InteractionTypeIcon) {\n            const type = this.get('type');\n            const baseKey = 'purecloud.acdInteraction.interactionTypes';\n\n            if (type === 'callback' && this.get('isCampaign')) {\n                return this.get('intl').safestring(`${baseKey}.preview`);\n            }\n\n            const subtype = this.get('subtype');\n            if (type === 'message') {\n                if (subtype && MESSAGING_SUBTYPES.includes(subtype)) {\n                    if (subtype === 'apple') {\n                        return this.get('intl').safestring(`${baseKey}.messageTypes.${subtype}`);\n                    }\n                    if (subtype === 'facebook') {\n                        return this.get('intl').safestring(`${baseKey}.${type}Types.${subtype}Meta`);\n                    } else if (subtype === 'twitter') {\n                        return this.get('intl').safestring(`${baseKey}.${type}Types.${subtype}X`);\n                    } else if (\n                        subtype === 'open' &&\n                        this.get('acdEngagementSourcesFT') &&\n                        this.get('engagementSource')\n                    ) {\n                        return this.get('intl').safestring(getTextKey(this.get('engagementSource')));\n                    }\n                    return this.get('intl').safestring(`${baseKey}.${type}Types.${subtype}`);\n                }\n                return this.get('intl').safestring(`${baseKey}.${type}Types.unknown`);\n            }\n\n            return this.get('intl').safestring(`${baseKey}.${type}`);\n        }\n    ),\n\n    /**\n     * The text key for `state.textKey` screenreader accessibility. (Used for the badge icons in the roster.)\n     */\n    accessibleStateTextKey: computed('state', 'state.{icon,textKey,unreadCount}', function () {\n        if (this.get('state')?.textKey) {\n            return this.get('intl').safestring(this.get('state')?.textKey, {\n                unreadMessageCount: this.get('state')?.unreadCount\n            });\n        }\n        return '';\n    }),\n\n    /**\n     * The tooltip text key for icons and icons with badges. (Used for screenreader accessibility and tooltips.)\n     */\n    accessibleTextKey: computed(\n        'state',\n        'state.{icon,loading,textKey,unreadCount}',\n        'accessibleIconTextKey',\n        'accessibleStateTextKey',\n        function () {\n            if (this.get('accessibleIconTextKey')) {\n                const iconLabel = this.get('accessibleIconTextKey');\n                const hasStateLabel = this.get('state')?.icon || this.get('state')?.loading;\n                const stateIconLabel = hasStateLabel ? this.get('accessibleStateTextKey') : '';\n                if (stateIconLabel) {\n                    return iconLabel + ' (' + stateIconLabel + ')';\n                } else return iconLabel;\n            }\n\n            return '';\n        }\n    ),\n\n    /**\n     * The id used to attach a tooltip to this element.\n     */\n    tooltipTextId: computed('elementId', function () {\n        return `${this.get('elementId')}-interaction-type-icon`;\n    }),\n\n    /**\n     * The name of the icon to render based on provided values\n     */\n    iconName: computed(\n        'acdEngagementSourcesFT',\n        'engagementSource',\n        'isCampaign',\n        'subtype',\n        'type',\n        function (this: Component & InteractionTypeIcon) {\n            const type = this.get('subtype') || this.get('type');\n\n            if (type === 'open')\n                return this.get('acdEngagementSourcesFT') && this.get('engagementSource')\n                    ? getIconName(this.get('engagementSource'))\n                    : 'comments';\n\n            switch (type) {\n                case 'apple':\n                    return 'custom/amb';\n                case 'callback':\n                    return this.get('isCampaign') ? 'phone-outbound' : 'phone-callback';\n                case 'chat':\n                    return 'roster-chat';\n                case 'call':\n                    return 'phone';\n                case 'email':\n                    return 'deprecated/roster-email';\n                case 'facebook':\n                    return 'facebook';\n                case 'instagram':\n                    return 'instagram';\n                case 'sms':\n                    return 'legacy/roster-sms';\n                case 'twitter':\n                    return 'fa/x-twitter';\n                case 'whatsapp':\n                    return 'whatsapp';\n                case 'webmessaging':\n                    return 'chat';\n                case 'workitem':\n                    return 'fa/clipboard-list-regular';\n                default:\n                    // legacy fallback\n                    return 'comments';\n            }\n        }\n    )\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"M8Y65R25\",\"block\":\"[[[10,\\\"gux-icon\\\"],[15,0,[29,[[52,[33,1],\\\"disconnected\\\"]]]],[15,\\\"icon-name\\\",[36,2]],[15,\\\"screenreader-text\\\",[36,3]],[12],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,4],[[[1,\\\"    \\\"],[10,1],[15,0,[29,[\\\"status-icon \\\",[33,4,[\\\"class\\\"]],\\\" \\\",[52,[33,4,[\\\"loading\\\"]],\\\"loading\\\"]]]],[12],[1,\\\"\\\\n\\\"],[41,[33,4,[\\\"loading\\\"]],[[[1,\\\"            \\\"],[10,\\\"gux-radial-loading\\\"],[14,\\\"context\\\",\\\"input\\\"],[15,\\\"screenreader-text\\\",[52,[33,5],[33,5],[28,[37,6],[\\\"common.loading\\\"],null]]],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,4,[\\\"icon\\\"]],[[[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[15,\\\"icon-name\\\",[29,[[33,4,[\\\"icon\\\"]]]]],[15,\\\"screenreader-text\\\",[36,5]],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,7],[[33,4,[\\\"icon\\\"]]],null],[[[1,\\\"            \\\"],[1,[34,5]],[1,\\\"\\\\n        \\\"]],[]],null]],[]]]],[]]],[41,[33,4,[\\\"unreadCount\\\"]],[[[1,\\\"            \\\"],[10,1],[14,\\\"aria-hidden\\\",\\\"true\\\"],[14,0,\\\"count\\\"],[12],[1,[33,4,[\\\"unreadCount\\\"]]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,8],\\\"-interaction-type-icon\\\"]]],[12],[1,\\\"\\\\n    \\\"],[10,1],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,[34,9]],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"if\\\",\\\"isDisconnected\\\",\\\"iconName\\\",\\\"accessibleIconTextKey\\\",\\\"state\\\",\\\"accessibleStateTextKey\\\",\\\"t\\\",\\\"not\\\",\\\"elementId\\\",\\\"accessibleTextKey\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel-v2/interaction-type-icon/template.hbs\",\"isStrictMode\":false});","/**\n * PLEASE DO NOT ADD TO THIS FILE WITHOUT NOTIFYING ACE.\n *\n * We are in the process of restructuring the Agent UI. Changes\n * made to this file may easily be missed in migration efforts\n * and will 100% result in conflicts.\n *\n * Reach out to Josh Rucker with questions.\n */\nimport Component from '@ember/component';\nimport { computed, get, getProperties, observer, set } from '@ember/object';\nimport { cancel, debounce, run, throttle } from '@ember/runloop';\nimport { inject } from '@ember/service';\nimport { InjectionMode, ProposedMessage } from '@genesys/apps-v2-host';\nimport { Participant } from '@genesys/genesys-cloud-conversation-utils';\nimport isEqual from 'lodash/isEqual';\nimport { Promise, all } from 'rsvp';\nimport ExternalContactModel from 'web-directory/models/external-contact';\nimport RelateExternalContactModel from 'web-directory/models/externalcontacts/contact';\nimport GroupModel from 'web-directory/models/group';\nimport PersonModel from 'web-directory/models/person';\nimport QueueModel from 'web-directory/models/queue';\nimport { Maybe } from 'web-directory/types';\nimport { interactionHasSipErrors } from 'web-directory/utils/acd';\nimport { getQueueIdFromAppContext, warnClosureAction } from 'web-directory/utils/acd-ts';\nimport participantStatus from 'web-directory/utils/acdParticipantStatuses';\nimport { AppContext, AppsV2 } from 'web-directory/utils/apps';\nimport moment from 'web-directory/utils/dates';\nimport { addPageAction } from 'web-directory/utils/newrelic';\nimport safeSet from 'web-directory/utils/safeSet';\nimport { updateScheduleCallbackGadgetSessionStorage } from 'web-directory/utils/schedule-callback-gadget';\nimport { MESSAGING_SUBTYPES } from 'web-directory/utils/supported-messaging-subtypes';\nimport TtlCache from 'web-directory/utils/ttl-cache';\nimport { assertNever, hasKey } from 'web-directory/utils/types';\nimport { ConsultControlType } from '../interaction-consult-controls/component';\nimport { getInteractionType } from '../interapptions-manager-v2/component';\nimport { formatTimestampForDisplay } from 'web-directory/utils/date-time';\nimport { getTextKey } from 'web-directory/utils/interaction-icons';\nimport {\n    MAINSTAGE_LAYOUT_STORAGE_KEY_INTERACTION_TYPES,\n    MainstageSize,\n    MainstageSizeIcons,\n    MainstageSizes\n} from 'web-directory/utils/mainstage';\n\nconst INTERACTIONS_PATH = 'engage/admin/interactions';\n\nconst NOTIFICATION_HANDLED_REJECTIONS = [\n    'CALL_ALREADY_PLACED',\n    'CALLABLE_PHONE_NUMBER_COLUMNS_EMPTY',\n    'CONTACT_ATTEMPT_LIMIT_REACHED',\n    'CONTACT_CALLABLE_EVALUATION_ERROR',\n    'CONTACT_UNCALLABLE',\n    'DO_NOT_CALL',\n    'INTERACTION_NO_LONGER_EXISTS',\n    'NO_DESTINATION_ADDRESS',\n    'NOT_CALLABLE_TIME',\n    'NUMBER_ATTEMPT_LIMIT_REACHED',\n    'NUMBER_UNCALLABLE',\n    'RULE',\n    'RULE_EVALUATION_ERROR'\n] as const;\n\nconst MAX_CONFERENCE_PARTICIPANT_COUNTER = 9;\nconst AGENT_ASSIST_SUMMARY_KEY = 'agentAssistSummary';\n\n/**\n * The amount of time in `ms` to wait for a request to be initiated to determine if the action was initiated again.\n * This is needed so the backend doesn't constantly get pinged with updates every time a key has been pressed. Instead\n * if multiple keys are pressed in succession it will wait until this timeout has elapsed and then attempt to update.\n */\nconst REQUEST_TIMEOUT = 500;\n\n/**\n * Throttling time to initiate callback; avoiding multiple click and sending multiple request to backend\n */\nconst CALLBACK_THROTTLE_TIME = 1000;\n\nconst scriptSizes = ['', 'flex-2', 'flex-4', 'flex-full'] as const;\ntype ScriptSize = (typeof scriptSizes)[number];\ntype OfferMessagePayload = {\n    injectionMode: InjectionMode;\n    proposedMessage: ProposedMessage;\n    conversationId: string;\n};\n\ntype MainstageLayout = {\n    mainstageSize: MainstageSize;\n    mainstageCollapsed: boolean;\n    mainstageFocused: boolean;\n};\nconst InteractionDropdownProps = [\n    'showWorkitemTransferDropdown',\n    'showTransferDropdown',\n    'showConsultDropdown',\n    'showParkSmsDropdown',\n    'showConferenceDropdown',\n    'showCobrowseDropdown',\n    'showDialpadDropdown',\n    'showCallbackDialpadDropdown',\n    'showMainstageSizer'\n] as const;\ntype InteractionDropdownProp = (typeof InteractionDropdownProps)[number];\n\n/**\n * `all` signifies that the entirety of the interaction has changed whether that means the interactions aren't equal\n * (new selection), the previous one didn't exist (no selection), or the next one doesn't exist (no active interactions).\n *\n * @note the change in interactions should have been picked up and received by the `didSelectNewInteraction`\n */\nconst WatchInteractionProperties = [\n    'id',\n    'isDisconnected',\n    'isTerminated',\n    'isConnected',\n    'agentParticipants',\n    'participantForCustomer',\n    'type',\n    'customer',\n    'consultAgentParticipant',\n    'consultInitiator',\n    'isInternalMessagingConnected',\n    'onConsult'\n] as const;\ntype WatchInteractionProperty = (typeof WatchInteractionProperties)[number] | 'all';\n\ntype TimerType = 'callback-timeout' | 'callback-auto-start' | 'callback-auto-end';\ntype TimerData = { [key in TimerType]: Timer };\ntype Timer = { type: TimerType; text: string; value: moment.Moment };\n\ntype DivisionName = string | undefined;\n\ntype CurrentActiveConsult = {\n    interaction: any;\n    otherWasConnected: boolean;\n    selfWasConnected: boolean;\n    otherParticipantName: string;\n    selfDisconnected: boolean;\n    role: 'initiator' | 'consultant';\n};\n\nexport default Component.extend({\n    /**\n     * using both the `acd-interaction and acd-interaction-v2 so we can continue to have the old component\n     * styling be applied without duplicate code, and also apply styling specific to the new version without\n     * affecting the old.\n     *\n     * Todo: remove one of the classes when single panel is removed (useMultipanel)\n     */\n    classNames: ['acd-interaction', 'acd-interaction-v2'] as const,\n    classNameBindings: [\n        'isChat',\n        'isMessage',\n        'isCoBrowse',\n        'panelSizeClass',\n        'isPopout::new-panel-resizer-on'\n    ] as const,\n\n    // ==================================================================\n    // Services\n    // ==================================================================\n\n    acdcallback: inject('acdcallback'),\n    conversationModeService: inject('modes/conversation-mode-service'),\n    acdchat: inject('acdchat'),\n    acdemail: inject('acdemail'),\n    acdsms: inject('acdsms'),\n    acdworkitem: inject('acdworkitem'),\n    ajax: inject('ajax'),\n    application: inject('application'),\n    chat: inject('chat'),\n    communication: inject('communication'),\n    internalMessaging: inject('internalMessaging'),\n    contactlist: inject(),\n    externalContacts: inject('externalContacts'),\n    interactionService: inject('interaction'),\n    intl: inject('intl'),\n    logger: inject('stash-logger'),\n    notification: inject('notification'),\n    participantName: inject('participantName'),\n    permissions: inject('permissions'),\n    phone: inject('phone'),\n    phoneIntegrations: inject('phoneIntegrations'),\n    preferences: inject('preferences'),\n    relate: inject('relate'),\n    session: inject('session'),\n    sidebar: inject('sidebar'),\n    commandNav: inject('command-nav'),\n    storage: inject('storage'),\n    store: inject('store'),\n    webrtc: inject('webrtc'),\n    queue: inject('queue'),\n    pigeon: inject('pigeon'),\n    workitemModeService: inject('modes/workitem-mode-service'),\n    clock: inject('clock'),\n\n    // ==================================================================\n    // Lifecycle\n    // ==================================================================\n\n    init() {\n        this._super(...arguments);\n\n        this.get('chat').on('connected', this, this.joinChat);\n        this.get('phone').on('agentEndedCallWithError', this, this._handleAgentEndedCallWithError);\n        this.get('pigeon').on('conversation-summary', this, this._handleConversationSummaryEvent);\n\n        const authUser = this.get('authUser');\n        if (authUser) {\n            const currentUserId = get(authUser, 'id');\n            const preferences = this.get('preferences');\n\n            // NOTE: init() runs inside the Glimmer render transaction. Under\n            // Ember 3.28 an exception thrown here puts the app into an\n            // unrecoverable render-error state (in 2.18 it was tolerated). Guard\n            // against the preferences service not being resolvable/ready yet\n            // during the loading substate so a transient failure can't tank the\n            // entire UI. See ember-3-migration spec.\n            if (preferences && typeof preferences.getPreference === 'function') {\n                preferences\n                    .getPreference(`scripts.${currentUserId}`)\n                    .then(({ scriptSize = '' } = {}) => {\n                        this.set('scriptSize', scriptSize);\n                        preferences.setPreference(`scripts.${currentUserId}`, { scriptSize });\n                    })\n                    .catch(error => {\n                        this.get('logger').error('Error getting script preferences:', { error });\n                        this.set('scriptSize', '');\n                    });\n            } else {\n                this.get('logger').error(\n                    'Preferences service unavailable in interaction init; skipping script preferences'\n                );\n                this.set('scriptSize', '');\n            }\n\n            const localPanelSizeMapStorageValue = this.get('storage').getLocalStorageItem(\n                `panelManagerV2PanelSize.${currentUserId}`\n            );\n            if (localPanelSizeMapStorageValue) {\n                try {\n                    const localPanelSizeMapParsedStorageValue = JSON.parse(localPanelSizeMapStorageValue);\n                    if (isValidPanelSizeMap(localPanelSizeMapParsedStorageValue)) {\n                        this.set('localPanelSizeMap', localPanelSizeMapParsedStorageValue);\n                    }\n                } catch {\n                    /* Nothing to do  */\n                }\n            }\n            // Apply loaded main stage preferences\n            if (preferences && typeof preferences.getPreference === 'function') {\n                preferences\n                    .getPreference(`agentUiMainstage`)\n                    .then(result => {\n                        this.set('persistentMainstageMap', result || {});\n                    })\n                    .catch(error => {\n                        this.get('logger').error('Error getting Mainstage preferences:', { error });\n                        this.set('persistentMainstageMap', {});\n                    });\n            } else {\n                this.set('persistentMainstageMap', {});\n            }\n\n            this.get('storage')\n                .getPreferenceStorageItem(`panelManagerV2PanelSize.${currentUserId}`)\n                .then(result => this.set('persistentPanelSizeMap', result || {}))\n                .catch(error => {\n                    this.get('logger').error('Error getting panelManager preferences:', { error });\n                    this.set('persistentPanelSizeMap', {});\n                });\n\n            this.set('prevUseCommunicationACW', this.get('useCommunicationACW'));\n        } else {\n            this.get('logger').error('ACD - No authenticated user detected');\n        }\n    },\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n\n        // Use the passed _prevSelectedAppContext arg as seed, then use internal __prevAppCtx\n        const prevAppContext = (this as any).__prevAppCtx ?? this.get('_prevSelectedAppContext') ?? null;\n        const newAppContext = this.get('selectedAppContext');\n\n        const interactionChanged =\n            newAppContext?.id !== prevAppContext?.id || newAppContext?.type !== prevAppContext?.type;\n        if (interactionChanged) {\n            this.didSelectNewInteraction();\n            this.updatePrevInteraction(newAppContext && 'payload' in newAppContext ? newAppContext.payload : undefined);\n        } else {\n            const prevUseCommunicationACW = this.get('prevUseCommunicationACW');\n            const useCommunicationACW = this.get('useCommunicationACW');\n\n            // On initial load, we may not have the useCommunicationACW value, which defaults to false\n            // In this scenario, we need to process notes history if useCommunicationACW updates to true after initial load\n            if (useCommunicationACW !== prevUseCommunicationACW) {\n                this.retrieveNotesHistory();\n                this.set('prevUseCommunicationACW', useCommunicationACW);\n            }\n\n            if (this.get('acdExternalContactWorkitemsDivNameFT')) {\n                const prevInteraction = this.get('prevInteraction');\n                const payloadForCheck = newAppContext && 'payload' in newAppContext ? newAppContext.payload : undefined;\n                const changedProperties = checkInteractionProperties(payloadForCheck, prevInteraction);\n                if (changedProperties?.size) {\n                    this.didInteractionUpdate(changedProperties);\n                    this.updatePrevInteraction(payloadForCheck);\n                }\n            } else {\n                // TODO: Switch checkInteractionProperty to work on AppContext and pass in\n                // _prevSelectedAppContext and selectedAppContext to calculate the change set on the fly.\n                // This way, we don't have to store both\n                const prevInteraction = this.get('prevInteraction');\n                const interaction = this.get('interaction');\n                const changedProperties = checkInteractionProperties(interaction, prevInteraction);\n                if (changedProperties?.size) {\n                    this.didInteractionUpdate(changedProperties);\n                    this.updatePrevInteraction(interaction);\n                }\n            }\n\n            // this scenario occurs when an interactions focus mode has been overridden due to the parent component changing it without\n            // the context of this component.\n            if (this.get('isMainstageFocused') !== this.get('_isMainstageFocused')) {\n                this.set('_isMainstageFocused', this.get('isMainstageFocused'));\n                this._mainstagePreferenceChanged(newAppContext, {\n                    size: this.get('mainstageSize'), // current value\n                    isCollapsed: this.get('isMainstageCollapsed'), // current value\n                    isFocused: this.get('isMainstageFocused'), // updated from parent\n                    savePreference: false // don't save to preference, but update local interaction state\n                });\n            }\n        }\n\n        const activeInteractions = this.get('activeInteractions');\n        if (activeInteractions?.length !== this.get('prevActiveInteractionsLength')) {\n            this.didActiveInteractionsChange();\n            this.set('prevActiveInteractionsLength', activeInteractions.length);\n        }\n\n        // Update internal prev context tracker (not tracked by Glimmer template bindings)\n        (this as any).__prevAppCtx = newAppContext || null;\n\n        const interactionIds = new Set([\n            ...(this.get('activeInteractions') || []).map(c => c.get('id')),\n            ...(this.get('activeWorkitems') || []).map(c => c.id)\n        ]);\n        const prevInteractionIds = this.get('_prevInteractionIds');\n        this.set('_prevInteractionIds', interactionIds);\n\n        const removedInteractionIds = [...prevInteractionIds].filter(currId => !interactionIds.has(currId));\n        removedInteractionIds.forEach(currId => {\n            // Interaction Removed\n            this.removeInteractionMainstageLayoutsFromMemory(currId);\n        });\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        // Cancel the active interactions timer if it exists\n        if (this._activeInteractionsTimer) {\n            cancel(this._activeInteractionsTimer);\n            this._activeInteractionsTimer = null;\n        }\n        this.get('_timers').forEach(item => cancel(item));\n        this.get('relate').off(this.get('relate').showProfileEventName);\n        this.get('phone').off('agentEndedCallWithError', this, this._handleAgentEndedCallWithError);\n        this.get('chat').off('connected', this, this.joinChat);\n        this.get('pigeon').off('conversation-summary', this, this._handleConversationSummaryEvent);\n        localStorage.removeItem(AGENT_ASSIST_SUMMARY_KEY);\n        this.get('cobrowseV2EnabledCache').tearDown();\n    },\n\n    /**\n     * Invoked when the interaction has determined to be changed from the `didReceiveAttrs` lifecycle.\n     */\n    didSelectNewInteraction() {\n        const selectedAppContext: Maybe<AppContext> = this.get('selectedAppContext');\n        if (!selectedAppContext) return;\n\n        this.updateCustomerParticipantName();\n\n        if (this.get('acdExternalContactWorkitemsDivNameFT')) {\n            let ecId: string | undefined;\n            if (typeof selectedAppContext.type === 'string') {\n                switch (selectedAppContext.type) {\n                    case 'conversation':\n                    case 'workitem':\n                        ecId =\n                            get(selectedAppContext.payload, 'participantForCustomer.externalContactId') ||\n                            get(selectedAppContext.payload, 'customer.externalContactId');\n                        break;\n                    case 'externalContact':\n                        // ATEAM-2216: Leave undefined for now. Map to selectedAppContext.id here if we ever\n                        // present the EC division (PURE-7222); avoids an unneeded canonical-contact lookup.\n                        break;\n                    case 'analyticsConversation':\n                        // ATEAM-2215: Leave undefined for now. Map to externalContactId here if we need the division\n                        break;\n                    default:\n                        assertNever(selectedAppContext);\n                }\n            } // end type guard\n            this._updateDivisionName(ecId);\n        } else {\n            this._updateDivisionName();\n        }\n\n        this.determineActiveAttendedTransfers();\n        this.determineActiveDigitalConsults();\n\n        this.updateMainstage();\n        this.resetDropdowns();\n\n        const type = selectedAppContext.type;\n        if (type !== 'conversation') return;\n\n        const interaction = selectedAppContext.payload;\n        this.retrieveNotesHistory();\n        this.updateCallbackMediaSettings();\n        this.get('interactionService').fetchCommunicationBasedACWSetting();\n\n        if (get(interaction, 'isConnected')) {\n            switch (interaction.type) {\n                case 'message':\n                    this.getDeploymentConfig();\n                    break;\n            }\n        }\n\n        if (interaction.type === 'chat') {\n            // We need to join chat even if interaction is not connected (i.e. when a customer leaves the chat).\n            // If an agent leaves then returns to this interaction,\n            // we still want to rejoin chat in order to see chat history\n            this.joinChat();\n        }\n    },\n\n    /**\n     * Invoked when the meaning property has been changed on the currently active interaction.\n     * The exact properties that were changed is passed through here so we can further define\n     * what logic needs to run based on the properties passed through.\n     *\n     * @param changed a set of the changed properties\n     */\n    didInteractionUpdate(changed: Map<WatchInteractionProperty, any>) {\n        const interaction = this.get('interaction');\n        const workitem = this.get('workitem');\n        const divNameWorkitemsFT = this.get('acdExternalContactWorkitemsDivNameFT');\n\n        const changedMediaType = changed.get('type');\n\n        if (changed.has('agentParticipants')) {\n            this.updateCallbackMediaSettings();\n            this.determineActiveAttendedTransfers();\n            this.retrieveNotesHistory();\n        }\n\n        if (divNameWorkitemsFT && workitem && changed.has('customer')) {\n            this._updateDivisionName(get(workitem, 'customer.externalContactId'));\n        }\n\n        if (changed.has('participantForCustomer')) {\n            this.updateCustomerParticipantName();\n\n            if (divNameWorkitemsFT) {\n                this._updateDivisionName(get(interaction, 'participantForCustomer.externalContactId'));\n            } else {\n                this._updateDivisionName();\n            }\n        }\n\n        // When an agent starts a call from a callback interaction\n        // or returns to a callback after ending a call, get notes history.\n        // The mainstage needs to update as well.\n        if (changedMediaType === 'call' || changedMediaType === 'callback') {\n            this.retrieveNotesHistory();\n            this.updateMainstage();\n        }\n\n        switch (interaction?.type) {\n            case 'chat':\n                // We need to wait until the user has accepted the incoming interaction before fetching\n                const isNewlyConnected = changed.get('isConnected') === true;\n                if (isNewlyConnected) this.joinChat();\n\n                break;\n            case 'message':\n                /**\n                 * We need to call this even after the user has accepted the interaction\n                 * b/c the cobrowseV2EnabledCache can evict the relevant deploymentId after the defaultTtl of 5 minutes expires.\n                 * Note that we only fetch the deployment config if the cobrowseV2EnabledCache is missing the relevant deploymentId,\n                 * so we don't need to worry about making multiple unnecessary API calls on every interaction update\n                 */\n                this.getDeploymentConfig();\n                this.determineActiveDigitalConsults();\n                break;\n        }\n    },\n\n    /**\n     * Invoked when we detect that the active interactions array has changed from the `didReceiveAttrs` lifecyle\n     *\n     * Note: On init the activeInteractions can load in one at a time so it may be more adventageous to use\n     * a debounce to ensure we aren't flooding the system with too much logic.\n     */\n    didActiveInteractionsChange() {\n        // Cancel any existing debounced timer before creating a new one\n        if (this._activeInteractionsTimer) {\n            cancel(this._activeInteractionsTimer);\n        }\n        this._activeInteractionsTimer = debounce(this, this.determineActiveAttendedTransfers, REQUEST_TIMEOUT);\n    },\n\n    // ==================================================================\n    // Attributes\n    // ==================================================================\n\n    /**\n     * @attribute\n     */\n    selectedAppContext: null as Maybe<AppContext>,\n\n    _prevSelectedAppContext: null as null | AppContext,\n\n    /**\n     * @attribute\n     */\n    interaction: null as Maybe<any>,\n\n    /**\n     * the previous interaction value from before the interaction attribute\n     * was checked again. Essentially creating our own changed attrs logic.\n     * We only store the values of the meaingful properties.\n     */\n    prevInteraction: null as Maybe<{ [key in WatchInteractionProperty]?: any }>,\n\n    /**\n     * @attribute\n     * determines whether user has the org setting to enforce ACW at the communication level enabled\n     */\n    useCommunicationACW: null as Maybe<boolean>,\n\n    /**\n     * the previous useCommunicationACW value, used in comparison logic with updated useCommunicationACW value in didReceiveAttrs.\n     */\n    prevUseCommunicationACW: null as Maybe<boolean>,\n\n    /**\n     * @attribute\n     */\n    activeInteractions: [] as any[],\n\n    /**\n     * the previous length of the active interactions array. We don't need to\n     * know anything more than what the length was to compare against the incoming\n     * value.\n     */\n    prevActiveInteractionsLength: 0 as Maybe<number>,\n\n    /**\n     * @attribute\n     */\n    workitem: null as Maybe<any>,\n\n    /**\n     * `true` when a workitem is present and its assignment state is 'Connected'.\n     * Extracted into a computed so Ember's chain-watcher properly observes the\n     * nested POJO path — the template's inline `(eq workitem.workitem.assignmentState 'Connected')`\n     * can miss updates when the inner `.workitem` object is replaced via `set`.\n     */\n    isWorkitemConnected: computed('workitem.workitem.assignmentState', function (): boolean {\n        return this.get('workitem.workitem.assignmentState') === 'Connected';\n    }),\n\n    /**\n     * @attribute\n     */\n    activeWorkitems: [] as any[],\n\n    _prevInteractionIds: new Set() as Set<string>,\n\n    /**\n     * @attribute\n     * The pool V2 to render that will manage interapptions\n     */\n    appPoolV2: null,\n\n    /**\n     * @attribute\n     */\n    hasConversationAppForCurrInteraction: false,\n\n    /**\n     * @attribute\n     */\n    visibleContextualAppsForCurrInteraction: [] as string[],\n\n    /**\n     * @attribute\n     */\n    hasContextualFocusModeEnabled: false as boolean,\n\n    /**\n     * @attribute\n     * When false, this component does not render the contextual carousel (toolbar + app-carousel-view).\n     * Used by mode-manager to hoist the carousel to a shared location.\n     * Defaults to true so legacy (non-Modes) rendering is unchanged.\n     */\n    renderContextualCarousel: true as boolean,\n\n    /**\n     * @Action\n     * Called when the mainstage size changes in Modes (Active/Inactive). Allows parent (mode-manager) to update\n     * the grid layout class.\n     */\n    onMainstageSizeChanged: null as ((size: string) => void) | null,\n\n    /**\n     * @Action\n     * Called when the mainstage collapsed state changes in Modes (Active/Inactive). Allows parent (mode-manager)\n     * to adjust the grid layout.\n     */\n    onMainstageCollapsedChanged: null as ((collapsed: boolean) => void) | null,\n\n    /**\n     * @attribute\n     * `true` if the mainstage is focused. This needs to be managed at the parent of this component so we\n     * can ensure we are getting the correct app forced states from the interapptions manager.\n     */\n    isMainstageFocused: false as boolean,\n    _isMainstageFocused: false as boolean,\n\n    /**\n     * @attribute\n     */\n    externalContactDivisionName: undefined as undefined | string,\n\n    /**\n     * @attribute\n     */\n\n    communicationSidebarExpanded: computed.bool('sidebar.communicationSidebarExpanded'),\n\n    /**\n     * @action\n     */\n    onMainstageFocusedChanged: (value: boolean) => warnClosureAction('onMainstageFocusedChanged', { value }),\n\n    /**\n     * @action\n     */\n    _endSessionShare: () => warnClosureAction('_endSessionShare'),\n\n    /**\n     * @action\n     */\n    skipPreview: () => warnClosureAction('skipPreview'),\n\n    /**\n     * @action\n     */\n    beginCall: (phoneNumber: any) => warnClosureAction('beginCall', { phoneNumber }),\n\n    /**\n     * @action\n     */\n    beginCallDefaultNumber: () => warnClosureAction('beginCallDefaultNumber'),\n\n    /**\n     * @action\n     */\n    actionDisplayError: () => warnClosureAction('actionDisplayError'),\n\n    /**\n     * @action\n     */\n    loadDivisionName: (divisionId: string | undefined) => warnClosureAction('loadDivisionName', divisionId),\n\n    localPanelSizeMap: {} as Record<string, number>,\n    persistentPanelSizeMap: {} as Record<string, number>,\n\n    persistentMainstageMap: {} as Record<string, MainstageLayout>,\n\n    scriptSize: '' as ScriptSize,\n    acdVoicemailPlayerVisible: true,\n    room: null,\n    isEndingChat: false,\n\n    cobrowseV2EnabledCache: new TtlCache({ defaultTtl: 300000 }),\n    isEndingSms: false,\n    isTakingOver: false,\n    showTakeoverConfirmModal: false,\n\n    isLoadingAcwRequest: false,\n    isCallbackDialing: false,\n\n    isParking: false,\n\n    /**\n     * Current size of the mainstage area. Defaults to 'medium'\n     */\n    mainstageSize: 'medium' as MainstageSize,\n\n    /**\n     * Flag indicating that the popover element is visible\n     */\n    showMainstageSizer: false,\n\n    /**\n     * `true` if the mainstage panel is collapsed, while the other state is expanded. This is independent\n     * of the mainstage sizing. The last set mainstage size will be the size it goes back to when the\n     * collapse state is toggled off.\n     */\n    isMainstageCollapsed: false,\n\n    /**\n     * `true` if the user is able to use focus mode on the main stage\n     */\n    focusModeFt: computed.readOnly('session.features.PURE-6790_enableFocusMode'),\n\n    /**\n     * User can focus the mainstage if they are in a call or callback interaction.\n     */\n    canFocusMainstage: computed('isCall', 'isCallback', 'focusModeFt', function () {\n        if (!this.get('focusModeFt')) return false;\n        return this.get('isCall') || this.get('isCallback');\n    }),\n\n    /**\n     * `true` if the user is able to use the new app sizing functionality\n     */\n    newPanelSizerFt: computed.readOnly('session.features.PURE-6790_enableNewAppSizer'),\n\n    showMainstageFocused: computed(\n        'focusModeFt',\n        'isMainstageFocused',\n        'isMainstageCollapsed',\n        'canFocusMainstage',\n        function () {\n            // feature toggle needs to be enabled to access this\n            if (!this.get('focusModeFt')) return false;\n\n            // can't focus when collapsed\n            if (this.get('isMainstageCollapsed')) return false;\n\n            // if the user can't focus mainstage, then we shouldn't show it as focused\n            if (!this.get('canFocusMainstage')) return false;\n\n            return this.get('isMainstageFocused');\n        }\n    ),\n\n    /**\n     * An array of available sizes for mainstage\n     */\n    mainstageSizes: MainstageSizes,\n\n    /**\n     * Mapped values for the mainstage sizes to their respective icons.\n     */\n    mainstageSizeIcons: MainstageSizeIcons,\n\n    /**\n     * Map to store what conversations are currently being transferred\n     * `new Map<string, interaction>()`\n     */\n    currentActiveTransfers: new Map<string, any>(),\n\n    /**\n     * Map to store what conversations are currently on an active consult\n     * `new Map<string, interaction>()`\n     */\n    currentActiveConsults: new Map<string, CurrentActiveConsult>(),\n\n    /**\n     * Flag to reflect if a user selected to invite or warm-invite a selected participant to the conference. Null if conference roster dropdown should be shown.\n     */\n    inviteOrWarmInviteConferenceParticipant: null as 'invite' | 'warmInvite' | null,\n\n    /**\n     * @deprecated\n     * look into deprecating this entirely\n     */\n    _timers: [] as any[],\n\n    /**\n     * Timer for debounced active interactions change detection\n     */\n    _activeInteractionsTimer: null as any,\n\n    agentEndedCallsWithError: [] as string[],\n\n    cannedResponseChatText: null as Maybe<string>,\n    cannedResponseSmsText: null as Maybe<string>,\n    cannedResponseEmailText: null as Maybe<string>,\n\n    isStructuredMessage: false,\n    structuredMessage: null as Maybe<string>,\n\n    insertChatText: (text: string) => warnClosureAction('insertChatText', { text }),\n    insertSmsText: (response: { strippedText?: string; structuredMessage?: string }) =>\n        warnClosureAction('insertSmsText', { response }),\n    insertEmailText: (text: string) => warnClosureAction('insertEmailText', { text }),\n\n    callbackMediaSettings: undefined as any | undefined,\n\n    _customerParticipantName: undefined as Maybe<string>,\n\n    lastCallbackQueueId: undefined as string | undefined,\n\n    /**\n     * Stores the most recent time notesHistory was retrieved\n     *\n     * This is used to handle race conditions with multiple `retrieveNotesHistory()` calls (notably during bootstrap)\n     */\n    notesHistoryRetrievedAt: null as Maybe<Date>,\n\n    /**\n     * State of the dropdown component associated with the workitem transfer workflow\n     */\n    showWorkitemTransferDropdown: false,\n\n    /**\n     * State of the dropdown component associated with the transfer workflow\n     */\n    showTransferDropdown: false,\n\n    /**\n     * State of the dropdown component associated with the consult workflow\n     */\n    showConsultDropdown: false,\n\n    /**\n     * State of the dropdown component associated with the park sms workflow\n     */\n    showParkSmsDropdown: false,\n\n    /**\n     * State of the dropdown component associated with the conference workflow\n     */\n    showConferenceDropdown: false,\n\n    /**\n     * State of the dropdown component associated with the cobrowse and session share workflow\n     */\n    showCobrowseDropdown: false,\n\n    /**\n     * State of the dropdown component associated with the regular dialpad workflow\n     */\n    showDialpadDropdown: false,\n\n    /**\n     * State of the dropdown component associated with the callback based dialpad workflow\n     */\n    showCallbackDialpadDropdown: false,\n\n    // ==================================================================\n    // Observers\n    // ==================================================================\n\n    /**\n     * @deprecated don't use observers\n     *\n     * Fetches campaign and contact information for the\n     * callback if there is an associated dialer preview.\n     */\n    fetchDialerPreviewDetails: observer('interaction.dialerPreview', function (this: any) {\n        const interaction = this.get('interaction');\n        if (interaction) {\n            const dialerPreview = get(interaction, 'dialerPreview');\n            if (dialerPreview && !get(interaction, 'contact')) {\n                this.get('contactlist')\n                    .getContact(dialerPreview.contactListId, dialerPreview.contactId)\n                    .then((contact: any) => set(interaction, 'contact', contact))\n                    .catch((error: any) =>\n                        this.get('logger').error('There was an error fetching the contact details', { error })\n                    );\n            }\n        }\n    }),\n\n    // ==================================================================\n    // Computeds\n    // ==================================================================\n\n    myselfIsCoachOrMonitor: computed.or(\n        'interaction.myselfIsMonitor',\n        'interaction.myselfIsCoach',\n        'interaction.myselfIsMonitorV2'\n    ),\n\n    canMessageTakeover: computed(\n        'interaction.isSms',\n        'interaction.myselfIsMonitorV2',\n        'permissions.canTakeoverMessage',\n        function () {\n            if (!this.get('permissions.canTakeoverMessage')) return false;\n            if (!this.get('interaction.isSms')) return false;\n\n            return this.get('interaction.myselfIsMonitorV2');\n        }\n    ),\n\n    mainstageTitleKey: computed(\n        'selectedAppContext',\n        'acdEngagementSourcesFT',\n        'engagementSource',\n        function (): string {\n            const titleKey = 'purecloud.acdInteraction.interactionTypes';\n            const unknownKey = `${titleKey}.unknown`;\n\n            const selectedAppContext: Maybe<AppContext> = this.get('selectedAppContext');\n            if (!selectedAppContext || typeof selectedAppContext.type !== 'string') return unknownKey;\n\n            switch (selectedAppContext.type) {\n                case 'workitem':\n                    return `${titleKey}.workitem`;\n                case 'externalContact':\n                    return `${titleKey}.externalContact`;\n                case 'analyticsConversation':\n                    return `${titleKey}.analyticsConversation`;\n                case 'conversation':\n                    break;\n                default:\n                    return assertNever(selectedAppContext);\n            }\n\n            const type = selectedAppContext.payload.get('type');\n\n            if (['call', 'callback', 'preview', 'chat', 'email'].includes(type)) {\n                return `${titleKey}.${type}`;\n            } else if (type === 'message') {\n                const subtype = selectedAppContext.payload.get('subMessageType');\n                if (MESSAGING_SUBTYPES.includes(subtype)) {\n                    if (subtype === 'facebook') {\n                        return `${titleKey}.messageTypes.${subtype}Meta`;\n                    } else if (subtype === 'twitter') {\n                        return `${titleKey}.messageTypes.${subtype}X`;\n                    } else if (\n                        subtype === 'open' &&\n                        this.get('acdEngagementSourcesFT') &&\n                        this.get('engagementSource')\n                    ) {\n                        return getTextKey(this.get('engagementSource'));\n                    }\n                    return `${titleKey}.messageTypes.${subtype}`;\n                }\n                return `${titleKey}.messageTypes.unknown`;\n            }\n\n            return unknownKey;\n        }\n    ),\n\n    // feature toggle for PURE-3835 division aware external contacts for interactions\n    acdExternalContactDivNameFT: computed.readOnly('session.features.PURE-3835'),\n    // feature toggle for PURE-6191 division aware external contacts for workitems\n    acdExternalContactWorkitemsDivNameFT: computed.readOnly('session.features.PURE-6191'),\n    acdEngagementSourcesFT: computed.bool('session.features.PURE-5534_OpenMessagingEngagementSourceTagging'),\n    isCopilotImprovementsEnabled: computed.readOnly('session.features.AI-1118_copilot-improved-user-experience'),\n    useScripterGadget: false,\n    acdWarmConferencePhase1FT: computed.bool('session.features.PURE-7349_acdConferenceMS3-phase-1'),\n\n    hideTransferButtons: computed(\n        'canBlindTransfer',\n        'canConsultTransfer',\n        'myselfIsCoachOrMonitor',\n        'isWarmInviteCall',\n        'interaction.{iAmConsulted,isSessionSharing,isAgentDisconnectedFromSharedSession,isCustomerDisconnectedFromSharedSession,isWaitingForCustomerToConnect,cobrowseSessionShareActive,isVideoActive}',\n        function () {\n            const interaction = this.get('interaction');\n            if (!interaction) {\n                return false;\n            }\n\n            const noPermissions = !this.get('canBlindTransfer') && !this.get('canConsultTransfer');\n            if (noPermissions) {\n                return true;\n            }\n\n            const isWarmInviteCall = this.get('isWarmInviteCall');\n            const iAmMonitorOrCoach = this.get('myselfIsCoachOrMonitor');\n            const isVideoActive = get(interaction, 'isVideoActive');\n            const isSessionSharingActive =\n                get(interaction, 'isSessionSharing') &&\n                !get(interaction, 'isAgentDisconnectedFromSharedSession') &&\n                !get(interaction, 'isCustomerDisconnectedFromSharedSession');\n\n            return (\n                iAmMonitorOrCoach ||\n                isSessionSharingActive ||\n                isVideoActive ||\n                get(interaction, 'iAmConsulted') ||\n                get(interaction, 'isWaitingForCustomerToConnect') ||\n                get(interaction, 'cobrowseSessionShareActive') ||\n                isWarmInviteCall\n            );\n        }\n    ),\n\n    /**\n     * The label used for the target-dropdown header.\n     */\n    inviteOrWarmInviteConferenceParticipantHeader: computed(\n        'acdWarmConferencePhase1FT',\n        'inviteOrWarmInviteConferenceParticipant',\n        function () {\n            if (!this.get('acdWarmConferencePhase1FT')) return 'purecloud.acdInteraction.conference';\n            switch (this.get('inviteOrWarmInviteConferenceParticipant')) {\n                case 'warmInvite':\n                    return 'purecloud.acdInteraction.conferenceDropdown.consultParticipant';\n                case 'invite':\n                    return 'purecloud.acdInteraction.conferenceDropdown.inviteParticipant';\n                default:\n                    return 'purecloud.acdInteraction.conference';\n            }\n        }\n    ),\n\n    inviteOrWarmInviteConferenceParticipantAction: computed(\n        'acdWarmConferencePhase1FT',\n        'inviteOrWarmInviteConferenceParticipant',\n        function () {\n            if (!this.get('acdWarmConferencePhase1FT')) return 'onConferenceDataSelected';\n            switch (this.get('inviteOrWarmInviteConferenceParticipant')) {\n                case 'warmInvite':\n                    return 'onConferenceWarmInviteDataSelected';\n                case 'invite':\n                default:\n                    return 'onConferenceDataSelected';\n            }\n        }\n    ),\n\n    inviteOrWarmInviteAddButtonIcon: computed(\n        'acdWarmConferencePhase1FT',\n        'inviteOrWarmInviteConferenceParticipant',\n        function () {\n            if (\n                this.get('acdWarmConferencePhase1FT') &&\n                this.get('inviteOrWarmInviteConferenceParticipant') === 'warmInvite'\n            ) {\n                return 'phone';\n            }\n\n            return 'legacy/people';\n        }\n    ),\n\n    inviteOrWarmInviteAddButtonTooltip: computed(\n        'acdWarmConferencePhase1FT',\n        'inviteOrWarmInviteConferenceParticipant',\n        function () {\n            if (\n                this.get('acdWarmConferencePhase1FT') &&\n                this.get('inviteOrWarmInviteConferenceParticipant') === 'warmInvite'\n            ) {\n                return 'purecloud.acdInteraction.conferenceDropdown.warmInviteToConference';\n            }\n\n            return 'purecloud.acdInteraction.conferenceDropdown.addToConference';\n        }\n    ),\n\n    _rawCustomerParticipantName: computed(\n        'interaction.participantForCustomer.id',\n        'interaction',\n        'interaction.messages',\n        'interaction.messages.[]',\n        'interaction.messages.firstObject.from.{email,name}',\n        'interaction.messages.firstObject.to.email',\n        'interaction.draft',\n        'interaction.draft.to.firstObject.email',\n        function (this: any) {\n            const interaction = this.get('interaction');\n            if (interaction) {\n                const id = get(interaction, 'participantForCustomer.id');\n                if (id) {\n                    const rawParticipant = this.getRawParticipant(interaction.participants, id);\n                    return this.get('participantName').getRawParticipantName(rawParticipant);\n                }\n            }\n            return null;\n        }\n    ),\n\n    _externalCanonicalContact: computed(\n        'externalContacts.contacts.[]',\n        'interaction.participantForCustomer.externalContactId',\n        'workitem.customer.externalContactId',\n        function () {\n            const contactId =\n                this.get('interaction.participantForCustomer.externalContactId') ||\n                this.get('workitem.customer.externalContactId');\n            if (!contactId) return;\n            return this.get('externalContacts').getCanonicalContactSync(contactId);\n        }\n    ),\n\n    externalContactNameV2: computed('_externalCanonicalContact.name', function () {\n        const contact = this.get('_externalCanonicalContact');\n        if (!contact) return;\n        return get(contact, 'name');\n    }),\n\n    /**\n     * Determines what the tooltip should read when hovering or focusing the participants name in\n     * the interaction header component. The content should differ based on the type of interaction\n     * selected.\n     */\n    customerParticipantNameTooltip: computed(\n        'interaction',\n        'interaction.{type,participantForCustomer,formattedCustomerPhoneNumber}',\n        'interaction.participantForCustomer.externalContact.{bestEmailAddress,bestPhoneNumberDisplay}',\n        'showNumberInTooltip',\n        function (this: any) {\n            const interaction = this.get('interaction');\n            if (interaction) {\n                const customer = get(interaction, 'participantForCustomer');\n                if (customer) {\n                    const type = get(interaction, 'type');\n                    switch (type) {\n                        case 'email':\n                            const email = get(customer, 'externalContact.bestEmailAddress');\n                            return email\n                                ? this.get('intl').t('purecloud.acdInteraction.details.email', { email })\n                                : null;\n                        case 'message':\n                        case 'chat':\n                        case 'call':\n                        case 'callback':\n                            let phone = get(customer, 'externalContact.bestPhoneNumberDisplay');\n\n                            if (\n                                !phone &&\n                                this.get('showNumberInTooltip') &&\n                                get(interaction, 'formattedCustomerPhoneNumber')\n                            ) {\n                                phone = get(interaction, 'formattedCustomerPhoneNumber');\n                            }\n\n                            return phone\n                                ? this.get('intl').t('purecloud.acdInteraction.details.phone', { phone })\n                                : null;\n                        default:\n                            return null;\n                    }\n                }\n            }\n            return null;\n        }\n    ),\n\n    /**\n     * The calculated participant name for customer we ran though particiantName service.\n     */\n    customerParticipantName: computed(\n        '_rawCustomerParticipantName',\n        '_customerParticipantName',\n        'externalContactNameV2',\n        function () {\n            const name = this.get('_customerParticipantName');\n            const rawName = this.get('_rawCustomerParticipantName');\n            const ecName = this.get('externalContactNameV2');\n            const noName = this.get('intl').t('purecloud.acdInteraction.noName');\n            return ecName || name || rawName || noName;\n        }\n    ),\n\n    /**\n     *  Will be true if number is not a SIP or not the same as customerParticipantName\n     */\n    showNumberInTooltip: computed('interaction.formattedCustomerPhoneNumber', 'customerParticipantName', function () {\n        const formattedCustomerPhoneNumber = this.get('interaction.formattedCustomerPhoneNumber');\n        if (formattedCustomerPhoneNumber === this.get('customerParticipantName')) {\n            return false;\n        }\n        return formattedCustomerPhoneNumber && !!formattedCustomerPhoneNumber.match(/^[^a-zA-Z@]*$/);\n    }),\n\n    /**\n     * returns `true` if the blind transfer option should be disabled in the call controls.\n     * Also disabled while an Email Send Flow is executing or stuck on this interaction\n     */\n    isBlindTransferDisabled: computed.or(\n        'interaction.onConsult',\n        'interaction.isFlowExecuting',\n        'interaction.flowStuck'\n    ),\n\n    /**\n     * `true` if the current user can view the chat when clicking on the authors avatar\n     */\n    canViewChat: computed.reads('permissions.canViewBusinessChat'),\n\n    /**\n     * The current authenticated user from the session service\n     */\n    authUser: computed.reads('session.publicApiUser'),\n\n    /**\n     * All of the participants in the conversation\n     */\n    participants: computed.reads('interaction.participants'),\n\n    /**\n     * All of the other participants in the conversation excluding the authenticated user.\n     * Only contains participants that are connected or connecting\n     */\n    otherParticipants: computed.readOnly('interaction.otherParticipants'),\n\n    /**\n     * Includes all of the active participant ids in the conversation. Excludes any participant\n     * with an endTime so the host can readd a user who has disconnected.\n     */\n    activeParticipantIds: computed.readOnly('interaction.activeParticipantIds.[]'),\n\n    /**\n     * Participants that should be shown in a conference roster\n     */\n    connectedConferenceParticipants: computed.readOnly('interaction.allConferenceParticipants'),\n\n    /**\n     * `true` if the authenticated user is the host of the interaction.\n     */\n    isHostParticipant: computed('interaction.hostParticipant', 'authUser.id', function () {\n        return this.get('interaction.hostParticipant.userId') === this.get('authUser.id');\n    }),\n\n    /**\n     * Array of filters that should be excluded in the conversation participant dropdown\n     * based on the type of interaction being handled and associated transfer permission.\n     */\n    excludeBlindTransferFilters: computed(\n        'interaction.type',\n        'permissions.{canBlindTransferAgent,canBlindTransferQueue,canBlindTransferExternal}',\n        function () {\n            const type = this.get('interaction.type');\n            const filtersToExclude = [];\n            const shouldExcludeUsers = !this.get('permissions.canBlindTransferAgent');\n            const shouldExcludeQueues = !this.get('permissions.canBlindTransferQueue');\n            const shouldExcludeExternals =\n                !this.get('permissions.canBlindTransferExternal') || (type !== 'call' && type !== 'callback');\n\n            if (shouldExcludeUsers) {\n                filtersToExclude.push('user');\n            }\n\n            if (shouldExcludeQueues) {\n                filtersToExclude.push('queue');\n            }\n\n            if (shouldExcludeExternals) {\n                filtersToExclude.push('external');\n            }\n\n            return filtersToExclude;\n        }\n    ),\n\n    /**\n     * Determines what additional consulting transfer permissions are needed based on the interaction type.\n     */\n    additionalConsultTransferPermissions: computed('digitalConsultEnabled', 'interaction.type', function () {\n        const interaction = this.get('interaction');\n        if (!interaction || !this.get('digitalConsultEnabled')) return [];\n\n        switch (get(interaction, 'type')) {\n            case 'message':\n                return ['conversation:internalMessaging:accept'];\n            default:\n                return [];\n        }\n    }),\n\n    /**\n     * The placeholder text for the target dropdown component for consult transfers.\n     */\n    targetDropdownConsultPlaceholderText: computed('interaction.type', function () {\n        const interaction = this.get('interaction');\n        if (!interaction) return undefined;\n\n        const type = get(interaction, 'type');\n        switch (type) {\n            // message doesn't support queue consults\n            case 'message':\n                return 'purecloud.searchEntrySentenceCase';\n            default:\n                return 'purecloud.searchEntryWithQueueSentenceCase';\n        }\n    }),\n\n    /**\n     * Array of filters that should be excluded for consult transfers in the conversation participant dropdown\n     * based on the type of interaction being handled and associated transfer permission.\n     *\n     * @note we should look into converting this to an `inclusion` based logic stream now that we are working\n     * toward removing legacy transfer permission patterns. We could combine this with the work below once we get\n     * some of the feature toggles globally enabled and starting the removal process.\n     */\n    excludeConsultTransferFilters: computed(\n        'interaction.type',\n        'canSetupDigitalConsult',\n        'permissions.{canConsultTransferAgent,canConsultTransferQueue,canConsultTransferExternal}',\n        function () {\n            const type = this.get('interaction.type');\n            if (type === 'call') {\n                const filtersToExclude = [];\n                const shouldExcludeUsers = !this.get('permissions.canConsultTransferAgent');\n                const shouldExcludeQueues = !this.get('permissions.canConsultTransferQueue');\n                const shouldExcludeExternals = !this.get('permissions.canConsultTransferExternal');\n\n                if (shouldExcludeUsers) {\n                    filtersToExclude.push('user');\n                }\n\n                if (shouldExcludeQueues) {\n                    filtersToExclude.push('queue');\n                }\n\n                if (shouldExcludeExternals) {\n                    filtersToExclude.push('external');\n                }\n\n                return filtersToExclude;\n            } else {\n                switch (type) {\n                    case 'message':\n                        return [];\n                    default:\n                        return ['external'];\n                }\n            }\n        }\n    ),\n\n    /**\n     * Works in conjunction with `excludeConsultTransferFilters` computed above. For digital consult\n     * transfers we only want to show the entities that are allowed based on permissions set for the user.\n     * For the `exclusion` logic above, we are only checking for the exclusion of a voice based consult,\n     * whereas here we are checking for the `inclusion` of digital based consults.\n     *\n     * @note the reason for the difference is that the voice only consult was built with supporting the consultation\n     * of all the different entities types so we fallback to everything hence leaning toward an `exclusion` based logic\n     * steam. Whereas digital consultation is only launching with agent consultation support so we are using an\n     * `inclusion` based logic stream.\n     */\n    includeConsultTransferFilters: computed('interaction.type', 'canSetupDigitalConsult', function () {\n        const type = this.get('interaction.type');\n        switch (type) {\n            case 'message':\n                const filtersToInclude = [];\n                const shouldIncludeUsers = this.get('canSetupDigitalConsult');\n                if (shouldIncludeUsers) {\n                    filtersToInclude.push('user');\n                }\n\n                if (!filtersToInclude.length) {\n                    this.get('logger').error('Invalid consult transfer state.', {\n                        error: 'No included filters were determined for consult transfer'\n                    });\n                }\n\n                return filtersToInclude;\n            case 'call':\n            default:\n                return [];\n        }\n    }),\n\n    /**\n     * Determines whether or not the agent can select a raw search value from the `target-dropdown`\n     * component when searching for a target. Based off the type of the interaction in question.\n     */\n    allowRawDropdownInputSelection: computed('interaction.type', function () {\n        const interaction = this.get('interaction');\n        const type = this.get('workitem') ? 'workitem' : interaction?.type;\n        switch (type) {\n            case 'call':\n            case 'callback':\n                return true;\n            default:\n                return false;\n        }\n    }),\n\n    /**\n     * Determines whether or not the agent can select a raw search value from the `target-dropdown`\n     * component when searching for a target. Based off the type of the interaction in question.\n     */\n    targetDropdownPlaceholderText: computed('interaction.type', function () {\n        const interaction = this.get('interaction');\n        const type = this.get('workitem') ? 'workitem' : interaction?.type;\n        switch (type) {\n            case 'call':\n            case 'callback':\n                return 'purecloud.searchEntryWithQueueSentenceCase';\n            default:\n                return 'purecloud.searchEntryNameOrQueueSentenceCase';\n        }\n    }),\n\n    interactionScriptContainerState: computed('isCall', 'isCallback', function () {\n        return this.get('isCall') || this.get('isCallback') ? '' : 'hidden';\n    }),\n\n    isPopout: computed.reads('application.isPopout'),\n\n    isChat: computed.reads('interaction.isChat'),\n\n    isCall: computed.reads('interaction.isCall'),\n\n    isCallback: computed.reads('interaction.isCallback'),\n\n    autoCallbackQueueId: computed(\n        'interaction',\n        'interaction.agentParticipants.[]',\n        'interaction.participantForCurrentUser.queueId',\n        'interaction.{agentParticipants,participantForCurrentUser}',\n        function () {\n            if (this.get('interaction.participantForCurrentUser.queueId')) {\n                return this.get('interaction.participantForCurrentUser.queueId');\n            }\n            if (this.get('interaction.agentParticipants')) {\n                const participants = this.get('interaction.agentParticipants').filter(\n                    (p: { queueId: string }) => p.queueId\n                );\n\n                for (const participant of participants) {\n                    return participant.queueId;\n                }\n            }\n            return null;\n        }\n    ),\n\n    /**\n     * Determines what the currently active timer is.\n     * The timer checks need to be in priorty order. The priorty order is labelled at each\n     * computed's comment section.\n     */\n    activeTimer: computed(\n        'showCallbackCountdown',\n        'showAutoCallbackEndCountdown',\n        'showAutoCallbackStartCountdown',\n        function (): null | TimerType {\n            if (this.get('showCallbackCountdown')) return 'callback-timeout';\n            if (this.get('showAutoCallbackEndCountdown')) return 'callback-auto-end';\n            if (this.get('showAutoCallbackStartCountdown')) return 'callback-auto-start';\n            return null;\n        }\n    ),\n\n    /**\n     * The class to append to the active interaction timer for callbacks\n     */\n    activeTimerClass: computed('activeTime', function () {\n        const value = ['interaction-active-timer', 'countdown-timer'];\n\n        const activeTimer = this.get('activeTimer');\n        if (activeTimer) {\n            value.push(activeTimer);\n        }\n\n        return value.join(' ');\n    }),\n\n    /**\n     * data determined by whatever the active timer currently is. the priorty of the\n     * active timer data is already being determined by the `activeTimer` logic. Due to\n     * The data targeting computed values from within the class, we cannot abstract the\n     * `const` data further outside of this context.\n     */\n    activeTimerData: computed(\n        '{activeTimer,autoCallbackStartTime,autoCallbackEndTime}',\n        'interaction.callbackTimeoutTime',\n        function () {\n            const activeTimer: null | TimerType = this.get('activeTimer');\n            const interaction = this.get('interaction');\n            if (!activeTimer || !interaction) return null;\n\n            const TimerTranslationKey = (type: string) => `purecloud.acdInteraction.timers.${type}`;\n\n            const data: TimerData = {\n                'callback-timeout': {\n                    type: 'callback-timeout',\n                    text: TimerTranslationKey('callbackTimeout'),\n                    value: get(interaction, 'callbackTimeoutTime')\n                },\n                'callback-auto-start': {\n                    type: 'callback-auto-start',\n                    text: TimerTranslationKey('callbackAutoStart'),\n                    value: this.get('autoCallbackStartTime')\n                },\n                'callback-auto-end': {\n                    type: 'callback-auto-end',\n                    text: TimerTranslationKey('callbackAutoEnd'),\n                    value: this.get('autoCallbackEndTime')\n                }\n            };\n            return data[activeTimer];\n        }\n    ),\n\n    /**\n     * `true` if the current active timer data value is nearing the end of it's countdown.\n     * The value for \"nearing the end\" is supplied as a value at the top of the class.\n     */\n    countdownDurationClass: computed('activeTimerData.value', 'clock.second', function () {\n        // Consume clock.second to establish Glimmer autotracking (Ember 3.28 compatibility)\n        this.get('clock.second');\n        const value = ['interaction-active-timer-countdown'];\n\n        const data: null | Timer = this.get('activeTimerData');\n        if (data?.value && data.value.diff(moment(), 'seconds') <= 15) {\n            value.push('countdown-ending');\n        }\n\n        return value.join(' ');\n    }),\n\n    /**\n     * Determines if the active callback is nearing it's auto start time.\n     */\n    isCallbackNearingStart: computed(\n        'clock.second',\n        'activeTimerData.value',\n        'isAutoCallbackStartEligible',\n        function () {\n            // Consume clock.second to establish Glimmer autotracking (Ember 3.28 compatibility)\n            this.get('clock.second');\n            if (!this.get('isAutoCallbackStartEligible')) {\n                return false;\n            }\n\n            const activeTimer = this.get('activeTimerData') as null | Timer;\n            if (activeTimer === null || activeTimer.type !== 'callback-auto-start') {\n                return false;\n            }\n\n            // If we're overdue, something went wrong, so we enable the button again.\n            const diff = Math.abs(activeTimer.value.diff(moment(), 'seconds'));\n            return diff <= 5;\n        }\n    ),\n\n    /**\n     * `true` if the interaction is considered a dialer call\n     */\n    isDialerCall: computed(\n        'interaction',\n        'interaction.{dialerPreview,campaignId,participants}',\n        'interaction.participants.[]',\n        function () {\n            const interaction = this.get('interaction');\n            if (!interaction) return false;\n\n            if (get(interaction, 'dialerPreview') || get(interaction, 'campaignId')) return true;\n\n            const participants = get(interaction, 'participants');\n            if (!participants?.length) return false;\n\n            return participants.some((p: any) => p.dialerPreview || p.attributes?.dialerInteractionId);\n        }\n    ),\n\n    /**\n     * The time that the callback will automatically start the interaction\n     * and transition it to a call.\n     */\n    autoCallbackStartTime: computed(\n        'callbackMediaSettings',\n        'interaction.callbackNumbers.[]',\n        'callbackMediaSettings.autoDialDelaySeconds',\n        'interaction.participantForCurrentUser.connectedTime',\n        function () {\n            return this._determineCallbackTime('callback-auto-start');\n        }\n    ),\n\n    /**\n     * The time that the callback will automatically end after the interaction\n     * has disconnected and remove it from the user's roster.\n     */\n    autoCallbackEndTime: computed(\n        'callbackMediaSettings',\n        'interaction.callbackNumbers.[]',\n        'callbackMediaSettings.autoEndDelaySeconds',\n        'interaction.participantForCurrentUser.wrapup.endTime',\n        'interaction.participantForCurrentUser.endAcwTime',\n        function () {\n            return this._determineCallbackTime('callback-auto-end');\n        }\n    ),\n\n    /**\n     * `true` if the callback timeout countdown should be visible to the user\n     *\n     * @priority 1\n     */\n    showCallbackCountdown: computed(\n        'hasCallbackNumbers',\n        'interaction.{isCallback,callbackTimeoutTime,needsCallWrapUp}',\n        function () {\n            const interaction = this.get('interaction');\n            if (!interaction) return false;\n            return (\n                this.get('hasCallbackNumbers') &&\n                get(interaction, 'isCallback') &&\n                get(interaction, 'callbackTimeoutTime') &&\n                !get(interaction, 'needsCallWrapUp')\n            );\n        }\n    ),\n\n    /**\n     * `true` if the auto callback start timer should be visible to the user.\n     *\n     * @priority 2\n     */\n    showAutoCallbackStartCountdown: computed(\n        'isAutoCallbackStartEligible',\n        'autoCallbackStartTime',\n        'isAutoStartDispositioned',\n        'isAutoEndDispositioned',\n        function () {\n            return (\n                this.get('isAutoCallbackStartEligible') &&\n                this.get('autoCallbackStartTime') &&\n                !this.get('isAutoStartDispositioned') &&\n                !this.get('isAutoEndDispositioned')\n            );\n        }\n    ),\n\n    /**\n     * `true` if the auto end timer should be visible to the user\n     *\n     * @priority 3\n     */\n    showAutoCallbackEndCountdown: computed.and(\n        'isAutoCallbackEndEligible',\n        'isAutoEndDispositioned',\n        'autoCallbackEndTime'\n    ),\n\n    /**\n     * Determines if the auto callback start is eligible for the user. There are cases\n     * that the user should not be rushed to auto start the callback allowing them to manually\n     * start it instead.\n     */\n    isAutoCallbackStartEligible: computed(\n        '{isDialerCall,isCallbackDialing,hasCallbackNumbers,isAutoStartDispositioned}',\n        'callbackMediaSettings.enableAutoDialAndEnd',\n        'interaction.{hasVoicemail,isCallback,isConnected,isPlacingCall}',\n        'interaction.mostRecentTransfer.transferType',\n        function () {\n            const interaction = this.get('interaction');\n            const callbackMediaSettings = this.get('callbackMediaSettings');\n            if (!interaction || !callbackMediaSettings) return false;\n\n            return (\n                this.get('hasCallbackNumbers') &&\n                !this.get('isDialerCall') &&\n                !this.get('isCallbackDialing') &&\n                !this.get('isAutoStartDispositioned') &&\n                get(callbackMediaSettings, 'enableAutoDialAndEnd') &&\n                get(interaction, 'isCallback') &&\n                get(interaction, 'mostRecentTransfer.transferType') !== 'unattended' &&\n                get(interaction, 'isConnected') &&\n                !get(interaction, 'isPlacingCall') &&\n                !get(interaction, 'hasVoicemail')\n            );\n        }\n    ),\n\n    /**\n     * Determines if the auto callback end is eligible for the user. There are cases that\n     * The user should not be rushed to auto finish the callback allowing them to manually\n     * end it instead.\n     */\n    isAutoCallbackEndEligible: computed(\n        '{autoCallbackQueueId,isDialerCall,isAutoEndDispositioned,hasMultipleCallbackNumbers}',\n        'interaction.{hasVoicemail,isConnected,isCallback}',\n        'callbackMediaSettings.enableAutoDialAndEnd',\n        function () {\n            const interaction = this.get('interaction');\n            const callbackMediaSettings = this.get('callbackMediaSettings');\n            if (!interaction || !callbackMediaSettings) return false;\n\n            return (\n                this.get('autoCallbackQueueId') &&\n                this.get('isAutoEndDispositioned') &&\n                !this.get('isDialerCall') &&\n                !this.get('hasMultipleCallbackNumbers') &&\n                get(callbackMediaSettings, 'enableAutoDialAndEnd') &&\n                get(interaction, 'isConnected') &&\n                get(interaction, 'isCallback') &&\n                !get(interaction, 'hasVoicemail')\n            );\n        }\n    ),\n\n    isWarmInviteCallInitiator: computed(\n        'acdWarmConferencePhase1FT',\n        'isWarmInviteCall',\n        'interaction.calls.[]',\n        'interaction.calls.@each.initialState',\n        function () {\n            if (!this.get('acdWarmConferencePhase1FT')) return false;\n            const interaction = this.get('interaction');\n            if (!interaction) return false;\n            if (!this.get('isWarmInviteCall')) return false;\n\n            const currentUser = get(interaction, 'participantForCurrentUser');\n            if (!currentUser) return false;\n\n            const returnVal = (currentUser.calls ?? []).some(\n                (call: { initialState: string }) => call?.initialState === 'contacting'\n            );\n\n            return returnVal;\n        }\n    ),\n\n    /**\n     * `true` if the interaction is not able to be auto started based on the  wrapup state of the\n     * interaction. For instance, if the interaction has a wrapup time, and the wrapup is either\n     * expected or required, and the after call work has not been completed, then the auto logic\n     * will not initiate. That way the user cannot bypass these requirements.\n     */\n    isAutoStartDispositioned: computed(\n        'interaction.calls.[]',\n        'interaction.calls.@each.disconnectedTime',\n        'interaction.{isAfterCallWorkCompleted,participantForCurrentUser}',\n        'interaction.participantForCurrentUser.{endAcwTime,wrapupExpected,wrapupRequired}',\n        'interaction.participantForCurrentUser.wrapup.endTime',\n        function () {\n            const interaction = this.get('interaction');\n            if (!interaction) return false;\n\n            const currentUser = get(interaction, 'participantForCurrentUser');\n            if (!currentUser) return false;\n\n            if (\n                get(currentUser, 'wrapup.endTime') ||\n                ((currentUser.wrapupExpected || currentUser.wrapupRequired) &&\n                    get(interaction, 'isAfterCallWorkCompleted'))\n            )\n                return true;\n\n            return (currentUser.calls ?? []).some((call: { disconnectedTime: string }) => !!call?.disconnectedTime);\n        }\n    ),\n\n    /**\n     * `true` if the interaction is not able to be auto ended based on the wrapup state of the interaction.\n     * For instance, if the interaction wrapup is either expected or required, and the after call work has\n     * not been completed, then the auto logic will not initiate. That way the user cannot bypass these requirements.\n     */\n    isAutoEndDispositioned: computed(\n        'interaction.calls.[]',\n        'interaction.calls.@each.disconnectedTime',\n        'interaction.{isAfterCallWorkCompleted,participantForCurrentUser}',\n        'interaction.participantForCurrentUser.{endAcwTime,wrapupExpected,wrapupRequired}',\n        function () {\n            const interaction = this.get('interaction');\n            if (!interaction) return false;\n\n            const currentUser = get(interaction, 'participantForCurrentUser');\n            if (!currentUser) return false;\n\n            return (\n                (currentUser.wrapupExpected || currentUser.wrapupRequired) &&\n                get(interaction, 'isAfterCallWorkCompleted')\n            );\n        }\n    ),\n\n    isEmail: computed.readOnly('interaction.isEmail'),\n\n    isSms: computed.readOnly('interaction.isSms'),\n\n    isInternalProvider: computed.readOnly('interaction.isInternalProvider'),\n\n    isV2ChatProvider: computed.readOnly('interaction.isV2Provider'),\n\n    isExternalCampaign: computed.readOnly('interaction.isExternalCampaign'),\n\n    isMessage: computed.equal('interaction.type', 'message'),\n\n    isConnected: computed.readOnly('interaction.isConnected'),\n\n    isDisconnected: computed.readOnly('interaction.isDisconnected'),\n\n    isDialing: computed.readOnly('interaction.isDialing'),\n\n    isTerminated: computed.readOnly('interaction.isTerminated'),\n\n    preferInteractionGUID: computed.readOnly('session.org.orgPreferences.preferInteractionGUID'),\n\n    canAgentRequestACW: computed.readOnly('interaction.canAgentRequestACW'),\n\n    showAgentRequestACWButton: computed('canAgentRequestACW', 'isConnected', 'isCallback', function () {\n        return this.get('canAgentRequestACW') && this.get('isConnected') && !this.get('isCallback');\n    }),\n\n    showAcdVoicemailAudioPlayer: computed.and('showAcdVoicemailButton', 'acdVoicemailPlayerVisible'),\n\n    showParkEmailButton: computed.readOnly('permissions.canPark'),\n\n    showParkSMSButton: computed('permissions.canParkMessage', 'interaction.{cobrowseSessionShareActive}', function () {\n        const interaction = this.get('interaction');\n        if (interaction && get(interaction, 'cobrowseSessionShareActive')) {\n            return false;\n        }\n        return this.get('permissions.canParkMessage');\n    }),\n\n    showFinishCallback: computed(\n        '{hasActiveCallback,hasActiveCall,hasAttemptedCall}',\n        'interaction.{needsCallWrapUp,dialerPreview,isAlerting}',\n        function () {\n            const interaction = this.get('interaction');\n            if (!interaction) {\n                return false;\n            }\n\n            // Show finish button for callback communications when\n            // no call is active, or for dialer previews when a call\n            // has been attempted and is not longer active. Agents should\n            // have met their wrapup requirements as well.\n            const isAlerting = get(interaction, 'isAlerting');\n            const hasCallback = this.get('hasActiveCallback');\n            const isPreview = !!get(interaction, 'dialerPreview');\n            const meetsCallRequirement: boolean =\n                !this.get('hasActiveCall') && (!isPreview || (isPreview && this.get('hasAttemptedCall')));\n            const needsCallWrapup = get(interaction, 'needsCallWrapUp');\n\n            return (hasCallback || isPreview) && meetsCallRequirement && !needsCallWrapup && !isAlerting;\n        }\n    ),\n\n    showSkipCallback: computed(\n        '{isCallback,isConnected}',\n        'interaction.dialerPreview',\n        'hasAttemptedCall',\n        function () {\n            const interaction = this.get('interaction');\n            return (\n                interaction &&\n                this.get('isCallback') &&\n                this.get('isConnected') &&\n                get(interaction, 'dialerPreview') &&\n                !this.get('hasAttemptedCall')\n            );\n        }\n    ),\n\n    /**\n     * `true` if the callback number is actively dialing\n     */\n    isCallbackNumberDialing: computed.or('isDialing', 'isPlacingCall', 'isCallbackDialing'),\n\n    /**\n     * For campaign callbacks, wait until every callback number has phoneColumn\n     * (i.e., contact data has loaded) before enabling the call controls.\n     * Only applies when dialerPreview has phoneNumberColumns; if phoneNumberColumns\n     * is empty (e.g. callback created for a campaign contact), we do not require phoneColumn.\n     */\n    isCallbackWaitingForContactData: computed(\n        'interaction.isCampaignCallback',\n        'interaction.callbackNumbers.[]',\n        'interaction.dialerPreview.phoneNumberColumns.length',\n        function () {\n            const interaction = this.get('interaction');\n            if (!interaction || !get(interaction, 'isCampaignCallback')) {\n                return false;\n            }\n            const phoneColumnsLength = get(interaction, 'dialerPreview.phoneNumberColumns.length');\n            if (!phoneColumnsLength) {\n                return false;\n            }\n            const numbers = get(interaction, 'callbackNumbers') || [];\n            return numbers.length > 0 && !numbers.every((n: any) => n.phoneColumn);\n        }\n    ),\n\n    /**\n     * `true` if the active callback number selector should be disabled, essentially preventing a user from initiating\n     * the call.\n     */\n    isCallbackNumberDisabled: computed.or(\n        'isCallbackNumberDialing',\n        'isCallbackNearingStart',\n        'isCallbackWaitingForContactData'\n    ),\n\n    enableAcdVoicemail: computed.or('permissions.hasAcdVoicemailAccess', 'interaction.isCurrentUserInConversation'),\n\n    // Indicates if either voice/screen recording is happening,\n    // used to determine \"Secure Pause\" button state\n    isRecordingPaused: computed('interaction.{securePause,recordingState,participantForCurrentUser}', function () {\n        const interaction = this.get('interaction');\n        if (!interaction) {\n            return false;\n        }\n\n        const securePause = get(interaction, 'securePause');\n        const recordingState = (get(interaction, 'recordingState') || '').toLowerCase();\n        const screenRecordingState = (\n            get(interaction, 'participantForCurrentUser.screenRecordingState') || ''\n        ).toLowerCase();\n\n        return (\n            //expected behavior when voice recording is paused\n            (recordingState === 'paused' && securePause) ||\n            //expected behavior when screen recording is paused\n            (recordingState === 'paused' && screenRecordingState === 'paused')\n        );\n    }),\n\n    showAcdVoicemailButton: computed(\n        'enableAcdVoicemail',\n        'interaction.{hasVoicemail,isAlerting}',\n        function (this: any) {\n            const interaction = this.get('interaction');\n            return (\n                interaction &&\n                this.get('enableAcdVoicemail') &&\n                get(interaction, 'hasVoicemail') &&\n                !get(interaction, 'isAlerting')\n            );\n        }\n    ),\n\n    sessionShareClassNames: computed(\n        'isCustomerConfiguredForScreenShare',\n        'isCustomerConfiguredForCobrowse',\n        'isAgentAllowedToScreenShare',\n        'isAgentAllowedtoCobrowse',\n        'cobrowseMisconfiguration',\n        'screenShareMisconfiguration',\n        'isChat',\n        function (this: any) {\n            const classes = [];\n            if (this.get('isChat')) {\n                if (this.get('isCustomerConfiguredForScreenShare')) {\n                    classes.push('customer-configured-screen-share');\n                }\n                if (this.get('isCustomerConfiguredForCobrowse')) {\n                    classes.push('customer-configured-cobrowse');\n                }\n                if (this.get('cobrowseMisconfiguration')) {\n                    classes.push('cobrowse-misconfiguration');\n                }\n                if (this.get('screenShareMisconfiguration')) {\n                    classes.push('screen-share-misconfiguration');\n                }\n            }\n            if (this.get('isAgentAllowedToScreenShare')) {\n                classes.push('agent-allowed-screen-share');\n            }\n            if (this.get('isAgentAllowedtoCobrowse')) {\n                classes.push('agent-allowed-cobrowse');\n            }\n            return classes.join(' ');\n        }\n    ),\n\n    /**\n     * True/false if conversation is confined or held\n     */\n    isHeld: computed(\n        'digitalConsultEnabled',\n        'interaction.{isHeld,onConsult,isConsultParticipantHolding,iAmConsultInitiator,iAmConsulted}',\n        function (): boolean {\n            const interaction = this.get('interaction');\n            if (!interaction) return false;\n\n            if (!this.get('digitalConsultEnabled') || !get(interaction, 'onConsult')) {\n                return get(interaction, 'isHeld');\n            }\n\n            return get(interaction, 'isConsultParticipantHolding');\n        }\n    ),\n\n    isConfined: computed(\n        'interaction.{onConsult,isConfined,iAmConsultInitiator,iAmConsulted,isConsultParticipantHolding}',\n        'digitalConsultEnabled',\n        function () {\n            const interaction = this.get('interaction');\n            if (!interaction) return false;\n\n            if (\n                get(interaction, 'iAmConsultInitiator') ||\n                (get(interaction, 'iAmConsulted') && this.get('digitalConsultEnabled'))\n            ) {\n                return get(interaction, 'isConsultParticipantHolding');\n            }\n\n            return get(interaction, 'onConsult') && get(interaction, 'isConfined');\n        }\n    ),\n\n    stationIsWebrtc: computed.readOnly('phone.station.isWebrtc'),\n\n    phoneCallsWithErrors: computed.readOnly('phone.callsWithErrors'),\n\n    webrtcConversation: computed(\n        'stationIsWebrtc',\n        'webrtc.conversations.@each.conversationId',\n        'interaction.id',\n        function () {\n            const interaction = this.get('interaction');\n            const conversationId = interaction ? get(interaction, 'id') : null;\n            if (conversationId && this.get('stationIsWebrtc')) {\n                return this.get('webrtc').getConversation({\n                    conversationId,\n                    conversationType: 'softphone'\n                });\n            }\n            return null;\n        }\n    ),\n\n    showHoldButton: computed(\n        'isCall',\n        'isConnected',\n        'digitalConsultEnabled',\n        'interaction.{myselfIsMonitor,myselfIsCoach,onConsult,iAmConsultInitiator,iAmConsulted}',\n        function () {\n            const interaction = this.get('interaction');\n            if (!interaction) return false;\n\n            if (!get(interaction, 'onConsult') || !this.get('digitalConsultEnabled')) {\n                return (\n                    this.get('isCall') &&\n                    this.get('isConnected') &&\n                    !(get(interaction, 'myselfIsMonitor') || get(interaction, 'myselfIsCoach'))\n                );\n            }\n\n            // hold button should only be available if the user is on a call and it's connected\n            if (!this.get('isCall') || !this.get('isConnected')) return false;\n\n            // don't show hold button if being consulted\n            if (get(interaction, 'iAmConsulted')) return false;\n\n            // in case of other states, only show hold button if user is the initiator\n            return get(interaction, 'iAmConsultInitiator');\n        }\n    ),\n\n    showPhoneDisconnectButton: computed(\n        'agentEndedCallsWithError.[]',\n        '{isCall,isDisconnected,isTerminated}',\n        'stationIsWebrtc',\n        'webrtcConversation.isConnected',\n        'phoneCallsWithErrors.@each.conversationId',\n        'interaction.{id,onConsult}',\n        'digitalConsultEnabled',\n        'consultControlType',\n        function (this: any) {\n            const interaction = this.get('interaction');\n\n            // check for consulting states, if active user is consultant in digitalConsult FT, hide button\n            if (this.get('digitalConsultEnabled') && interaction && get(interaction, 'onConsult')) {\n                // the consult should not be able to disconnect a call from the top bar\n                const type = this.get('consultControlType');\n                if (type === 'consultant') return false;\n            }\n\n            const callHasEnded = this.get('isDisconnected') || this.get('isTerminated');\n            const hasAgentEndedThisInteraction = interaction\n                ? this.get('agentEndedCallsWithError').includes(get(interaction, 'id'))\n                : false;\n            const stationError =\n                !this.get('stationIsWebrtc') &&\n                this.get('phoneCallsWithErrors.length') &&\n                callHasEnded &&\n                !hasAgentEndedThisInteraction;\n            const webRtcError =\n                this.get('stationIsWebrtc') &&\n                this.get('phoneCallsWithErrors.length') &&\n                this.get('webrtcConversation.isConnected');\n            const shouldShowDisconnectButton = this.get('isCall') && !callHasEnded;\n            const callsError = interactionHasSipErrors(interaction);\n            if (interaction && (webRtcError || stationError || callsError)) {\n                const callSessionHasError = this.get('phoneCallsWithErrors').findBy(\n                    'conversationId',\n                    get(interaction, 'id')\n                );\n                return callSessionHasError ? true : shouldShowDisconnectButton || callsError;\n            }\n            return shouldShowDisconnectButton;\n        }\n    ),\n\n    showChatRoom: computed('{isChat,room,isInternalProvider,isV2ChatProvider}', function () {\n        // TODO: parse providers once we can route chats via API\n        const isChat = this.get('isChat');\n        const hasRoom = !!this.get('room');\n        const isInternal = this.get('isInternalProvider');\n        const isV2Chat = this.get('isV2ChatProvider');\n        return isChat && isInternal && (hasRoom || isV2Chat);\n    }),\n\n    hideAfterCallWork: computed(\n        '{hasActiveCallback,hasActiveCall,hasPlacedCalls,isExternalCampaign}',\n        'interaction.dialerPreview',\n        function (this: any) {\n            const interaction = this.get('interaction');\n            return (\n                interaction &&\n                get(interaction, 'dialerPreview') &&\n                this.get('hasActiveCallback') &&\n                !this.get('isExternalCampaign') &&\n                (!this.get('hasPlacedCalls') || this.get('hasActiveCall'))\n            );\n        }\n    ),\n\n    /**\n     * The amount of participants that are in an active conference to utilize as a superscript\n     * signifier for the conference action button.\n     */\n    activeConferenceParticipants: computed(\n        'interaction.isActiveConference',\n        'connectedConferenceParticipants',\n        function () {\n            const interaction = this.get('interaction');\n            if (!get(interaction, 'isActiveConference')) {\n                return undefined;\n            }\n\n            const connectedParticipants = this.get('connectedConferenceParticipants');\n            if (!connectedParticipants?.length) {\n                return undefined;\n            }\n\n            if (connectedParticipants.length > MAX_CONFERENCE_PARTICIPANT_COUNTER) {\n                return this.get('intl').t('purecloud.acdInteraction.conferenceDropdown.maxParticipantCount', {\n                    count: MAX_CONFERENCE_PARTICIPANT_COUNTER\n                });\n            }\n            return connectedParticipants.length;\n        }\n    ),\n\n    showDialpad: computed('{isCall,isConnected,isDialing}', 'interaction.{myselfIsMonitor,myselfIsCoach}', function () {\n        const interaction = this.get('interaction');\n        const iAmMonitorOrCoach =\n            interaction && (get(interaction, 'myselfIsMonitor') || get(interaction, 'myselfIsCoach'));\n        return !iAmMonitorOrCoach && this.get('isCall') && (this.get('isConnected') || this.get('isDialing'));\n    }),\n\n    canConsultTransfer: computed.or(\n        'permissions.canConsultTransferAgent',\n        'permissions.canConsultTransferQueue',\n        'permissions.canConsultTransferExternal'\n    ),\n\n    digitalConsultEnabled: computed.readOnly('session.features.PURE-5007_digitalConsult'),\n    canSetupDigitalConsult: computed.and('permissions.canSetupDigitalConsult', 'digitalConsultEnabled'),\n\n    canBlindTransfer: computed.or(\n        'permissions.canBlindTransferAgent',\n        'permissions.canBlindTransferQueue',\n        'permissions.canBlindTransferExternal'\n    ),\n\n    showTransfer: computed(\n        '{isCallback,isConnected,hasCallbackNumbers}',\n        'canBlindTransfer',\n        'interaction.{isFlowExecuting,flowStuck}',\n        function () {\n            if (!this.get('canBlindTransfer')) return false;\n            if (this.get('isCallback')) {\n                return this.get('isConnected') && this.get('hasCallbackNumbers');\n            }\n\n            return (\n                this.get('isConnected') || this.get('interaction.isFlowExecuting') || this.get('interaction.flowStuck')\n            );\n        }\n    ),\n\n    showConsultTransfer: computed(\n        '{canConsultTransfer,canSetupDigitalConsult,isConnected}',\n        'interaction.type',\n        function () {\n            if (!this.get('isConnected')) return false;\n\n            const type = this.get('interaction.type');\n            switch (type) {\n                case 'call':\n                    return this.get('canConsultTransfer');\n                case 'message':\n                    return this.get('canSetupDigitalConsult');\n                default:\n                    return false;\n            }\n        }\n    ),\n\n    /**\n     * determines if we can see the consultation controls. the introduction of digital consulting changes the requirements\n     * for when the consulting bar is shown. Previously the consulting agent would not see a consulting bar, and only the\n     * initiating agent would. However, with digital consult we now show the consulting user the customer's name at the top\n     * bar, and the initiating agent in the consulting bar to give more context into the conversation.\n     */\n    showConsultControls: computed(\n        'isConnected',\n        'digitalConsultEnabled',\n        'interaction.{iAmConsultInitiator,iAmConsulted,isThereAConsultAgentParticipant,onConsult,consultAgentParticipant,consultInitiator}',\n        function () {\n            const interaction = this.get('interaction');\n            if (!interaction) return false;\n\n            if (!this.get('digitalConsultEnabled')) {\n                // previous requirements, only show if the user is the agent intiator\n                return get(interaction, 'iAmConsultInitiator') && get(interaction, 'isThereAConsultAgentParticipant');\n            }\n\n            if (!this.get('isConnected') || !get(interaction, 'onConsult')) return false;\n\n            //  both the initiating agent and the consulting agent will see the consulting bar\n            return get(interaction, 'iAmConsultInitiator') || get(interaction, 'iAmConsulted');\n        }\n    ),\n\n    /**\n     * This is the participant being highlighted in the consulting controls bar. This participant varies based on the active\n     * user's role in the conversation. The initiating agent will see the consulting agent, the consulting agent will see\n     * the initiating agent. The role of the user in the conversation will affect the different controls available to them\n     * from within the consulting bar itself.\n     *\n     * @note pre-digital consult we will only ever show the consulting bar for the initiating agent and the consulting agent would\n     * see the initiating agent in the customers spot. This however is changing with the introduction of digital consulting, in that\n     * the consulting agent will now see the customer information in the customer spot, and the initiating agent in the consulting\n     * bar spot. This is to give the user more context into the conversation while also unifying the desired behavior for both\n     * digital and voice consulting.\n     */\n    consultControlsParticipant: computed(\n        'digitalConsultEnabled',\n        'interaction.{onConsult,consultAgentParticipant,iAmConsultInitiator,iAmConsulted,consultInitiator}',\n        function () {\n            const interaction = this.get('interaction');\n            if (!interaction) return null;\n\n            return this._determineConsultControlsParticipant({\n                onConsult: get(interaction, 'onConsult'),\n                iAmConsultInitiator: get(interaction, 'iAmConsultInitiator'),\n                iAmConsulted: get(interaction, 'iAmConsulted'),\n                consultAgentParticipant: get(interaction, 'consultAgentParticipant'),\n                consultInitiator: get(interaction, 'consultInitiator')\n            });\n        }\n    ),\n\n    /**\n     * Determines what type of controls to display in the consulting bar. The type is determined by the users role\n     * in the conversation.\n     */\n    consultControlType: computed(\n        'digitalConsultEnabled',\n        'interaction.{iAmConsulted,iAmConsultInitiator,onConsult}',\n        function (): ConsultControlType {\n            const interaction = this.get('interaction');\n            if (!interaction) return null;\n\n            if (!this.get('digitalConsultEnabled')) {\n                // before the digital consult feature, we were handling the consulting bar as an initiator\n                return 'initiator';\n            }\n\n            if (!get(interaction, 'onConsult')) return null;\n\n            if (get(interaction, 'iAmConsultInitiator')) {\n                return 'initiator';\n            } else if (get(interaction, 'iAmConsulted')) {\n                return 'consultant';\n            }\n\n            return null;\n        }\n    ),\n\n    showSmsDisconnectButton: computed(\n        'isSms',\n        'isConnected',\n        'consultControlType',\n        'digitalConsultEnabled',\n        'interaction.onConsult',\n        function () {\n            const interaction = this.get('interaction');\n            if (!interaction || !this.get('isSms') || !this.get('isConnected')) {\n                return false;\n            }\n\n            // if not on consult or revert to the previous functionality if digital consult isn't enabled\n            if (!get(interaction, 'onConsult') || !this.get('digitalConsultEnabled')) {\n                return true;\n            }\n\n            // don't show the disconnect button if the user is the consultant\n            const type = this.get('consultControlType');\n            return type === 'initiator';\n        }\n    ),\n\n    showSessionShare: computed(\n        'interaction.{sessionShareActive,iAmConsultInitiator,isThereAConsultAgentParticipant,isCobrowseV2,isConnected}',\n        function (this: any) {\n            const interaction = this.get('interaction');\n            if (!interaction) {\n                return false;\n            }\n\n            if (!this.get('isConnected')) {\n                return false;\n            }\n\n            const consultActive =\n                get(interaction, 'iAmConsultInitiator') && get(interaction, 'isThereAConsultAgentParticipant');\n            return !consultActive && get(interaction, 'sessionShareActive') && !get(interaction, 'isCobrowseV2');\n        }\n    ),\n\n    deploymentId: computed(\n        'interaction.lastCustomerMessage.normalizedMessage.channel.to.additionalIds.0.value',\n        'interaction.participantForCustomer.messages.firstObject.toAddress.addressRaw',\n        'interaction.subMessageType',\n        function () {\n            if (this.get('interaction.subMessageType') === 'webmessaging') {\n                return (\n                    this.get('interaction.lastCustomerMessage.normalizedMessage.channel.to.additionalIds.0.value') ||\n                    this.get('interaction.participantForCustomer.messages.firstObject.toAddress.addressRaw')\n                );\n            }\n\n            return null;\n        }\n    ),\n\n    isCobrowseV2DeploymentEnabled: computed('deploymentId', 'cobrowseV2EnabledCache', function () {\n        const deploymentId = this.get('deploymentId');\n\n        return deploymentId ? !!this.get('cobrowseV2EnabledCache').get(deploymentId) : false;\n    }),\n\n    isCobrowseV2SetUpForWebMessaging: computed(\n        'isCobrowseV2DeploymentEnabled',\n        'permissions.canViewAcdCoBrowseForWebMessaging',\n        'interaction.subMessageType',\n        function () {\n            const permissions = this.get('permissions');\n            const interaction = this.get('interaction');\n\n            // If Interaction is WebMessaging check WM permission\n            return (\n                get(interaction, 'subMessageType') === 'webmessaging' &&\n                get(permissions, 'canViewAcdCoBrowseForWebMessaging') &&\n                this.get('isCobrowseV2DeploymentEnabled')\n            );\n        }\n    ),\n\n    isVideoSetUpForWebMessaging: computed(\n        'permissions.canViewAcdVideoForWebMessaging',\n        'interaction.subMessageType',\n        function () {\n            const permissions = this.get('permissions');\n            const interaction = this.get('interaction');\n\n            // If Interaction is WebMessaging check WM permission\n            return (\n                get(interaction, 'subMessageType') === 'webmessaging' &&\n                get(permissions, 'canViewAcdVideoForWebMessaging')\n            );\n        }\n    ),\n\n    isCobrowseV2SetUpForVoice: computed('permissions.canViewAcdCoBrowseV2ForVoice', 'isCall', function (this: any) {\n        const permissions = this.get('permissions');\n        return this.get('isCall') && get(permissions, 'canViewAcdCoBrowseV2ForVoice');\n    }),\n\n    isMCB: computed.bool('interaction.isMCB'),\n    isGroupRing: computed.bool('interaction.isGroupRing'),\n    disableMergeToConference: computed('isMCB', 'isGroupRing', 'acdWarmConferencePhase1FT', function () {\n        return this.get('acdWarmConferencePhase1FT') && (this.get('isMCB') || this.get('isGroupRing'));\n    }),\n\n    /** Cobrowse button gate for MP (v2) flow. */\n    showCobrowseV2Button: computed(\n        'myselfIsCoachOrMonitor',\n        'isCobrowseV2SetUpForWebMessaging',\n        'isCobrowseV2SetUpForVoice',\n        'isWarmInviteCall',\n        'interaction.{isVideoActive,isActiveConference}',\n        function () {\n            const interaction = this.get('interaction');\n            return (\n                !this.get('myselfIsCoachOrMonitor') &&\n                !get(interaction, 'isVideoActive') &&\n                !get(interaction, 'isActiveConference') &&\n                !this.get('isWarmInviteCall') &&\n                (this.get('isCobrowseV2SetUpForWebMessaging') || this.get('isCobrowseV2SetUpForVoice'))\n            );\n        }\n    ),\n\n    /**\n     * `true` if any of the cobrowse v2 buttons should be disabled based on active states from the interaction\n     */\n    disableCobrowseV2Button: computed('interaction.{cobrowseSessionShareActive,isConnected}', function (this: any) {\n        const interaction = this.get('interaction');\n        return interaction && (get(interaction, 'cobrowseSessionShareActive') || !this.get('isConnected'));\n    }),\n\n    showAcdVideoButton: computed(\n        'myselfIsCoachOrMonitor',\n        'isVideoSetUpForWebMessaging',\n        'interaction.{cobrowseSessionShareActive}',\n        function () {\n            const interaction = this.get('interaction');\n            return (\n                !get(interaction, 'cobrowseSessionShareActive') &&\n                !this.get('myselfIsCoachOrMonitor') &&\n                this.get('isVideoSetUpForWebMessaging')\n            );\n        }\n    ),\n\n    /**\n     * `true` if any of the video buttons should be disabled based on active states from the interaction\n     */\n    disableAcdVideoButton: computed(\n        'interaction.{isVideoActive,isConnected}',\n        'activeInteractions.@each.isVideoActive',\n        'webrtc.activeRoom.{showingVideo,isAcdRoom}',\n        function (this: any) {\n            const interaction = this.get('interaction');\n            if (!interaction) {\n                return true;\n            }\n\n            const currentInteractionId = get(interaction, 'id');\n            const activeInteractions = this.get('activeInteractions') || [];\n\n            // Check if any other active interaction has video active\n            const hasVideoActiveInOtherInteraction = activeInteractions.some((activeInteraction: any) => {\n                if (!activeInteraction) {\n                    return false;\n                }\n                const activeInteractionId = get(activeInteraction, 'id');\n                const isVideoActive = get(activeInteraction, 'isVideoActive');\n                // Check if it's a different interaction and has video active\n                return activeInteractionId !== currentInteractionId && isVideoActive;\n            });\n\n            // Check if agent is in a non-ACD (agent-to-agent) video call\n            const isInNonAcdVideo =\n                this.get('webrtc.activeRoom.showingVideo') && !this.get('webrtc.activeRoom.isAcdRoom');\n\n            return (\n                get(interaction, 'isVideoActive') ||\n                !this.get('isConnected') ||\n                hasVideoActiveInOtherInteraction ||\n                isInNonAcdVideo\n            );\n        }\n    ),\n\n    sessionShareChatOrCallDisabled: computed(\n        '{isChat,isCall}',\n        '{disableShareButton,disableVideoButton}',\n        'interaction.isActiveConference',\n        function (this: any) {\n            const interaction = this.get('interaction');\n            return (\n                (interaction && get(interaction, 'isActiveConference')) ||\n                (this.get('isChat') && this.get('disableShareButton')) ||\n                (this.get('isCall') && this.get('disableVideoButton'))\n            );\n        }\n    ),\n\n    panelSizeMap: computed('localPanelSizeMap', 'persistentPanelSizeMap', function () {\n        return {\n            ...this.get('localPanelSizeMap'),\n            ...this.get('persistentPanelSizeMap')\n        };\n    }),\n\n    panelSize: computed('panelSizeMap', 'selectedAppContext', function () {\n        const selectedAppContext = this.get('selectedAppContext');\n        if (selectedAppContext) {\n            const interactionType = getInteractionType(selectedAppContext);\n            const localPanelSizeAppContextKey = `${selectedAppContext.id}.${interactionType}`;\n\n            const appContextPrecedenceStorageKeys = [\n                // interactionId/interactionType\n                localPanelSizeAppContextKey,\n                // interactionType\n                interactionType\n            ];\n\n            const panelSizeMap = this.get('panelSizeMap');\n            for (const appContextPrecedenceStorageKey of appContextPrecedenceStorageKeys) {\n                if (panelSizeMap[appContextPrecedenceStorageKey]) {\n                    return panelSizeMap[appContextPrecedenceStorageKey];\n                }\n            }\n        }\n        return 50;\n    }),\n\n    panelSizeClass: computed('isPopout', 'panelSize', function () {\n        if (!this.get('isPopout') && this.get('panelSize')) {\n            return `panel-size-${this.get('panelSize')}`;\n        }\n        return '';\n    }),\n\n    participantsForCurrentUser: computed('activeInteractions.@each.participantForCurrentUser', function () {\n        const interactions: any[] = this.get('activeInteractions') ?? [];\n        return interactions.reduce((value, current) => {\n            if (current && 'participantForCurrentUser' in current) {\n                value.push(get(current, 'participantForCurrentUser'));\n            }\n            return value;\n        }, []);\n    }),\n\n    callbacksForParticipantsForCurrentUser: computed('participantsForCurrentUser.@each.callbacks', function () {\n        const participants: any[] = this.get('participantsForCurrentUser') ?? [];\n        return participants.reduce((value, current) => {\n            if (current && 'callbacks' in current) {\n                value.push(get(current, 'callbacks'));\n            }\n            return value;\n        }, []);\n    }),\n\n    activePanelContextKeys: computed(\n        'activeInteractions',\n        'activeInteractions.@each.isCall',\n        'callbacksForParticipantsForCurrentUser.@each.length',\n        'activeWorkitems.[]',\n        function (this: any) {\n            const activeInteractions = this.get('activeInteractions') || [];\n            const activeWorkitems = this.get('activeWorkitems') || [];\n            const allActiveInteractions = [].concat(activeInteractions, activeWorkitems);\n            return allActiveInteractions\n                .map((interaction: any) => {\n                    const keys = [this.getInteractionPanelContextKey(interaction)];\n                    // If call interaction was originally a callback, then persist\n                    // the panel selection state for both the call and callback.\n                    const hasCallback = interaction && !!get(interaction, 'participantForCurrentUser.callbacks.length');\n                    if (interaction && get(interaction, 'isCall') && hasCallback) {\n                        keys.push(`${get(interaction, 'id')}-callback`);\n                    }\n                    return keys;\n                })\n                .flat();\n        }\n    ),\n\n    interactionPanelContextKey: computed('interaction.{id,type}', 'workitem.id', function () {\n        const interaction = this.get('interaction') ?? this.get('workitem');\n        if (interaction) {\n            return this.getInteractionPanelContextKey(interaction);\n        }\n        return null;\n    }),\n\n    connectedTime: computed('interaction.{connectedTime,isAlerting}', function () {\n        const interaction = this.get('interaction');\n        if (!interaction) return null;\n\n        const isAlerting = get(interaction, 'isAlerting');\n        if (isAlerting) return null;\n        return get(interaction, 'connectedTime');\n    }),\n\n    connectedTimeDisplay: computed('interaction.connectedTime', function () {\n        // connectedTime is expected to be a Moment object or undefined\n        const connectedTime = this.get('interaction.connectedTime');\n\n        return !!connectedTime ? formatTimestampForDisplay(connectedTime.toISOString()) : null;\n    }),\n\n    requiresStructuredMessage: computed(\n        'interaction.lastCustomerMessage.{timestamp,messsageTime}',\n        'interaction.{subMessageType,lastCustomerMessage}',\n        function (this: any) {\n            const interaction = this.get('interaction');\n            if (interaction) {\n                const lastInbound = get(interaction, 'lastCustomerMessage');\n                if (get(interaction, 'subMessageType') === 'whatsapp') {\n                    if (lastInbound) {\n                        const lastMessageTime = get(lastInbound, 'timestamp') || get(lastInbound, 'messageTime');\n                        return moment(lastMessageTime).isSameOrBefore(moment().subtract(1, 'days'));\n                    }\n\n                    return true;\n                }\n            }\n            return false;\n        }\n    ),\n\n    /**\n     * Whether or not skipping the callback is allowed.\n     */\n    isSkipCallbackDisabled: computed.or('isCallbackDialing', 'interaction.skipDisabled'),\n\n    /**\n     * True if the participantForCurrentUser is connected to a call communication, false otherwise.\n     */\n    hasActiveCall: computed.readOnly('interaction.hasActiveCall'),\n\n    /**\n     * True if the participantForCurrentUser is connected to a callback communication, false otherwise.\n     */\n    hasActiveCallback: computed.readOnly('interaction.hasActiveCallback'),\n\n    /**\n     * True if there is at least one number left to dial, false otherwise.\n     */\n    hasCallbackNumbers: computed.gt('interaction.callbackNumbers.length', 0),\n\n    /**\n     * True if there are multiple phone numbers that can be dialed, false otherwise.\n     */\n    hasMultipleCallbackNumbers: computed.gt('interaction.callbackNumbers.length', 1),\n\n    /**\n     * An array of calls that the agent has already placed.\n     */\n    placedCalls: computed.readOnly('interaction.participantForCurrentUser.calls'),\n\n    /**\n     * True if the agent has attempted to place a call for the callback, false otherwise.\n     */\n    hasAttemptedCall: computed.or('placedCalls.length', 'interaction.placedBlockedCalls.length'),\n\n    /**\n     * True if the agent has placed calls for the callback, false otherwise.\n     */\n    hasPlacedCalls: computed.gt('placedCalls.length', 0),\n\n    /**\n     * True if the agent has clicked \"begin call\" but the call hasn't connected yet.\n     */\n    isPlacingCall: computed.readOnly('interaction.isPlacingCall'),\n\n    callbackNumberOptions: computed.map('interaction.callbackNumbers', ({ number, name, phoneColumn }) => ({\n        value: number,\n        phoneColumn,\n        text: name\n    })),\n\n    /**\n     * The default option for the callback number.\n     */\n    defaultCallbackNumberOption: computed.readOnly('callbackNumberOptions.firstObject'),\n\n    /**\n     * Temporary value to be passed to the agentAddedCallbackNumbers upon submission\n     */\n    addingCallbackNumbers: [] as any[],\n\n    acdVoicemailTooltip: computed('acdVoicemailPlayerVisible', function () {\n        return this.get('acdVoicemailPlayerVisible')\n            ? 'purecloud.acdInteraction.voicemail.hideAudioPlayer'\n            : 'purecloud.acdInteraction.voicemail.showAudioPlayer';\n    }),\n\n    muteTooltip: computed('interaction.conversation.isMuted', function () {\n        const interaction = this.get('interaction');\n        return interaction && get(interaction, 'conversation.isMuted')\n            ? 'purecloud.acdInteraction.unmute'\n            : 'purecloud.acdInteraction.mute';\n    }),\n\n    skipACWTooltipTitle: computed('interaction.isCommunicationAfterCallWorkRequested', function () {\n        const interaction = this.get('interaction');\n        return interaction && get(interaction, 'isCommunicationAfterCallWorkRequested')\n            ? 'purecloud.acdInteraction.skipACW'\n            : 'purecloud.acdInteraction.requestACW';\n    }),\n\n    customerBrowserDetails: computed(\n        'interaction.customerDetails.{isChrome,isFirefox,isEdgeChromium,hasChromeExtension,cobrowseType,standAloneApplication,canScreenshare,canCobrowse}',\n        function (this: any) {\n            const interaction = this.get('interaction');\n            if (interaction) {\n                const customerDetails = get(interaction, 'customerDetails');\n                if (!customerDetails) {\n                    return {};\n                }\n\n                // because the object we get has stringified the boolean values, need to convert these to true and false\n                const isChrome = get(customerDetails, 'isChrome') === 'true' ? true : false;\n                const isFirefox = get(customerDetails, 'isFirefox') === 'true' ? true : false;\n                const isEdgeChromium = get(customerDetails, 'isEdgeChromium') === 'true' ? true : false;\n                const hasChromeExtension = get(customerDetails, 'hasChromeExtension') === 'true' ? true : false;\n                const isStandAloneApplication = get(customerDetails, 'standAloneApplication') === 'true' ? true : false;\n                const canScreenshare = get(customerDetails, 'canScreenshare') === 'true' ? true : false;\n                const canCobrowse = get(customerDetails, 'canCobrowse') === 'true' ? true : false;\n                const cobrowseType = get(customerDetails, 'cobrowseType') || canCobrowse ? true : false;\n                return {\n                    isChrome,\n                    isFirefox,\n                    isEdgeChromium,\n                    hasChromeExtension,\n                    cobrowseType,\n                    isStandAloneApplication,\n                    canScreenshare,\n                    canCobrowse\n                };\n            }\n            return {};\n        }\n    ),\n\n    isCustomerConfiguredForScreenShare: computed(\n        'interaction.isV2Provider',\n        'customerBrowserDetails.{isChrome,isFirefox,isEdgeChromium,hasChromeExtension,isStandAloneApplication,canScreenshare}',\n        function () {\n            const interaction = this.get('interaction');\n            // screenshare is not supported for v2 providers\n            if (interaction && !get(interaction, 'isV2Provider')) {\n                const customerBrowserDetails = this.get('customerBrowserDetails');\n                if (\n                    get(customerBrowserDetails, 'canScreenshare') ||\n                    get(customerBrowserDetails, 'isFirefox') ||\n                    (get(customerBrowserDetails, 'isChrome') && get(customerBrowserDetails, 'hasChromeExtension')) ||\n                    get(customerBrowserDetails, 'isEdgeChromium') ||\n                    get(customerBrowserDetails, 'isStandAloneApplication')\n                ) {\n                    return true;\n                }\n            }\n            return false;\n        }\n    ),\n\n    screenShareMisconfiguration: computed(\n        'isCustomerConfiguredForScreenShare',\n        'isAgentAllowedToScreenShare',\n        function () {\n            return this.get('isCustomerConfiguredForScreenShare') === !this.get('isAgentAllowedToScreenShare');\n        }\n    ),\n\n    isCustomerConfiguredForCobrowse: computed.or(\n        'customerBrowserDetails.cobrowseType',\n        'customerBrowserDetails.canCobrowse'\n    ),\n\n    cobrowseMisconfiguration: computed(\n        'isCustomerConfiguredForCobrowse',\n        'isAgentAllowedToCobrowse',\n        function (this: any) {\n            return this.get('isCustomerConfiguredForCobrowse') === !this.get('isAgentAllowedToCobrowse');\n        }\n    ),\n\n    isAgentAllowedToCobrowse: computed(\n        'isCall',\n        'isChat',\n        'permissions.{canViewAcdCoBrowseForCall,canViewAcdCoBrowseForChat}',\n        function (this: any) {\n            const permissions = this.get('permissions');\n            const canCobrowseCall = get(permissions, 'canViewAcdCoBrowseForCall');\n            if (this.get('isCall') && canCobrowseCall) {\n                return true;\n            }\n            const canCobrowseChat = get(permissions, 'canViewAcdCoBrowseForChat');\n            if (this.get('isChat') && canCobrowseChat) {\n                return true;\n            }\n            return false;\n        }\n    ),\n\n    isAgentAllowedToScreenShare: computed('isCall', 'isChat', 'interaction.canScreenShare', function (this: any) {\n        const interaction = this.get('interaction');\n        return interaction && get(interaction, 'canScreenShare') && (this.get('isCall') || this.get('isChat'));\n    }),\n\n    sessionShareStartTooltip: computed(\n        'webrtc.activeBridge',\n        'disableShareButtonReason',\n        'customerBrowserDetails.isStandAloneApplication',\n        'interaction.canScreenShare',\n        function (this: any) {\n            const webrtc = this.get('webrtc');\n            if (webrtc) {\n                if (!this.get('interaction.canScreenShare') && !get(webrtc, 'activeBridge')) {\n                    return 'purecloud.acdInteraction.sessionShare.noVideoWarning';\n                } else if (this.get('isChat')) {\n                    const customerBrowserDetails = this.get('customerBrowserDetails');\n                    if (this.get('disableShareButtonReason')) {\n                        return this.get('disableShareButtonReason');\n                    } else if (get(customerBrowserDetails, 'isStandAloneApplication')) {\n                        return 'purecloud.acdInteraction.sessionShare.customerUsingStandAloneApplication';\n                    }\n                }\n            }\n            return 'purecloud.acdInteraction.sessionShare.start';\n        }\n    ),\n\n    webMessagingCobrowseStartTooltip: computed('interaction.{cobrowseSessionShareActive}', function (this: any) {\n        const interaction = this.get('interaction');\n        if (interaction && !get(interaction, 'cobrowseSessionShareActive')) {\n            return 'purecloud.acdInteraction.cobrowseNext.startCobrowse';\n        }\n        return 'purecloud.acdInteraction.cobrowseNext.cobrowseActive';\n    }),\n\n    isCoBrowse: computed.readOnly('interaction.isCoBrowse'),\n\n    disableShareButtonReason: computed(\n        'screenShareMisconfiguration',\n        'cobrowseMisconfiguration',\n        'customerBrowserDetails.{isChrome,isFirefox,isEdgeChromium,hasChromeExtension,isStandAloneApplication}',\n        function (this: any) {\n            const customerBrowserDetails = this.get('customerBrowserDetails');\n            const isConfigured =\n                this.get('isCustomerConfiguredForCobrowse') ||\n                this.get('isCustomerConfiguredForScreenShare') ||\n                (customerBrowserDetails && get(customerBrowserDetails, 'isStandAloneApplication'));\n\n            if (customerBrowserDetails && isConfigured) {\n                if (this.get('screenShareMisconfiguration')) {\n                    if (get(customerBrowserDetails, 'isChrome') && !get(customerBrowserDetails, 'hasChromeExtension')) {\n                        return 'purecloud.acdInteraction.sessionShare.error.noChromeExtension';\n                    }\n                    if (\n                        !get(customerBrowserDetails, 'isFirefox') &&\n                        !get(customerBrowserDetails, 'isChrome') &&\n                        !get(customerBrowserDetails, 'isEdgeChromium')\n                    ) {\n                        return 'purecloud.acdInteraction.sessionShare.error.notUsingSupportedBrowser';\n                    }\n                } else if (this.get('cobrowseMisconfiguration')) {\n                    return 'purecloud.acdInteraction.sessionShare.error.notConfiguredForCobrowse';\n                }\n            }\n\n            return '';\n        }\n    ),\n\n    disableVideoButton: computed.readOnly('interactionService.hasActiveSessionShare'),\n\n    disableShareButton: computed(\n        'disableVideoButton',\n        'isCustomerConfiguredForCobrowse',\n        'isCustomerConfiguredForScreenShare',\n        'interaction.isV2Provider',\n        function (this: any) {\n            const interaction = this.get('interaction');\n            return (\n                !get(interaction, 'isV2Provider') &&\n                (this.get('disableVideoButton') ||\n                    !(this.get('isCustomerConfiguredForCobrowse') || this.get('isCustomerConfiguredForScreenShare')))\n            );\n        }\n    ),\n\n    shouldShowSessionShareButton: computed(\n        'interaction.{isV2Provider,myselfIsMonitor,myselfIsCoach}',\n        'isAgentAllowedToScreenShare',\n        'isAgentAllowedToCobrowse',\n        function (this: any) {\n            // session-share is not supported for v2 widgets or for MCB participants\n            const interaction = this.get('interaction');\n            if (\n                (interaction && get(interaction, 'isV2Provider')) ||\n                get(interaction, 'myselfIsMonitor') ||\n                get(interaction, 'myselfIsCoach')\n            ) {\n                return false;\n            }\n\n            // Show the button if agent has either permission\n            return this.get('isAgentAllowedToScreenShare') || this.get('isAgentAllowedToCobrowse');\n        }\n    ),\n\n    enableAcdSessionShare: computed(\n        'isConnected',\n        'isCall',\n        'isChat',\n        'interaction.onConsult',\n        'isInternalProvider',\n        function (this: any) {\n            const interaction = this.get('interaction');\n            return (\n                this.get('isInternalProvider') &&\n                (this.get('isCall') || this.get('isChat')) &&\n                this.get('isConnected') &&\n                (!interaction || !get(interaction, 'onConsult'))\n            );\n        }\n    ),\n\n    showSessionShareChatOrCall: computed(\n        'enableAcdSessionShare',\n        'shouldShowSessionShareButton',\n        'isChat',\n        'isCall',\n        'isCobrowseV2SetUpForVoice',\n        function (this: any) {\n            return (\n                this.get('enableAcdSessionShare') &&\n                this.get('shouldShowSessionShareButton') &&\n                (this.get('isChat') || (this.get('isCall') && !this.get('isCobrowseV2SetUpForVoice')))\n            );\n        }\n    ),\n\n    isCopilotACWEnabled: computed.readOnly('permissions.canViewCopilot'),\n\n    callbacksInheritRoutingFromInboundCallToggle: computed('session.{features}', function () {\n        const features = this.get('session.features');\n        return features && features['callbacks.inherit.routing.from.inbound.call'];\n    }),\n\n    isWarmInviteCall: computed.and('acdWarmConferencePhase1FT', 'interaction.isWarmInviteCall'),\n\n    showSnippetRecordingButton: computed(\n        'session.features.WEM-118_snippet-recording',\n        'permissions.canSnippetRecord',\n        'isCall',\n        'isConnected',\n        'myselfIsCoachOrMonitor',\n        function (this: any) {\n            const snippetRecordingFT = this.get('session.features.WEM-118_snippet-recording');\n            const snippetRecordingPerm = this.get('permissions.canSnippetRecord');\n            const isCall = this.get('isCall');\n            const isConnected = this.get('isConnected');\n            const myselfIsCoachOrMonitor = this.get('myselfIsCoachOrMonitor');\n\n            return snippetRecordingFT && snippetRecordingPerm && isCall && isConnected && !myselfIsCoachOrMonitor;\n        }\n    ),\n\n    isSnippetRecordingActive: computed(\n        'session.features.WEM-118_snippet-recording',\n        'interaction.participantForCurrentUser.calls.firstObject.recordersState.snippetState',\n        function (this: any) {\n            const snippetRecordingFT = this.get('session.features.WEM-118_snippet-recording');\n            const snippetRecordingState = this.get(\n                'interaction.participantForCurrentUser.calls.firstObject.recordersState.snippetState'\n            );\n            if (!snippetRecordingFT || !snippetRecordingState) return;\n\n            return snippetRecordingState === 'active';\n        }\n    ),\n\n    isSnippetRecordingDisabled: computed('isRecordingPaused', 'interaction.isHeld', function (this: any) {\n        return this.get('isRecordingPaused') || this.get('interaction.isHeld');\n    }),\n\n    // ==================================================================\n    // Generic Functions\n    // ==================================================================\n\n    guxdismiss() {\n        this.onClosePopover();\n    },\n\n    onClosePopover() {\n        document.querySelectorAll('gux-popover').forEach((element: any) => {\n            element.isOpen = false;\n            // For Aria Expanded Labels\n            this.setProperties({\n                showWorkitemTransferDropdown: false,\n                showTransferDropdown: false,\n                showConsultDropdown: false,\n                showParkSmsDropdown: false,\n                showConferenceDropdown: false,\n                showCobrowseDropdown: false,\n                showDialpadDropdown: false,\n                showCallbackDialpadDropdown: false,\n                showMainstageSizer: false\n            });\n        });\n    },\n\n    /**\n     * Sets the division name of the interaction based on the external contacts division\n     * or the initial division associated to the interaction.\n     */\n    _updateDivisionName(contactId: Participant['externalContactId'] = ''): Promise<void> | void {\n        if (this.get('acdExternalContactDivNameFT')) {\n            const setDivisionName = (name: DivisionName) => {\n                if (this && !(this.get('isDestroyed') || this.get('isDestroying')))\n                    run(() => {\n                        this.set('externalContactDivisionName', name);\n                    });\n            };\n\n            if (this.get('acdExternalContactWorkitemsDivNameFT')) {\n                return this.get('externalContacts')\n                    .getCanonicalExternalContact(contactId, false)\n                    .then(externalContact => {\n                        if (externalContact || this.get('workitem')) {\n                            setDivisionName(get(externalContact || {}, 'division.name'));\n                            return;\n                        }\n\n                        const interaction = this.get('interaction');\n                        const divisionId = get(\n                            interaction || {},\n                            'participantForCustomer.externalContactInitialDivisionId'\n                        );\n                        return this.loadDivisionName(divisionId).then((divisionName: DivisionName) => {\n                            setDivisionName(divisionName);\n                        });\n                    });\n            } else {\n                if (this.get('workitem')) {\n                    setDivisionName(undefined);\n                    return;\n                }\n                const externalContact = this.get('_externalCanonicalContact');\n                if (externalContact) {\n                    setDivisionName(externalContact?.division?.name);\n                    return;\n                }\n                const interaction = this.get('interaction');\n                const divisionId = get(interaction || {}, 'participantForCustomer.externalContactInitialDivisionId');\n                this.loadDivisionName(divisionId).then((divisionName: string | undefined) => {\n                    setDivisionName(divisionName);\n                });\n            }\n        }\n    },\n\n    /**\n     * Updates the `prevInteraction` component based on the meaningful properties\n     * taken from the provided interaction component.\n     *\n     * @param interaction the interaction to update the values with\n     */\n    updatePrevInteraction(interaction: any) {\n        if (!interaction) {\n            this.set('prevInteraction', null);\n        } else {\n            const prevInteraction = {} as { [key in WatchInteractionProperty]: any };\n            for (const key of WatchInteractionProperties) {\n                const value = get(interaction, key);\n                prevInteraction[key] = value;\n            }\n            this.set('prevInteraction', prevInteraction);\n        }\n    },\n\n    /**\n     * Resets all of the interaction dropdowns to a closed state\n     */\n    resetDropdowns() {\n        InteractionDropdownProps.forEach(prop => this.set(prop, false));\n    },\n\n    /**\n     * Builds and returns a mainstage layout object with values that are validated, updated, and/or defaulted based on the MainstageLayout type.\n     */\n    buildValidMainstageLayout(\n        toCheck: unknown,\n        defaultLayout: MainstageLayout = { mainstageSize: 'medium', mainstageCollapsed: false, mainstageFocused: false }\n    ): MainstageLayout {\n        if (typeof toCheck !== 'object' || toCheck === null) {\n            return defaultLayout;\n        }\n\n        const result = { ...defaultLayout };\n\n        const { mainstageSize, mainstageCollapsed, mainstageFocused } = toCheck as MainstageLayout;\n        if (typeof mainstageSize === 'string' && MainstageSizes.includes(mainstageSize)) {\n            result.mainstageSize = mainstageSize;\n        }\n        if (typeof mainstageCollapsed === 'boolean') {\n            result.mainstageCollapsed = mainstageCollapsed;\n        }\n        if (typeof mainstageFocused === 'boolean') {\n            result.mainstageFocused = mainstageFocused;\n        }\n\n        return result;\n    },\n\n    engagementSource: computed.readOnly('interaction.engagementSource'),\n\n    /**\n     * fetches the deployment config for the selected interaction if the deploymentId\n     * can be determined and if the `cobrowseV2EnabledCache` does not include it already.\n     */\n    getDeploymentConfig() {\n        const deploymentId = this.get('deploymentId');\n\n        if (deploymentId && !this.get('cobrowseV2EnabledCache').has(deploymentId)) {\n            this.get('communication')\n                .getDeploymentConfig(deploymentId)\n                .then((config: any) => {\n                    if (!this.get('isDestroyed') && !this.get('isDestroying')) {\n                        if (config?.configurationVersion?.cobrowse?.enabled) {\n                            this.get('cobrowseV2EnabledCache').put(\n                                deploymentId,\n                                config.configurationVersion.cobrowse.enabled\n                            );\n                        } else {\n                            this.get('cobrowseV2EnabledCache').put(deploymentId, false);\n                        }\n\n                        // notify property change since we're mutating the instance vs the ref\n                        this.notifyPropertyChange('cobrowseV2EnabledCache');\n                    }\n                })\n                .catch((err: any) => {\n                    this.get('logger').error('Failed to get Deployment Config', {\n                        err\n                    });\n                    // Will try again in 5 mins\n                    this.get('cobrowseV2EnabledCache').put(deploymentId, false);\n                    // notify property change since we're mutating the instance vs the ref\n                    this.notifyPropertyChange('cobrowseV2EnabledCache');\n                });\n        }\n    },\n\n    updateCustomerParticipantName() {\n        const interaction = this.get('interaction');\n        const id = interaction ? get(interaction, 'participantForCustomer.id') : null;\n        const conversation = interaction ? get(interaction, '__interaction_metadata__') : null;\n        if (id && conversation) {\n            const rawParticipant = this.getRawParticipant(conversation.participants, id);\n            if (rawParticipant) {\n                return this.get('participantName')\n                    .fetchNameFromParticipant(rawParticipant)\n                    .then((name: Maybe<string>) => {\n                        this.set('_customerParticipantName', name);\n                    })\n                    .catch(() => {\n                        this.set('_customerParticipantName', null);\n                    });\n            }\n            this.get('logger').warn('ACD: Unable to find requested participant in conversation payload');\n        }\n        this.set('_customerParticipantName', null);\n        return Promise.resolve();\n    },\n\n    updateCallbackMediaSettings() {\n        const queueId = this.get('autoCallbackQueueId');\n\n        if (queueId && queueId !== this.get('lastCallbackQueueId') && this.get('isCallback')) {\n            this.get('queue')\n                .getQueue(queueId)\n                .then(queue => {\n                    const callbackMediaSettings = queue.mediaSettings.callback;\n                    if (callbackMediaSettings.enableAutoDialAndEnd) {\n                        this.set('callbackMediaSettings', callbackMediaSettings);\n                    } else {\n                        this.set('callbackMediaSettings', {});\n                    }\n                })\n                .catch(() => {\n                    this.set('callbackMediaSettings', {});\n                })\n                .finally(() => {\n                    this.set('lastCallbackQueueId', queueId);\n                });\n        }\n    },\n\n    /**\n     * Retrieves the note history of the currently active interaction being viewed by the user.\n     * After fetching all of the notes it will also sort the notes in order based on\n     * endTime (when the note was submitted).\n     */\n    retrieveNotesHistory() {\n        const interaction = this.get('interaction');\n        if (!interaction) return;\n        const participant = get(interaction, 'participantForCurrentUser');\n        if (participant) {\n            const newNotesHistoryRetrievedAt = new Date();\n            this.set('notesHistoryRetrievedAt', newNotesHistoryRetrievedAt);\n\n            this.get('communication')\n                .getAllHistoricalACWNotes(interaction)\n                .then(response => {\n                    // This ensures that we only update notesHistory if this was the most recent retrieveNotesHistory() call\n                    if (this.get('notesHistoryRetrievedAt') === newNotesHistoryRetrievedAt) {\n                        const notesHistory = response\n                            .filter(item => item && item.notes)\n                            .sort((a, b) => {\n                                if (a.endTime > b.endTime) {\n                                    return 1;\n                                } else if (a.endTime < b.endTime) {\n                                    return -1;\n                                }\n                                return 0;\n                            });\n\n                        set(interaction, 'notesHistory', notesHistory);\n                    }\n                })\n                .catch(() => {});\n        }\n    },\n\n    /**\n     * Removes the mainstage layout for this interaction from JS Memory\n     */\n    removeInteractionMainstageLayoutsFromMemory(id: string) {\n        MAINSTAGE_LAYOUT_STORAGE_KEY_INTERACTION_TYPES.forEach(currType => {\n            this.get('storage').removeMemoryStorageItem(`agentUiMainstage.${id}.${currType}`);\n        });\n    },\n\n    /**\n     * Updates the mainstage size and collapsed state in the UI of the current interaction from memory.\n     * If there is no entry in memory, add one and update the UI to reflect those changes.\n     * This is used primarily when switching between interactions in the roster card.\n     */\n    updateMainstage() {\n        const selectedAppContext: Maybe<AppContext> = this.get('selectedAppContext');\n        if (!selectedAppContext) return;\n\n        const interactionType = getInteractionType(selectedAppContext);\n        const memoryMainstageMapKey = `${selectedAppContext.id}.${interactionType}`;\n        const persistentMainstageMap = this.get('persistentMainstageMap');\n        const persistentMainstageMapKey = `${interactionType}`;\n\n        // Grab the entry from memory\n        const memoryMainstageMapValue = this.get('storage').getMemoryStorageItem(\n            `agentUiMainstage.${memoryMainstageMapKey}`\n        );\n\n        if (memoryMainstageMapValue) {\n            const mainstageLayout: MainstageLayout = this.buildValidMainstageLayout(memoryMainstageMapValue);\n            this.set('mainstageSize', get(mainstageLayout, 'mainstageSize'));\n            this.set('isMainstageCollapsed', get(mainstageLayout, 'mainstageCollapsed'));\n            this._mainstageFocusedChanged(get(mainstageLayout, 'mainstageFocused'));\n\n            if (this.get('session').get('useModes')) {\n                run.schedule('afterRender', this, () => {\n                    this.onMainstageSizeChanged?.(get(mainstageLayout, 'mainstageSize'));\n                    this.onMainstageCollapsedChanged?.(get(mainstageLayout, 'mainstageCollapsed'));\n                });\n            }\n        } else {\n            // Add (default) preference for this interaction into memory\n            const preferenceFromPersistentMap = persistentMainstageMap[persistentMainstageMapKey];\n            const mainstageLayout: MainstageLayout = this.buildValidMainstageLayout(preferenceFromPersistentMap);\n\n            // Update the Memory\n            this.get('storage').setMemoryStorageItem(`agentUiMainstage.${memoryMainstageMapKey}`, mainstageLayout);\n            this.set('mainstageSize', get(mainstageLayout, 'mainstageSize'));\n            this.set('isMainstageCollapsed', get(mainstageLayout, 'mainstageCollapsed'));\n            this._mainstageFocusedChanged(get(mainstageLayout, 'mainstageFocused'));\n\n            if (this.get('session').get('useModes')) {\n                run.schedule('afterRender', this, () => {\n                    this.onMainstageSizeChanged?.(get(mainstageLayout, 'mainstageSize'));\n                    this.onMainstageCollapsedChanged?.(get(mainstageLayout, 'mainstageCollapsed'));\n                });\n            }\n        }\n    },\n\n    /**\n     * Determines what conversations are currently being attended transferred to another participant and\n     * if any conversation has been declined so we can notify the agent that a conversation is returning to them.\n     */\n    determineActiveAttendedTransfers() {\n        const previousActiveTransfers = this.get('currentActiveTransfers');\n        const activeTransfers = new Map<string, any>();\n\n        const activeInteractions = this.get('activeInteractions') ?? [];\n        activeInteractions.forEach((interaction: any) => {\n            if (interaction && get(interaction, 'isAttendedTransferring')) {\n                const id = get(interaction, 'id');\n                activeTransfers.set(id, interaction);\n            }\n        });\n\n        // if there were no previous active transfers, then there isn't anything to compare against\n        if (previousActiveTransfers.size) {\n            // needs to be set if there is an interaction that has been canceled.\n            let canceledInteraction = null;\n\n            // array of tasks to complete at the end of this logic\n            const tasks: Promise<any>[] = [];\n\n            const transferResolved = previousActiveTransfers.size && !activeTransfers.size;\n            previousActiveTransfers.forEach(interaction => {\n                if (interaction && (transferResolved || !activeTransfers.has(get(interaction, 'id')))) {\n                    if (get(interaction, 'wasTransferCompleted')) {\n                        if (get(interaction, 'isChat') && !get(interaction, 'isV2Provider')) {\n                            tasks.push(\n                                this.get('chat')\n                                    .leaveAcdRoom(get(interaction, 'roomId'))\n                                    .catch((error: any) =>\n                                        this.get('logger').error('There was an issue leaving the chat', { error })\n                                    )\n                            );\n                        }\n                    } else if (get(interaction, 'wasTransferCanceled')) {\n                        canceledInteraction = interaction;\n                    }\n                }\n            });\n\n            if (canceledInteraction) {\n                const mostRecentTransfer = get(canceledInteraction, 'mostRecentTransfer');\n                if (mostRecentTransfer) {\n                    const modifiedBy = get(mostRecentTransfer, 'modifiedBy.id');\n                    const initiator = get(mostRecentTransfer, 'initiator.userId');\n                    const destination = get(mostRecentTransfer, 'destination.userId');\n\n                    switch (modifiedBy) {\n                        // the initiator canceled\n                        case initiator:\n                            this._displayNotification(null, 'purecloud.acdInteraction.transferCanceled');\n                            break;\n                        // the recipient declined\n                        case destination:\n                            this._displayNotification(null, 'purecloud.acdInteraction.transferDeclined');\n                            break;\n                        // the transfer failed due to the system\n                        default:\n                            this._displayNotification(null, 'purecloud.acdInteraction.transferFailed');\n                            break;\n                    }\n                } else {\n                    this._displayNotification(null, 'purecloud.acdInteraction.transferFailed');\n                }\n            }\n\n            Promise.all(tasks);\n        }\n\n        safeSet(this, 'currentActiveTransfers', activeTransfers);\n    },\n\n    async determineActiveDigitalConsults() {\n        // if the feature toggle is not enabled, then we don't need to determine active digital consults\n        if (!this.get('digitalConsultEnabled')) return;\n\n        const previousActiveConsults = this.get('currentActiveConsults');\n        const activeConsults = new Map<string, CurrentActiveConsult>();\n\n        const activeInteractions = this.get('activeInteractions') ?? [];\n        for (const interaction of activeInteractions) {\n            // only messaging typed interactions that are on an active consult are included here\n            if (get(interaction, 'onConsult') && get(interaction, 'type') === 'message') {\n                const id = get(interaction, 'id');\n\n                // we need to use the \"other\" non-customer participant in the consult\n                const otherParticipant = this._determineConsultControlsParticipant({\n                    onConsult: get(interaction, 'onConsult'),\n                    iAmConsultInitiator: get(interaction, 'iAmConsultInitiator'),\n                    iAmConsulted: get(interaction, 'iAmConsulted'),\n                    consultAgentParticipant: get(interaction, 'consultAgentParticipant'),\n                    consultInitiator: get(interaction, 'consultInitiator')\n                });\n\n                const selfParticipant = get(interaction, 'participantForCurrentUser');\n\n                const previousConsult = previousActiveConsults.get(id);\n\n                if (otherParticipant) {\n                    // if I am the initiator and the other user disconnects, we need to check if the latest message was connected\n                    const [otherLatestMessage] = get(otherParticipant, 'internalMessages') ?? [];\n                    const otherWasConnected = otherLatestMessage ? !!get(otherLatestMessage, 'connectedTime') : false;\n\n                    const [selfLatestMessage] =\n                        (selfParticipant ? get(selfParticipant, 'internalMessages') : undefined) ?? [];\n                    const selfWasConnected = selfLatestMessage ? !!get(selfLatestMessage, 'connectedTime') : false;\n\n                    // if we already have the data, then we can avoid having to refetch it\n                    let otherParticipantName =\n                        previousConsult?.otherParticipantName ?? get(otherParticipant, 'name') ?? null;\n                    if (!otherParticipantName) {\n                        // sometimes the participant name is not set, so we need to fetch the user data to get the name\n                        const data = await this.get('store')\n                            .findRecord('person', get(otherParticipant, 'userId'))\n                            .catch(() => undefined);\n                        otherParticipantName = get(data, 'name') ?? null;\n                    }\n\n                    activeConsults.set(id, {\n                        interaction,\n                        otherParticipantName,\n                        otherWasConnected,\n                        selfWasConnected,\n                        selfDisconnected: false,\n                        role: get(interaction, 'iAmConsultInitiator') ? 'initiator' : 'consultant'\n                    });\n                } else {\n                    this.get('logger').warn('ACD: Unable to find the other participant for a consult', {\n                        interactionId: id\n                    });\n                }\n            }\n        }\n\n        previousActiveConsults.forEach(active => {\n            const { interaction, otherParticipantName, otherWasConnected, selfWasConnected, selfDisconnected, role } =\n                active;\n\n            const wasRecentlyTransferred =\n                role === 'initiator' ? get(interaction, 'wasTransferCompleted') : get(interaction, 'wasTransferredTo');\n            const wasTakenOver = get(interaction, 'takeoverNotified');\n\n            // if the consult was disconnected by the active user or if the active user was never connected, we don't\n            // need to notify them\n            if (selfDisconnected || !selfWasConnected || wasRecentlyTransferred || wasTakenOver) return;\n\n            // if `true` then the consult has recently been resolved or canceled\n            if (!activeConsults.has(get(interaction, 'id'))) {\n                if (otherWasConnected && otherParticipantName) {\n                    this._displayNotification(null, 'purecloud.acdInteraction.consultDisconnected', {\n                        messageParams: { name: otherParticipantName }\n                    });\n                } else if (otherWasConnected) {\n                    this._displayNotification(null, 'purecloud.acdInteraction.consultDisconnectedNoName');\n                } else if (otherParticipantName) {\n                    this._displayNotification(null, 'purecloud.acdInteraction.consultDeclined', {\n                        messageParams: { name: otherParticipantName }\n                    });\n                } else {\n                    this._displayNotification(null, 'purecloud.acdInteraction.consultDeclinedNoName');\n                }\n            }\n        });\n\n        // Defer the currentActiveConsults update to avoid Glimmer backtracking assertion\n        // when the template reads @currentActiveConsults in the same render pass.\n        // Using await ensures we exit the synchronous render transaction.\n        await Promise.resolve();\n        safeSet(this, 'currentActiveConsults', activeConsults);\n    },\n\n    getRawParticipant(participants: any[], id: string) {\n        return (participants || []).find((p: { id: string }) => p.id === id);\n    },\n\n    getInteractionPanelContextKey(interaction: any) {\n        const type = interaction.workitem ? 'workitem' : get(interaction, 'type');\n        return `${get(interaction, 'id')}-${type}`;\n    },\n\n    doesRequireStructuredMessage(interaction: any) {\n        if (interaction) {\n            const lastInbound = get(interaction, 'lastCustomerMessage');\n            if (get(interaction, 'subMessageType') === 'whatsapp' && lastInbound) {\n                return moment(lastInbound.timestamp).isSameOrBefore(moment().subtract(1, 'days'));\n            }\n        }\n        return false;\n    },\n\n    _handleAgentEndedCallWithError(conversationId: string) {\n        if (!this.get('agentEndedCallsWithError').includes(conversationId)) {\n            this.get('agentEndedCallsWithError').push(conversationId);\n        }\n    },\n\n    _endChat() {\n        const chat = this.get('chat');\n        if (this.get('isChat') && get(chat, 'connected')) {\n            this.set('isEndingChat', true);\n\n            const interaction = this.get('interaction');\n            this.get('acdchat')\n                .endChat(interaction)\n                .then(() => {\n                    this.get('logger').debug('ACD: End chat ' + interaction.id);\n                })\n                .catch(() => {\n                    this._displayError('purecloud.acdInteraction.chats.errors.hangup');\n                })\n                .finally(() => {\n                    this.set('isEndingChat', false);\n                });\n        }\n    },\n\n    _endSms() {\n        if (this.get('isSms') && this.get('isConnected')) {\n            const sms = this.get('interaction');\n\n            // if on a consult, then we need to ensure we mark this as self-disconnected\n            if (get(sms, 'onConsult')) {\n                const activeConsults = this.get('currentActiveConsults');\n                const current = activeConsults.get(sms.id);\n                if (current) {\n                    current.selfDisconnected = true;\n                    activeConsults.set(sms.id, current);\n                }\n            }\n\n            this.set('isEndingSms', true);\n            this.get('acdsms')\n                .endSms(sms)\n                .then(() => {\n                    this.get('logger').debug('ACD: End sms ' + sms.get('id'));\n                })\n                .catch(() => {\n                    this._displayError('purecloud.acdInteraction.sms.errors.hangup');\n                })\n                .finally(() => {\n                    this.set('isEndingSms', false);\n                });\n        }\n    },\n\n    _disconnect() {\n        this.get('communication')\n            .disconnect(this.get('interaction'))\n            .catch(() => {\n                this._displayError('purecloud.acdInteraction.errors.disconnect');\n            });\n    },\n\n    _park(resumeTime?: string) {\n        // Not work items park\n        const interaction = this.get('interaction');\n        if (interaction && !this.get('isParking')) {\n            this.set('isParking', true);\n            return this.get('communication')\n                .park(this.get('interaction'), resumeTime)\n                .catch((error: any) => {\n                    const errorResponse = get(error, 'jqXHR.responseJSON');\n                    if (\n                        errorResponse?.errors?.length &&\n                        errorResponse.errors[0].code === 'conversation.error.park.user.concurrent.max.exceeded'\n                    ) {\n                        const titleKey = this.get('intl').t('purecloud.acdInteraction.park.limitError.title');\n                        const messageKey = this.get('intl').t('purecloud.acdInteraction.park.limitError.message');\n                        this.get('notification').error(titleKey, messageKey);\n                    } else {\n                        const titleKey = 'purecloud.acdInteraction.park.limitError.title';\n                        this._displayError(titleKey);\n                    }\n                })\n                .finally(() => {\n                    this.set('isParking', false);\n                });\n        }\n    },\n\n    _handleConversationSummaryEvent(event: any) {\n        const interaction = this.get('interaction');\n        if (!interaction || (!get(interaction, 'isAgentAssistACWEnabled') && !this.get('isCopilotACWEnabled'))) return;\n        const summaryEvt = event;\n        try {\n            const summaryFromStorage = JSON.parse(localStorage.getItem(AGENT_ASSIST_SUMMARY_KEY) || '{}') || {};\n            summaryFromStorage[summaryEvt.conversationId] = summaryEvt;\n            localStorage.setItem(AGENT_ASSIST_SUMMARY_KEY, JSON.stringify(summaryFromStorage));\n        } catch (err) {\n            this.get('logger').error('Error storing summary data in the local storage', {\n                conversationId: get(interaction, 'id'),\n                error: err\n            });\n        }\n    },\n\n    _toggleSecurePause() {\n        try {\n            this.get('_timers').push(throttle(this, this._pause, 1000));\n        } catch (error) {\n            console.error('There was an error securing the pause', error);\n        }\n    },\n\n    _toggleSnippetRecord() {\n        const snippetRecordingFT = this.get('session')?.['features']?.['WEM-118_snippet-recording'];\n        if (!snippetRecordingFT) return;\n\n        try {\n            this.get('_timers').push(throttle(this, this._snippetRecord, 1000));\n        } catch (error) {\n            console.error('There was an error with _toggleSnippetRecord', error);\n        }\n    },\n\n    joinChat() {\n        const chat = this.get('chat');\n        if (\n            this.get('isChat') &&\n            this.get('isInternalProvider') &&\n            !this.get('isV2ChatProvider') &&\n            get(chat, 'connected')\n        ) {\n            const interaction = this.get('interaction');\n            const state = interaction.get('interactionState');\n\n            // If the user is still connected, we can re-enter\n            // the room\n            if (state.toLowerCase() === participantStatus.CONNECTED.toLowerCase()) {\n                this.get('acdchat')\n                    .answerChat(interaction)\n                    .then((room: any) => {\n                        this.set('room', room);\n                        this.get('chat').activateRoom(room);\n                    });\n\n                // If the user isn't connected, we can at least focus\n                // the room if it's still active. If we still have the room\n                // object set -- it should still be active.\n            } else if (interaction.get('room')) {\n                const room = interaction.get('room');\n                this.set('room', room);\n\n                // If we're not connected, and the room isn't active,\n                // we don't rejoin the room (it'll create a new participant).\n            } else {\n                this.set('room', null);\n            }\n        }\n    },\n\n    /**\n     * Invoked when the user attempts to copy the url associated with the currently selected interaction\n     * from the interaction header.\n     */\n    _copyInteractionUrl() {\n        const interaction = this.get('interaction');\n        const id = interaction ? get(interaction, 'id') : null;\n        if (id) {\n            let text = id;\n            if (!this.get('preferInteractionGUID')) {\n                const { hostname, pathname, port } = window.location;\n                text = port\n                    ? `https://${hostname}:${port}${pathname}#/${INTERACTIONS_PATH}/${id}`\n                    : `https://${hostname}${pathname}#/${INTERACTIONS_PATH}/${id}`;\n            }\n\n            navigator.clipboard\n                .writeText(text)\n                .then(() => {\n                    this._displayNotification(null, 'purecloud.acdInteraction.copyLinkSuccess');\n                })\n                .catch(() => {\n                    this._displayError('purecloud.acdInteraction.copyLinkError');\n                });\n        } else {\n            this._displayError('purecloud.acdInteraction.copyLinkError');\n        }\n    },\n\n    /**\n     * Invoked when the user attempts to copy the corresponding external customers phone number\n     */\n    _copyExternalCustomerPhoneNumber() {\n        const interaction = this.get('interaction');\n        if (interaction) {\n            const text = get(interaction, 'formattedCustomerPhoneNumber');\n            try {\n                navigator.clipboard.writeText(text);\n                this._displayNotification(\n                    null,\n                    'purecloud.acdInteraction.callbacks.customerPhoneNumberCopyLinkSuccess'\n                );\n            } catch (error) {\n                this._displayError('purecloud.acdInteraction.callbacks.customerPhoneNumberCopyLinkError');\n            }\n        }\n    },\n\n    _beginSessionShare() {\n        const interaction = this.get('interaction');\n        if (interaction) {\n            const customerId = get(interaction, 'participantForCustomer.id');\n            set(interaction, 'sessionShareDisconnectTimer', null);\n            set(interaction, 'isRequestingNewSessionShare', true); //This will get reset to false when the customer is connected.\n            set(interaction, 'sessionShareExplicitlyInitiated', true); // will remain true until session is terminated\n            this.get('communication')\n                .initiateSessionShare(interaction, customerId)\n                .then(([codeResponse, mediaRequestResponse]) => {\n                    if (codeResponse && interaction) {\n                        if (get(interaction, 'isV2Provider') && mediaRequestResponse) {\n                            set(interaction, 'mediaRequestState', mediaRequestResponse.state);\n                        }\n                        set(interaction, 'sessionShareCode', codeResponse.addCommunicationCode);\n                        set(interaction, 'sourceCommunicationId', codeResponse.sourceCommunicationId);\n                        interaction.trigger('sessionShareCodeHasChanged', get(interaction, 'id'));\n                    }\n                })\n                .catch(err => {\n                    this.get('logger').error('Error beginning session share:', { err });\n                    this._displayError('purecloud.acdInteraction.errors.sessionShare');\n                })\n                .finally(() => {\n                    set(interaction, 'isRequestingScreenShareOrCoBrowse', false);\n                    set(interaction, 'isRequestingVideo', false);\n                });\n        }\n    },\n\n    async _hold() {\n        const interaction = this.get('interaction');\n        if (!interaction || get(interaction, 'isHoldLoading')) return;\n\n        set(interaction, 'isHoldLoading', true);\n        try {\n            const consultActive =\n                get(interaction, 'iAmConsultInitiator') && get(interaction, 'isThereAConsultAgentParticipant');\n            if (consultActive) {\n                const participant = get(interaction, 'consultParticipant');\n                const confined = participant.calls[0].confined;\n                if (confined) {\n                    await this.get('communication').consultBoth(interaction);\n                } else {\n                    await this.get('communication').consultDestination(interaction);\n                }\n            } else {\n                await this.get('phone').hold(get(interaction, 'conversation'), true);\n            }\n        } catch (error) {\n            this.get('logger').error('ACD - There was an issue holding the conversation', {\n                remoteData: { error }\n            });\n            this._displayError('purecloud.acdInteraction.calls.errors.hold');\n        } finally {\n            set(interaction, 'isHoldLoading', false);\n        }\n    },\n\n    _mute() {\n        const interaction = this.get('interaction');\n        if (!interaction || get(interaction, 'isMuteLoading')) return;\n\n        set(interaction, 'isMuteLoading', true);\n        this.get('phone')\n            .mute(get(interaction, 'conversation'))\n            .catch((error: any) => {\n                this.get('logger').error('Issue with the mute mate', { remoteData: { error } });\n            })\n            .finally(() => {\n                set(interaction, 'isMuteLoading', false);\n            });\n    },\n\n    _hangup() {\n        const interaction = this.get('interaction');\n        if (interaction) {\n            if (get(interaction, 'iAmConsultInitiator')) {\n                this._hangUpCustomer();\n            } else {\n                this.get('phone').endCall(get(interaction, 'conversation'));\n            }\n        }\n    },\n\n    _hangUpCustomer: async function () {\n        const interaction = this.get('interaction');\n        const callId = get(interaction, 'id');\n        const type = get(interaction, 'type');\n        let participantId = get(interaction, 'participantForCustomer.id');\n\n        return this.get('communication')\n            .disconnectParticipant(callId, participantId, type)\n            .catch(() => {\n                this._displayError('purecloud.acdInteraction.errors.disconnectParticipant');\n            });\n    },\n\n    async _pause() {\n        const interaction = this.get('interaction');\n        if (!interaction || get(interaction, 'isSecurePauseLoading')) return;\n\n        set(interaction, 'isSecurePauseLoading', true);\n        try {\n            if (this.get('isRecordingPaused')) {\n                await this.get('communication').unpause(interaction);\n            } else {\n                await this.get('communication').pause(interaction);\n            }\n        } catch (error) {\n            this.get('logger').error('ACD - There was an error pausing the interaction', {\n                remoteData: { error, pausing: !this.get('isRecordingPaused') }\n            });\n            this._displayError('purecloud.acdInteraction.calls.errors.pause');\n        } finally {\n            set(interaction, 'isSecurePauseLoading', false);\n        }\n    },\n\n    async _snippetRecord() {\n        const snippetRecordingFT = this.get('session')?.['features']?.['WEM-118_snippet-recording'];\n        const interaction = this.get('interaction');\n        if (!snippetRecordingFT || !interaction || get(interaction, 'isSnippetRecordLoading')) return;\n\n        set(interaction, 'isSnippetRecordLoading', true);\n        try {\n            await this.get('communication').snippetRecord(interaction, {\n                record: !this.get('isSnippetRecordingActive')\n            });\n        } catch (error) {\n            this.get('logger').error('ACD - There was an error with snippet recording', {\n                remoteData: {\n                    error,\n                    conversationId: interaction.id\n                }\n            });\n            this._displayError('purecloud.acdInteraction.calls.errors.snippetRecord');\n        } finally {\n            set(interaction, 'isSnippetRecordLoading', false);\n        }\n    },\n\n    /**\n     * Determines the options needed for a call based on the participants instance model\n     */\n    _getInteractionOptions(participant: any, forConference: boolean = false) {\n        const options: { userId?: string; queueId?: string; address?: string; contactId?: string; phoneType?: string } =\n            {};\n\n        if (participant instanceof PersonModel) {\n            options['userId'] = get(participant, 'id');\n        } else if (participant instanceof QueueModel) {\n            options['queueId'] = get(participant, 'id');\n        } else if (this.get('isCall')) {\n            if (participant instanceof GroupModel) {\n                options['address'] =\n                    (participant as any).get('number.value.number') ||\n                    (participant as any).get('number.value.extension');\n            } else if (\n                participant instanceof RelateExternalContactModel ||\n                participant instanceof ExternalContactModel\n            ) {\n                if (!forConference) {\n                    const rawPhoneType = get(participant as any, 'getRawPhoneType');\n                    if (typeof rawPhoneType === 'function') {\n                        const phoneType = rawPhoneType.call(participant);\n\n                        //function to format key: 'workPhone' => 'WorkPhone'\n                        const formatKey = function (key: string): string {\n                            if (!key) return '';\n                            return key.charAt(0).toUpperCase() + key.slice(1);\n                        };\n\n                        if (phoneType && get(participant, 'id')) {\n                            options['contactId'] = get(participant, 'id');\n                            options['phoneType'] = formatKey(phoneType);\n                        }\n                    } else {\n                        this.get('logger').error('ACD Transfer: getRawPhoneType not found');\n                        if (get(participant, 'id')) {\n                            options['contactId'] = get(participant, 'id');\n                            options['phoneType'] = 'CellPhone'; //Default fallback in error case\n                        }\n                    }\n                } else {\n                    options['address'] =\n                        (participant as any).get('phoneNumber') || (participant as any).get('bestPhoneNumber');\n                }\n            } else if (get(participant, 'phoneNumber')) {\n                options['address'] = get(participant, 'phoneNumber');\n            }\n        } else if (this.get('isEmail') && get(participant, 'email')) {\n            options['address'] = get(participant, 'email');\n        }\n\n        if (!Object.keys(options).length && get(participant, 'id')) {\n            options['userId'] = get(participant, 'id');\n        }\n\n        return options;\n    },\n\n    /**\n     * Determines what integration is currently being utilized and if any options need to be applied\n     */\n    async _getIntegrationOptions(participant: any, integrationKey: string) {\n        const transferType = get(participant, 'type');\n\n        let options: { transferType?: string; address?: string } = {};\n        let isIntegrationTransfer = false;\n\n        if (transferType === 'person') {\n            try {\n                const integrationTarget = await this.get('phoneIntegrations').getIntegrationTransferTarget(\n                    participant,\n                    integrationKey\n                );\n                if (integrationTarget) {\n                    options['address'] = integrationTarget;\n                    isIntegrationTransfer = true;\n                }\n            } catch (err) {\n                this.get('logger').error(\n                    'ACD PBX Transfer: attempted to fetch integration target, but failed. Falling back to entity guid.',\n                    { err }\n                );\n            }\n        }\n\n        return {\n            options,\n            isIntegrationTransfer,\n            transferType\n        };\n    },\n\n    /**\n     * Invoked when the user wants to return back to the conference roster from the invite or consult view\n     */\n    _navigateToConferenceRoster() {\n        this.set('inviteOrWarmInviteConferenceParticipant', null);\n\n        //  Set focus to the top-most element in popover (which is the header)\n        const timer = debounce(\n            this,\n            () => {\n                (document.querySelector('#interaction-conference-roster-dropdown-header') as HTMLElement)?.focus();\n            },\n            100\n        );\n        this.get('_timers').push(timer);\n    },\n\n    /**\n     * Invoked when the user opts to invite a participant to the conference\n     */\n    _inviteParticipantToConference() {\n        this.set('inviteOrWarmInviteConferenceParticipant', 'invite');\n    },\n\n    /**\n     * Invoked when the user opts to warm-invite a participant to the conference\n     */\n    _warmInviteParticipantToConference() {\n        this.set('inviteOrWarmInviteConferenceParticipant', 'warmInvite');\n    },\n\n    /**\n     * Invoked when a user selects a contact to start or update a conference with\n     *\n     * @param participant The data to start or update a conference with\n     */\n    _conferenceDataSelected(participant: any) {\n        const interaction = this.get('interaction');\n        if (interaction) {\n            const options = this._getInteractionOptions(participant, true);\n            const interactionId = get(interaction, 'id');\n            const url = this.get('communication').participantsUri(interactionId, 'calls');\n\n            this.get('ajax')\n                .post(url, {\n                    dataType: 'json',\n                    data: { participants: [options] }\n                })\n                .then(() => this._navigateToConferenceRoster())\n                .catch(error => {\n                    this.get('logger').error('There was an issue adding a participant to the call', error);\n                });\n        }\n    },\n\n    /**\n     * Invoked when a user selects a participant to warm-invite from a conference\n     *\n     * @param participant The data to start a warm-invite call with\n     */\n    _conferenceWarmInviteDataSelected(participant: any) {\n        const interaction = this.get('interaction');\n\n        if (interaction) {\n            const queueId = interaction.get('participantForCurrentUser.queueId');\n            const queue = queueId ? { id: queueId } : null;\n            const type = get(participant, 'type');\n            const options = this._getInteractionOptions(participant, true);\n            const conferenceId = get(interaction, 'id'); // aka associatedConversationId\n\n            const externalContactId = type === 'external' ? options['contactId'] : undefined;\n            const phoneNumber = options['address'];\n            const address = type === 'person' || type === 'queue' ? participant : phoneNumber;\n\n            this.get('phone')\n                .makeCall(address, null, queue, externalContactId, conferenceId)\n                .then(() => {\n                    this._navigateToConferenceRoster();\n                })\n                .catch(error => {\n                    this.get('logger').error('There was an issue warm-inviting a participant to the conference', error);\n                });\n        }\n    },\n\n    /**\n     * Transfers the interaction to the provided participant blindly\n     *\n     * @param participant the participant to transfer the interaction to\n     */\n    async _blindTransferDataSelected(participant: any, integrationKey: string) {\n        const chat = this.get('chat');\n        if (this.get('isChat') && !get(chat, 'connected')) {\n            return;\n        }\n\n        let { options, isIntegrationTransfer, transferType } = await this._getIntegrationOptions(\n            participant,\n            integrationKey\n        );\n\n        // Handle workitem transfer\n        const workitemInteraction = this.get('workitem');\n        if (workitemInteraction && workitemInteraction.workitem && participant) {\n            return this._handleWorkitemTransfer(workitemInteraction, participant);\n        }\n\n        // Regular conversation transfer\n        const interaction = this.get('interaction');\n        if (interaction) {\n            const transferToType = get(participant, 'type');\n\n            if (!Object.keys(options).length) {\n                options = this._getInteractionOptions(participant);\n            } else {\n                this.get('logger').error(`ACD: Unsupported transfer type:`, {\n                    options,\n                    isIntegrationTransfer,\n                    remoteData: {\n                        transferType: transferToType,\n                        conversationId: get(interaction, 'id')\n                    }\n                });\n                return;\n            }\n\n            // only agent-to-agent digital conversations should not be attended transferred\n            if (!this.get('isCall') && !this.get('isCallback') && transferToType === 'person') {\n                options['transferType'] = 'Attended';\n            }\n\n            let success = false;\n\n            try {\n                await this.get('communication').transfer(interaction, null, options, transferType);\n                run.next(this, () => {\n                    this._openPopover('showTransferDropdown', '#call-control-blind-transfer-popover');\n                });\n                success = true;\n            } catch (error) {\n                if (error && (error as any).jqXHR) {\n                    this._displayApiError((error as any).jqXHR, 'purecloud.acdInteraction.errors.transfer');\n                } else {\n                    this._displayApiError(null, 'purecloud.acdInteraction.errors.transfer');\n                    this.get('logger').error('Error transferring interaction', {\n                        options,\n                        isIntegrationTransfer,\n                        remoteData: {\n                            conversationId: get(interaction, 'id')\n                        }\n                    });\n                }\n            }\n\n            // Capture analytics & send to new relic for UC Integrations\n            if (isIntegrationTransfer) {\n                this.get('phoneIntegrations').sendNewRelicAction(\n                    'acd-blind-transfer',\n                    success ? 'success' : 'error',\n                    integrationKey\n                );\n            }\n        }\n    },\n\n    /**\n     * Adds a consulting participant to the current interaction\n     *\n     * @param target the participant to add\n     */\n    async _consultDataSelected(target: Participant, integrationKey: string) {\n        const interaction = this.get('interaction');\n        switch (get(interaction, 'type')) {\n            case 'message':\n                const participantForCurrentUser = get(interaction, 'participantForCurrentUser');\n                return this.get('internalMessaging')\n                    .setup({\n                        targetUserId: target.id,\n                        conversationId: interaction.id,\n                        participantId: participantForCurrentUser.id\n                    })\n                    .catch(error => {\n                        this._displayError('purecloud.acdInteraction.consultTargetNotFoundError');\n                        this.get('logger').error('Error setting up internal messaging', {\n                            remoteData: { conversationId: interaction.id },\n                            error\n                        });\n                    });\n            case 'call':\n                return this._consultCallDataSelected(target, integrationKey);\n            default:\n                throw Error('Interaction type not supported for consulting');\n        }\n    },\n\n    async _consultCallDataSelected(participant: any, integrationKey: string) {\n        if (!this.get('canConsultTransfer')) {\n            throw Error('The interaction cannot be consulted, user lacks permissions');\n        }\n\n        let { options, isIntegrationTransfer, transferType } = await this._getIntegrationOptions(\n            participant,\n            integrationKey\n        );\n\n        const interaction = this.get('interaction');\n        if (!Object.keys(options).length && this.get('isCall')) {\n            options = this._getInteractionOptions(participant);\n        } else {\n            this.get('logger').error(`ACD: Unsupported transfer type:`, {\n                destination: options,\n                isIntegrationTransfer,\n                remoteData: {\n                    transferType: get(participant, 'type'),\n                    conversationId: interaction.id\n                }\n            });\n            return;\n        }\n\n        let success = false;\n        try {\n            await this.get('communication').initiateConsult(interaction, options, transferType);\n            success = true;\n        } catch (error) {\n            if (error) {\n                if ((error as any).message === 'customer not present') {\n                    this.get('logger').error('ACD: Unsupported consult, customer must be present to consult');\n                    this._displayError('purecloud.acdInteraction.consultError');\n                } else if ((error as any).jqXHR) {\n                    this._displayApiError((error as any).jqXHR, 'purecloud.acdInteraction.errors.transfer');\n                }\n            }\n        }\n\n        // Capture analytics & send to new relic for UC Integrations\n        if (isIntegrationTransfer) {\n            this.get('phoneIntegrations').sendNewRelicAction(\n                'acd-consult-transfer',\n                success ? 'success' : 'error',\n                integrationKey\n            );\n        }\n    },\n\n    _mergeWarmInviteToConference() {\n        if (!this.get('acdWarmConferencePhase1FT')) return;\n        const interaction = this.get('interaction');\n        if (interaction) {\n            set(interaction, 'isMergeLoading', true);\n            set(interaction, 'isMergeComplete', false);\n            this.get('communication')\n                .mergeToConference(interaction)\n                .then(() => {\n                    set(interaction, 'isMergeComplete', true);\n                    this._displayNotification(null, 'purecloud.acdInteraction.mergeSuccess');\n                })\n                .catch((error: any) => {\n                    set(interaction, 'isMergeComplete', false);\n                    this.get('logger').error('There was an issue adding a participant to the conference', error);\n                    this._displayError('purecloud.acdInteraction.errors.mergeToConference');\n                })\n                .finally(() => {\n                    set(interaction, 'isMergeLoading', false);\n                });\n        }\n    },\n\n    _dismissParticipant(participant: any) {\n        const interaction = this.get('interaction');\n        if (interaction) {\n            const interactionId = get(interaction, 'id');\n            const participantId = get(participant, 'id');\n            const url = this.get('application').pcV2Uri(\n                `api/v2/conversations/calls/${interactionId}/participants/${participantId}`\n            );\n            this.get('ajax')\n                .patch(url, {\n                    dataType: 'json',\n                    data: { state: 'disconnected' }\n                })\n                .catch(error => {\n                    this.get('logger').error('There was an issue adding a participant to the call', error);\n                });\n        }\n    },\n\n    /**\n     * Cancels the blind transfer that the agent initiated to bring the conversation back to them.\n     */\n    _cancelBlindTransfer() {\n        const interaction = this.get('interaction');\n        if (interaction) {\n            this.get('communication')\n                .cancelTransfer(interaction, get(interaction, 'transferringToParticipant'))\n                .catch((error: any) => {\n                    this.get('logger').error('There was an issue cancelling the blind transfer', error);\n                });\n        }\n    },\n\n    /**\n     * Transfer workitem interaction to an agent or a queue.\n     *\n     * @param workitemInteraction\n     * @param participant\n     */\n    async _handleWorkitemTransfer(workitemInteraction: any, participant: any) {\n        const { id, type } = getProperties(participant, 'id', 'type');\n        let transferOptions: { userId?: string; queueId?: string } = {};\n        if (type === 'person') {\n            transferOptions = { userId: id };\n        } else if (type === 'queue') {\n            transferOptions = { queueId: id };\n        } else {\n            throw new Error('Unrecognized workitem transfer type.');\n        }\n        try {\n            await this.get('acdworkitem').transfer(workitemInteraction, type, transferOptions);\n            this._displayNotification(\n                'purecloud.acdInteraction.transfer',\n                'purecloud.acdInteraction.workitem.transferSuccess'\n            );\n            this.set('workitem', null);\n        } catch (error) {\n            const errorMessage =\n                error && (error as any).jqXHR && (error as any).jqXHR.status === 403\n                    ? 'purecloud.acdInteraction.workitem.errors.transfer'\n                    : 'purecloud.acdInteraction.errors.transfer';\n\n            this._displayError(errorMessage);\n        }\n    },\n\n    _disconnectWorkitem() {\n        this.get('acdworkitem')\n            .disconnect(this.get('workitem'))\n            .then(() => this.set('workitem', null))\n            .catch((error: any) => {\n                if (error.payload?.code === 'too.many.requests.retry.after') {\n                    this._displayError('purecloud.acdInteraction.workitem.errors.rateLimit');\n                } else {\n                    this._displayError('purecloud.acdInteraction.workitem.errors.disconnect');\n                }\n            });\n    },\n\n    _parkWorkitem() {\n        this.get('acdworkitem')\n            .park(this.get('workitem'))\n            .then(() => {\n                if (!this.get('session').get('useModes')) {\n                    this.set('workitem', null);\n                }\n            })\n            .catch((error: any) => {\n                if (error.payload?.code === 'too.many.requests.retry.after') {\n                    this._displayError('purecloud.acdInteraction.workitem.errors.rateLimit');\n                } else {\n                    this._displayError('purecloud.acdInteraction.workitem.errors.park');\n                }\n            });\n    },\n\n    _updateAcwRequest() {\n        this.set('isLoadingAcwRequest', true);\n        const interaction = this.get('interaction');\n        if (interaction) {\n            const agentCommunicationId = get(interaction, 'agentCommunicationId');\n            const interactionId = get(interaction, 'id');\n            const participantId = get(interaction, 'participantForCurrentUser.id');\n            if (get(interaction, 'isCommunicationAfterCallWorkRequested')) {\n                this.get('communication')\n                    .skipAcw(interactionId, participantId, agentCommunicationId)\n                    .catch(() => {\n                        this._displayError('purecloud.acdInteraction.requestACWError');\n                    })\n                    .finally(() => {\n                        this.set('isLoadingAcwRequest', false);\n                    });\n            } else {\n                this.get('communication')\n                    .requestAcw(interactionId, participantId, agentCommunicationId)\n                    .catch(() => {\n                        this._displayError('purecloud.acdInteraction.requestACWError');\n                    })\n                    .finally(() => {\n                        this.set('isLoadingAcwRequest', false);\n                    });\n            }\n        }\n    },\n\n    _holdAllOtherCalls() {\n        if (this.get('session').get('useModes')) {\n            const interaction = this.get('interaction');\n            const interactionId = interaction ? interaction.get('id') : '';\n            return this.get('conversationModeService').holdOtherConnectedCalls(interactionId);\n        }\n\n        const promises: Promise<any>[] = [];\n        const interactionService = this.get('interactionService');\n        const allInteractions = interactionService.get('activeInteractions');\n        allInteractions.forEach((currentInteraction: any) => {\n            const { type, isConnected, isHeld } = currentInteraction.getProperties('type', 'isConnected', 'isHeld');\n            if (type === 'call' && isConnected && !isHeld) {\n                promises.push(\n                    this.get('communication')\n                        .hold(currentInteraction)\n                        .catch(() => {})\n                );\n            }\n        });\n        return promises;\n    },\n\n    /**\n     * Answers a callback using the given phone number.\n     * @param phoneNumber - the number to dial, from the callbackNumbers array\n     */\n    _beginCallback(phoneNumber: any) {\n        if (this.get('isCallbackDialing')) return Promise.resolve(null);\n        const interaction = this.get('interaction');\n        const interactionId = interaction ? interaction.get('id') : null;\n\n        this.set('isCallbackDialing', true);\n\n        // We are no longer auto holding existing calls when a new call is being\n        // placed from a callback. This update ensures that other connected calls (if any)\n        // are being placed on hold when a callback call is being initiated.\n        return all(this._holdAllOtherCalls())\n            .then(() => {\n                // Bail if the interaction changed while holds were in-flight\n                const currentInteractionId = this.get('interaction') ? this.get('interaction').get('id') : null;\n                if (currentInteractionId !== interactionId) {\n                    return Promise.resolve(null);\n                }\n\n                const callbackService = this.get('session').get('useModes')\n                    ? this.get('conversationModeService')\n                    : this.get('acdcallback');\n\n                return callbackService.beginCallback(interaction, phoneNumber.number, phoneNumber.phoneColumn);\n            })\n            .catch(error => {\n                let errorCode = get(error, 'jqXHR.responseJSON.code');\n                let reason;\n\n                if (!errorCode || errorCode === 'conversation.error') {\n                    errorCode = 'begin';\n                } else if (errorCode === 'conversation.error.callback.call.cannot.be.placed') {\n                    reason = get(error, 'jqXHR.responseJSON.messageParams.reason');\n                    errorCode = 'blocked.' + (reason || 'unknown');\n                    if (reason !== 'CALL_ALREADY_PLACED') {\n                        const currentInteraction = this.get('interaction');\n                        if (currentInteraction) {\n                            get(currentInteraction, 'placedBlockedCalls').addObject(phoneNumber.number);\n                        }\n                    }\n                }\n\n                const messageKey = 'purecloud.acdInteraction.callbacks.errors.' + errorCode;\n                if (!NOTIFICATION_HANDLED_REJECTIONS.includes(reason)) {\n                    this._displayError(messageKey);\n                }\n            })\n            .finally(() => {\n                this.set('isCallbackDialing', false);\n            });\n    },\n\n    /**\n     * Skip the current callback; the callback will NOT be routed to another agent.\n     */\n    _skipCallback() {\n        return this.get('acdcallback')\n            .skipCallback(this.get('interaction'))\n            .catch(() => this._displayError('purecloud.acdInteraction.callbacks.errors.skip'));\n    },\n\n    _muteParticipant(participant: any, muted: boolean) {\n        const interaction = this.get('interaction');\n        if (interaction) {\n            const interactionId = get(interaction, 'id');\n            const participantId = get(participant, 'id');\n            const url = this.get('application').pcV2Uri(\n                `api/v2/conversations/calls/${interactionId}/participants/${participantId}`\n            );\n            this.get('ajax')\n                .patch(url, {\n                    dataType: 'json',\n                    data: { muted }\n                })\n                .catch(error => {\n                    this.get('logger').error('There was an issue adding a participant to the call', error as any);\n                });\n        }\n    },\n\n    _muteAllParticipants() {\n        const interaction = this.get('interaction');\n        if (interaction) {\n            const participants = (this.get('participants') || []).map((p: { id: string }) => ({\n                id: p.id,\n                muted: true\n            }));\n            const interactionId = get(interaction, 'id');\n            const url = this.get('application').pcV2Uri(`api/v2/conversations/calls/${interactionId}/participants`);\n            this.get('ajax')\n                .patch(url, {\n                    dataType: 'json',\n                    data: { participants }\n                })\n                .catch(error => {\n                    this.get('logger').error('There was an issue adding a participant to the call', error as any);\n                });\n        }\n    },\n\n    _displayApiError(error: any, fallbackMessageKey: string) {\n        const response = error ? error.responseJSON : null;\n        const code = response ? response.code : null;\n        const key = code && `error.${code}`;\n        this._displayError(key && this.get('intl').exists(key) ? key : fallbackMessageKey);\n    },\n\n    _displayError(messageKey: string, messageKeyOption?: { [key: string]: string }) {\n        const message = this.get('intl').t(messageKey, messageKeyOption).toString();\n        this.get('notification').error(null, message, {});\n    },\n\n    _displayNotification(\n        titleKey: string | null,\n        messageKey?: string,\n        options?: { messageParams?: { [key: string]: string }; titleParams?: { [key: string]: string } }\n    ) {\n        const { messageParams, titleParams } = options ?? {};\n        const title = titleKey ? this.get('intl').t(titleKey, titleParams).toString() : null;\n        const message = messageKey ? this.get('intl').t(messageKey, messageParams).toString() : null;\n        this.get('notification').info(title, message);\n    },\n\n    _beginCobrowseV2() {\n        const interaction = this.get('interaction');\n        this.get('interactionService').trigger('beginCobrowseV2', interaction, {});\n    },\n\n    _beginVideo() {\n        const interaction = this.get('interaction');\n        this.get('interactionService').trigger('beginVideo', interaction, {});\n    },\n\n    _beginScreenShareOrCoBrowse() {\n        const interaction = this.get('interaction');\n        if (interaction) {\n            this.onClosePopover();\n\n            set(interaction, 'isRequestingScreenShareOrCoBrowse', true);\n            set(interaction, 'isSessionCodeRequired', true);\n            set(interaction, 'isSessionShareDisconnected', false);\n            set(interaction, 'isCobrowseV2Disconnected', false);\n            set(interaction, 'isCobrowseV2', false);\n            this._beginSessionShare();\n        }\n    },\n\n    /**\n     * closes the panel from the sidebar service\n     */\n    _closeSidebar() {\n        if (this.get('session').get('useNewNav')) {\n            this.get('commandNav').selectPanel('panel-not-active');\n        } else {\n            this.get('sidebar').closePanel();\n        }\n    },\n\n    /**\n     * toggle the panel from the sidebar service\n     */\n    _toggleSidebar() {\n        if (this.get('session').get('useNewNav')) {\n            this.get('commandNav').togglePanel();\n        } else {\n            this.get('sidebar').toggleCommunicationSidebarExpanded();\n        }\n    },\n\n    /**\n     * Updates the callback number property based on the value provided.\n     * Invoked when the user makes changes to the value from the dialpad\n     * instance responsible for adding callback numbers.\n     *\n     * @param value the value to update the callback number property to\n     */\n    _addCallbackNumberValueChange(value: any[]) {\n        this.set('addingCallbackNumbers', [...value]);\n    },\n\n    /**\n     * Invoked when the user as submitted the addition of the previously added callback\n     * numbers. The temporary numbers are added to the interaction through a property alias.\n     */\n    _addCallbackNumbers() {\n        const interaction = this.get('interaction');\n        const numbersToAdd = [...this.get('addingCallbackNumbers')];\n\n        set(interaction, 'agentAddedCallbackNumbers', numbersToAdd);\n        this.set('addingCallbackNumbers', []);\n        this.onClosePopover();\n\n        const storage = this.get('storage');\n        updateScheduleCallbackGadgetSessionStorage(interaction.id, numbersToAdd, storage);\n    },\n\n    _consultConfine() {\n        const interaction = this.get('interaction');\n        if (!interaction || get(interaction, 'isConsultConfineLoading')) {\n            return Promise.resolve(null);\n        }\n\n        set(interaction, 'isConsultConfineLoading', true);\n        return this.get('communication')\n            .consultObject(interaction)\n            .catch(() => {\n                this._displayError('purecloud.acdInteraction.calls.errors.hold');\n            })\n            .finally(() => {\n                set(interaction, 'isConsultConfineLoading', false);\n            });\n    },\n\n    _consultUnconfine() {\n        const interaction = this.get('interaction');\n        if (!interaction || get(interaction, 'isConsultConfineLoading')) {\n            return Promise.resolve(null);\n        }\n\n        set(interaction, 'isConsultConfineLoading', true);\n        return this.get('communication')\n            .consultBoth(interaction)\n            .catch(() => {\n                this._displayError('purecloud.acdInteraction.calls.errors.hold');\n            })\n            .finally(() => {\n                set(interaction, 'isConsultConfineLoading', false);\n            });\n    },\n\n    _consultDisconnect() {\n        const interaction = this.get('interaction');\n        if (!interaction || get(interaction, 'isConsultDisconnectLoading')) {\n            return Promise.resolve(null);\n        }\n\n        set(interaction, 'isConsultDisconnectLoading', true);\n        switch (get(interaction, 'type')) {\n            case 'message':\n                const activeConsults = this.get('currentActiveConsults');\n                const current = activeConsults.get(interaction.id);\n                if (current) {\n                    current.selfDisconnected = true;\n                    activeConsults.set(interaction.id, current);\n                }\n\n                const participant = get(interaction, 'participantForCurrentUser');\n                const [latestMessage] = get(participant, 'internalMessages');\n\n                return this.get('internalMessaging')\n                    .disconnect({\n                        conversationId: interaction.id,\n                        participantId: participant.id,\n                        communicationId: latestMessage.id\n                    })\n                    .catch(() => {})\n                    .finally(() => {\n                        set(interaction, 'isConsultDisconnectLoading', false);\n                    });\n            case 'call':\n                return this.get('communication')\n                    .cancelConsult(interaction)\n                    .catch(() => {})\n                    .finally(() => {\n                        set(interaction, 'isConsultDisconnectLoading', false);\n                    });\n            default:\n                set(interaction, 'isConsultDisconnectLoading', false);\n                this.get('logger').warn(\n                    'ACD: Media type not supported for disconnecting consult',\n                    get(interaction, 'type')\n                );\n        }\n    },\n\n    _consultTransfer() {\n        const interaction = this.get('interaction');\n        if (!interaction || get(interaction, 'isConsultTransferLoading')) {\n            return Promise.resolve(null);\n        }\n\n        set(interaction, 'isConsultTransferLoading', true);\n        switch (get(interaction, 'type')) {\n            case 'message':\n                const consultingAgent = get(interaction, 'consultAgentParticipant');\n                const initiatingAgent = get(interaction, 'participantForCurrentUser');\n                return this.get('internalMessaging')\n                    .transfer({\n                        transferFromParticipantId: initiatingAgent.id,\n                        transferToUserId: consultingAgent.userId,\n                        conversationId: interaction.id\n                    })\n                    .catch(() => {\n                        this._displayError('purecloud.acdInteraction.errors.completeTransfer');\n                    })\n                    .finally(() => {\n                        set(interaction, 'isConsultTransferLoading', false);\n                    });\n            case 'call':\n                const consultInitiator = get(interaction, 'participantForCurrentUser');\n\n                return this.get('communication')\n                    .disconnectParticipant(interaction.id, consultInitiator.id, interaction.type)\n                    .catch(() => {\n                        this._displayError('purecloud.acdInteraction.errors.completeTransfer');\n                    })\n                    .finally(() => {\n                        set(interaction, 'isConsultTransferLoading', false);\n                    });\n            default:\n                set(interaction, 'isConsultTransferLoading', false);\n                this.get('logger').warn(\n                    'ACD: Media type not supported for transferring consult',\n                    get(interaction, 'type')\n                );\n        }\n    },\n\n    _consultConference() {\n        const interaction = this.get('interaction');\n        if (!interaction || get(interaction, 'isConsultConferenceLoading')) {\n            return Promise.resolve(null);\n        }\n\n        set(interaction, 'isConsultConferenceLoading', true);\n        return this.get('communication')\n            .consultConference(interaction)\n            .catch(() => {\n                this._displayError('purecloud.error.dialpad.participants');\n            })\n            .finally(() => {\n                set(interaction, 'isConsultConferenceLoading', false);\n            });\n    },\n\n    _callbackDefaultNumber() {\n        const defaultOption = this.get('defaultCallbackNumberOption');\n        if (defaultOption) {\n            const { value, text, phoneColumn } = defaultOption;\n            this._beginCallback({ number: value, name: text, phoneColumn });\n        } else {\n            this.get('logger').log('AgentUI - Callbacks - Default option could not be determined');\n        }\n    },\n\n    /**\n     * Determines what the callback time is based on the type being provided.\n     *\n     * @todo replace Moment\n     *\n     * @param type the type of callback time to determine\n     * @returns a `Moment` object if the value was determined, `null` if it wasn't\n     */\n    _determineCallbackTime(type: TimerType): moment.Moment | null {\n        const callbackSettings = this.get('callbackMediaSettings');\n        const interaction = this.get('interaction');\n\n        if (callbackSettings && interaction) {\n            const currentUser = get(interaction, 'participantForCurrentUser');\n            let startTime = null;\n            let gracePeriod = null;\n\n            switch (type) {\n                case 'callback-auto-end':\n                    startTime = get(currentUser, 'wrapup.endTime') || get(currentUser, 'endAcwTime');\n                    gracePeriod = normalizeTimerSeconds(get(callbackSettings, 'autoEndDelaySeconds'));\n                    break;\n                case 'callback-auto-start':\n                    startTime = get(currentUser, 'connectedTime');\n                    gracePeriod = normalizeTimerSeconds(get(callbackSettings, 'autoDialDelaySeconds'));\n                    break;\n            }\n\n            if (this.get('hasCallbackNumbers') && startTime && gracePeriod) {\n                return moment(startTime).add(gracePeriod, 'seconds');\n            }\n        }\n\n        return null;\n    },\n\n    _offerMessage(message: ProposedMessage, mode: InjectionMode, conversationId: string) {\n        const appPoolV2: any = this.get('appPoolV2');\n        if (!appPoolV2 || !this.get('hasConversationAppForCurrInteraction')) {\n            return;\n        }\n        if (!message) {\n            this.get('logger').error('Failed to build propose message offer');\n            return;\n        }\n\n        appPoolV2.sendMessageToHost(\n            AppsV2.buildOfferMessageMessage(\n                ['replaceAll', 'insert'].includes(mode) ? mode : 'insert',\n                message,\n                conversationId\n            )\n        );\n    },\n\n    /**\n     *\n     * Update the JS memory/preferences for the interaction when its values have changed. This is also where telemetry updates are made.\n     *\n     * For PREFERENCES, the key is of the format: `agentUiMainstage.mediaType`.\n     * For MEMORY STORAGE, the key of the format: `agentUiMainstage.interactionId.interactionType`.\n     * For both, the object stored is of the format:\n     * {\n     *       mainstageSize: 'small' | 'medium' | 'large' | 'xlarge',\n     *       mainstageCollapsed: boolean\n     * }\n     *\n     * @note The `savePreference` option is used to control whether the preference should be saved to the preferences service.\n     *       This is useful when the preference is being updated as a result of a user action, such as a resize or focus change.\n     *       When the preference is being updated as a result of a user action, the preference should be saved to the preferences service.\n     *       When the preference is being updated as a result of a system action, the preference should not be saved to the preferences service.\n     *\n     * @param selectedAppContext Maybe<AppContext> The interaction for which the mainstage preferences changes.\n     * @param size MainstageSize The updated size of the mainstage.\n     * @param isCollapsed boolean The updated collapsed state of the mainstage.\n     */\n    _mainstagePreferenceChanged(\n        selectedAppContext: Maybe<AppContext>,\n        options: {\n            size: MainstageSize;\n            isCollapsed: boolean;\n            isFocused: boolean;\n            savePreference?: boolean;\n        }\n    ) {\n        const { savePreference = true } = options;\n\n        if (selectedAppContext) {\n            const userId = get(this.get('authUser'), 'id');\n            const interactionType = getInteractionType(selectedAppContext);\n            const memoryMainstageMapKey = `${selectedAppContext.id}.${interactionType}`;\n\n            // JS Memory Map (For Ephemeral changes)\n            const prevMemoryMainstageMapValue = this.get('storage').getMemoryStorageItem(\n                `agentUiMainstage.${memoryMainstageMapKey}`\n            );\n\n            const { size, isCollapsed, isFocused } = options;\n            const mainstageLayout: MainstageLayout = this.buildValidMainstageLayout({\n                mainstageSize: size,\n                mainstageCollapsed: isCollapsed,\n                mainstageFocused: isFocused\n            });\n\n            this.get('storage').setMemoryStorageItem(`agentUiMainstage.${memoryMainstageMapKey}`, mainstageLayout);\n\n            if (savePreference) {\n                // Storing new state to component Persistent Map and Preferences\n                const persistentMainstageMap = this.get('persistentMainstageMap');\n                const persistentMainstageMapKey = `${interactionType}`;\n                const newPersistentMainstageMap = {\n                    ...persistentMainstageMap,\n                    [persistentMainstageMapKey]: mainstageLayout\n                };\n\n                this.set('persistentMainstageMap', newPersistentMainstageMap);\n                this.get('preferences')\n                    .setPreference(`agentUiMainstage.${interactionType}`, mainstageLayout)\n                    .catch(e => {\n                        this.get('logger').error('Error saving Mainstage preferences:', { error: e });\n                        return {};\n                    });\n            }\n\n            // Add Telemetry\n            const prevSize = prevMemoryMainstageMapValue\n                ? get(prevMemoryMainstageMapValue, 'mainstageSize')\n                : undefined;\n            const prevCollapsedState = prevMemoryMainstageMapValue\n                ? get(prevMemoryMainstageMapValue, 'mainstageCollapsed')\n                : undefined;\n            const prevFocusedState = prevMemoryMainstageMapValue\n                ? get(prevMemoryMainstageMapValue, 'mainstageFocused')\n                : undefined;\n            addPageAction('acdAgentUiMultipanelMainstageUserResize', {\n                userId,\n                interactionId: selectedAppContext.id,\n                interactionType,\n                prevSize,\n                prevCollapsedState,\n                prevFocusedState,\n                newSize: size,\n                newCollapsedState: isCollapsed,\n                newFocusedState: isFocused\n            });\n        }\n    },\n\n    _panelSizeChanged(size: number) {\n        const selectedAppContext = this.get('selectedAppContext');\n        if (selectedAppContext) {\n            const userId = this.get('authUser').id;\n            const interactionType = getInteractionType(selectedAppContext);\n\n            // Local Map\n            const localPanelSizeMap = this.get('localPanelSizeMap');\n            const localPanelSizeAppContextKey = `${selectedAppContext.id}.${interactionType}`;\n            const newLocalPanelSizeMap = {\n                ...localPanelSizeMap,\n                [localPanelSizeAppContextKey]: size\n            };\n            this.set('localPanelSizeMap', newLocalPanelSizeMap);\n            this.get('storage').setLocalStorageItem(\n                `panelManagerV2PanelSize.${userId}`,\n                JSON.stringify(newLocalPanelSizeMap)\n            );\n            // Persistent Map\n            const persistentPanelSizeMap = this.get('persistentPanelSizeMap');\n            const newPersistentPanelSizeMap = {\n                ...persistentPanelSizeMap,\n                [interactionType]: size\n            };\n            this.set('persistentPanelSizeMap', newPersistentPanelSizeMap);\n            this.get('storage')\n                .setPreferenceStorageItem(`panelManagerV2PanelSize.${userId}`, newPersistentPanelSizeMap)\n                .catch(e => {\n                    this.get('logger').error('Error saving panelManager preferences:', { error: e });\n                    return {};\n                });\n\n            const prevSize = localPanelSizeMap[localPanelSizeAppContextKey];\n            addPageAction('acdPanelManagerUserResizeV2', {\n                userId,\n                interactionId: selectedAppContext.id,\n                interactionType,\n                queueId: getQueueIdFromAppContext(selectedAppContext),\n                isPef: this.get('isPopout'),\n                prevSize,\n                newSize: size\n            });\n        }\n    },\n\n    _mainstageFocusedChanged(value: boolean) {\n        this.set('_isMainstageFocused', value);\n        this.onMainstageFocusedChanged(value);\n    },\n\n    _toggleMainstageCollapse() {\n        this.toggleProperty('isMainstageCollapsed');\n        this._mainstageFocusedChanged(false);\n\n        if (this.get('session').get('useModes')) {\n            this.onMainstageCollapsedChanged?.(this.get('isMainstageCollapsed'));\n        }\n\n        this._mainstagePreferenceChanged(this.get('selectedAppContext'), {\n            size: this.get('mainstageSize'),\n            isCollapsed: this.get('isMainstageCollapsed'),\n            isFocused: false\n        });\n    },\n\n    _setMainstageFocus(value: boolean) {\n        this._mainstageFocusedChanged(value);\n        this._mainstagePreferenceChanged(this.get('selectedAppContext'), {\n            size: this.get('mainstageSize'),\n            isFocused: value,\n            isCollapsed: false\n        });\n    },\n\n    _openPopover(prop: InteractionDropdownProp, popoverId: string) {\n        const popover: any = document.querySelector(popoverId);\n        if (!popover) return;\n        popover.isOpen = true;\n        this.set(prop, true); // For inserting from the DOM and aria-labels to show expanded\n    },\n\n    _sizeMainstage(size: MainstageSize) {\n        this.set('mainstageSize', size);\n\n        if (this.get('session').get('useModes')) {\n            this.onMainstageSizeChanged?.(size);\n        }\n\n        this._mainstagePreferenceChanged(this.get('selectedAppContext'), {\n            size: this.get('mainstageSize'),\n            isCollapsed: false,\n            isFocused: false\n        });\n    },\n\n    /**\n     * Determines the participant that should be used for the consult controls.\n     *\n     * @note we want to pass the values as options to prevent to ensure that we are setting the correct dependencies\n     * when using the method in a computed property. Otherwise, we may not realize all of the properties that are subject\n     * to change.\n     *\n     * @param options The options for determining the participant.\n     * @returns The participant that should be used for the consult controls.\n     */\n    _determineConsultControlsParticipant(options: {\n        onConsult: boolean;\n        iAmConsultInitiator: boolean;\n        iAmConsulted: boolean;\n        consultAgentParticipant: any;\n        consultInitiator: any;\n    }) {\n        const { onConsult, iAmConsultInitiator, iAmConsulted, consultAgentParticipant, consultInitiator } = options;\n\n        // previous logic always uses the consulting agent participant\n        if (!this.get('digitalConsultEnabled')) return consultAgentParticipant;\n\n        if (!onConsult) return null;\n        if (iAmConsultInitiator) return consultAgentParticipant;\n        if (iAmConsulted) return consultInitiator;\n\n        // if a user is on a call and is neither the consulted or the initiator they should not see the consulted bar\n        return null;\n    },\n\n    _messageTakeover() {\n        const interaction = this.get('interaction');\n        if (!interaction || !this.get('canMessageTakeover')) return;\n\n        this.set('isTakingOver', true);\n        this.get('acdsms')\n            .takeover(interaction)\n            .catch((error: any) => {\n                this.get('logger').error('Error taking over message:', { error });\n                this._displayError('purecloud.acdInteraction.sms.errors.takeover');\n            })\n            .finally(() => {\n                this.set('isTakingOver', false);\n            });\n    },\n\n    /**\n     * Custom autofocus due to how gux components are mounted.\n     * @param popoverId The id of the popover to autofocus.\n     */\n    _autofocusPopover(popoverId: string) {\n        run.next(this, () => {\n            const popoverEl = document.querySelector(popoverId) as HTMLElement | undefined;\n            if (!popoverEl) return;\n\n            // `gux-popover` may wrap projected content in a `.gux-popover-wrapper`.\n            // Prefer searching inside the wrapper when present.\n            const searchRoot =\n                (popoverEl.querySelector<HTMLElement>('.gux-popover-wrapper') as HTMLElement | null) ?? popoverEl;\n\n            const options = Array.from(searchRoot.querySelectorAll<HTMLElement>('[role=\"option\"][tabindex]')).filter(\n                el => el.getAttribute('aria-disabled') !== 'true'\n            );\n\n            const firstOption = options.find(el => el.tabIndex === 0) ?? options[0];\n            if (firstOption) {\n                firstOption.focus();\n            }\n        });\n    },\n\n    // ==================================================================\n    // Actions\n    // ==================================================================\n\n    actions: {\n        onToggleMainstageCollapse() {\n            this._toggleMainstageCollapse();\n        },\n\n        onToggleMainstageFocus() {\n            this._setMainstageFocus(!this.get('isMainstageFocused'));\n        },\n\n        onTogglePopover(prop: InteractionDropdownProp, popoverId: string, autofocus: boolean = false) {\n            const popover: any = document.querySelector(popoverId);\n            if (!popover) return;\n            const nextIsOpen = !popover.isOpen;\n            popover.isOpen = nextIsOpen;\n\n            const nextPropValue = !this.get(prop);\n            this.set(prop, nextPropValue);\n\n            if (autofocus) {\n                this._autofocusPopover(popoverId);\n            }\n        },\n\n        onClosePopover(prop: InteractionDropdownProp, popoverId: string) {\n            const popover: any = document.querySelector(popoverId);\n            if (!popover) return;\n            popover.isOpen = false;\n            this.set(prop, false); // For removing from the DOM and aria-labels to show collapsed\n        },\n\n        onConsultConfine() {\n            this._consultConfine();\n        },\n\n        onConsultUnconfine() {\n            this._consultUnconfine();\n        },\n\n        onConsultDisconnect() {\n            this._consultDisconnect();\n        },\n\n        onConsultTransfer() {\n            this._consultTransfer();\n        },\n\n        onConsultConference() {\n            this._consultConference();\n        },\n\n        onCopyExternalCustomerPhoneNumber() {\n            this._copyExternalCustomerPhoneNumber();\n        },\n\n        onCopyInteractionUrl() {\n            this._copyInteractionUrl();\n        },\n\n        onAddCallbackNumbers() {\n            this._addCallbackNumbers();\n        },\n\n        onAddCallbackNumberValueChange(value: any[]) {\n            this._addCallbackNumberValueChange(value);\n        },\n\n        onCancelCallbackNumbers() {\n            this._addCallbackNumberValueChange([]);\n            this.onClosePopover();\n        },\n\n        /**\n         * Adds the corresponding participant to the active conversation to either make it a conference\n         * or add to the currently active conference\n         *\n         * @param participant the participant to add to the conference\n         */\n        onConferenceDataSelected(participant: any) {\n            this._conferenceDataSelected(participant);\n        },\n\n        /**\n         * Starts a new conference warm-invite call from the conference that is currently active.\n         *\n         * @param participant the participant to warm-invite from within a conference.\n         */\n        onConferenceWarmInviteDataSelected(participant: any) {\n            this._conferenceWarmInviteDataSelected(participant);\n        },\n\n        /**\n         * Invoked when a user tries to merge a non-group ring, warm-invite  conversation (that is not monitored, barged, or coached) to a conference\n         */\n        onMergeToConference() {\n            if (this.get('acdWarmConferencePhase1FT') && !this.get('isMCB') && !this.get('isGroupRing')) {\n                this._mergeWarmInviteToConference();\n            }\n        },\n\n        /**\n         * Initiates a blind transfer to the corresponding participant\n         *\n         * @param participant the participant to initiate a blind transfer with\n         * @param integrationKey key corresponding to the corresponding integration desired\n         */\n        onBlindTransferDataSelected(participant: any, integrationKey: string) {\n            this._blindTransferDataSelected(participant, integrationKey);\n            this.onClosePopover();\n        },\n\n        /**\n         * Invoked when the user opts to cancel the blind transfer that they originally initiated\n         */\n        onCancelBlindTransfer() {\n            this._cancelBlindTransfer();\n            this.onClosePopover();\n        },\n\n        /**\n         * Initiates a consult to the corresponding participant\n         *\n         * @param participant the participant to consult with\n         * @param integrationKey key corresponding to the corresponding integration desired\n         */\n        onConsultDataSelected(participant: any, integrationKey: string) {\n            this._consultDataSelected(participant, integrationKey);\n            this.onClosePopover();\n        },\n\n        /**\n         * Returns the user back to the conference roster, typically from the conversation participant dropdown\n         */\n        onNavigateToConferenceRoster() {\n            this._navigateToConferenceRoster();\n        },\n\n        /**\n         * Invoked when a participant has been connected within a conference\n         */\n        onConferenceParticipantConnected() {\n            this.set('inviteOrWarmInviteConferenceParticipant', null);\n        },\n\n        onPanelSizeChanged(size: number) {\n            this._panelSizeChanged(size);\n        },\n\n        onOfferMessage({ injectionMode, proposedMessage, conversationId }: OfferMessagePayload) {\n            this._offerMessage(proposedMessage, injectionMode, conversationId);\n        },\n\n        onInsertChatText(text: string) {\n            this.insertChatText(text);\n        },\n\n        onInsertSmsText(response: { strippedText: string; structuredMessage: string }) {\n            this.insertSmsText(response);\n        },\n\n        onInsertEmailText(text: string) {\n            this.insertEmailText(text);\n        },\n\n        onMute() {\n            this._mute();\n        },\n\n        onHold() {\n            this._hold();\n        },\n\n        onHangup() {\n            this._hangup();\n        },\n\n        /**\n         * Sets the mute state of the corresponding participant based on the provided muted value\n         * @param participant the participant to affect the muted state of\n         * @param muted boolean value depicting the what the muted value of the participant should become\n         */\n        onMuteParticipant(participant: any, muted: boolean) {\n            this._muteParticipant(participant, muted);\n        },\n\n        onMuteAllParticipants() {\n            this._muteAllParticipants();\n        },\n\n        onDismissParticipant(participant: any) {\n            this._dismissParticipant(participant);\n        },\n\n        onInviteParticipantToConference() {\n            this._inviteParticipantToConference();\n        },\n\n        onWarmInviteParticipantToConference() {\n            this._warmInviteParticipantToConference();\n        },\n\n        onToggleSecurePause() {\n            this._toggleSecurePause();\n        },\n\n        onToggleSnippetRecord() {\n            this._toggleSnippetRecord();\n        },\n\n        onEndChat() {\n            this._endChat();\n        },\n\n        onDisconnect() {\n            this._disconnect();\n        },\n\n        onPark(resumeTime?: Maybe<string>) {\n            if (resumeTime && typeof resumeTime === 'string') {\n                this._park(resumeTime);\n            } else {\n                this._park();\n            }\n        },\n\n        onEndSms() {\n            this._endSms();\n        },\n\n        onOpenTakeoverConfirm() {\n            this.set('showTakeoverConfirmModal', true);\n        },\n\n        onCancelTakeoverConfirm() {\n            this.set('showTakeoverConfirmModal', false);\n        },\n\n        onConfirmTakeover() {\n            this.set('showTakeoverConfirmModal', false);\n            this._messageTakeover();\n        },\n\n        /**\n         * Throttling action to avoid multiple clicks on the callback button\n         */\n        onCallbackDefaultNumber() {\n            throttle(this, this._callbackDefaultNumber, CALLBACK_THROTTLE_TIME);\n        },\n\n        onCallbackNumber(option: any) {\n            throttle(\n                this,\n                this._beginCallback,\n                { number: option.value, name: option.text, phoneColumn: option.phoneColumn },\n                CALLBACK_THROTTLE_TIME\n            );\n        },\n\n        onSkipCallback() {\n            this._skipCallback();\n        },\n\n        onBeginScreenShareOrCoBrowse() {\n            this._beginScreenShareOrCoBrowse();\n        },\n\n        onBeginCobrowseV2() {\n            this._beginCobrowseV2();\n        },\n\n        onBeginVideo() {\n            this._beginVideo();\n        },\n\n        onToggleAcdVoicemail() {\n            this.toggleProperty('acdVoicemailPlayerVisible');\n        },\n\n        onUpdateAcwRequest() {\n            this._updateAcwRequest();\n        },\n\n        onParkWorkitem() {\n            this._parkWorkitem();\n        },\n\n        onDisconnectWorkitem() {\n            this._disconnectWorkitem();\n        },\n\n        onReturnToActiveMode() {\n            const workitem = this.get('workitem');\n            if (!this.get('session').get('useModes') || !workitem) return;\n\n            this.get('workitemModeService').returnToActiveMode(workitem);\n        },\n\n        /**\n         * Invoked when the user closes the side bar in the interaction header\n         */\n        onCloseSidebar() {\n            this._closeSidebar();\n        },\n\n        /**\n         * Invoked when the user decides to expand or collapse the sidebar from the view\n         */\n        onToggleSidebar() {\n            this._toggleSidebar();\n        },\n\n        isConversationScriptAvailable(interaction: any) {\n            return interaction && (interaction.get('isCall') || interaction.get('isCallback'));\n        },\n\n        isContextualScriptAvailable(interaction: any) {\n            return interaction && (interaction.get('isChat') || interaction.get('isEmail') || interaction.get('isSms'));\n        },\n\n        sizeMainstage(size: Maybe<MainstageSize>) {\n            this._sizeMainstage(size ?? 'medium');\n            this.onClosePopover();\n        },\n\n        sizeMainstageKeydown(size: Maybe<MainstageSize>, e: KeyboardEvent) {\n            if (e.key !== 'Enter' && e.key !== ' ') return;\n\n            this._sizeMainstage(size ?? 'medium');\n            this.onClosePopover();\n        }\n    }\n});\n\n/**\n * Iterates through a predefined list of properties to determine if the next and prev\n * interaction has had any meaningful changes on them, and if so return `true`.\n *\n * @param next the incoming interaction object value\n * @param prev the previous interaction object value\n * @returns boolean dipicting if the interaction has changed in a meaningful way\n */\nfunction checkInteractionProperties(\n    next: Maybe<any>,\n    prev: Maybe<{ [key in WatchInteractionProperty]?: any }>\n): Map<WatchInteractionProperty, any> | null {\n    // Set of properties that have been detected to of changed\n    const changes = new Map<WatchInteractionProperty, any>();\n    if (next && prev) {\n        // iterate through all properties we deem to be watched so we aren't\n        // checking ALL of the props on each interaction.\n        for (const key of WatchInteractionProperties) {\n            const nextValue = get(next, key);\n            const prevValue = prev[key]; // prev won't be an EmberObject\n\n            if (!isEqual(nextValue, prevValue)) {\n                changes.set(key, nextValue);\n            }\n        }\n    } else if ((!next && prev) || (next && !prev)) {\n        changes.set('all', next);\n    }\n    // otherwise it has not changed in a meaningful way to make additional checks\n    return changes.size ? changes : null;\n}\n\nfunction isValidPanelSizeMap(toCheck: unknown): toCheck is Record<string, number> {\n    if (typeof toCheck !== 'object' || !toCheck) {\n        return false;\n    }\n    for (const key in toCheck) {\n        if (!hasKey(toCheck, key)) {\n            return false;\n        }\n        const value = toCheck[key];\n        if (typeof value !== 'number' || isNaN(value)) {\n            return false;\n        }\n    }\n    return true;\n}\n\n/**\n * Normalizes the provided value\n *\n * @param value the value to normalize\n * @returns the normalized seconds based on the value provided\n */\nfunction normalizeTimerSeconds(value: undefined | number) {\n    return value === 0 ? 1 : value ?? 30;\n}\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"NTKpMWNo\",\"block\":\"[[[6,[39,0],null,[[\\\"type\\\",\\\"subtype\\\",\\\"engagementSource\\\",\\\"isDisconnected\\\",\\\"isCampaign\\\",\\\"isHeld\\\",\\\"isConfined\\\",\\\"showExternalCampaignWarning\\\",\\\"showBottomContainer\\\",\\\"name\\\",\\\"nameTooltip\\\",\\\"divisionName\\\",\\\"acdExternalContactDivNameFT\\\",\\\"acdExternalContactWorkitemsDivNameFT\\\",\\\"connectedTime\\\",\\\"connectedTimeDisplay\\\",\\\"connectedDuration\\\",\\\"communicationSidebarExpanded\\\",\\\"actionCopy\\\",\\\"showExtraActions\\\",\\\"actionCloseSidebar\\\",\\\"actionToggleSidebar\\\",\\\"acdEngagementSourcesFT\\\",\\\"extraSpacing\\\"],[[52,[33,2],\\\"workitem\\\",[33,3,[\\\"type\\\"]]],[33,3,[\\\"subMessageType\\\"]],[33,4],[28,[37,5],[[33,3,[\\\"isDisconnected\\\"]],[33,3,[\\\"isTerminated\\\"]]],null],[33,3,[\\\"isCampaignCallback\\\"]],[33,6],[33,7],[28,[37,8],[[33,9],[33,10]],null],[52,[28,[37,5],[[33,2],[33,3,[\\\"isAlerting\\\"]]],null],false,true],[33,11],[33,12],[33,13],[33,14],[33,15],[33,16],[28,[37,17],[\\\"purecloud.acdInteraction.connectedSince\\\"],[[\\\"connectedTime\\\"],[[33,18]]]],[33,3,[\\\"connectedDuration\\\"]],[33,19],[28,[37,20],[[30,0],\\\"onCopyInteractionUrl\\\"],null],[28,[37,21],[[28,[37,5],[[33,22],[33,23,[\\\"useNewNav\\\"]]],null]],null],[28,[37,20],[[30,0],\\\"onCloseSidebar\\\"],null],[28,[37,20],[[30,0],\\\"onToggleSidebar\\\"],null],[33,24],[28,[37,8],[[33,23,[\\\"useNewNav\\\"]],[28,[37,21],[[33,22]],null]],null]]],[[\\\"default\\\"],[[[[6,[39,25],null,null,[[\\\"default\\\"],[[[[41,[33,26],[[[6,[39,27],null,[[\\\"id\\\",\\\"class\\\",\\\"ariaLabel\\\",\\\"ariaExpanded\\\",\\\"click\\\"],[\\\"call-control-dialpad-button\\\",\\\"interaction-dialpad-btn\\\",[28,[37,17],[\\\"purecloud.toggleDialpad\\\"],null],[52,[33,28],\\\"true\\\",\\\"false\\\"],[28,[37,20],[[30,0],\\\"onTogglePopover\\\",\\\"showDialpadDropdown\\\",\\\"#call-control-dialpad-popover\\\"],null]]],[[\\\"default\\\"],[[[[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"phone-dialpad\\\"],[15,\\\"screenreader-text\\\",[28,[37,17],[\\\"purecloud.toggleDialpad\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"\\\\n            \\\"],[10,\\\"gux-popover\\\"],[14,\\\"for\\\",\\\"call-control-dialpad-button\\\"],[14,1,\\\"call-control-dialpad-popover\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,28],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"interactions-dialpad-container\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,23,[\\\"useModes\\\"]],[[[1,\\\"                            \\\"],[1,[28,[35,29],null,[[\\\"showToggle\\\",\\\"enableKeyboardInput\\\",\\\"sendDtmf\\\",\\\"entityId\\\",\\\"participantId\\\"],[false,true,true,[33,3,[\\\"id\\\"]],[33,3,[\\\"participantForCurrentUser\\\",\\\"id\\\"]]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[1,[28,[35,30],null,[[\\\"addingParticipants\\\",\\\"showTitle\\\",\\\"showCallInput\\\",\\\"showDialpad\\\",\\\"isAcdDTMF\\\",\\\"sendDtmf\\\"],[false,false,false,true,true,true]]]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"call-control-dialpad-button\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.dialPad\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,8],[[33,31],[33,32],[28,[37,21],[[33,3,[\\\"myselfIsMonitor\\\"]]],null]],null],[[[6,[39,27],null,[[\\\"id\\\",\\\"class\\\",\\\"click\\\",\\\"ariaLabel\\\",\\\"ariaPressed\\\",\\\"ariaDisabled\\\"],[\\\"call-control-mute-button\\\",[28,[37,33],[\\\"interaction-mute-btn\\\",[52,[33,3,[\\\"conversation\\\",\\\"isMuted\\\"]],\\\" interaction-muted\\\"]],null],[28,[37,20],[[30,0],\\\"onMute\\\"],null],[28,[37,17],[[33,34]],null],[52,[33,3,[\\\"conversation\\\",\\\"isMuted\\\"]],\\\"true\\\",\\\"false\\\"],[52,[33,3,[\\\"isMuteLoading\\\"]],\\\"true\\\",\\\"false\\\"]]],[[\\\"default\\\"],[[[[41,[33,3,[\\\"isMuteLoading\\\"]],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin loading-indicator interaction-control-loading-indicator\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,3,[\\\"conversation\\\",\\\"isMuted\\\"]],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"microphone-disable\\\"],[15,\\\"screenreader-text\\\",[28,[37,17],[[33,34]],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"microphone\\\"],[15,\\\"screenreader-text\\\",[28,[37,17],[[33,34]],null]],[12],[13],[1,\\\"\\\\n                \\\"]],[]]]],[]]]],[]]]]],[1,\\\"            \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"call-control-mute-button\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,17],[[33,34]],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,35],[[[6,[39,27],null,[[\\\"id\\\",\\\"class\\\",\\\"click\\\",\\\"ariaLabel\\\",\\\"ariaPressed\\\",\\\"ariaDisabled\\\"],[\\\"call-control-hold-button\\\",[28,[37,33],[\\\"interaction-hold-btn\\\",[52,[28,[37,5],[[33,6],[33,7]],null],\\\" interaction-held\\\"]],null],[28,[37,20],[[30,0],\\\"onHold\\\"],null],[28,[37,17],[[52,[28,[37,5],[[33,6],[33,7]],null],\\\"purecloud.acdInteraction.unhold\\\",\\\"purecloud.acdInteraction.hold\\\"]],null],[52,[28,[37,5],[[33,6],[33,7]],null],\\\"true\\\",\\\"false\\\"],[52,[33,3,[\\\"isHoldLoading\\\"]],\\\"true\\\",\\\"false\\\"]]],[[\\\"default\\\"],[[[[41,[33,3,[\\\"isHoldLoading\\\"]],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin loading-indicator interaction-control-loading-indicator\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,5],[[33,6],[33,7]],null],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"control-play\\\"],[15,\\\"screenreader-text\\\",[28,[37,17],[\\\"purecloud.acdInteraction.unhold\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"control-pause\\\"],[15,\\\"screenreader-text\\\",[28,[37,17],[\\\"purecloud.acdInteraction.hold\\\"],null]],[12],[13],[1,\\\"\\\\n                \\\"]],[]]]],[]]]],[]]]]],[1,\\\"            \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"call-control-hold-button\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,5],[[33,6],[33,7]],null],[[[1,\\\"                    \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.unhold\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.hold\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,8],[[33,32],[33,31],[33,3,[\\\"canTogglePause\\\"]],[33,36,[\\\"canSecurePause\\\"]],[28,[37,21],[[28,[37,5],[[33,3,[\\\"myselfIsMonitor\\\"]],[33,3,[\\\"myselfIsCoach\\\"]]],null]],null]],null],[[[6,[39,27],null,[[\\\"id\\\",\\\"class\\\",\\\"click\\\",\\\"accent\\\",\\\"ariaLabel\\\",\\\"ariaPressed\\\",\\\"ariaDisabled\\\"],[\\\"call-control-secure-pause-button\\\",[28,[37,33],[\\\"interaction-secure-pause-btn\\\",[52,[33,37],\\\" interaction-paused\\\"]],null],[28,[37,20],[[30,0],\\\"onToggleSecurePause\\\"],null],[52,[33,37],\\\"danger\\\",\\\"primary\\\"],[52,[33,37],[28,[37,17],[\\\"purecloud.acdInteraction.securePauseEnd\\\"],null],[28,[37,17],[\\\"purecloud.acdInteraction.securePauseStart\\\"],null]],[52,[33,37],\\\"true\\\",\\\"false\\\"],[52,[33,3,[\\\"isSecurePauseLoading\\\"]],\\\"true\\\",\\\"false\\\"]]],[[\\\"default\\\"],[[[[41,[33,3,[\\\"isSecurePauseLoading\\\"]],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin loading-indicator interaction-control-loading-indicator\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,37],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"lock\\\"],[15,\\\"screenreader-text\\\",[28,[37,17],[\\\"purecloud.acdInteraction.securePauseEnd\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"unlock\\\"],[15,\\\"screenreader-text\\\",[28,[37,17],[\\\"purecloud.acdInteraction.securePauseStart\\\"],null]],[12],[13],[1,\\\"\\\\n                \\\"]],[]]]],[]]]],[]]]]],[1,\\\"            \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"call-control-secure-pause-button\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,37],[[[1,\\\"                    \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.securePauseEnd\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.securePauseStart\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,38],[[[6,[39,27],null,[[\\\"id\\\",\\\"class\\\",\\\"click\\\",\\\"accent\\\",\\\"ariaLabel\\\"],[\\\"call-control-acw-button\\\",[28,[37,33],[\\\"acw-request-btn\\\",[52,[33,3,[\\\"isCommunicationAfterCallWorkRequested\\\"]],\\\" acw-requested\\\",\\\" acw-skipped\\\"]],null],[28,[37,20],[[30,0],\\\"onUpdateAcwRequest\\\"],null],[52,[33,3,[\\\"isCommunicationAfterCallWorkRequested\\\"]],\\\"danger\\\",\\\"primary\\\"],[52,[33,3,[\\\"isCommunicationAfterCallWorkRequested\\\"]],[28,[37,17],[\\\"purecloud.acdInteraction.skipACW\\\"],null],[28,[37,17],[\\\"purecloud.acdInteraction.requestACW\\\"],null]]]],[[\\\"default\\\"],[[[[41,[33,39],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin loading-indicator interaction-control-loading-indicator\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"user\\\"],[15,\\\"screenreader-text\\\",[52,[33,3,[\\\"isCommunicationAfterCallWorkRequested\\\"]],[28,[37,17],[\\\"purecloud.acdInteraction.skipACW\\\"],null],[28,[37,17],[\\\"purecloud.acdInteraction.requestACW\\\"],null]]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]],[]]]]],[1,\\\"            \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"call-control-acw-button\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,3,[\\\"isCommunicationAfterCallWorkRequested\\\"]],[[[1,\\\"                    \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.skipACW\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.requestACW\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]]]],[1,\\\"\\\\n\\\"],[41,[28,[37,8],[[33,2],[33,40]],null],[[[6,[39,25],null,null,[[\\\"default\\\"],[[[[6,[39,27],null,[[\\\"id\\\",\\\"class\\\",\\\"ariaLabel\\\",\\\"ariaExpanded\\\",\\\"click\\\"],[\\\"call-control-workitem-blind-transfer-button\\\",\\\"toggle-blind-transfer-btn\\\",[28,[37,17],[\\\"purecloud.acdInteraction.transfer\\\"],null],[52,[33,41],\\\"true\\\",\\\"false\\\"],[28,[37,20],[[30,0],\\\"onTogglePopover\\\",\\\"showWorkitemTransferDropdown\\\",\\\"#call-control-workitem-blind-transfer-popover\\\"],null]]],[[\\\"default\\\"],[[[[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"transfer\\\"],[15,\\\"screenreader-text\\\",[28,[37,17],[\\\"purecloud.acdInteraction.transfer\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"\\\\n            \\\"],[10,\\\"gux-popover\\\"],[14,\\\"for\\\",\\\"call-control-workitem-blind-transfer-button\\\"],[14,1,\\\"call-control-workitem-blind-transfer-popover\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,41],[[[1,\\\"                    \\\"],[1,[28,[35,42],null,[[\\\"authUser\\\",\\\"header\\\",\\\"interaction\\\",\\\"removePadding\\\",\\\"removeWrapperStyling\\\",\\\"addButtonIcon\\\",\\\"addButtonTooltip\\\",\\\"excludeFilters\\\",\\\"allowRawInputSelection\\\",\\\"searchPlaceholderText\\\",\\\"actionSelected\\\"],[[33,43],\\\"purecloud.acdInteraction.transfer\\\",[33,2],true,true,\\\"arrow-right\\\",\\\"purecloud.acdInteraction.transfer\\\",[33,44],[33,45],[33,46],[28,[37,20],[[30,0],\\\"onBlindTransferDataSelected\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"call-control-workitem-blind-transfer-button\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.transfer\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"\\\\n\\\"],[6,[39,25],null,null,[[\\\"default\\\"],[[[[6,[39,27],null,[[\\\"id\\\",\\\"class\\\",\\\"ariaLabel\\\",\\\"click\\\"],[\\\"call-control-park-task-button\\\",\\\"park-task-button\\\",[28,[37,17],[\\\"purecloud.acdInteraction.workitem.park\\\"],null],[28,[37,20],[[30,0],\\\"onParkWorkitem\\\"],null]]],[[\\\"default\\\"],[[[[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/list-ul-regular\\\"],[15,\\\"screenreader-text\\\",[28,[37,17],[\\\"purecloud.acdInteraction.workitem.park\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]]]],[]]]]],[1,\\\"        \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"call-control-park-task-button\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.workitem.park\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,8],[[33,23,[\\\"useModes\\\"]],[33,2],[28,[37,5],[[28,[37,47],[[33,2,[\\\"workitem\\\",\\\"assignmentState\\\"]],\\\"Parked\\\"],null],[28,[37,47],[[33,2,[\\\"workitem\\\",\\\"assignmentState\\\"]],\\\"Disconnected\\\"],null],[28,[37,47],[[33,2,[\\\"workitem\\\",\\\"assignmentState\\\"]],\\\"Idle\\\"],null],[28,[37,47],[[33,2,[\\\"workitem\\\",\\\"assignmentState\\\"]],\\\"Declined\\\"],null]],null]],null],[[[6,[39,25],null,null,[[\\\"default\\\"],[[[[6,[39,27],null,[[\\\"id\\\",\\\"class\\\",\\\"ariaLabel\\\",\\\"click\\\"],[\\\"call-control-return-to-active-button\\\",\\\"return-to-active-button\\\",[28,[37,17],[\\\"purecloud.acdInteraction.workitem.returnToActiveMode\\\"],null],[28,[37,20],[[30,0],\\\"onReturnToActiveMode\\\"],null]]],[[\\\"default\\\"],[[[[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/arrow-up-left-regular\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[10,1],[12],[1,[28,[35,17],[\\\"purecloud.acdInteraction.workitem.returnToActiveMode\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"            \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"call-control-return-to-active-button\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.workitem.returnToActiveMode\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]]],[]],null],[1,\\\"\\\\n\\\"],[41,[51,[33,49]],[[[6,[39,25],null,null,[[\\\"default\\\"],[[[[41,[33,50],[[[6,[39,27],null,[[\\\"id\\\",\\\"class\\\",\\\"disabled\\\",\\\"ariaLabel\\\",\\\"ariaExpanded\\\",\\\"click\\\"],[\\\"call-control-blind-transfer-button\\\",\\\"toggle-blind-transfer-btn\\\",[33,51],[28,[37,17],[\\\"purecloud.acdInteraction.transfer\\\"],null],[52,[33,52],\\\"true\\\",\\\"false\\\"],[28,[37,20],[[30,0],\\\"onTogglePopover\\\",\\\"showTransferDropdown\\\",\\\"#call-control-blind-transfer-popover\\\"],null]]],[[\\\"default\\\"],[[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"transfer\\\"],[15,\\\"screenreader-text\\\",[28,[37,17],[\\\"purecloud.acdInteraction.transfer\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"                \\\"],[10,\\\"gux-popover\\\"],[14,\\\"for\\\",\\\"call-control-blind-transfer-button\\\"],[14,1,\\\"call-control-blind-transfer-popover\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,52],[[[41,[33,3,[\\\"isAttendedTransferring\\\"]],[[[1,\\\"                            \\\"],[1,[28,[35,53],null,[[\\\"participantId\\\",\\\"removePadding\\\",\\\"removeWrapperStyling\\\",\\\"interactionType\\\",\\\"actionCancelTransfer\\\"],[[33,3,[\\\"transferringToParticipant\\\",\\\"userId\\\"]],true,true,[33,3,[\\\"type\\\"]],[28,[37,20],[[30,0],\\\"onCancelBlindTransfer\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[1,[28,[35,42],null,[[\\\"authUser\\\",\\\"header\\\",\\\"interaction\\\",\\\"removePadding\\\",\\\"removeWrapperStyling\\\",\\\"addButtonIcon\\\",\\\"addButtonTooltip\\\",\\\"participants\\\",\\\"activeParticipantIds\\\",\\\"excludeFilters\\\",\\\"allowRawInputSelection\\\",\\\"searchPlaceholderText\\\",\\\"actionSelected\\\"],[[33,43],\\\"purecloud.acdInteraction.transfer\\\",[33,3],true,true,\\\"transfer\\\",\\\"purecloud.acdInteraction.transfer\\\",[33,54],[33,55],[33,44],[33,45],[33,46],[28,[37,20],[[30,0],\\\"onBlindTransferDataSelected\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]]]],[]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"call-control-blind-transfer-button\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.transfer\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,8],[[33,56],[33,57]],null],[[[6,[39,27],null,[[\\\"id\\\",\\\"class\\\",\\\"disabled\\\",\\\"ariaLabel\\\",\\\"ariaExpanded\\\",\\\"click\\\"],[\\\"call-control-all-consult-transfer-button\\\",\\\"toggle-all-consult-transfer-btn\\\",[28,[37,5],[[33,3,[\\\"isActiveConference\\\"]],[33,3,[\\\"wasConference\\\"]],[33,3,[\\\"onConsult\\\"]]],null],[28,[37,17],[\\\"purecloud.acdInteraction.consult\\\"],null],[52,[33,58],\\\"true\\\",\\\"false\\\"],[28,[37,20],[[30,0],\\\"onTogglePopover\\\",\\\"showConsultDropdown\\\",\\\"#call-control-all-consult-transfer-popover\\\"],null]]],[[\\\"default\\\"],[[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/agent-group\\\"],[15,\\\"screenreader-text\\\",[28,[37,17],[\\\"purecloud.acdInteraction.consult\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"\\\\n                \\\"],[10,\\\"gux-popover\\\"],[14,1,\\\"call-control-all-consult-transfer-popover\\\"],[14,\\\"for\\\",\\\"call-control-all-consult-transfer-button\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,58],[[[1,\\\"                        \\\"],[1,[28,[35,42],null,[[\\\"authUser\\\",\\\"removePadding\\\",\\\"removeWrapperStyling\\\",\\\"header\\\",\\\"interaction\\\",\\\"participants\\\",\\\"addButtonIcon\\\",\\\"addButtonTooltip\\\",\\\"activeParticipantIds\\\",\\\"excludeFilters\\\",\\\"includeFilters\\\",\\\"additionalPermissions\\\",\\\"searchPlaceholderText\\\",\\\"actionSelected\\\"],[[33,43],true,true,\\\"purecloud.acdInteraction.consult\\\",[33,3],[33,54],\\\"legacy/agent-group\\\",\\\"purecloud.acdInteraction.consult\\\",[33,55],[33,59],[33,60],[33,61],[33,62],[28,[37,20],[[30,0],\\\"onConsultDataSelected\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"call-control-all-consult-transfer-button\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.consult\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,8],[[33,31],[33,32]],null],[[[41,[28,[37,8],[[28,[37,21],[[33,56]],null],[33,63]],null],[[[6,[39,27],null,[[\\\"id\\\",\\\"class\\\",\\\"disabled\\\",\\\"ariaLabel\\\",\\\"ariaExpanded\\\",\\\"click\\\"],[\\\"call-control-consult-transfer-button\\\",\\\"toggle-consult-transfer-btn\\\",[28,[37,5],[[33,3,[\\\"isActiveConference\\\"]],[33,3,[\\\"wasConference\\\"]],[33,3,[\\\"onConsult\\\"]]],null],[28,[37,17],[\\\"purecloud.acdInteraction.consult\\\"],null],[52,[33,58],\\\"true\\\",\\\"false\\\"],[28,[37,20],[[30,0],\\\"onTogglePopover\\\",\\\"showConsultDropdown\\\",\\\"#call-control-consult-transfer-popover\\\"],null]]],[[\\\"default\\\"],[[[[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/agent-group\\\"],[15,\\\"screenreader-text\\\",[28,[37,17],[\\\"purecloud.acdInteraction.consult\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-popover\\\"],[14,1,\\\"call-control-consult-transfer-popover\\\"],[14,\\\"for\\\",\\\"call-control-consult-transfer-button\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,58],[[[1,\\\"                            \\\"],[1,[28,[35,42],null,[[\\\"authUser\\\",\\\"removePadding\\\",\\\"removeWrapperStyling\\\",\\\"header\\\",\\\"interaction\\\",\\\"participants\\\",\\\"addButtonIcon\\\",\\\"addButtonTooltip\\\",\\\"activeParticipantIds\\\",\\\"excludeFilters\\\",\\\"actionSelected\\\"],[[33,43],true,true,\\\"purecloud.acdInteraction.consult\\\",[33,3],[33,54],\\\"legacy/agent-group\\\",\\\"purecloud.acdInteraction.consult\\\",[33,55],[33,59],[28,[37,20],[[30,0],\\\"onConsultDataSelected\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"call-control-consult-transfer-button\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.consult\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[6,[39,27],null,[[\\\"id\\\",\\\"class\\\",\\\"disabled\\\",\\\"ariaLabel\\\",\\\"ariaExpanded\\\",\\\"superscript\\\",\\\"click\\\"],[\\\"call-control-conference-button\\\",\\\"toggle-conference-btn\\\",[33,3,[\\\"onConsult\\\"]],[28,[37,17],[\\\"purecloud.acdInteraction.conference\\\"],null],[52,[33,64],\\\"true\\\",\\\"false\\\"],[33,65],[28,[37,20],[[30,0],\\\"onTogglePopover\\\",\\\"showConferenceDropdown\\\",\\\"#call-control-conference-popover\\\"],null]]],[[\\\"default\\\"],[[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/people\\\"],[15,\\\"screenreader-text\\\",[28,[37,17],[\\\"purecloud.acdInteraction.conference\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"\\\\n                \\\"],[10,\\\"gux-popover\\\"],[14,1,\\\"call-control-conference-popover\\\"],[14,\\\"for\\\",\\\"call-control-conference-button\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,64],[[[41,[28,[37,8],[[33,3,[\\\"isActiveConference\\\"]],[28,[37,21],[[33,66]],null]],null],[[[1,\\\"                            \\\"],[1,[28,[35,67],null,[[\\\"acdWarmConferencePhase1FT\\\",\\\"participants\\\",\\\"authUser\\\",\\\"removePadding\\\",\\\"removeWrapperStyling\\\",\\\"onConnected\\\",\\\"mute\\\",\\\"muteAll\\\",\\\"dismiss\\\",\\\"invite\\\",\\\"warmInvite\\\"],[[33,68],[33,69],[33,43],true,true,[28,[37,20],[[30,0],\\\"onConferenceParticipantConnected\\\"],null],[28,[37,20],[[30,0],\\\"onMuteParticipant\\\"],null],[28,[37,20],[[30,0],\\\"onMuteAllParticipants\\\"],null],[28,[37,20],[[30,0],\\\"onDismissParticipant\\\"],null],[28,[37,20],[[30,0],\\\"onInviteParticipantToConference\\\"],null],[28,[37,20],[[30,0],\\\"onWarmInviteParticipantToConference\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[1,[28,[35,42],null,[[\\\"authUser\\\",\\\"header\\\",\\\"interaction\\\",\\\"participants\\\",\\\"activeParticipantIds\\\",\\\"showBack\\\",\\\"removePadding\\\",\\\"removeWrapperStyling\\\",\\\"addButtonIcon\\\",\\\"addButtonTooltip\\\",\\\"backText\\\",\\\"actionBack\\\",\\\"actionSelected\\\"],[[33,43],[33,70],[33,3],[33,54],[33,55],[33,3,[\\\"isActiveConference\\\"]],true,true,[33,71],[33,72],\\\"purecloud.acdInteraction.conferenceDropdown.backToConference\\\",[28,[37,20],[[30,0],\\\"onNavigateToConferenceRoster\\\"],null],[28,[37,20],[[30,0],[33,73]],null]]]]],[1,\\\"\\\\n\\\"]],[]]]],[]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"call-control-conference-button\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.conference\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]]]]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,8],[[33,68],[33,31],[33,32],[33,74],[33,75]],null],[[[6,[39,25],null,null,[[\\\"default\\\"],[[[[6,[39,27],null,[[\\\"id\\\",\\\"disabled\\\",\\\"class\\\",\\\"click\\\",\\\"ariaLabel\\\",\\\"ariaDisabled\\\"],[\\\"call-control-merge-to-conference-button\\\",[28,[37,5],[[33,3,[\\\"isMergeComplete\\\"]],[33,3,[\\\"isMergeLoading\\\"]]],null],[28,[37,33],[\\\"interaction-hold-btn\\\",\\\" \\\",\\\"merge-to-conference-btn\\\",[52,[33,76],\\\" disabled\\\"]],null],[28,[37,20],[[30,0],\\\"onMergeToConference\\\"],null],[28,[37,17],[\\\"purecloud.acdInteraction.conferenceDropdown.mergeToConference\\\"],null],[52,[28,[37,5],[[33,76],[33,3,[\\\"isMergeLoading\\\"]],[33,3,[\\\"isMergeComplete\\\"]]],null],\\\"true\\\",\\\"false\\\"]]],[[\\\"default\\\"],[[[[41,[33,3,[\\\"isMergeLoading\\\"]],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin loading-indicator interaction-control-loading-indicator\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/arrows-merge-regular\\\"],[15,\\\"screenreader-text\\\",[28,[37,17],[\\\"purecloud.acdInteraction.conferenceDropdown.mergeToConference\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]],[]]]]],[41,[33,76],[[[1,\\\"                \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"call-control-merge-to-conference-button\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.conferenceDropdown.disableMergeToConference\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"call-control-merge-to-conference-button\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.conferenceDropdown.mergeToConference\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[]]]]]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,8],[[33,9],[33,32]],null],[[[6,[39,25],null,null,[[\\\"default\\\"],[[[[41,[33,77],[[[6,[39,27],null,[[\\\"id\\\",\\\"class\\\",\\\"ariaLabel\\\",\\\"ariaExpanded\\\",\\\"click\\\"],[\\\"call-control-add-callback-number-button\\\",\\\"new-call interaction-add-numbers\\\",[28,[37,17],[\\\"purecloud.acdInteraction.callbacks.addCallbackNumber\\\"],null],[52,[33,78],\\\"true\\\",\\\"false\\\"],[28,[37,20],[[30,0],\\\"onTogglePopover\\\",\\\"showCallbackDialpadDropdown\\\",\\\"#call-control-add-callback-number-popover\\\"],null]]],[[\\\"default\\\"],[[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"add\\\"],[15,\\\"screenreader-text\\\",[28,[37,17],[\\\"purecloud.acdInteraction.callbacks.addCallbackNumber\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"\\\\n                \\\"],[10,\\\"gux-popover\\\"],[14,\\\"for\\\",\\\"call-control-add-callback-number-button\\\"],[14,1,\\\"call-control-add-callback-number-popover\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,78],[[[1,\\\"                        \\\"],[10,0],[14,0,\\\"add-callback-numbers-dropdown\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,30],null,[[\\\"showTitle\\\",\\\"showDialpad\\\",\\\"showCallInput\\\",\\\"autofocusCallInput\\\",\\\"showDialpadToggle\\\",\\\"hideTargetDropdown\\\",\\\"allowInvalidNumbers\\\",\\\"showMakeCallButton\\\",\\\"actionValueChange\\\",\\\"title\\\"],[true,true,true,true,true,true,true,false,[28,[37,20],[[30,0],\\\"onAddCallbackNumberValueChange\\\"],null],\\\"purecloud.acdInteraction.callbacks.addCallbackNumber\\\"]]]],[1,\\\"\\\\n\\\\n                            \\\"],[10,0],[14,0,\\\"collect-numbers-actions-container\\\"],[12],[1,\\\"\\\\n                                \\\"],[10,\\\"gux-button\\\"],[14,\\\"accent\\\",\\\"primary\\\"],[14,0,\\\"collect-phone-numbers\\\"],[15,\\\"disabled\\\",[28,[37,47],[[33,79,[\\\"length\\\"]],0],null]],[15,\\\"onclick\\\",[28,[37,20],[[30,0],\\\"onAddCallbackNumbers\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                                    \\\"],[1,[28,[35,17],[\\\"common.add\\\"],null]],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n                                \\\"],[10,\\\"gux-button\\\"],[14,0,\\\"collect-phone-numbers-cancel\\\"],[15,\\\"onclick\\\",[28,[37,20],[[30,0],\\\"onCancelCallbackNumbers\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                                    \\\"],[1,[28,[35,17],[\\\"common.cancel\\\"],null]],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"call-control-add-callback-number-button\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.callbacks.addCallbackNumber\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,80],[[[6,[39,81],null,[[\\\"class\\\",\\\"disabled\\\",\\\"options\\\",\\\"tooltip\\\",\\\"actionSelected\\\"],[\\\"phone-numbers-dropdown\\\",[33,82],[33,83],[28,[37,17],[\\\"purecloud.acdInteraction.beginCall\\\"],null],[28,[37,20],[[30,0],\\\"onCallbackNumber\\\"],null]]],[[\\\"default\\\"],[[[[41,[33,84],[[[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"phone\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]]],[]]]]]],[]],[[[41,[33,85],[[[41,[33,10],[[[6,[39,27],null,[[\\\"id\\\",\\\"class\\\",\\\"click\\\",\\\"disabled\\\"],[\\\"call-control-copy-campaign-button\\\",\\\"copy-external-campaign-customer-phonenumber-btn\\\",[28,[37,20],[[30,0],\\\"onCopyExternalCustomerPhoneNumber\\\"],null],[33,82]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[41,[33,84],[[[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"copy\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"\\\\n                        \\\"],[10,2],[12],[1,\\\"\\\\n                            \\\"],[1,[33,3,[\\\"formattedCustomerPhoneNumber\\\"]]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"                    \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"call-control-copy-campaign-button\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.callbacks.customerPhoneNumberCopyLink\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[6,[39,27],null,[[\\\"id\\\",\\\"class\\\",\\\"disabled\\\",\\\"click\\\",\\\"options\\\"],[\\\"call-control-place-callback-button\\\",\\\"place-callback\\\",[33,82],[28,[37,20],[[30,0],\\\"onCallbackDefaultNumber\\\"],null],[33,83]]],[[\\\"default\\\"],[[[[41,[33,84],[[[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"phone\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"\\\\n                        \\\"],[10,2],[12],[1,\\\"\\\\n                            \\\"],[1,[33,86,[\\\"text\\\"]]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]],[41,[51,[28,[37,5],[[33,87],[33,88]],null]],[[[1,\\\"                        \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"call-control-place-callback-button\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.beginCall\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]],[1,\\\"            \\\"]],[]],null]],[]]],[1,\\\"\\\\n\\\"],[41,[33,89],[[[6,[39,27],null,[[\\\"id\\\",\\\"class\\\",\\\"ariaLabel\\\",\\\"disabled\\\",\\\"click\\\"],[\\\"call-control-skip-callback-button\\\",\\\"skip-callback\\\",[28,[37,17],[\\\"purecloud.acdInteraction.skip\\\"],null],[33,90],[28,[37,20],[[30,0],\\\"onSkipCallback\\\"],null]]],[[\\\"default\\\"],[[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"control-skip-right\\\"],[15,\\\"screenreader-text\\\",[28,[37,17],[\\\"purecloud.acdInteraction.skip\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"                \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"call-control-skip-callback-button\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.skip\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]]]]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,8],[[33,32],[28,[37,21],[[33,3,[\\\"onConsult\\\"]]],null]],null],[[[6,[39,25],null,null,[[\\\"default\\\"],[[[[41,[33,91],[[[6,[39,27],null,[[\\\"id\\\",\\\"class\\\",\\\"disabled\\\",\\\"click\\\",\\\"ariaLabel\\\"],[\\\"call-control-session-share-button\\\",[28,[37,33],[\\\"session-share-btn \\\",[33,92]],null],[33,93],[28,[37,20],[[30,0],\\\"onBeginScreenShareOrCoBrowse\\\"],null],[28,[37,17],[[33,94]],null]]],[[\\\"default\\\"],[[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"screen-share-regular\\\"],[15,\\\"screenreader-text\\\",[28,[37,17],[[33,94]],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"                \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"call-control-session-share-button\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,17],[[33,94]],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,95],[[[6,[39,27],null,[[\\\"id\\\",\\\"class\\\",\\\"disabled\\\",\\\"click\\\",\\\"ariaLabel\\\"],[\\\"call-control-cobrowse-button\\\",[28,[37,33],[\\\"session-share-btn screen-share cobrowse \\\",[33,92]],null],[33,96],[28,[37,20],[[30,0],\\\"onBeginCobrowseV2\\\"],null],[28,[37,17],[[33,97]],null]]],[[\\\"default\\\"],[[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"custom/screen-monitor-regular\\\"],[15,\\\"screenreader-text\\\",[28,[37,17],[[33,97]],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"                \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"call-control-cobrowse-button\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,17],[[33,97]],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]]]]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,98],[[[6,[39,25],null,null,[[\\\"default\\\"],[[[[6,[39,27],null,[[\\\"id\\\",\\\"disabled\\\",\\\"accent\\\",\\\"click\\\",\\\"ariaLabel\\\",\\\"ariaDisabled\\\"],[\\\"snippet-recording-button\\\",[33,99],[52,[33,100],\\\"secondary\\\",\\\"primary\\\"],[28,[37,20],[[30,0],\\\"onToggleSnippetRecord\\\"],null],[52,[33,100],[28,[37,17],[\\\"purecloud.acdInteraction.snippetRecordEnd\\\"],null],[28,[37,17],[\\\"purecloud.acdInteraction.snippetRecordStart\\\"],null]],[52,[28,[37,5],[[33,99],[33,3,[\\\"isSnippetRecordLoading\\\"]]],null],\\\"true\\\",\\\"false\\\"]]],[[\\\"default\\\"],[[[[41,[33,3,[\\\"isSnippetRecordLoading\\\"]],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin loading-indicator interaction-control-loading-indicator\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/circle-dot-regular\\\"],[15,\\\"screenreader-text\\\",[52,[33,100],[28,[37,17],[\\\"purecloud.acdInteraction.snippetRecordEnd\\\"],null],[28,[37,17],[\\\"purecloud.acdInteraction.snippetRecordStart\\\"],null]]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]],[]]]]],[1,\\\"            \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"snippet-recording-button\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,100],[[[1,\\\"                    \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.snippetRecordEnd\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.snippetRecordStart\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,8],[[33,32],[28,[37,21],[[33,3,[\\\"onConsult\\\"]]],null]],null],[[[6,[39,25],null,null,[[\\\"default\\\"],[[[[41,[33,101],[[[6,[39,27],null,[[\\\"id\\\",\\\"class\\\",\\\"disabled\\\",\\\"click\\\",\\\"ariaLabel\\\"],[\\\"call-control-video-button\\\",\\\"video\\\",[33,102],[28,[37,20],[[30,0],\\\"onBeginVideo\\\"],null],[28,[37,17],[\\\"purecloud.acdInteraction.acdVideo.startVideo\\\"],null]]],[[\\\"default\\\"],[[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"toolbar-video\\\"],[15,\\\"screenreader-text\\\",[28,[37,17],[\\\"purecloud.acdInteraction.acdVideo.startVideo\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"                \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"call-control-video-button\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.acdVideo.startVideo\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]]]]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,77],[[[6,[39,25],null,null,[[\\\"default\\\"],[[[[6,[39,27],null,[[\\\"id\\\",\\\"class\\\",\\\"click\\\",\\\"ariaLabel\\\",\\\"ariaPressed\\\"],[\\\"call-control-voicemail-button\\\",\\\"acd-voicemail-btn\\\",[28,[37,20],[[30,0],\\\"onToggleAcdVoicemail\\\"],null],[28,[37,17],[[33,103]],null],[52,[33,104],\\\"true\\\",\\\"false\\\"]]],[[\\\"default\\\"],[[[[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"voicemail\\\"],[15,\\\"screenreader-text\\\",[28,[37,17],[[33,103]],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"            \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"call-control-voicemail-button\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,17],[[33,103]],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,8],[[33,105],[28,[37,5],[[33,32],[33,3,[\\\"isFlowExecuting\\\"]],[33,3,[\\\"flowStuck\\\"]]],null]],null],[[[6,[39,25],null,null,[[\\\"default\\\"],[[[[41,[33,106],[[[6,[39,27],null,[[\\\"id\\\",\\\"class\\\",\\\"disabled\\\",\\\"click\\\",\\\"ariaLabel\\\"],[\\\"call-control-park-email-button\\\",\\\"park-email-button\\\",[28,[37,5],[[33,3,[\\\"isAttendedTransferring\\\"]],[33,107],[33,3,[\\\"isFlowExecuting\\\"]],[33,3,[\\\"flowStuck\\\"]]],null],[28,[37,20],[[30,0],\\\"onPark\\\"],null],[28,[37,17],[\\\"purecloud.acdInteraction.park.label\\\"],null]]],[[\\\"default\\\"],[[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/list-ul-regular\\\"],[15,\\\"screenreader-text\\\",[28,[37,17],[\\\"purecloud.acdInteraction.park.label\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"                \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"call-control-park-email-button\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.park.label\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]]]]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,8],[[33,108],[33,32]],null],[[[6,[39,25],null,null,[[\\\"default\\\"],[[[[41,[33,109],[[[6,[39,27],null,[[\\\"id\\\",\\\"class\\\",\\\"disabled\\\",\\\"click\\\",\\\"ariaLabel\\\",\\\"ariaExpanded\\\"],[\\\"call-control-park-sms-button\\\",\\\"park-sms-button\\\",[28,[37,5],[[33,3,[\\\"isAttendedTransferring\\\"]],[33,107],[33,3,[\\\"onConsult\\\"]]],null],[28,[37,20],[[30,0],\\\"onTogglePopover\\\",\\\"showParkSmsDropdown\\\",\\\"#call-control-park-sms-popover\\\"],null],[28,[37,17],[\\\"purecloud.acdInteraction.park.label\\\"],null],[52,[33,110],\\\"true\\\",\\\"false\\\"]]],[[\\\"default\\\"],[[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/list-ul-regular\\\"],[15,\\\"screenreader-text\\\",[28,[37,17],[\\\"purecloud.acdInteraction.park.label\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"                \\\"],[10,\\\"gux-popover\\\"],[14,1,\\\"call-control-park-sms-popover\\\"],[14,\\\"for\\\",\\\"call-control-park-sms-button\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,110],[[[1,\\\"                        \\\"],[1,[28,[35,111],null,[[\\\"onParkConfirm\\\"],[[28,[37,20],[[30,0],\\\"onPark\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"call-control-park-sms-button\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.park.label\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]]]]],[]],null],[1,\\\"\\\\n\\\"],[6,[39,25],null,null,[[\\\"default\\\"],[[[[41,[33,112],[[[6,[39,27],null,[[\\\"id\\\",\\\"class\\\",\\\"disabled\\\",\\\"click\\\",\\\"ariaLabel\\\"],[\\\"call-control-takeover-sms-button\\\",\\\"takeover-sms-button\\\",[28,[37,5],[[33,3,[\\\"isAttendedTransferring\\\"]],[33,113]],null],[28,[37,20],[[30,0],\\\"onOpenTakeoverConfirm\\\"],null],[28,[37,17],[\\\"purecloud.acdInteraction.takeover.label\\\"],null]]],[[\\\"default\\\"],[[[[41,[33,113],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin loading-indicator interaction-control-loading-indicator\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,2],[12],[1,[28,[35,17],[\\\"purecloud.acdInteraction.takeover.label\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]]]],[]]]]],[1,\\\"            \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"call-control-takeover-sms-button\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.takeover.tooltip\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,114],[[[41,[33,3,[\\\"myselfIsMonitorV2\\\"]],[[[6,[39,27],null,[[\\\"id\\\",\\\"class\\\",\\\"disabled\\\",\\\"click\\\",\\\"accent\\\",\\\"ariaLabel\\\"],[\\\"call-control-end-sms-monitoring-button\\\",\\\"interaction-end-btn\\\",[28,[37,5],[[33,3,[\\\"isAttendedTransferring\\\"]],[33,115]],null],[28,[37,20],[[30,0],\\\"onEndSms\\\"],null],\\\"danger\\\",[28,[37,17],[\\\"purecloud.acdInteraction.endMonitoring\\\"],null]]],[[\\\"default\\\"],[[[[41,[33,115],[[[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin loading-indicator interaction-control-loading-indicator\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"custom/regular-binoculars-slash\\\"],[15,\\\"screenreader-text\\\",[28,[37,17],[\\\"purecloud.acdInteraction.endMonitoring\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]],[]]]]],[1,\\\"                \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"call-control-end-sms-monitoring-button\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.endMonitoring\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[6,[39,27],null,[[\\\"id\\\",\\\"class\\\",\\\"disabled\\\",\\\"click\\\",\\\"accent\\\",\\\"ariaLabel\\\"],[\\\"call-control-end-sms-button\\\",\\\"interaction-end-btn\\\",[28,[37,5],[[33,3,[\\\"isAttendedTransferring\\\"]],[33,115]],null],[28,[37,20],[[30,0],\\\"onEndSms\\\"],null],\\\"danger\\\",[28,[37,17],[\\\"purecloud.acdInteraction.endSms\\\"],null]]],[[\\\"default\\\"],[[[[41,[33,115],[[[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin loading-indicator interaction-control-loading-indicator\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"roster-sms-disable\\\"],[15,\\\"screenreader-text\\\",[28,[37,17],[\\\"purecloud.acdInteraction.endSms\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]],[]]]]],[1,\\\"                \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"call-control-end-sms-button\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.endSms\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,8],[[33,105],[28,[37,5],[[33,32],[33,3,[\\\"isFlowExecuting\\\"]],[33,3,[\\\"flowStuck\\\"]]],null]],null],[[[6,[39,27],null,[[\\\"id\\\",\\\"class\\\",\\\"disabled\\\",\\\"click\\\",\\\"accent\\\",\\\"ariaLabel\\\"],[\\\"call-control-disconnect-email-button\\\",\\\"disconnect-email-button\\\",[33,3,[\\\"isAttendedTransferring\\\"]],[28,[37,20],[[30,0],\\\"onDisconnect\\\"],null],\\\"danger\\\",[28,[37,17],[\\\"purecloud.acdInteraction.disconnectEmail\\\"],null]]],[[\\\"default\\\"],[[[[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/roster-email-disable\\\"],[15,\\\"screenreader-text\\\",[28,[37,17],[\\\"purecloud.acdInteraction.disconnectEmail\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"            \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"call-control-disconnect-email-button\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.disconnectEmail\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,8],[[33,9],[33,116]],null],[[[6,[39,27],null,[[\\\"id\\\",\\\"class\\\",\\\"click\\\",\\\"accent\\\",\\\"ariaLabel\\\"],[\\\"call-control-finish-callback-button\\\",\\\"interaction-finish-callback-btn\\\",[28,[37,20],[[30,0],\\\"onDisconnect\\\"],null],\\\"danger\\\",[52,[28,[37,8],[[33,3,[\\\"dialerPreview\\\"]],[28,[37,21],[[33,10]],null]],null],[28,[37,17],[\\\"purecloud.acdInteraction.callbacks.donePreview\\\"],null],[28,[37,17],[\\\"purecloud.acdInteraction.callbacks.done\\\"],null]]]],[[\\\"default\\\"],[[[[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"phone-disable\\\"],[15,\\\"screenreader-text\\\",[52,[28,[37,8],[[33,3,[\\\"dialerPreview\\\"]],[28,[37,21],[[33,10]],null]],null],[28,[37,17],[\\\"purecloud.acdInteraction.callbacks.donePreview\\\"],null],[28,[37,17],[\\\"purecloud.acdInteraction.callbacks.done\\\"],null]]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"            \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"call-control-finish-callback-button\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,8],[[33,3,[\\\"dialerPreview\\\"]],[28,[37,21],[[33,10]],null]],null],[[[1,\\\"                    \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.callbacks.donePreview\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.callbacks.done\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,117],[[[41,[33,3,[\\\"myselfIsMonitor\\\"]],[[[6,[39,27],null,[[\\\"id\\\",\\\"class\\\",\\\"disabled\\\",\\\"click\\\",\\\"accent\\\",\\\"ariaLabel\\\"],[\\\"call-control-end-monitoring-button\\\",\\\"interaction-end-btn\\\",[33,118,[\\\"loading\\\",\\\"hangup\\\"]],[28,[37,20],[[30,0],\\\"onHangup\\\"],null],\\\"danger\\\",[28,[37,17],[\\\"purecloud.acdInteraction.endMonitoring\\\"],null]]],[[\\\"default\\\"],[[[[41,[33,118,[\\\"loading\\\",\\\"hangup\\\"]],[[[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin loading-indicator interaction-control-loading-indicator\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"custom/regular-binoculars-slash\\\"],[15,\\\"screenreader-text\\\",[28,[37,17],[\\\"purecloud.acdInteraction.endMonitoring\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]],[]]]]],[1,\\\"                \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"call-control-end-monitoring-button\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.endMonitoring\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[6,[39,27],null,[[\\\"id\\\",\\\"class\\\",\\\"disabled\\\",\\\"click\\\",\\\"accent\\\",\\\"ariaLabel\\\"],[\\\"call-control-end-call-button\\\",\\\"interaction-end-btn\\\",[33,118,[\\\"loading\\\",\\\"hangup\\\"]],[28,[37,20],[[30,0],\\\"onHangup\\\"],null],\\\"danger\\\",[28,[37,17],[\\\"purecloud.acdInteraction.endCall\\\"],null]]],[[\\\"default\\\"],[[[[41,[33,118,[\\\"loading\\\",\\\"hangup\\\"]],[[[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin loading-indicator interaction-control-loading-indicator\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"phone-disable\\\"],[15,\\\"screenreader-text\\\",[28,[37,17],[\\\"purecloud.acdInteraction.endCall\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]],[]]]]],[1,\\\"                \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"call-control-end-call-button\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.endCall\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"]],[]],null]],[]]],[1,\\\"\\\\n\\\"],[41,[28,[37,8],[[33,119],[33,32]],null],[[[6,[39,27],null,[[\\\"id\\\",\\\"class\\\",\\\"disabled\\\",\\\"click\\\",\\\"accent\\\",\\\"ariaLabel\\\"],[\\\"call-control-end-chat-button\\\",\\\"interaction-end-btn\\\",[28,[37,5],[[33,3,[\\\"isAttendedTransferring\\\"]],[33,120]],null],[28,[37,20],[[30,0],\\\"onEndChat\\\"],null],\\\"danger\\\",[28,[37,17],[\\\"purecloud.acdInteraction.endChat\\\"],null]]],[[\\\"default\\\"],[[[[41,[33,120],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin loading-indicator interaction-control-loading-indicator\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"chat-disable\\\"],[15,\\\"screenreader-text\\\",[28,[37,17],[\\\"purecloud.acdInteraction.endChat\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]],[]]]]],[1,\\\"            \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"call-control-end-chat-button\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.endChat\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,8],[[33,2],[33,40]],null],[[[6,[39,27],null,[[\\\"id\\\",\\\"class\\\",\\\"click\\\",\\\"accent\\\",\\\"ariaLabel\\\"],[\\\"call-control-disconnect-workitem-button\\\",\\\"disconnect-task-button\\\",[28,[37,20],[[30,0],\\\"onDisconnectWorkitem\\\"],null],\\\"danger\\\",[28,[37,17],[\\\"purecloud.disconnect\\\"],null]]],[[\\\"default\\\"],[[[[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"custom/regular-clipboard-list-slash\\\"],[15,\\\"screenreader-text\\\",[28,[37,17],[\\\"purecloud.disconnect\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"            \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"call-control-disconnect-workitem-button\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,17],[\\\"purecloud.disconnect\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]]]],[41,[33,121],[[[1,\\\"        \\\"],[10,2],[15,0,[36,122]],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,17],[[33,121,[\\\"text\\\"]]],null]],[1,\\\"\\\\n\\\"],[1,\\\"            \\\"],[1,[28,[35,123],null,[[\\\"class\\\",\\\"endTime\\\"],[[33,124],[33,121,[\\\"value\\\"]]]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]]]],[1,\\\"\\\\n\\\"],[6,[39,125],null,[[\\\"headerIcon\\\",\\\"headerText\\\",\\\"confirmText\\\",\\\"cancelText\\\",\\\"confirm\\\",\\\"cancel\\\",\\\"size\\\",\\\"dangerous\\\",\\\"isOpen\\\"],[\\\"alert-warning-triangle\\\",[28,[37,17],[\\\"purecloud.acdInteraction.takeoverConfirm.title\\\"],null],[28,[37,17],[\\\"purecloud.acdInteraction.takeoverConfirm.confirm\\\"],null],[28,[37,17],[\\\"purecloud.acdInteraction.takeoverConfirm.cancel\\\"],null],[28,[37,20],[[30,0],\\\"onConfirmTakeover\\\"],null],[28,[37,20],[[30,0],\\\"onCancelTakeoverConfirm\\\"],null],\\\"medium\\\",true,[33,126]]],[[\\\"default\\\"],[[[[1,\\\"    \\\"],[10,2],[12],[1,[28,[35,17],[\\\"purecloud.acdInteraction.takeoverConfirm.description\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"\\\\n\\\"],[41,[28,[37,8],[[33,127],[33,128]],null],[[[1,\\\"    \\\"],[1,[28,[35,129],null,[[\\\"connectedTime\\\",\\\"participantUserId\\\",\\\"name\\\",\\\"controlType\\\",\\\"isHeld\\\",\\\"isConfined\\\",\\\"isConfineLoading\\\",\\\"isHoldLoading\\\",\\\"conversationType\\\",\\\"isInteractionActive\\\",\\\"isDisconnectLoading\\\",\\\"isTransferLoading\\\",\\\"isConferenceLoading\\\",\\\"actionConfine\\\",\\\"actionUnconfine\\\",\\\"actionHold\\\",\\\"actionUnhold\\\",\\\"actionDisconnect\\\",\\\"actionTransfer\\\",\\\"actionConference\\\",\\\"actionMergeToConference\\\"],[[33,3,[\\\"consultAgentParticipant\\\",\\\"connectedTime\\\"]],[33,128,[\\\"userId\\\"]],[33,128,[\\\"name\\\"]],[33,130],[33,3,[\\\"isConsultAgentParticipantHeld\\\"]],[33,3,[\\\"isConsultAgentParticipantConfined\\\"]],[33,3,[\\\"isConsultConfineLoading\\\"]],[33,3,[\\\"isHoldLoading\\\"]],[33,3,[\\\"type\\\"]],[33,3,[\\\"isInteractionActive\\\"]],[33,3,[\\\"isConsultDisconnectLoading\\\"]],[33,3,[\\\"isConsultTransferLoading\\\"]],[33,3,[\\\"isConsultConferenceLoading\\\"]],[28,[37,20],[[30,0],\\\"onConsultConfine\\\"],null],[28,[37,20],[[30,0],\\\"onConsultUnconfine\\\"],null],[28,[37,20],[[30,0],\\\"onHold\\\"],null],[28,[37,20],[[30,0],\\\"onHold\\\"],null],[28,[37,20],[[30,0],\\\"onConsultDisconnect\\\"],null],[28,[37,20],[[30,0],\\\"onConsultTransfer\\\"],null],[28,[37,20],[[30,0],\\\"onConsultConference\\\"],null],[28,[37,20],[[30,0],\\\"onMergeToConference\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[10,0],[15,0,[29,[\\\"interaction-grid\\\\n        \\\",[52,[33,131],\\\"collapsed\\\",[52,[33,132],\\\"focused\\\",[28,[37,33],[\\\"panel-size-\\\",[33,133]],null]]],\\\"\\\\n        \\\",[52,[33,134],\\\"contextual-focus-mode\\\"],\\\"\\\\n        \\\",[52,[51,[33,135]],\\\"no-panel\\\"]]]],[12],[1,\\\"\\\\n\\\"],[1,\\\"    \\\"],[10,0],[15,0,[29,[\\\"interaction-content \\\",[52,[28,[37,47],[[33,136],\\\"scripts\\\"],null],\\\"non-call-script vertical-script\\\"],\\\" \\\"]]],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"mainstage-header\\\"],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"mainstage-title\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,137],null,[[\\\"type\\\",\\\"subtype\\\",\\\"engagementSource\\\",\\\"state\\\",\\\"acdEngagementSourcesFT\\\"],[[52,[33,2],\\\"workitem\\\",[33,3,[\\\"type\\\"]]],[33,3,[\\\"subMessageType\\\"]],[33,4],[33,138],[33,24]]]]],[1,\\\"\\\\n                \\\"],[10,\\\"h3\\\"],[14,0,\\\"message-type\\\"],[12],[1,[28,[35,17],[[33,139]],null]],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,0],[14,0,\\\"mainstage-header__action-container\\\"],[12],[1,\\\"\\\\n                \\\"],[11,\\\"button\\\"],[24,1,\\\"mainstage-size-collapse\\\"],[16,0,[29,[\\\"mainstage-header__action-button mainstage-header__collapse-button\\\\n                        \\\",[52,[33,131],\\\"enabled\\\"]]]],[16,\\\"aria-label\\\",[52,[33,131],[28,[37,17],[\\\"common.expand\\\"],null],[28,[37,17],[\\\"common.collapse\\\"],null]]],[16,\\\"aria-pressed\\\",[52,[33,131],\\\"true\\\",\\\"false\\\"]],[24,4,\\\"button\\\"],[4,[38,20],[[30,0],\\\"onToggleMainstageCollapse\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"chevron-double-left\\\"],[15,\\\"screenreader-text\\\",[52,[33,131],[28,[37,17],[\\\"common.expand\\\"],null],[28,[37,17],[\\\"common.collapse\\\"],null]]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"mainstage-size-collapse\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,131],[[[1,\\\"                        \\\"],[1,[28,[35,17],[\\\"common.expand\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[1,[28,[35,17],[\\\"common.collapse\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,8],[[33,140],[28,[37,21],[[33,131]],null]],null],[[[1,\\\"                    \\\"],[11,\\\"button\\\"],[24,1,\\\"mainstage-size-focus-toggle\\\"],[16,\\\"aria-label\\\",[52,[33,141],[28,[37,17],[\\\"purecloud.acdInteraction.mainStageSize.unfocus\\\"],null],[28,[37,17],[\\\"purecloud.acdInteraction.mainStageSize.focus\\\"],null]]],[16,0,[29,[\\\"mainstage-header__action-button\\\\n                            \\\",[52,[33,141],\\\"mainstage-header__collapse-button\\\",\\\"mainstage-header__expand-button\\\"]]]],[24,4,\\\"button\\\"],[4,[38,20],[[30,0],\\\"onToggleMainstageFocus\\\"],null],[12],[1,\\\"\\\\n\\\"],[41,[33,141],[[[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/compress-regular\\\"],[15,\\\"screenreader-text\\\",[28,[37,17],[\\\"purecloud.acdInteraction.mainStageSize.unfocus\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/expand-regular\\\"],[15,\\\"screenreader-text\\\",[28,[37,17],[\\\"purecloud.acdInteraction.mainStageSize.focus\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n\\\\n                    \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"mainstage-size-focus-toggle\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,141],[[[1,\\\"                            \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.mainStageSize.unfocus\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.mainStageSize.focus\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[51,[28,[37,5],[[33,132],[33,131]],null]],[[[41,[33,142],[[[1,\\\"                        \\\"],[10,\\\"button\\\"],[14,1,\\\"mainstage-size-open-new\\\"],[15,0,[29,[\\\"mainstage-header__action-button\\\\n                                \\\",[36,133],\\\"-size-active\\\\n                                \\\",[52,[33,143],\\\"open\\\"]]]],[15,\\\"aria-label\\\",[28,[37,17],[\\\"purecloud.acdInteraction.panelSizerTooltip\\\"],null]],[15,\\\"aria-expanded\\\",[52,[33,143],\\\"true\\\",\\\"false\\\"]],[15,\\\"onclick\\\",[28,[37,20],[[30,0],\\\"onTogglePopover\\\",\\\"showMainstageSizer\\\",\\\"#mainstage-size-popover-new\\\",true],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[15,\\\"icon-name\\\",[29,[[28,[37,144],[[33,145],[33,133]],null]]]],[15,\\\"screenreader-text\\\",[28,[37,17],[\\\"purecloud.acdInteraction.panelSizerTooltip\\\"],null]],[12],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\\n                        \\\"],[10,\\\"gux-tooltip\\\"],[14,1,\\\"mainstage-size-open-tooltip-new\\\"],[14,\\\"for\\\",\\\"mainstage-size-open-new\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.panelSizerTooltip\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\\n                        \\\"],[10,\\\"gux-popover\\\"],[14,1,\\\"mainstage-size-popover-new\\\"],[14,0,\\\"mainstage-size-popover\\\"],[14,\\\"position\\\",\\\"bottom-end\\\"],[14,\\\"for\\\",\\\"mainstage-size-open-new\\\"],[12],[1,\\\"\\\\n\\\"],[6,[39,146],null,[[\\\"containerClass\\\",\\\"ariaLabelledby\\\"],[\\\"mainstage-size-list\\\",\\\"mainstage-size-open-tooltip-new\\\"]],[[\\\"default\\\"],[[[[42,[28,[37,148],[[28,[37,148],[[33,149]],null]],null],null,[[[1,\\\"                                    \\\"],[10,\\\"li\\\"],[14,\\\"role\\\",\\\"option\\\"],[15,\\\"key\\\",[29,[[30,1]]]],[15,1,[29,[[30,1],\\\"-mainstage-size-new\\\"]]],[15,0,[29,[\\\"mainstage-size-btn\\\\n                                            \\\",[30,1],\\\"-size-btn\\\\n                                            \\\",[52,[28,[37,47],[[33,133],[30,1]],null],\\\"active\\\"]]]],[14,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"aria-selected\\\",[29,[[28,[37,47],[[33,133],[30,1]],null]]]],[15,\\\"onclick\\\",[28,[37,20],[[30,0],\\\"sizeMainstage\\\",[30,1]],null]],[15,\\\"onkeydown\\\",[28,[37,20],[[30,0],\\\"sizeMainstageKeydown\\\",[30,1]],null]],[12],[1,\\\"\\\\n                                        \\\"],[10,\\\"gux-icon\\\"],[15,\\\"icon-name\\\",[29,[[28,[37,144],[[33,145],[30,1]],null]]]],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\\n                                        \\\"],[10,1],[12],[1,\\\"\\\\n                                            \\\"],[1,[28,[35,17],[[28,[37,33],[\\\"purecloud.acdInteraction.mainStageSize.\\\",[30,1]],null]],null]],[1,\\\"\\\\n                                        \\\"],[13],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n\\\\n                                    \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[30,1],\\\"-mainstage-size-new\\\"]]],[14,\\\"placement\\\",\\\"right\\\"],[12],[1,\\\"\\\\n                                        \\\"],[1,[28,[35,17],[[28,[37,33],[\\\"purecloud.acdInteraction.mainStageSize.\\\",[30,1]],null]],null]],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null]],[]]]]],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,\\\"button\\\"],[14,1,\\\"mainstage-size-open\\\"],[15,0,[29,[\\\"mainstage-header__action-button \\\",[52,[33,143],\\\"open\\\"]]]],[15,\\\"aria-label\\\",[28,[37,17],[\\\"purecloud.acdInteraction.panelResizerTooltip\\\"],null]],[15,\\\"aria-expanded\\\",[52,[33,143],\\\"true\\\",\\\"false\\\"]],[15,\\\"onclick\\\",[28,[37,20],[[30,0],\\\"onTogglePopover\\\",\\\"showMainstageSizer\\\",\\\"#mainstage-size-popover\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"menu-kebab-vertical\\\"],[15,\\\"screenreader-text\\\",[28,[37,17],[\\\"purecloud.acdInteraction.panelResizerTooltip\\\"],null]],[12],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\\n                        \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"mainstage-size-open\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.panelResizerTooltip\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\\n                        \\\"],[10,\\\"gux-popover\\\"],[14,1,\\\"mainstage-size-popover\\\"],[14,\\\"position\\\",\\\"bottom-end\\\"],[14,\\\"for\\\",\\\"mainstage-size-open\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,143],[[[1,\\\"                                \\\"],[10,0],[14,0,\\\"drop-down mainstage-size\\\"],[12],[1,\\\"\\\\n                                    \\\"],[10,0],[12],[1,\\\"\\\\n                                        \\\"],[10,1],[14,0,\\\"size-label\\\"],[12],[1,\\\"\\\\n                                            \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.mainStageSize.header\\\"],null]],[1,\\\"\\\\n                                        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[42,[28,[37,148],[[28,[37,148],[[33,149]],null]],null],null,[[[1,\\\"                                            \\\"],[10,\\\"button\\\"],[15,1,[29,[[30,2],\\\"-mainstage-size\\\"]]],[15,0,[29,[[30,2],\\\" \\\",[52,[28,[37,47],[[33,133],[30,2]],null],\\\"active\\\"]]]],[15,\\\"onclick\\\",[28,[37,20],[[30,0],\\\"sizeMainstage\\\",[30,2]],null]],[14,\\\"popover-action\\\",\\\"close\\\"],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                                                \\\"],[10,1],[14,0,\\\"sr-only\\\"],[12],[1,\\\"\\\\n                                                    \\\"],[1,[28,[35,17],[[28,[37,33],[\\\"purecloud.acdInteraction.mainStageSize.\\\",[30,2]],null]],null]],[1,\\\"\\\\n                                                \\\"],[13],[1,\\\"\\\\n                                            \\\"],[13],[1,\\\"\\\\n                                            \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[30,2],\\\"-mainstage-size\\\"]]],[12],[1,\\\"\\\\n                                                \\\"],[1,[28,[35,17],[[28,[37,33],[\\\"purecloud.acdInteraction.mainStageSize.\\\",[30,2]],null]],null]],[1,\\\"\\\\n                                            \\\"],[13],[1,\\\"\\\\n\\\"]],[2]],null],[1,\\\"                                    \\\"],[13],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,150],[[[1,\\\"            \\\"],[1,[28,[35,151],null,[[\\\"selectedInteraction\\\"],[[33,3]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,152],[[[1,\\\"            \\\"],[1,[28,[35,153],null,[[\\\"selectedInteraction\\\",\\\"customerName\\\",\\\"hasCustomerJoinedSessionShareRoom\\\",\\\"insertChatText\\\",\\\"useMultipanel\\\"],[[33,3],[33,11],[33,3,[\\\"hasCustomerJoinedSessionShareRoom\\\"]],[28,[37,20],[[30,0],\\\"onInsertChatText\\\"],null],[33,23,[\\\"useMultipanel\\\"]]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,21],[[33,154]],null],[[[1,\\\"            \\\"],[10,0],[15,0,[29,[\\\"interaction-script-container no-headers\\\\n                    \\\",[52,[28,[37,47],[[33,136],\\\"scripts\\\"],null],\\\"non-call\\\",[33,155]],\\\"\\\\n                    \\\",[52,[51,[33,31]],[33,156]]]]],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,157],null,[[\\\"scriptAvailabilityChanged\\\",\\\"selectedInteraction\\\",\\\"isScriptAvailable\\\"],[[33,158],[33,3],[28,[37,20],[[30,0],\\\"isConversationScriptAvailable\\\"],null]]]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,8],[[28,[37,21],[[33,159]],null],[28,[37,5],[[33,119],[33,105]],null]],null],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"interaction-messages\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"external-provider-message\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,2],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,17],[\\\"purecloud.acdInteraction.externalProvider\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,160],[[[1,\\\"            \\\"],[1,[28,[35,161],null,[[\\\"name\\\",\\\"isVisible\\\"],[\\\"conversation-v2\\\",[33,162]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,135],[[[1,\\\"        \\\"],[1,[28,[35,163],null,[[\\\"name\\\",\\\"isVisible\\\"],[\\\"contextual-v2\\\",[28,[37,8],[[28,[37,21],[[33,134]],null],[28,[37,21],[[33,132]],null]],null]]]]],[1,\\\"\\\\n\\\\n\\\"],[1,\\\"        \\\"],[10,0],[15,0,[29,[\\\"sub-panel-wrapper \\\",[52,[33,164],\\\"subpanelWidth\\\"]]]],[12],[1,\\\"\\\\n\\\"],[6,[39,165],null,[[\\\"name\\\",\\\"isVisible\\\"],[\\\"contextual-v2\\\",[28,[37,21],[[33,132]],null]]],[[\\\"default\\\"],[[[[41,[28,[37,21],[[33,154]],null],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"app-carousel-native-view\\\"],[14,\\\"slot\\\",\\\"scripts\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,157],null,[[\\\"scriptAvailabilityChanged\\\",\\\"selectedInteraction\\\",\\\"isScriptAvailable\\\"],[[33,166],[33,3],[28,[37,20],[[30,0],\\\"isContextualScriptAvailable\\\"],null]]]]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13]],[\\\"size\\\",\\\"loopSize\\\"],false,[\\\"acd-interactions-panel-v2/interaction-header\\\",\\\"if\\\",\\\"workitem\\\",\\\"interaction\\\",\\\"engagementSource\\\",\\\"or\\\",\\\"isHeld\\\",\\\"isConfined\\\",\\\"and\\\",\\\"isCallback\\\",\\\"isExternalCampaign\\\",\\\"customerParticipantName\\\",\\\"customerParticipantNameTooltip\\\",\\\"externalContactDivisionName\\\",\\\"acdExternalContactDivNameFT\\\",\\\"acdExternalContactWorkitemsDivNameFT\\\",\\\"connectedTime\\\",\\\"t\\\",\\\"connectedTimeDisplay\\\",\\\"communicationSidebarExpanded\\\",\\\"action\\\",\\\"not\\\",\\\"isPopout\\\",\\\"session\\\",\\\"acdEngagementSourcesFT\\\",\\\"acd-interactions-panel-v2/interaction-header/header-group\\\",\\\"showDialpad\\\",\\\"acd-interactions-panel-v2/interaction-header/header-button\\\",\\\"showDialpadDropdown\\\",\\\"mode-manager/mode-dial-pad\\\",\\\"dial-pad\\\",\\\"isCall\\\",\\\"isConnected\\\",\\\"concat\\\",\\\"muteTooltip\\\",\\\"showHoldButton\\\",\\\"permissions\\\",\\\"isRecordingPaused\\\",\\\"showAgentRequestACWButton\\\",\\\"isLoadingAcwRequest\\\",\\\"isWorkitemConnected\\\",\\\"showWorkitemTransferDropdown\\\",\\\"target-dropdown\\\",\\\"authUser\\\",\\\"excludeBlindTransferFilters\\\",\\\"allowRawDropdownInputSelection\\\",\\\"targetDropdownPlaceholderText\\\",\\\"eq\\\",\\\"unless\\\",\\\"hideTransferButtons\\\",\\\"showTransfer\\\",\\\"isBlindTransferDisabled\\\",\\\"showTransferDropdown\\\",\\\"acd-interactions-panel/interaction-blind-transfer-participant-dropdown\\\",\\\"otherParticipants\\\",\\\"activeParticipantIds\\\",\\\"digitalConsultEnabled\\\",\\\"showConsultTransfer\\\",\\\"showConsultDropdown\\\",\\\"excludeConsultTransferFilters\\\",\\\"includeConsultTransferFilters\\\",\\\"additionalConsultTransferPermissions\\\",\\\"targetDropdownConsultPlaceholderText\\\",\\\"canConsultTransfer\\\",\\\"showConferenceDropdown\\\",\\\"activeConferenceParticipants\\\",\\\"inviteOrWarmInviteConferenceParticipant\\\",\\\"acd-interactions-panel/interaction-conference-roster-dropdown\\\",\\\"acdWarmConferencePhase1FT\\\",\\\"connectedConferenceParticipants\\\",\\\"inviteOrWarmInviteConferenceParticipantHeader\\\",\\\"inviteOrWarmInviteAddButtonIcon\\\",\\\"inviteOrWarmInviteAddButtonTooltip\\\",\\\"inviteOrWarmInviteConferenceParticipantAction\\\",\\\"isWarmInviteCall\\\",\\\"isWarmInviteCallInitiator\\\",\\\"disableMergeToConference\\\",\\\"showAcdVoicemailButton\\\",\\\"showCallbackDialpadDropdown\\\",\\\"addingCallbackNumbers\\\",\\\"hasMultipleCallbackNumbers\\\",\\\"acd-interactions-panel-v2/interaction-header/header-dropdown\\\",\\\"isCallbackNumberDisabled\\\",\\\"callbackNumberOptions\\\",\\\"isCallbackNumberDialing\\\",\\\"hasCallbackNumbers\\\",\\\"defaultCallbackNumberOption\\\",\\\"isDialing\\\",\\\"isPlacingCall\\\",\\\"showSkipCallback\\\",\\\"isSkipCallbackDisabled\\\",\\\"showSessionShareChatOrCall\\\",\\\"sessionShareClassNames\\\",\\\"sessionShareChatOrCallDisabled\\\",\\\"sessionShareStartTooltip\\\",\\\"showCobrowseV2Button\\\",\\\"disableCobrowseV2Button\\\",\\\"webMessagingCobrowseStartTooltip\\\",\\\"showSnippetRecordingButton\\\",\\\"isSnippetRecordingDisabled\\\",\\\"isSnippetRecordingActive\\\",\\\"showAcdVideoButton\\\",\\\"disableAcdVideoButton\\\",\\\"acdVoicemailTooltip\\\",\\\"acdVoicemailPlayerVisible\\\",\\\"isEmail\\\",\\\"showParkEmailButton\\\",\\\"isParking\\\",\\\"isSms\\\",\\\"showParkSMSButton\\\",\\\"showParkSmsDropdown\\\",\\\"park-schedule-popover\\\",\\\"canMessageTakeover\\\",\\\"isTakingOver\\\",\\\"showSmsDisconnectButton\\\",\\\"isEndingSms\\\",\\\"showFinishCallback\\\",\\\"showPhoneDisconnectButton\\\",\\\"phone\\\",\\\"isChat\\\",\\\"isEndingChat\\\",\\\"activeTimerData\\\",\\\"activeTimerClass\\\",\\\"duration-format\\\",\\\"countdownDurationClass\\\",\\\"modal-gux\\\",\\\"showTakeoverConfirmModal\\\",\\\"showConsultControls\\\",\\\"consultControlsParticipant\\\",\\\"acd-interactions-panel-v2/interaction-consult-controls\\\",\\\"consultControlType\\\",\\\"isMainstageCollapsed\\\",\\\"showMainstageFocused\\\",\\\"mainstageSize\\\",\\\"hasContextualFocusModeEnabled\\\",\\\"renderContextualCarousel\\\",\\\"effectivePanelSelection\\\",\\\"acd-interactions-panel-v2/interaction-type-icon\\\",\\\"state\\\",\\\"mainstageTitleKey\\\",\\\"canFocusMainstage\\\",\\\"isMainstageFocused\\\",\\\"newPanelSizerFt\\\",\\\"showMainstageSizer\\\",\\\"get\\\",\\\"mainstageSizeIcons\\\",\\\"roving-tabindex-list\\\",\\\"each\\\",\\\"-track-array\\\",\\\"mainstageSizes\\\",\\\"showAcdVoicemailAudioPlayer\\\",\\\"acd-interactions-panel/interaction-voicemail\\\",\\\"showSessionShare\\\",\\\"acd-interactions-panel/interaction-session-share\\\",\\\"useScripterGadget\\\",\\\"interactionScriptContainerState\\\",\\\"scriptSize\\\",\\\"acd-interactions-panel-v2/interaction-script\\\",\\\"scriptAvailabilityChanged\\\",\\\"isInternalProvider\\\",\\\"appPoolV2\\\",\\\"app-view-stack\\\",\\\"hasConversationAppForCurrInteraction\\\",\\\"app-carousel-toolbar\\\",\\\"resetSubpanelWidth\\\",\\\"app-carousel-view\\\",\\\"contextualScriptAvailabilityChanged\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel-v2/interaction/template.hbs\",\"isStrictMode\":false});","import { inject } from '@ember/service';\nimport {\n    AppDef,\n    WorkerDef,\n    AppLogDetails,\n    AppLogger,\n    AppPool,\n    GcAnalyticsConversationAppContext,\n    GcAppContext,\n    GcConversationAppContext,\n    GcExternalContactAppContext,\n    GcWorkerContext,\n    GcWorkitemAppContext,\n    GroupInstances,\n    GroupState,\n    IframeAppDef,\n    LRU,\n    PoolState,\n    SerializableRecord,\n    TraceLoggerLevel,\n    deepEqualityAppDiffer,\n    toSerializableRecord\n} from '@genesys/apps-v2-host';\nimport {\n    AppCarouselHostLayoutController,\n    AppCarouselHostLayoutTemplate,\n    AppCarouselHostLayoutTemplateItem,\n    AppCarouselHostLayoutTemplateItemSize,\n    AppViewStackHostLayoutController,\n    AppViewStackHostLayoutTemplate,\n    NativeAppDef,\n    isAppCarouselHostLayoutTemplate\n} from '@genesys/apps-v2-host-layout';\nimport { SessionService } from '@web-directory/services';\nimport Ember from 'ember';\nimport { capitalize } from 'web-directory/utils/string-transforms';\nimport { task, timeout } from 'ember-concurrency';\nimport cloneDeep from 'lodash/cloneDeep';\nimport isEqual from 'lodash/isEqual';\nimport sortBy from 'lodash/sortBy';\nimport { INTEGRATIONS_INTERAPPTIONS_PROVIDER_ID } from 'web-directory/app-providers/integration-interapptions-provider';\nimport { INTERAPPTION_COMMUNICATION_TYPE_FILTERS, URL_REPLACEMENTS } from 'web-directory/models/app';\nimport {\n    buildFindInstanceState,\n    buildFindWorkerInstance,\n    createAppsV2SdkHandler\n} from 'web-directory/services/apps-v2-api-handlers/apps-v2-sdk-handler';\nimport { Maybe } from 'web-directory/types';\nimport { mapValidActiveInteractionsToConversations } from 'web-directory/utils/active-interactions-to-conversations';\nimport { getCommunicationType, warnClosureAction } from 'web-directory/utils/acd';\nimport { getQueueIdFromAppContext } from 'web-directory/utils/acd-ts';\nimport { addPageAction } from 'web-directory/utils/newrelic';\nimport {\n    addNativeProvider,\n    standardTransformationFtComputedDepKey,\n    transformPanelId\n} from 'web-directory/utils/transform-panels';\nimport { assertNever, hasKey } from 'web-directory/utils/types';\nimport { isTesting } from 'web-directory/utils/testing';\nimport appUtils, { AppContext } from '../../../utils/apps';\nimport { ScriptState } from '../component';\n\nconst LAYOUT_TEMPLATE_VERSION = 2;\nconst LAYOUT_TEMPLATE_SETTINGS_NAMESPACE = `panelManagerLayoutTemplateV${LAYOUT_TEMPLATE_VERSION}`;\n\nconst appGroupKeys = ['conversation', 'contextual'] as const;\ntype AppGroupKey = (typeof appGroupKeys)[number];\n\ntype AppCarouselLayoutTemplateMap = Record<string, AppCarouselHostLayoutTemplate>;\n\nconst PROFILE_PANEL_APP_ID = 'external-contact-acd-profile-panel';\nconst PROFILE_PANEL_PROVIDER_ID = 'builtInExternalContactsInterapptionsProvider';\nconst TASK_MANAGEMENT_APP_ID = 'workitemStatusGadget';\nconst TASK_MANAGEMENT_PROVIDER_ID = 'workitemStatusGadgetProvider';\nconst NOTES_GADGET_APP_ID = 'notesGadget';\nconst NOTES_GADGET_PROVIDER_ID = 'notesGadgetProvider';\n\nexport type ResolvedApp = {\n    compositeId: string;\n    appDefId: string;\n    providerId: string;\n    interactionId: string;\n    /** The media/communication type used for composite IDs and pool grouping (e.g. 'call', 'email', 'workitem', 'analyticsConversation'). */\n    interactionType: string;\n    /** The originating AppContext.type that triggered the provider request (e.g. 'conversation', 'workitem', 'analyticsConversation'). */\n    appContextType: AppContext['type'];\n    appGroupKey: AppGroupKey;\n    appDef: AppDef;\n};\n\ntype NativeApp = {\n    matchesInteraction: (appContext: AppContext) => boolean;\n    appDef: NativeAppDef;\n    availableSizes?: AppCarouselHostLayoutTemplateItemSize[];\n    canUseFocusMode?: boolean;\n};\n\ntype AppGroup = {\n    apps: ResolvedApp[];\n};\n\ntype InteractionAppGroup = {\n    selected: boolean;\n    groups: Record<AppGroupKey, AppGroup>;\n};\n\ntype InteractionAppGroups = Record<string, InteractionAppGroup>;\n\ntype AppsUpdateCallback = (updatedApps: any[]) => void;\nexport type AppProvider = {\n    id: string;\n    type: 'programmatic';\n    group?: AppGroupKey;\n    trustedProvider?: boolean;\n    monitorInteractionUpdates?: boolean;\n    getAppConfigs: (interaction: AppContext, callback?: AppsUpdateCallback) => Promise<any[]>;\n    interactionRemoved?: (interaction: AppContext) => void;\n    getAvailableAppSizes?: (appDefId: string) => undefined | AppCarouselHostLayoutTemplateItemSize[];\n    getCanUseFocusMode?: (appDefId: string) => boolean;\n    getAppGroup?: (appDef: AppDef) => AppGroupKey | undefined;\n};\n\nexport type WorkerProvider = {\n    id: string;\n    trustedProvider?: boolean;\n    monitorInteractionUpdates?: boolean;\n    getWorkerConfig: () => WorkerDef;\n};\n\ntype IssuedAppRequest = {\n    providerId: string;\n    // interactionKey equates to workitem|id-type and contains some duplication with interactionId for conversations\n    // However, different filtering/clean-up purposes require different values\n    interactionId: string;\n    interactionKey: string;\n    appContextType: AppContext['type'];\n    request: Promise<{ appConfigs: unknown[] }>;\n    requestId: string;\n};\ntype IssuedAppRequestSearchQuery = Partial<\n    Pick<IssuedAppRequest, 'providerId' | 'interactionId' | 'interactionKey' | 'appContextType' | 'requestId'>\n>;\n\nexport type InterapptionProviderAppDef = AppDef & {\n    compositeId: string;\n    providerId: string;\n};\n\ntype ContextualLayoutTemplateContext = {\n    persistenceFocusAppDefId: string | undefined;\n    persistenceAppDefIdIgnoreList: Set<string>;\n    preservePersistenceFocusOnNextExit: boolean;\n};\n\nconst { Component, computed, observer, get, guidFor, typeOf, isBlank, RSVP, run } = Ember;\nconst OUT_OF_DATE_ASYNC_PROVIDER_RESPONSE = 'outOfDateAsyncProviderResponse';\n\nconst defaultMetadataReporterConfig = {\n    initialReportDelay: 30000,\n    reportInterval: 300000,\n    shouldSendInitial: true,\n    shouldSendPeriodic: true\n};\n\n// For now, we'll use the native panel ids for any native panels being converted to providers.\n// Once they're fully converted to gadgets, we can switch over to those ids.\nconst appSortPriority: Record<string, number> = {\n    // Canned Responses\n    [addNativeProvider('responses')]: 204,\n    // Conversation Details\n    'conversation-details&conversationDetailsInterapptionsProvider': 201,\n    // Profile\n    'external-contact-acd-profile-panel&builtInExternalContactsInterapptionsProvider': 202,\n    // Customer Journey\n    'agent-narrow-composite-journey-gadget&builtInHolisticJourneyInterapptionsProvider': 203,\n    //Notes\n    'notesGadget&notesGadgetProvider': 205,\n    //Wrapup\n    'wrapupCodesGadget&wrapupCodesGadgetProvider': 207,\n    // Scripter\n    [addNativeProvider('scripts')]: 200,\n    // Manually adding in the sort location for provider-based scripter to ensure we\n    // have a mapping for workitem scripter since 'scripts[&native]' will not be transformed if\n    // only workitem scripter gadgets are enabled.\n    'scripts&scriptsProvider': 200,\n    // Schedule Callback\n    'scheduleCallbackGadget&scheduleCallbackGadgetProvider': 206\n};\n\nexport default Component.extend({\n    classNames: ['interapptions-manager-v2'],\n\n    // Injections\n    application: inject('application'),\n    session: inject('session'),\n    intl: inject('intl'),\n    logger: inject('stash-logger'),\n    streaming: inject('streaming'),\n    appsService: inject('apps'),\n    alerting: inject('alerting'),\n    notification: inject('notification'),\n    storage: inject('storage'),\n    permissions: inject('permissions'),\n    acdinitialization: inject('acdinitialization'),\n    // Attributes\n    useAppsV2ConversationInterapptionManager: false as Maybe<boolean>,\n    appProviders: [] as Maybe<AppProvider[]>,\n    workerProviders: [] as Maybe<WorkerProvider[]>,\n    activeInteractions: [] as Maybe<AppContext[]>,\n    selectedInteraction: null as Maybe<AppContext>,\n    defaultPanelSettings: {} as Record<string, string | undefined>,\n    forcedPanelSelectionMap: {} as Record<string, string[]>,\n    contextualInteractionScriptStateMap: {} as Record<string, ScriptState>,\n    contextualLayoutTemplates: new Map() as Map<string, AppCarouselHostLayoutTemplate>,\n    contextualLayoutTemplateContextMap: new Map() as Map<string, ContextualLayoutTemplateContext>,\n    useScripterGadget: false as Maybe<boolean>,\n    notesHistoryLength: 0,\n    agentPanelIsActive: false as Maybe<boolean>,\n    // Exposed for testing.  Not intended to be set externally.\n    _metadataReporterConfig: { ...defaultMetadataReporterConfig },\n    // Timer handle for the initial telemetry report scheduled in init().\n    _telemetryTimer: null as ReturnType<typeof run.later> | null,\n    // Timer handles for pending auto-open/auto-scroll action timers from _triggerLayoutActions.\n    _pendingActionTimers: null as ReturnType<typeof run.later>[] | null,\n    // State\n    appPoolV2: null as AppPool | null,\n    _poolState: null as Maybe<PoolState>,\n    resolvedApps: [] as ResolvedApp[],\n    attentionCountPerCompositeId: {} as Record<string, number>,\n    _viewStackConversationController: null as AppViewStackHostLayoutController | null,\n    _carouselContextualController: null as AppCarouselHostLayoutController | null,\n    _issuedAppRequests: [] as IssuedAppRequest[],\n    ephemeralCarouselLayoutTemplateMap: {} as Record<string, AppCarouselHostLayoutTemplate>,\n    persistentCarouselLayoutTemplateMap: {} as Record<string, AppCarouselHostLayoutTemplate>,\n    visibleAppDefIds: new Map() as Map<string, string[]>,\n    autoScrollActions: new Map() as Map<string, string>,\n    autoOpenActions: new Map() as Map<string, string[]>,\n    hasLoadedPersistentCarouselLayoutTemplateMap: false,\n    hasContextualFocusModeEnabled: false,\n    disposables: [] as Array<() => void>,\n    // Previous State\n    _prevAppProviders: [] as null | AppProvider[],\n    _prevActiveInteractions: null as null | AppContext[],\n    _prevRawActiveInteractions: {} as Record<string, unknown>,\n    _prevSelectedInteraction: null as Maybe<AppContext>,\n    _prevForcedPanelSelectionMap: {} as Record<string, string[]>,\n    _prevContextualInteractionScriptStateMap: {} as Record<string, ScriptState>,\n    _prevContextualLayoutTemplates: new Map() as Map<string, AppCarouselHostLayoutTemplate>,\n    _prevAgentPanelIsActive: false as Maybe<boolean>,\n    // Derived\n    enableFocusMode: computed.reads('session.features.PURE-6790_enableFocusMode'),\n    authUser: computed.reads('session.publicApiUser'),\n    _validAppGroupKeys: computed('useAppsV2ConversationInterapptionManager', function (): Array<AppGroupKey> {\n        const res: AppGroupKey[] = ['contextual'];\n        if (this.get('useAppsV2ConversationInterapptionManager')) {\n            res.push('conversation');\n        }\n        return res;\n    }),\n    validActiveInteractions: computed('activeInteractions.[]', function (): Array<AppContext> {\n        const activeInteractions = this.get('activeInteractions');\n        if (!Array.isArray(activeInteractions)) {\n            return [];\n        }\n        return activeInteractions.filter(curr => appUtils.isAppContext(curr) && curr.id.trim());\n    }),\n    // list of valid appProviders filtered from appProviders\n    _validAppProviders: computed('appProviders.[]', function (): AppProvider[] {\n        const appProviders = this.get('appProviders');\n\n        if (!appProviders || !Array.isArray(appProviders)) {\n            return [];\n        }\n\n        const validAppProviders: AppProvider[] = [];\n        if (appProviders && typeOf(appProviders) === 'array') {\n            appProviders.reduce<AppProvider[]>((result, currProvider) => {\n                if (isValidAppProvider(currProvider)) {\n                    result.push(currProvider);\n                } else {\n                    this.get('logger').error(\n                        appUtils.buildInterapptionsLogMsg('Invalid App Provider passed to interapptions manager'),\n                        {\n                            appProvider: currProvider,\n                            remoteData: {\n                                providerId: Ember.get(currProvider, 'id')\n                            }\n                        }\n                    );\n                }\n\n                return result;\n            }, validAppProviders);\n        }\n\n        return validAppProviders;\n    }),\n    interactionAppGroups: computed(\n        '_validAppGroupKeys',\n        'contextualInteractionScriptStateMap',\n        'resolvedApps',\n        'validActiveInteractions',\n        'selectedInteraction',\n        function (): InteractionAppGroups {\n            // Remove group checks once both pools are GA'd\n            const validAppGroupKeys = this.get('_validAppGroupKeys') as AppGroupKey[];\n            const includeConversationGroup = validAppGroupKeys.includes('conversation');\n            const includeContextualGroup = validAppGroupKeys.includes('contextual');\n\n            const res: InteractionAppGroups = {};\n            const resolvedApps: ResolvedApp[] = this.get('resolvedApps');\n            const validActiveInteractions: AppContext[] = this.get('validActiveInteractions');\n            const selectedInteraction: AppContext | null = this.get('selectedInteraction') || null;\n            for (const validActiveInteraction of validActiveInteractions) {\n                const interactionKey = computeInteractionKey(\n                    validActiveInteraction.id,\n                    getInteractionType(validActiveInteraction)\n                );\n                const conversationGroup: AppGroup = {\n                    apps: includeConversationGroup\n                        ? resolvedApps.filter(\n                              ({ interactionId, interactionType, appGroupKey }) =>\n                                  appGroupKey === 'conversation' &&\n                                  interactionKey === computeInteractionKey(interactionId, interactionType)\n                          )\n                        : []\n                };\n                const contextualGroup: AppGroup = {\n                    apps: includeContextualGroup\n                        ? resolvedApps.filter(\n                              ({ interactionId, interactionType, appGroupKey }) =>\n                                  appGroupKey === 'contextual' &&\n                                  interactionKey === computeInteractionKey(interactionId, interactionType)\n                          )\n                        : []\n                };\n                const interactionAppGroup: InteractionAppGroup = {\n                    selected: selectedInteraction\n                        ? computeInteractionKey(selectedInteraction.id, getInteractionType(selectedInteraction)) ===\n                          interactionKey\n                        : false,\n                    groups: {\n                        conversation: conversationGroup,\n                        contextual: contextualGroup\n                    }\n                };\n                res[interactionKey] = interactionAppGroup;\n            }\n            return res;\n        }\n    ),\n    hasConversationAppForCurrInteraction: computed('interactionAppGroups', 'selectedInteraction', function (): boolean {\n        let hasConversationAppForCurrInteraction = false;\n        const selectedInteraction = this.get('selectedInteraction');\n        if (selectedInteraction) {\n            const interactionKey = computeInteractionKey(\n                selectedInteraction.id,\n                getInteractionType(selectedInteraction)\n            );\n            const interactionAppGroups: InteractionAppGroups = this.get('interactionAppGroups');\n            const interactionAppGroup: InteractionAppGroup = interactionAppGroups[interactionKey];\n            if (interactionAppGroup) {\n                hasConversationAppForCurrInteraction = interactionAppGroup.groups.conversation.apps.length > 0;\n            }\n        }\n        return hasConversationAppForCurrInteraction;\n    }),\n    orgDefaultPanelSettings: computed('validActiveInteractions', 'defaultPanelSettings', function () {\n        const res: Record<string, string> = {};\n        const settings = this.get('defaultPanelSettings');\n        const validActiveInteractions: AppContext[] = this.get('validActiveInteractions');\n        for (const validActiveInteraction of validActiveInteractions) {\n            const interactionKey = computeInteractionKey(\n                validActiveInteraction.id,\n                getInteractionType(validActiveInteraction)\n            );\n            const mediaType = getInteractionType(validActiveInteraction);\n            if (mediaType in settings) {\n                const { type, panelId } = settings[mediaType];\n                res[interactionKey] =\n                    type === 'Integration' ? [panelId, INTEGRATIONS_INTERAPPTIONS_PROVIDER_ID].join('&') : panelId;\n            }\n        }\n        return res;\n    }),\n    initialPanelSelection: computed('interactionAppGroups', 'orgDefaultPanelSettings', function () {\n        const res: Record<string, string> = {};\n        const orgDefaultPanelSettings = this.get('orgDefaultPanelSettings');\n        const interactionAppGroups: InteractionAppGroups = this.get('interactionAppGroups');\n        for (const [\n            interactionKey,\n            {\n                groups: {\n                    contextual: { apps }\n                }\n            }\n        ] of Object.entries(interactionAppGroups)) {\n            const tokens = computeTokensFromInteractionKey(interactionKey);\n            if (tokens) {\n                if (orgDefaultPanelSettings[interactionKey]) {\n                    res[interactionKey] = orgDefaultPanelSettings[interactionKey];\n                } else {\n                    if (\n                        apps.some(\n                            ({ appDefId }) =>\n                                appDefId ===\n                                computeInterapptionCompositeId(\n                                    tokens.interactionId,\n                                    tokens.interactionType,\n                                    PROFILE_PANEL_APP_ID,\n                                    PROFILE_PANEL_PROVIDER_ID\n                                )\n                        )\n                    ) {\n                        // Profile Panel\n                        res[interactionKey] = [PROFILE_PANEL_APP_ID, PROFILE_PANEL_PROVIDER_ID].join('&');\n                    } else if (\n                        apps.some(\n                            ({ appDefId }) =>\n                                appDefId ===\n                                computeInterapptionCompositeId(\n                                    tokens.interactionId,\n                                    tokens.interactionType,\n                                    TASK_MANAGEMENT_APP_ID,\n                                    TASK_MANAGEMENT_PROVIDER_ID\n                                )\n                        )\n                    ) {\n                        // Task Management\n                        res[interactionKey] = [TASK_MANAGEMENT_APP_ID, TASK_MANAGEMENT_PROVIDER_ID].join('&');\n                    }\n                }\n            }\n        }\n        return res;\n    }),\n    nativeApps: computed('contextualInteractionScriptStateMap', 'useScripterGadget', function (this: any): NativeApp[] {\n        const res: NativeApp[] = [\n            // Scripter\n            {\n                matchesInteraction: appContext => {\n                    if (appContext.type !== 'conversation') {\n                        return false;\n                    }\n                    const hasGadgetReplacement = this.get('useScripterGadget');\n                    const contextualInteractionScriptStateMap: Record<string, ScriptState> = this.get(\n                        'contextualInteractionScriptStateMap'\n                    );\n                    const hasScriptAvailable = contextualInteractionScriptStateMap[appContext.id]?.scriptAvailable;\n                    const isInConsult =\n                        appContext.payload.get('iAmConsultInitiator') &&\n                        appContext.payload.get('isThereAConsultAgentParticipant');\n                    const myselfIsMonitorV2 = appContext.payload.get('myselfIsMonitorV2');\n                    const isChat = appContext.payload.get('isChat');\n                    const isEmail = appContext.payload.get('isEmail');\n                    const isSms = appContext.payload.get('isSms');\n                    return (\n                        !hasGadgetReplacement &&\n                        hasScriptAvailable &&\n                        (isChat || isSms || isEmail) &&\n                        !isInConsult &&\n                        !myselfIsMonitorV2\n                    );\n                },\n                appDef: {\n                    type: 'native',\n                    id: 'scripts',\n                    slot: 'scripts',\n                    displayName: this.get('intl').t('purecloud.acdInteraction.scripts'),\n                    monochromicIcon: {\n                        type: 'sparkV3SvgSprite',\n                        classNames: ['scripter']\n                    }\n                },\n                availableSizes: ['small', 'medium', 'large', 'xlarge'],\n                canUseFocusMode: true\n            }\n        ];\n        return res;\n    }),\n    nativeAppDefs: computed('nativeApps', 'validActiveInteractions', function () {\n        const nativeApps: NativeApp[] = this.get('nativeApps');\n        const validActiveInteractions: AppContext[] = this.get('validActiveInteractions');\n        return validActiveInteractions.flatMap(activeInteraction => {\n            const res: NativeAppDef[] = [];\n            for (const { appDef, matchesInteraction } of nativeApps) {\n                if (matchesInteraction(activeInteraction)) {\n                    res.push({\n                        ...appDef,\n                        id: computeInterapptionCompositeId(\n                            activeInteraction.id,\n                            getInteractionType(activeInteraction),\n                            appDef.id,\n                            'native'\n                        )\n                    });\n                }\n            }\n            return res;\n        });\n    }),\n    carouselLayoutTemplateMap: computed(\n        'ephemeralCarouselLayoutTemplateMap',\n        'persistentCarouselLayoutTemplateMap',\n        function () {\n            return {\n                ...this.get('ephemeralCarouselLayoutTemplateMap'),\n                ...this.get('persistentCarouselLayoutTemplateMap')\n            };\n        }\n    ),\n    currentTelemetryMetadata: computed(\n        'validActiveInteractions',\n        '_poolState',\n        'selectedInteraction',\n        function (): ReturnType<typeof getTelemetryMetadata> {\n            return getTelemetryMetadata({\n                interactions: this.get('validActiveInteractions'),\n                poolState: this.get('_poolState') ?? undefined,\n                selectedInteraction: this.get('selectedInteraction')\n            });\n        }\n    ),\n    // Observers\n    // This observer helps a lot with code readability as it provides a unique place where we update the AppPool\n    // When one of \"interactionAppGroups\" dependencies is updated, namely \"resolvedApps\", \"validActiveInteractions\" or \"selectedInteraction\"\n    // The interaction groups are updated and we need to update pool definitions\n    interactionAppGroupsObserver: observer('appPoolV2', 'interactionAppGroups', function (this: any) {\n        if (isTesting || this.isDestroying || this.isDestroyed) {\n            return;\n        }\n        this.get('_updateManagerState').perform();\n    }),\n    // Actions\n    onAppPoolReady: (appPoolV2: AppPool) => warnClosureAction('onAppPoolReady', { appPoolV2 }),\n    onAppAttentionCountChanged: (attentionCountPerCompositeId: Record<string, number>) =>\n        warnClosureAction('onAppAttentionCountChanged', { attentionCountPerCompositeId }),\n    onHasConversationAppForCurrInteractionChanged: (hasConversationAppForCurrInteraction: boolean) =>\n        warnClosureAction('onHasConversationAppForCurrInteractionChanged', { hasConversationAppForCurrInteraction }),\n    onVisibleContextualAppsForCurrInteractionChanged: (visibleContextualAppsForCurrInteraction: string[]) =>\n        warnClosureAction('onVisibleContextualAppsForCurrInteractionChanged', {\n            visibleContextualAppsForCurrInteraction\n        }),\n    onHasContextualFocusModeEnabledChanged: (hasContextualFocusModelEnabled: boolean) =>\n        warnClosureAction('onHasContextualFocusModeEnabledChanged', { hasContextualFocusModelEnabled }),\n    onAppsForcedOpen: (appDefIds: string[]) => warnClosureAction('onAppsForcedOpen', { appDefIds }),\n    insertChatText: (text: string) => warnClosureAction('insertChatText', { text }),\n    insertSmsText: (response: { strippedText?: string; structuredMessage?: string }) =>\n        warnClosureAction('insertSmsText', { response }),\n    insertEmailText: (text: string) => warnClosureAction('insertEmailText', { text }),\n    /**\n     * @Action\n     * Builds and validates Interapptions from the provided config.\n     */\n    buildValidInterapption: (typeId: string, id: string, config: any, trustedProvider?: boolean) =>\n        warnClosureAction('buildValidInterapption', { typeId, id, config, trustedProvider }),\n\n    init() {\n        this._super(...arguments);\n\n        // Get computed property to start observable (skip in tests — observer triggers AppPool interaction)\n        if (!isTesting) {\n            this.get('interactionAppGroups');\n        }\n\n        // Inject telemetry metadata into any logger calls\n        const withTelemetryMetadata = (details?: AppLogDetails): AppLogDetails => {\n            if (this.isDestroyed || this.isDestroying) return new AppLogDetails({ ...details?.getLogs() });\n            return new AppLogDetails({ ...details?.getLogs() }).addRemote(this.get('currentTelemetryMetadata'));\n        };\n\n        const logToStashLogger = this.get('_logToStashLogger').bind(this);\n        const logger: AppLogger = {\n            info: (msg: string, details?: AppLogDetails) => {\n                logToStashLogger('info', msg, withTelemetryMetadata(details));\n            },\n            debug: (msg: string, details?: AppLogDetails) => {\n                logToStashLogger('debug', msg, withTelemetryMetadata(details));\n            },\n            warn: (msg: string, details?: AppLogDetails) => {\n                logToStashLogger('warn', msg, withTelemetryMetadata(details));\n            },\n            error: (msg: string, details?: AppLogDetails) => {\n                logToStashLogger('error', msg, withTelemetryMetadata(details));\n            }\n        };\n        const workers = [];\n        const workerProviders = this.get('workerProviders') || [];\n        const retryForAppsV2Workers = this.get('session')?.get('features')?.['AURA-1668_retryForAppsV2Workers'];\n        const keepaliveForAppsV2Workers = this.get('session')?.get('features')?.['AURA-1810_keepaliveForAppsV2Workers'];\n        for (const wp of workerProviders) {\n            const workerConfig = wp?.getWorkerConfig();\n            if (workerConfig) {\n                if (!retryForAppsV2Workers) {\n                    if (!workerConfig.lifecycleConfig) {\n                        workerConfig.lifecycleConfig = {};\n                    }\n                    //TODO: Remove the casting to any here when new version of AppsV2 is pushed in WD, including AURA-1659\n                    (workerConfig.lifecycleConfig as any).loadMaxRetries = 0;\n                }\n                if (!keepaliveForAppsV2Workers) {\n                    if (!workerConfig.lifecycleConfig) {\n                        workerConfig.lifecycleConfig = {};\n                    }\n                    //TODO: Remove the casting to any here when new version of AppsV2 is pushed in WD, including AURA-1650\n                    if (!(workerConfig.lifecycleConfig as any).keepAlive) {\n                        (workerConfig.lifecycleConfig as any).keepAlive = {};\n                    }\n                    (workerConfig.lifecycleConfig as any).keepAlive.enabled = false;\n                }\n                workers.push(workerConfig);\n                logger.debug(\n                    `[AppsV2Worker] displayName: ${workerConfig.displayName || ''} - src: ${workerConfig.src || ''}`\n                );\n            }\n        }\n\n        // Skip AppPool creation and layout controller setup in test environments —\n        // @genesys/apps-v2-host-layout uses requestAnimationFrame which prevents settled() from resolving.\n        // Worker config processing above (which tests verify) still runs.\n        if (isTesting) {\n            this.set('resolvedApps', []);\n            this.set('attentionCountPerCompositeId', {});\n            this.set('forcedPanelSelectionMap', {});\n            this.set('contextualInteractionScriptStateMap', {});\n            this.set('_prevAppProviders', null);\n            this.set('_prevActiveInteractions', null);\n            this.set('_prevRawActiveInteractions', {});\n            this.set('_prevSelectedInteraction', null);\n            this.set('_issuedAppRequests', []);\n            this.set('_prevForcedPanelSelectionMap', {});\n            this.set('_prevContextualInteractionScriptStateMap', {});\n            this.set('_prevContextualLayoutTemplates', new Map());\n            this.set('ephemeralCarouselLayoutTemplateMap', {});\n            this.set('persistentCarouselLayoutTemplateMap', {});\n            this.set('autoScrollActions', new Map());\n            this.set('autoOpenActions', new Map());\n            this.set('visibleAppDefIds', new Map());\n            this.set('contextualLayoutTemplateContextMap', new Map());\n            this.set('hasLoadedPersistentCarouselLayoutTemplateMap', true);\n            return;\n        }\n\n        // Initialize Attributes (Avoid the prototype)\n        const appPoolV2 = new AppPool(\n            {},\n            {\n                poolId: 'appPoolV2',\n                hostAppName: 'web-directory',\n                hostAppVersion: this.get('application').get('semver') || 'unknown',\n                maxPoolSize: 50,\n                evictApp: this.get('_evictApp').bind(this),\n                appDiffer: deepEqualityAppDiffer,\n                allowedSandboxValues: [\n                    'allow-forms',\n                    'allow-modals',\n                    'allow-popups',\n                    'allow-presentation',\n                    'allow-same-origin',\n                    'allow-scripts',\n                    'allow-downloads'\n                ],\n                allowedPermissionsPolicyValues: [\n                    'camera',\n                    'clipboard-write',\n                    'display-capture',\n                    'fullscreen',\n                    'geolocation',\n                    'microphone',\n                    'autoplay',\n                    'local-network',\n                    'loopback-network',\n                    'local-network-access'\n                ],\n                telemetryAgent: {\n                    addTelemetryEvent: (name, attributes) => {\n                        if (this.isDestroyed || this.isDestroying) return;\n                        // Attempt to remove the interaction precision so we can aggregate on appName\n                        let appName = undefined;\n                        if (\n                            attributes &&\n                            hasKey(attributes, 'appDefId') &&\n                            typeof attributes.appDefId === 'string' &&\n                            hasKey(attributes, 'groupId') &&\n                            typeof attributes.groupId === 'string'\n                        ) {\n                            const { appDefId, groupId } = attributes;\n                            const groupTokens = groupId.split(':');\n                            if (groupTokens.length === 3) {\n                                const interactionContext = groupTokens.slice(0, 2).join('&');\n                                if (appDefId.startsWith(interactionContext)) {\n                                    appName = appDefId.slice(interactionContext.length + 1);\n                                }\n                            }\n                        }\n                        // Ensure the telemetry metadata is serializable\n                        const serializableTelemetryMetadata = Object.entries(\n                            this.get('currentTelemetryMetadata')\n                        ).reduce<Record<string, string | number>>((acc, [key, value]) => {\n                            if (typeof value === 'number') {\n                                acc[key] = value;\n                            }\n                            return acc;\n                        }, {});\n                        this._addPageAction(name, {\n                            ...attributes,\n                            ...serializableTelemetryMetadata,\n                            ...(name === 'clientAppInteractionV2' ? { appDisplayType: 'interactionWidget' } : {}),\n                            // appName is reserved by NR\n                            ...(appName ? { gcAppName: appName } : {})\n                        });\n                    }\n                },\n                logger,\n                getBootstrapData: (appDef: AppDef, groupId: string): SerializableRecord => {\n                    if (appDef.type === 'iframe' && !appDef.trustedDataPassing) {\n                        return {};\n                    }\n\n                    const { application, intl, session } = this.getProperties(['application', 'intl', 'session']);\n                    const basicContext: GcAppContext = {\n                        type: 'gcApp',\n                        langTag: intl.get('isoLocale') || 'en-us',\n                        accessToken: session.get('accessToken') || '',\n                        userId: session.get('user')?.id || '',\n                        envName: application.get('runtime').name\n                    };\n\n                    const tokens = computeTokensFromGroupId(groupId);\n                    if (!tokens) {\n                        // Unknown groupId; shouldn't happen, but returning the best we have\n                        return basicContext;\n                    }\n\n                    const interaction = this.get('validActiveInteractions').find(\n                        curr => tokens.interactionId === curr.id && tokens.interactionType === getInteractionType(curr)\n                    );\n\n                    if (interaction && interaction.type === 'conversation') {\n                        const gcConversationAppContext: GcConversationAppContext = {\n                            ...basicContext,\n                            type: 'conversation',\n                            conversationId: interaction.id,\n                            displayMode: 'interactive',\n                            conversation: hasKey(interaction.payload, '__interaction_metadata__')\n                                ? (interaction.payload.__interaction_metadata__ as any)\n                                : {\n                                      id: interaction.id\n                                  }\n                        };\n                        return gcConversationAppContext;\n                    }\n\n                    if (interaction && interaction.type === 'workitem') {\n                        const gcWorkitemAppContext: GcWorkitemAppContext = {\n                            ...basicContext,\n                            type: 'workitem',\n                            workitemId: interaction.id,\n                            workitem: toSerializableRecord(interaction.payload.workitem)\n                        };\n                        return gcWorkitemAppContext;\n                    }\n\n                    if (interaction && interaction.type === 'externalContact') {\n                        if (!interaction.id) {\n                            throw new Error('ExternalContactAppContext.id must be the external contact ID');\n                        }\n                        const gcExternalContactAppContext: GcExternalContactAppContext = {\n                            ...basicContext,\n                            type: 'externalContact',\n                            externalContactId: interaction.id\n                        };\n                        return gcExternalContactAppContext;\n                    }\n\n                    if (interaction && interaction.type === 'analyticsConversation') {\n                        if (!interaction.id) {\n                            throw new Error('AnalyticsConversationAppContext.id must be the conversation ID');\n                        }\n                        const gcAnalyticsConversationAppContext: GcAnalyticsConversationAppContext = {\n                            ...basicContext,\n                            type: 'analyticsConversation',\n                            conversationId: interaction.id,\n                            ...(interaction.payload ? { conversation: toSerializableRecord(interaction.payload) } : {})\n                        };\n                        return gcAnalyticsConversationAppContext;\n                    }\n\n                    // Unknown context; shouldn't happen, but returning the best we have\n                    return basicContext;\n                },\n                getSdkTelemetryDetails: () => {\n                    return {\n                        appDisplayType: 'interactionWidget',\n                        selectedInteractionId: this.get('selectedInteraction')?.id || 'none'\n                    };\n                },\n                defaultTimeouts: {\n                    bootstrapReadyTimeoutMillis: 15000,\n                    bootstrapTimeoutMillis: 15000,\n                    loadTimeoutMillis: 15000,\n                    stopTimeoutMillis: 15000\n                }\n            },\n            {\n                workers: workers,\n                config: {\n                    getBootstrapWorkerData: async (): Promise<SerializableRecord> => {\n                        const { application, intl, session } = this.getProperties(['application', 'intl', 'session']);\n                        const result: GcWorkerContext = {\n                            type: 'worker',\n                            langTag: intl.get('isoLocale') || 'en-us',\n                            envName: application.get('runtime').name,\n                            accessToken: session.get('accessToken') || '',\n                            userId: session.get('user')?.id || ''\n                        };\n                        return result;\n                    },\n                    computeGroupId: (conversationId: string, group: string): string => {\n                        const activeInteractions = this.get('activeInteractions');\n                        // Filtering out analyticsConversation until we add support for it\n                        // ATEAM-2223: Add support for analyticsConversation\n                        const interaction = activeInteractions?.find(\n                            i => i.id === conversationId && i.type !== 'analyticsConversation'\n                        );\n                        return interaction && ['conversation', 'contextual'].includes(group)\n                            ? computeGroupId(interaction.id, getInteractionType(interaction), group as AppGroupKey)\n                            : '';\n                    },\n                    computeAppDefId: (conversationId: string, appDefId: string, providerId: string): string => {\n                        const activeInteractions = this.get('activeInteractions');\n                        // Filtering out analyticsConversation until we add support for it\n                        // ATEAM-2223: Add support for analyticsConversation\n                        const interaction = activeInteractions?.find(\n                            i => i.id === conversationId && i.type !== 'analyticsConversation'\n                        );\n                        return interaction\n                            ? [interaction.id, getInteractionType(interaction), appDefId, providerId].join('&')\n                            : '';\n                    }\n                }\n            }\n        );\n        appPoolV2.addMessageListener(\n            createAppsV2SdkHandler({\n                getSelectedInteraction: () => this.get('selectedInteraction') || null,\n                findInstanceState: buildFindInstanceState(appPoolV2),\n                findWorkerInstance: buildFindWorkerInstance(appPoolV2),\n                openPanel: (panelId: string) => {\n                    const transformedPanelId = addNativeProvider(\n                        transformPanelId(panelId, this.get('session').get('features'))\n                    );\n                    const selectedInteraction = this.get('selectedInteraction');\n                    if (selectedInteraction) {\n                        const groupId = computeGroupId(\n                            selectedInteraction.id,\n                            getInteractionType(selectedInteraction),\n                            'contextual'\n                        );\n                        this._removePersistenceAppDefIdIgnoreList(groupId, [transformedPanelId]);\n                        this._openPanels(selectedInteraction, [transformedPanelId]);\n                    }\n                },\n                getActiveConversationGroupId: () => {\n                    const selectedInteraction = this.get('selectedInteraction');\n                    return selectedInteraction\n                        ? computeGroupId(\n                              selectedInteraction.id,\n                              getInteractionType(selectedInteraction),\n                              'conversation'\n                          )\n                        : null;\n                },\n                sendMessageToGroup: appPoolV2.sendMessageToGroup.bind(appPoolV2),\n                sendMessageByInstanceId: appPoolV2.sendMessageByInstanceId.bind(appPoolV2),\n                logger: this.get('logger'),\n                notificationService: this.get('notification'),\n                sendLegacyApiCall: this.get('appsService').handleAppApiCall.bind(this.get('appsService')),\n                streamingService: this.get('streaming'),\n                alerting: this.get('alerting'),\n                proposeMessageTools: {\n                    insertChatText: this.get('insertChatText'),\n                    insertSmsText: this.get('insertSmsText'),\n                    insertEmailText: this.get('insertEmailText')\n                },\n                getHasConversationAppForCurrInteraction: () => this.get('hasConversationAppForCurrInteraction'),\n                getActiveInteractions: async () => {\n                    const timeout = new RSVP.Promise(resolve => run.later(resolve, 10000));\n                    await RSVP.race([this.get('acdinitialization').waitForAll(1000), timeout]);\n                    return mapValidActiveInteractionsToConversations(this.get('validActiveInteractions'));\n                }\n            })\n        );\n        appPoolV2.addPoolStateChangeListener(({ detail: { poolState } }) => {\n            run.next(this, () => {\n                if (this.get('isDestroying') || this.get('isDestroyed')) {\n                    return;\n                }\n                const attentionCountPerCompositeId: Record<string, number> = {};\n                Object.values(poolState).forEach(({ appDefs }) => {\n                    for (const { appDef, attentionCount } of appDefs) {\n                        attentionCountPerCompositeId[appDef.id] = attentionCount;\n                    }\n                });\n                this.set('attentionCountPerCompositeId', attentionCountPerCompositeId);\n                this.set('_poolState', poolState);\n                this._triggerOnAppAttentionCountChangedAction();\n            });\n        });\n        this.set('appPoolV2', appPoolV2);\n        this.set('resolvedApps', []);\n        this.set('attentionCountPerCompositeId', {});\n        this.set('forcedPanelSelectionMap', {});\n        this.set('contextualInteractionScriptStateMap', {});\n        this.set(\n            '_viewStackConversationController',\n            new AppViewStackHostLayoutController('conversation-v2', appPoolV2, {\n                getLayoutTemplate: (groupId, groupState) => {\n                    return this._getConversationLayoutTemplate(groupId, groupState);\n                }\n            })\n        );\n        this.set(\n            '_carouselContextualController',\n            new AppCarouselHostLayoutController('contextual-v2', appPoolV2, {\n                getLayoutTemplate: (groupId, groupState, previousLayoutTemplate) => {\n                    return this._getContextualLayoutTemplate(groupId, groupState, previousLayoutTemplate);\n                },\n                onLayoutTemplateUpdated: (groupId, layoutTemplate, previousLayoutTemplate) => {\n                    const _prevContextualLayoutTemplates = this.get('_prevContextualLayoutTemplates');\n                    const _prevContextualLayoutTemplate = _prevContextualLayoutTemplates.get(groupId);\n                    const contextualLayoutTemplates = new Map(this.get('contextualLayoutTemplates'));\n                    this.set('_prevContextualLayoutTemplates', contextualLayoutTemplates);\n                    if (_prevContextualLayoutTemplate) {\n                        this._updatePersistenceContextListFromLayoutTemplateDiff(\n                            groupId,\n                            _prevContextualLayoutTemplate,\n                            layoutTemplate\n                        );\n                    }\n                    this._syncPersistenceFocusFromLayoutUpdate(groupId, previousLayoutTemplate, layoutTemplate);\n                    contextualLayoutTemplates.set(groupId, layoutTemplate);\n                    this.set('contextualLayoutTemplates', contextualLayoutTemplates);\n                    this._saveContextualLayoutTemplate(groupId, layoutTemplate);\n                    this._triggerLayoutActions(groupId, layoutTemplate);\n                }\n            })\n        );\n        this.set('notesHistoryLength', 0);\n        this.set('_prevAppProviders', null);\n        this.set('_prevActiveInteractions', null);\n        this.set('_prevRawActiveInteractions', {});\n        this.set('_prevSelectedInteraction', null);\n        this.set('_issuedAppRequests', []);\n        this.set('_prevForcedPanelSelectionMap', {});\n        this.set('_prevContextualInteractionScriptStateMap', {});\n        this.set('_prevContextualLayoutTemplates', new Map());\n        this.set('_issuedAppRequests', []);\n        this.set('ephemeralCarouselLayoutTemplateMap', {});\n        this.set('persistentCarouselLayoutTemplateMap', {});\n        this.set('autoScrollActions', new Map());\n        this.set('autoOpenActions', new Map());\n        this.set('visibleAppDefIds', new Map());\n        this.set('contextualLayoutTemplateContextMap', new Map());\n\n        const authUser = this.get('authUser');\n        if (authUser) {\n            const currentUserId = get(authUser, 'id');\n            this.get('storage')\n                .getPreferenceStorageItem(`${LAYOUT_TEMPLATE_SETTINGS_NAMESPACE}.${currentUserId}`)\n                .then(result => {\n                    if (isValidLayoutTemplateMap(result)) {\n                        // Clean up the previously persisted layout map\n                        this.set(\n                            'persistentCarouselLayoutTemplateMap',\n                            _correctPersistedCarouselLayoutTemplateMap(\n                                result,\n                                this.get('_validAppProviders').map(({ id }) => id),\n                                // Agent UI is not loaded until the session is authenticated, so it's safe to consume features here\n                                this.get('session').get('features')\n                            )\n                        );\n                    }\n                    this.set('hasLoadedPersistentCarouselLayoutTemplateMap', true);\n                })\n                .catch(error => {\n                    this.get('logger').error('Error getting panelManager preferences:', { error });\n                    this.set('persistentCarouselLayoutTemplateMap', {});\n                });\n        }\n\n        this._triggerOnAppPoolReadyAction();\n        const config = this.get('_metadataReporterConfig') ?? defaultMetadataReporterConfig;\n        const { initialReportDelay, shouldSendInitial } = config;\n        // Suppress the default 30s telemetry timer in tests to prevent it from\n        // leaking into subsequent tests. Tests that explicitly set a short\n        // initialReportDelay (< 30s) are opting in to test this path.\n        const isDefaultDelay =\n            (initialReportDelay ?? defaultMetadataReporterConfig.initialReportDelay) >=\n            defaultMetadataReporterConfig.initialReportDelay;\n        if (shouldSendInitial && !(isTesting && isDefaultDelay)) {\n            this._telemetryTimer = run.later(() => this._sendTelemetryMetadata(), Math.max(0, initialReportDelay ?? 0));\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        const _carouselContextualController = this.get('_carouselContextualController');\n        if (_carouselContextualController) {\n            this.disposables.push(\n                _carouselContextualController.addEventListener(\n                    'enter-focus-mode',\n                    this.onCarouselEnterFocusMode.bind(this)\n                ).dispose,\n                _carouselContextualController.addEventListener(\n                    'exit-focus-mode',\n                    this.onCarouselExitFocusMode.bind(this)\n                ).dispose\n            );\n        }\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        if (this._telemetryTimer) {\n            run.cancel(this._telemetryTimer);\n            this._telemetryTimer = null;\n        }\n        this._cancelPendingActionTimers();\n        this.disposables.forEach(cb => cb());\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        // Cancel the _updateManagerState task to prevent it from running after destroy.\n        // The task uses yield timeout(100) which leaves a pending backburner timer that\n        // blocks settled() in tests and causes hangs.\n        if (this.get('_updateManagerState') && this.get('_updateManagerState').cancelAll) {\n            this.get('_updateManagerState').cancelAll();\n        }\n        // Cancel the telemetry timer scheduled in init() so it doesn't fire\n        // after the component is destroyed (unit tests never call willDestroyElement).\n        if (this._telemetryTimer) {\n            run.cancel(this._telemetryTimer);\n            this._telemetryTimer = null;\n        }\n        this._cancelPendingActionTimers();\n    },\n\n    _cancelPendingActionTimers() {\n        if (this._pendingActionTimers) {\n            this._pendingActionTimers.forEach(timer => run.cancel(timer));\n        }\n        this._pendingActionTimers = [];\n    },\n\n    onCarouselEnterFocusMode: function () {\n        this.set('hasContextualFocusModeEnabled', true);\n        this._triggerOnHasContextualFocusModeEnabledChangedAction();\n    },\n    onCarouselExitFocusMode: function () {\n        this.set('hasContextualFocusModeEnabled', false);\n        this._triggerOnHasContextualFocusModeEnabledChangedAction();\n    },\n\n    _debouncedFunctions: {} as Record<string, ReturnType<typeof Ember.run.later>>,\n    _debounceLayoutUpdate: function (layoutKey: string, delay: number) {\n        // Clear any existing timeout for the layout key\n        if (this._debouncedFunctions[layoutKey]) {\n            Ember.run.cancel(this._debouncedFunctions[layoutKey]);\n        }\n\n        // Set a new timeout for the layout key\n        this._debouncedFunctions[layoutKey] = Ember.run.later(() => {\n            this._sendLayoutTelemetry(layoutKey);\n        }, delay);\n    },\n\n    _telemetryUpdateQueue: {} as Record<string, Record<string, string | number>>,\n    _queueLayoutTelemetryUpdate: function (layout: AppCarouselHostLayoutTemplate, appContext: AppContext) {\n        const layoutKey = `${appContext.id}.${getInteractionType(appContext)}`;\n\n        // Update the telemetry data for the given layout key\n        this._telemetryUpdateQueue[layoutKey] = getLayoutMetadata(layout, appContext);\n\n        // Set up the custom debounced function\n        this._debounceLayoutUpdate(layoutKey, 2000);\n    },\n\n    _sendLayoutTelemetry: function (layoutKey: string) {\n        if (this.get('isDestroying') || this.get('isDestroyed')) {\n            return;\n        }\n        const layoutMetadata = this._telemetryUpdateQueue[layoutKey];\n        addPageAction('appsv2ContextualLayoutTelemetry', layoutMetadata);\n        delete this._telemetryUpdateQueue[layoutKey];\n    },\n\n    _sendTelemetryMetadata: function () {\n        if (this.get('isDestroying') || this.get('isDestroyed')) {\n            return;\n        }\n\n        const { reportInterval, shouldSendPeriodic } =\n            this.get('_metadataReporterConfig') ?? defaultMetadataReporterConfig;\n        const appPool = this.get('appPoolV2');\n        if (!appPool) {\n            if (shouldSendPeriodic) {\n                run.later(() => this._sendTelemetryMetadata(), Math.max(reportInterval ?? 300000, 0));\n            }\n            return;\n        }\n\n        const metadata = getTelemetryMetadata({\n            interactions: this.get('validActiveInteractions'),\n            poolState: appPool.getPoolState() ?? undefined,\n            selectedInteraction: this.get('selectedInteraction') || undefined,\n            getInteractionBuckets: interaction => [...new Set([interaction.type, getInteractionType(interaction)])]\n        });\n        const flattenedMetadata = Object.entries(metadata).reduce<Record<string, string | number>>(\n            (acc, [key, value]) => {\n                if (typeof value === 'number') {\n                    acc[key] = value;\n                }\n                return acc;\n            },\n            {}\n        );\n\n        this._addPageAction('appsv2PeriodicTelemetry', flattenedMetadata);\n        if (shouldSendPeriodic) {\n            run.later(() => this._sendTelemetryMetadata(), Math.max(reportInterval ?? 300000, 0));\n        }\n    },\n\n    _triggerLayoutActions: function (groupId: string, layoutTemplate: AppCarouselHostLayoutTemplate) {\n        // Update Native View Visibility\n        const newVisibleAppDefIds = new Map(this.get('visibleAppDefIds'));\n        newVisibleAppDefIds.set(\n            groupId,\n            layoutTemplate.items.reduce((res: string[], { appDefId, visible }) => {\n                if (visible) {\n                    res.push(appDefId);\n                }\n                return res;\n            }, [])\n        );\n        this.set('visibleAppDefIds', newVisibleAppDefIds);\n        this._triggerOnVisibleContextualAppsForCurrInteractionChangedAction();\n\n        const selectedInteraction = this.get('selectedInteraction');\n        if (selectedInteraction && this.get('agentPanelIsActive')) {\n            const interactionType = getInteractionType(selectedInteraction);\n            const selectedInteractionGroupId = computeGroupId(selectedInteraction.id, interactionType, 'contextual');\n            if (selectedInteractionGroupId === groupId) {\n                // Auto Open\n                const autoOpenActions = new Map(this.get('autoOpenActions'));\n                if (autoOpenActions.has(groupId)) {\n                    const panelIds = autoOpenActions.get(groupId)!;\n                    const autoOpenAppDefIds: string[] = [];\n                    const autoOpenAppDefIdsToKeep: string[] = [];\n                    for (const panelId of panelIds) {\n                        const appDefLookupIds = [\n                            // Integration\n                            [selectedInteraction.id, interactionType, panelId].join('&'),\n                            // Native\n                            [selectedInteraction.id, interactionType, panelId, 'native'].join('&')\n                        ];\n                        const autoOpenLayoutTemplateItem = layoutTemplate.items.find(({ appDefId }) =>\n                            appDefLookupIds.includes(appDefId)\n                        );\n                        if (autoOpenLayoutTemplateItem) {\n                            autoOpenAppDefIds.push(autoOpenLayoutTemplateItem.appDefId);\n                        } else {\n                            autoOpenAppDefIdsToKeep.push(panelId);\n                        }\n                    }\n                    if (autoOpenAppDefIds.length > 0) {\n                        const autoOpenTimer = run.later(\n                            this,\n                            () => {\n                                if (this.get('isDestroying') || this.get('isDestroyed')) {\n                                    return;\n                                }\n                                const autoScrollAppDefIds: string[] = [];\n                                this._carouselContextualController?.updateLayoutTemplate(\n                                    groupId,\n                                    (groupId, groupState, previousLayoutTemplate) => {\n                                        const newLayoutTemplate = previousLayoutTemplate\n                                            ? cloneDeep(previousLayoutTemplate)\n                                            : this._getContextualLayoutTemplate(\n                                                  groupId,\n                                                  groupState,\n                                                  previousLayoutTemplate\n                                              );\n                                        for (const autoOpenAppDefId of autoOpenAppDefIds) {\n                                            const panelLayoutTemplateItem = newLayoutTemplate.items.find(\n                                                ({ appDefId }) => appDefId === autoOpenAppDefId\n                                            );\n                                            if (panelLayoutTemplateItem) {\n                                                autoScrollAppDefIds.push(panelLayoutTemplateItem.appDefId);\n                                                panelLayoutTemplateItem.active = true;\n                                                panelLayoutTemplateItem.visible = true;\n                                                this._clearFocusModeForForcedPanel(\n                                                    newLayoutTemplate,\n                                                    groupId,\n                                                    panelLayoutTemplateItem.appDefId\n                                                );\n                                            }\n                                        }\n                                        return newLayoutTemplate;\n                                    }\n                                );\n                                if (autoScrollAppDefIds[0]) {\n                                    this._addAutoScrollAction(groupId, autoScrollAppDefIds[0]);\n                                }\n                            },\n                            250\n                        );\n                        if (!this._pendingActionTimers) {\n                            this._pendingActionTimers = [];\n                        }\n                        this._pendingActionTimers.push(autoOpenTimer);\n                        if (autoOpenAppDefIdsToKeep.length === 0) {\n                            // Clear auto open actions if all apps were opened\n                            autoOpenActions.delete(groupId);\n                        } else {\n                            // Update auto open actions if not all apps were opened\n                            autoOpenActions.set(groupId, autoOpenAppDefIdsToKeep);\n                        }\n                        this.set('autoOpenActions', autoOpenActions);\n                    }\n                }\n                // Auto Scroll\n                const autoScrollActions = new Map(this.get('autoScrollActions'));\n                if (autoScrollActions.has(groupId)) {\n                    const panelId = autoScrollActions.get(groupId)!;\n                    if (\n                        layoutTemplate.items.some(\n                            ({ appDefId, active, visible }) => appDefId === panelId && active && visible\n                        )\n                    ) {\n                        const autoScrollTimer = run.later(\n                            this,\n                            () => {\n                                if (this.get('isDestroying') || this.get('isDestroyed')) {\n                                    return;\n                                }\n                                this._carouselContextualController?.focusApp(panelId);\n                            },\n                            250\n                        );\n                        if (!this._pendingActionTimers) {\n                            this._pendingActionTimers = [];\n                        }\n                        this._pendingActionTimers.push(autoScrollTimer);\n                        autoScrollActions.delete(groupId);\n                        this.set('autoScrollActions', autoScrollActions);\n                    }\n                }\n            }\n        }\n    },\n\n    _getOrCreateContextualLayoutTemplateContext: function (groupId: string): ContextualLayoutTemplateContext {\n        const contextualLayoutTemplateContextMap = new Map(this.get('contextualLayoutTemplateContextMap'));\n        const layoutTemplateContext = contextualLayoutTemplateContextMap.get(groupId) || {\n            persistenceFocusAppDefId: undefined,\n            persistenceAppDefIdIgnoreList: new Set(),\n            preservePersistenceFocusOnNextExit: false\n        };\n        contextualLayoutTemplateContextMap.set(groupId, layoutTemplateContext);\n        this.set('contextualLayoutTemplateContextMap', contextualLayoutTemplateContextMap);\n        return layoutTemplateContext;\n    },\n    _updatePersistenceFocusModeAppDefId: function (groupId: string, focusModeAppDefId: string | undefined) {\n        this._getOrCreateContextualLayoutTemplateContext(groupId).persistenceFocusAppDefId = focusModeAppDefId;\n    },\n    _setPreservePersistenceFocusOnNextExit: function (groupId: string, preserve: boolean) {\n        this._getOrCreateContextualLayoutTemplateContext(groupId).preservePersistenceFocusOnNextExit = preserve;\n    },\n    _syncPersistenceFocusFromLayoutUpdate: function (\n        groupId: string,\n        previousLayoutTemplate: AppCarouselHostLayoutTemplate | null | undefined,\n        layoutTemplate: AppCarouselHostLayoutTemplate\n    ) {\n        const nextFocus = layoutTemplate.focusModeAppDefId;\n        const ctx = this._getOrCreateContextualLayoutTemplateContext(groupId);\n        if (nextFocus) {\n            ctx.persistenceFocusAppDefId = nextFocus;\n            ctx.preservePersistenceFocusOnNextExit = false;\n        } else if (ctx.preservePersistenceFocusOnNextExit) {\n            // Forced-panel clear — keep persistence; snapshot from previous if context was empty\n            ctx.persistenceFocusAppDefId ??= previousLayoutTemplate?.focusModeAppDefId;\n            ctx.preservePersistenceFocusOnNextExit = false;\n        } else if (previousLayoutTemplate?.focusModeAppDefId) {\n            // User cleared focus — clear before save so override does not re-write it\n            ctx.persistenceFocusAppDefId = undefined;\n        }\n    },\n    _clearFocusModeForForcedPanel: function (\n        layoutTemplate: AppCarouselHostLayoutTemplate,\n        groupId: string,\n        panelAppDefId: string\n    ) {\n        if (layoutTemplate.focusModeAppDefId && layoutTemplate.focusModeAppDefId !== panelAppDefId) {\n            this._setPreservePersistenceFocusOnNextExit(groupId, true);\n            layoutTemplate.focusModeAppDefId = undefined;\n        }\n    },\n    _addPersistenceAppDefIdIgnoreList: function (groupId: string, appDefIds: string[]) {\n        const contextualLayoutTemplates = this.get('contextualLayoutTemplates');\n        const contextualLayoutTemplate = contextualLayoutTemplates.get(groupId);\n        const layoutTemplateContext = this._getOrCreateContextualLayoutTemplateContext(groupId);\n        for (const appDefId of appDefIds) {\n            // Add app to ignore list when group doesn't have a layout template or if app is not already visible\n            if (\n                !contextualLayoutTemplate ||\n                contextualLayoutTemplate.items.some(\n                    layoutTemplateItem => layoutTemplateItem.appDefId === appDefId && !layoutTemplateItem.visible\n                )\n            ) {\n                layoutTemplateContext.persistenceAppDefIdIgnoreList.add(appDefId);\n            }\n        }\n    },\n    _removePersistenceAppDefIdIgnoreList: function (groupId: string, appDefIds: string[]) {\n        const layoutTemplateContext = this.get('contextualLayoutTemplateContextMap').get(groupId);\n        if (layoutTemplateContext) {\n            for (const appDefId of appDefIds) {\n                layoutTemplateContext.persistenceAppDefIdIgnoreList.delete(appDefId);\n            }\n            this.set('contextualLayoutTemplateContextMap', new Map(this.get('contextualLayoutTemplateContextMap')));\n        }\n    },\n    _updatePersistenceContextListFromLayoutTemplateDiff: function (\n        groupId: string,\n        prevLayoutTemplate: AppCarouselHostLayoutTemplate,\n        layoutTemplate: AppCarouselHostLayoutTemplate\n    ) {\n        const appDefIds = layoutTemplate.items\n            .filter(layoutTemplateItem => {\n                const prevLayoutTemplateItem = prevLayoutTemplate.items.find(\n                    ({ appDefId }) => appDefId === layoutTemplateItem.appDefId\n                );\n                return prevLayoutTemplateItem ? prevLayoutTemplateItem.visible && !layoutTemplateItem.visible : false;\n            })\n            .map(({ appDefId }) => appDefId);\n        this._removePersistenceAppDefIdIgnoreList(groupId, appDefIds);\n    },\n\n    _saveContextualLayoutTemplate: function (groupId: string, layoutTemplate: AppCarouselHostLayoutTemplate) {\n        const tokens = computeTokensFromGroupId(groupId);\n        if (tokens) {\n            const validActiveInteractions = this.get('validActiveInteractions');\n            const validAppContext = validActiveInteractions.find(\n                appContext =>\n                    appContext.id === tokens.interactionId && getInteractionType(appContext) === tokens.interactionType\n            );\n            if (validAppContext) {\n                const validAppContextType = getInteractionType(validAppContext);\n                const newLayoutTemplate = buildEphemeralStorableLayoutTemplate(layoutTemplate);\n                // Ephemeral Map\n                const ephemeralCarouselLayoutTemplateAppContextKey = `${tokens.interactionId}.${tokens.interactionType}`;\n                const ephemeralCarouselLayoutTemplateMap = this.get('ephemeralCarouselLayoutTemplateMap');\n                const newEphemeralCarouselLayoutTemplateMap = Object.fromEntries(\n                    Object.entries({\n                        ...ephemeralCarouselLayoutTemplateMap,\n                        [ephemeralCarouselLayoutTemplateAppContextKey]: newLayoutTemplate\n                    }).filter(([appContextKey]) =>\n                        // Filter any inactive interaction by id and appContextType (we want to keep call/callback layout templates)\n                        validActiveInteractions.some(appContext => {\n                            const [appContextId, interactionType] = appContextKey.split('.');\n                            return (\n                                appContextId === appContext.id &&\n                                computeAppContextTypeFromInteractionType(interactionType) === appContext.type\n                            );\n                        })\n                    )\n                );\n                this.set('ephemeralCarouselLayoutTemplateMap', newEphemeralCarouselLayoutTemplateMap);\n                // Send layout for telemetry/usage data\n                // TODO: This data can be slightly off as it could include non-resolved, non-existent apps\n                // For instance, a default panel which doesn't exist for the current interaction\n                // When we separate layout from forced, we should be able to clean this up.\n                this._queueLayoutTelemetryUpdate(newLayoutTemplate, validAppContext);\n                // Persistent Map\n                const contextualLayoutTemplateContextMap = this.get('contextualLayoutTemplateContextMap');\n                const contextualLayoutTemplateContext = contextualLayoutTemplateContextMap.get(groupId);\n                const persistentCarouselLayoutTemplateMap = this.get('persistentCarouselLayoutTemplateMap');\n                const previousLayoutTemplate = persistentCarouselLayoutTemplateMap[tokens.interactionType];\n                const newPersistentCarouselLayoutTemplateMap = {\n                    ...persistentCarouselLayoutTemplateMap,\n                    [tokens.interactionType]: buildPersistentStorableLayoutTemplate(newLayoutTemplate, {\n                        focusModeAppDefIdOverride: contextualLayoutTemplateContext?.persistenceFocusAppDefId\n                            ? pruneInteractionIdAndType(contextualLayoutTemplateContext.persistenceFocusAppDefId)\n                            : undefined,\n                        deactivateFilter(layoutTemplateItem) {\n                            if (contextualLayoutTemplateContext) {\n                                const compositeId = [\n                                    validAppContext.id,\n                                    validAppContextType,\n                                    layoutTemplateItem.appDefId\n                                ].join('&');\n                                return contextualLayoutTemplateContext.persistenceAppDefIdIgnoreList.has(compositeId);\n                            }\n                            return false;\n                        }\n                    })\n                };\n                this.set('persistentCarouselLayoutTemplateMap', newPersistentCarouselLayoutTemplateMap);\n                // Only save layout preferences once every 5 seconds\n                if (!isEqual(previousLayoutTemplate, newLayoutTemplate)) {\n                    run.debounce(this, this._saveLayoutTemplatePreferences, 5000);\n                }\n            }\n        }\n    },\n\n    _saveLayoutTemplatePreferences: function () {\n        if (this.get('isDestroying') || this.get('isDestroyed')) {\n            return;\n        }\n        // Only save to preference service if we loaded previous layouts\n        if (this.get('hasLoadedPersistentCarouselLayoutTemplateMap')) {\n            const userId = this.get('authUser').id;\n            this.get('storage')\n                .setPreferenceStorageItem(\n                    `${LAYOUT_TEMPLATE_SETTINGS_NAMESPACE}.${userId}`,\n                    this.get('persistentCarouselLayoutTemplateMap')\n                )\n                .then(() => {\n                    this.get('logger').debug('Successfully saved panelManager preferences.');\n                })\n                .catch(e => {\n                    this.get('logger').error('Error saving panelManager preferences:', { error: e });\n                    return {};\n                });\n        }\n    },\n\n    _openPanels: function (appContext: AppContext, panelIds: string[]) {\n        const interactionType = getInteractionType(appContext);\n        const groupId = computeGroupId(appContext.id, interactionType, 'contextual');\n        const autoScrollAppDefIds: string[] = [];\n        let newLayoutTemplate: AppCarouselHostLayoutTemplate | null = null;\n        this._carouselContextualController?.updateLayoutTemplate(\n            groupId,\n            (groupId, groupState, previousLayoutTemplate) => {\n                newLayoutTemplate = previousLayoutTemplate\n                    ? cloneDeep(previousLayoutTemplate)\n                    : this._getContextualLayoutTemplate(groupId, groupState, previousLayoutTemplate);\n                for (const panelId of panelIds) {\n                    const appDefLookupIds = [\n                        // Integration\n                        [appContext.id, interactionType, panelId].join('&'),\n                        // Native\n                        [appContext.id, interactionType, panelId, 'native'].join('&')\n                    ];\n                    const panelLayoutTemplateItem = newLayoutTemplate.items.find(({ appDefId }) =>\n                        appDefLookupIds.includes(appDefId)\n                    );\n                    if (panelLayoutTemplateItem) {\n                        autoScrollAppDefIds.push(panelLayoutTemplateItem.appDefId);\n                        panelLayoutTemplateItem.active = true;\n                        panelLayoutTemplateItem.visible = true;\n                        this._clearFocusModeForForcedPanel(\n                            newLayoutTemplate,\n                            groupId,\n                            panelLayoutTemplateItem.appDefId\n                        );\n                    } else {\n                        this._addAutoOpenAction(groupId, panelId);\n                    }\n                }\n                return newLayoutTemplate;\n            }\n        );\n        // Only focus the first app activated in the list\n        if (autoScrollAppDefIds[0]) {\n            this._addAutoScrollAction(groupId, autoScrollAppDefIds[0]);\n        }\n        if (newLayoutTemplate) {\n            this._triggerLayoutActions(groupId, newLayoutTemplate);\n        }\n    },\n\n    _addAutoScrollAction: function (groupId: string, compositeId: string) {\n        const autoScrollActions = new Map(this.get('autoScrollActions'));\n        autoScrollActions.set(groupId, compositeId);\n        this.set('autoScrollActions', autoScrollActions);\n    },\n\n    _addAutoOpenAction: function (groupId: string, lookupId: string) {\n        const autoOpenActions = new Map(this.get('autoOpenActions'));\n        const autoOpenAppDefIds = autoOpenActions.get(groupId) || [];\n        if (!autoOpenAppDefIds.includes(lookupId)) {\n            autoOpenAppDefIds.push(lookupId);\n        }\n        autoOpenActions.set(groupId, autoOpenAppDefIds);\n        this.set('autoOpenActions', autoOpenActions);\n    },\n\n    _logToStashLogger: function (level: TraceLoggerLevel, message: string, appLogDetails?: AppLogDetails) {\n        this.get('logger')[level](\n            appUtils.buildInterapptionsLogMsg(message),\n            appUtils.buildStashLoggerDetails(appLogDetails?.getLogs())\n        );\n    },\n    _evictApp: function (groupInstances: GroupInstances) {\n        const groupInstancesDetails = Object.entries(groupInstances).flatMap(([currGroupId, appInstances]) => {\n            const tokens = computeTokensFromGroupId(currGroupId);\n            if (!tokens) {\n                this.get('logger').error('Unable to evict from a group with an invalid groupId', {\n                    remoteData: { groupId: currGroupId }\n                });\n                return [];\n            }\n            if (appInstances.length === 0) {\n                return [];\n            }\n            const { interactionId, interactionType, appGroupKey } = tokens;\n            return {\n                groupId: currGroupId,\n                appInstances,\n                groupType: appGroupKey,\n                selectedInteraction:\n                    // compare appContextType here to differentiate between live and historical interactions but preserve call/callback\n                    interactionId === this.get('selectedInteraction')?.id &&\n                    computeAppContextTypeFromInteractionType(interactionType) === this.get('selectedInteraction')?.type\n            };\n        });\n\n        // First try to remove LRU of nonselected contextual groups\n        const nonselectedContextualGroups = groupInstancesDetails\n            .filter(curr => {\n                return !curr.selectedInteraction && curr.groupType === 'contextual';\n            })\n            .map(curr => [curr.groupId, curr.appInstances]);\n        if (nonselectedContextualGroups.length > 0) {\n            return LRU(Object.fromEntries(nonselectedContextualGroups));\n        }\n\n        // Try to remove LRU of nonselected conversation groups\n        const nonselectedConversationGroups = groupInstancesDetails\n            .filter(curr => {\n                return !curr.selectedInteraction && curr.groupType === 'conversation';\n            })\n            .map(curr => [curr.groupId, curr.appInstances]);\n        if (nonselectedConversationGroups.length > 0) {\n            return LRU(Object.fromEntries(nonselectedConversationGroups));\n        }\n\n        // Try to remove LRU of selected contextual groups\n        const selectedContextualGroups = groupInstancesDetails\n            .filter(curr => {\n                return curr.selectedInteraction && curr.groupType === 'contextual';\n            })\n            .map(curr => [curr.groupId, curr.appInstances]);\n        if (selectedContextualGroups.length > 0) {\n            return LRU(Object.fromEntries(selectedContextualGroups));\n        }\n\n        // Never evict from current conversation group\n        throw new Error('Unable to evict an app');\n    },\n\n    _triggerOnAppPoolReadyAction: function () {\n        run.next(this, () => {\n            if (this.get('isDestroying') || this.get('isDestroyed')) {\n                return;\n            }\n            this.onAppPoolReady?.(this.appPoolV2!);\n        });\n    },\n    _triggerOnAppAttentionCountChangedAction: function () {\n        this.onAppAttentionCountChanged?.(this.get('attentionCountPerCompositeId'));\n    },\n    _triggerOnHasConversationAppForCurrInteractionChangedAction: function () {\n        run.next(this, () => {\n            if (this.get('isDestroying') || this.get('isDestroyed')) {\n                return;\n            }\n            // Unconditionally fire the current state.  if v2 is off, we want this to be false\n            this.onHasConversationAppForCurrInteractionChanged?.(this.get('hasConversationAppForCurrInteraction'));\n        });\n    },\n    _triggerOnVisibleContextualAppsForCurrInteractionChangedAction: function () {\n        run.next(this, () => {\n            if (this.get('isDestroying') || this.get('isDestroyed')) {\n                return;\n            }\n            let selectedInteractionVisibleAppDefIds: string[] = [];\n            const selectedInteraction = this.get('selectedInteraction');\n            const visibleAppDefIds = this.get('visibleAppDefIds');\n            if (selectedInteraction) {\n                const groupId = computeGroupId(\n                    selectedInteraction.id,\n                    getInteractionType(selectedInteraction),\n                    'contextual'\n                );\n                if (groupId) {\n                    selectedInteractionVisibleAppDefIds = visibleAppDefIds.get(groupId) ?? [];\n                }\n            }\n            this.onVisibleContextualAppsForCurrInteractionChanged?.(\n                selectedInteractionVisibleAppDefIds.map(pruneInteractionIdAndType)\n            );\n        });\n    },\n    _triggerOnHasContextualFocusModeEnabledChangedAction: function () {\n        run.next(this, () => {\n            if (this.get('isDestroying') || this.get('isDestroyed')) {\n                return;\n            }\n            this.onHasContextualFocusModeEnabledChanged?.(this.get('hasContextualFocusModeEnabled'));\n        });\n    },\n\n    _updateManagerState: task(function* (this: any): any {\n        // In test environments, skip the 100ms delay and the AppPool update\n        // to prevent the pending backburner timer from blocking settled().\n        if (isTesting) {\n            return;\n        }\n        yield timeout(100);\n        const interactionAppGroups: InteractionAppGroups = this.get('interactionAppGroups');\n        const appDefUpdate: Record<string, AppDef[]> = {};\n        for (const interactionKey in interactionAppGroups) {\n            const tokens = computeTokensFromInteractionKey(interactionKey);\n            if (tokens) {\n                // Conversation\n                const conversationGroupId = computeGroupId(\n                    tokens.interactionId,\n                    tokens.interactionType,\n                    'conversation'\n                );\n                appDefUpdate[conversationGroupId] = interactionAppGroups[interactionKey].groups.conversation.apps.map(\n                    ({ appDef }) => appDef\n                );\n                // Contextual\n                const contextualGroupId = computeGroupId(tokens.interactionId, tokens.interactionType, 'contextual');\n                appDefUpdate[contextualGroupId] = interactionAppGroups[interactionKey].groups.contextual.apps.map(\n                    ({ appDef }) => appDef\n                );\n            }\n        }\n        // Update State\n        this.appPoolV2.updateAppDefs(appDefUpdate);\n        // Trigger Actions\n        this._triggerOnHasConversationAppForCurrInteractionChangedAction();\n    }).keepLatest(),\n\n    _addAppProvider(provider: AppProvider) {\n        // Request Apps for all current interactions\n        let interactions = this.get('activeInteractions');\n        if (interactions && interactions.length > 0) {\n            interactions.forEach(currInteraction => {\n                this._requestAppsFromProvider(provider, currInteraction)\n                    .then(({ appConfigs }) => {\n                        if (this.get('isDestroying') || this.get('isDestroyed')) {\n                            return;\n                        }\n\n                        this._updateResolvedApps(provider.id, appConfigs, currInteraction);\n                        return;\n                    })\n                    .catch(reason => {\n                        if (this.get('isDestroying') || this.get('isDestroyed')) {\n                            return;\n                        }\n\n                        // Out of date async requests are allowed, expected, and silently ignored\n                        if (reason !== OUT_OF_DATE_ASYNC_PROVIDER_RESPONSE) {\n                            // Encountered an unexpected error\n                            this.get('logger').error(\n                                appUtils.buildInterapptionsLogMsg(\n                                    'Provider appConfig request triggered by an added provider rejected unexpectedly.'\n                                ),\n                                {\n                                    reason,\n                                    remoteData: {\n                                        appProviderId: get(provider, 'id'),\n                                        interactionId: currInteraction.id,\n                                        interactionType: getInteractionType(currInteraction)\n                                    }\n                                }\n                            );\n                        }\n\n                        return;\n                    });\n            });\n        }\n    },\n\n    _removeAppProvider(provider: AppProvider) {\n        let providerIdToRemove = provider.id;\n\n        // Clear out any issued requests for this provider\n        this._removeIssuedAppRequests({ providerId: providerIdToRemove });\n\n        this._deleteProviderResolvedApps(providerIdToRemove);\n    },\n\n    _addInteraction(interaction: AppContext) {\n        let appProviders = this.get('_validAppProviders');\n\n        const interactionType = getInteractionType(interaction);\n\n        if (appProviders && appProviders.length > 0) {\n            appProviders.forEach(currProvider => {\n                this._requestAppsFromProvider(currProvider, interaction)\n                    .then(({ appConfigs }) => {\n                        if (this.get('isDestroying') || this.get('isDestroyed')) {\n                            return;\n                        }\n\n                        // Immediately update the pool so a slow provider doesn't slow up other providers\n                        this._updateResolvedApps(currProvider.id, appConfigs, interaction);\n                    })\n                    .catch(reason => {\n                        if (this.get('isDestroying') || this.get('isDestroyed')) {\n                            return;\n                        }\n\n                        // Out of date async requests are allowed, expected, and silently ignored\n                        if (reason !== OUT_OF_DATE_ASYNC_PROVIDER_RESPONSE) {\n                            // Encountered an unexpected error\n                            this.get('logger').error(\n                                appUtils.buildInterapptionsLogMsg(\n                                    `App Provider appConfig request triggered by an added ${interactionType} rejected unexpectedly.`\n                                ),\n                                {\n                                    reason,\n                                    remoteData: {\n                                        appProviderId: get(currProvider, 'id'),\n                                        interactionId: interaction.id,\n                                        interactionType\n                                    }\n                                }\n                            );\n                        }\n\n                        return;\n                    });\n            });\n        }\n    },\n\n    _updateInteraction(interaction: AppContext, prevInteraction: AppContext) {\n        let appProviders = this.get('_validAppProviders');\n\n        const interactionType = getInteractionType(interaction);\n\n        if (appProviders && appProviders.length > 0) {\n            appProviders\n                .filter(currProvider => get(currProvider, 'monitorInteractionUpdates'))\n                .forEach(currProvider => {\n                    this._requestAppsFromProvider(currProvider, interaction, prevInteraction)\n                        .then(({ appConfigs }) => {\n                            if (this.get('isDestroying') || this.get('isDestroyed')) {\n                                return;\n                            }\n\n                            // Immediately update the pool so a slow provider doesn't slow up other providers\n                            this._updateResolvedApps(currProvider.id, appConfigs, interaction);\n                        })\n                        .catch(reason => {\n                            if (this.get('isDestroying') || this.get('isDestroyed')) {\n                                return;\n                            }\n\n                            // Out of date async requests are allowed, expected, and silently ignored\n                            if (reason !== OUT_OF_DATE_ASYNC_PROVIDER_RESPONSE) {\n                                // Encountered an unexpected error\n                                this.get('logger').error(\n                                    appUtils.buildInterapptionsLogMsg(\n                                        `App Provider appConfig request triggered by an updated ${interactionType} rejected unexpectedly.`\n                                    ),\n                                    {\n                                        reason,\n                                        remoteData: {\n                                            appProviderId: get(currProvider, 'id'),\n                                            interactionId: interaction.id\n                                        }\n                                    }\n                                );\n                            }\n\n                            return;\n                        });\n                });\n        }\n    },\n\n    _removeInteraction(interaction: AppContext) {\n        const { id: interactionId, type: interactionType } = interaction;\n\n        // Clear out any and all issued requests for this interaction based on app context type\n        this._removeIssuedAppRequests({ interactionId, appContextType: interactionType });\n\n        this._manuallyRemoveNotesGadgetAttentionCount(interaction);\n\n        // Notify the providers of the interaction removal\n        let providers = this.get('_validAppProviders');\n        if (providers) {\n            providers\n                .filter(currProvider => typeof currProvider.interactionRemoved === 'function')\n                .forEach(currProvider => {\n                    try {\n                        currProvider.interactionRemoved!(interaction);\n                    } catch (e) {\n                        this.get('logger').warn(\n                            appUtils.buildInterapptionsLogMsg(\n                                'Asynchronous App Provider interactionRemoved handler threw an error.'\n                            ),\n                            {\n                                reason: e,\n                                remoteData: {\n                                    appProviderId: currProvider.id,\n                                    interactionId: interaction.id,\n                                    interactionType\n                                }\n                            }\n                        );\n                    }\n                });\n        }\n\n        this._deleteInteractionResolvedApps(interactionId, interactionType);\n    },\n\n    _getProviderById: function (providerId: string): AppProvider | null {\n        const appProviders = this.get('_validAppProviders');\n        return appProviders.find(({ id }) => providerId === id) || null;\n    },\n\n    _getAppDefsFromAppConfigs: function (appConfigs: any[], provider: AppProvider, interaction: AppContext) {\n        const appDefs: AppDef[] = [];\n        for (const appConfig of appConfigs) {\n            const appDef = appUtils.isAppDefV2(appConfig)\n                ? appConfig\n                : this._convertV1AppToV2AppDef(appConfig, provider, interaction);\n            if (appDef) {\n                appDefs.push(appDef);\n\n                // Log use of pc-prefixed params in app url\n                const foundParams: Record<string, string> = {};\n                if ('src' in appDef && appDef.src) {\n                    URL_REPLACEMENTS.forEach(replacement => {\n                        if (\n                            replacement.queryParamName.startsWith('pc') &&\n                            appDef.src.toString().search(replacement.regExp) !== -1\n                        ) {\n                            foundParams[replacement.queryParamName] = 'true';\n                        }\n                    });\n                    if (Object.keys(foundParams).length > 0) {\n                        this._addPageAction('pcParamsInAppUrl', {\n                            appDefId: appDef.id,\n                            ...foundParams\n                        });\n                    }\n                }\n            }\n        }\n        return appDefs;\n    },\n\n    _updateControllerState: function () {\n        const selectedInteraction = this.get('selectedInteraction');\n        const validActiveInteractions = this.get('validActiveInteractions');\n        this._viewStackConversationController?.updateState({\n            groupIds: validActiveInteractions.map(interaction =>\n                computeGroupId(interaction.id, getInteractionType(interaction), 'conversation')\n            ),\n            activeGroupId: selectedInteraction\n                ? computeGroupId(selectedInteraction.id, getInteractionType(selectedInteraction), 'conversation')\n                : null\n        });\n        this._carouselContextualController?.updateState({\n            groupIds: validActiveInteractions.map(interaction =>\n                computeGroupId(interaction.id, getInteractionType(interaction), 'contextual')\n            ),\n            activeGroupId: selectedInteraction\n                ? computeGroupId(selectedInteraction.id, getInteractionType(selectedInteraction), 'contextual')\n                : null,\n            nativeAppDefs: this.get('nativeAppDefs')\n        });\n    },\n\n    _updateResolvedApps: function (providerId: string, appConfigs: any[], interaction: AppContext) {\n        const provider = this._getProviderById(providerId);\n        if (provider) {\n            const interactionType = getInteractionType(interaction);\n            const appContextType = interaction.type;\n            const appGroupKey: AppGroupKey = provider?.group || 'contextual';\n            const appDefs: AppDef[] = this._getAppDefsFromAppConfigs(appConfigs, provider, interaction);\n            const newResolvedApps: ResolvedApp[] = appDefs.map(appDef => {\n                const compositeId = computeInterapptionCompositeId(\n                    interaction.id,\n                    interactionType,\n                    appDef.id,\n                    providerId\n                );\n                return {\n                    compositeId,\n                    appDefId: compositeId,\n                    providerId,\n                    interactionId: interaction.id,\n                    interactionType,\n                    appContextType,\n                    appGroupKey: provider.getAppGroup?.(appDef) ?? appGroupKey,\n                    appDef: {\n                        ...appDef,\n                        id: compositeId\n                    }\n                };\n            });\n            this._modifyResolvedApps(\n                newResolvedApps,\n                // Remove resolved apps by interactionId/providerId/appContextType.\n                // interactionType (media type) may change within a conversation (call→callback),\n                // but appContextType scopes cleanup so different context types sharing an id don't collide.\n                resolvedApp =>\n                    resolvedApp.interactionId === interaction.id &&\n                    resolvedApp.providerId === providerId &&\n                    resolvedApp.appContextType === appContextType\n            );\n        }\n    },\n\n    _deleteProviderResolvedApps: function (providerId: string) {\n        this._modifyResolvedApps([], resolvedApp => providerId === resolvedApp.providerId);\n    },\n\n    _deleteInteractionResolvedApps: function (interactionId: string, appContextType: AppContext['type']) {\n        this._modifyResolvedApps(\n            [],\n            resolvedApp => interactionId === resolvedApp.interactionId && resolvedApp.appContextType === appContextType\n        );\n    },\n\n    _modifyResolvedApps: function (additions: ResolvedApp[], deleteFilter?: (resolution: ResolvedApp) => boolean) {\n        const resolvedApps = this.get('resolvedApps');\n        const res = deleteFilter ? resolvedApps.filter(resolvedApp => !deleteFilter(resolvedApp)) : [...resolvedApps];\n        res.push(...additions);\n        this.set('resolvedApps', res);\n    },\n\n    _convertV1AppToV2AppDef: function (model: any, provider: AppProvider, interaction: AppContext) {\n        const { id: interactionId, type: interactionType } = interaction;\n        let appInstance = model;\n\n        let trustedDataPassing = true;\n\n        if (typeOf(model) === 'instance') {\n            if (provider.id !== INTEGRATIONS_INTERAPPTIONS_PROVIDER_ID) {\n                // Only the integration provider should return app instances\n                return null;\n            }\n            appInstance = model;\n            // Checks whether the integration is an InternallyHostedApp or is exempted from checks (externalUrlExemptIntegrationTypeIds)\n            trustedDataPassing = this.get('appsService').isTrustedApp(appInstance);\n        } else {\n            const finalAppConfig = { ...model };\n            delete finalAppConfig['id'];\n            appInstance = this.buildValidInterapption(\n                'dynamic-app-provider-interaction-widget',\n                model.id || crypto.randomUUID(),\n                finalAppConfig,\n                !!provider.trustedProvider\n            );\n        }\n\n        appInstance.set('interactionId', interactionId);\n        appInstance.set('interactionType', interactionType);\n\n        // Compute valid URL\n        let src: URL | null = null;\n        try {\n            src = new URL(appInstance.get('url'));\n        } catch {\n            // Nothing to do, if we cannot compute an URL from V1 def, a generic log message is sent below\n        }\n\n        if (!src) {\n            this.get('logger').error(\n                appUtils.buildInterapptionsLogMsg('Could not compute a valid URL from V1 AppDef'),\n                {\n                    remoteData: {\n                        providerId: provider.id\n                    }\n                }\n            );\n            return null;\n        }\n\n        const result: IframeAppDef = {\n            type: 'iframe',\n            id: appInstance.get('id') || crypto.randomUUID(),\n            displayName: appInstance.get('name'),\n            src,\n            startBehavior: 'lazy',\n            trustedDataPassing,\n            sandbox: appInstance.get('sandbox')\n        };\n\n        const permissionsPolicy = appInstance.get('permissionsPolicy');\n        if (Array.isArray(permissionsPolicy)) {\n            result.allow = permissionsPolicy;\n        }\n\n        const lifecycleConfig = appInstance.get('lifecycle');\n        if (lifecycleConfig) {\n            result.lifecycleConfig = {\n                // Using bootstrapLenient to maintain parity with v1 apps which would\n                // still bootstrap even if the bootstrap timeout expired.\n                bootstrapLenient: true,\n                bootstrap: lifecycleConfig.hooks.bootstrap,\n                focus: lifecycleConfig.hooks.focus,\n                blur: lifecycleConfig.hooks.blur,\n                stop: lifecycleConfig.hooks.stop\n            };\n        }\n\n        const assets = appInstance.get('assets');\n        if (assets) {\n            result.monochromicIcon = appUtils.buildV2IconAsset(assets.monochromicIcon);\n            result.icon = appUtils.buildV2IconAsset(assets.icon);\n        }\n\n        return result;\n    },\n\n    /**\n     * A function that will be bound to this object, a specific provider, an interaction, and an apps requestId and passed\n     * to a provider.  This function can be used by the provider to update the list of apps for the\n     * interaction at a later time as the provider sees fit.\n     *\n     * @param {string} providerId The id of the prover for which the apps will be updated\n     * @param {string} interaction The interaction for which the apps will be updated\n     * @param {string} requestId The id of the request for which this callback is applicable. If the request is no longer applicable, the apps update will be ignored and logged\n     * @param {*} appConfigs The full list of appConfigs the provider wishes to show for the current app state\n     */\n    _providerUpdateAppConfigsCallback(\n        providerId: string,\n        interaction: AppContext,\n        requestId: string,\n        appConfigs: unknown\n    ) {\n        Ember.run.join(() => {\n            if (this.get('isDestroying') || this.get('isDestroyed')) {\n                return;\n            }\n\n            const interactionType = getInteractionType(interaction);\n            const interactionKey = computeInteractionKey(interaction.id, interactionType);\n\n            // Check to see if this request is still applicable (provider/interaction still exist and interaction has not be updated)\n            let [existingRequest] = this._findIssuedAppRequests({\n                providerId,\n                interactionKey,\n                requestId\n            });\n\n            if (!existingRequest) {\n                // This request is out-of-date.  Provider/Interaction Removed or Interaction updated\n\n                let [currentRequest] = this._findIssuedAppRequests({\n                    providerId,\n                    interactionKey\n                });\n\n                this.get('logger').warn(\n                    appUtils.buildInterapptionsLogMsg(\n                        'App Provider apps update callback called on out-of-date request.  Apps update will be ignored.'\n                    ),\n                    {\n                        remoteData: {\n                            interactionId: interaction.id,\n                            interactionType,\n                            appProviderId: providerId,\n                            outOfDateReason: !currentRequest ? 'removed' : 'interactionUpdated'\n                        }\n                    }\n                );\n\n                return;\n            }\n\n            let finalAppConfigs = [];\n            if (Array.isArray(appConfigs)) {\n                // Individual AppConfigs will be validated downstream\n                finalAppConfigs = appConfigs;\n            } else if (appConfigs) {\n                this.get('logger').info(\n                    appUtils.buildInterapptionsLogMsg(\n                        'App Provider callback called with invalid payload.  Valid results are falsy values or an array.'\n                    ),\n                    {\n                        remoteData: {\n                            type: typeOf(appConfigs),\n                            interactionId: interaction.id,\n                            interactionType,\n                            appProviderId: providerId\n                        }\n                    }\n                );\n            }\n\n            this._updateResolvedApps(providerId, finalAppConfigs, interaction);\n        });\n    },\n\n    _manuallySetNotesGadgetAttentionCount(newAttentionCount: number) {\n        const appPoolV2 = this.get('appPoolV2');\n        const selectedInteraction = this.get('selectedInteraction');\n        if (!appPoolV2 || !selectedInteraction) {\n            return;\n        }\n\n        const { groupId, appDefId } = this._getNotesGadgetMetadata(selectedInteraction);\n        appPoolV2.setHeadlessAttentionCount(appDefId, newAttentionCount, groupId);\n    },\n\n    _manuallyRemoveNotesGadgetAttentionCount(interaction: AppContext) {\n        const appPoolV2 = this.get('appPoolV2');\n        if (!appPoolV2) {\n            return;\n        }\n\n        const { groupId, appDefId } = this._getNotesGadgetMetadata(interaction);\n        appPoolV2.removeHeadlessAttentionCount(appDefId, groupId);\n    },\n\n    _getNotesGadgetMetadata(interaction: AppContext) {\n        const interactionType = getInteractionType(interaction);\n        const groupId = computeGroupId(interaction.id, interactionType, 'contextual');\n        const appDefId = computeInterapptionCompositeId(\n            interaction.id,\n            interactionType,\n            NOTES_GADGET_APP_ID,\n            NOTES_GADGET_PROVIDER_ID\n        );\n\n        return { groupId, appDefId };\n    },\n\n    // No cleanup currently needded for willDestroyElement()\n    // No need to cancel outstanding appConfig requests.  They'll be dropped\n    // Interapptions should use app-instance for NR and attempt to trigger a pageAction on windowUnload\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n\n        // ----- Handle appProviders changes\n        let appProviderChange = false;\n        let prevAppProviders = this.get('_prevAppProviders');\n        const validAppProviders = this.get('_validAppProviders');\n\n        // Check for removals\n        if (prevAppProviders) {\n            prevAppProviders.forEach(prevAppProvider => {\n                let newAppProvider = !validAppProviders\n                    ? null\n                    : validAppProviders.find(curr => curr.id === prevAppProvider.id);\n                if (!newAppProvider) {\n                    // Remove case\n                    appProviderChange = true;\n                    this._removeAppProvider(prevAppProvider);\n                }\n            });\n        }\n\n        // Check for additions/updates\n        if (validAppProviders) {\n            validAppProviders.forEach(newAppProvider => {\n                let prevAppProvider = !prevAppProviders\n                    ? null\n                    : prevAppProviders.find(curr => curr.id === newAppProvider.id);\n                if (!prevAppProvider) {\n                    // Add case\n                    appProviderChange = true;\n                    this._addAppProvider(newAppProvider);\n                } else {\n                    // For now, we dont handle/care about edits to providers\n                    // Future: iframe/dsl based app providers will need to account for edit\n                }\n            });\n        }\n\n        if (appProviderChange) {\n            this.set('_prevAppProviders', validAppProviders);\n        }\n\n        // ----- Handle interaction changes\n        let interactionChange = false;\n        let prevInteractions = this.get('_prevActiveInteractions');\n        let interactions = this.get('activeInteractions');\n\n        let prevRawInteractions = this.get('_prevRawActiveInteractions');\n        let rawInteractions: Record<string, any> = {};\n        if (interactions) {\n            interactions.forEach(currInteraction => {\n                const { type: currInteractionType, id: interactionId } = currInteraction;\n                const interactionType = getInteractionType(currInteraction);\n\n                switch (currInteractionType) {\n                    case 'conversation': {\n                        const metadata = currInteraction.payload.get('__interaction_metadata__');\n                        if (!metadata) {\n                            this.get('logger').error(\n                                appUtils.buildInterapptionsLogMsg(\n                                    'No metadata found on the conversation interaction model.'\n                                ),\n                                {\n                                    remoteData: {\n                                        interactionId: interactionId,\n                                        interactionType\n                                    }\n                                }\n                            );\n                        } else {\n                            rawInteractions[interactionId] = metadata;\n                        }\n                        break;\n                    }\n                    case 'workitem': {\n                        const workitem = currInteraction.payload.workitem;\n                        if (!workitem) {\n                            this.get('logger').error(appUtils.buildInterapptionsLogMsg('No workitem found.'), {\n                                remoteData: {\n                                    interactionId: interactionId,\n                                    interactionType\n                                }\n                            });\n                        } else {\n                            rawInteractions[interactionId] = workitem;\n                        }\n                        break;\n                    }\n                    case 'externalContact': {\n                        rawInteractions[interactionId] = { externalContactId: interactionId };\n                        break;\n                    }\n                    case 'analyticsConversation': {\n                        // Use the interactionKey here (conversationId|analyticsConversation) to avoid colisions between analytics and live interactions\n                        const interactionKey = computeInteractionKey(interactionId, currInteractionType);\n                        rawInteractions[interactionKey] = {\n                            conversationId: interactionId\n                        };\n                        break;\n                    }\n                    default:\n                        assertNever(currInteractionType);\n                }\n            });\n        }\n\n        // Check for removals\n        if (prevInteractions) {\n            prevInteractions.forEach(prevInteraction => {\n                let newInteraction = !interactions\n                    ? null\n                    : interactions.find(curr => curr.id === prevInteraction.id && curr.type === prevInteraction.type);\n                if (!newInteraction) {\n                    // Remove case\n                    interactionChange = true;\n\n                    this._removeInteraction(prevInteraction);\n                }\n            });\n        }\n\n        // Check for additions/updates\n        if (interactions) {\n            interactions.forEach(newInteraction => {\n                let prevInteraction = !prevInteractions\n                    ? null\n                    : prevInteractions.find(curr => curr.id === newInteraction.id && curr.type === newInteraction.type);\n\n                if (!prevInteraction) {\n                    // Add case\n                    interactionChange = true;\n                    this._addInteraction(newInteraction);\n                } else {\n                    const prevRawInteractionKey =\n                        prevInteraction.type === 'analyticsConversation'\n                            ? computeInteractionKey(prevInteraction.id, prevInteraction.type)\n                            : prevInteraction.id;\n                    const newRawInteractionKey =\n                        newInteraction.type === 'analyticsConversation'\n                            ? computeInteractionKey(newInteraction.id, newInteraction.type)\n                            : newInteraction.id;\n\n                    const prevRawInteraction = prevRawInteractions[prevRawInteractionKey];\n                    const newRawInteraction = rawInteractions[newRawInteractionKey];\n                    const isRawInteractionChange =\n                        !prevRawInteraction || !newRawInteraction || !isEqual(prevRawInteraction, newRawInteraction);\n\n                    // Check the model's type for deltas in addition to the raw hawk payload\n                    // The model's type update between call and callback can lag behind the hawk payload\n                    // Since we bin interapptions by interaction id and type,\n                    // it's critical we update our interapptions in response to the type change as well\n                    // TODO: in the future, we should derive the type from the raw payload vs the model to avoid this check\n                    const prevInteractionType = prevInteraction ? getInteractionType(prevInteraction) : undefined;\n                    const newInteractionType = getInteractionType(newInteraction);\n                    const isModelTypeChanged = newInteractionType !== prevInteractionType;\n\n                    if (isRawInteractionChange || isModelTypeChanged) {\n                        // Found delta or raw interaction cannot be extracted.\n                        // Update case\n                        interactionChange = true;\n                        this._updateInteraction(newInteraction, prevInteraction);\n                    }\n                }\n            });\n        }\n\n        if (interactionChange) {\n            this.set('_prevActiveInteractions', interactions || null);\n            this.set('_prevRawActiveInteractions', rawInteractions);\n        }\n        // ----- Handle selectedInteraction changes\n\n        let prevSelectedInteraction = this.get('_prevSelectedInteraction');\n        let selectedInteraction = this.get('selectedInteraction');\n        /*\n         * Note: v1 of interapptions-manager used strict equality comparisons;\n         * including differentiating between null and undefined.  We are being\n         * a bit verbose here to maintain that consistency.  We'll clean this up in appsv2.\n         *\n         * For context types without a payload (e.g. externalContact, analyticsConversation), we fall back\n         * to the context object itself. Returning undefined for both prev/curr would\n         * make them always referentially equal, breaking change detection.\n         */\n        const prevSelected =\n            prevSelectedInteraction && 'payload' in prevSelectedInteraction\n                ? prevSelectedInteraction.payload\n                : prevSelectedInteraction;\n        const currSelected =\n            selectedInteraction && 'payload' in selectedInteraction ? selectedInteraction.payload : selectedInteraction;\n        if (prevSelected !== currSelected) {\n            this.set('_prevSelectedInteraction', selectedInteraction);\n        }\n        if (\n            selectedInteraction &&\n            (prevSelectedInteraction?.id !== selectedInteraction.id ||\n                prevSelectedInteraction?.type !== selectedInteraction.type) &&\n            this.get('agentPanelIsActive')\n        ) {\n            // Auto Scroll\n            const groupId = computeGroupId(\n                selectedInteraction.id,\n                getInteractionType(selectedInteraction),\n                'contextual'\n            );\n            const autoScrollActions = new Map(this.get('autoScrollActions'));\n            if (autoScrollActions.has(groupId)) {\n                const panelId = autoScrollActions.get(groupId)!;\n                run.later(\n                    this,\n                    () => {\n                        if (this.get('isDestroying') || this.get('isDestroyed')) {\n                            return;\n                        }\n                        this._carouselContextualController?.focusApp(panelId);\n                    },\n                    250\n                );\n                autoScrollActions.delete(groupId);\n                this.set('autoScrollActions', autoScrollActions);\n            }\n        }\n        if (\n            prevSelectedInteraction?.id !== selectedInteraction?.id ||\n            prevSelectedInteraction?.type !== selectedInteraction?.type\n        ) {\n            this._triggerOnVisibleContextualAppsForCurrInteractionChangedAction();\n        }\n\n        // Agent Panel Shown / Hidden\n        const prevAgentPanelIsActive = this.get('_prevAgentPanelIsActive');\n        const agentPanelIsActive = this.get('agentPanelIsActive');\n        if (prevAgentPanelIsActive !== agentPanelIsActive && agentPanelIsActive) {\n            if (selectedInteraction) {\n                const groupId = computeGroupId(\n                    selectedInteraction.id,\n                    getInteractionType(selectedInteraction),\n                    'contextual'\n                );\n                const layoutTemplate = this.get('contextualLayoutTemplates').get(groupId);\n                if (layoutTemplate) {\n                    this._triggerLayoutActions(groupId, layoutTemplate);\n                }\n            }\n        }\n        this.set('_prevAgentPanelIsActive', agentPanelIsActive);\n\n        const validActiveInteractions = this.get('validActiveInteractions');\n\n        // Forced Panel Selection Map\n        const forcedPanelSelectionMap = this.get('forcedPanelSelectionMap');\n        const _prevForcedPanelSelectionMap = this.get('_prevForcedPanelSelectionMap');\n        for (const validActiveInteraction of validActiveInteractions) {\n            const validActiveInteractionType = getInteractionType(validActiveInteraction);\n            const validActiveInteractionKey = computeInteractionKey(\n                validActiveInteraction.id,\n                validActiveInteractionType\n            );\n            const appDefIds = forcedPanelSelectionMap[validActiveInteractionKey] ?? [];\n            const previousAppDefIds = _prevForcedPanelSelectionMap[validActiveInteractionKey] ?? [];\n            const groupId = computeGroupId(validActiveInteraction.id, validActiveInteractionType, 'contextual');\n            const forcedAppDefIdsToAdd = appDefIds.filter(x => !previousAppDefIds.includes(x));\n            const forcedAppDefIdsToRemove = previousAppDefIds.filter(x => !appDefIds.includes(x));\n            if (forcedAppDefIdsToRemove.length > 0) {\n                this._removePersistenceAppDefIdIgnoreList(\n                    groupId,\n                    forcedAppDefIdsToRemove.map(appDefId =>\n                        [validActiveInteraction.id, validActiveInteractionType, appDefId].join('&')\n                    )\n                );\n            }\n            if (forcedAppDefIdsToAdd.length > 0) {\n                this._addPersistenceAppDefIdIgnoreList(\n                    groupId,\n                    forcedAppDefIdsToAdd.map(appDefId =>\n                        [validActiveInteraction.id, validActiveInteractionType, appDefId].join('&')\n                    )\n                );\n                run.later(\n                    this,\n                    () => {\n                        if (this.get('isDestroying') || this.get('isDestroyed')) {\n                            return;\n                        }\n                        this._openPanels(validActiveInteraction, forcedAppDefIdsToAdd);\n                        this.onAppsForcedOpen(forcedAppDefIdsToAdd);\n                    },\n                    250\n                );\n            }\n        }\n        this.set('_prevForcedPanelSelectionMap', cloneDeep(forcedPanelSelectionMap));\n\n        const validActiveContextualGroupIds = validActiveInteractions.map(appContext =>\n            computeGroupId(appContext.id, getInteractionType(appContext), 'contextual')\n        );\n\n        // Auto Scroll Action Cleanup\n        this.set(\n            'autoScrollActions',\n            new Map(\n                [...this.get('autoScrollActions')].filter(([groupId]) => {\n                    return validActiveContextualGroupIds.includes(groupId);\n                })\n            )\n        );\n\n        // Auto Open Action Cleanup\n        this.set(\n            'autoOpenActions',\n            new Map(\n                [...this.get('autoOpenActions')].filter(([groupId]) => {\n                    return validActiveContextualGroupIds.includes(groupId);\n                })\n            )\n        );\n\n        // Contextual Layout Template Cleanup\n        const ephemeralCarouselLayoutTemplateMap = this.get('ephemeralCarouselLayoutTemplateMap');\n        const newEphemeralCarouselLayoutTemplateMap = Object.fromEntries(\n            Object.entries(ephemeralCarouselLayoutTemplateMap).filter(([appContextKey]) =>\n                // Filter any inactive interaction by id only (we want to keep call/callback layout templates)\n                validActiveInteractions.some(appContext => {\n                    const [appContextId, interactionType] = appContextKey.split('.');\n                    return (\n                        appContextId === appContext.id &&\n                        computeAppContextTypeFromInteractionType(interactionType) === appContext.type\n                    );\n                })\n            )\n        );\n        this.set('ephemeralCarouselLayoutTemplateMap', newEphemeralCarouselLayoutTemplateMap);\n        this.set(\n            'contextualLayoutTemplates',\n            new Map(\n                [...this.get('contextualLayoutTemplates')].filter(([groupId]) =>\n                    validActiveContextualGroupIds.includes(groupId)\n                )\n            )\n        );\n        this.set(\n            'contextualLayoutTemplateContextMap',\n            new Map(\n                [...this.get('contextualLayoutTemplateContextMap')].filter(([groupId]) =>\n                    validActiveContextualGroupIds.includes(groupId)\n                )\n            )\n        );\n\n        // Scripter State\n        // TODO: Remove fully when ft('PURE-6186_Scripter_Gadget_GCUI') is fully turned on.\n        const contextualInteractionScriptStateMap = this.get('contextualInteractionScriptStateMap');\n        if (!this.get('useScripterGadget')) {\n            const _prevContextualInteractionScriptStateMap = this.get('_prevContextualInteractionScriptStateMap');\n            if (selectedInteraction) {\n                const scriptAvailable = contextualInteractionScriptStateMap[selectedInteraction.id]?.scriptAvailable;\n                if (\n                    scriptAvailable &&\n                    !_prevContextualInteractionScriptStateMap[selectedInteraction.id]?.scriptAvailable\n                ) {\n                    // Script is now available, we should open script panel if it's set in panel manager settings\n                    const autoActivePanel =\n                        this.get('initialPanelSelection')[\n                            computeInteractionKey(selectedInteraction.id, getInteractionType(selectedInteraction))\n                        ];\n                    if (autoActivePanel === 'scripts') {\n                        run.later(\n                            this,\n                            () => {\n                                if (this.get('isDestroying') || this.get('isDestroyed')) {\n                                    return;\n                                }\n                                // This truthy check shouldn't be necessary,\n                                // however TS seems to be loosing the closure and\n                                // check on selectedInteraction from line 1859 above\n                                if (selectedInteraction) {\n                                    const interactionType = getInteractionType(selectedInteraction);\n                                    const interactionKey = computeInteractionKey(\n                                        selectedInteraction.id,\n                                        interactionType\n                                    );\n                                    const forcedAppDefIds = forcedPanelSelectionMap[interactionKey];\n                                    // Do not autoscroll to scripter if an app has been forced activated\n                                    if (!forcedAppDefIds.length) {\n                                        const groupId = computeGroupId(\n                                            selectedInteraction.id,\n                                            interactionType,\n                                            'contextual'\n                                        );\n                                        const compositeId = computeInterapptionCompositeId(\n                                            selectedInteraction.id,\n                                            interactionType,\n                                            'scripts',\n                                            'native'\n                                        );\n                                        this._addAutoScrollAction(groupId, compositeId);\n                                    }\n                                }\n                            },\n                            250\n                        );\n                    }\n                }\n            }\n        }\n        this.set('_prevContextualInteractionScriptStateMap', cloneDeep(contextualInteractionScriptStateMap));\n\n        // For now, web-directory fully handles the Notes gadget splat logic.\n        // Once there is daemon/worker implementation to support gadget lazy-loading,\n        // we can remove this and let the Notes gadget manage the splat logic\n        const notesHistoryLength = this.get('notesHistoryLength');\n        const appPoolV2 = this.get('appPoolV2');\n        if (selectedInteraction && appPoolV2) {\n            const { groupId, appDefId } = this._getNotesGadgetMetadata(selectedInteraction);\n            const currentAttentionCount = appPoolV2.getHeadlessAttentionCount(appDefId, groupId);\n            const newAttentionCount = notesHistoryLength > 0 ? 1 : 0;\n\n            if (newAttentionCount > 0 && currentAttentionCount <= 0) {\n                this._manuallySetNotesGadgetAttentionCount(newAttentionCount);\n            }\n        }\n\n        // Update Controller State\n        this._updateControllerState();\n    },\n\n    _getConversationLayoutTemplate: function (groupId: string, groupState: GroupState): AppViewStackHostLayoutTemplate {\n        const layoutTemplate: AppViewStackHostLayoutTemplate = { items: [] };\n        const tokens = computeTokensFromGroupId(groupId);\n        if (tokens) {\n            const appDefState = groupState.appDefs[0];\n            if (appDefState) {\n                layoutTemplate.visibleAppDefId = appDefState.appDef.id;\n                layoutTemplate.items = [\n                    {\n                        appDefId: layoutTemplate.visibleAppDefId,\n                        active: true\n                    }\n                ];\n            }\n        }\n        return layoutTemplate;\n    },\n\n    _getContextualLayoutTemplate: function (\n        groupId: string,\n        groupState: GroupState,\n        previousLayoutTemplate: AppCarouselHostLayoutTemplate | null\n    ): AppCarouselHostLayoutTemplate {\n        let layoutTemplate: AppCarouselHostLayoutTemplate = { items: [] };\n        const tokens = computeTokensFromGroupId(groupId);\n        if (tokens) {\n            layoutTemplate = this._getPersistentContextualLayoutTemplate(groupId, groupState, previousLayoutTemplate);\n        }\n        return layoutTemplate;\n    },\n\n    _getPersistentContextualLayoutTemplate: function (\n        groupId: string,\n        groupState: GroupState,\n        previousLayoutTemplate: AppCarouselHostLayoutTemplate | null\n    ): AppCarouselHostLayoutTemplate {\n        const initial = previousLayoutTemplate === null;\n        let layoutTemplate: AppCarouselHostLayoutTemplate = { items: [] };\n        let isDefaultLayoutTemplate = true;\n        const groupIdTokens = computeTokensFromGroupId(groupId);\n        if (groupIdTokens) {\n            const appContext = this.get('validActiveInteractions').find(\n                appContext =>\n                    appContext.id === groupIdTokens.interactionId &&\n                    getInteractionType(appContext) === groupIdTokens.interactionType\n            );\n            if (appContext) {\n                const appContextPrecedenceStorageKeys = [\n                    // interactionId/interactionType\n                    `${groupIdTokens.interactionId}.${groupIdTokens.interactionType}`,\n                    // interactionType\n                    groupIdTokens.interactionType\n                ];\n\n                // Get existing layout (ephemeral or storage)\n                const carouselLayoutTemplateMap = this.get('carouselLayoutTemplateMap');\n                for (const appContextPrecedenceStorageKey of appContextPrecedenceStorageKeys) {\n                    const existingLayout = carouselLayoutTemplateMap[appContextPrecedenceStorageKey];\n                    if (existingLayout) {\n                        isDefaultLayoutTemplate = false;\n                        layoutTemplate = _buildInteractionSpecificLayoutFromGeneric(\n                            // Clone here to ensure this layout is referentially unique for each processing function\n                            cloneDeep(existingLayout),\n                            appContext,\n                            this.get('session').get('features'),\n                            this.get('_validAppProviders')\n                        );\n                        break;\n                    }\n                }\n\n                // Add missing appDefs from groupState\n                for (const appDefState of groupState.appDefs) {\n                    const index = layoutTemplate.items.findIndex(\n                        layoutTemplate => layoutTemplate.appDefId === appDefState.appDef.id\n                    );\n                    if (index === -1) {\n                        layoutTemplate.items.push({\n                            appDefId: appDefState.appDef.id,\n                            active: false,\n                            visible: false,\n                            pinned: true,\n                            size: 'small'\n                        });\n                    }\n                }\n\n                // Update Native Apps\n                // We are using nativeApps here rather than nativeAppDefs because not all app applicability\n                // can be determined at this point (i.e. script presence is async resolved for the native app)\n                // Thus, we want to add all possible appdefs to the layout template\n                const nativeApps = (this.get('nativeApps') as NativeApp[]).filter(currNativeApp => {\n                    if (\n                        appContext.type === 'conversation' &&\n                        currNativeApp.appDef.id === 'scripts' &&\n                        !this.useScripterGadget\n                    ) {\n                        // Native scripter is enabled and this is a conversation context\n                        // Adding the scripter app def unconditionally so it's in the app layout\n                        // and can be sorted using the default order.\n                        // Otherwise, when scripter async resolves, it will not be\n                        // present in initial layout template, breaking the initial app order and setting scripter last\n                        return true;\n                    } else {\n                        return currNativeApp.matchesInteraction(appContext);\n                    }\n                });\n                for (const nativeApp of nativeApps) {\n                    const appDefId = computeInterapptionCompositeId(\n                        groupIdTokens.interactionId,\n                        groupIdTokens.interactionType,\n                        nativeApp.appDef.id,\n                        'native'\n                    );\n                    const index = layoutTemplate.items.findIndex(\n                        layoutTemplate => layoutTemplate.appDefId === appDefId\n                    );\n                    if (index === -1) {\n                        layoutTemplate.items.push({\n                            appDefId,\n                            active: false,\n                            visible: false,\n                            pinned: true,\n                            size: 'small'\n                        });\n                    }\n                }\n\n                // Set Available Sizes\n                const _validAppProviders = this.get('_validAppProviders');\n                layoutTemplate.items = layoutTemplate.items.map(layoutTemplateItem => {\n                    let availableSizes: AppCarouselHostLayoutTemplateItemSize[] = ['small', 'medium', 'large'];\n                    const tokens = computeTokensFromInterapptionCompositeId(layoutTemplateItem.appDefId);\n                    if (tokens) {\n                        if (tokens.providerId === 'native') {\n                            const nativeApp = nativeApps.find(({ appDef }) => appDef.id === tokens.appDefId);\n                            if (nativeApp && nativeApp.availableSizes) {\n                                availableSizes = nativeApp.availableSizes;\n                            }\n                        } else {\n                            const validAppProvider = _validAppProviders.find(\n                                _validAppProvider => _validAppProvider.id === tokens.providerId\n                            );\n                            if (validAppProvider && validAppProvider.getAvailableAppSizes) {\n                                const appAvailableSizes = validAppProvider.getAvailableAppSizes(tokens.appDefId);\n                                if (appAvailableSizes) {\n                                    availableSizes = appAvailableSizes;\n                                }\n                            }\n                        }\n                    }\n                    const newSize = availableSizes.includes(layoutTemplateItem.size)\n                        ? layoutTemplateItem.size\n                        : availableSizes[0];\n                    return {\n                        ...layoutTemplateItem,\n                        availableSizes,\n                        size: newSize\n                    };\n                });\n\n                // Set Can Use Focus Mode\n                const enableFocusMode = this.get('enableFocusMode');\n                layoutTemplate.items = layoutTemplate.items.map(layoutTemplateItem => {\n                    if (!enableFocusMode) {\n                        return {\n                            ...layoutTemplateItem,\n                            canUseFocusMode: false\n                        };\n                    }\n                    let canUseFocusMode: boolean = false;\n                    const tokens = computeTokensFromInterapptionCompositeId(layoutTemplateItem.appDefId);\n                    if (tokens) {\n                        if (tokens.providerId === 'native') {\n                            const nativeApp = nativeApps.find(({ appDef }) => appDef.id === tokens.appDefId);\n                            if (nativeApp && nativeApp.canUseFocusMode) {\n                                canUseFocusMode = nativeApp.canUseFocusMode;\n                            }\n                        } else {\n                            const validAppProvider = _validAppProviders.find(\n                                _validAppProvider => _validAppProvider.id === tokens.providerId\n                            );\n                            if (validAppProvider && validAppProvider.getCanUseFocusMode) {\n                                const appCanUseFocusMode = validAppProvider.getCanUseFocusMode(tokens.appDefId);\n                                if (appCanUseFocusMode) {\n                                    canUseFocusMode = appCanUseFocusMode;\n                                }\n                            }\n                        }\n                    }\n                    return {\n                        ...layoutTemplateItem,\n                        canUseFocusMode\n                    };\n                });\n\n                if (initial) {\n                    let autoScrollAppDefId: string | null = null;\n                    const interactionKey = computeInteractionKey(\n                        groupIdTokens.interactionId,\n                        groupIdTokens.interactionType\n                    );\n                    // Persist FocusModeAppDefId on initial layout\n                    this._updatePersistenceFocusModeAppDefId(groupId, layoutTemplate.focusModeAppDefId);\n                    // Auto Activate Panel Manager App\n                    const initialPanelSelection = this.get('initialPanelSelection');\n                    const autoActivePanel = initialPanelSelection[interactionKey];\n                    if (autoActivePanel) {\n                        const appDefLookupIds = [\n                            // Integration\n                            [groupIdTokens.interactionId, groupIdTokens.interactionType, autoActivePanel].join('&'),\n                            // Native\n                            [\n                                groupIdTokens.interactionId,\n                                groupIdTokens.interactionType,\n                                autoActivePanel,\n                                'native'\n                            ].join('&')\n                        ];\n                        const index = layoutTemplate.items.findIndex(({ appDefId }) =>\n                            appDefLookupIds.includes(appDefId)\n                        );\n                        if (index !== -1) {\n                            layoutTemplate.items[index].active = true;\n                            layoutTemplate.items[index].visible = true;\n                            this._addPersistenceAppDefIdIgnoreList(groupId, [layoutTemplate.items[index].appDefId]);\n                            autoScrollAppDefId = layoutTemplate.items[index].appDefId;\n                        }\n                    }\n                    // Auto Activate Forced Apps\n                    const forcedPanelSelectionMap = this.get('forcedPanelSelectionMap');\n                    const forcedPanelSelection = forcedPanelSelectionMap[interactionKey];\n                    if (forcedPanelSelection) {\n                        for (const appDefId of forcedPanelSelection) {\n                            const appDefLookupIds = [\n                                // Integration\n                                [groupIdTokens.interactionId, groupIdTokens.interactionType, appDefId].join('&'),\n                                // Native\n                                [groupIdTokens.interactionId, groupIdTokens.interactionType, appDefId, 'native'].join(\n                                    '&'\n                                )\n                            ];\n                            const index = layoutTemplate.items.findIndex(({ appDefId }) =>\n                                appDefLookupIds.includes(appDefId)\n                            );\n                            if (index !== -1) {\n                                layoutTemplate.items[index].active = true;\n                                layoutTemplate.items[index].visible = true;\n                                this._addPersistenceAppDefIdIgnoreList(groupId, [layoutTemplate.items[index].appDefId]);\n                                autoScrollAppDefId = layoutTemplate.items[index].appDefId;\n                            }\n                        }\n                    }\n                    // Auto Scroll forced app, or panel manager app if there's none\n                    if (autoScrollAppDefId) {\n                        this._addAutoScrollAction(groupId, autoScrollAppDefId);\n                        this._clearFocusModeForForcedPanel(layoutTemplate, groupId, autoScrollAppDefId);\n                    }\n\n                    // Sort apps if this is initial layout\n                    if (isDefaultLayoutTemplate) {\n                        layoutTemplate.items = sortBy(\n                            layoutTemplate.items.map((layoutTemplateItem, index) => {\n                                const tokens = computeTokensFromInterapptionCompositeId(layoutTemplateItem.appDefId);\n                                let sortPriority = 100 + index;\n                                if (tokens) {\n                                    sortPriority =\n                                        this.get('_appSortPriority')[`${tokens.appDefId}&${tokens.providerId}`] ??\n                                        sortPriority;\n                                }\n                                return {\n                                    layoutTemplateItem,\n                                    sortPriority\n                                };\n                            }),\n                            ['sortPriority']\n                        ).map(({ layoutTemplateItem }) => layoutTemplateItem);\n                    }\n                }\n            } else if (previousLayoutTemplate) {\n                // If no app context is found, use the previous layout template.\n                // This happens when the interaction is removed, and layouts will be cleared by controller.\n                layoutTemplate = previousLayoutTemplate;\n            }\n        }\n        return layoutTemplate;\n    },\n\n    /**\n     * Requests apps from the specified provider and returns\n     * a promise which either resolves with a non-null list of apps or rejects if the response becomes inapplicable.\n     *\n     * This method also maintains a cache of previously issued app requests to deal with race\n     * conditions of modifying both providers and interactions in the same didReceiveAttrs set.\n     * The cache persists until the interaction or provider is removed or the interaction is updated.\n     * If the interaction is updated, a new request will be made to the provider for an updated list of apps.\n     * This cache also controls the validity of the provider promise response and usage of the app update callback.\n     *\n     * @returns {Promise} The result of the apps request\n     * @resolve {Object} An object of the form {appConfigs: []}; the array will be empty if the provider returns an invalid payload or throws\n     * @reject {string} The reason code that the request is no longer applicable.  Currently this can only happen if the\n     *  provider/interaction was removed or if the interaction was updated before the appConfig response resolved\n     */\n    _requestAppsFromProvider(\n        provider: AppProvider,\n        interaction: AppContext,\n        prevInteraction: null | AppContext = null\n    ): Promise<{ appConfigs: any[] }> {\n        const interactionKey = computeInteractionKey(interaction.id, getInteractionType(interaction));\n        if (prevInteraction) {\n            // Interaction Update Case\n            // Remove the requests for the previous version of the interaction\n            const prevInteractionKey = computeInteractionKey(prevInteraction.id, getInteractionType(prevInteraction));\n            this._removeIssuedAppRequests({ providerId: provider.id, interactionKey: prevInteractionKey });\n        } else {\n            let [existingRequest] = this._findIssuedAppRequests({\n                providerId: provider.id,\n                interactionKey\n            });\n\n            if (existingRequest) {\n                return existingRequest.request;\n            }\n        }\n\n        let result: Promise<{ appConfigs: any[] }>;\n\n        let requestId = guidFor({});\n        let callback = this._providerUpdateAppConfigsCallback.bind(this, provider.id, interaction, requestId);\n        if (provider.type === 'programmatic') {\n            result = this._requestAppsFromAsyncProgrammaticProvider(provider, interaction, callback).then(apps => {\n                // Check to see if this request is still applicable (provider/interaction still exist and interaction has not be updated)\n                let [existingRequest] = this._findIssuedAppRequests({\n                    providerId: provider.id,\n                    interactionKey,\n                    requestId\n                });\n\n                if (existingRequest) {\n                    // apps will only be undefined if this component is destroying\n                    return apps || { appConfigs: [] };\n                } else {\n                    // Since this request was not found in issuedRequests there's no concern of this rejection being cached and later encountered\n                    return RSVP.reject(OUT_OF_DATE_ASYNC_PROVIDER_RESPONSE);\n                }\n            });\n        } else {\n            // Providers are validated and this should never be hit/thrown\n            throw new Error('Invalid provider type specified');\n        }\n\n        this.get('_issuedAppRequests').push({\n            providerId: provider.id,\n            interactionId: interaction.id,\n            interactionKey,\n            appContextType: interaction.type,\n            request: result,\n            requestId\n        });\n\n        return result;\n    },\n\n    /**\n     * Requests apps from the specified asynchronous provider and returns\n     * a promise which always resolves with a list of any non-empty objects\n     * returned by the provider. The validity of the objects wrt an app config\n     * is not assessed.\n     *\n     * @param {Object} provider - The app provider from which to request apps\n     * @param {Object} interaction - The interaction model on which to request\n     * @param {function} appUpdCallback - The appsUpdCallback function passed to providers for out-of-band updates\n     *\n     * @returns a promise which always resolves to a list of any non-empty objects\n     * returned by the provider, {appConfigs: []}.\n     */\n    _requestAppsFromAsyncProgrammaticProvider(\n        provider: AppProvider,\n        interaction: AppContext,\n        appUpdCallback: AppsUpdateCallback\n    ): Promise<undefined | { appConfigs: any[] }> {\n        const interactionType = getInteractionType(interaction);\n        try {\n            return provider\n                .getAppConfigs(interaction, appUpdCallback)\n                .then(result => {\n                    if (this.get('isDestroying') || this.get('isDestroyed')) {\n                        return;\n                    }\n\n                    let appConfigs = [];\n\n                    if (typeOf(result) === 'array') {\n                        // Individual AppConfigs will be validated downstream\n                        appConfigs = result;\n                    } else if (result) {\n                        this.get('logger').info(\n                            appUtils.buildInterapptionsLogMsg(\n                                'Asynchronous App Provider returned an invalid result.  Valid results are falsy values or an array.'\n                            ),\n                            {\n                                remoteData: {\n                                    type: typeOf(result),\n                                    interactionId: interaction.id,\n                                    interactionType,\n                                    appProviderId: provider.id\n                                }\n                            }\n                        );\n                    }\n\n                    return { appConfigs };\n                })\n                .catch(() => {\n                    return { appConfigs: [] };\n                });\n        } catch (e) {\n            this.get('logger').info(\n                appUtils.buildInterapptionsLogMsg(\n                    'Asynchronous App Provider returned non-promise object or threw exception when requesting apps'\n                ),\n                {\n                    exception: e,\n                    remoteData: {\n                        interactionId: interaction.id,\n                        interactionType,\n                        appProviderId: provider.id\n                    }\n                }\n            );\n\n            return RSVP.resolve({ appConfigs: [] });\n        }\n    },\n\n    _findIssuedAppRequests(\n        searchQuery: IssuedAppRequestSearchQuery,\n        issuedAppRequests?: IssuedAppRequest[]\n    ): IssuedAppRequest[] {\n        return (issuedAppRequests || this.get('_issuedAppRequests')).filter(\n            matchesIssuedAppRequest.bind(this, searchQuery)\n        );\n    },\n\n    _removeIssuedAppRequests(\n        searchQuery: IssuedAppRequestSearchQuery,\n        issuedAppRequests?: IssuedAppRequest[]\n    ): IssuedAppRequest[] {\n        const targetIssuedAppRequests = issuedAppRequests || this.get('_issuedAppRequests');\n\n        let result: IssuedAppRequest[] = [];\n        for (let index = targetIssuedAppRequests.length - 1; index >= 0; index--) {\n            let currRequest = targetIssuedAppRequests[index];\n            if (matchesIssuedAppRequest(searchQuery, currRequest)) {\n                result.push(currRequest);\n                targetIssuedAppRequests.splice(index, 1);\n            }\n        }\n        return result.reverse();\n    },\n\n    // Exposed for test mocking purposes\n    _addPageAction(eventName: string, attrs: Record<string, string | number>): void {\n        addPageAction(eventName, attrs);\n    },\n\n    _appSortPriority: computed(standardTransformationFtComputedDepKey, function (): Record<string, number> {\n        return Object.fromEntries(\n            Object.entries(appSortPriority).map(([panelId, sortOrder]) => {\n                return [addNativeProvider(transformPanelId(panelId, this.get('session.features'))), sortOrder];\n            })\n        );\n    })\n});\n\ntype AppMetadata = {\n    conversationAppDefs: number;\n    conversationRunningApps: number;\n    conversationFailedApps: number;\n    contextualAppDefs: number;\n    contextualRunningApps: number;\n    contextualFailedApps: number;\n};\n/**\n * Calculates interaction and binned telemetry metadata from the given interactions and interaction app groups.\n */\nfunction getTelemetryMetadata({\n    interactions,\n    poolState,\n    selectedInteraction,\n    getInteractionBuckets = interaction => [interaction.type]\n}: {\n    interactions: AppContext[];\n    poolState?: PoolState;\n    selectedInteraction?: AppContext;\n    getInteractionBuckets?: (interaction: AppContext) => string[];\n}) {\n    const interactionsMetadata = Object.fromEntries(\n        interactions.map(interaction => {\n            return [\n                computeInteractionKey(interaction.id, interaction.type),\n                {\n                    type: getInteractionType(interaction),\n                    isActive:\n                        interaction.id === selectedInteraction?.id && interaction.type === selectedInteraction?.type,\n                    ...getInteractionAppMetadata({ interaction, poolState })\n                }\n            ];\n        })\n    );\n\n    const bucketCounts: Record<string, { interactions: number } & AppMetadata> = {};\n    interactions.forEach(currInteraction => {\n        const currMetadata = interactionsMetadata[computeInteractionKey(currInteraction.id, currInteraction.type)];\n        if (!currMetadata) {\n            return;\n        }\n\n        const {\n            conversationAppDefs,\n            conversationRunningApps,\n            conversationFailedApps,\n            contextualAppDefs,\n            contextualRunningApps,\n            contextualFailedApps\n        } = currMetadata;\n\n        getInteractionBuckets(currInteraction).forEach(currBucketName => {\n            let currBucket = bucketCounts[currBucketName];\n            if (!currBucket) {\n                currBucket = {\n                    interactions: 0,\n                    conversationAppDefs: 0,\n                    conversationRunningApps: 0,\n                    conversationFailedApps: 0,\n                    contextualAppDefs: 0,\n                    contextualRunningApps: 0,\n                    contextualFailedApps: 0\n                };\n                bucketCounts[currBucketName] = currBucket;\n            }\n\n            currBucket.interactions++;\n            currBucket.conversationAppDefs += conversationAppDefs;\n            currBucket.conversationRunningApps += conversationRunningApps;\n            currBucket.conversationFailedApps += conversationFailedApps;\n            currBucket.contextualAppDefs += contextualAppDefs;\n            currBucket.contextualRunningApps += contextualRunningApps;\n            currBucket.contextualFailedApps += contextualFailedApps;\n        });\n    });\n\n    const bucketMetadata = Object.entries(bucketCounts).reduce(\n        (\n            acc,\n            [\n                bucketName,\n                {\n                    interactions,\n                    conversationAppDefs,\n                    conversationRunningApps,\n                    conversationFailedApps,\n                    contextualAppDefs,\n                    contextualRunningApps,\n                    contextualFailedApps\n                }\n            ]\n        ) => {\n            return {\n                ...acc,\n                [`${bucketName}InteractionCount`]: interactions,\n                [`${bucketName}TotalConversationAppDefs`]: conversationAppDefs,\n                [`${bucketName}TotalConversationFailedApps`]: conversationFailedApps,\n                [`${bucketName}TotalConversationRunningApps`]: conversationRunningApps,\n                [`${bucketName}TotalContextualAppDefs`]: contextualAppDefs,\n                [`${bucketName}TotalContextualRunningApps`]: contextualRunningApps,\n                [`${bucketName}TotalContextualFailedApps`]: contextualFailedApps\n            };\n        },\n        {}\n    );\n\n    return {\n        ...bucketMetadata,\n        currentInteractions: {\n            ...interactionsMetadata\n        }\n    };\n}\n\nfunction getInteractionAppMetadata({\n    interaction,\n    poolState\n}: {\n    interaction: AppContext;\n    poolState?: PoolState;\n}): AppMetadata {\n    const result = {\n        conversationAppDefs: 0,\n        conversationRunningApps: 0,\n        conversationFailedApps: 0,\n        contextualAppDefs: 0,\n        contextualRunningApps: 0,\n        contextualFailedApps: 0\n    };\n\n    const interactionType = getInteractionType(interaction);\n\n    if (!interactionType || !poolState) {\n        return result;\n    }\n\n    (['conversation', 'contextual'] as const).forEach(currGroupType => {\n        const currGroup = poolState[computeGroupId(interaction.id, interactionType, currGroupType)];\n        if (!currGroup) {\n            return;\n        }\n\n        const runningApps = currGroup.renderedInstances.filter(({ appState }) => appState !== 'STOPPING');\n\n        result[`${currGroupType}AppDefs`] += currGroup.appDefs.length;\n        result[`${currGroupType}RunningApps`] += runningApps.length;\n        result[`${currGroupType}FailedApps`] += currGroup.failedAppInstances.length;\n    });\n\n    return result;\n}\n\n/* Calculates the layout metadata for the given layout template map and interaction app context. */\nexport function getLayoutMetadata(\n    layoutTemplate: AppCarouselHostLayoutTemplate,\n    appContext: AppContext\n): Record<string, string | number> {\n    const interactionId = appContext.id;\n    const interactionType = getInteractionType(appContext);\n    const metadata: Record<string, string | number> = {\n        interactionId,\n        interactionType,\n        queueId: getQueueIdFromAppContext(appContext) || 'unknown'\n    };\n\n    const sizeCounts = {\n        small: { active: 0, visible: 0 },\n        medium: { active: 0, visible: 0 },\n        large: { active: 0, visible: 0 },\n        xlarge: { active: 0, visible: 0 }\n    };\n\n    const focusModeAppName = layoutTemplate.focusModeAppDefId?.split('&')[0].replaceAll('-', '_') || 'none';\n    metadata['focusModeAppDefId'] = focusModeAppName;\n    layoutTemplate.items.forEach(app => {\n        if (app.active) {\n            sizeCounts[app.size].active++;\n            if (app.visible) sizeCounts[app.size].visible++;\n\n            // The provided layout template omits interaction ids and types so the appDefId is the app name.\n            // Technically, the providerId is also necessary to guaranteed uniqueness of built-in interapptions.\n            // However, we're dropping the providerId for ease of working with the data in NR.\n            // NR only allows a-zA-Z0-9:_./ for attribute names\n            const appName = app.appDefId.split('&')[0].replaceAll('-', '_');\n            metadata[`${appName}Size`] = app.size;\n            metadata[`${appName}Visible`] = app.visible ? 'true' : 'false';\n        }\n    });\n\n    Object.entries(sizeCounts).forEach(([size, counts]) => {\n        metadata[`total${capitalize(size)}ActiveApps`] = counts.active;\n        metadata[`total${capitalize(size)}VisibleApps`] = counts.visible;\n    });\n\n    return metadata;\n}\n\nfunction matchesIssuedAppRequest(\n    searchQuery: IssuedAppRequestSearchQuery,\n    issuedAppRequest: IssuedAppRequest\n): boolean {\n    if (searchQuery.interactionKey && searchQuery.interactionKey !== issuedAppRequest.interactionKey) {\n        return false;\n    }\n\n    if (searchQuery.interactionId && searchQuery.interactionId !== issuedAppRequest.interactionId) {\n        return false;\n    }\n\n    if (searchQuery.appContextType && searchQuery.appContextType !== issuedAppRequest.appContextType) {\n        return false;\n    }\n\n    if (searchQuery.providerId && searchQuery.providerId !== issuedAppRequest.providerId) {\n        return false;\n    }\n\n    if (searchQuery.requestId && searchQuery.requestId !== issuedAppRequest.requestId) {\n        return false;\n    }\n\n    return true;\n}\n\nfunction isValidAppProvider(provider: AppProvider): boolean {\n    if (\n        !['object', 'instance'].includes(typeOf(provider)) ||\n        typeOf(provider.id) !== 'string' ||\n        isBlank(provider.id) ||\n        typeOf(provider.getAppConfigs) !== 'function'\n    ) {\n        return false;\n    }\n\n    if (!['undefined', 'boolean'].includes(typeOf(get(provider, 'trustedProvider')))) {\n        return false;\n    }\n\n    if (!['undefined', 'function'].includes(typeOf(get(provider, 'interactionRemoved')))) {\n        return false;\n    }\n\n    if (!['undefined', 'boolean'].includes(typeOf(get(provider, 'monitorInteractionUpdates')))) {\n        return false;\n    }\n\n    // Future, support iframe, worker, etc.\n    if (provider.type !== 'programmatic') {\n        return false;\n    }\n\n    // Programmatic Provider Validations\n    if (provider.type === 'programmatic') {\n        if (!['null', 'undefined', 'boolean'].includes(typeOf(provider.trustedProvider))) {\n            return false;\n        }\n    }\n\n    return true;\n}\n\nexport function getInteractionType(interaction: AppContext): string {\n    if (!interaction || !interaction.type || typeof interaction.type !== 'string') {\n        return '';\n    }\n    const { type } = interaction;\n    switch (type) {\n        case 'conversation':\n            return getCommunicationType(interaction.payload);\n        case 'workitem':\n            return 'workitem';\n        case 'externalContact':\n            return 'externalContact';\n        case 'analyticsConversation':\n            return 'analyticsConversation';\n        default:\n            assertNever(type);\n            return '';\n    }\n}\n\nfunction computeGroupId(interactionId: string, interactionType: string, group: AppGroupKey) {\n    return [interactionId, interactionType, group].join(':');\n}\n\nfunction computeTokensFromGroupId(groupId: string) {\n    const tokens = groupId.split(':');\n    if (tokens.length === 3) {\n        let [interactionId, interactionType, appGroupKey] = tokens.map(token => decodeURIComponent(token));\n        if ((appGroupKeys as Readonly<string[]>).includes(appGroupKey)) {\n            return {\n                interactionId,\n                interactionType,\n                appGroupKey: appGroupKey as AppGroupKey\n            };\n        }\n    }\n    return null;\n}\n\nexport function computeInteractionKey(interactionId: string, interactionType: string) {\n    return [interactionId, interactionType].join('|');\n}\n\nfunction computeTokensFromInteractionKey(interactionKey: string) {\n    const tokens = interactionKey.split('|');\n    if (tokens.length === 2) {\n        let [interactionId, interactionType] = tokens.map(token => decodeURIComponent(token));\n        return {\n            interactionId,\n            interactionType\n        };\n    }\n    return null;\n}\n\nfunction computeInterapptionCompositeId(\n    interactionId: string,\n    interactionType: string,\n    appDefId: string,\n    providerId: string\n) {\n    return [interactionId, interactionType, appDefId, providerId].map(token => encodeURIComponent(token)).join('&');\n}\n\nfunction computeTokensFromAppCompositeId(compositeId: string) {\n    const tokens = compositeId.split('&');\n    if (tokens.length === 2) {\n        let [appDefId, providerId] = tokens.map(token => decodeURIComponent(token));\n        return {\n            appDefId,\n            providerId\n        };\n    }\n    return null;\n}\n\nfunction computeTokensFromInterapptionCompositeId(compositeId: string) {\n    const tokens = compositeId.split('&');\n    if (tokens.length === 4) {\n        let [interactionId, interactionType, appDefId, providerId] = tokens.map(token => decodeURIComponent(token));\n        return {\n            interactionId,\n            interactionType,\n            appDefId,\n            providerId\n        };\n    }\n    return null;\n}\n\nfunction computeAppContextTypeFromInteractionType(interactionType: string): string {\n    if (conversationMediaTypes.includes(interactionType)) {\n        return 'conversation';\n    }\n    return interactionType;\n}\n\nfunction pruneInteractionIdAndType(appDefId: string) {\n    return appDefId.split('&').slice(2).join('&');\n}\n\nfunction buildEphemeralStorableLayoutTemplate(\n    layoutTemplate: AppCarouselHostLayoutTemplate\n): AppCarouselHostLayoutTemplate {\n    let storableLayoutTemplate = cloneDeep(layoutTemplate);\n    // Prune Interaction Ids, Type, available sizes and focus mode permission\n    storableLayoutTemplate.focusModeAppDefId = storableLayoutTemplate.focusModeAppDefId\n        ? pruneInteractionIdAndType(storableLayoutTemplate.focusModeAppDefId)\n        : undefined;\n    storableLayoutTemplate.items = storableLayoutTemplate.items\n        .filter(({ appDefId }) => computeTokensFromInterapptionCompositeId(appDefId))\n        .map(layoutTemplateItem => ({\n            ...layoutTemplateItem,\n            appDefId: pruneInteractionIdAndType(layoutTemplateItem.appDefId),\n            availableSizes: undefined,\n            canUseFocusMode: undefined\n        }));\n    return storableLayoutTemplate;\n}\n\nfunction buildPersistentStorableLayoutTemplate(\n    layoutTemplate: AppCarouselHostLayoutTemplate,\n    options?: {\n        focusModeAppDefIdOverride?: string | undefined;\n        deactivateFilter?: (layoutTemplateItem: AppCarouselHostLayoutTemplateItem) => boolean;\n    }\n): AppCarouselHostLayoutTemplate {\n    let storableLayoutTemplate = cloneDeep(layoutTemplate);\n    // Focus Mode Override\n    if (options?.focusModeAppDefIdOverride) {\n        storableLayoutTemplate.focusModeAppDefId = options.focusModeAppDefIdOverride;\n    }\n    // Deactivate apps\n    storableLayoutTemplate.items = storableLayoutTemplate.items.map(layoutTemplateItem => {\n        const shouldDeactivate = options?.deactivateFilter?.(layoutTemplateItem) || false;\n        if (shouldDeactivate) {\n            layoutTemplateItem.active = false;\n            layoutTemplateItem.visible = false;\n        }\n        return layoutTemplateItem;\n    });\n    return storableLayoutTemplate;\n}\n\n// Exported only for unit tests\nexport function _buildInteractionSpecificLayoutFromGeneric(\n    genericLayoutTemplate: AppCarouselHostLayoutTemplate,\n    appContext: AppContext,\n    features: Record<string, boolean>,\n    validAppProviders: AppProvider[]\n): AppCarouselHostLayoutTemplate {\n    // Transform native panel ids to ensure the existing layout of a\n    // panel (under a different appDefId), is maintained on switch.\n    // Also adds Interaction Id and Type to compositeId to make it interaction-specific\n    let result: AppCarouselHostLayoutTemplate = {\n        focusModeAppDefId: genericLayoutTemplate.focusModeAppDefId\n            ? [\n                  appContext.id,\n                  getInteractionType(appContext),\n                  addNativeProvider(transformPanelId(genericLayoutTemplate.focusModeAppDefId, features))\n              ].join('&')\n            : undefined,\n        items: genericLayoutTemplate.items.map(layoutTemplateItem => ({\n            ...layoutTemplateItem,\n            appDefId: [\n                appContext.id,\n                getInteractionType(appContext),\n                addNativeProvider(transformPanelId(layoutTemplateItem.appDefId, features))\n            ].join('&')\n        }))\n    };\n\n    // Filter out appDefs with providerIds which don't exist\n    const validAppProviderIds = validAppProviders.map(({ id }) => id);\n    if (appContext.type === 'conversation') {\n        // Only conversations use native providers\n        validAppProviderIds.push('native');\n    }\n    result = pruneUnknownProvidersFromLayout(result, validAppProviderIds, 'interapption');\n\n    // Deduping of appDefs smooths out layout duplications that could result from\n    // provider and avialableAppDef changes which resolve asynchronously and trigger\n    // layout chnages separately. By transforming the appDefIds first, we can be\n    // confident that the items first appearing in the layout list are the pre-existing\n    // layout items that should be favored when deduping. The dedup function\n    // uses the list order and therefore will prioritize the pre-existing layout\n    // if a duplicate is found.\n    return removeDuplicateAppDefs(result);\n}\n\nfunction pruneUnknownProvidersFromLayout(\n    layout: AppCarouselHostLayoutTemplate,\n    validAppProviderIds: string[],\n    appDefIdPrecision: 'interapption' | 'generic'\n): AppCarouselHostLayoutTemplate {\n    // Filter out appDefs with providerIds which don't exist\n    return {\n        focusModeAppDefId: layout.focusModeAppDefId,\n        items: layout.items.filter(({ appDefId }) => {\n            let providerId: null | string = null;\n            switch (appDefIdPrecision) {\n                case 'interapption': {\n                    const tokens = computeTokensFromInterapptionCompositeId(appDefId);\n                    if (tokens) {\n                        providerId = tokens.providerId;\n                    }\n                    break;\n                }\n                case 'generic': {\n                    const tokens = computeTokensFromAppCompositeId(appDefId);\n                    if (tokens) {\n                        providerId = tokens.providerId;\n                    }\n                    break;\n                }\n                default:\n                    assertNever(appDefIdPrecision);\n            }\n\n            // allow the template item through if it's not parsable; should not happen in practice\n            if (!providerId) {\n                return true;\n            }\n\n            return validAppProviderIds.includes(providerId);\n        })\n    };\n}\n\nfunction removeDuplicateAppDefs(layout: AppCarouselHostLayoutTemplate): AppCarouselHostLayoutTemplate {\n    const uniqueAppDefIds = new Set();\n    return {\n        focusModeAppDefId: layout.focusModeAppDefId,\n        items: layout.items.filter(({ appDefId }) => {\n            const isUnique = !uniqueAppDefIds.has(appDefId);\n            uniqueAppDefIds.add(appDefId);\n            return isUnique;\n        })\n    };\n}\n\n// TODO: Remove message type once we go to subtype (don't forget we need a migraton from 'message' before removing)\n// Add in message type since we don't yet persist layouts by messaging subtype\nconst conversationMediaTypes = [...INTERAPPTION_COMMUNICATION_TYPE_FILTERS, 'message'];\n// Exported only for unit testing\nexport function _correctPersistedCarouselLayoutTemplateMap(\n    templateMap: AppCarouselLayoutTemplateMap,\n    validAppProviderIds: string[],\n    features: SessionService['features']\n): AppCarouselLayoutTemplateMap {\n    return Object.fromEntries(\n        Object.entries(templateMap).map(([layoutKey, origLayout]) => {\n            // Transform panel ids\n            let newLayout: AppCarouselHostLayoutTemplate = {\n                focusModeAppDefId: origLayout.focusModeAppDefId\n                    ? addNativeProvider(transformPanelId(origLayout.focusModeAppDefId, features))\n                    : undefined,\n                items: origLayout.items.map(currLayoutItem => ({\n                    ...currLayoutItem,\n                    appDefId: addNativeProvider(transformPanelId(currLayoutItem.appDefId, features))\n                }))\n            };\n\n            // Prune unknown providers\n            // Only conversation media types support native providers\n            const allowNativeProvider = conversationMediaTypes.includes(layoutKey);\n            newLayout = pruneUnknownProvidersFromLayout(\n                newLayout,\n                [...validAppProviderIds, ...(allowNativeProvider ? ['native'] : [])],\n                'generic'\n            );\n\n            // Dedup AppDefIds\n            newLayout = removeDuplicateAppDefs(newLayout);\n\n            return [layoutKey, newLayout];\n        })\n    );\n}\n\nfunction isValidLayoutTemplateMap(toCheck: unknown): toCheck is Record<string, AppCarouselHostLayoutTemplate> {\n    if (typeof toCheck !== 'object' || !toCheck) {\n        return false;\n    }\n    for (const key in toCheck) {\n        if (!hasKey(toCheck, key)) {\n            return false;\n        }\n        if (!isAppCarouselHostLayoutTemplate(toCheck[key])) {\n            return false;\n        }\n    }\n    return true;\n}\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"yCKMhn8/\",\"block\":\"[[[41,[33,1,[\\\"useNewNav\\\"]],[[[1,\\\"    \\\"],[10,\\\"h1\\\"],[14,0,\\\"sr-only\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,2],[\\\"components.navMenu.agentWorkspace\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"interactions chat-container\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"left-chat-rail\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,3],null,[[\\\"state\\\",\\\"caseCacheVersion\\\",\\\"getCaseForInteraction\\\",\\\"actionGetCanonicalContactSync\\\",\\\"actionDisplayError\\\",\\\"actionAnswerInteraction\\\",\\\"actionAnswerWorkitemInteraction\\\",\\\"actionDeclineInteraction\\\",\\\"actionDeclineWorkitemInteraction\\\",\\\"actionSelectInteraction\\\",\\\"actionSelectWorkitemInteraction\\\",\\\"actionGoOnQueue\\\",\\\"actionCreateCall\\\",\\\"actionCreateEmail\\\",\\\"actionCreateMessage\\\",\\\"actionLoadQueue\\\",\\\"actionLoadParticipantName\\\",\\\"actionFetchDefaultQueue\\\",\\\"actionFetchQueue\\\",\\\"loadDivisionName\\\",\\\"acdEngagementSourcesFT\\\"],[[33,4],[33,5],[33,6],[28,[37,7],[[30,0],\\\"getCanonicalContactSync\\\"],null],[28,[37,7],[[30,0],\\\"displayError\\\"],null],[28,[37,7],[[30,0],\\\"answerInteraction\\\"],null],[28,[37,7],[[30,0],\\\"answerWorkitemInteraction\\\"],null],[28,[37,7],[[30,0],\\\"declineInteraction\\\"],null],[28,[37,7],[[30,0],\\\"declineWorkitemInteraction\\\"],null],[28,[37,7],[[30,0],\\\"selectInteraction\\\"],null],[28,[37,7],[[30,0],\\\"selectWorkitemInteraction\\\"],null],[28,[37,7],[[30,0],\\\"goOnQueue\\\"],null],[28,[37,7],[[30,0],\\\"createCall\\\"],null],[28,[37,7],[[30,0],\\\"createEmail\\\"],null],[28,[37,7],[[30,0],\\\"createMessage\\\"],null],[28,[37,7],[[30,0],\\\"loadQueueName\\\"],null],[28,[37,7],[[30,0],\\\"loadParticipantName\\\"],null],[28,[37,7],[[30,0],\\\"fetchDefaultQueue\\\"],null],[28,[37,7],[[30,0],\\\"fetchQueue\\\"],null],[28,[37,7],[[30,0],\\\"loadDivisionName\\\"],null],[33,4,[\\\"featureToggles\\\",\\\"acdEngagementSourcesFT\\\"]]]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"interaction-container\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[15,0,[29,[\\\"selected-interaction-container \\\",[52,[51,[28,[37,9],[[33,10],[33,11]],null]],\\\"hidden\\\"]]]],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,12],null,[[\\\"activeInteractions\\\",\\\"interaction\\\",\\\"useCommunicationACW\\\",\\\"selectedAppContext\\\",\\\"activeWorkitems\\\",\\\"workitem\\\",\\\"appPoolV2\\\",\\\"hasConversationAppForCurrInteraction\\\",\\\"visibleContextualAppsForCurrInteraction\\\",\\\"hasContextualFocusModeEnabled\\\",\\\"isMainstageFocused\\\",\\\"onMainstageFocusedChanged\\\",\\\"interapptionPanels\\\",\\\"attentionCountPerCompositeId\\\",\\\"contextualScriptAvailabilityChanged\\\",\\\"actionDisplayError\\\",\\\"acdEngagementSourcesFT\\\",\\\"insertChatText\\\",\\\"insertSmsText\\\",\\\"insertEmailText\\\",\\\"cannedResponseChatText\\\",\\\"cannedResponseSmsText\\\",\\\"structuredMessage\\\",\\\"cannedResponseEmailText\\\",\\\"useScripterGadget\\\",\\\"loadDivisionName\\\"],[[33,13],[33,10],[33,14],[33,15],[33,16],[33,11],[33,17],[33,18],[33,19],[33,20],[33,21],[28,[37,7],[[30,0],\\\"onHasMainstageFocusModeEnabledChanged\\\"],null],[33,22],[33,23],[28,[37,7],[[30,0],\\\"contextualScriptAvailabilityChanged\\\"],null],[28,[37,7],[[30,0],\\\"displayError\\\"],null],[33,4,[\\\"featureToggles\\\",\\\"acdEngagementSourcesFT\\\"]],[28,[37,7],[[30,0],\\\"insertChatText\\\"],null],[28,[37,7],[[30,0],\\\"insertSmsText\\\"],null],[28,[37,7],[[30,0],\\\"insertEmailText\\\"],null],[33,24],[33,25],[33,26],[33,27],[33,4,[\\\"featureToggles\\\",\\\"useScripterGadget\\\"]],[28,[37,7],[[30,0],\\\"loadDivisionName\\\"],null]]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[51,[28,[37,9],[[33,10],[33,11]],null]],[[[41,[51,[28,[37,9],[[33,28],[33,1,[\\\"useNewNav\\\"]]],null]],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"sidebar-actions-container\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-button\\\"],[14,1,\\\"interaction-main-stage-hide-button\\\"],[14,\\\"role\\\",\\\"button\\\"],[14,\\\"accent\\\",\\\"ghost\\\"],[15,\\\"gux-title\\\",[28,[37,2],[\\\"common.hide\\\"],null]],[15,\\\"aria-label\\\",[28,[37,2],[\\\"common.hide\\\"],null]],[15,\\\"onclick\\\",[28,[37,7],[[30,0],\\\"onCloseSidebar\\\"],null]],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"chevron-left\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\\n                    \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"interaction-main-stage-hide-button\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,1],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,[28,[35,2],[\\\"common.hide\\\"],null]],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\\n                    \\\"],[10,0],[14,0,\\\"interaction-main-stage-toggle-view-wrapper\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-button\\\"],[14,1,\\\"interaction-main-stage-toggle-view-button\\\"],[14,\\\"role\\\",\\\"button\\\"],[14,\\\"accent\\\",\\\"ghost\\\"],[15,\\\"aria-label\\\",[52,[33,29],[28,[37,2],[\\\"common.collapse\\\"],null],[28,[37,2],[\\\"common.expand\\\"],null]]],[15,\\\"aria-expanded\\\",[52,[33,29],[33,30],[33,31]]],[15,\\\"onclick\\\",[28,[37,7],[[30,0],\\\"onToggleSidebar\\\"],null]],[12],[1,\\\"\\\\n\\\"],[41,[33,29],[[[1,\\\"                                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/arrow-down-left-and-arrow-up-right-to-center-regular\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/arrow-up-right-and-arrow-down-left-from-center-regular\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n\\\\n                        \\\"],[10,\\\"gux-tooltip\\\"],[14,1,\\\"interaction-main-stage-toggle-view-button-tooltip\\\"],[14,\\\"for\\\",\\\"interaction-main-stage-toggle-view-button\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,1],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,29],[[[1,\\\"                                    \\\"],[1,[28,[35,2],[\\\"common.collapse\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                    \\\"],[1,[28,[35,2],[\\\"common.expand\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n            \\\"],[1,[28,[35,32],null,[[\\\"isOnQueue\\\"],[[33,33,[\\\"isOnQueue\\\"]]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[1,\\\"    \\\"],[1,[28,[35,34],null,[[\\\"useAppsV2ConversationInterapptionManager\\\",\\\"activeInteractions\\\",\\\"forcedPanelSelectionMap\\\",\\\"defaultPanelSettings\\\",\\\"contextualInteractionScriptStateMap\\\",\\\"onAppPoolReady\\\",\\\"onAppAttentionCountChanged\\\",\\\"onHasConversationAppForCurrInteractionChanged\\\",\\\"onVisibleContextualAppsForCurrInteractionChanged\\\",\\\"onHasContextualFocusModeEnabledChanged\\\",\\\"onAppsForcedOpen\\\",\\\"appProviders\\\",\\\"workerProviders\\\",\\\"selectedInteraction\\\",\\\"buildValidInterapption\\\",\\\"insertChatText\\\",\\\"insertSmsText\\\",\\\"insertEmailText\\\",\\\"useScripterGadget\\\",\\\"notesHistoryLength\\\",\\\"agentPanelIsActive\\\"],[[33,35],[33,36],[33,37],[33,38],[33,39],[28,[37,7],[[30,0],\\\"onAppPoolReady\\\"],null],[28,[37,7],[[30,0],\\\"onAppAttentionCountChanged\\\"],null],[28,[37,7],[[30,0],\\\"onHasConversationAppForCurrInteractionChanged\\\"],null],[28,[37,7],[[30,0],\\\"onVisibleContextualAppsForCurrInteractionChanged\\\"],null],[28,[37,7],[[30,0],\\\"onHasContextualFocusModeEnabledChanged\\\"],null],[28,[37,7],[[30,0],\\\"onAppsForcedOpen\\\"],null],[33,40],[33,41],[33,15],[28,[37,7],[[30,0],\\\"buildValidInterapption\\\"],null],[28,[37,7],[[30,0],\\\"insertChatText\\\"],null],[28,[37,7],[[30,0],\\\"insertSmsText\\\"],null],[28,[37,7],[[30,0],\\\"insertEmailText\\\"],null],[33,4,[\\\"featureToggles\\\",\\\"useScripterGadget\\\"]],[52,[33,10,[\\\"notesHistory\\\"]],[33,10,[\\\"notesHistory\\\",\\\"length\\\"]],0],[33,42,[\\\"agentPanelIsActive\\\"]]]]]],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"if\\\",\\\"session\\\",\\\"t\\\",\\\"acd-interactions-panel/interaction-roster\\\",\\\"state\\\",\\\"caseCacheVersion\\\",\\\"getCaseForInteraction\\\",\\\"action\\\",\\\"unless\\\",\\\"or\\\",\\\"selectedInteraction\\\",\\\"selectedWorkitem\\\",\\\"acd-interactions-panel-v2/interaction\\\",\\\"activeInteractions\\\",\\\"useCommunicationACW\\\",\\\"selectedAppContext\\\",\\\"activeWorkitems\\\",\\\"appPoolV2\\\",\\\"hasConversationAppForCurrInteraction\\\",\\\"visibleContextualAppsForCurrInteraction\\\",\\\"hasContextualFocusModeEnabled\\\",\\\"hasMainstageFocusModeEnabled\\\",\\\"activeSubPanelInterapptions\\\",\\\"attentionCountPerCompositeId\\\",\\\"cannedResponseChatText\\\",\\\"cannedResponseSmsText\\\",\\\"structuredMessage\\\",\\\"cannedResponseEmailText\\\",\\\"isPopout\\\",\\\"communicationSidebarExpanded\\\",\\\"‘true’\\\",\\\"‘false’\\\",\\\"acd-interactions-panel/interaction-queue-status\\\",\\\"interaction\\\",\\\"acd-interactions-panel-v2/interapptions-manager-v2\\\",\\\"useAppsV2ConversationInterapptionManager\\\",\\\"activeAppContexts\\\",\\\"forcedPanelSelectionMap\\\",\\\"defaultPanelSettings\\\",\\\"contextualInteractionScriptStateMap\\\",\\\"v2InterapptionProviders\\\",\\\"workerProviders\\\",\\\"commandNav\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel-v2/template.hbs\",\"isStrictMode\":false});","import { getOwner } from '@ember/application';\nimport Component from '@ember/component';\nimport { computed, defineProperty, get, getProperties } from '@ember/object';\nimport { debounce, later } from '@ember/runloop';\nimport { inject } from '@ember/service';\nimport { typeOf } from '@ember/utils';\nimport { AppPool } from '@genesys/apps-v2-host';\nimport type { CommunicationType, Participant, WorkitemInteraction } from '@genesys/genesys-cloud-conversation-utils';\nimport Ember from 'ember';\nimport RSVP from 'rsvp';\nimport { CALL_CONVERSATION_CREATED_EVENT } from 'web-directory/services/acdcall';\nimport { EMAIL_CONVERSATION_CREATED_EVENT } from 'web-directory/services/acdemail';\nimport { MESSAGE_CONVERSATION_CREATED_EVENT } from 'web-directory/services/acdsms';\nimport { WORKITEM_ASSIGNMENT_STATE_CHANGED_EVENT } from 'web-directory/services/acdworkitem';\nimport { OpenPanel } from 'web-directory/services/apps-v2-api-handlers/apps-v2-sdk-handler';\nimport { ANSWER_INTERACTION_EVENT } from 'web-directory/services/interaction';\nimport type { Conversation, Maybe } from 'web-directory/types';\nimport { singularizeMediaType } from 'web-directory/utils/acd-ts';\nimport { _buildAppProviderComputed, _buildProviderConfig } from 'web-directory/utils/app-provider';\nimport { _buildWorkerProviderComputed } from 'web-directory/utils/worker-provider';\nimport appUtils, { AppContext, AppDefV1Asset } from 'web-directory/utils/apps';\nimport { isDestroyed } from 'web-directory/utils/objects';\nimport safeSet from 'web-directory/utils/safeSet';\nimport SimpleCache from 'web-directory/utils/simple-cache';\nimport { isTesting } from 'web-directory/utils/testing';\nimport {\n    PanelSetting,\n    standardTransformationFtComputedDepKey,\n    transformPanelSetting\n} from 'web-directory/utils/transform-panels';\nimport { assertNever } from 'web-directory/utils/types';\nimport { AppProvider, ResolvedApp } from './interapptions-manager-v2/component';\n\ntype PanelSettings = Record<string, PanelSetting>;\n\ntype ConversationTask = {\n    type: 'conversation';\n    // TODO: The actual type is an ember model, InteractionModel; use when this type is available.\n    conversation: any;\n};\n\ntype WorkitemTask = {\n    type: 'workitem';\n    workitem: WorkitemInteraction;\n};\n\nexport type InteractionTask = ConversationTask | WorkitemTask;\n\ntype ScriptState = {\n    scriptAvailable: boolean;\n    changeCount: number;\n};\n\ntype CreateRequestResponse = {\n    conversationId: string;\n};\n\ntype SelectedInteractionTaskComputedResult = null | InteractionTask;\ntype ActiveInteractionTasksComputedResult = InteractionTask[];\n\nexport default Component.extend({\n    classNames: ['acd-interactions-panel', 'chat-panel'],\n\n    acdemail: inject('acdemail'),\n    acdsms: inject('acdsms'),\n    acdcall: inject('acdcall'),\n    acdworkitem: inject('acdworkitem'),\n    agentUIBackend: inject('agent-ui-backend'),\n    ajax: inject('ajax'),\n    application: inject('application'),\n    apps: inject('apps'),\n    communication: inject('communication'),\n    externalContacts: inject('external-contacts'),\n    interaction: inject('interaction'),\n    intl: inject('intl'),\n    logger: inject('stash-logger'),\n    notification: inject('notification'),\n    participantName: inject('participant-name'),\n    permissions: inject('permissions'),\n    phone: inject('phone'),\n    queue: inject('queue'),\n    queueToggle: inject('queueToggle'),\n    session: inject('session'),\n    store: inject('store'),\n    sidebar: inject('sidebar'),\n    webrtc: inject('webrtc'),\n    webrtcSdk: inject('webrtcSdk'),\n\n    /**\n     * @Attribute\n     * Flag for if the ACD sidebar panel is active (sidebar.showAcdInteractions)\n     */\n    active: false,\n\n    /**\n     * @Attribute\n     * Flag for if the application is in popout mode (e.g. PEF, popout chat, etc)\n     */\n    isPopout: false,\n\n    /**\n     * @Attribute\n     * Flag for if the user's presence is currently \"On Queue\"\n     */\n    onQueue: false,\n\n    /**\n     * @Attribute\n     * The interaction model currently selected in roster\n     */\n    selectedInteraction: null as any,\n\n    /**\n     * @Attribute\n     * The workitem interaction currently selected in roster\n     */\n    selectedWorkitem: null as Maybe<WorkitemInteraction>,\n\n    /**\n     * @Attribute\n     * E911 config data\n     */\n    emergencyLocationData: null as any,\n\n    /**\n     * @Attribute\n     * Flag for is E911 is currently enabled\n     */\n    emergencyLocationOn: null as any,\n\n    /**\n     * @Attribute\n     * Flag for if the Hawk websocket is connected\n     */\n    streamingConnected: false,\n\n    /**\n     * @Attribute\n     * Override for available panels from controller, passed through\n     * to panel configuration\n     */\n    panelsOverrideObject: null as any,\n\n    /**\n     * An outbound conversation guid that was created via user action\n     * and should be set as selected once active\n     */\n    requestedInteraction: null as Maybe<string>,\n\n    /**\n     * ID of a workitem that should be set as selected\n     */\n    requestedWorkitemId: null as Maybe<string>,\n\n    /**\n     * Default panel settings which will be fetched for the agent UI backend\n     * on component init\n     */\n    _defaultPanelSettings: null as Maybe<PanelSettings>,\n\n    /**\n     * Full set of registered interapption providers\n     */\n    interapptionProviders: null as any,\n\n    /**\n     * Full set of registered workers providers\n     */\n    workerProviders: null as any,\n\n    cachedDivisionsMap: new SimpleCache<string | undefined>(),\n\n    /**\n     * CannedResponse controls\n     */\n    cannedResponseChatText: null as Maybe<string>,\n    cannedResponseSmsText: null as Maybe<string>,\n    cannedResponseEmailText: null as Maybe<string>,\n    structuredMessage: null as Maybe<string>,\n\n    defaultPanelSettings: computed(\n        '_defaultPanelSettings',\n        standardTransformationFtComputedDepKey,\n        function (this: any): PanelSettings {\n            const features = this.get('session').get('features');\n            const basePanelSettings = (this.get('_defaultPanelSettings') ?? {}) as PanelSettings;\n            return Object.fromEntries(\n                Object.entries(basePanelSettings).map(([key, currSetting]) => {\n                    return [key, transformPanelSetting(currSetting, features)];\n                })\n            );\n        }\n    ),\n\n    /**\n     * v2 Interapption providers for both conversational and contextual gadgets\n     */\n    v2InterapptionProviders: computed('interapptionProviders', 'useAppsV2ConversationInterapptionManager', function () {\n        const useAppsV2ConversationInterapptionManager = this.get('useAppsV2ConversationInterapptionManager');\n        const interapptionProviders: AppProvider[] = this.get('interapptionProviders');\n        return (interapptionProviders || []).filter(curr => {\n            const type = curr.group || 'contextual';\n            switch (type) {\n                case 'conversation':\n                    return useAppsV2ConversationInterapptionManager;\n                case 'contextual':\n                    return true;\n                default:\n                    assertNever(type);\n            }\n        });\n    }),\n\n    appPoolV2: null as AppPool | null,\n    attentionCountPerCompositeId: {} as Record<string, number>,\n    hasConversationAppForCurrInteraction: false,\n    hasContextualAppForCurrInteraction: false,\n    openPanel: null as Maybe<OpenPanel>,\n\n    /**\n     * Interapptions active for subpanels\n     */\n    activeSubPanelInterapptions: null as Maybe<any[]>,\n\n    /**\n     * Key for currently selected subpanel Interapption\n     */\n    selectedSubPanelInterapptionStateKey: null as Maybe<string>,\n\n    /**\n     * Map of interaction script availability\n     */\n    _interactionScriptStateMap: {} as Record<string, ScriptState>,\n\n    /**\n     * The task (conversation, workitem, etc.) currently selected in roster\n     */\n    selectedInteractionTask: computed(\n        'selectedInteraction',\n        'selectedWorkitem',\n        function (): SelectedInteractionTaskComputedResult {\n            const conversation = this.get('selectedInteraction');\n            if (conversation) {\n                return {\n                    type: 'conversation',\n                    conversation\n                };\n            }\n\n            const workitem: WorkitemInteraction = this.get('selectedWorkitem');\n            if (workitem) {\n                return {\n                    type: 'workitem',\n                    workitem\n                };\n            }\n\n            return null;\n        }\n    ),\n    // TODO: Eventually, we should just use InteractionTasks instead of AppContexts in interapption-manager\n    selectedAppContext: computed('selectedInteractionTask', 'activeAppContexts', function (): null | AppContext {\n        const selectedInteractionTask: SelectedInteractionTaskComputedResult = this.get('selectedInteractionTask');\n        if (!selectedInteractionTask) {\n            return null;\n        }\n\n        let selectedTaskId: null | string = null;\n\n        const { type } = selectedInteractionTask;\n        switch (type) {\n            case 'conversation':\n                if (selectedInteractionTask.conversation && get(selectedInteractionTask.conversation, 'id')) {\n                    selectedTaskId = selectedInteractionTask.conversation.id;\n                }\n                break;\n            case 'workitem':\n                if (selectedInteractionTask.workitem.id) {\n                    selectedTaskId = selectedInteractionTask.workitem.id;\n                }\n                break;\n            default:\n                assertNever(type);\n        }\n\n        if (!selectedTaskId) {\n            return null;\n        }\n\n        return (\n            (this.get('activeAppContexts') as AppContext[]).find(\n                currAppContext => currAppContext.id === selectedTaskId\n            ) || null\n        );\n    }),\n\n    activeInteractionTasks: computed(\n        'activeInteractions',\n        'activeWorkitems.@each.workitem',\n        function (): ActiveInteractionTasksComputedResult {\n            let conversations: any[] = this.get('activeInteractions');\n            let workitems: WorkitemInteraction[] = this.get('activeWorkitems');\n\n            let tasks: InteractionTask[] = [];\n\n            if (Array.isArray(conversations)) {\n                const conversationTasks: ConversationTask[] = conversations.map(conversation => {\n                    return { type: 'conversation', conversation };\n                });\n                tasks.push(...conversationTasks);\n            }\n\n            if (workitems) {\n                const workitemTasks: WorkitemTask[] = workitems.map((workitem: WorkitemInteraction) => {\n                    return { type: 'workitem', workitem };\n                });\n                tasks.push(...workitemTasks);\n            }\n\n            return tasks;\n        }\n    ),\n    // TODO: Eventually, just use InteractionTask instances instead of AppContext in interapption-manager\n    activeAppContexts: computed('activeInteractionTasks', function (): AppContext[] {\n        const activeInteractionTasks: ActiveInteractionTasksComputedResult = this.get('activeInteractionTasks');\n        if (!activeInteractionTasks) {\n            return [];\n        }\n\n        return activeInteractionTasks\n            .map<AppContext>(curr => {\n                const type = curr.type;\n                switch (type) {\n                    case 'conversation':\n                        return {\n                            type: 'conversation',\n                            payload: curr.conversation,\n                            id: get(curr.conversation, 'id')\n                        };\n                    case 'workitem':\n                        return {\n                            type: 'workitem',\n                            payload: curr.workitem,\n                            id: curr.workitem.id\n                        };\n                    default:\n                        assertNever(type);\n                }\n                // defensively filter out any malformed tasks that don't have an id property; should not occur.\n            })\n            .filter(currAppContext => currAppContext.id);\n    }),\n\n    /**\n     * State object for panel and sub-components. This houses permissions, feature toggles,\n     * and other state flags used throughout Agent UI to avoid injections everywhere.\n     */\n    state: computed(\n        'selectedInteraction',\n        'selectedWorkitem',\n        'interaction.{activeInteractions,isOnQueue,isTypingInteractions}',\n        'acdworkitem.activeWorkitems',\n        'isPopout',\n        'session.person.id',\n        'streamingConnected',\n        'active',\n        'emergencyLocationData',\n        'emergencyLocationOn',\n        'permissions.{canEmailOnBehalfOfQueue,canSendMessageOnBehalfOfQueue,phoneEnabled,hasExternalContactsViewContactAccess,canViewQueue}',\n        'externalContacts.contacts.[]',\n        'hideInteractionButtons.[]',\n        'acdemail.draftUpdateHash.[]',\n        'session.useMultipanel',\n        'session.features.{PURE-5268_digital_messaging_inactivity_handling,PURE-3835,PURE-6191,PURE-5534_OpenMessagingEngagementSourceTagging,PURE-7349_acdConferenceMS3-phase-1}',\n        function (this: any): any {\n            return {\n                // For now, we'll pass just the conversation down as the \"interaction\" for child components\n                // Eventually, we should differentiate between conversations and workitems with either\n                // multiple properties or a discriminated union (InteractionTask)\n                selectedInteraction: this.get('selectedInteraction'),\n                selectedWorkitem: this.get('selectedWorkitem'),\n                activeInteractions: this.get('interaction.activeInteractions'),\n                activeWorkitems: this.get('acdworkitem.activeWorkitems'),\n                isOnQueue: this.get('interaction.isOnQueue'),\n                isPopout: this.get('isPopout'),\n                currentUserId: this.get('session.person.id'),\n                streamingConnected: this.get('streamingConnected'),\n                acdPanelOpen: this.get('active'),\n                isTypingInteractions: this.get('interaction.isTypingInteractions'),\n                hideInteractionButtons: this.get('hideInteractionButtons'),\n                draftUpdateHash: this.get('acdemail.draftUpdateHash'),\n                useMultipanel: this.get('session.useMultipanel'),\n                useNewNav: this.get('session.useNewNav'),\n                externalContacts: {\n                    contacts: this.get('externalContacts.contacts')\n                },\n                e911: {\n                    emergencyLocationData: this.get('emergencyLocationData'),\n                    emergencyLocationOn: this.get('emergencyLocationOn')\n                },\n                permissions: {\n                    canCreateEmail: this.get('permissions.canEmailOnBehalfOfQueue'),\n                    canSendMessage: this.get('permissions.canSendMessageOnBehalfOfQueue'),\n                    canMakeCall: this.get('permissions.phoneEnabled'),\n                    canViewExternalContacts: this.get('permissions.hasExternalContactsViewContactAccess'),\n                    canViewQueue: this.get('permissions.canViewQueue'),\n                    canViewCustomerIntents: false // only implemented in multipanel\n                },\n                featureToggles: {\n                    acdAnswerFocusFix: this.get('session.features.acdAnswerFocusFix'),\n                    acdExternalContactDivNameFT: this.get('session.features.PURE-3835'),\n                    acdExternalContactWorkitemsDivNameFT: this.get('session.features.PURE-6191'),\n                    acdAnnounceMonitoring: this.get('session.features.acdAnnounceMonitoring'),\n                    acdAnnounceMonitoringDigital: this.get('session.features.acdAnnounceMonitoringDigital'),\n                    acdEngagementSourcesFT: this.get('session.features.PURE-5534_OpenMessagingEngagementSourceTagging'),\n                    acdWarmConferencePhase1FT: this.get('session.features.PURE-7349_acdConferenceMS3-phase-1'),\n                    agentAddressOnBehalfOfQueue: this.get('session.features.agentAddressOnBehalfOfQueue'),\n                    inactivityTimeoutFT: this.get('session.features.PURE-5268_digital_messaging_inactivity_handling')\n                }\n            };\n        }\n    ),\n\n    /**\n     * An array of call interactions that are currently alerting\n     */\n    alertingCallInteractions: computed(\n        'interaction.activeInteractions.[]',\n        'interaction.activeInteractions.@each.{isCall,isAlerting}',\n        function (): any[] {\n            const interactions = this.get('interaction.activeInteractions');\n            return interactions.filter((interaction: any) => {\n                if (!get(interaction, 'isCall')) {\n                    return false;\n                } else if (!get(interaction, 'isAlerting')) {\n                    return false;\n                }\n                return true;\n            });\n        }\n    ),\n\n    /**\n     * An array of alerting, call interactions needing a WebRTC session\n     */\n    interactionsNeedingSession: computed(\n        'alertingCallInteractions.[]',\n        'phone.station.{isWebrtc,persistentConnection}',\n        'phone.persistentConnectionActive',\n        'webrtc.pendingSessions.[]',\n        'webrtcSdk.pendingSessions.[]',\n        'webrtcSdk.useSdk',\n        function (): any[] {\n            if (!this.get('phone.station.isWebrtc')) {\n                return [];\n            } else if (this.get('phone.persistentConnectionActive')) {\n                return [];\n            } else if (this.get('phone.station.persistentConnection')) {\n                // PCM-1827: if we have PC enabled and we didn't receive a session,\n                // assume that a PC somewhere else is established (like a media-helper instance)\n                return [];\n            }\n\n            const alertingCallInteractions: any[] = this.get('alertingCallInteractions') || [];\n            return alertingCallInteractions.filter((interaction: any) => {\n                const id: string = get(interaction, 'id');\n                const hasPendingSesion: boolean = this.get('webrtcSdk.useSdk')\n                    ? !!this.get('webrtcSdk.pendingSessions').findBy('conversationId', id)\n                    : !!this.get('webrtc.pendingSessions').findBy('callInfo.conversationId', id);\n\n                return !hasPendingSesion;\n            });\n        }\n    ),\n\n    /**\n     * An array of conversation guids to hide answer/decline controls for\n     */\n    hideInteractionButtons: computed(\n        'interactionsNeedingSession.[]',\n        'interaction.activeInteractions.[]',\n        'interaction.activeInteractions.@each.acceptedByClient',\n        'webrtc.inboundAcdCallsToAutoAnswer.[]',\n        function (): string[] {\n            const interactions: any[] = this.get('interaction.activeInteractions') || [];\n            return interactions.reduce((acc: string[], interaction: any) => {\n                const id: string = get(interaction, 'id');\n                const interactionsNeedingSession: any[] = this.get('interactionsNeedingSession');\n                const needsSession = !!interactionsNeedingSession.find((int: any) => id === get(int, 'id'));\n                const acceptedByClient: boolean = get(interaction, 'acceptedByClient');\n                const shouldAutoAnswer: boolean = this.get('webrtc.inboundAcdCallsToAutoAnswer').findBy('id', id);\n                if (needsSession || acceptedByClient || shouldAutoAnswer) {\n                    acc.push(id);\n                }\n                return acc;\n            }, []);\n        }\n    ),\n\n    /**\n     * Read only reference to all active agent conversations\n     */\n    activeInteractions: null as any,\n\n    /**\n     * @Attribute\n     * Read only reference to all active workitems\n     */\n    activeWorkitems: null as Maybe<WorkitemInteraction[]>,\n\n    /**\n     * Determines if scripted is available for currently selected interaction\n     */\n    isScriptAvailable: computed('_interactionScriptStateMap', 'selectedInteraction.id', function (): boolean {\n        const interactionScriptDetails = this.get('_interactionScriptStateMap')[this.get('selectedInteraction.id')];\n        return interactionScriptDetails && !!interactionScriptDetails.scriptAvailable;\n    }),\n\n    /**\n     * Determines if we should wait for scripter by see if we have an entry in script map\n     * for selected interaction\n     */\n    isScriptAvailabilityPending: computed('_interactionScriptStateMap', 'selectedInteraction.id', function (): boolean {\n        return (\n            this.get('selectedInteraction.id') &&\n            !this.get('_interactionScriptStateMap')[this.get('selectedInteraction.id')]\n        );\n    }),\n\n    /**\n     * Flag that toggles between v1 and v2 interapptions manager\n     */\n    useAppsV2ConversationInterapptionManager: true,\n\n    /**\n     * Returns an object of interactions keys by interaction id\n     */\n    activeInteractionsMetadataMap: computed('activeInteractions.@each.__interaction_metadata__', function (): Record<\n        string,\n        Conversation\n    > {\n        let result = {};\n        const interactions = this.get('activeInteractions');\n        if (interactions && typeOf(interactions) === 'array') {\n            result = interactions.reduce((acc: Record<string, Conversation>, currInteraction: any) => {\n                const currInteractionId = currInteraction ? currInteraction.get('id') : null;\n                if (currInteractionId) {\n                    acc[currInteractionId] = currInteraction.get('__interaction_metadata__');\n                }\n\n                return acc;\n            }, {});\n        }\n\n        return result;\n    }),\n\n    /**\n     * Returns the id of the selected subPanel Interapption\n     */\n    selectedSubPanelInterapptionId: computed(\n        'selectedSubPanelInterapptionStateKey',\n        'activeSubPanelInterapptions',\n        function (): Maybe<string> {\n            const stateKey = this.get('selectedSubPanelInterapptionStateKey');\n            const activeInterapptions = this.get('activeSubPanelInterapptions');\n            const interapption = activeInterapptions.findBy('stateKey', stateKey);\n            if (interapption) return interapption.get('id');\n            return null;\n        }\n    ),\n\n    /**\n     * Returns whether user has the org setting to enforce ACW at the communication level enabled\n     */\n    useCommunicationACW: computed.readOnly('selectedInteraction.useCommunicationACW'),\n\n    /**\n     * @Action\n     * Decline a given interaction.\n     * @param interaction - The Ember model for the interaction\n     */\n    actionDeclineInteraction(interaction: any) {\n        const intService = this.get('interaction');\n        intService.get('_declineInteraction').perform(interaction);\n    },\n\n    /**\n     * @Action\n     * Given a given interaction focus in the UI.\n     * @param interaction - The Ember model for the interaction\n     * @param implicit - Flag noting if action was automated\n     */\n    actionSelectInteraction(interaction: any, implicit = false) {\n        const tasks: Promise<any>[] = [\n            this.get('interaction')\n                .setSelectedInteraction(interaction, { automated: implicit, skipHolding: this.get('isPopout') })\n                .catch(error => {\n                    this.get('logger').error('ACD: There was an error selecting a new interaction', {\n                        remoteData: { error, id: interaction ? interaction.id : 'No interaction provided' }\n                    });\n                })\n        ];\n\n        if (interaction && !implicit) {\n            tasks.push(this.actionSelectWorkitemInteraction(null));\n        }\n\n        return RSVP.all(tasks);\n    },\n\n    /**\n     * @Action\n     * Toggle the user's \"on queue\" presence if streaming service is connected.\n     */\n    actionGoOnQueue() {\n        if (this.get('streamingConnected')) {\n            this.get('queueToggle').handleToggle();\n        }\n    },\n\n    /**\n     * @Action\n     * Initiate an outbound voice call on behalf of a queue.\n     * @param selection - phone number object bound in UI\n     * @returns make call request promise\n     */\n    actionCreateCall(selection: any) {\n        const number = get(selection, 'e164');\n        const { id: contactId, queue } = getProperties(selection, 'id', 'queue');\n        return this.get('phone').makeCall(number, null, queue, contactId);\n    },\n\n    /**\n     * @Action\n     * Initiate an outbound email on behalf of a queue.\n     * @param selection - email object bound in UI\n     * @returns create email request promise\n     */\n    actionCreateEmail(selection: any) {\n        const { email, id: contactId, queue } = getProperties(selection, 'email', 'id', 'queue');\n        return this.get('acdemail').createEmail(queue.id, email, contactId);\n    },\n\n    /**\n     * @Action\n     * Initiate an outbound message on behalf of a queue.\n     * TODO: create type for selection when typing interaction-outbound-contact\n     * @param selection - message object bound in UI\n     * @returns create message request promise\n     */\n    actionCreateMessage(selection: any) {\n        const options = {\n            queueId: selection.queue.id,\n            entity: {\n                id: get(selection, 'id'),\n                value: get(selection, 'e164'),\n                entity: {\n                    type: get(selection, 'entityType')\n                }\n            },\n            toAddressMessengerType: 'sms'\n        };\n        const useExistingConversation = true;\n        return this.get('acdsms').createMessage(options, useExistingConversation);\n    },\n\n    /**\n     * @Action\n     * Load the queue name for specific queue\n     * @param queueId - the queue guid\n     * @returns the queue name\n     */\n    async actionLoadQueue(queueId: string): Promise<string> {\n        if (queueId) {\n            try {\n                const name = await this.get('participantName').fetchQueueName(queueId);\n                if (name) {\n                    return name;\n                }\n            } catch (error) {\n                this.get('logger').error('ACD: Could not fetch queue name', { error });\n            }\n        }\n        return this.get('intl').t('purecloud.acdInteraction.unknown');\n    },\n\n    /**\n     * @Action\n     * Load the name for a given participant.\n     * @param interaction - interaction model\n     * @param participantId - participant guid\n     * @returns the participant name\n     */\n    async actionLoadParticipantName(interaction: any, participantId: string): Promise<string> {\n        const conversation: Conversation = get(interaction, '__interaction_metadata__');\n        const participants = conversation.participants || [];\n        const participant = participants.find(p => p.id === participantId);\n        const noName = this.get('intl').t('purecloud.acdInteraction.noName');\n\n        if (!participant) {\n            return noName;\n        }\n\n        try {\n            const name = await this.get('participantName').fetchNameFromParticipant(participant);\n            if (name) {\n                return name;\n            }\n        } catch (error) {\n            this.get('logger').error('ACD: Could not load participant name', { error });\n        }\n\n        return noName;\n    },\n\n    /**\n     * @Action\n     * Answer a given workitem interaction.\n     * @param {WorkitemInteraction} workitemInteraction - workitem interaction model\n     */\n    actionAnswerWorkitemInteraction(workitemInteraction: WorkitemInteraction) {\n        this.actionSelectWorkitemInteraction(workitemInteraction);\n        this.get('acdworkitem')\n            .answer(workitemInteraction)\n            .catch((error: any) => {\n                if (error.payload?.code === 'too.many.requests.retry.after') {\n                    this._displayError('purecloud.acdInteraction.workitem.errors.rateLimit');\n                } else {\n                    this._displayError('purecloud.acdInteraction.workitem.errors.answer');\n                }\n            });\n    },\n\n    /**\n     * @Action\n     * Decline a given workitem interaction.\n     * @param {WorkitemInteraction} workitemInteraction - workitem interaction model\n     */\n    actionDeclineWorkitemInteraction(workitemInteraction: WorkitemInteraction) {\n        this.actionSelectWorkitemInteraction(workitemInteraction);\n        this.get('acdworkitem')\n            .decline(workitemInteraction)\n            .catch((error: any) => {\n                if (error.payload?.code === 'too.many.requests.retry.after') {\n                    this._displayError('purecloud.acdInteraction.workitem.errors.rateLimit');\n                } else {\n                    this._displayError('purecloud.acdInteraction.workitem.errors.decline');\n                }\n            });\n    },\n\n    /**\n     * @action\n     * Focuses the given workitem as the selected workitem.\n     *\n     * @note\n     * If the incoming workitem is `null` then we will NOT affect active interactions.\n     * If the incoming workitem is not `null` then we will set the active interaction to `null`\n     *\n     * @param workitem the incoming workitem to set as the selected interaction\n     * @param automated `true` if the selection was not initiated manually by the user, but instead initiated from our processing\n     */\n    actionSelectWorkitemInteraction(workitem: Maybe<WorkitemInteraction>, automated = false) {\n        const tasks = [];\n        const skipHolding = this.get('isPopout');\n        if (!skipHolding) {\n            // the workitems that we want to hold based on id selection and current assignmentState needing to be connected\n            const holdingWorkitems = (this.get('activeWorkitems') ?? []).filter(\n                item => workitem?.id !== item.id && item.workitem.assignmentState === 'Connected'\n            );\n\n            tasks.push(\n                ...holdingWorkitems.map(item =>\n                    this.get('acdworkitem')\n                        .hold(item)\n                        .catch((error: any) => {\n                            this.get('logger').debug('ACD: Error holding workitem interaction.', { error });\n                        })\n                )\n            );\n        }\n\n        if (workitem) {\n            if (!automated) {\n                // if we are selecting a workitem, reset the interactions\n                tasks.push(this.actionSelectInteraction(null));\n            }\n\n            // only need to unhold if the current workitem is held\n            if (!skipHolding && workitem.workitem.assignmentState === 'Held') {\n                tasks.push(\n                    this.get('acdworkitem')\n                        .unhold(workitem)\n                        .catch((error: any) => {\n                            this.get('logger').debug('ACD: Error un-holding workitem interaction.', { error });\n                            if (error.payload?.code === 'too.many.requests.retry.after') {\n                                this._displayError('purecloud.acdInteraction.workitem.errors.rateLimit');\n                            } else {\n                                this._displayError('purecloud.acdInteraction.workitem.errors.select');\n                            }\n                        })\n                );\n            }\n        }\n\n        safeSet(this, 'selectedWorkitem', workitem ?? null);\n        return RSVP.all(tasks);\n    },\n\n    /**\n     * @Init\n     * Configure the providers for interapption panels.\n     */\n    configureAppProviders() {\n        const providerConfigMap = getOwner(this).lookup('app-provider:provider-config-map');\n        const providerConfig = _buildProviderConfig(providerConfigMap, this.get('logger'));\n        // _buildAppProviderComputed returns a computed-property descriptor, so it\n        // must be installed with defineProperty. Using this.set() would store the\n        // descriptor as a plain value, making this.get('interapptionProviders')\n        // return the descriptor (not the array) and breaking `.filter`. See\n        // ember-3-migration spec.\n        defineProperty(this, 'interapptionProviders', _buildAppProviderComputed(providerConfig));\n    },\n\n    /**\n     * @Init\n     * Configure the providers for AppsV2 Workers.\n     */\n    configureWorkerProviders() {\n        const workerProviderConfigMap = getOwner(this).lookup('worker-provider:provider-config-map');\n        const providerConfig = _buildProviderConfig(workerProviderConfigMap, this.get('logger'));\n        // Computed descriptor — install via defineProperty, not set(). See above.\n        defineProperty(this, 'workerProviders', _buildWorkerProviderComputed(providerConfig));\n    },\n\n    /**\n     * @Init\n     * Configure the default sub-panels to show.\n     */\n    configureDefaultPanels() {\n        const shouldFetchDefaultPanelSettings =\n            this.get('permissions').validateDonutPermission('agentUI:defaultPanels:view');\n\n        if (!isTesting && shouldFetchDefaultPanelSettings) {\n            this.get('agentUIBackend')\n                .getOrganizationDefaultPanelSettings()\n                .catch((error: Error) => {\n                    this.get('logger').error(\n                        'Failed initial attempt to load the org-level default panel settings, retrying...',\n                        { error }\n                    );\n                    return new RSVP.Promise(resolve => later(resolve, 1000)).then(() =>\n                        this.get('agentUIBackend').getOrganizationDefaultPanelSettings()\n                    );\n                })\n                .then((settings: any) => {\n                    this.set('_defaultPanelSettings', settings && typeof settings === 'object' ? settings : {});\n                })\n                .catch((error: Error) => {\n                    this.get('logger').error('Failed to load the org-level default panel settings', { error });\n                });\n        }\n    },\n\n    /**\n     * Event handler for conversation created events. Will set the newly\n     * created conversation as the 'requestedInteraction for selection.\n     * @param opts - an object containing a conversation id\n     */\n    requestInteraction(opts: CreateRequestResponse) {\n        const conversationId: string = opts.conversationId;\n        if (conversationId) {\n            this.set('requestedInteraction', conversationId);\n        }\n    },\n\n    /**\n     * Event handler to handle when a conversation is answered and should\n     * be selected.\n     * @param opts - an object containing the answered interaction\n     */\n    handleAnswerInteraction(opts: any) {\n        if (opts.interaction) {\n            this.actionSelectInteraction(opts.interaction);\n        }\n    },\n\n    /**\n     * Event handler for workitem unpark events. Will set the\n     * currently unparked workitem as a 'requestedWorkitem' for selection.\n     * @param workitemId - ID of a workitem to be selected\n     */\n    requestWorkitem(workitemId: string) {\n        if (workitemId) {\n            this.set('requestedWorkitemId', workitemId);\n        }\n    },\n\n    /**\n     * @Init\n     * Bind event creation to requestInteraction handler.\n     */\n    bindCreateEvents() {\n        this.get('acdemail').on(EMAIL_CONVERSATION_CREATED_EVENT, this, this.requestInteraction);\n        this.get('acdsms').on(MESSAGE_CONVERSATION_CREATED_EVENT, this, this.requestInteraction);\n        this.get('acdcall').on(CALL_CONVERSATION_CREATED_EVENT, this, this.requestInteraction);\n        this.get('interaction').on(ANSWER_INTERACTION_EVENT, this, this.handleAnswerInteraction);\n        this.get('acdworkitem').on(WORKITEM_ASSIGNMENT_STATE_CHANGED_EVENT, this, this.requestWorkitem);\n    },\n\n    /**\n     * @WillDestroyElement\n     * Unbind event creation to requestInteraction handler.\n     */\n    unbindCreateEvents() {\n        this.get('acdemail').off(EMAIL_CONVERSATION_CREATED_EVENT, this, this.requestInteraction);\n        this.get('acdsms').off(MESSAGE_CONVERSATION_CREATED_EVENT, this, this.requestInteraction);\n        this.get('acdcall').off(CALL_CONVERSATION_CREATED_EVENT, this, this.requestInteraction);\n        this.get('interaction').off(ANSWER_INTERACTION_EVENT, this, this.handleAnswerInteraction);\n        this.get('acdworkitem').off(WORKITEM_ASSIGNMENT_STATE_CHANGED_EVENT, this, this.requestWorkitem);\n    },\n\n    /**\n     * @DidReceiveAttrs\n     * Determine in changes to active interactions/workitems should result in\n     * changes to selected interaction/workitem.\n     */\n    processActiveRoutableChanges() {\n        const activeInteractions = this.get('activeInteractions') || [];\n        const requestedInteractionId = this.get('requestedInteraction');\n        const requestedInteraction =\n            requestedInteractionId && activeInteractions.length\n                ? activeInteractions.find((interaction: any) => interaction.id === requestedInteractionId)\n                : null;\n\n        if (requestedInteractionId && requestedInteraction && !isDestroyed(requestedInteraction)) {\n            this.actionSelectInteraction(requestedInteraction, true);\n            this.actionSelectWorkitemInteraction(null, true);\n            this.set('requestedInteraction', null);\n            return;\n        }\n\n        // If a workitem was requested, look it up and set it as active.\n        // If not, or if it isn't found in the active array, continue on.\n        const requestedWorkitemId = this.get('requestedWorkitemId');\n        const activeWorkitems = this.get('activeWorkitems') || [];\n        if (requestedWorkitemId) {\n            const requestedWorkitem = activeWorkitems.find(workitem => workitem.id === requestedWorkitemId);\n            if (requestedWorkitem) {\n                this.actionSelectInteraction(null, true);\n                this.actionSelectWorkitemInteraction(requestedWorkitem, true);\n                this.set('requestedWorkitemId', null);\n                return;\n            }\n        }\n\n        // If an interaction is currently selected and not destroyed, check to\n        // make sure if it's still in the active array or if we're transitioning\n        // from call to callback (or vice versa).\n        const selectedInteraction = this.get('selectedInteraction');\n        if (selectedInteraction && !isDestroyed(selectedInteraction)) {\n            const selectedId = get(selectedInteraction, 'id');\n            const activeSelectedInteraction = activeInteractions.find(\n                (interaction: any) => get(interaction, 'id') === selectedId\n            );\n\n            // If the interaction wasn't found, set the active to empty and exit.\n            // Otherwise, we'll hit an error below as we can't determine type.\n            if (!activeSelectedInteraction) {\n                this.actionSelectInteraction(null, true);\n                this.actionSelectWorkitemInteraction(null, true);\n                return;\n            }\n\n            // Compare the types and set selected accordingly.\n            if (get(activeSelectedInteraction, 'type') !== get(selectedInteraction, 'type')) {\n                this.actionSelectInteraction(activeSelectedInteraction, true);\n                this.actionSelectWorkitemInteraction(null, true);\n            }\n\n            return;\n        }\n\n        // If the currently selected workitem is requested and still active, exit.\n        const selectedWorkitem = this.get('selectedWorkitem');\n        if (selectedWorkitem && activeWorkitems.find(wi => wi.id === selectedWorkitem.id)) {\n            return;\n        }\n\n        // If we've made it this far, we need to find an interaction to select,\n        // so take the first interaction in the active interactions array.\n        if (activeInteractions.length > 0) {\n            this.actionSelectInteraction(activeInteractions[0], true);\n            this.actionSelectWorkitemInteraction(null, true);\n            return;\n        }\n\n        // If there were no active interactions, look for an active workitem.\n        if (activeWorkitems.length > 0) {\n            this.actionSelectWorkitemInteraction(activeWorkitems[0], true);\n            this.actionSelectInteraction(null, true);\n            return;\n        }\n\n        // If we didn't find an interaction or workitem, set selected to null.\n        this.actionSelectInteraction(null, true);\n        this.actionSelectWorkitemInteraction(null, true);\n    },\n\n    /**\n     * Display a toast Error notification\n     * @param messageKey  The message translation key\n     * @param messageKeyOptions Translation options for given key\n     */\n    _displayError(messageKey: string, messageKeyOptions?: Record<string, any>) {\n        const message = this.get('intl').t(messageKey, messageKeyOptions);\n        this.get('notification').error(null, message, {});\n    },\n\n    /**\n     * @Action\n     * Answer a given interaction. If the interaction is part of an external campaign,\n     * copy the customer phone number to the user's clipboard for convenience.\n     * @param interaction - The Ember model for the interaction\n     */\n    actionAnswerInteraction(interaction: any) {\n        const intService = this.get('interaction');\n        this.actionSelectInteraction(interaction);\n        intService.get('_answerInteraction').perform(interaction);\n        const isExternalCampaign = get(interaction, 'isExternalCampaign');\n        if (isExternalCampaign && navigator && navigator.clipboard) {\n            const formattedCustomerPhoneNumber = get(interaction, 'formattedCustomerPhoneNumber');\n            navigator.clipboard.writeText(formattedCustomerPhoneNumber).catch(err => {\n                this.get('logger').warn('Failed to copy phone number.', err);\n            });\n        }\n    },\n\n    /**\n     * @Action\n     * Handle changes to script availability\n     * @param scriptAvailable - flag for script availability\n     */\n    actionScriptAvailabilityChanged(scriptAvailable: boolean) {\n        const scripterMap = this.get('_interactionScriptStateMap');\n        const selectedInteraction = this.get('selectedInteraction');\n        const interactionId = get(selectedInteraction, 'id');\n\n        if (interactionId) {\n            let interactionScriptDetails = scripterMap[interactionId];\n\n            if (!interactionScriptDetails) {\n                interactionScriptDetails = scripterMap[interactionId] = {\n                    scriptAvailable: false,\n                    changeCount: 0\n                };\n            }\n\n            interactionScriptDetails.scriptAvailable = scriptAvailable;\n            interactionScriptDetails.changeCount++;\n        }\n\n        const activeIds = this.get('activeInteractions').map((interaction: any) => {\n            return get(interaction, 'id');\n        });\n\n        const syncedScripterMap: Record<string, ScriptState> = activeIds.reduce(\n            (acc: Record<string, any>, currInteractionId: string) => {\n                if (scripterMap.hasOwnProperty(currInteractionId)) {\n                    acc[currInteractionId] = scripterMap[currInteractionId];\n                }\n\n                return acc;\n            },\n            {}\n        );\n\n        this.set('_interactionScriptStateMap', syncedScripterMap);\n    },\n\n    /**\n     * @Action\n     * Set Interapption Pool V2\n     */\n    actionOnAppPoolReady(appPoolV2: AppPool) {\n        this.set('appPoolV2', appPoolV2);\n    },\n\n    /**\n     * @Action\n     * Set Attention Count per Composite Id\n     */\n    actionOnAppAttentionCountChanged(attentionCountPerCompositeId: Record<string, number>) {\n        this.set('attentionCountPerCompositeId', attentionCountPerCompositeId);\n    },\n\n    /**\n     * @Action\n     * Set Contextual Interapption App Defs\n     * @param appDefs - the availabler app defs V2\n     */\n    actionOnContextualAvailableAppsChanged(resolvedApps: ResolvedApp[]) {\n        const panelCfgs: any[] = [];\n        for (const { compositeId, appDef } of resolvedApps) {\n            const assets: Partial<{ icon: AppDefV1Asset; monochromicIcon: AppDefV1Asset }> = {};\n            if (appDef.monochromicIcon) {\n                assets.monochromicIcon = appUtils.buildV1IconAsset(appDef.monochromicIcon);\n            }\n            if (appDef.icon) {\n                assets.icon = appUtils.buildV1IconAsset(appDef.icon);\n            }\n            const app = Ember.Object.create({\n                id: compositeId,\n                name: appDef.displayName || appDef.id,\n                assets,\n                // Prune off the interactionId and interactionType so that panelManager will track state\n                // at the interaction \"type\" level vs the \"instance\" level\n                stateKey: compositeId.split('&').slice(2).join('&')\n            });\n            panelCfgs.push(app);\n        }\n        this.set('activeSubPanelInterapptions', panelCfgs);\n    },\n\n    /**\n     * @Action\n     * Set HasConversationAppForCurrInteraction value\n     */\n    actionOnHasConversationAppForCurrInteractionChanged(hasConversationAppForCurrInteraction: boolean) {\n        this.set('hasConversationAppForCurrInteraction', hasConversationAppForCurrInteraction);\n    },\n\n    /**\n     * @Action\n     * Set HasContextualAppForCurrInteraction value\n     */\n    actionOnHasContextualAppForCurrInteractionChanged(hasContextualAppForCurrInteraction: boolean) {\n        this.set('hasContextualAppForCurrInteraction', hasContextualAppForCurrInteraction);\n    },\n\n    /**\n     * @Action\n     * Handle changes to sub panel selection\n     * @param panelStateKey - key for selected sub-panel\n     */\n    actionOnSubPanelSelectionChanged(panelStateKey: string) {\n        this.set('selectedSubPanelInterapptionStateKey', panelStateKey ? panelStateKey : null);\n    },\n\n    /**\n     * @Action\n     * Confine the consulted party of a consult\n     * TODO: Add confined to Communication type\n     * @param interaction - the interaction to change\n     * @param consultAgentParticipant - the participant to confine\n     */\n    actionConfineConsultedParty(interaction: any, consultAgentParticipant: any) {\n        if (consultAgentParticipant.calls[0].confined) {\n            this.get('communication')\n                .consultBoth(interaction)\n                .catch((err: any) => {\n                    this.get('logger').debug('ACD: Error consulting both participants.', { error: err });\n                    this._displayError('purecloud.acdInteraction.calls.errors.hold');\n                });\n        } else {\n            this.get('communication')\n                .consultObject(interaction)\n                .catch((err: any) => {\n                    this.get('logger').debug('ACD: Error confined a participant.', { error: err });\n                    this._displayError('purecloud.acdInteraction.calls.errors.hold');\n                });\n        }\n    },\n\n    /**\n     * @Action\n     * Complete the consult transfer\n     * @param interaction - the interaction to change\n     * @param consultInitiator - the participant to disconnect\n     */\n    actionCompleteConsultTransfer(interaction: any, consultInitiator: Participant) {\n        // disconnect consult initiator\n        const callId = get(interaction, 'id');\n        const type = get(interaction, 'type');\n\n        this.get('communication')\n            .disconnectParticipant(callId, consultInitiator.id, type)\n            .catch((err: any) => {\n                this.get('logger').debug('ACD: Error completing consult transfer.', { error: err });\n                this._displayError('purecloud.acdInteraction.errors.completeTransfer');\n            });\n    },\n\n    /**\n     * @Action\n     * Cancel the consult transfer\n     * @param interaction - the interaction to change\n     * @param consultAgentParticipant - the participant to disconnect\n     */\n    actionCancelConsultTransfer(interaction: any, consultAgentParticipant: Participant) {\n        // disconnect the consulted party\n        const callId = get(interaction, 'id');\n        const type = get(interaction, 'type');\n\n        this.get('communication')\n            .cancelConsult(interaction)\n            .catch((err: any) => {\n                this.get('logger').debug('ACD: Unable to cancel consult.', { error: err });\n            });\n\n        this.get('communication')\n            .disconnectParticipant(callId, consultAgentParticipant.id, type)\n            .catch((err: any) => {\n                this.get('logger').debug('ACD: Unable to disconnect consult participant.', { error: err });\n                this._displayError('purecloud.acdInteraction.errors.disconnectParticipant');\n            });\n    },\n\n    /**\n     * @Action\n     * Load the default queue for a given media type.\n     * @param communicationType - the communication media type to check for\n     * @returns RSVP promise for the default queue\n     */\n    actionFetchDefaultQueue(type: CommunicationType) {\n        const singularType = singularizeMediaType(type);\n        return this.get('queue').getDefaultQueue(singularType);\n    },\n\n    actionFetchQueue(queueId: string, options: any = {}) {\n        return this.get('store').findRecord('queue', queueId, options);\n    },\n\n    /**\n     * @Action\n     * @param Interaction - conversation model\n     * @returns the participant name\n     */\n    async loadDivisionName(divisionId: string | undefined): Promise<string | undefined> {\n        const state = this.get('state');\n        const acdExternalContactDivNameFT = state.featureToggles.acdExternalContactDivNameFT;\n        if (acdExternalContactDivNameFT && divisionId && divisionId !== '*') {\n            const cachedDivisionsMap = this.get('cachedDivisionsMap');\n            return (\n                cachedDivisionsMap.get(divisionId) ??\n                (async () => {\n                    try {\n                        const url = this.get('application').pcV2Uri(\n                            `platform/api/v2/authorization/divisions/${divisionId}`\n                        );\n                        const division = await this.get('ajax').ajaxGet(url);\n                        const divisionName = division?.name;\n                        cachedDivisionsMap.set(division.id, division?.name);\n                        return divisionName;\n                    } catch {}\n                })()\n            );\n        }\n        return;\n    },\n\n    init() {\n        this._super(...arguments);\n\n        this.set('appPoolV2', null);\n        this.set('attentionCountPerCompositeId', {});\n        this.set('activeSubPanelInterapptions', []);\n        this.set('_interactionScriptStateMap', {});\n        this.set('_defaultPanelSettings', {});\n\n        this.configureAppProviders();\n        this.configureWorkerProviders();\n        this.configureDefaultPanels();\n        this.bindCreateEvents();\n    },\n\n    didReceiveAttrs() {\n        debounce(this, this.processActiveRoutableChanges, 100);\n    },\n\n    willDestroyElement() {\n        this.unbindCreateEvents();\n        this._super(...arguments);\n    },\n\n    actions: {\n        scriptAvailabilityChanged(scriptAvailable: boolean) {\n            this.actionScriptAvailabilityChanged(scriptAvailable);\n        },\n        setOpenPanel(openPanel: OpenPanel) {\n            this.set('openPanel', openPanel);\n        },\n        onAppPoolReady(appPoolV2: AppPool) {\n            this.actionOnAppPoolReady(appPoolV2);\n        },\n        onAppAttentionCountChanged(attentionCountPerCompositeId: Record<string, number>) {\n            this.actionOnAppAttentionCountChanged(attentionCountPerCompositeId);\n        },\n        onContextualAvailableAppsChanged(resolvedApps: ResolvedApp[]) {\n            this.actionOnContextualAvailableAppsChanged(resolvedApps);\n        },\n        onHasConversationAppForCurrInteractionChanged(hasConversationAppForCurrInteraction: boolean) {\n            this.actionOnHasConversationAppForCurrInteractionChanged(hasConversationAppForCurrInteraction);\n        },\n        onHasContextualAppForCurrInteractionChanged(hasContextualAppForCurrInteraction: boolean) {\n            this.actionOnHasContextualAppForCurrInteractionChanged(hasContextualAppForCurrInteraction);\n        },\n        onSubPanelSelectionChanged(panelStateKey: string) {\n            this.actionOnSubPanelSelectionChanged(panelStateKey);\n        },\n        confineConsultedParty(interaction: any, consultAgentParticipant: any) {\n            this.actionConfineConsultedParty(interaction, consultAgentParticipant);\n        },\n        completeConsultTransfer(interaction: any, consultInitiator: Participant) {\n            this.actionCompleteConsultTransfer(interaction, consultInitiator);\n        },\n        cancelConsultTransfer(interaction: any, consultAgentParticipant: Participant) {\n            this.actionCancelConsultTransfer(interaction, consultAgentParticipant);\n        },\n        answerInteraction(interaction: any) {\n            this.actionAnswerInteraction(interaction);\n        },\n        declineInteraction(interaction: any) {\n            this.actionDeclineInteraction(interaction);\n        },\n        selectInteraction(interaction: any) {\n            this.actionSelectInteraction(interaction);\n        },\n        goOnQueue() {\n            this.actionGoOnQueue();\n        },\n        createCall(selection: any) {\n            return this.actionCreateCall(selection);\n        },\n        createEmail(selection: any) {\n            return this.actionCreateEmail(selection);\n        },\n        createMessage(selection: any) {\n            return this.actionCreateMessage(selection);\n        },\n        displayError(error: string, options: Record<string, any>) {\n            this._displayError(error, options);\n        },\n        getCanonicalContactSync(externalContactId: string) {\n            return this.get('externalContacts').getCanonicalContactSync(externalContactId);\n        },\n        loadQueueName(queueId: string) {\n            return this.actionLoadQueue(queueId);\n        },\n        loadDivisionName(divisionId: string | undefined): Promise<string | undefined> {\n            return this.loadDivisionName(divisionId);\n        },\n        fetchQueue(queueId: string, options: any = {}) {\n            return this.actionFetchQueue(queueId, options);\n        },\n        loadParticipantName(interaction: Conversation, participantId: string) {\n            return this.actionLoadParticipantName(interaction, participantId);\n        },\n        answerWorkitemInteraction(workitem: WorkitemInteraction) {\n            this.actionAnswerWorkitemInteraction(workitem);\n        },\n        declineWorkitemInteraction(workitem: WorkitemInteraction) {\n            this.actionDeclineWorkitemInteraction(workitem);\n        },\n        selectWorkitemInteraction(workitem: WorkitemInteraction) {\n            Ember.run.throttle(this, this.actionSelectWorkitemInteraction, workitem, 1000);\n        },\n        buildValidInterapption(typeId: string, id: string, config: any, trustedProvider?: boolean): any {\n            return this.get('apps').buildValidInterapption(typeId, id, config, trustedProvider);\n        },\n        fetchDefaultQueue(type: CommunicationType) {\n            return this.actionFetchDefaultQueue(type);\n        },\n        insertChatText(text: string) {\n            this.set('cannedResponseChatText', text);\n        },\n        insertSmsText(response: { strippedText?: string; structuredMessage?: string }) {\n            this.set('cannedResponseSmsText', response.strippedText);\n            this.set('structuredMessage', response.structuredMessage);\n        },\n        insertEmailText(text: string) {\n            this.set('cannedResponseEmailText', text);\n        }\n    }\n});\n","import Component from '@ember/component';\nimport { inject } from '@ember/service';\nimport { ConversationSummaryType } from 'web-directory/components/target-dropdown/types';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport { Maybe } from 'web-directory/types';\nimport { warnClosureAction } from 'web-directory/utils/acd';\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['interaction-blind-transfer-participant-dropdown'] as const,\n    classNameBindings: ['removeWrapperStyling:no-wrapper', 'removePadding'] as const,\n\n    store: inject('store'),\n    logger: inject('stashLogger'),\n\n    /**\n     * @attribute\n     *\n     * The `userId` of the participant being transferred to. We still need to fetch\n     * additional data before we are able to display to the user\n     */\n    participantId: null,\n\n    /**\n     * @attribute\n     *\n     * The type of the current interaction this component is being used for if applicable\n     */\n    interactionType: null as Maybe<ConversationSummaryType>,\n\n    /**\n     * @attribute\n     *\n     * removes the arrow and other wrapper styling that makes this appear as it's own\n     * dropdown. Set to `true` if this component should live inside another popover element`\n     */\n    removeWrapperStyling: false,\n\n    /**\n     * @attribute\n     * `true` if this component needs to remove it's padding throughout the context. This  may\n     * need to be `true` if the container that is rendering it does not have built in padding.\n     *\n     * @note\n     * This component was initially built without gux context, when implementing it with a\n     * `gux-popover` component, we needed to remove the initial padding the component was once\n     * responsible for. However, there are renditions of the component that still require it to\n     * manage it's own padding.\n     */\n    removePadding: false,\n\n    /**\n     * The participant data used to display information to the user\n     */\n    participant: null,\n\n    loading: false as boolean,\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n        this.fetchData();\n    },\n\n    /**\n     * Fetches the data corresponding to the participantId that was provided. Currently\n     * only supporting of the people collection within store and requires the participants\n     * userId.\n     */\n    async fetchData() {\n        this.set('loading', true);\n        try {\n            const [data] = await this.get('store').findMany('person', [this.get('participantId')]);\n            this.set('participant', data);\n        } catch (error: any) {\n            this.get('logger').error('There was an issue finding the participant', error);\n        }\n        this.set('loading', false);\n    },\n\n    /**\n     * @action\n     *\n     * Closure action passed tot he component to be invoked at the parent level. When invoked it will\n     * stop the transfer to the new participant.\n     */\n    actionCancelTransfer: () => {\n        warnClosureAction('actionCancelTransfer', null);\n    },\n\n    actions: {\n        /**\n         * Invoked when the user opts to cancel the current transferring participant\n         */\n        onCancelTransfer() {\n            this.actionCancelTransfer();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"w/cq5XUs\",\"block\":\"[[[10,0],[14,0,\\\"dropdown-header\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"header-container\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"h2\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,0],[\\\"purecloud.acdInteraction.transfer\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"content\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,2],[[33,3],null],null],[[[41,[33,4],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"loader\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"not-found\\\"],[12],[1,\\\"\\\\n                \\\"],[10,2],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,0],[\\\"purecloud.acdInteraction.participantNotFound\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[10,\\\"button\\\"],[14,0,\\\"cancel-transfer\\\"],[15,\\\"onclick\\\",[28,[37,5],[[30,0],\\\"onCancelTransfer\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,0],[\\\"common.cancel\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[]],[[[6,[39,6],null,[[\\\"person\\\",\\\"readOnly\\\",\\\"interactionType\\\"],[[33,3],true,[33,7]]],[[\\\"default\\\"],[[[[1,\\\"            \\\"],[10,0],[14,0,\\\"actions\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-button\\\"],[14,\\\"role\\\",\\\"button\\\"],[14,\\\"accent\\\",\\\"ghost\\\"],[14,0,\\\"cancel-transfer\\\"],[15,\\\"onclick\\\",[28,[37,5],[[30,0],\\\"onCancelTransfer\\\"],null]],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,0],[\\\"common.cancel\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]]],[]]],[13]],[],false,[\\\"t\\\",\\\"if\\\",\\\"eq\\\",\\\"participant\\\",\\\"loading\\\",\\\"action\\\",\\\"target-dropdown/rows/person-row\\\",\\\"interactionType\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel/interaction-blind-transfer-participant-dropdown/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed, get } from '@ember/object';\nimport { inject } from '@ember/service';\nimport { debounce, run } from '@ember/runloop';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport type { Maybe } from 'web-directory/types';\nimport { warnClosureAction } from 'web-directory/utils/acd';\nimport moment from 'web-directory/utils/dates';\nimport { requestFocus } from 'web-directory/utils/focus-management';\nimport safeSet from 'web-directory/utils/safeSet';\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['acd-interaction-card-v2-alerting'] as const,\n\n    session: inject('session'),\n    streaming: inject('streaming'),\n\n    /**\n     * @attribute\n     * Conversation represented by card\n     */\n    interaction: null as any,\n\n    /**\n     * @attribute\n     * An array of conversation ids that we should hide answer/decline\n     * controls for when alerting (e.g. auto answer, missing session, etc).\n     */\n    hideInteractionButtons: null as Maybe<string[]>,\n\n    /**\n     * Name of other consult initiator, if alerting conversation is part of an\n     * active consultulation\n     */\n    consultInitiatorName: null as Maybe<string>,\n\n    /**\n     * @attribute\n     * Whether to show the case (briefcase) icon.\n     */\n    showCaseIcon: false as boolean,\n    /**\n     * True/false if we should show the timeout bar\n     * We do not want to show the timeout bar if the user is being attended transferred yet.\n     */\n    showAlertingTimeout: computed('interaction.participantForCurrentUser.alertingTimeoutMs', function (): boolean {\n        return (\n            !!this.get('interaction.participantForCurrentUser.alertingTimeoutMs') &&\n            !this.get('interaction.isAttendedTransferring')\n        );\n    }),\n\n    /**\n     * True/false if answer/decline buttons should be shown\n     */\n    showInteractionButtons: computed(\n        'interaction.id',\n        'hideInteractionButtons.[]',\n        'hasAlertingPriority',\n        function (): boolean {\n            const toHide = this.get('hideInteractionButtons');\n            const id = this.get('interaction.id');\n            return !toHide.includes(id) && this.get('hasAlertingPriority');\n        }\n    ),\n\n    /**\n     * True/false if this client has alerting leader configured\n     */\n    hasAlertingConfigured: computed.and(\n        'session.features.CHAT-3526_enableAlertingLeaderPublicApi',\n        'streaming.alertingLeader.voice',\n        'streaming.alertingLeader.voice.configured'\n    ),\n\n    /**\n     * True/false if this client has alerting priority\n     */\n    hasAlertingPriority: computed(\n        'hasAlertingConfigured',\n        'streaming.alertingLeader.voice.alerting',\n        'interaction.isCall',\n        function () {\n            if (!this.get('hasAlertingConfigured')) {\n                return true;\n            } else {\n                if (!this.get('interaction.isCall')) {\n                    return true;\n                }\n                return !!this.get('streaming.alertingLeader.voice.alerting');\n            }\n        }\n    ),\n\n    /**\n     * True/false if this client does not have alerting priority\n     */\n    hasNonPrimaryAlertingPriority: computed('hasAlertingConfigured', 'hasAlertingPriority', function () {\n        return this.get('hasAlertingConfigured') && !this.get('hasAlertingPriority');\n    }),\n\n    /**\n     * @DidReceiveAttrs\n     * The consult initiator's name\n     */\n    async loadConsultInitiatorName(): Promise<void> {\n        const interaction = this.get('interaction');\n        const participantId = get(interaction, 'consultInitiator.id');\n        const onConsult = get(interaction, 'onConsult');\n\n        if (onConsult && participantId) {\n            const name = await this.actionLoadParticipantName(interaction, participantId);\n            run(() => {\n                safeSet(this, 'consultInitiatorName', name);\n            });\n        } else {\n            run(() => {\n                safeSet(this, 'consultInitiatorName', null);\n            });\n        }\n    },\n\n    /**\n     * @DidInsertElement\n     * Animate the alerting timeout bar\n     */\n    animateAlertingTimeout(): void {\n        const interaction = this.get('interaction');\n        const timeout = get(interaction, 'participantForCurrentUser.alertingTimeoutMs');\n        const startTime = get(interaction, 'alertingStartTime');\n\n        if (!timeout || !startTime) return;\n\n        const elapsed = moment(startTime).diff(moment());\n        const timeRemaining = timeout - elapsed;\n        const elapsedPercent = (elapsed / timeout) * 100;\n\n        const timeoutEl = this.element.querySelector('.int-timeout') as HTMLElement;\n        if (timeoutEl) {\n            timeoutEl.style.width = `${elapsedPercent}%`;\n\n            if (elapsedPercent < 100) {\n                timeoutEl.animate([{ width: `${elapsedPercent}%` }, { width: '100%' }], {\n                    duration: timeRemaining,\n                    easing: 'linear',\n                    fill: 'forwards'\n                });\n            }\n        }\n    },\n\n    /**\n     * @DidInsertElement\n     * Focus the answer button when card is rendered\n     */\n    focusAnswerButtons(): void {\n        requestFocus(this as any, '#roster-action-answer-button button');\n    },\n\n    /**\n     * @action\n     * Closure action passed to the component to be invoked at the parent level\n     */\n    actionAnswerInteraction: (interaction: any): void => warnClosureAction('actionAnswerInteraction', { interaction }),\n\n    /**\n     * @action\n     * Closure action passed to the component to be invoked at the parent level\n     */\n    actionDeclineInteraction: (interaction: any): void =>\n        warnClosureAction('actionDeclineInteraction', { interaction }),\n\n    /**\n     * @action\n     * Closure action passed to the component to be invoked at the parent level\n     */\n    actionLoadParticipantName: (interaction: any, participantId: string): string => {\n        warnClosureAction('actionLoadParticipantName', { interaction, participantId });\n        return '';\n    },\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n        debounce(this, this.loadConsultInitiatorName, 500);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.animateAlertingTimeout();\n        this.focusAnswerButtons();\n    },\n\n    _answer(this: any) {\n        const interaction = this.get('interaction');\n        this.logger.info('Answer button clicked', { conversationId: get(interaction, 'id') });\n        this.actionAnswerInteraction(interaction);\n    },\n\n    _decline(this: any) {\n        const interaction = this.get('interaction');\n        this.logger.info('Decline button clicked', { conversationId: get(interaction, 'id') });\n        this.actionDeclineInteraction(interaction);\n    },\n\n    actions: {\n        onAnswer(evt: MouseEvent) {\n            evt.preventDefault(); // ACE-2364\n            evt.stopPropagation(); // ACE-4373\n            this._answer();\n        },\n        onDecline(evt: MouseEvent) {\n            evt.preventDefault(); // ACE-2364\n            evt.stopPropagation(); // ACE-4373\n            this._decline();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"1gVcO2lD\",\"block\":\"[[[10,0],[14,0,\\\"sr-only\\\"],[14,\\\"role\\\",\\\"alert\\\"],[14,\\\"aria-live\\\",\\\"assertive\\\"],[14,\\\"aria-atomic\\\",\\\"true\\\"],[15,\\\"aria-label\\\",[52,[33,1],[28,[37,2],[\\\"purecloud.acdInteraction.interactionState.newNonPrimaryPriority\\\"],null],[28,[37,2],[\\\"purecloud.acdInteraction.interactionState.new\\\"],null]]],[12],[13],[1,\\\"\\\\n\\\"],[10,0],[15,0,[29,[\\\"roster-card roster-card-alerting \\\",[52,[33,3],\\\"ext-contact-div-name\\\"]]]],[12],[1,\\\"\\\\n    \\\"],[10,1],[14,1,\\\"skip-link-alerting-target\\\"],[14,\\\"tabindex\\\",\\\"-1\\\"],[12],[13],[1,\\\"\\\\n\\\"],[41,[33,4],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"int-timeout-wrapper\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"int-timeout\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"sr-only\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,2],[\\\"purecloud.acdInteraction.roster.cards.alerting.alertingTime\\\"],null]],[1,\\\"\\\\n                \\\"],[1,[28,[35,5],null,[[\\\"endTime\\\"],[[33,6,[\\\"alertingTimeRemaining\\\"]]]]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[28,[37,7],[[33,3],[33,8]],null],[[[6,[39,9],null,null,[[\\\"default\\\"],[[[[1,\\\"            \\\"],[1,[34,8]],[1,\\\"\\\\n\\\"]],[]]]]]],[]],null],[1,\\\"    \\\"],[10,0],[14,0,\\\"roster-card-header\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"int-type\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,10],null,[[\\\"type\\\",\\\"subtype\\\",\\\"engagementSource\\\",\\\"state\\\",\\\"size\\\",\\\"connected\\\",\\\"isCampaign\\\",\\\"acdEngagementSourcesFT\\\"],[[33,6,[\\\"type\\\"]],[33,6,[\\\"subMessageType\\\"]],[33,11],[33,12],\\\"medium\\\",[28,[37,13],[[33,6,[\\\"isDisconnected\\\"]],[33,6,[\\\"isTerminated\\\"]]],null],[33,6,[\\\"isCampaignCallback\\\"]],[33,14]]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"int-customer\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,15],null,[[\\\"conversation\\\",\\\"participantId\\\"],[[33,6],[33,6,[\\\"participantForCustomer\\\",\\\"id\\\"]]]]]],[1,\\\"\\\\n\\\"],[41,[33,6,[\\\"iAmConsulted\\\"]],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"int-customer-transfer\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,2],[\\\"purecloud.acdInteraction.roster.cards.alerting.consultTransferFrom\\\"],[[\\\"name\\\"],[[28,[37,13],[[33,16],\\\"\\\"],null]]]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,6,[\\\"isActiveConference\\\"]],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"int-conference\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,2],[\\\"purecloud.conference\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"]],[]],null]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"int-queue-time\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,6,[\\\"timeInQueue\\\"]],[[[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"svg-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/clock\\\"],[15,\\\"screenreader-text\\\",[28,[37,2],[\\\"purecloud.acdInteraction.roster.cards.alerting.alertingTime\\\"],null]],[12],[13],[1,\\\"\\\\n                \\\"],[1,[28,[35,5],null,[[\\\"startTime\\\"],[[33,6,[\\\"timeInQueue\\\"]]]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,7],[[33,6,[\\\"timeInQueueDuration\\\"]],[28,[37,17],[[33,6,[\\\"iAmConsulted\\\"]]],null]],null],[[[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"svg-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/clock\\\"],[15,\\\"screenreader-text\\\",[28,[37,2],[\\\"purecloud.acdInteraction.roster.cards.alerting.alertingTime\\\"],null]],[12],[13],[1,\\\"\\\\n                \\\"],[1,[28,[35,5],null,[[\\\"durationInMs\\\"],[[33,6,[\\\"timeInQueueDuration\\\"]]]]]],[1,\\\"\\\\n            \\\"]],[]],null]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"int-details\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"int-queue-case-row\\\"],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"queue-name-label\\\"],[12],[1,[28,[35,2],[\\\"purecloud.acdInteraction.roster.cards.alerting.queueLabel\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"queue-name\\\"],[12],[1,[34,18]],[13],[1,\\\"\\\\n\\\"],[41,[33,19],[[[6,[39,9],null,[[\\\"color\\\",\\\"icon\\\"],[\\\"gse-custom-accent-2\\\",\\\"true\\\"]],[[\\\"default\\\"],[[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"data-testid\\\",\\\"case-management-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/briefcase-regular\\\"],[15,\\\"screenreader-text\\\",[29,[[28,[37,2],[\\\"purecloud.acdInteraction.roster.caseLabel\\\"],null]]]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]]]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,20],[[[1,\\\"        \\\"],[10,0],[15,0,[29,[\\\"roster-actions \\\",[52,[33,3],\\\"ext-contact-div-name\\\"]]]],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-button\\\"],[14,1,\\\"roster-action-answer-button\\\"],[14,0,\\\"btn-answer\\\"],[15,\\\"aria-label\\\",[29,[[28,[37,2],[\\\"common.answer\\\"],null]]]],[15,\\\"gux-title\\\",[29,[[28,[37,2],[\\\"common.answer\\\"],null]]]],[14,\\\"accent\\\",\\\"primary\\\"],[15,\\\"onclick\\\",[28,[37,21],[[30,0],\\\"onAnswer\\\"],null]],[14,\\\"role\\\",\\\"button\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,2],[\\\"common.answer\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,\\\"gux-button\\\"],[14,1,\\\"roster-action-decline-button\\\"],[14,0,\\\"btn-decline\\\"],[15,\\\"aria-label\\\",[29,[[28,[37,2],[\\\"common.decline\\\"],null]]]],[15,\\\"gux-title\\\",[29,[[28,[37,2],[\\\"common.decline\\\"],null]]]],[14,\\\"accent\\\",\\\"secondary\\\"],[15,\\\"onclick\\\",[28,[37,21],[[30,0],\\\"onDecline\\\"],null]],[14,\\\"role\\\",\\\"button\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,2],[\\\"common.decline\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13]],[],false,[\\\"if\\\",\\\"hasNonPrimaryAlertingPriority\\\",\\\"t\\\",\\\"acdExternalContactDivNameFT\\\",\\\"showAlertingTimeout\\\",\\\"duration-format\\\",\\\"interaction\\\",\\\"and\\\",\\\"externalContactDivisionName\\\",\\\"tags-input/label\\\",\\\"acd-interactions-panel-v2/interaction-type-icon\\\",\\\"engagementSource\\\",\\\"state\\\",\\\"or\\\",\\\"acdEngagementSourcesFT\\\",\\\"acd-interactions-panel/participant-name\\\",\\\"consultInitiatorName\\\",\\\"not\\\",\\\"queueName\\\",\\\"showCaseIcon\\\",\\\"showInteractionButtons\\\",\\\"action\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel/interaction-card-v2/alerting-card/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed, get } from '@ember/object';\nimport { inject } from '@ember/service';\nimport type { WorkitemInteraction } from '@genesys/genesys-cloud-conversation-utils';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport { warnClosureAction } from 'web-directory/utils/acd';\nimport moment from 'web-directory/utils/dates';\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['acd-interaction-card-v2-alerting'] as const,\n\n    intl: inject('intl'),\n    logger: inject('stashLogger'),\n    participantName: inject('participant-name'),\n\n    /**\n     * @attribute\n     * Workitem represented by card\n     */\n    workitemInteraction: null as any,\n\n    /**\n     * @attribute\n     * Whether to show the case (briefcase) icon.\n     */\n    showCaseIcon: false as boolean,\n\n    /**\n     * Show alerting timeout if timeout value available\n     */\n    showAlertingTimeout: computed.bool('workitemInteraction.workitem.alertTimeoutSeconds'),\n\n    /**\n     * Alerting time end for workitem interaction\n     */\n    alertingTimeEnd: computed('workitemInteraction', function () {\n        const timeoutValue = this.get('workitemInteraction.workitem.alertTimeoutSeconds');\n        const alertingStartTime = this.get('workitemInteraction.workitem.dateAssignmentStateChanged');\n        return moment(alertingStartTime).add(timeoutValue, 's');\n    }),\n\n    /**\n     * @DidInsertElement\n     * Animate the alerting timeout bar\n     */\n    animateAlertingTimeout(): void {\n        const workitemInteraction = this.get('workitemInteraction');\n        const timeoutSeconds = workitemInteraction?.workitem.alertTimeoutSeconds;\n        const alertingStartTime = workitemInteraction?.workitem.dateAssignmentStateChanged;\n\n        if (!timeoutSeconds || !alertingStartTime) {\n            return;\n        }\n\n        const elapsedTime = moment().diff(moment(alertingStartTime), 's');\n        const timeRemainingMs = (timeoutSeconds - elapsedTime) * 1000;\n        const elapsedPercent = (elapsedTime / timeoutSeconds) * 100;\n\n        /*\n         Hide if time remaining is greater than alerting timeout when agent transfer, queue transfer alert\n         timeout expiry should be handled by assignment service.\n         */\n        if (timeRemainingMs < 0) {\n            const timeoutEl = this.element.querySelector('.int-timeout') as HTMLElement;\n            if (timeoutEl) {\n                timeoutEl.style.width = '100%';\n            }\n            return;\n        }\n\n        const timeoutEl = this.element.querySelector('.int-timeout') as HTMLElement;\n        if (timeoutEl) {\n            timeoutEl.style.width = `${elapsedPercent}%`;\n\n            if (elapsedPercent < 100) {\n                timeoutEl.animate([{ width: `${elapsedPercent}%` }, { width: '100%' }], {\n                    duration: timeRemainingMs,\n                    easing: 'linear',\n                    fill: 'forwards'\n                });\n            }\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.animateAlertingTimeout();\n    },\n\n    /**\n     * @action\n     * Closure action passed to the component to be invoked at the parent level\n     */\n    actionAnswerWorkitemInteraction: (workitemInteraction: WorkitemInteraction): void =>\n        warnClosureAction('actionAnswerWorkitemInteraction', { workitemInteraction }),\n\n    /**\n     * @action\n     * Closure action passed to the component to be invoked at the parent level\n     */\n    actionDeclineWorkitemInteraction: (workitemInteraction: WorkitemInteraction): void =>\n        warnClosureAction('actionDeclineWorkitemInteraction', { workitemInteraction }),\n\n    _answer(this: any) {\n        const workitem = this.get('workitemInteraction');\n        this.logger.info('Workitem answer button clicked', { conversationId: get(workitem, 'id') });\n        this.actionAnswerWorkitemInteraction(workitem);\n    },\n\n    _decline(this: any) {\n        const workitem = this.get('workitemInteraction');\n        this.logger.info('Workitem decline button clicked', { conversationId: get(workitem, 'id') });\n        this.actionDeclineWorkitemInteraction(workitem);\n    },\n\n    actions: {\n        onAnswer(evt: MouseEvent) {\n            evt.preventDefault(); // ACE-2364\n            evt.stopPropagation(); // ACE-4373\n            this._answer();\n        },\n        onDecline(evt: MouseEvent) {\n            evt.preventDefault(); // ACE-2364\n            evt.stopPropagation(); // ACE-4373\n            this._decline();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"X4SLGjy5\",\"block\":\"[[[10,0],[15,0,[29,[\\\"roster-card roster-card-alerting \\\",[52,[33,1],\\\"ext-contact-div-name\\\"]]]],[12],[1,\\\"\\\\n    \\\"],[10,1],[14,1,\\\"skip-link-alerting-target\\\"],[14,\\\"tabindex\\\",\\\"-1\\\"],[12],[13],[1,\\\"\\\\n\\\"],[41,[33,2],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"int-timeout-wrapper\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"int-timeout\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"sr-only\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,3],[\\\"purecloud.acdInteraction.roster.cards.alerting.alertingTime\\\"],null]],[1,\\\"\\\\n                \\\"],[1,[28,[35,4],null,[[\\\"endTime\\\"],[[33,5]]]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[28,[37,6],[[33,1],[33,7]],null],[[[6,[39,8],null,null,[[\\\"default\\\"],[[[[1,\\\"            \\\"],[1,[34,7]],[1,\\\"\\\\n\\\"]],[]]]]]],[]],null],[1,\\\"    \\\"],[10,0],[14,0,\\\"roster-card-header\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"int-type\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,9],null,[[\\\"type\\\",\\\"state\\\",\\\"size\\\",\\\"isDisconnected\\\"],[\\\"workitem\\\",[33,10],\\\"medium\\\",[28,[37,11],[[33,12,[\\\"workitem\\\",\\\"assignmentState\\\"]],\\\"Disconnected\\\"],null]]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"int-customer\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,13],null,[[\\\"conversation\\\",\\\"participantId\\\"],[[33,12],[33,12,[\\\"customer\\\",\\\"externalContactId\\\"]]]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,14],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"int-details\\\"],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"queue-name-label\\\"],[12],[1,[28,[35,3],[\\\"purecloud.acdInteraction.roster.cards.alerting.queueLabel\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"queue-name\\\"],[12],[1,[34,14]],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"int-details\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"int-queue-case-row\\\"],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"workitem-name-label\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,3],[\\\"purecloud.acdInteraction.roster.cards.alerting.workitemLabel\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"workitem-name\\\"],[12],[1,[33,12,[\\\"workitem\\\",\\\"name\\\"]]],[13],[1,\\\"\\\\n\\\"],[41,[33,15],[[[6,[39,8],null,[[\\\"color\\\",\\\"icon\\\"],[\\\"gse-custom-accent-2\\\",\\\"true\\\"]],[[\\\"default\\\"],[[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"data-testid\\\",\\\"case-management-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/briefcase-regular\\\"],[15,\\\"screenreader-text\\\",[29,[[28,[37,3],[\\\"purecloud.acdInteraction.roster.caseLabel\\\"],null]]]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]]]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[15,0,[29,[\\\"roster-actions \\\",[52,[33,1],\\\"ext-contact-div-name\\\"]]]],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-button\\\"],[14,1,\\\"roster-action-answer-button\\\"],[14,0,\\\"btn-answer\\\"],[15,\\\"aria-label\\\",[29,[[28,[37,3],[\\\"common.answer\\\"],null]]]],[15,\\\"title\\\",[29,[[28,[37,3],[\\\"common.answer\\\"],null]]]],[14,\\\"accent\\\",\\\"primary\\\"],[15,\\\"onclick\\\",[28,[37,16],[[30,0],\\\"onAnswer\\\"],null]],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,3],[\\\"common.answer\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"gux-button\\\"],[14,0,\\\"btn-decline\\\"],[15,\\\"aria-label\\\",[29,[[28,[37,3],[\\\"common.decline\\\"],null]]]],[15,\\\"title\\\",[29,[[28,[37,3],[\\\"common.decline\\\"],null]]]],[14,\\\"accent\\\",\\\"secondary\\\"],[15,\\\"onclick\\\",[28,[37,16],[[30,0],\\\"onDecline\\\"],null]],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,3],[\\\"common.decline\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"if\\\",\\\"acdExternalContactWorkitemsDivNameFT\\\",\\\"showAlertingTimeout\\\",\\\"t\\\",\\\"duration-format\\\",\\\"alertingTimeEnd\\\",\\\"and\\\",\\\"externalContactDivisionName\\\",\\\"tags-input/label\\\",\\\"acd-interactions-panel-v2/interaction-type-icon\\\",\\\"state\\\",\\\"eq\\\",\\\"workitemInteraction\\\",\\\"acd-interactions-panel/participant-name\\\",\\\"queueName\\\",\\\"showCaseIcon\\\",\\\"action\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel/interaction-card-v2/alerting-workitem-card/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed, get } from '@ember/object';\nimport ComputedProperty from '@ember/object/computed';\nimport { Maybe } from 'web-directory/types';\nimport { warnClosureAction } from 'web-directory/utils/acd-ts';\nimport template from './template';\n\nexport type RosterCardState = {\n    icon?: string;\n    class?: string;\n    textKey?: string;\n    unreadCount?: string;\n    loading?: boolean;\n};\n\nexport type SupplementalRosterCardState = {\n    textKey?: string;\n    text?: string;\n    class?: string;\n    elapsed?: string;\n    startTime?: string;\n    lastDialed?: string;\n    inactivityTimeout?: string;\n};\n\nexport default Component.extend({\n    layout: template,\n\n    /**\n     * @attribute\n     * `true` if interaction is currently selected\n     */\n    isSelected: false,\n\n    /**\n     * @attribute\n     * `true` if the current user participant is on barge-in\n     */\n    iAmOnBargeIn: false,\n\n    /**\n     * @attribute\n     * `true` if the current user participant is on coach\n     */\n    iAmOnCoach: false,\n\n    /**\n     * @attribute\n     * `true` if the current user participant is on monitor\n     */\n    iAmOnMonitor: false,\n\n    /**\n     * @attribute\n     * Conversation represented by card\n     */\n    interaction: null as any,\n\n    /**\n     * @attribute\n     * Name of participant (sup/agent) monitoring/ed or coaching/ed or barge-in\n     */\n    mcbParticipantName: null as Maybe<string>,\n\n    /**\n     * @attribute\n     * flag indicating if the new nav system is being used\n     */\n    useNewNav: false as boolean,\n\n    /**\n     * @attribute\n     * inactivity timeout ft\n     */\n    inactivityTimeoutFT: false,\n\n    /**\n     * @attribute\n     * Whether to show the case (briefcase) icon.\n     */\n    showCaseIcon: false as boolean,\n\n    bargeLabel: computed('iAmOnBargeIn', function () {\n        if (this.get('iAmOnBargeIn')) {\n            return 'purecloud.acdInteraction.roster.bargedBy';\n        }\n\n        return 'purecloud.acdInteraction.roster.bargedPerson';\n    }),\n\n    coachLabel: computed('iAmOnCoach', function () {\n        if (this.get('iAmOnCoach')) {\n            return 'purecloud.acdInteraction.roster.coachedBy';\n        }\n\n        return 'purecloud.acdInteraction.roster.coachedPerson';\n    }),\n\n    monitorLabel: computed('iAmOnMonitor', function () {\n        if (this.get('iAmOnMonitor')) {\n            return 'purecloud.acdInteraction.roster.monitoredBy';\n        }\n\n        return 'purecloud.acdInteraction.roster.monitoredPerson';\n    }),\n\n    showInactivityTimeout: computed('interaction.{isConnected,inactivityTimeout}', 'inactivityTimeoutFT', function () {\n        const interaction = this.get('interaction');\n        if (!interaction) return false;\n        if (!this.get('inactivityTimeoutFT')) return false;\n\n        return get(interaction, 'isConnected') && !!get(interaction, 'inactivityTimeout');\n    }),\n\n    /**\n     * Shows the user the inactivity timeout for the interaction.\n     *\n     * @note most components should override this with their own implementation as not\n     * all interactions have an inactivity timeout\n     */\n    inactivityTimeout: (function () {\n        return null;\n    })() as Maybe<string>,\n\n    /**\n     * State attribute which should be implemented by media component\n     */\n    state: (function () {\n        console.debug('ACD: Roster state not set for Roster Card component.');\n        return null;\n    })() as Maybe<RosterCardState>,\n\n    /**\n     * Supplemental state attribute which should be implemented by media component\n     */\n    supplementalState: (function () {\n        console.debug('ACD: Roster supplementalState not set for Roster Card component.');\n        return null;\n    })() as Maybe<SupplementalRosterCardState>,\n\n    /**\n     * Convenience alias for interaction type\n     */\n    type: computed.readOnly('interaction.type') as ComputedProperty<Maybe<string>>,\n\n    /**\n     * True/false if conversation is disconnected\n     */\n    inWrapup: computed.or('interaction.isTerminated', 'interaction.isDisconnected') as ComputedProperty<boolean>,\n\n    /**\n     * True/false to determine if screen-reader should alert disconnected interaction\n     */\n    shouldAlertDisconnected: computed.and('isSelected', 'inWrapup'),\n\n    /**\n     * `true` if the interaction is currently determined to be transferring to another participant while being\n     * attended by the initiated participant\n     */\n    isAttendedTransferring: computed.readOnly('interaction.isAttendedTransferring'),\n\n    /**\n     * true if the interaction is in muted, consult, conference or mcb\n     */\n    hasInteractionStatus: computed.or(\n        'iAmOnBargeIn',\n        'iAmOnMonitor',\n        'iAmOnCoach',\n        'interaction.onConsult',\n        'interaction.isActiveConference',\n        'interaction.myselfIsMonitor',\n        'interaction.myselfIsCoach',\n        'interaction.myselfIsBarged',\n        'isMuted'\n    ),\n\n    /**\n     * @action\n     * Action to view the conversation when the notification is clicked.\n     */\n    actionViewConversation: () => warnClosureAction('actionViewConversation')\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"kYtKxmpX\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"sr-only\\\"],[14,\\\"role\\\",\\\"alert\\\"],[14,\\\"aria-live\\\",\\\"assertive\\\"],[14,\\\"aria-atomic\\\",\\\"true\\\"],[15,\\\"aria-label\\\",[28,[37,2],[\\\"purecloud.acdInteraction.interactionState.disconnected\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[10,0],[15,0,[29,[\\\"roster-card roster-card-\\\",[36,3]]]],[12],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"int-type\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,4],null,[[\\\"type\\\",\\\"subtype\\\",\\\"engagementSource\\\",\\\"state\\\",\\\"size\\\",\\\"isDisconnected\\\",\\\"isCampaign\\\",\\\"acdEngagementSourcesFT\\\"],[[33,5,[\\\"type\\\"]],[33,5,[\\\"subMessageType\\\"]],[33,5,[\\\"engagementSource\\\"]],[33,6],\\\"medium\\\",[28,[37,7],[[33,5,[\\\"isDisconnected\\\"]],[33,5,[\\\"isTerminated\\\"]]],null],[33,5,[\\\"isCampaignCallback\\\"]],[33,8]]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,7],[[33,5,[\\\"myselfIsMonitorV2\\\"]],[33,9]],null],[[[1,\\\"            \\\"],[10,1],[15,0,[29,[\\\"int-supplemental \\\",[33,10,[\\\"class\\\"]]]]],[15,\\\"aria-label\\\",[29,[[28,[37,2],[[33,11]],[[\\\"agent\\\"],[[33,12]]]]]]],[15,\\\"title\\\",[29,[[28,[37,2],[[33,11]],[[\\\"agent\\\"],[[33,12]]]]]]],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/binoculars-regular\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"int-details\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"int-queue-case-row\\\"],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"int-queue\\\"],[15,\\\"aria-label\\\",[29,[[28,[37,2],[\\\"purecloud.acdInteraction.roster.queueLabel\\\"],[[\\\"queue\\\"],[[33,13]]]]]]],[15,\\\"title\\\",[29,[[28,[37,2],[\\\"purecloud.acdInteraction.roster.queueLabel\\\"],[[\\\"queue\\\"],[[33,13]]]]]]],[12],[1,\\\"\\\\n                \\\"],[1,[34,13]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,14],[[[6,[39,15],null,[[\\\"color\\\",\\\"icon\\\"],[\\\"gse-custom-accent-2\\\",\\\"true\\\"]],[[\\\"default\\\"],[[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"data-testid\\\",\\\"case-management-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/briefcase-regular\\\"],[15,\\\"screenreader-text\\\",[29,[[28,[37,2],[\\\"purecloud.acdInteraction.roster.caseLabel\\\"],null]]]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]]]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,16],[[[1,\\\"            \\\"],[10,1],[14,0,\\\"int-supplemental\\\"],[12],[1,\\\"\\\\n                \\\"],[10,1],[14,0,\\\"int-sup-main\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,2],[14,0,\\\"transferring\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,2],[\\\"purecloud.acdInteraction.transferring\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,10,[\\\"startTime\\\"]],[[[1,\\\"                    \\\"],[10,1],[14,0,\\\"int-sup-secondary\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,10,[\\\"startTime\\\"]],[[[1,\\\"                            \\\"],[1,[28,[35,17],null,[[\\\"startTime\\\"],[[33,10,[\\\"startTime\\\"]]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,18],[[[1,\\\"            \\\"],[10,1],[14,0,\\\"int-supplemental\\\"],[12],[1,\\\"\\\\n                \\\"],[10,1],[14,0,\\\"int-sup-main\\\"],[12],[1,\\\" \\\"],[13],[1,\\\"\\\\n                \\\"],[10,1],[14,0,\\\"int-sup-secondary\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,5,[\\\"isNonDiscretionaryCompletion\\\"]],[[[1,\\\"                        \\\"],[10,1],[14,0,\\\"interaction-state-timer\\\"],[15,\\\"aria-label\\\",[29,[[28,[37,2],[\\\"purecloud.acdInteraction.acw.remaining\\\"],null]]]],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,17],null,[[\\\"endTime\\\"],[[33,5,[\\\"acwTimeoutTimer\\\"]]]]]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,1],[14,0,\\\"interaction-state-timer\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,19],null,[[\\\"timeSince\\\"],[[33,5,[\\\"acwStartTimer\\\"]]]]]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,20],[[[1,\\\"            \\\"],[10,1],[14,0,\\\"int-supplemental\\\"],[12],[1,\\\"\\\\n                \\\"],[10,1],[14,0,\\\"int-sup-main\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,5,[\\\"onConsult\\\"]],[[[1,\\\"                        \\\"],[10,1],[15,\\\"aria-label\\\",[29,[[28,[37,2],[[33,21]],[[\\\"agent\\\"],[[33,22]]]]]]],[15,\\\"title\\\",[29,[[28,[37,2],[[33,21]],[[\\\"agent\\\"],[[33,22]]]]]]],[12],[1,\\\"\\\\n                            \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"consult\\\"],[14,\\\"icon-name\\\",\\\"legacy/agent-group\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[28,[37,7],[[33,5,[\\\"myselfIsMonitor\\\"]],[33,23]],null],[[[1,\\\"                        \\\"],[10,1],[15,\\\"aria-label\\\",[29,[[28,[37,2],[[33,11]],[[\\\"agent\\\"],[[33,12]]]]]]],[15,\\\"title\\\",[29,[[28,[37,2],[[33,11]],[[\\\"agent\\\"],[[33,12]]]]]]],[12],[1,\\\"\\\\n                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/binoculars-regular\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,7],[[33,5,[\\\"myselfIsCoach\\\"]],[33,24]],null],[[[1,\\\"                        \\\"],[10,1],[15,\\\"aria-label\\\",[29,[[28,[37,2],[[33,25]],[[\\\"agent\\\"],[[33,12]]]]]]],[15,\\\"title\\\",[29,[[28,[37,2],[[33,25]],[[\\\"agent\\\"],[[33,12]]]]]]],[12],[1,\\\"\\\\n                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"coaching\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,7],[[33,5,[\\\"myselfIsBarged\\\"]],[33,26]],null],[[[1,\\\"                        \\\"],[10,1],[15,\\\"aria-label\\\",[29,[[28,[37,2],[[33,27]],[[\\\"agent\\\"],[[33,12]]]]]]],[15,\\\"title\\\",[29,[[28,[37,2],[[33,27]],[[\\\"agent\\\"],[[33,12]]]]]]],[12],[1,\\\"\\\\n                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"campaign\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"]],[]],null]],[]]]],[]]],[41,[33,28],[[[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"muted\\\"],[14,\\\"icon-name\\\",\\\"microphone-disable\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,5,[\\\"isActiveConference\\\"]],[[[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"conference\\\"],[14,\\\"icon-name\\\",\\\"legacy/people\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,10,[\\\"startTime\\\"]],[[[1,\\\"                    \\\"],[10,1],[14,0,\\\"int-sup-secondary\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,10,[\\\"startTime\\\"]],[[[1,\\\"                            \\\"],[1,[28,[35,17],null,[[\\\"startTime\\\"],[[33,10,[\\\"startTime\\\"]]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,10],[[[1,\\\"            \\\"],[10,1],[15,0,[29,[\\\"int-supplemental \\\",[33,10,[\\\"class\\\"]]]]],[12],[1,\\\"\\\\n\\\"],[41,[33,10,[\\\"text\\\"]],[[[1,\\\"                    \\\"],[10,1],[14,0,\\\"int-sup-main\\\"],[15,\\\"aria-label\\\",[29,[[33,10,[\\\"text\\\"]]]]],[12],[1,\\\"\\\\n                        \\\"],[1,[33,10,[\\\"text\\\"]]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,10,[\\\"textKey\\\"]],[[[1,\\\"                    \\\"],[10,1],[14,0,\\\"int-sup-main\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,10,[\\\"lastDialed\\\"]],[[[1,\\\"                            \\\"],[2,[28,[37,2],[[33,10,[\\\"textKey\\\"]]],[[\\\"dialedNumber\\\"],[[33,10,[\\\"lastDialed\\\"]]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[1,[28,[35,2],[[33,10,[\\\"textKey\\\"]]],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,1],[14,0,\\\"int-sup-main\\\"],[12],[1,\\\" \\\"],[13],[1,\\\"\\\\n                \\\"]],[]]]],[]]],[1,\\\"\\\\n\\\"],[41,[28,[37,7],[[33,10,[\\\"startTime\\\"]],[33,10,[\\\"elapsed\\\"]],[33,10,[\\\"inactivityTimeout\\\"]]],null],[[[1,\\\"                    \\\"],[10,1],[14,0,\\\"int-sup-secondary\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,10,[\\\"startTime\\\"]],[[[1,\\\"                            \\\"],[1,[28,[35,17],null,[[\\\"startTime\\\"],[[33,10,[\\\"startTime\\\"]]]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,10,[\\\"elapsed\\\"]],[[[1,\\\"                            \\\"],[1,[28,[35,19],null,[[\\\"timeSince\\\"],[[33,10,[\\\"elapsed\\\"]]]]]],[1,\\\"\\\\n                        \\\"]],[]],null]],[]]],[1,\\\"\\\\n\\\"],[41,[28,[37,29],[[33,10,[\\\"inactivityTimeout\\\"]],[33,30]],null],[[[1,\\\"                            \\\"],[1,[28,[35,31],null,[[\\\"inactivityTimeout\\\",\\\"isDisconnected\\\",\\\"actionViewConversation\\\",\\\"useNewNav\\\"],[[33,10,[\\\"inactivityTimeout\\\"]],[28,[37,7],[[33,5,[\\\"isDisconnected\\\"]],[33,5,[\\\"isTerminated\\\"]]],null],[33,32],[33,33]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"]],[]],null]],[]]]],[]]]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[13]],[],false,[\\\"if\\\",\\\"shouldAlertDisconnected\\\",\\\"t\\\",\\\"type\\\",\\\"acd-interactions-panel-v2/interaction-type-icon\\\",\\\"interaction\\\",\\\"state\\\",\\\"or\\\",\\\"acdEngagementSourcesFT\\\",\\\"iAmOnMonitorDigital\\\",\\\"supplementalState\\\",\\\"monitorLabel\\\",\\\"mcbParticipantName\\\",\\\"queueName\\\",\\\"showCaseIcon\\\",\\\"tags-input/label\\\",\\\"isAttendedTransferring\\\",\\\"duration-format\\\",\\\"inWrapup\\\",\\\"time-elapsed\\\",\\\"hasInteractionStatus\\\",\\\"consultTitleKey\\\",\\\"otherConsultPartyName\\\",\\\"iAmOnMonitor\\\",\\\"iAmOnCoach\\\",\\\"coachLabel\\\",\\\"iAmOnBargeIn\\\",\\\"bargeLabel\\\",\\\"isMuted\\\",\\\"and\\\",\\\"showInactivityTimeout\\\",\\\"interaction-inactivity-status\\\",\\\"actionViewConversation\\\",\\\"useNewNav\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel/interaction-card-v2/base-card/template.hbs\",\"isStrictMode\":false});","import { computed, get } from '@ember/object';\nimport ComputedProperty from '@ember/object/computed';\nimport type { RosterCardState, SupplementalRosterCardState } from '../base-card/component';\nimport type { Maybe } from 'web-directory/types';\nimport BaseCard from '../base-card/component';\n\nconst INTL_KEY = {\n    UNREAD: 'purecloud.acdInteraction.roster.cards.unreadCount',\n    LAST_MSG_CUSTOMER: 'purecloud.acdInteraction.interactionState.unreadMessage',\n    TYPING: 'purecloud.acdInteraction.roster.cards.typing'\n};\n\nexport default BaseCard.extend({\n    classNames: ['acd-interaction-card-v2-chat'],\n\n    /**\n     * @Attribute\n     * Conversation represented by card\n     */\n    interaction: null as any,\n\n    /**\n     * @Attribute\n     * Array of conversation guids currently flagged as typing\n     */\n    isTypingInteractions: null as Maybe<string[]>,\n\n    /**\n     * Primary roster card state\n     */\n    state: computed(\n        'inWrapup',\n        'unreadMessageCount',\n        'lastMessageWasCustomer',\n        'isAttendedTransferring',\n        function (): Maybe<RosterCardState> {\n            if (this.get('isAttendedTransferring')) {\n                return {\n                    loading: true,\n                    class: 'transferring-state'\n                };\n            } else if (this.get('inWrapup')) {\n                return {\n                    icon: 'badge-check',\n                    class: 'wrapup-state',\n                    textKey: 'purecloud.acdInteraction.interactionState.wrapup'\n                };\n            } else if (this.get('unreadMessageCount')) {\n                return {\n                    icon: 'badge-amount',\n                    textKey: INTL_KEY.UNREAD,\n                    unreadCount: this.get('unreadMessageCount'),\n                    class: 'alert-state msg-count'\n                };\n            } else if (this.get('lastMessageWasCustomer')) {\n                return {\n                    icon: 'badge-amount',\n                    textKey: INTL_KEY.LAST_MSG_CUSTOMER,\n                    class: 'alert-state last-message-was-customer alert-state-abbreviated'\n                };\n            }\n            return null;\n        }\n    ),\n\n    /**\n     * Supplemental roster card state\n     */\n    supplementalState: computed(\n        'inWrapup',\n        'isTyping',\n        'lastMessageText',\n        function (): Maybe<SupplementalRosterCardState> {\n            if (this.get('inWrapup')) {\n                return null;\n            } else if (this.get('isTyping')) {\n                return {\n                    textKey: INTL_KEY.TYPING,\n                    class: '',\n                    elapsed: this.get('lastMessageTime')\n                };\n            } else if (this.get('lastMessageText')) {\n                return {\n                    text: this.get('lastMessageText'),\n                    class: '',\n                    elapsed: this.get('lastMessageTime')\n                };\n            }\n            return null;\n        }\n    ),\n\n    /**\n     * Flag for chat provider (v2 vs v1)\n     */\n    isV2Provider: computed.readOnly('interaction.isV2Provider') as ComputedProperty<boolean>,\n\n    /**\n     * Flag indicating if the last message was inbound or outbound\n     */\n    lastMessageWasCustomer: computed.readOnly('interaction.lastMessageWasCustomer') as ComputedProperty<boolean>,\n\n    /**\n     * Text of the last message sent or received.  Will be undefined if we it cannot be parsed from\n     * message objects.\n     */\n    lastMessageText: computed.readOnly('interaction.lastMessageText') as ComputedProperty<Maybe<string>>,\n\n    /**\n     * Time object from last message object. Read from mixins/acd.js\n     */\n    lastMessageTime: computed.readOnly('interaction.lastMessageTime') as ComputedProperty<Maybe<string>>,\n\n    /**\n     * Count of the number of messaage marked as unread, formatted as a string since we\n     * write anything >9 as 9+.\n     */\n    unreadMessageCount: computed(\n        'interaction.messages.@each.unread',\n        'interaction.room.messages.@each.unread',\n        function (): string {\n            let messages;\n\n            if (this.get('isV2Provider')) {\n                messages = this.get('interaction.messages') || [];\n            } else {\n                messages = this.get('interaction.room.messages') || [];\n            }\n\n            const cnt = messages.filter((m: any) => get(m, 'unread')).length;\n            return cnt > 9 ? '9+' : <string>cnt;\n        }\n    ),\n\n    /**\n     * True/false if interaction customer is flagged as typing\n     */\n    isTyping: computed('isTypingInteractions.[]', 'interaction.id', function (): boolean {\n        const typingInteractions: string[] = this.get('isTypingInteractions') || [];\n        const id: string = this.get('interaction.id');\n        return typingInteractions.indexOf(id) > -1;\n    })\n});\n","import { A } from '@ember/array';\nimport Component from '@ember/component';\nimport { computed, get } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { throttle } from '@ember/runloop';\nimport type { WorkitemInteraction } from '@genesys/genesys-cloud-conversation-utils';\nimport RSVP from 'rsvp';\nimport type { Maybe } from 'web-directory/types';\nimport type { CaseAssociationEntities } from 'web-directory/types/case-types';\nimport { warnClosureAction } from 'web-directory/utils/acd-ts';\nimport type { Draft } from 'web-directory/utils/email-types/draft-type';\nimport safeSet from 'web-directory/utils/safeSet';\n\nexport default Component.extend({\n    classNames: ['acd-interaction-card-v2'] as const,\n    classNameBindings: ['isAlerting', 'isSelected'] as const,\n\n    participantName: service('participant-name'),\n    logger: service('stash-logger'),\n    intl: service('intl'),\n\n    /**\n     * @attribute\n     * acdShowMonitoringIndicator ft\n     */\n    acdAnnounceMonitoringFt: false,\n\n    /**\n     * @attribute\n     * acdAnnounceMonitoringDigital ft\n     */\n    acdAnnounceMonitoringDigitalFt: false,\n\n    /**\n     * @attribute\n     * inactivity timeout ft\n     */\n    inactivityTimeoutFT: false,\n\n    /**\n     * @attribute\n     * Conversation represented by card\n     */\n    interaction: null as any,\n\n    /**\n     * @attribute\n     * Currently selection conversation\n     */\n    selectedInteraction: null as any,\n\n    /**\n     * @attribute\n     * Workitem represented by card\n     */\n    workitem: null as Maybe<WorkitemInteraction>,\n\n    /**\n     * @attribute\n     * Id of the interaction's (conversation, workitem) queue\n     */\n    interactionQueueId: '',\n\n    /**\n     * @attribute\n     * Draft type object containing draft updates\n     */\n    draftUpdateHash: null as Maybe<Draft[]>,\n\n    /**\n     * @attribute\n     * flag indicating if the new nav system is being used\n     */\n    useNewNav: false as boolean,\n\n    /**\n     * 'name' of agent being monitored\n     */\n    mcbParticipantName: null as Maybe<string>,\n\n    /**\n     * Queue name for the interaction (loaded asynchronously)\n     */\n    queueName: '' as string,\n\n    /**\n     * @private\n     * Id of the last fetched interaction's (conversation, workitem) queue\n     */\n    _prevInteractionQueueId: '' as string,\n\n    /**\n     * @attribute\n     * Version of the case cache; when it changes, this computed re-runs\n     */\n    caseCacheVersion: null as Maybe<number>,\n\n    /**\n     * @attribute\n     * Function (id: string) => Entity[] | null to get cached case for an interaction id\n     */\n    getCaseForInteraction: null as Maybe<(id: string) => Maybe<CaseAssociationEntities>>,\n\n    /**\n     * @attribute\n     * Id of the case associated with the interaction (from batch-loaded cache or workitem model).\n     */\n    associatedCaseId: computed(\n        'caseCacheVersion',\n        'getCaseForInteraction',\n        'interaction.id',\n        'interaction.workitem.id',\n        'isWorkitem',\n        'canViewCasesViaRequest',\n        'canViewWorkitemCases',\n        function (this: any): Maybe<string> {\n            const interaction = this.get('interaction');\n            const canViewCasesViaRequest = this.get('canViewCasesViaRequest');\n            const canViewWorkitemCases = this.get('canViewWorkitemCases');\n            // return null if no interaction, no permission for case associations, or feature toggles are both false\n            if (!interaction || !(canViewCasesViaRequest || canViewWorkitemCases)) return null;\n\n            const isWorkitem = get(this, 'isWorkitem');\n            if (isWorkitem) {\n                const caseOnModel: string | undefined =\n                    get(interaction, 'workitem.case.id') || get(interaction, 'workitem.caseId');\n                if (caseOnModel) return caseOnModel;\n            }\n\n            const id: string | undefined = isWorkitem ? get(interaction, 'workitem.id') : get(interaction, 'id');\n            // return null if no id, no permission for case associations, or association api request feature toggle is false\n            if (!id || !canViewCasesViaRequest) return null;\n\n            const getCase: (id: string) => Maybe<CaseAssociationEntities> = this.get('getCaseForInteraction');\n            if (typeof getCase !== 'function') return null;\n            const entities: Maybe<CaseAssociationEntities> = getCase(id);\n            return entities?.[0]?.case?.id ?? null;\n        }\n    ),\n\n    /**\n     * @attribute\n     * Whether to run case association requests for conversation and have permission to associate cases.\n     */\n    canViewCasesViaRequest: false as boolean,\n\n    /**\n     * @attribute\n     * Whether to get the case id for workitems from the model and have permission to associate cases.\n     */\n    canViewWorkitemCases: false as boolean,\n\n    showCaseIcon: computed('canViewCasesViaRequest', 'canViewWorkitemCases', 'associatedCaseId', function (): boolean {\n        const canViewCasesViaRequest = this.get('canViewCasesViaRequest');\n        const canViewWorkitemCases = this.get('canViewWorkitemCases');\n        const associatedCaseId = this.get('associatedCaseId');\n        return Boolean(canViewCasesViaRequest || canViewWorkitemCases) && !!associatedCaseId;\n    }),\n\n    /**\n     * `true` if the current user participant is on monitor.\n     */\n    iAmOnMonitor: computed(\n        'interaction.participants.@each.{monitoredParticipantId}',\n        'acdAnnounceMonitoringFt',\n        function () {\n            if (this.get('interaction.type') !== 'call' || !this.get('acdAnnounceMonitoringFt')) {\n                return false;\n            }\n\n            const participants: any[] = this.get('interaction.participants') ?? [];\n            const currUserParticipantId: string = this.get('interaction.participantForCurrentUser.id');\n\n            const monitoredParticipantId = participants.find(\n                (p: any) => p.monitoredParticipantId && !p.calls?.[0]?.disconnectType\n            )?.monitoredParticipantId;\n\n            return currUserParticipantId === monitoredParticipantId;\n        }\n    ),\n\n    /**\n     * `true` if the current user participant monitor - digital only\n     */\n    iAmOnMonitorDigital: computed(\n        'interaction.participants.@each.{monitoredParticipantId}',\n        'acdAnnounceMonitoringDigitalFt',\n        function () {\n            if (this.get('interaction.type') !== 'message' || !this.get('acdAnnounceMonitoringDigitalFt')) {\n                return false;\n            }\n\n            const participants: any[] = this.get('interaction.participants') ?? [];\n            const currUserParticipantId = this.get('interaction.participantForCurrentUser.id');\n\n            const monitoredParticipantId = participants.find(\n                (p: any) => p.monitoredParticipantId && !p.messages?.[0]?.disconnectType\n            )?.monitoredParticipantId;\n\n            return currUserParticipantId === monitoredParticipantId;\n        }\n    ),\n\n    /**\n     * `true` if the current user participant is on coach.\n     */\n    iAmOnCoach: computed('interaction.participants.@each.{coachedParticipantId}', function () {\n        const participants: any[] = this.get('interaction.participants') || [];\n        const currUserParticipantId = this.get('interaction.participantForCurrentUser.id');\n\n        const coachedParticipantId = participants.find(\n            (p: any) => p.coachedParticipantId && !p.calls?.[0]?.disconnectType\n        )?.coachedParticipantId;\n\n        return currUserParticipantId === coachedParticipantId;\n    }),\n\n    /**\n     * `true` if the current user participant is on barge-in\n     */\n    iAmOnBargeIn: computed('interaction.participants.@each.{bargedParticipantId}', function () {\n        const currUserParticipantId: string = this.get('interaction.participantForCurrentUser.id');\n\n        const bargedParticipantId = this.get('interaction.participants')?.find(\n            (p: any) => p.bargedParticipantId && !p.calls?.[0]?.disconnectType\n        )?.bargedParticipantId;\n\n        return currUserParticipantId === bargedParticipantId;\n    }),\n\n    /**\n     * Flag indicating if conversation is currently selected\n     */\n    isSelected: computed('interaction.id', 'selectedInteraction.id', 'selectedWorkitem.id', function (): boolean {\n        const selectedInteraction = this.get('interaction.id') === this.get('selectedInteraction.id');\n        const selectedWorkitem = this.get('interaction.id') === this.get('selectedWorkitem.id');\n        return selectedInteraction || selectedWorkitem;\n    }),\n\n    /**\n     * Flag indicating if interaction is a workitem\n     */\n    isWorkitem: computed.bool('interaction.workitem'),\n\n    /**\n     * Flag indicating if workitem is alerting\n     */\n    isAlertingWorkitem: computed.equal('interaction.workitem.assignmentState', 'Alerting'),\n\n    /**\n     * Alerting conversation or workitem interaction\n     */\n    isAlerting: computed.or('interaction.isAlerting', 'isAlertingWorkitem'),\n\n    /**\n     * `true` if the user is monitoring an agent\n     */\n    myselfIsMonitorV2: computed.readOnly('interaction.myselfIsMonitorV2'),\n\n    draftUpdate: computed('draftUpdateHash', 'draftUpdateHash.@each.conversationId', 'interaction.id', function () {\n        if (!this.get('draftUpdateHash')) return {};\n        return (this.get('draftUpdateHash') ?? A([])).findBy('conversationId', this.get('interaction.id')) ?? {};\n    }),\n\n    mcbedParticipantId: computed(\n        'interaction.{myselfIsMonitor,myselfIsCoach,myselfIsBarged}',\n        'myselfIsMonitorV2',\n        'iAmOnBargeIn',\n        'iAmOnCoach',\n        'iAmOnMonitor',\n        'iAmOnMonitorDigital',\n        function () {\n            const interaction = this.get('interaction');\n            if (!interaction) return null;\n\n            const currentUser: any = get(interaction, 'participantForCurrentUser');\n            if (!currentUser) return null;\n\n            if (\n                (this.get('myselfIsMonitorV2') || this.get('iAmOnMonitorDigital')) &&\n                !currentUser.messages?.[0]?.disconnectType\n            ) {\n                if (currentUser.monitoredParticipantId) {\n                    return currentUser.monitoredParticipantId;\n                }\n\n                return (\n                    get(interaction, 'participants')?.find(\n                        (p: any) =>\n                            (p.monitoredParticipantId || p.coachedParticipantId || p.bargedParticipantId) &&\n                            !p.messages?.[0]?.disconnectType\n                    )?.id ?? null\n                );\n            }\n\n            if (\n                (get(interaction, 'myselfIsBarged') ||\n                    get(interaction, 'myselfIsCoach') ||\n                    get(interaction, 'myselfIsMonitor')) &&\n                !currentUser.calls?.[0]?.disconnectType\n            ) {\n                return (\n                    currentUser.monitoredParticipantId ||\n                    currentUser.coachedParticipantId ||\n                    currentUser.bargedParticipantId\n                );\n            }\n\n            if (this.get('iAmOnBargeIn') || this.get('iAmOnCoach') || this.get('iAmOnMonitor')) {\n                return (\n                    get(interaction, 'participants')?.find(\n                        (p: any) =>\n                            (p.monitoredParticipantId || p.coachedParticipantId || p.bargedParticipantId) &&\n                            !p.calls?.[0]?.disconnectType\n                    )?.id ?? null\n                );\n            }\n\n            return null;\n        }\n    ),\n\n    /**\n     * @action\n     * Closure action passed to the component to be invoked at the parent level\n     */\n    actionLoadParticipantName: (interaction: any, participantId: string): RSVP.Promise<string> => {\n        warnClosureAction('actionLoadParticipantName', { interaction, participantId });\n        return RSVP.Promise.resolve('');\n    },\n\n    /**\n     * @action\n     * Closure action passed to the component to be invoked at the parent level\n     */\n    actionSelectInteraction: (interaction: any): void => warnClosureAction('actionSelectInteraction', { interaction }),\n\n    /**\n     * @action\n     * Closure action passed to the component to be invoked at the parent level\n     */\n    actionSelectWorkitemInteraction: (workitemInteraction: Maybe<WorkitemInteraction>): void =>\n        warnClosureAction('actionSelectWorkitemInteraction', { workitemInteraction }),\n\n    /**\n     * @Action\n     * Load the queue name for specific queue\n     * @param queueId - the queue guid\n     * @returns the queue name\n     */\n    async actionLoadQueue(queueId: string): Promise<string> {\n        if (queueId) {\n            try {\n                const name = await this.get('participantName').fetchQueueName(queueId);\n                if (name) {\n                    return name;\n                }\n            } catch (error) {\n                this.get('logger').error('ACD: Could not fetch queue name', { error });\n            }\n        }\n        return this.get('intl').t('purecloud.acdInteraction.unknown');\n    },\n\n    /**\n     * @action\n     * Action to view the conversation when the notification is clicked.\n     */\n    actionViewConversation: () => warnClosureAction('actionViewConversation'),\n\n    invokeItemSelection(interaction: any) {\n        if (this.get('isWorkitem')) {\n            return this.actionSelectWorkitemInteraction(interaction);\n        }\n        return this.actionSelectInteraction(interaction);\n    },\n\n    _selectItem() {\n        const interaction = this.get('interaction');\n        if (interaction) {\n            throttle(this, this.invokeItemSelection, interaction, 500);\n        }\n    },\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n        const interaction = this.get('interaction');\n\n        if (!this.get('isWorkitem')) {\n            if (!!this.get('mcbedParticipantId')) {\n                this.actionLoadParticipantName(interaction, this.get('mcbedParticipantId')).then((name: string) => {\n                    safeSet(this, 'mcbParticipantName', name);\n                });\n            }\n        }\n\n        if (this.get('myselfIsMonitorV2') || this.get('iAmOnMonitorDigital')) {\n            this.actionLoadParticipantName(interaction, this.get('mcbedParticipantId')).then((name: string) => {\n                safeSet(this, 'mcbParticipantName', name);\n            });\n        }\n\n        const interactionQueueId = this.get('interactionQueueId');\n        if (interactionQueueId !== this.get('_prevInteractionQueueId')) {\n            this.set('_prevInteractionQueueId', interactionQueueId);\n            // actionLoadQueue will unconditionally return a string;\n            // including unknown fallback text for falsey/invalid queueIds and queue fetch failures\n            this.actionLoadQueue(interactionQueueId).then(queueName => {\n                safeSet(this, 'queueName', queueName);\n            });\n        }\n    },\n\n    actions: {\n        onSelectItem() {\n            this._selectItem();\n        }\n    }\n});\n","import { computed, get } from '@ember/object';\nimport { Participant } from '@genesys/genesys-cloud-conversation-utils';\nimport type { Maybe } from 'web-directory/types';\nimport type { Draft } from 'web-directory/utils/email-types/draft-type';\nimport type { RosterCardState, SupplementalRosterCardState } from '../base-card/component';\nimport BaseCard from '../base-card/component';\n\nexport default BaseCard.extend({\n    classNames: ['acd-interaction-card-v2-email'],\n\n    /**\n     * @Attribute\n     * Conversation represented by card\n     */\n    interaction: null as any,\n\n    /**\n     * @Attribute\n     * Email Draft Object containing updates\n     */\n    draftUpdate: null as Maybe<Draft>,\n\n    /**\n     * Array of emails from all the participants for this interaction\n     */\n    emails: computed(\n        'interaction',\n        'interaction.participants',\n        'interaction.participants.[]',\n        'interaction.participants.@each.emails',\n        function () {\n            const interaction = this.get('interaction');\n            const participants = interaction?.get('participants');\n            if (!participants || !participants.length) return [];\n            return participants\n                .map((participant: Participant) => participant.emails)\n                .filter(Boolean)\n                .flat();\n        }\n    ),\n\n    /**\n     * Primary roster card state\n     */\n    state: computed(\n        'inWrapup',\n        'isEditingDraft',\n        'isAttendedTransferring',\n        'interaction.{flowFailed,isFlowExecuting,flowStuck}',\n        function (): Maybe<RosterCardState> {\n            if (this.get('isAttendedTransferring')) {\n                return {\n                    loading: true,\n                    class: 'transferring-state'\n                };\n            } else if (this.get('inWrapup')) {\n                return {\n                    icon: 'badge-check',\n                    class: 'wrapup-state',\n                    textKey: 'purecloud.acdInteraction.interactionState.wrapup'\n                };\n            } else if (this.get('interaction.flowFailed')) {\n                return {\n                    icon: 'alert-warning-octogon',\n                    class: 'flow-failed-state',\n                    textKey: 'purecloud.acdInteraction.interactionState.emailFlowFailed'\n                };\n            } else if (this.get('interaction.isFlowExecuting') || this.get('interaction.flowStuck')) {\n                return {\n                    loading: true,\n                    class: 'flow-executing-state',\n                    textKey: this.get('interaction.flowStuck')\n                        ? 'purecloud.acdInteraction.interactionState.emailFlowStuck'\n                        : 'purecloud.acdInteraction.interactionState.emailFlowExecuting'\n                };\n            } else if (this.get('isEditingDraft')) {\n                return {\n                    icon: 'badge-edit',\n                    class: 'draft-state',\n                    textKey: 'purecloud.acdInteraction.interactionState.edit'\n                };\n            }\n            return null;\n        }\n    ),\n\n    /**\n     * Supplemental roster card state\n     */\n    supplementalState: computed('inWrapup', 'subject', 'lastReceived', function (): Maybe<SupplementalRosterCardState> {\n        if (this.get('inWrapup')) {\n            return null;\n        }\n        const subject = this.get('subject');\n        const elapsed = this.get('lastReceived') || null;\n        const textKey = 'purecloud.acdInteraction.roster.cards.email.noSubject';\n        const cssClass = '';\n\n        if (!!subject) {\n            return { class: cssClass, elapsed, text: subject };\n        }\n\n        return { class: cssClass, elapsed, textKey };\n    }),\n\n    /**\n     * Flag indicating that the draft is in edit mode\n     */\n    isEditingDraft: computed('draftUpdate.state', function () {\n        const state = (this.get('draftUpdate.state') || '').toLowerCase();\n        return state === 'edited' || state === 'ready';\n    }),\n\n    /**\n     * The subject of the last email message receieved or draft\n     */\n    subject: computed(\n        'draftUpdate.subject',\n        'interaction.participantForCustomer.emails.firstObject.subject',\n        function (): Maybe<string> {\n            return (\n                this.get('draftUpdate.subject') ||\n                this.get('interaction.participantForCustomer.emails.firstObject.subject')\n            );\n        }\n    ),\n\n    /**\n     * The Date object of the most recent received/sent email timestamp.\n     * Note: Draft times should not count towards the lastReceived.\n     */\n    lastReceived: computed('emails', function (): any {\n        const emails = this.get('emails') || [];\n\n        if (!emails || emails.length < 1) {\n            return null;\n        }\n\n        // Ignore any emails that have not yet been sent.\n        const filteredEmails = emails.filter((email: any) => !!email.messageId || email.messagesSent != '0');\n\n        if (filteredEmails.length) {\n            const times = filteredEmails.map((m: any) =>\n                new Date(get(m, 'disconnectedTime') || get(m, 'connectedTime')).valueOf()\n            );\n            const mostRecent = Math.max(...times);\n            return new Date(mostRecent);\n        }\n    })\n});\n","import { computed } from '@ember/object';\nimport ComputedProperty from '@ember/object/computed';\nimport type { Maybe } from 'web-directory/types';\nimport type { RosterCardState, SupplementalRosterCardState } from '../base-card/component';\nimport BaseCard from '../base-card/component';\n\nconst INTL_KEY = {\n    TYPING: 'purecloud.acdInteraction.roster.cards.typing'\n};\n\nexport default BaseCard.extend({\n    classNames: ['acd-interaction-card-v2-message'],\n\n    /**\n     * @attribute\n     * Array of conversation guids currently flagged as typing\n     */\n    isTypingInteractions: null as Maybe<boolean>,\n\n    /**\n     * @attribute\n     * mcb participant name\n     */\n    mcbParticipantName: null as Maybe<string>,\n\n    /**\n     * @attribute\n     * shows the user the inactivity timeout for the interaction\n     *\n     * @override from base card component\n     */\n    inactivityTimeout: computed('interaction.inactivityTimeout', 'inactivityTimeoutFT', function () {\n        if (!this.get('inactivityTimeoutFT')) return null;\n\n        const inactivityTimeout = this.get('interaction.inactivityTimeout');\n        if (!inactivityTimeout) return null;\n\n        return new Date(inactivityTimeout);\n    }) as ComputedProperty<Maybe<string>>,\n\n    /**\n     * Primary roster card state\n     */\n    state: computed(\n        'inWrapup',\n        'lastMessageWasCustomer',\n        'isAttendedTransferring',\n        function (): Maybe<RosterCardState> {\n            if (this.get('isAttendedTransferring')) {\n                return {\n                    loading: true,\n                    class: 'transferring-state'\n                };\n            } else if (this.get('inWrapup')) {\n                return {\n                    icon: 'badge-check',\n                    class: 'wrapup-state',\n                    textKey: 'purecloud.acdInteraction.interactionState.wrapup'\n                };\n            } else if (this.get('lastMessageWasCustomer')) {\n                return {\n                    icon: 'badge-amount',\n                    textKey: 'purecloud.acdInteraction.interactionState.unreadMessage',\n                    class: 'alert-state last-message-was-customer alert-state-abbreviated'\n                };\n            }\n            return null;\n        }\n    ),\n\n    /**\n     * Supplemental roster card state\n     */\n    supplementalState: computed(\n        'inWrapup',\n        'isTyping',\n        'lastMessageText',\n        'lastMessageTime',\n        'inactivityTimeout',\n        'showInactivityTimeout',\n        function (): Maybe<SupplementalRosterCardState> {\n            if (this.get('inWrapup')) return null;\n\n            const inactivityTimeout = this.get('showInactivityTimeout') ? this.get('inactivityTimeout') : undefined;\n            if (this.get('isTyping')) {\n                return {\n                    textKey: INTL_KEY.TYPING,\n                    elapsed: this.get('lastMessageTime'),\n                    inactivityTimeout\n                };\n            } else if (this.get('lastMessageTime')) {\n                return {\n                    text: this.get('lastMessageText') || '',\n                    elapsed: this.get('lastMessageTime'),\n                    inactivityTimeout\n                };\n            } else if (this.get('inactivityTimeout')) {\n                return { inactivityTimeout };\n            }\n            return null;\n        }\n    ),\n\n    /**\n     * Flag indicating if the last message was inbound or outbound\n     */\n    lastMessageWasCustomer: computed.readOnly(\n        'interaction.latestMessageRegardlessOfParticipantWasCustomer'\n    ) as ComputedProperty<boolean>,\n\n    /**\n     * Text of the last message sent or received.  Will be undefined if we it cannot be parsed from\n     * message objects.\n     */\n    lastMessageText: computed.or(\n        'interaction.latestMessageRegardlessOfParticipant.normalizedMessage.text',\n        'interaction.latestMessageRegardlessOfParticipant.normalizedMessage.content.0.template.body.text'\n    ) as ComputedProperty<Maybe<string>>,\n\n    /**\n     * Time object from last message object. Read from mixins/acd.js\n     */\n    lastMessageTime: computed.readOnly(\n        'interaction.latestMessageRegardlessOfParticipant.timestamp'\n    ) as ComputedProperty<Maybe<string>>,\n\n    /**\n     * True/false if interaction customer is flagged as typing\n     */\n    isTyping: computed('isTypingInteractions.[]', 'interaction.id', function (): boolean {\n        const typingInteractions = this.get('isTypingInteractions') || [];\n        const id = this.get('interaction.id');\n        return typingInteractions.indexOf(id) > -1;\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"z/N2BZto\",\"block\":\"[[[11,\\\"button\\\"],[24,0,\\\"acd-interaction-card-v2-container\\\"],[24,4,\\\"button\\\"],[4,[38,0],[[30,0],\\\"onSelectItem\\\"],[[\\\"bubbles\\\"],[false]]],[12],[1,\\\"\\\\n\\\"],[41,[33,2],[[[41,[33,3],[[[1,\\\"            \\\"],[1,[28,[35,4],null,[[\\\"workitemInteraction\\\",\\\"queueName\\\",\\\"actionAnswerWorkitemInteraction\\\",\\\"actionDeclineWorkitemInteraction\\\",\\\"acdExternalContactWorkitemsDivNameFT\\\",\\\"externalContactDivisionName\\\",\\\"showCaseIcon\\\"],[[33,5],[33,6],[33,7],[33,8],[33,9],[33,10],[33,11]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[1,[28,[35,12],null,[[\\\"interaction\\\",\\\"queueName\\\",\\\"engagementSource\\\",\\\"onConsult\\\",\\\"hideInteractionButtons\\\",\\\"actionAnswerInteraction\\\",\\\"actionDeclineInteraction\\\",\\\"actionLoadParticipantName\\\",\\\"acdExternalContactDivNameFT\\\",\\\"externalContactDivisionName\\\",\\\"acdEngagementSourcesFT\\\",\\\"showCaseIcon\\\"],[[33,5],[33,6],[33,13],[33,5,[\\\"onConsult\\\"]],[33,14],[33,15],[33,16],[33,17],[33,18],[33,10],[33,19],[33,11]]]]],[1,\\\"\\\\n\\\"]],[]]]],[]],[[[41,[33,20],[[[1,\\\"        \\\"],[1,[28,[35,21],null,[[\\\"workitemInteraction\\\",\\\"queueName\\\",\\\"actionAnswerWorkitemInteraction\\\",\\\"actionDeclineWorkitemInteraction\\\",\\\"showCaseIcon\\\",\\\"useNewNav\\\"],[[33,5],[33,6],[33,7],[33,8],[33,11],[33,22]]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,23],[[33,5,[\\\"type\\\"]],\\\"email\\\"],null],[[[1,\\\"        \\\"],[1,[28,[35,24],null,[[\\\"interaction\\\",\\\"queueName\\\",\\\"draftUpdate\\\",\\\"isSelected\\\",\\\"showCaseIcon\\\",\\\"useNewNav\\\"],[[33,5],[33,6],[33,25],[33,26],[33,11],[33,22]]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,23],[[33,5,[\\\"type\\\"]],\\\"chat\\\"],null],[[[1,\\\"        \\\"],[1,[28,[35,27],null,[[\\\"interaction\\\",\\\"queueName\\\",\\\"isTypingInteractions\\\",\\\"isSelected\\\",\\\"showCaseIcon\\\",\\\"useNewNav\\\"],[[33,5],[33,6],[33,28],[33,26],[33,11],[33,22]]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,23],[[33,5,[\\\"type\\\"]],\\\"message\\\"],null],[[[1,\\\"        \\\"],[1,[28,[35,29],null,[[\\\"interaction\\\",\\\"queueName\\\",\\\"engagementSource\\\",\\\"mcbParticipantName\\\",\\\"iAmOnMonitorDigital\\\",\\\"isTypingInteractions\\\",\\\"acdEngagementSourcesFT\\\",\\\"inactivityTimeoutFT\\\",\\\"isSelected\\\",\\\"actionViewConversation\\\",\\\"showCaseIcon\\\",\\\"useNewNav\\\"],[[33,5],[33,6],[33,13],[33,30],[33,31],[33,28],[33,19],[33,32],[33,26],[28,[37,0],[[30,0],\\\"onSelectItem\\\"],null],[33,11],[33,22]]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,33],[[28,[37,23],[[33,5,[\\\"type\\\"]],\\\"call\\\"],null],[28,[37,23],[[33,5,[\\\"type\\\"]],\\\"callback\\\"],null]],null],[[[1,\\\"        \\\"],[1,[28,[35,34],null,[[\\\"interaction\\\",\\\"queueName\\\",\\\"mcbParticipantName\\\",\\\"iAmOnBargeIn\\\",\\\"iAmOnMonitor\\\",\\\"iAmOnCoach\\\",\\\"onConsult\\\",\\\"actionLoadParticipantName\\\",\\\"isSelected\\\",\\\"showCaseIcon\\\",\\\"useNewNav\\\"],[[33,5],[33,6],[33,30],[33,35],[33,36],[33,37],[33,5,[\\\"onConsult\\\"]],[33,17],[33,26],[33,11],[33,22]]]]],[1,\\\"\\\\n    \\\"]],[]],null]],[]]]],[]]]],[]]]],[]]]],[]]],[13]],[],false,[\\\"action\\\",\\\"if\\\",\\\"isAlerting\\\",\\\"isAlertingWorkitem\\\",\\\"acd-interactions-panel/interaction-card-v2/alerting-workitem-card\\\",\\\"interaction\\\",\\\"queueName\\\",\\\"actionAnswerWorkitemInteraction\\\",\\\"actionDeclineWorkitemInteraction\\\",\\\"acdExternalContactWorkitemsDivNameFT\\\",\\\"externalContactDivisionName\\\",\\\"showCaseIcon\\\",\\\"acd-interactions-panel/interaction-card-v2/alerting-card\\\",\\\"engagementSource\\\",\\\"hideInteractionButtons\\\",\\\"actionAnswerInteraction\\\",\\\"actionDeclineInteraction\\\",\\\"actionLoadParticipantName\\\",\\\"acdExternalContactDivNameFT\\\",\\\"acdEngagementSourcesFT\\\",\\\"isWorkitem\\\",\\\"acd-interactions-panel/interaction-card-v2/workitem-card\\\",\\\"useNewNav\\\",\\\"eq\\\",\\\"acd-interactions-panel/interaction-card-v2/email-card\\\",\\\"draftUpdate\\\",\\\"isSelected\\\",\\\"acd-interactions-panel/interaction-card-v2/chat-card\\\",\\\"isTypingInteractions\\\",\\\"acd-interactions-panel/interaction-card-v2/message-card\\\",\\\"mcbParticipantName\\\",\\\"iAmOnMonitorDigital\\\",\\\"inactivityTimeoutFT\\\",\\\"or\\\",\\\"acd-interactions-panel/interaction-card-v2/voice-card\\\",\\\"iAmOnBargeIn\\\",\\\"iAmOnMonitor\\\",\\\"iAmOnCoach\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel/interaction-card-v2/template.hbs\",\"isStrictMode\":false});","import BaseCard from '../base-card/component';\nimport ComputedProperty from '@ember/object/computed';\nimport { computed, get } from '@ember/object';\nimport moment from 'web-directory/utils/dates';\nimport type { RosterCardState, SupplementalRosterCardState } from '../base-card/component';\nimport type { Maybe } from 'web-directory/types';\nimport { warnClosureAction } from 'web-directory/utils/acd';\nimport { debounce } from '@ember/runloop';\nimport safeSet from 'web-directory/utils/safeSet';\n\nexport default BaseCard.extend({\n    classNames: ['acd-interaction-card-v2-voice'],\n\n    /**\n     * @Attribute\n     * Conversation represented by card\n     */\n    interaction: null as any,\n\n    /**\n     * Moment object representing the start of a confinement\n     */\n    _currentHoldMoment: null as any,\n\n    /**\n     * Name of other consult party, if consult is active\n     */\n    otherConsultPartyName: null as Maybe<string>,\n\n    /**\n     * Primary roster card state\n     */\n    state: computed('inWrapup', 'isHeld', 'type', 'isAttendedTransferring', function (): Maybe<RosterCardState> {\n        if (this.get('isAttendedTransferring')) {\n            return {\n                loading: true,\n                class: 'transferring-state'\n            };\n        } else if (this.get('inWrapup')) {\n            return {\n                icon: 'badge-check',\n                class: 'wrapup-state',\n                textKey: 'purecloud.acdInteraction.interactionState.wrapup'\n            };\n        } else if (this.get('isHeld') && this.get('type') !== 'callback') {\n            return {\n                icon: 'badge-pause',\n                class: 'alert-state',\n                textKey: 'purecloud.acdInteraction.interactionState.held'\n            };\n        }\n        return null;\n    }),\n\n    /**\n     * Supplemental roster card state\n     */\n    supplementalState: computed(\n        'isDialing',\n        'lastDialed',\n        '_heldStartTime',\n        'type',\n        'inWrapup',\n        function (): Maybe<SupplementalRosterCardState> {\n            const heldStartTime = this.get('_heldStartTime');\n\n            if (this.get('inWrapup')) {\n                // these are now represented by icons,\n                // diverging from the other card layouts\n                return;\n            } else if (this.get('isDialing')) {\n                return {\n                    textKey: 'purecloud.acdInteraction.roster.cards.voice.dialing',\n                    class: ''\n                };\n            } else if (heldStartTime && this.get('type') !== 'callback') {\n                return {\n                    text: '',\n                    class: 'alert-state',\n                    startTime: heldStartTime\n                };\n            } else if (this.get('lastDialed')) {\n                return {\n                    textKey: 'purecloud.acdInteraction.roster.cards.voice.dialed',\n                    lastDialed: this.get('lastDialed'),\n                    class: ''\n                };\n            }\n\n            return null;\n        }\n    ),\n\n    /**\n     * Moment object representing the start of the hold event (hold/confinement)\n     */\n    _heldStartTime: computed('interaction.{isHeld,isConsultParticipantHolding}', function (): any {\n        const isConsultParticipantHolding = this.get('interaction.isConsultParticipantHolding');\n        const isHeld = this.get('interaction.isHeld');\n\n        if (isConsultParticipantHolding) {\n            // There is no timestamp for start time\n            // of a confinement in the payload so we'll cache it.\n            const _currentHoldMoment = this.get('_currentHoldMoment');\n\n            if (_currentHoldMoment) {\n                return _currentHoldMoment;\n            }\n\n            const now = moment();\n            this.set('_currentHoldMoment', now);\n\n            return now;\n        } else if (isHeld) {\n            const holdTime = this.get('interaction.participantForCurrentUser.calls.firstObject.startHoldTime');\n            return moment(holdTime);\n        }\n\n        this.set('_currentHoldMoment', null);\n        return null;\n    }),\n\n    /**\n     * Translation key for consult indicator title text\n     */\n    consultTitleKey: computed('interaction.iAmConsultInitiator', function (): string {\n        if (this.get('interaction.iAmConsultInitiator')) {\n            return 'purecloud.acdInteraction.roster.consultor';\n        }\n        return 'purecloud.acdInteraction.roster.consultee';\n    }),\n\n    /**\n     * True/false if conversation has call media that is dialing\n     */\n    isDialing: computed(\n        'interaction.participantForCurrentUser',\n        'interaction.participantForCurrentUser.calls[]',\n        function (): boolean {\n            const calls = this.get('interaction.participantForCurrentUser.calls') || [];\n            const connectedStates = ['connecting', 'dialing', 'contacting', 'offering'];\n            return !!calls.find((call: any) => {\n                const state = get(call, 'state');\n                return connectedStates.includes(state && state.toLowerCase());\n            });\n        }\n    ),\n\n    /**\n     * Reference to last number that was dialed for callbacks\n     */\n    lastDialed: computed.readOnly('interaction.dialedNumbers.lastObject') as ComputedProperty<any>,\n\n    /**\n     * True/false if conversation is confined or held\n     */\n    isHeld: computed('interaction.{isHeld,onConsult,isConsultParticipantHolding}', function (): boolean {\n        if (this.get('interaction.onConsult')) {\n            return this.get('interaction.isConsultParticipantHolding');\n        }\n        return this.get('interaction.isHeld');\n    }),\n\n    /**\n     * True/false if current user is muted\n     */\n    isMuted: computed(\n        'interaction.participantForCurrentUser',\n        'interaction.participantForCurrentUser.calls.firstObject.muted',\n        function (): boolean {\n            return this.get('interaction.participantForCurrentUser.calls.firstObject.muted');\n        }\n    ),\n\n    /**\n     * @DidReceiveAttrs\n     * Load the name of other party on a consult\n     */\n    async loadOtherConsultPartyName(): Promise<void> {\n        const interaction = this.get('interaction');\n        const iAmInitiator = get(interaction, 'iAmConsultInitiator');\n        const onConsult = get(interaction, 'onConsult');\n        const participantId = iAmInitiator\n            ? get(interaction, 'consultAgentParticipant.id')\n            : get(interaction, 'consultInitiator.id');\n\n        if (onConsult && participantId) {\n            const name = await this.actionLoadParticipantName(interaction, participantId);\n            if (this.isDestroyed || this.isDestroying) return;\n            safeSet(this, 'otherConsultPartyName', name);\n        } else {\n            safeSet(this, 'otherConsultPartyName', null);\n        }\n    },\n\n    /**\n     * @Action\n     * Closure action passed to the component to be invoked at the parent level\n     */\n    actionLoadParticipantName: (interaction: any, participantId: string): string => {\n        warnClosureAction('actionLoadParticipantName', { interaction, participantId });\n        return '';\n    },\n\n    didReceiveAttrs() {\n        this._super();\n        debounce(this, this.loadOtherConsultPartyName, 500);\n    }\n});\n","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { inject } from '@ember/service';\nimport moment from 'moment';\n\nimport { Maybe } from 'web-directory/types';\nimport { WorkitemInteraction } from '@genesys/genesys-cloud-conversation-utils';\n\nexport default Component.extend({\n    classNameBindings: ['statusCategory'],\n\n    acdworkitem: inject('acdworkitem'),\n    session: inject('session'),\n\n    /**\n     * @Attribute\n     * WorkitemInteraction represented by card\n     */\n    workitemInteraction: null as Maybe<WorkitemInteraction>,\n\n    /**\n     * @Attribute\n     * Whether to show the case (briefcase) icon.\n     */\n    showCaseIcon: false as boolean,\n\n    statusCategory: computed('workitemInteraction.workitem.statusCategory', function () {\n        return this.get('workitemInteraction.workitem.statusCategory').toLowerCase();\n    }),\n\n    dateDue: computed('workitemInteraction.workitem.dateDue', function () {\n        if (this.get('workitemInteraction.workitem.dateDue')) {\n            return moment(this.get('workitemInteraction.workitem.dateDue')).format('lll');\n        }\n        return '';\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"csdZ6uy/\",\"block\":\"[[[10,0],[14,0,\\\"roster-card roster-card-workitem\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"int-type\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,0],null,[[\\\"type\\\",\\\"state\\\",\\\"size\\\",\\\"isDisconnected\\\"],[\\\"workitem\\\",[33,1],\\\"medium\\\",[28,[37,2],[[33,3,[\\\"workitem\\\",\\\"assignmentState\\\"]],\\\"Disconnected\\\"],null]]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"int-details\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"int-queue-case-row\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,5],[[[1,\\\"                \\\"],[10,1],[14,0,\\\"int-queue\\\"],[15,\\\"aria-label\\\",[29,[[28,[37,6],[\\\"purecloud.acdInteraction.roster.queueLabel\\\"],[[\\\"queue\\\"],[[33,5]]]]]]],[15,\\\"title\\\",[29,[[28,[37,6],[\\\"purecloud.acdInteraction.roster.queueLabel\\\"],[[\\\"queue\\\"],[[33,5]]]]]]],[12],[1,\\\"\\\\n                    \\\"],[1,[34,5]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,7],[[[6,[39,8],null,[[\\\"color\\\",\\\"icon\\\"],[\\\"gse-custom-accent-2\\\",\\\"true\\\"]],[[\\\"default\\\"],[[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"data-testid\\\",\\\"case-management-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/briefcase-regular\\\"],[15,\\\"screenreader-text\\\",[29,[[28,[37,6],[\\\"purecloud.acdInteraction.roster.caseLabel\\\"],null]]]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]]]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,3,[\\\"data\\\",\\\"status\\\",\\\"name\\\"]],[[[1,\\\"            \\\"],[10,0],[15,0,[29,[\\\"workitem-status \\\",[36,9]]]],[12],[1,\\\"\\\\n                \\\"],[1,[33,3,[\\\"data\\\",\\\"status\\\",\\\"name\\\"]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n        \\\"],[10,1],[14,0,\\\"int-supplemental\\\"],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"int-sup-main\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"workitem-due-date\\\"],[12],[1,[28,[35,6],[\\\"purecloud.acdInteraction.workitem.due\\\"],null]],[1,\\\":\\\"],[13],[1,\\\"\\\\n                \\\"],[10,0],[12],[1,[34,10]],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"acd-interactions-panel-v2/interaction-type-icon\\\",\\\"state\\\",\\\"eq\\\",\\\"workitemInteraction\\\",\\\"if\\\",\\\"queueName\\\",\\\"t\\\",\\\"showCaseIcon\\\",\\\"tags-input/label\\\",\\\"statusCategory\\\",\\\"dateDue\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel/interaction-card-v2/workitem-card/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['interaction-conference-hangup-dropdown'],\n\n    /**\n     * @Action\n     * Closure action passed to the component to be invoked at the parent level\n     */\n    endForAll() {\n        console.warn('End For All closure action has not been set up for this component');\n    },\n\n    /**\n     * @Action\n     * Closure action passed to the component to be invoked at the parent level\n     */\n    leave() {\n        console.warn('Leave closure action has not been set up for this component');\n    },\n\n    actions: {\n        /**\n         * Invoked when the user wants to end the call for everyone connected\n         */\n        onEndForAll() {\n            this.endForAll();\n        },\n        /**\n         * Invoked when the user just wants to leave the call but keep the call\n         * connected for other participants\n         */\n        onLeave() {\n            this.leave();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"LWVxle3W\",\"block\":\"[[[10,\\\"button\\\"],[15,\\\"onclick\\\",[28,[37,0],[[30,0],\\\"onEndForAll\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n    \\\"],[1,[28,[35,1],[\\\"purecloud.acdInteraction.hangupDropdown.endForAll\\\"],null]],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"button\\\"],[15,\\\"onclick\\\",[28,[37,0],[[30,0],\\\"onLeave\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n    \\\"],[1,[28,[35,1],[\\\"purecloud.acdInteraction.hangupDropdown.leave\\\"],null]],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"action\\\",\\\"t\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel/interaction-conference-hangup-dropdown/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed, get } from '@ember/object';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['interaction-conference-roster-dropdown'] as const,\n    classNameBindings: ['removeWrapperStyling:no-wrapper', 'removePadding'] as const,\n\n    /**\n     * @attribute\n     *\n     * removes the styling applied to the component that makes it appear as it's own dropdown\n     * component such as the border, shadow, and arrows.\n     */\n    removeWrapperStyling: false,\n\n    /**\n     * @attribute\n     * `true` if this component needs to remove it's padding throughout the context. This  may\n     * need to be `true` if the container that is rendering it does not have built in padding.\n     *\n     * @note\n     * This component was initially built without gux context, when implementing it with a\n     * `gux-popover` component, we needed to remove the initial padding the component was once\n     * responsible for. However, there are renditions of the component that still require it to\n     * manage it's own padding.\n     */\n    removePadding: false,\n\n    /**\n     * All of the current participants apart of the conference\n     */\n    participants: [],\n    /**\n     * The currently authenticated user.\n     */\n    authUser: null,\n    /**\n     * A map containing the connected states of all the participants in the dropdown.\n     */\n    connectedStates: new Map<string, string>(),\n\n    /**\n     *  @attribute\n     * Feature toggle for warm conferencing feature\n     */\n    acdWarmConferencePhase1FT: false,\n\n    /**\n     * `true` if another participant cannot be invited to the conference.\n     */\n    disableInviteParticipant: computed('participants', 'acdWarmConferencePhase1FT', function () {\n        const participants = this.get('participants') || [];\n        if (this.get('acdWarmConferencePhase1FT')) {\n            return participants.some((p: any) => {\n                const call = get(p, 'calls.firstObject');\n                return !call.connectedTime && !call.endTime && call.state !== 'connected';\n            });\n        } else {\n            return participants.some((p: any) => {\n                const call = get(p, 'calls.firstObject');\n                return !call.connectedTime && !call.endTime;\n            });\n        }\n    }),\n\n    /**\n     * `true` if a participant cannot be warm invited to the conference.\n     */\n    disableWarmInviteParticipant: computed(\n        'acdWarmConferencePhase1FT',\n        'disableInviteParticipant',\n        'participants',\n        function () {\n            return this.get('acdWarmConferencePhase1FT') ? this.get('disableInviteParticipant') : true;\n        }\n    ),\n\n    /**\n     * Invoked when the attributes of this component have changed for any reason\n     */\n    didReceiveAttrs() {\n        const connectedStates: Map<string, string> = this.get('connectedStates');\n\n        const participants: any[] = this.get('participants');\n        participants.forEach(p => {\n            if (connectedStates.has(p.id)) {\n                const connectedTime = connectedStates.get(p.id);\n                if (connectedTime == null && p.connectedTime) {\n                    this.onConnected(p.id);\n                }\n            }\n            connectedStates.set(p.id, p.connectedTime);\n        });\n\n        this.set('connectedStates', connectedStates);\n    },\n\n    /**\n     * @Action\n     * Closure action invoked when a participant has connected into the conference.\n     * Should be passed down by the parent.\n     * @param value The participant id that was connected\n     */\n    onConnected: (value: string) => {\n        console.warn('onConnected closure action has not been set up for this component. Value emitted: ', value);\n    },\n\n    /**\n     * @Action\n     * Closure action passed to the component to be invoked at the parent level\n     */\n    warmInvite: () => {\n        console.warn('warmInvite closure action has not been set up for this component');\n    },\n\n    /**\n     * @Action\n     * Closure action passed to the component to be invoked at the parent level\n     */\n    invite: () => {\n        console.warn('Invite closure action has not been set up for this component');\n    },\n\n    /**\n     * @Action\n     * Closure action passed to the component to be invoked at the parent level\n     */\n    mute: (participant: any, value: boolean) => {\n        console.warn('Mute closure action has not been set up for this component', participant, value);\n    },\n\n    /**\n     * @Action\n     * Closure action passed to the component to be invoked at the parent level\n     */\n    muteAll: () => {\n        console.warn('Mute all closure action has not been set up for this component');\n    },\n\n    /**\n     * @Action\n     * Closure action passed to the component to be invoked at the parent level\n     */\n    dismiss: (participant: any) => {\n        console.warn('Dismiss closure action has not been set up for this component', participant);\n    },\n\n    actions: {\n        /**\n         * Invoked when the consult participant button is selected\n         */\n        onWarmInviteSelected() {\n            this.warmInvite();\n        },\n        /**\n         * Invoked when the invite participant button is selected\n         */\n        onInviteSelected() {\n            this.invite();\n        },\n        /**\n         * Mutes the provided participant in the conference.\n         * @param participant The participant to mute in the conference\n         */\n        onMute(participant: any, value: boolean) {\n            this.mute(participant, value);\n        },\n        /**\n         * Dismiss the provided participant from the conference, dropping them from the call\n         * @param participant The participant to dismiss\n         */\n        onDismiss(participant: any) {\n            this.dismiss(participant);\n        },\n        /**\n         * Invoked when the user mutes everyone in the conference\n         */\n        onMuteAll() {\n            this.muteAll();\n        }\n    }\n});\n","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { inject } from '@ember/service';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['conference-roster-participant'],\n    classNameBindings: ['connecting', 'muted', 'type'],\n\n    store: inject('store'),\n    addressformat: inject('addressformat'),\n\n    /**\n     * @attribute\n     * Feature toggle for the warm conferencing feature\n     */\n    acdWarmConferencePhase1FT: false,\n\n    /**\n     * The participant object to render the data for\n     */\n    participant: null,\n\n    /**\n     * The name of the participant to include for the screenreader .\n     */\n    ariaNameLabel: computed.or('name', 'formattedNumber'),\n\n    /**\n     * returns the participants purpose being reflected as their \"type\" of participant.\n     */\n    type: computed('participant.purpose', function () {\n        const type = this.get('participant.purpose');\n        return type ? type.toLowerCase() : '';\n    }),\n\n    /**\n     * The name of the participant\n     */\n    name: computed.or('person.name', 'participant.name'),\n\n    /**\n     * The formatted name of the pacticipant number\n     */\n    formattedNumber: computed('name', 'participant.address', function () {\n        const isValidNumber = this.get('addressformat').isValidNumber(this.get('participant.address'), null, true);\n        if (isValidNumber) {\n            return this.get('addressformat').formatAddressForDisplay(this.get('participant.address'));\n        }\n        return '';\n    }),\n\n    /**\n     * The initials of the external contact to display in the thumbnail\n     */\n    initials: computed.readOnly('participant.externalContact.initials'),\n\n    /**\n     * The name of the icon to display in the thumbnail\n     */\n    iconName: computed('participant.purpose', function () {\n        const type = (this.get('participant.purpose') || '').toLowerCase();\n        switch (type) {\n            case 'external':\n                return '';\n            case 'acd':\n            case 'ivr':\n                return 'timeline';\n            default:\n                return 'user';\n        }\n    }),\n\n    /**\n     * The person model for participant userId\n     */\n    person: computed('participant.userId', function () {\n        const userId = this.get('participant.userId');\n        if (userId) {\n            //TODO: may wish to retrieve user info outside ember data\n            return this.get('store').find('person', userId);\n        }\n        return null;\n    }),\n\n    /**\n     * `true` if the participant has connected to the conversation\n     */\n    connecting: computed('acdWarmConferencePhase1FT', 'participant.calls.firstObject.state', function () {\n        return this.get('acdWarmConferencePhase1FT')\n            ? this.get('participant.calls.firstObject.state') !== 'connected'\n            : !this.get('participant.calls.firstObject.connectedTime');\n    }),\n\n    /**\n     * `true` if the participant is currently muted in the conversation\n     */\n    muted: computed.bool('participant.calls.firstObject.muted'),\n\n    /**\n     * `true` if the muting functionality of this participant should currently be disabled\n     */\n    mutingDisabled: computed('muted', 'participant.isExternal', 'isAuthUser', function () {\n        // You can always mute and unmute yourself\n        if (this.get('isAuthUser')) {\n            return false;\n        }\n\n        // You can only affect the mute state of an internal user of the system\n        const type = this.get('type');\n        if (type !== 'user' && type !== 'agent') {\n            return true;\n        }\n\n        // You cannot unmute someone (other than yourself)\n        if (this.get('muted')) {\n            return true;\n        }\n\n        return false;\n    }),\n\n    /**\n     * `true` if this participant row is the currently authenticated user.\n     * Different interactions become available if this is the auth user.\n     */\n    isAuthUser: false,\n\n    /**\n     * @Action\n     * Closure action passed to the component to be invoked at the parent level\n     */\n    mute: (value: boolean) => {\n        console.warn('Mute closure action has not been set up for this component. Emitted value: ', value);\n    },\n\n    /**\n     * @Action\n     * Closure action passed to the component to be invoked at the parent level\n     */\n    dismiss: () => {\n        console.warn('Dismiss closure action has not been set up for this component');\n    },\n\n    actions: {\n        /**\n         * Invoked when the user mutes the participant in the conference\n         */\n        onToggleMute() {\n            this.mute(!this.get('muted'));\n        },\n        /**\n         * Invoked when the user dismisses the participant from the conference\n         */\n        onDismiss() {\n            this.dismiss();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"ko6QHR7C\",\"block\":\"[[[10,0],[14,0,\\\"wrapper\\\"],[12],[1,\\\"\\\\n    \\\"],[1,[28,[35,0],null,[[\\\"participant\\\",\\\"text\\\",\\\"iconName\\\"],[[33,1],[33,2],[33,3]]]]],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"info\\\"],[12],[1,\\\"\\\\n        \\\"],[10,2],[14,0,\\\"name\\\"],[12],[1,[34,4]],[13],[1,\\\"\\\\n\\\"],[41,[33,6],[[[1,\\\"            \\\"],[10,2],[14,0,\\\"number\\\"],[12],[1,[34,6]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"actions\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,7],[[[1,\\\"            \\\"],[10,\\\"i\\\"],[14,0,\\\"pc-moon pc-loading pc-spin\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[10,\\\"button\\\"],[14,0,\\\"cancel-invite\\\"],[15,\\\"onclick\\\",[28,[37,8],[[30,0],\\\"onDismiss\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,9],[\\\"common.cancel\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[10,\\\"button\\\"],[15,\\\"disabled\\\",[36,10]],[15,0,[29,[\\\"control mute-button \\\",[52,[33,11],\\\"muted\\\",\\\"unmuted\\\"]]]],[15,\\\"onclick\\\",[28,[37,8],[[30,0],\\\"onToggleMute\\\"],null]],[15,\\\"aria-label\\\",[52,[33,11],[28,[37,9],[\\\"purecloud.acdInteraction.conferenceDropdown.unmuteParticipant\\\"],[[\\\"name\\\"],[[33,12]]]],[28,[37,9],[\\\"purecloud.acdInteraction.conferenceDropdown.muteParticipant\\\"],[[\\\"name\\\"],[[33,12]]]]]],[15,\\\"aria-pressed\\\",[52,[33,11],\\\"true\\\",\\\"false\\\"]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,11],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"muted\\\"],[14,\\\"icon-name\\\",\\\"microphone-disable\\\"],[15,\\\"screenreader-text\\\",[28,[37,9],[\\\"purecloud.acdInteraction.conferenceDropdown.unmuteParticipant\\\"],[[\\\"name\\\"],[[33,12]]]]],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"not-muted\\\"],[14,\\\"icon-name\\\",\\\"microphone\\\"],[15,\\\"screenreader-text\\\",[28,[37,9],[\\\"purecloud.acdInteraction.conferenceDropdown.muteParticipant\\\"],[[\\\"name\\\"],[[33,12]]]]],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"button\\\"],[14,0,\\\"control dismiss\\\"],[15,\\\"onclick\\\",[28,[37,8],[[30,0],\\\"onDismiss\\\"],null]],[15,\\\"aria-label\\\",[28,[37,9],[\\\"purecloud.acdInteraction.conferenceDropdown.disconnectParticipant\\\"],[[\\\"name\\\"],[[33,12]]]]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/phone-hangup\\\"],[15,\\\"screenreader-text\\\",[28,[37,9],[\\\"purecloud.acdInteraction.conferenceDropdown.disconnectParticipant\\\"],[[\\\"name\\\"],[[33,12]]]]],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"target-dropdown/thumbnail\\\",\\\"participant\\\",\\\"initials\\\",\\\"iconName\\\",\\\"name\\\",\\\"if\\\",\\\"formattedNumber\\\",\\\"connecting\\\",\\\"action\\\",\\\"t\\\",\\\"mutingDisabled\\\",\\\"muted\\\",\\\"ariaNameLabel\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel/interaction-conference-roster-dropdown/participant-row/template.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"CDiKxFt6\",\"block\":\"[[[10,0],[14,0,\\\"dropdown-header\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"header-container\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"h2\\\"],[14,1,\\\"interaction-conference-roster-dropdown-header\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,0],[\\\"purecloud.acdInteraction.conferenceCount\\\"],[[\\\"count\\\"],[[33,1,[\\\"length\\\"]]]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"content\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,3],[[28,[37,3],[[33,1]],null]],null],null,[[[1,\\\"        \\\"],[1,[28,[35,4],null,[[\\\"participant\\\",\\\"acdWarmConferencePhase1FT\\\",\\\"isAuthUser\\\",\\\"mute\\\",\\\"dismiss\\\"],[[30,1],[33,5],[28,[37,6],[[30,1,[\\\"userId\\\"]],[33,7,[\\\"id\\\"]]],null],[28,[37,8],[[30,0],\\\"onMute\\\",[30,1]],null],[28,[37,8],[[30,0],\\\"onDismiss\\\",[30,1]],null]]]]],[1,\\\"\\\\n\\\"]],[1]],null],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"footer\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"footer-container\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"button\\\"],[14,\\\"popover-action\\\",\\\"prevent\\\"],[14,0,\\\"invite conference-button\\\"],[15,\\\"disabled\\\",[36,9]],[15,\\\"onclick\\\",[28,[37,8],[[30,0],\\\"onInviteSelected\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"add\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[1,[28,[35,0],[\\\"purecloud.acdInteraction.conferenceDropdown.inviteParticipant\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,5],[[[1,\\\"            \\\"],[10,\\\"button\\\"],[14,\\\"popover-action\\\",\\\"prevent\\\"],[14,0,\\\"warm-invite conference-button\\\"],[15,\\\"disabled\\\",[36,11]],[15,\\\"onclick\\\",[28,[37,8],[[30,0],\\\"onWarmInviteSelected\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,0],[\\\"purecloud.acdInteraction.conferenceDropdown.consultParticipant\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[\\\"participant\\\"],false,[\\\"t\\\",\\\"participants\\\",\\\"each\\\",\\\"-track-array\\\",\\\"acd-interactions-panel/interaction-conference-roster-dropdown/participant-row\\\",\\\"acdWarmConferencePhase1FT\\\",\\\"eq\\\",\\\"authUser\\\",\\\"action\\\",\\\"disableInviteParticipant\\\",\\\"if\\\",\\\"disableWarmInviteParticipant\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel/interaction-conference-roster-dropdown/template.hbs\",\"isStrictMode\":false});","import { A } from '@ember/array';\nimport Component from '@ember/component';\nimport { computed, get } from '@ember/object';\nimport { cancel, throttle } from '@ember/runloop';\nimport { inject } from '@ember/service';\nimport { isValidEmailAddress } from 'web-directory/utils/email';\nimport { Maybe } from 'web-directory/types';\nimport { warnClosureAction } from 'web-directory/utils/acd-ts';\n\ntype EmailRecipient = {\n    email?: string;\n    id?: string;\n    externalContactId?: string;\n    bestEmailAddress?: string;\n    value?: string;\n};\n\ntype EmailQueue = {\n    value: string;\n    id: string;\n};\n\nexport default Component.extend({\n    classNames: ['create-email-dialog', 'dialpad'],\n\n    acdemail: inject('acdemail'),\n    intl: inject('intl'),\n    logger: inject('stashLogger'),\n    notification: inject('notification'),\n    session: inject('session'),\n    queueService: inject('queue'),\n\n    /**\n     * search input value\n     * can be mutated by child\n     */\n    searchValue: '',\n\n    /**\n     * `true` if there is already a request pending, or aka a new conversation is already being created from\n     * the provided information. A user shouldn't be able to spam the creation button.\n     */\n    pendingRequest: false,\n\n    /**\n     * `true` if the title of the dialpad should be visible\n     */\n    showTitle: false,\n\n    /**\n     * Used to store the throttled createMessage request\n     */\n    _timer: null as Maybe<any>,\n\n    /**\n     * Array of available filters to showcase in the queue target selector component.\n     * We only want to showcase queue options.\n     */\n    queueFilter: ['queue'],\n\n    /**\n     * Array of available filters to showcase in the contact target selector component.\n     * We only want to showcase external contact options.\n     */\n    contactFilter: ['external'],\n\n    /**\n     * The current authenticated user from the session service\n     */\n    authUser: computed.readOnly('session.publicApiUser'),\n\n    /**\n     * Array of recipients to be used for the creation of the conversation\n     */\n    recipients: A([] as EmailRecipient[]),\n\n    /**\n     * Array of all recipients mapped for the multi select component to easily consume it for\n     * quick display\n     */\n    recipientTags: computed.map('recipients', function (recipient) {\n        return {\n            value: recipient.email,\n            text: recipient.email,\n            data: recipient.externalContactId ? { id: recipient.externalContactId } : undefined\n        };\n    }),\n\n    /**\n     * The currently selected queue to create the conversation with\n     */\n    queue: null as EmailQueue | null,\n\n    /**\n     * `true` if the conversation cannot be created due to incomplete or incorrect information.\n     */\n    createEmailDisabled: computed('queue.id', 'recipients.length', 'pendingRequest', function () {\n        return this.get('pendingRequest') || !this.get('queue.id') || this.get('recipients.length') === 0;\n    }),\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.initQueue();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this._cancelTimer();\n        this.get('recipients').clear();\n    },\n\n    /**\n     * Initializes and sets the default queue into the corresponding input\n     */\n    initQueue() {\n        // this check was performed inside of the call-onbehalf component, so with the new work we need to set it here instead.\n        if (!this.get('queue')) {\n            this.get('queueService')\n                .getDefaultQueue('email')\n                .then((queue: any) => {\n                    this.set('queue', queue);\n                })\n                .catch((error: Error) => {\n                    this.get('logger').error('There was an issue getting the default queue', error);\n                });\n        }\n    },\n\n    /**\n     * Cancels and removes the timer set by the createMessage being throttled.\n     * The timer prevents the createMessage from being spam fired.\n     */\n    _cancelTimer() {\n        cancel(this.get('_timer'));\n    },\n\n    /**\n     * Generates a recipient string value for email creation\n     *\n     * @returns the newly generated recipient string for email creation\n     */\n    _buildRecipientsStr() {\n        const recipients = this.get('recipients');\n        return recipients.length ? recipients.map((recipient: any) => recipient.email).join(', ') : '';\n    },\n\n    /**\n     * Creates the email conversation based on the information that has been provided by the user\n     */\n    async _createEmail() {\n        const searchValue = this.get('searchValue')?.trim();\n\n        if (!!searchValue) {\n            if (isValidEmailAddress(searchValue)) {\n                this.handleRecipientSelected({ email: searchValue });\n            } else {\n                this.get('notification').error(\n                    this.get('intl').t('purecloud.acdEmail.queueEmailErrorTitle'),\n                    this.get('intl').t('purecloud.acdEmail.createEmailRecipientError')\n                );\n                return;\n            }\n        }\n\n        const queue = this.get('queue');\n        const party = this.get('recipients').get('firstObject');\n        const recipientsStr = this._buildRecipientsStr();\n        const validRecipients = isValidEmailAddress(recipientsStr);\n\n        this.set('pendingRequest', true);\n\n        if (queue && queue.id && validRecipients) {\n            const externalContactId = party ? party.externalContactId : undefined;\n            try {\n                await this.get('acdemail').createEmail(queue.id, recipientsStr, externalContactId);\n                // Check if component is destroyed before calling actionClose\n                if (this.isDestroyed || this.isDestroying) return;\n\n                this.actionClose();\n                this.get('queueService')\n                    .setDefaultQueue(queue, 'email')\n                    .catch((error: Error) => {\n                        this.get('logger').error('There was an issue setting the default queue', error);\n                    });\n            } catch (error: any) {\n                // Check if component is destroyed before showing notification\n                if (this.isDestroyed || this.isDestroying) return;\n\n                const queueName = queue.value || '';\n                const message =\n                    error.payload?.code === 'email.outbound.queue.address.required'\n                        ? this.get('intl').t('purecloud.acdEmail.unknownCreateEmailError', { queueName })\n                        : this.get('intl').t('purecloud.acdEmail.queueEmailRequired', { queueName });\n\n                this.get('notification').error(this.get('intl').t('purecloud.acdEmail.queueEmailErrorTitle'), message);\n            }\n\n            // Check if component is destroyed before setting properties\n            if (this.isDestroyed || this.isDestroying) return;\n\n            this.set('pendingRequest', false);\n            this.get('recipients').clear();\n            this.set('queue', null);\n        } else if (!validRecipients) {\n            // Check if component is destroyed before showing notification\n            if (this.isDestroyed || this.isDestroying) return;\n\n            this.get('notification').error(\n                this.get('intl').t('purecloud.acdEmail.queueEmailErrorTitle'),\n                this.get('intl').t('purecloud.acdEmail.createEmailRecipientError')\n            );\n            this.set('pendingRequest', false);\n        }\n    },\n\n    /**\n     * @param recipient the selected email\n     *\n     * invoked when the recipient is selected or new valid input is entered\n     */\n    handleRecipientSelected(recipient: EmailRecipient) {\n        // An ember array is needed here for change detection to work properly\n        const recipients = A(this.get('recipients') || []);\n\n        const email = get(recipient, 'email') || get(recipient, 'bestEmailAddress');\n        const externalContactId = get(recipient, 'id');\n\n        const exists = recipients.some((r: any) => r.email === email);\n        if (!exists) {\n            recipients.pushObject({\n                email,\n                externalContactId\n            });\n        }\n    },\n\n    /**\n     * @action\n     *\n     * Invoked when the message interaction requests to close itself\n     */\n    actionClose: () => warnClosureAction('actionClose'),\n\n    actions: {\n        /**\n         * Invoked when a queue has been selected by the user\n         *\n         * @param queue the selected queue\n         */\n        onQueueSelected(queue: EmailQueue) {\n            this.set('queue', queue);\n        },\n\n        /**\n         * Invoked when a recipient has been selected\n         *\n         * @param recipient the selected recipient\n         */\n        onRecipientSelected(recipient: EmailRecipient) {\n            this.handleRecipientSelected(recipient);\n        },\n\n        /**\n         * Invoked when a recipient has been removed by the user\n         *\n         * @param recipient the recipient to remove\n         */\n        onRecipientRemoved(recipient: EmailRecipient) {\n            // An ember array is needed here for change detection to work properly\n            const recipients = A(this.get('recipients') || []);\n            const index = recipients.findIndex((r: any) => r.email === recipient.value);\n\n            if (index >= 0) {\n                this.get('recipients').removeAt(index, 1);\n            }\n        },\n\n        /**\n         * Invoked when a recipient has been removed by the user based on the index of the tag\n         *\n         * @param index the index of the recipient to remove\n         */\n        onRecipientRemovedByIndex(index: number) {\n            this.get('recipients').removeAt(index, 1);\n        },\n\n        /**\n         * Invoked when the user opts to start creation of an email conversation\n         */\n        onCreateEmail() {\n            if (!this.get('createEmailDisabled')) {\n                this._cancelTimer();\n                this.set('_timer', throttle(this, this._createEmail, 500));\n            }\n            return false; // to prevent default behaviour\n        },\n\n        /**\n         * Invoked when the user has submitted the form and is ready to create the interaction.\n         * Intended to be used for when the user pressed the enter key while in an empty search bar\n         */\n        onSubmit() {\n            if (!this.get('createEmailDisabled')) {\n                this._cancelTimer();\n                this.set('_timer', throttle(this, this._createEmail, 500));\n            }\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"PDLwll8j\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[10,\\\"h4\\\"],[14,0,\\\"dialpad-title\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,2],[\\\"purecloud.sendEmail\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[10,0],[14,0,\\\"dialpad-requirements-text\\\"],[12],[1,[28,[35,2],[\\\"purecloud.acdInteraction.calls.fieldRequirements\\\"],null]],[13],[1,\\\"\\\\n\\\\n\\\"],[1,[28,[35,3],null,[[\\\"autofocus\\\",\\\"interactionType\\\",\\\"authUser\\\",\\\"disableInputEnter\\\",\\\"includeFilters\\\",\\\"placeholder\\\",\\\"clearTranslation\\\",\\\"targetSelected\\\",\\\"value\\\",\\\"myQueuesOnly\\\",\\\"supplementalClasses\\\"],[true,\\\"email\\\",[33,4],true,[33,5],[28,[37,2],[\\\"purecloud.onBehalfOfQueue\\\"],null],[28,[37,2],[\\\"purecloud.clearBehalfOfQueue\\\"],null],[28,[37,6],[[30,0],\\\"onQueueSelected\\\"],null],[33,7],true,\\\"email-queue-selection\\\"]]]],[1,\\\"\\\\n\\\"],[1,[28,[35,8],null,[[\\\"interactionType\\\",\\\"authUser\\\",\\\"includeFilters\\\",\\\"value\\\",\\\"targetSelected\\\",\\\"targetRemoved\\\",\\\"placeholder\\\",\\\"label\\\",\\\"submit\\\",\\\"searchValue\\\",\\\"inputClasses\\\"],[\\\"email\\\",[33,4],[33,9],[33,10],[28,[37,6],[[30,0],\\\"onRecipientSelected\\\"],null],[28,[37,6],[[30,0],\\\"onRecipientRemovedByIndex\\\"],null],[28,[37,2],[\\\"searchInput.emailSearch\\\"],null],\\\"searchInput.emailSearchLabel\\\",[28,[37,6],[[30,0],\\\"onSubmit\\\"],null],[28,[37,11],[[33,12]],null],\\\"email-address-input\\\"]]]],[1,\\\"\\\\n\\\"],[11,\\\"button\\\"],[16,0,[29,[\\\"btn dialpad dialpad-number make-call btn-create-email \\\",[52,[33,13],\\\"disabled\\\"]]]],[16,\\\"aria-label\\\",[28,[37,2],[\\\"purecloud.acdEmail.createEmail\\\"],null]],[16,\\\"aria-disabled\\\",[52,[33,13],\\\"true\\\",\\\"false\\\"]],[24,4,\\\"submit\\\"],[4,[38,6],[[30,0],\\\"onCreateEmail\\\"],null],[12],[1,\\\"\\\\n    \\\"],[10,1],[14,0,\\\"flex\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"message-email\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"if\\\",\\\"showTitle\\\",\\\"t\\\",\\\"single-select-target-dropdown\\\",\\\"authUser\\\",\\\"queueFilter\\\",\\\"action\\\",\\\"queue\\\",\\\"multi-select-target-dropdown\\\",\\\"contactFilter\\\",\\\"recipientTags\\\",\\\"mut\\\",\\\"searchValue\\\",\\\"createEmailDisabled\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel/interaction-create-email/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed, get } from '@ember/object';\nimport { cancel, throttle } from '@ember/runloop';\nimport { inject } from '@ember/service';\nimport AcdUtilitiesMixin from 'web-directory/mixins/acd-utilities';\nimport { Maybe } from 'web-directory/types';\nimport { warnClosureAction } from 'web-directory/utils/acd-ts';\nimport { UnionFromTuple } from 'web-directory/utils/types';\n\n/**\n * Array of numbers to render in the dial pad.\n * Todo: abstract this out into a reusable util or `const` for consistency\n */\nconst DIALPAD_NUMBERS = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '*', '0', '#'];\nconst DEFAULT_SUB_MESSAGE_TYPE = 'sms' as const;\nconst NON_DEFAULT_SUB_MESSAGE_TYPES = ['whatsapp', 'open'] as const;\nconst SUB_MESSAGE_TYPES = [DEFAULT_SUB_MESSAGE_TYPE, ...NON_DEFAULT_SUB_MESSAGE_TYPES];\n\ntype SubMessageType = UnionFromTuple<typeof SUB_MESSAGE_TYPES>;\n\ntype MessageRecipient = {\n    entity?: { type: 'externalcontacts/contact' | string };\n    externalOrganization?: string;\n    id?: string;\n    name?: string;\n    value: string;\n};\n\ntype MessageQueue = {\n    value: string;\n    id: string;\n    name: string;\n};\n\nexport default Component.extend(AcdUtilitiesMixin, {\n    classNames: ['create-message-dialog', 'dialpad'],\n\n    acdsms: inject('acdsms'),\n    intl: inject('intl'),\n    logger: inject('stashLogger'),\n    notification: inject('notification'),\n    session: inject('session'),\n    queueService: inject('queue'),\n    addressformat: inject('addressformat'),\n\n    /**\n     * @attribute\n     *\n     * `true` if the title of the component should display\n     */\n    showTitle: false,\n\n    /**\n     * @attribute\n     *\n     * `true` if there is already a request pending, or aka a new conversation is already being created from\n     * the provided information. A user shouldn't be able to spam the creation button.\n     */\n    pendingRequest: false,\n\n    /**\n     * @attribute\n     *\n     * `true` if the dialpad should be visible and interactable in the component\n     */\n    showDialpad: false,\n\n    /**\n     * the current value being searched in the search input\n     */\n    searchValue: '',\n\n    /**\n     * The default sub message type\n     */\n    defaultSubMessageType: DEFAULT_SUB_MESSAGE_TYPE as SubMessageType,\n\n    /**\n     * The sub message type that is currently selected in the dropdown. This is used to send as an option to the\n     * backend and to change the icon in the onCreateMessage button. Value should be initialized to the same value as DEFAULT_SUB_MESSAGE_TYPE.\n     */\n    selectedSubMessageType: DEFAULT_SUB_MESSAGE_TYPE as SubMessageType,\n\n    /**\n     * @Attribute\n     * @Feature-Toggle\n     *\n     * Allows agent Direct Routing address to be used on Outbound sms messages\n     */\n    agentAddressOnBehalfOfQueue: false,\n\n    /**\n     * Array of numbers to display for the dialpad component\n     */\n    numbers: DIALPAD_NUMBERS,\n\n    /**\n     * Array of available filters to showcase in the queue target selector component.\n     * We only want to showcase queue options.\n     */\n    queueFilter: ['queue'],\n\n    /**\n     * Array of available filters to showcase in the contact target selector component.\n     * We only want to showcase external contact options.\n     */\n    contactFilter: ['external'],\n\n    /**\n     * Used to store the throttled createMessage request\n     */\n    _timer: null as Maybe<any>,\n\n    /**\n     * The current authenticated user from the session service\n     */\n    authUser: computed.readOnly('session.publicApiUser'),\n\n    /**\n     * The currently added recipient to create the conversation with.\n     */\n    recipient: null as MessageRecipient | null,\n\n    /**\n     * The currently selected queue to create the conversation with\n     */\n    queue: null as MessageQueue | null,\n\n    /**\n     * `true` if the selected recipient is populated and has a valid number. Returns `false` if no search\n     * has been inputted.\n     */\n    isSearchNumberValid: computed('searchValue', 'selectedSubMessageType', function () {\n        const search = this.get('searchValue');\n        const subMsgType = this.get('selectedSubMessageType');\n        if (search) {\n            const formatted = this.get('addressformat').formatAddress(search, undefined, subMsgType);\n            return this.get('addressformat').isValidNumber(\n                subMsgType === 'whatsapp' ? search : formatted,\n                null,\n                true,\n                subMsgType\n            );\n        }\n        return false;\n    }),\n\n    /**\n     * `true` if there is a formatting error to show the user so they are informed that the number they have inputted is not supported\n     */\n    showNumberError: computed(\n        'isSearchNumberValid',\n        'searchValue',\n        'recipient.value',\n        'selectedSubMessageType',\n        function () {\n            const subMsgType = this.get('selectedSubMessageType');\n            if (subMsgType == 'open') {\n                return false;\n            }\n\n            const value = this.get('recipient.value');\n            // has a value selected\n            if (value) {\n                const formatted = this.get('addressformat').formatAddress(value, undefined, subMsgType);\n                return !this.get('addressformat').isValidNumber(\n                    subMsgType === 'whatsapp' ? value : formatted,\n                    null,\n                    true,\n                    subMsgType\n                );\n            }\n\n            // we don't want to show the error if no search was inputted yet\n            return this.get('searchValue') && !this.get('isSearchNumberValid');\n        }\n    ),\n\n    /**\n     * `true` if the conversation cannot be created due to incomplete or incorrect information.\n     */\n    createMessageDisabled: computed('queue.id', 'recipient', 'pendingRequest', 'searchValue', function () {\n        return (\n            this.get('pendingRequest') || !this.get('queue.id') || (!this.get('recipient') && !this.get('searchValue'))\n        );\n    }),\n\n    /**\n     * `true` if\n     *  - conversation is an sms conversation\n     *  - direct routing feature is on\n     *  - user has a sms direct routing address\n     */\n    hasDirectRoutingSmsAddress: computed(\n        'session.person',\n        'selectedSubMessageType',\n        'defaultSubMessageType',\n        'agentAddressOnBehalfOfQueue',\n        async function () {\n            const subMsgType = this.get('selectedSubMessageType');\n            if (subMsgType !== 'sms' || !this.get('agentAddressOnBehalfOfQueue')) {\n                return false;\n            }\n\n            const person = this.get('session.person');\n            if (!person) {\n                this.get('logger').info('No user on session when getting direct routing sms address');\n                return false;\n            }\n\n            try {\n                const directRoutingSmsAddresses = person\n                    .getContactFieldValuesByType('sms')\n                    .filter((contact: any) => contact.value.integration === 'directrouting');\n                return directRoutingSmsAddresses && directRoutingSmsAddresses.length > 0;\n            } catch (error) {\n                this.get('logger').error('Unable to fetch direct routing sms address from the user', {\n                    error,\n                    remoteData: { person }\n                });\n                return false;\n            }\n        }\n    ),\n\n    subMessageTypes: computed('defaultSubMessageType', function (): SubMessageType[] {\n        const sortedSubMessageTypes: SubMessageType[] = [...NON_DEFAULT_SUB_MESSAGE_TYPES].sort(\n            (a: string, b: string) => a.localeCompare(b, this.get('intl.isoLocale'))\n        );\n        return [this.get('defaultSubMessageType'), ...sortedSubMessageTypes];\n    }),\n\n    init() {\n        this._super(...arguments);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.initQueue();\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        this.set('pendingRequest', false);\n        this.set('queue', null);\n        this.set('searchValue', '');\n        this.set('recipient', null);\n        this.set('selectedSubMessageType', this.get('defaultSubMessageType'));\n        this._cancelTimer();\n    },\n\n    /**\n     * Initializes and sets the default queue into the corresponding input\n     */\n    initQueue() {\n        // this check was performed inside of the call-onbehalf component, so with the new work we need to set it here instead.\n        if (!this.get('queue')) {\n            this.get('queueService')\n                .getDefaultQueue('message')\n                .then((queue: any) => {\n                    this.set('queue', queue);\n                })\n                .catch((error: Error) => {\n                    this.get('logger').error('There was an issue getting the default queue', error);\n                });\n        }\n    },\n\n    /**\n     * Cancels and removes the timer set by the createMessage being throttled.\n     * The timer prevents the createMessage from being spam fired.\n     */\n    _cancelTimer() {\n        cancel(this.get('_timer'));\n    },\n\n    /**\n     * Generates the options with corresponding formatted values that are sent when creating a new message.\n     */\n    async _generateOptions(queue: MessageQueue | null, subMsgType: SubMessageType) {\n        let recipient: MessageRecipient | null = this.get('recipient')\n            ? ({ ...this.get('recipient') } as MessageRecipient)\n            : null;\n        const options = {\n            entity: null as Maybe<MessageRecipient>,\n            useUserFromAddress: false,\n            queueId: queue?.id,\n            queueName: queue?.name,\n            toAddressMessengerType: subMsgType\n        };\n        // supply parameter to use Agent's Direct Routing SMS address outbound if queue setting and user address matches\n        const userHasDirectRoutingSmsAddress = await this.get('hasDirectRoutingSmsAddress');\n        if (queue && userHasDirectRoutingSmsAddress) {\n            const fullQueue = await this.get('queueService').getQueue(queue.id);\n            if (fullQueue.directRouting) {\n                options.useUserFromAddress =\n                    fullQueue.directRouting.messageMediaSettings.useAgentAddressOutbound === true;\n            }\n        }\n\n        const recipientValue = recipient ? recipient.value : this.get('searchValue');\n        const formattedAddress = this.get('addressformat').formatAddress(recipientValue, undefined, subMsgType);\n        if (recipient) {\n            recipient.value = formattedAddress;\n            options.entity = recipient;\n        } else {\n            options.entity = {\n                value: formattedAddress\n            };\n        }\n\n        return options;\n    },\n\n    /**\n     * Creates the message based on the information that the user has filled out up to this point.\n     */\n    async _createMessage(this: any) {\n        const queue = this.get('queue');\n        const subMsgType = this.get('selectedSubMessageType');\n        this.set('pendingRequest', true);\n        const options = await this._generateOptions(queue, subMsgType);\n\n        try {\n            await this.get('acdsms').createMessage(options, false);\n            this.actionClose();\n            // catching error from within this promise because this doesn't affect the message being created\n            this.get('queueService')\n                .setDefaultQueue(queue, 'message')\n                .catch((error: Error) => {\n                    this.get('logger').error('There was an issue setting the default queue', error);\n                });\n        } catch (error: any) {\n            let message = this.get('intl').t('purecloud.acdInteraction.sms.errors.errorCreatingMessage');\n            if (error.payload) {\n                if (error.payload.code === 'queue.address.required') {\n                    message = this.get('intl').t('purecloud.acdInteraction.sms.errors.queueSubMessageRequired', {\n                        subMessageType: subMsgType,\n                        queueName: get(queue, 'name')\n                    });\n                } else if (error.payload.code === 'active.conversation') {\n                    message = this.get('intl').t('purecloud.acdInteraction.sms.errors.conversationAlreadyExists');\n                } else if (error.payload.code === 'invalid.phone.number') {\n                    message = this.get('intl').t('purecloud.acdInteraction.sms.errors.invalidPhoneNumber');\n                } else if (error.payload.code === 'invalid.whatsapp.address') {\n                    message = this.get('intl').t('purecloud.acdInteraction.sms.errors.invalidWhatsAppAddress');\n                }\n            }\n\n            this.get('notification').error(\n                this.get('intl').t('purecloud.acdInteraction.sms.errors.queueSmsErrorTitle'),\n                message\n            );\n        }\n    },\n\n    /**\n     * Invoked when a new recipient has been selected (or removed) and formats it\n     * for the creation message request.\n     *\n     * @param value the new value to set the recipient property to\n     */\n    recipientSelected(value: any | null) {\n        let recipient: MessageRecipient | null = null;\n        if (value) {\n            const id = get(value, 'id');\n            const phoneNumber = get(value, 'phoneNumber') ?? get(value, 'bestPhoneNumber');\n            if (id) {\n                recipient = {\n                    entity: { type: 'externalcontacts/contact' },\n                    externalOrganization: get(value, 'externalOrganization'),\n                    id: id,\n                    name: get(value, 'name'),\n                    value: phoneNumber\n                };\n            } else {\n                const subMsgType = this.get('selectedSubMessageType');\n                const e164Number =\n                    subMsgType === 'whatsapp'\n                        ? phoneNumber\n                        : this.get('addressformat').formatAddress(phoneNumber, undefined, subMsgType);\n                const displayNumber = this.get('addressformat').formatAddressForDisplay(\n                    e164Number,\n                    undefined,\n                    subMsgType\n                );\n                recipient = {\n                    name: displayNumber,\n                    value: e164Number\n                };\n            }\n        }\n        this.set('recipient', recipient);\n    },\n\n    /**\n     * @action\n     *\n     * Invoked when the message interaction requests to close itself\n     */\n    actionClose: () => warnClosureAction('actionClose'),\n\n    actions: {\n        /**\n         * Invoked a sub message type has been selected by the agent in the outbound dialog gux-dropdown.\n         *\n         * @param event the event data provided by the input\n         */\n        onSelectMessageType(event: InputEvent) {\n            if (event && event.target) {\n                const target = event.target as HTMLInputElement;\n                // @ts-ignore\n                this.set('selectedSubMessageType', target.value?.toLowerCase());\n\n                // Reset the recipient and search value when switching between sub message types\n                this.set('recipient', null);\n                this.set('searchValue', '');\n            } else {\n                this.set('selectedSubMessageType', this.get('defaultSubMessageType'));\n            }\n        },\n\n        /**\n         * Invoked when a queue has been selected by the user\n         *\n         * @param queue the selected queue\n         */\n        onQueueSelected(queue: MessageQueue) {\n            this.set('queue', queue);\n        },\n\n        /**\n         * Invoked when a queue has been selected by the user. If target is null, then the target was likely\n         * removed from within the component so we should unset the recipient value in that case.\n         *\n         * @param target the selected target\n         */\n        onRecipientSelected(target: MessageRecipient | null) {\n            this.recipientSelected(target);\n        },\n\n        /**\n         * Invoked when the user has opted to create a message based on the information they have filled\n         * out in the form.\n         */\n        onCreateMessage() {\n            if (this.get('createMessageDisabled')) return;\n            this._cancelTimer();\n            this.set('_timer', throttle(this, this._createMessage, 2000));\n        },\n\n        /**\n         * Invoked when the user wants to toggle the dialpad visibility.\n         */\n        onToggleDialpad() {\n            this.toggleProperty('showDialpad');\n        },\n\n        /**\n         * Invoked when a dialpad number has been selected adding the single digit to the search input.\n         *\n         * @param value the single digit number or string to add to the search input\n         */\n        onAddNumber(value: string) {\n            this.set('searchValue', `${this.get('searchValue')}${value}`);\n\n            // If the user is making changes via the dial pad, we should reset the chosen recipient\n            if (this.get('recipient')) {\n                this.recipientSelected(null);\n            }\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"EWF6zl2a\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[10,\\\"h4\\\"],[14,0,\\\"dialpad-title\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,2],[\\\"purecloud.acdInteraction.sms.sendMessage\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[10,0],[14,0,\\\"dialpad-requirements-text\\\"],[12],[1,\\\"\\\\n    \\\"],[1,[28,[35,2],[\\\"purecloud.acdInteraction.calls.fieldRequirementsAll\\\"],null]],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,3],[[33,4,[\\\"length\\\"]],1],null],[[[1,\\\"    \\\"],[10,\\\"gux-dropdown\\\"],[14,1,\\\"messenger-type-dropdown\\\"],[14,3,\\\"messenger\\\"],[15,\\\"onchange\\\",[28,[37,5],[[30,0],\\\"onSelectMessageType\\\"],null]],[15,\\\"aria-label\\\",[28,[37,2],[\\\"purecloud.acdInteraction.interactionTypes.supportedMessengerTypes.selectType\\\"],null]],[15,\\\"disabled\\\",[28,[37,6],[[33,4]],null]],[15,2,[36,7]],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-listbox\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,9],[[28,[37,9],[[33,4]],null]],null],null,[[[1,\\\"                \\\"],[10,\\\"gux-option\\\"],[14,\\\"role\\\",\\\"option\\\"],[15,1,[28,[37,10],[[30,1],\\\"-submessage-type\\\"],null]],[15,2,[30,1]],[15,\\\"selected\\\",[52,[28,[37,11],[[30,1],[33,7]],null],\\\"true\\\"]],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,2],[[28,[37,10],[\\\"purecloud.acdInteraction.interactionTypes.supportedMessengerTypes.\\\",[30,1]],null]],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[1,[28,[35,12],null,[[\\\"autofocus\\\",\\\"interactionType\\\",\\\"disableInputEnter\\\",\\\"authUser\\\",\\\"includeFilters\\\",\\\"placeholder\\\",\\\"clearTranslation\\\",\\\"targetSelected\\\",\\\"value\\\",\\\"myQueuesOnly\\\",\\\"supplementalClasses\\\"],[true,\\\"message\\\",true,[33,13],[33,14],[28,[37,2],[\\\"purecloud.onBehalfOfQueue\\\"],null],[28,[37,2],[\\\"purecloud.clearBehalfOfQueue\\\"],null],[28,[37,5],[[30,0],\\\"onQueueSelected\\\"],null],[33,15],true,\\\"message-queue-selection\\\"]]]],[1,\\\"\\\\n\\\\n\\\"],[1,[28,[35,12],null,[[\\\"interactionType\\\",\\\"authUser\\\",\\\"includeFilters\\\",\\\"value\\\",\\\"searchValue\\\",\\\"targetSelected\\\",\\\"placeholder\\\",\\\"supplementalClasses\\\",\\\"hideTargetDropdown\\\"],[\\\"message\\\",[33,13],[33,16],[33,17],[28,[37,18],[[33,19]],null],[28,[37,5],[[30,0],\\\"onRecipientSelected\\\"],null],[28,[37,2],[[28,[37,10],[\\\"searchInput.\\\",[33,7],\\\"Search\\\"],null]],null],\\\"message-number-selection\\\",[28,[37,11],[[33,7],\\\"open\\\"],null]]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[33,20],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"number-formatting-error\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"alert-info\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[10,2],[14,0,\\\"formatting-message\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,2],[\\\"purecloud.acdInteraction.sms.errors.invalidNumberFormat\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,21],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"dialpad-numbers-container\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,9],[[28,[37,9],[[33,22]],null]],null],null,[[[1,\\\"            \\\"],[1,[28,[35,23],null,[[\\\"number\\\",\\\"click\\\"],[[30,2],[28,[37,5],[[30,0],\\\"onAddNumber\\\",[30,2]],null]]]]],[1,\\\"\\\\n\\\"]],[2]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[11,\\\"button\\\"],[16,\\\"aria-label\\\",[28,[37,2],[\\\"purecloud.acdInteraction.sms.sendMessage\\\"],null]],[16,0,[29,[\\\"btn dialpad dialpad-number make-call btn-create-message \\\",[52,[33,24],\\\"disabled\\\"]]]],[16,\\\"aria-disabled\\\",[52,[33,24],\\\"true\\\",\\\"false\\\"]],[24,4,\\\"button\\\"],[4,[38,5],[[30,0],\\\"onCreateMessage\\\"],null],[12],[1,\\\"\\\\n    \\\"],[10,1],[14,0,\\\"flex\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,25],null,[[\\\"subMessageType\\\"],[[33,7]]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,\\\"button\\\"],[14,0,\\\"btn btn-link btn-sm dialpad-toggle\\\"],[15,\\\"onclick\\\",[28,[37,5],[[30,0],\\\"onToggleDialpad\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,21],[[[1,\\\"        \\\"],[1,[28,[35,2],[\\\"purecloud.closeDialpad\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[1,[28,[35,2],[\\\"purecloud.openDialpad\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[13]],[\\\"messageType\\\",\\\"number\\\"],false,[\\\"if\\\",\\\"showTitle\\\",\\\"t\\\",\\\"gt\\\",\\\"subMessageTypes\\\",\\\"action\\\",\\\"not\\\",\\\"selectedSubMessageType\\\",\\\"each\\\",\\\"-track-array\\\",\\\"concat\\\",\\\"eq\\\",\\\"single-select-target-dropdown\\\",\\\"authUser\\\",\\\"queueFilter\\\",\\\"queue\\\",\\\"contactFilter\\\",\\\"recipient\\\",\\\"mut\\\",\\\"searchValue\\\",\\\"showNumberError\\\",\\\"showDialpad\\\",\\\"numbers\\\",\\\"dial-pad-number\\\",\\\"createMessageDisabled\\\",\\\"acd-interactions-panel/interaction-messages-icon\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel/interaction-create-message/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed, get } from '@ember/object';\nimport { inject } from '@ember/service';\nimport type { AssignmentStateType, WorkitemInteraction } from '@genesys/genesys-cloud-conversation-utils';\nimport findLast from 'lodash/findLast';\nimport type { Models } from 'purecloud-platform-client-internal-v2';\nimport type { Conversation, Maybe } from 'web-directory/types';\nimport type { CaseAssociationEntities } from 'web-directory/types/case-types';\nimport { warnClosureAction } from 'web-directory/utils/acd-ts';\nimport type { Draft } from 'web-directory/utils/email-types/draft-type';\n\nexport default Component.extend({\n    classNames: ['interaction-group'],\n    classNameBindings: ['isSelected', 'isAlerting'],\n\n    session: inject('session'),\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n        this._updateDivisionName();\n    },\n\n    /**\n     * @attribute\n     * Array of external contacts from external contact service\n     */\n    externalContacts: null,\n\n    /**\n     * @attribute\n     * The adhoc group object create by the roster component\n     */\n    group: null,\n\n    /**\n     * @attribute\n     * The currently selected interaction\n     */\n    selectedInteraction: null,\n\n    /**\n     * @attribute\n     * The currently selected workitem\n     */\n    selectedWorkitem: null as Maybe<WorkitemInteraction>,\n\n    /**\n     * @attribute\n     * Flag to enable outbound contact, passed through this component\n     */\n    enableOutboundContact: null,\n\n    /**\n     * @attribute\n     * Flag to indicate if the user has permission and feature toggle to view cases\n     */\n    canViewCasesViaRequest: false,\n\n    /**\n     * @attribute\n     * Flag to indicate if the user has permission and feature toggle to view workitem cases on the model\n     */\n    canViewWorkitemCases: false,\n\n    /**\n     * @attribute\n     * Version of the case cache; when it changes, cards re-read from getCaseForInteraction.\n     * Passed down from panel state.\n     */\n    caseCacheVersion: null as Maybe<number>,\n\n    /**\n     * @attribute\n     * (id: string) => Entity[] | null. Passed down from panel state for cards to look up cached case.\n     */\n    getCaseForInteraction: null as Maybe<(id: string) => Maybe<CaseAssociationEntities>>,\n\n    /**\n     * @attribute\n     * Flag to enable customer intent labels\n     */\n    enableCustomerIntent: false,\n\n    /**\n     * @attribute\n     * FT for inactivity timeout\n     */\n    inactivityTimeoutFT: false,\n\n    /**\n     * @attribute\n     * flag indicating if the new nav system is being used\n     */\n    useNewNav: false as boolean,\n\n    /**\n     * @attribute\n     * Object containing draft updates\n     */\n    draftUpdateHash: null as Maybe<Draft[]>,\n\n    /**\n     * @attribute\n     */\n    externalContactDivisionName: undefined as undefined | string,\n\n    /**\n     * Customer intent label read from the first interaction's customerIntent property.\n     * Set by customer-intent service when conversation is taken in and updated via Hawk.\n     */\n    customerIntentLabel: computed('interactions.firstObject.customerIntent', 'interactions.[]', function ():\n        | string\n        | undefined {\n        const firstInteraction = this.get('interactions.firstObject');\n        return firstInteraction?.customerIntent ?? undefined;\n    }),\n\n    /**\n     * @action\n     */\n    loadDivisionName: (divisionId: string | undefined) => warnClosureAction('loadDivisionName', divisionId),\n\n    /**\n     * Group conversation interactions sorted by startTimestamp.\n     * Group workitem interactions by dueDate or dateCreated if dueDate is not present.\n     */\n    interactions: computed.sort(\n        'group.interactions',\n        function (a: Maybe<Conversation | WorkitemInteraction>, b: Maybe<Conversation | WorkitemInteraction>): number {\n            function getStartTime(conversation: any): number {\n                const startTime = get(conversation, 'startTimestamp') || get(conversation, 'workitem.dateDue');\n                return new Date(startTime).valueOf();\n            }\n\n            const startA = getStartTime(a);\n            const startB = getStartTime(b);\n\n            return startA - startB;\n        }\n    ),\n\n    /**\n     * Flag to determine if the customer intent label should be shown\n     * If the customer intent label is loading, then it should be shown, but in loading state\n     * If the customer intent label is not loading but label is present, then it should be shown\n     * If the customer intent label is not loading and the label is not present, then it should not be shown\n     */\n    showCustomerIntent: computed('enableCustomerIntent', 'customerIntentLabel', function (): boolean {\n        if (!this.get('enableCustomerIntent')) return false;\n        return !!this.get('customerIntentLabel');\n    }),\n\n    /**\n     * Used to ensure we aren't rendering an empty div if neither the division or the intent is present\n     */\n    showGroupBadges: computed(\n        'session.features.PURE-3835',\n        'externalContactDivisionName',\n        'showCustomerIntent',\n        function (): boolean {\n            const hasDivision = this.get('session.features.PURE-3835') && !!this.get('externalContactDivisionName');\n            return !!(hasDivision || this.get('showCustomerIntent'));\n        }\n    ),\n\n    /**\n     * Ids of queues for interactions in the group\n     */\n    interactionQueueIds: computed(\n        'interactions.[]',\n        'interactions.@each.participantForQueue.queueId',\n        'interactions.@each.participantForCurrentUser.{queueId,monitoredParticipantId,coachedParticipantId,bargedParticipantId}',\n        'interactions.@each.workitem.queueId',\n        'interactions.@each.workitem',\n        function (): Array<undefined | string> {\n            const interactions = this.get('interactions');\n            return (Array.isArray(interactions) ? interactions : []).map<undefined | string>((interaction: any) => {\n                let queueId =\n                    get(interaction, 'participantForCurrentUser.queueId') ||\n                    get(interaction, 'participantForQueue.queueId') ||\n                    get(interaction, 'workitem.queueId');\n\n                if (!queueId && !get(interaction, 'workitem')) {\n                    const currentUser = get(interaction, 'participantForCurrentUser');\n                    const mcbedParticipantId =\n                        currentUser?.monitoredParticipantId ||\n                        currentUser?.coachedParticipantId ||\n                        currentUser?.bargedParticipantId;\n\n                    if (!!mcbedParticipantId) {\n                        //queue-name is needed even when the interaction is disconnected\n                        queueId = findLast(\n                            get(interaction, 'participants') || [],\n                            ({ id, queueId }: Models.Participant) => id === mcbedParticipantId && !!queueId\n                        )?.queueId;\n                    }\n                }\n\n                return queueId;\n            });\n        }\n    ),\n\n    /**\n     * Flag to determine if the group is in an alerting state\n     */\n    isAlerting: computed(\n        'interactions.firstObject.isAlerting',\n        'interactions.firstObject.workitem.assignmentState',\n        function (): boolean {\n            return (\n                this.get('interactions.firstObject.isAlerting') ||\n                (this.get('interactions.firstObject.workitem.assignmentState') as undefined | AssignmentStateType) ===\n                    'Alerting'\n            );\n        }\n    ),\n\n    /**\n     * Maintain a reference to the external contact object for the group\n     */\n    externalContact: computed('externalContacts.[]', 'group.groupId', function (): any {\n        const contactFromGroupId: string = this.get('group.groupId');\n        return contactFromGroupId ? this.get('externalContacts').findBy('id', contactFromGroupId) : null;\n    }),\n\n    _updateDivisionName() {\n        if (this.get('session').get('features')['PURE-3835']) {\n            if (this.get('session').get('features')['PURE-6191']) {\n                const interaction = this.get('interactions')[0];\n                const setDivisionName = (name: string | undefined) => {\n                    if (this && !(this.get('isDestroyed') || this.get('isDestroying')))\n                        this.set('externalContactDivisionName', name);\n                };\n                const externalContact = this.get('externalContact');\n                if (externalContact) {\n                    setDivisionName(externalContact?.division?.name);\n                    return;\n                }\n                if (get(interaction || {}, 'workitem')) {\n                    setDivisionName(undefined);\n                    return;\n                }\n                const divisionId = get(interaction || {}, 'participantForCustomer.externalContactInitialDivisionId');\n                this.loadDivisionName(divisionId).then((divisionName: string | undefined) => {\n                    setDivisionName(divisionName);\n                });\n            } else {\n                const interaction = this.get('interactions')[0];\n                const setDivisionName = (name: string | undefined) => {\n                    if (this && !(this.get('isDestroyed') || this.get('isDestroying')))\n                        this.set('externalContactDivisionName', name);\n                };\n                if (get(interaction || {}, 'workitem')) {\n                    setDivisionName(undefined);\n                    return;\n                }\n\n                const externalContact = this.get('externalContact');\n                if (externalContact) {\n                    setDivisionName(externalContact?.division?.name);\n                    return;\n                }\n                const divisionId = get(interaction || {}, 'participantForCustomer.externalContactInitialDivisionId');\n                this.loadDivisionName(divisionId).then((divisionName: string | undefined) => {\n                    setDivisionName(divisionName);\n                });\n            }\n        }\n    },\n\n    /**\n     * Determine if group contains the currently selected interaction\n     */\n    isSelected: computed('interactions', 'selectedInteraction', function (): boolean {\n        const interactions: any[] = this.get('interactions');\n        const selectedInteractionId: string = this.get('selectedInteraction.id');\n        const selectedWorkitemId: string = this.get('selectedWorkitem.id');\n\n        return !!interactions.find(i => {\n            return get(i, 'id') === selectedInteractionId || get(i, 'id') === selectedWorkitemId;\n        });\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"H0+I8RlT\",\"block\":\"[[[10,0],[14,0,\\\"interaction-group-wrapper\\\"],[12],[1,\\\"\\\\n\\\"],[41,[51,[33,1]],[[[41,[33,3],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"interaction-group-badges\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,4],[[33,5],[33,6]],null],[[[6,[39,7],null,null,[[\\\"default\\\"],[[[[1,\\\"                        \\\"],[1,[34,6]],[1,\\\"\\\\n\\\"]],[]]]]]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,8],[[[6,[39,7],null,[[\\\"color\\\"],[\\\"dark-blue\\\"]],[[\\\"default\\\"],[[[[1,\\\"                        \\\"],[1,[34,9]],[1,\\\"\\\\n\\\"]],[]]]]]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"interaction-group-header\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,\\\"role\\\",\\\"heading\\\"],[14,\\\"aria-level\\\",\\\"3\\\"],[14,\\\"tabindex\\\",\\\"-1\\\"],[14,0,\\\"header-text\\\"],[14,1,\\\"interactionGroupHeading\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,10],null,[[\\\"tagName\\\",\\\"conversation\\\",\\\"participantId\\\"],[\\\"h3\\\",[28,[37,11],[[33,12,[\\\"firstObject\\\",\\\"__interaction_metadata__\\\"]],[33,12,[\\\"firstObject\\\"]]],null],[28,[37,11],[[33,12,[\\\"firstObject\\\",\\\"participantForCustomer\\\",\\\"id\\\"]],[33,12,[\\\"firstObject\\\",\\\"customer\\\",\\\"externalContactId\\\"]]],null]]]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,4],[[33,13],[28,[37,14],[[33,12,[\\\"firstObject\\\",\\\"iAmConsulted\\\"]]],null]],null],[[[1,\\\"                \\\"],[1,[28,[35,15],null,[[\\\"externalContact\\\",\\\"group\\\",\\\"permissions\\\",\\\"actionCreateCall\\\",\\\"actionCreateMessage\\\",\\\"actionCreateEmail\\\",\\\"actionDisplayError\\\",\\\"actionFetchDefaultQueue\\\",\\\"actionFetchQueue\\\"],[[33,16],[33,17],[33,18],[33,19],[33,20],[33,21],[33,22],[33,23],[33,24]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[42,[28,[37,26],[[28,[37,26],[[33,12]],null]],null],null,[[[1,\\\"        \\\"],[1,[28,[35,27],null,[[\\\"interaction\\\",\\\"interactionQueueId\\\",\\\"engagementSource\\\",\\\"selectedInteraction\\\",\\\"selectedWorkitem\\\",\\\"isTypingInteractions\\\",\\\"hideInteractionButtons\\\",\\\"actionAnswerInteraction\\\",\\\"actionAnswerWorkitemInteraction\\\",\\\"actionDeclineInteraction\\\",\\\"actionDeclineWorkitemInteraction\\\",\\\"actionSelectInteraction\\\",\\\"actionSelectWorkitemInteraction\\\",\\\"actionLoadParticipantName\\\",\\\"acdAnnounceMonitoringFt\\\",\\\"acdAnnounceMonitoringDigitalFt\\\",\\\"draftUpdateHash\\\",\\\"externalContactDivisionName\\\",\\\"acdExternalContactDivNameFT\\\",\\\"acdExternalContactWorkitemsDivNameFT\\\",\\\"canViewCasesViaRequest\\\",\\\"canViewWorkitemCases\\\",\\\"caseCacheVersion\\\",\\\"getCaseForInteraction\\\",\\\"acdEngagementSourcesFT\\\",\\\"inactivityTimeoutFT\\\",\\\"useNewNav\\\"],[[30,1],[28,[37,28],[[33,29],[28,[37,30],[[30,2],\\\"\\\"],null]],null],[30,1,[\\\"engagementSource\\\"]],[33,31],[33,32],[33,33],[33,34],[33,35],[33,36],[33,37],[33,38],[33,39],[33,40],[33,41],[33,42],[33,43],[33,44],[33,6],[33,5],[33,45],[33,46],[33,47],[33,48],[33,49],[33,50],[33,51],[33,52]]]]],[1,\\\"\\\\n\\\"]],[1,2]],null],[13]],[\\\"interaction\\\",\\\"index\\\"],false,[\\\"unless\\\",\\\"isAlerting\\\",\\\"if\\\",\\\"showGroupBadges\\\",\\\"and\\\",\\\"acdExternalContactDivNameFT\\\",\\\"externalContactDivisionName\\\",\\\"tags-input/label\\\",\\\"showCustomerIntent\\\",\\\"customerIntentLabel\\\",\\\"acd-interactions-panel/participant-name\\\",\\\"or\\\",\\\"interactions\\\",\\\"enableOutboundContact\\\",\\\"not\\\",\\\"acd-interactions-panel/interaction-outbound-contact\\\",\\\"externalContact\\\",\\\"group\\\",\\\"permissions\\\",\\\"actionCreateCall\\\",\\\"actionCreateMessage\\\",\\\"actionCreateEmail\\\",\\\"actionDisplayError\\\",\\\"actionFetchDefaultQueue\\\",\\\"actionFetchQueue\\\",\\\"each\\\",\\\"-track-array\\\",\\\"acd-interactions-panel/interaction-card-v2\\\",\\\"get\\\",\\\"interactionQueueIds\\\",\\\"concat\\\",\\\"selectedInteraction\\\",\\\"selectedWorkitem\\\",\\\"isTypingInteractions\\\",\\\"hideInteractionButtons\\\",\\\"actionAnswerInteraction\\\",\\\"actionAnswerWorkitemInteraction\\\",\\\"actionDeclineInteraction\\\",\\\"actionDeclineWorkitemInteraction\\\",\\\"actionSelectInteraction\\\",\\\"actionSelectWorkitemInteraction\\\",\\\"actionLoadParticipantName\\\",\\\"acdAnnounceMonitoring\\\",\\\"acdAnnounceMonitoringDigital\\\",\\\"draftUpdateHash\\\",\\\"acdExternalContactWorkitemsDivNameFT\\\",\\\"canViewCasesViaRequest\\\",\\\"canViewWorkitemCases\\\",\\\"caseCacheVersion\\\",\\\"getCaseForInteraction\\\",\\\"acdEngagementSourcesFT\\\",\\\"inactivityTimeoutFT\\\",\\\"useNewNav\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel/interaction-group/template.hbs\",\"isStrictMode\":false});","import Ember from 'ember';\n\nconst { Component, computed } = Ember;\n\nexport default Component.extend({\n    classNames: ['sms-message-icon'],\n    classNameBindings: ['subMessageTypeClass'],\n\n    subMessageTypeClass: computed('subMessageType', function () {\n        return `sms-message-type-${this.get('subMessageType')}`;\n    }),\n\n    subMessageType: null\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"nE/Ti1BF\",\"block\":\"[[[41,[28,[37,1],[[33,2],\\\"facebook\\\"],null],[[[1,\\\"    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"facebook-messenger\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,1],[[33,2],\\\"twitter\\\"],null],[[[1,\\\"    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"twitter\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,1],[[33,2],\\\"whatsapp\\\"],null],[[[1,\\\"    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"whatsapp\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,1],[[33,2],\\\"webmessaging\\\"],null],[[[1,\\\"    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"chat-multi\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,1],[[33,2],\\\"open\\\"],null],[[[1,\\\"    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"comments\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"sms\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]]],[]]]],[]]]],[]]]],[]]]],[],false,[\\\"if\\\",\\\"eq\\\",\\\"subMessageType\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel/interaction-messages-icon/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { inject } from '@ember/service';\nimport { task, waitForQueue } from 'ember-concurrency';\nimport { uniqBy } from 'lodash';\nimport { warnClosureAction } from 'web-directory/utils/acd-ts';\nimport { CommunicationType } from '@genesys/genesys-cloud-conversation-utils';\nimport { Maybe } from 'web-directory/types';\nimport ComputedProperty from '@ember/object/computed';\nimport { UnionFromTuple } from 'web-directory/utils/types';\nimport { get, computed } from '@ember/object';\nimport { singularizeMediaType } from 'web-directory/utils/acd-ts';\nimport RSVP from 'rsvp';\nimport Ember from 'ember';\n\ntype GuxPopoverListBeta =\n    | (Element & {\n          isOpen: boolean;\n      })\n    | null;\n\nconst OUTBOUND_MEDIA_TYPES = ['calls', 'emails', 'messages'] as const;\nconst EMAIL_TYPES = ['workEmail', 'personalEmail', 'otherEmail'] as const;\nconst PHONE_TYPES = ['workPhone', 'cellPhone', 'homePhone', 'otherPhone', 'phoneNumber', 'faxNumber'] as const;\nconst PROMISE_STATES = ['fulfilled', 'rejected', 'pending'] as const;\n\ntype PhoneType = UnionFromTuple<typeof PHONE_TYPES>;\ntype EmailType = UnionFromTuple<typeof EMAIL_TYPES>;\ntype PromiseState = UnionFromTuple<typeof PROMISE_STATES>;\n\ntype PromiseResolution = {\n    state: PromiseState;\n    value?: any;\n};\n\ntype PhoneData = {\n    acceptsSMS?: boolean;\n    e164?: string;\n    display?: string;\n};\n\ntype OutboundEmailData = {\n    type: CommunicationType;\n    email: string;\n    entryType: EmailType;\n    id: string;\n};\n\ntype OutboundPhoneData = {\n    type: CommunicationType;\n    phoneNumber: string;\n    e164: string;\n    acceptsSMS: boolean;\n    entryType: PhoneType;\n    entityType: string;\n    id: string;\n};\n\ntype OutboundData = OutboundEmailData | OutboundPhoneData;\n\ntype OutboundQueueOption = Record<CommunicationType, string>;\n\n/**\n * Determine if given phoneData is valid for either SMS or phone conversations.\n * @param phoneData Phone data to validate\n * @param interactionType Type of conversation\n */\nfunction isValidPhoneData(phoneData: PhoneData, interactionType: CommunicationType): boolean {\n    const validSmsType = interactionType === 'messages' && !!phoneData.acceptsSMS;\n    const validCallType = interactionType === 'calls';\n    return (\n        !!phoneData &&\n        typeof phoneData === 'object' &&\n        (validSmsType || validCallType) &&\n        !!phoneData.e164 &&\n        !!phoneData.display\n    );\n}\n\nexport default Component.extend({\n    classNames: ['acd-interaction-outbound-contact'],\n\n    _popoverTargetClickHandler: null as Maybe<(evt: any) => void>,\n    _popoverTargetKeydownHandler: null as Maybe<(evt: any) => void>,\n    _popoverDismissHandler: null as Maybe<() => void>,\n    _popoverFocusoutHandler: null as Maybe<(evt: any) => void>,\n\n    logger: inject('stash-logger'),\n\n    /**\n     * @Attribute\n     * Permissions wrapper passed from the panel component\n     */\n    permissions: {} as Record<string, boolean>,\n\n    /**\n     * @Attribute\n     * The interaction group object.\n     */\n    group: null as any,\n\n    /**\n     * @Attribute\n     * The external contact object for the current group.\n     */\n    externalContact: null as any,\n\n    /**\n     * Collection of queue objects fetched from data store\n     */\n    queues: null as any,\n\n    /**\n     * An object containing default queue data {type: id}\n     */\n    defaultQueueIds: {} as OutboundQueueOption,\n\n    /**\n     * A flag indicating if the popover is visible.\n     */\n    outboundPopoverVisible: false,\n\n    /**\n     * A flag indicating if we're in actively creating an outbound\n     * conversation (e.g. api request was submitted).\n     */\n    creatingOutboundConversation: false,\n\n    /**\n     * The queueId attached to the current user participant.\n     */\n    agentQueueId: computed.or(\n        'group.interactions.firstObject.participantForCurrentUser.queueId',\n        'group.interactions.firstObject.agent.queueId'\n    ) as ComputedProperty<Maybe<string>>,\n\n    /**\n     * Flag indicating if there are any outbound options generated for group/user.\n     */\n    hasOutboundOptions: computed.bool('outboundOptions.length'),\n\n    /**\n     * Permission to create outbound emails.\n     */\n    canCreateEmail: computed.readOnly('permissions.canCreateEmail'),\n\n    /**\n     * Permission to create outbound messages.\n     */\n    canSendMessage: computed.readOnly('permissions.canSendMessage'),\n\n    /**\n     * Permission to create outbound calls.\n     */\n    canMakeCall: computed.readOnly('permissions.canMakeCall'),\n\n    /**\n     * Permission to fetch data about queues.\n     */\n    canViewQueue: computed.readOnly('permissions.canViewQueue'),\n\n    /**\n     * Outbound queues available to the user for the current group.\n     */\n    outboundQueues: computed(\n        'agentQueueId',\n        'defaultQueueIds',\n        'queues.@each.{outboundEmailAddress,outboundMessagingAddresses}',\n        function (): OutboundQueueOption[] {\n            const currentQueueId: Maybe<string> = this.get('agentQueueId');\n            const defaultQueueIds: Record<CommunicationType, string> = this.get('defaultQueueIds');\n            return Object.fromEntries(\n                OUTBOUND_MEDIA_TYPES.map(type => {\n                    const effectiveQueueId = defaultQueueIds[type] ? defaultQueueIds[type] : currentQueueId;\n                    return [type, this.get('queues').findBy('id', effectiveQueueId)];\n                }).filter(([type, queue]) => {\n                    if (!queue) return false;\n                    if (type === 'emails') return !!get(queue, 'outboundEmailAddress');\n                    if (type === 'messages') return !!get(queue, 'outboundMessagingAddresses.smsAddress');\n                    return true;\n                })\n            );\n        }\n    ),\n\n    /**\n     * Computes outbound conversation data for the current conversation\n     * filtering out options without outbound queue targets\n     * @returns An array of objects containing outbound data\n     */\n    outboundOptions: computed(\n        'externalContact',\n        'outboundQueues',\n        'canMakeCall',\n        'canCreateEmail',\n        'canSendMessage',\n        function (): OutboundData[] {\n            let options: OutboundData[] = [];\n            const queues: OutboundQueueOption = this.get('outboundQueues');\n\n            if (!queues) {\n                return options;\n            }\n\n            if (this.get('canMakeCall')) {\n                options = options.concat(this.getOutboundData('calls'));\n            }\n\n            if (this.get('canCreateEmail')) {\n                options = options.concat(this.getOutboundData('emails'));\n            }\n\n            if (this.get('canSendMessage')) {\n                options = options.concat(this.getOutboundData('messages'));\n            }\n\n            return options.filter((option: any): any => {\n                const type: CommunicationType = get(option, 'type');\n                option.key = `${option.type}-${option.entryType}`;\n                if (queues[type]) {\n                    option.queue = queues[type];\n                    return true;\n                }\n            });\n        }\n    ),\n\n    /**\n     * Loads a given queue into local cache.\n     * @param queueId - a queue guid\n     */\n    ensureQueueLoaded: task(function* (this: any, queueId: string): Generator<any> {\n        // The user can't resolve queue details\n        if (!this.get('canViewQueue')) return;\n        // The queue is already loaded\n        if (this.get('queues').findBy('id', queueId)) return;\n\n        // Need to specify `reload: true` here to ensure we get the full payload from Public API\n        const queue: any = yield this.actionFetchQueue(queueId, { reload: true });\n\n        yield waitForQueue('actions');\n\n        this.set(\n            'queues',\n            this.get('queues')\n                .rejectBy('id', queueId)\n                .concat(Object.assign({ id: queueId }, queue.toJSON()))\n        );\n    }),\n\n    /**\n     * Loads a queue attached to the current agent participant into local cache.\n     */\n    ensureAgentQueueLoaded: task(function* (this: any): any {\n        const agentQueueId = this.get('agentQueueId');\n        if (!agentQueueId) return;\n        yield this.get('ensureQueueLoaded').perform(agentQueueId);\n    }).keepLatest(),\n\n    /**\n     * Loads and caches default queues for each outbound media type.\n     */\n    loadDefaultQueues: task(function* (this: any): any {\n        const defaultQueueResults = yield RSVP.allSettled(\n            OUTBOUND_MEDIA_TYPES.map(type => {\n                return RSVP.hash({ type, queue: this.actionFetchDefaultQueue(type) });\n            })\n        );\n\n        const defaultQueues = defaultQueueResults\n            .filter(({ state, value }: PromiseResolution) => state === 'fulfilled' && !!value.queue)\n            .map((resolution: any) => resolution.value);\n\n        yield RSVP.allSettled(\n            defaultQueues.map((resolution: any) => {\n                const queue: any = resolution.queue;\n                return this.get('ensureQueueLoaded').perform(queue.id);\n            })\n        );\n\n        const defaultQueueIds = Object.fromEntries(defaultQueues.map((res: any) => [res.type, res.queue.id]));\n\n        yield waitForQueue('actions');\n\n        this.set('defaultQueueIds', defaultQueueIds);\n    }),\n\n    /**\n     * Abstraction to retrieve outbound conversation data for a given media type.\n     * @param type The given media type\n     * @returns An array of objects containing outbound data\n     */\n    getOutboundData(type: CommunicationType) {\n        switch (type) {\n            case 'emails':\n                return this.getOutboundDataForEmails();\n            case 'calls':\n                return this.getOutboundDataForPhones(type);\n            case 'messages':\n                return this.getOutboundDataForPhones(type);\n            default:\n                this.get('logger').error('ACD: Attempted to get outbound data for unsupported media type.', {\n                    remoteData: { type }\n                });\n                break;\n        }\n        return [] as OutboundData[];\n    },\n\n    /**\n     * Compile valid queue destinations and phone numbers for outbound conversations.\n     * @param interactionType The type of conversation\n     * @returns An array of objects containing outbound data\n     */\n    getOutboundDataForPhones(interactionType: CommunicationType) {\n        // Retrieve customer phone information\n        const customerPhoneNumbers = this.getCustomerPhones(interactionType);\n        if (customerPhoneNumbers.length === 0) {\n            return [];\n        }\n\n        return customerPhoneNumbers.map(entry => {\n            return {\n                type: interactionType,\n                phoneNumber: entry.data.display,\n                e164: entry.data.e164,\n                acceptsSMS: !!entry.data.acceptsSMS,\n                entryType: entry.phoneType,\n                entityType: 'externalcontacts/contact',\n                id: entry.id\n            } as OutboundPhoneData;\n        });\n    },\n\n    /**\n     * Compile valid queue destinations and emails for outbound conversations.\n     * Note: Since we don't know which queues are configured for email upfront, we need to make\n     * some assumptions for the oubound conversation:\n     *\n     * 1) We can use a queue that recieved an email conversation\n     * 2) We can use a default email queue if configured\n     * 3) We otherwise know before attempting to create the conversation\n     *\n     * @returns An array of objects containing outbound data\n     */\n    getOutboundDataForEmails() {\n        const customerEmails = this.getCustomerEmails();\n\n        if (customerEmails.length === 0) {\n            return [];\n        }\n\n        return customerEmails.map(entry => {\n            return {\n                type: 'emails',\n                email: entry.data,\n                entryType: entry.emailType,\n                id: entry.id\n            } as OutboundEmailData;\n        });\n    },\n\n    /**\n     * Extract email address from an exteranl participant attached to the conversation.\n     * @returns An array of valid email destinations\n     */\n    getCustomerEmails() {\n        type EmailData = {\n            data: string;\n            emailType: EmailType;\n            id: string;\n        };\n\n        if (this.get('externalContact')) {\n            const emails: EmailData[] = EMAIL_TYPES.reduce((customerEmails: EmailData[], currentType: EmailType) => {\n                customerEmails = Array.isArray(customerEmails) ? customerEmails : [];\n                const contact = this.get('externalContact') || {};\n                const emailData = get(contact, currentType);\n                const id = get(contact, 'id');\n                if (emailData) {\n                    customerEmails.push({\n                        data: emailData,\n                        emailType: currentType,\n                        id\n                    } as EmailData);\n                }\n                return customerEmails;\n            }, [] as EmailData[]);\n\n            return uniqBy(emails, e => e.data);\n        }\n\n        return [] as EmailData[];\n    },\n\n    /**\n     * Extract phone numbers from an exteranl participant attached to the conversation.\n     * @param interactionType - The conversation type\n     * @returns An array of valid phone number destinations\n     */\n    getCustomerPhones(interactionType: CommunicationType) {\n        type PhoneData = {\n            data: {\n                display: string;\n                e164: string;\n                acceptsSMS?: boolean;\n            };\n            phoneType: PhoneType;\n            id: string;\n        };\n\n        if (this.get('externalContact')) {\n            const phones: PhoneData[] = PHONE_TYPES.reduce((customerPhones: PhoneData[], currentType: PhoneType) => {\n                const contact = this.get('externalContact') || {};\n                const phoneData = get(contact, currentType);\n                const id = get(contact, 'id');\n                customerPhones = Array.isArray(customerPhones) ? customerPhones : [customerPhones];\n                if (phoneData && isValidPhoneData(phoneData, interactionType)) {\n                    customerPhones.push({\n                        data: phoneData,\n                        phoneType: currentType,\n                        id\n                    } as PhoneData);\n                }\n                return customerPhones;\n            }, [] as PhoneData[]);\n\n            return uniqBy(phones, p => (p.data ? p.data.e164 : p));\n        }\n        return [] as PhoneData[];\n    },\n\n    /**\n     * Request a new conversation from Public API with given outbound conversation data\n     * @param selection - Given conversation data\n     * @returns The request promise\n     */\n    createOutboundInteraction(selection: OutboundData) {\n        const interactionType = get(selection, 'type');\n        let outboundRequest;\n\n        switch (interactionType) {\n            case 'calls':\n                outboundRequest = this.actionCreateCall(selection);\n                break;\n            case 'messages':\n                outboundRequest = this.actionCreateMessage(selection);\n                break;\n            case 'emails':\n                outboundRequest = this.actionCreateEmail(selection);\n                break;\n            default:\n                this.actionDisplayError('purecloud.acdInteraction.customerMediaPivot.error.unknownType');\n                this.get('logger').error('ACD: Attempted to create outbound conversation with unknown media type', {\n                    remoteData: { type: interactionType }\n                });\n\n                return RSVP.Promise.reject(`\n                    Attempted to create outbound conversation with unknown media type: ${interactionType}.\n                `);\n        }\n\n        this.set('creatingOutboundConversation', true);\n\n        return outboundRequest\n            .catch((error: any) => {\n                const type = singularizeMediaType(interactionType);\n                const messageKey = `purecloud.acdInteraction.customerMediaPivot.error.${type}`;\n                this.actionDisplayError(messageKey);\n                this.get('logger').error('ACD: Error creating outbound conversation.', {\n                    remoteData: { error }\n                });\n            })\n            .finally(() => {\n                this.set('creatingOutboundConversation', false);\n            });\n    },\n\n    /**\n     * Utility to easily grab the typed popover element.\n     */\n    getPopover() {\n        const eId = this.get('elementId');\n        const popoverId = `#popover-${eId}`;\n        const popover: GuxPopoverListBeta = document.querySelector(popoverId);\n        return popover;\n    },\n\n    /**\n     * Bind target click event for gux-popover.\n     */\n    bindPopoverTarget() {\n        const eId = this.get('elementId');\n        const targetId = `#target-${eId}`;\n        const listId = `#list-${eId}`;\n        const popover = this.getPopover();\n\n        this._popoverTargetClickHandler = (evt: any) => {\n            evt.preventDefault();\n\n            if (!popover) return;\n\n            if (popover.isOpen) {\n                popover.isOpen = false;\n            } else {\n                popover.isOpen = true;\n\n                Ember.run.later(() => {\n                    (document as any).querySelector(listId).guxFocusFirstItem();\n                }, 10);\n            }\n            this.set('outboundPopoverVisible', popover.isOpen);\n        };\n\n        this._popoverTargetKeydownHandler = (evt: any) => {\n            if (evt.code === 32 && this._popoverTargetClickHandler) {\n                this._popoverTargetClickHandler(evt);\n            }\n        };\n\n        const targetEl = document.querySelector(targetId);\n        if (targetEl) {\n            targetEl.addEventListener('click', this._popoverTargetClickHandler);\n            targetEl.addEventListener('keydown', this._popoverTargetKeydownHandler);\n        }\n    },\n\n    /**\n     * Unbind target click event for gux-popover.\n     */\n    unbindPopoverTarget() {\n        const eId = this.get('elementId');\n        const targetId = `#target-${eId}`;\n        const targetEl = document.querySelector(targetId);\n        if (targetEl) {\n            if (this._popoverTargetClickHandler) {\n                targetEl.removeEventListener('click', this._popoverTargetClickHandler);\n            }\n            if (this._popoverTargetKeydownHandler) {\n                targetEl.removeEventListener('keydown', this._popoverTargetKeydownHandler);\n            }\n        }\n    },\n\n    /**\n     * Bind gux-popover dismissal event.\n     */\n    bindPopover() {\n        const popover = this.getPopover();\n        const eId = this.get('elementId');\n        const popoverId = `#popover-${eId}`;\n\n        if (!popover) return;\n\n        this._popoverDismissHandler = () => {\n            this.set('outboundPopoverVisible', false);\n            popover.isOpen = false;\n        };\n\n        const popoverEl = this.element.querySelector(popoverId) || document.querySelector(popoverId);\n        if (popoverEl) {\n            popoverEl.addEventListener('guxdismiss', this._popoverDismissHandler);\n        }\n\n        this._popoverFocusoutHandler = (evt: any) => this.focusListener(evt, popover);\n        popover.addEventListener('focusout', this._popoverFocusoutHandler);\n    },\n\n    /**\n     * Unbind gux-popover dismissal event.\n     */\n    unbindPopover() {\n        const popover = this.getPopover();\n        const eId = this.get('elementId');\n        const popoverId = `#popover-${eId}`;\n\n        if (!popover) return;\n\n        const popoverEl = this.element.querySelector(popoverId) || document.querySelector(popoverId);\n        if (popoverEl && this._popoverDismissHandler) {\n            popoverEl.removeEventListener('guxdismiss', this._popoverDismissHandler);\n        }\n\n        if (this._popoverFocusoutHandler) {\n            popover.removeEventListener('focusout', this._popoverFocusoutHandler);\n        }\n    },\n\n    /**\n     * Focus listener for keyboard focus out.\n     */\n    focusListener(evt: any, popover: any) {\n        if (!popover) return;\n        if (!evt.relatedTarget || !popover.contains(evt.relatedTarget)) {\n            if (!popover) return;\n            popover.isOpen = false;\n        }\n    },\n\n    /**\n     * @Action\n     * Closure action passed to the component to be invoked at the parent level\n     */\n    actionCreateCall: (selection: OutboundData) => warnClosureAction('actionCreateCall', { selection }),\n\n    /**\n     * @Action\n     * Closure action passed to the component to be invoked at the parent level\n     */\n    actionCreateMessage: (selection: OutboundData) => warnClosureAction('actionCreateMessage', { selection }),\n\n    /**\n     * @Action\n     * Closure action passed to the component to be invoked at the parent level\n     */\n    actionCreateEmail: (selection: OutboundData) => warnClosureAction('actionCreateEmail', { selection }),\n\n    /**\n     * @Action\n     * Closure action passed to the component to be invoked at the parent level\n     */\n    actionDisplayError: (error: any, options: any = {}) => warnClosureAction('actionDisplayError', { error, options }),\n\n    /**\n     * @Action\n     * Closure action passed to the component to be invoked at the parent level\n     */\n    actionFetchDefaultQueue: (type: CommunicationType) => warnClosureAction('actionFetchDefaultQueue', { type }),\n\n    /**\n     * @Action\n     * Closure action passed to the component to be invoked at the parent level\n     */\n    actionFetchQueue: (queueId: string, options: any) => warnClosureAction('actionFetchQueue', { queueId, options }),\n\n    init() {\n        this._super(...arguments);\n        this.set('queues', []);\n        this.set('defaultQueueIds', {} as Record<CommunicationType, string>);\n        this.get('loadDefaultQueues').perform();\n        this.get('ensureAgentQueueLoaded').perform();\n    },\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n        this.get('ensureAgentQueueLoaded').perform();\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.bindPopover();\n        this.bindPopoverTarget();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.unbindPopover();\n        this.unbindPopoverTarget();\n    },\n\n    actions: {\n        processOutboundInteraction(option: any) {\n            this.createOutboundInteraction(option).catch((err: any) => {\n                this.get('logger').error('Unable to create conversation', { err });\n            });\n\n            // Hides the popover after selecting an interaction\n            const popover = this.getPopover();\n\n            if (!popover) return;\n\n            this.set('outboundPopoverVisible', false);\n            popover.isOpen = false;\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"zKfoMIg7\",\"block\":\"[[[10,0],[15,0,[29,[\\\"interaction-add interaction-add-contact \\\",[52,[33,1],\\\"enabled\\\"]]]],[12],[1,\\\"\\\\n    \\\"],[10,\\\"button\\\"],[14,0,\\\"customer-group-outbound-options new-outbound btn btn-link\\\"],[15,\\\"title\\\",[28,[37,2],[\\\"purecloud.startNewConversation\\\"],null]],[15,1,[29,[\\\"target-\\\",[36,3]]]],[15,\\\"aria-expanded\\\",[29,[[36,4]]]],[15,\\\"aria-label\\\",[28,[37,2],[\\\"purecloud.acdInteraction.customerMediaPivot.newInteraction.srIntro\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"        \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"start-new-interaction\\\"],[14,\\\"icon-name\\\",\\\"add\\\"],[15,\\\"screenreader-text\\\",[28,[37,2],[\\\"purecloud.acdInteraction.customerMediaPivot.newInteraction.srIntro\\\"],null]],[12],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,\\\"gux-popover-list\\\"],[15,1,[29,[\\\"popover-\\\",[36,3]]]],[14,0,\\\"popover-outbound\\\"],[15,\\\"for\\\",[29,[\\\"target-\\\",[36,3]]]],[14,\\\"position\\\",\\\"bottom-start\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-list\\\"],[15,1,[29,[\\\"list-\\\",[36,3]]]],[14,0,\\\"customer-outbound-options\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,6],[[28,[37,6],[[33,7]],null]],null],\\\"key\\\",[[[1,\\\"                \\\"],[10,\\\"gux-list-item\\\"],[15,\\\"onClick\\\",[28,[37,8],[[30,0],\\\"processOutboundInteraction\\\",[30,1]],null]],[12],[1,\\\"\\\\n                    \\\"],[10,1],[15,0,[29,[\\\"outbound-option outbound-option-type-\\\",[30,1,[\\\"type\\\"]]]]],[12],[1,\\\"\\\\n                        \\\"],[10,1],[14,0,\\\"outbound-option-icon\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,9],[[30,1,[\\\"type\\\"]],\\\"calls\\\"],null],[[[1,\\\"                                \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"svg-icon\\\"],[14,\\\"icon-name\\\",\\\"roster-phone\\\"],[15,\\\"screenreader-text\\\",[28,[37,2],[\\\"purecloud.acdInteraction.customerMediaPivot.newInteraction.type.call\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,9],[[30,1,[\\\"type\\\"]],\\\"emails\\\"],null],[[[1,\\\"                                \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"svg-icon\\\"],[14,\\\"icon-name\\\",\\\"deprecated/roster-email\\\"],[15,\\\"screenreader-text\\\",[28,[37,2],[\\\"purecloud.acdInteraction.customerMediaPivot.newInteraction.type.email\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,9],[[30,1,[\\\"type\\\"]],\\\"messages\\\"],null],[[[1,\\\"                                \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"svg-icon\\\"],[14,\\\"icon-name\\\",\\\"roster-sms\\\"],[15,\\\"screenreader-text\\\",[28,[37,2],[\\\"purecloud.acdInteraction.customerMediaPivot.newInteraction.type.message\\\"],null]],[12],[13],[1,\\\"\\\\n                            \\\"]],[]],null]],[]]]],[]]],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n\\\\n                        \\\"],[10,1],[14,0,\\\"outbound-option-contact-info\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,1],[14,0,\\\"outbound-option-contact-address\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,9],[[30,1,[\\\"type\\\"]],\\\"emails\\\"],null],[[[1,\\\"                                    \\\"],[1,[30,1,[\\\"email\\\"]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                    \\\"],[1,[30,1,[\\\"phoneNumber\\\"]]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                            \\\"],[13],[1,\\\"\\\\n                            \\\"],[10,1],[14,0,\\\"outbound-option-contact-queue\\\"],[15,\\\"aria-label\\\",[28,[37,2],[\\\"purecloud.acdInteraction.customerMediaPivot.newInteraction.queue\\\"],null]],[12],[1,\\\"\\\\n                                \\\"],[1,[30,1,[\\\"queue\\\",\\\"name\\\"]]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[\\\"option\\\"],false,[\\\"if\\\",\\\"hasOutboundOptions\\\",\\\"t\\\",\\\"elementId\\\",\\\"outboundPopoverVisible\\\",\\\"each\\\",\\\"-track-array\\\",\\\"outboundOptions\\\",\\\"action\\\",\\\"eq\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel/interaction-outbound-contact/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\n\nexport default Component.extend({\n    classNames: ['interaction-queue-status'] as const,\n    classNameBindings: ['isOnQueue:is-on-queue:is-off-queue'] as const,\n\n    messageKey: computed('isOnQueue', function (): string {\n        if (this.get('isOnQueue')) {\n            return 'purecloud.acdInteraction.waitingOnQueueMessageInteraction';\n        }\n        return 'purecloud.acdInteraction.noInteractions';\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"8ivGxFXk\",\"block\":\"[[[10,0],[14,0,\\\"interaction-queue-status-container\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"interactions-container\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"interactions-image\\\"],[12],[1,\\\"\\\\n            \\\"],[10,2],[14,0,\\\"queue-message\\\"],[14,\\\"role\\\",\\\"status\\\"],[14,\\\"aria-live\\\",\\\"polite\\\"],[12],[1,\\\"\\\\n                \\\"],[2,[28,[37,0],[[33,1]],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"t\\\",\\\"messageKey\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel/interaction-queue-status/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed, get } from '@ember/object';\nimport ComputedProperty from '@ember/object/computed';\nimport { debounce, schedule } from '@ember/runloop';\nimport type { AssignmentStateType, WorkitemInteraction } from '@genesys/genesys-cloud-conversation-utils';\nimport { Conversation, Maybe } from 'web-directory/types';\nimport { warnClosureAction } from 'web-directory/utils/acd';\nimport moment from 'web-directory/utils/dates';\nimport { doFocus } from 'web-directory/utils/focus-management';\nimport type { GuxPopoverCustomEvent } from 'genesys-spark-components';\n\ntype InteractionGroup = {\n    id?: string;\n    groupId: string;\n    interactions: Conversation[];\n    sortTimestamp?: Date;\n};\n\nfunction _isWorkitem(interaction: any): boolean {\n    return !!interaction.workitem;\n}\n\nexport default Component.extend({\n    classNames: ['acd-interactions-list', 'chat-roster', 'gray-arrow-v2'],\n    classNameBindings: [\n        'hasActiveInteraction:has-active-interaction:not-has-active-interaction',\n        'onQueueOrInteracting'\n    ],\n\n    /**\n     * @Attribute\n     * Values passed from the parent component context.\n     * These values are bound to readonly properties for render below.\n     */\n    state: null as Maybe<Record<string, any>>,\n\n    /**\n     * Flag for showing interaction settings\n     * TODO: Another good candidate for a small render component\n     */\n    showSettings: false,\n\n    /**\n     * `true` if the dial pad dropdown (mini conversation creation popovers) should\n     * be open\n     */\n    showCallControls: false,\n\n    /**\n     * `true` if the email dropdown (mini conversation creation popovers) should\n     * be open\n     */\n    showEmailDialog: false,\n\n    /**\n     * `true` if the message dropdown (mini conversation creation popovers) should\n     * be open\n     */\n    showMessageDialog: false,\n\n    /**\n     * Object of interaction start timestamps (epoch millis) used for stably sorting\n     * groups of conversations keyed by group guid\n     */\n    _groupSortTimes: null as Maybe<Record<string, number>>,\n\n    /**\n     * feature toggle for PURE-3835 division aware external contacts\n     */\n    acdExternalContactDivNameFT: computed.readOnly('state.featureToggles.acdExternalContactDivNameFT'),\n    acdExternalContactWorkitemsDivNameFT: computed.readOnly(\n        'state.featureToggles.acdExternalContactWorkitemsDivNameFT'\n    ),\n\n    /**\n     * `true` if the multipanel experience should be shown\n     */\n    useMultipanel: computed.readOnly('state.useMultipanel'),\n\n    /**\n     * The currently selected interaction\n     */\n    selectedInteraction: computed.readOnly('state.selectedInteraction') as ComputedProperty<Maybe<Conversation>>,\n\n    /**\n     * An array of all interactions we consider active\n     */\n    activeInteractions: computed.readOnly('state.activeInteractions') as ComputedProperty<Conversation[]>,\n\n    /**\n     * An array of Workitems we consider active\n     */\n    activeWorkitems: computed.readOnly('state.activeWorkitems') as ComputedProperty<WorkitemInteraction[]>,\n\n    /**\n     * True/false if our presence is 'on queue'\n     */\n    isOnQueue: computed.readOnly('state.isOnQueue') as ComputedProperty<boolean>,\n\n    /**\n     * True/false if the app is in the legacy popout context (i.e. PEF)\n     */\n    isPopout: computed.readOnly('state.isPopout') as ComputedProperty<boolean>,\n\n    /**\n     * True/false if streaming service (i.e. the Hawk websocket) is connected\n     */\n    streamingConnected: computed.readOnly('state.streamingConnected') as ComputedProperty<boolean>,\n\n    /**\n     * True/false if ACD panel is the selected panel and not closed\n     */\n    acdPanelOpen: computed.readOnly('state.acdPanelOpen') as ComputedProperty<boolean>,\n\n    /**\n     * An array of conversation guids where customers are flagged as typing\n     */\n    isTypingInteractions: computed.readOnly('state.isTypingInteractions') as ComputedProperty<string[]>,\n\n    /**\n     * Pass through property containing emergency location data\n     */\n    emergencyLocationData: computed.readOnly('state.e911.emergencyLocationData'),\n\n    /**\n     * True/false whether we should render the emergency location component\n     */\n    emergencyLocationOn: computed.readOnly('state.e911.emergencyLocationOn'),\n\n    /**\n     * The current user's guid\n     */\n    currentUserId: computed.readOnly('state.currentUserId') as ComputedProperty<string>,\n\n    /**\n     * An array of external contact objects from external contacts service\n     */\n    externalContacts: computed.readOnly('state.externalContacts.contacts'),\n\n    /**\n     * True/false permission check for canCreateEmail\n     */\n    permCanCreateEmail: computed.readOnly('state.permissions.canCreateEmail') as ComputedProperty<boolean>,\n\n    /**\n     * True/false permission check for permCanSendMessage\n     */\n    permCanSendMessage: computed.readOnly('state.permissions.canSendMessage') as ComputedProperty<boolean>,\n\n    /**\n     * True/false permission check for permCanMakeCall\n     */\n    permCanMakeCall: computed.readOnly('state.permissions.canMakeCall') as ComputedProperty<boolean>,\n\n    /**\n     * True/false permission check for permCanViewExternalContacts\n     */\n    permCanViewExternalContacts: computed.readOnly(\n        'state.permissions.canViewExternalContacts'\n    ) as ComputedProperty<boolean>,\n\n    /**\n     * True/false feature toggle flag for active conversations\n     */\n    hasActiveInteraction: computed.bool('interactionGroups.length'),\n\n    /**\n     * True/false if the current user's presence is 'on queue' or otherwise has active conversations\n     */\n    onQueueOrInteracting: computed.or('isOnQueue', 'hasActiveInteraction'),\n\n    /**\n     * Flag to indicate if the user has permission and feature toggle to view cases\n     */\n    canViewCasesViaRequest: computed.readOnly('state.featureToggles.caseAssociationRequestFT'),\n    canViewWorkitemCases: computed.readOnly('state.featureToggles.caseAgentWorkitemUIFT'),\n\n    /**\n     * Computed to group interactions together by externalContactId.  If there\n     * is not externalContactId present or the conversation is in an alerting state,\n     * the conversation will be grouped by itself.  Conversation in the group will\n     * be sorted by oldest to newest.\n     */\n    interactionGroups: computed(\n        'activeInteractions.[]',\n        'activeWorkitems.[]',\n        'externalContacts.[]',\n        'actionGetCanonicalContactSync',\n        'activeInteractions.@each.externalContactId',\n        'activeWorkitems.@each.customer',\n        'activeInteractions.@each.startTimestamp',\n        'acdExternalContactDivNameFT',\n        function (this: any): InteractionGroup[] {\n            const conversations: any[] = this.get('activeInteractions').sortBy('startTimestamp');\n            const workitems: WorkitemInteraction[] = this.get('activeWorkitems');\n            const groups: any[] = [];\n            const getCanonicalContactSync = this.get('actionGetCanonicalContactSync');\n\n            const interactions: any[] = conversations.concat(workitems);\n\n            interactions.forEach(interaction => {\n                const externalContactId =\n                    get(interaction, 'externalContactId') ||\n                    get(interaction, 'customer.externalContactId') ||\n                    undefined;\n                const { id: groupId } = getCanonicalContactSync(externalContactId) || {};\n                const isAlerting = _isWorkitem(interaction)\n                    ? (get(interaction, 'workitem.assignmentState') as AssignmentStateType) === 'Alerting'\n                    : get(interaction, 'isAlerting');\n                let group;\n\n                /**\n                 * We have a contact and we are not alerting\n                 * lets see if we already have a group for it\n                 */\n                if (groupId && !isAlerting) {\n                    group = groups.find(group => {\n                        const { groupId: id } = group;\n                        return this.get('acdExternalContactDivNameFT')\n                            ? groupId === id &&\n                                  // Have to make sure the group we are thinking of adding this interaction to isnt alerting\n                                  !get(group, 'interactions.0.isAlerting') &&\n                                  (get(group, 'interactions.0.workitem.assignmentState') as\n                                      | undefined\n                                      | AssignmentStateType) !== 'Alerting'\n                            : groupId === id;\n                    });\n                }\n\n                if (this.get('acdExternalContactDivNameFT')) {\n                    if (group) {\n                        /**\n                         * Conversations that have a contact, group and\n-                        * are not in the alerting state get added to the\n-                        * group.\n                         */\n                        if (!group.interactions.includes(interaction)) {\n                            group.interactions.push(interaction);\n                        }\n                    } else {\n                        /**\n                         * If we are alerting, dont have a group, or dont have a contact,\n                         * just add the interaction to its own group. There can be instances\n                         * where there is no external contact and groupId will be undefined.\n                         */\n                        groups.push({\n                            groupId,\n                            interactions: [interaction]\n                        });\n                    }\n                } else {\n                    if (!groupId || isAlerting) {\n                        // conversations without contacts or in alerting state\n                        // are added as groups with a single conversation\n                        groups.push({\n                            interactions: [interaction]\n                        });\n                    } else if (!group) {\n                        groups.push({\n                            groupId,\n                            interactions: [interaction]\n                        });\n                    } else {\n                        group.interactions.push(interaction);\n                    }\n                }\n            });\n\n            return groups;\n        }\n    ),\n\n    /**\n     * Computed to decorate groups with the following attributes:\n     *\n     * 1. id: either the externalContactId or conversationId)\n     * 2. sortTimestamp: either the startTimestamp or a recent timestamp for stable sort\n     *\n     * Additionally, the computed will store timestamps for the oldest conversation\n     * in a group for stable sorting.\n     */\n    decoratedGroups: computed(\n        'interactionGroups.[]',\n        'acdExternalContactDivNameFT',\n        'acdExternalContactWorkitemsDivNameFT',\n        function (): InteractionGroup[] {\n            const groups: any[] = this.get('interactionGroups');\n            // Work against a local copy so this getter stays pure. Writing `_groupSortTimes`\n            // during computation causes a mutate-during-revalidation cycle under the Glimmer\n            // renderer (backtracking rerender), which was contributing to the Agent Workspace\n            // freeze in ATLAS-2452 / SERVOPS-70118. We read the previously persisted values for\n            // stable sorting and persist any newly-computed values after render (see below).\n            // priorSortTimes is read-only: the previously persisted values, used only to keep an\n            // existing contact's sort position stable across recomputations. sortTimes is built\n            // fresh and holds only the groups present in this pass, so it becomes what we persist.\n            //\n            // Seeding the persisted map from the full prior map (the previous approach) carried\n            // forward entries for contacts that are no longer present. _persistGroupSortTimes then\n            // wrote those stale entries back on afterRender — racing _cleanUpSortTimes, which had\n            // just pruned them, and non-deterministically resurrecting them (SERVOPS: \"ec2 was\n            // removed\" flapped in the release build). Persisting only current groups makes the two\n            // paths agree.\n            const priorSortTimes = this.get('_groupSortTimes') || {};\n            const sortTimes: Record<string, number> = {};\n            const decorated = groups.map((group: any) => {\n                const ecId = group.groupId;\n                const startTimestamps = group.interactions.map((interaction: any) => {\n                    if (_isWorkitem(interaction)) {\n                        const ts = get(interaction, 'workitem.dateDue');\n                        return moment(ts).valueOf();\n                    }\n                    return get(interaction, 'startTimestamp');\n                });\n\n                let oldest = Math.min(...startTimestamps);\n                if (this.get('acdExternalContactDivNameFT')) {\n                    if (this.get('acdExternalContactWorkitemsDivNameFT')) {\n                        const isAlerting = _isWorkitem(group.interactions[0])\n                            ? (get(group.interactions[0], 'workitem.assignmentState') as AssignmentStateType) ===\n                              'Alerting'\n                            : get(group.interactions[0], 'isAlerting');\n                        if (isAlerting) {\n                            // +1 ensures alerting groups sort strictly above any non-alerting\n                            // group that also received Date.now() in the same synchronous tick\n                            group.sortTimestamp = Date.now() + 1;\n                        }\n                    } else if (get(group.interactions[0], 'isAlerting')) {\n                        // alerting interactions at top\n                        group.sortTimestamp = Date.now() + 1;\n                    } else if (ecId) {\n                        if (priorSortTimes[ecId] && priorSortTimes[ecId] < oldest) {\n                            oldest = priorSortTimes[ecId];\n                        }\n                        sortTimes[ecId] = oldest;\n                        group.sortTimestamp = oldest;\n                    } else {\n                        group.sortTimestamp = oldest;\n                    }\n                } else {\n                    if (ecId) {\n                        if (priorSortTimes[ecId] && priorSortTimes[ecId] < oldest) {\n                            oldest = priorSortTimes[ecId];\n                        }\n                        sortTimes[ecId] = oldest;\n                        group.sortTimestamp = oldest;\n                    } else if (get(group.interactions[0], 'isAlerting')) {\n                        // alerting interactions at top\n                        group.sortTimestamp = Date.now();\n                    } else {\n                        group.sortTimestamp = oldest;\n                    }\n                }\n\n                // bound with {{each}} to reduce re-renders\n                group.id = ecId || group.interactions[0].id;\n\n                return group;\n            });\n\n            // Persist the computed sort times outside of the render pass so we never dirty\n            // tracked state while Glimmer is revalidating this getter.\n            this._persistGroupSortTimes(sortTimes);\n\n            return decorated;\n        }\n    ),\n\n    /**\n     * Computed to start the groups by the newest sortTimestamp to oldest timestamp.\n     */\n    sortedGroups: computed('decoratedGroups.[]', function (): InteractionGroup[] {\n        const groups = this.get('decoratedGroups').sortBy('sortTimestamp').reverse();\n        return groups;\n    }),\n\n    /**\n     * Computed to determine if the user can make outbound conversations.\n     */\n    enableOutboundContact: computed.readOnly('permCanViewExternalContacts'),\n\n    /**\n     * Computed to determine if a session share is active (i.e. cobrowse or screenshare). If so,\n     * we want to disable outbound controls.\n     */\n    sessionShareActive: computed.readOnly('selectedInteraction.sessionShareActive'),\n\n    /**\n     * @Action\n     * Closure action passed to the component to be invoked at the parent level\n     */\n    actionGoOnQueue: (): void => warnClosureAction('actionGoOnQueue', {}),\n\n    /**\n     * @Action\n     * Closure action passed to the component to be invoked at the parent level\n     */\n    actionGetCanonicalContactSync: (externalContactId: string): any =>\n        warnClosureAction('actionGetCanonicalContactSync', { externalContactId }),\n\n    /**\n     * Persists the sort times computed by `decoratedGroups` without mutating tracked state\n     * during the render pass. Scheduled on `afterRender` and guarded against teardown so it\n     * cannot dirty state mid-revalidation. Skips the write when nothing changed to avoid\n     * scheduling redundant re-renders.\n     */\n    _persistGroupSortTimes(sortTimes: Record<string, number>) {\n        const current = this.get('_groupSortTimes') || {};\n        const currentKeys = Object.keys(current);\n        const nextKeys = Object.keys(sortTimes);\n        const unchanged =\n            currentKeys.length === nextKeys.length && nextKeys.every(key => current[key] === sortTimes[key]);\n        if (unchanged) {\n            return;\n        }\n\n        schedule('afterRender', this, () => {\n            if (!this.get('isDestroyed') && !this.get('isDestroying')) {\n                this.set('_groupSortTimes', sortTimes);\n            }\n        });\n    },\n\n    /**\n     * Remove sort time record for stored contact groups\n     */\n    _cleanUpSortTimes() {\n        if (!this.get('isDestroyed') && !this.get('isDestroying')) {\n            const groupIds = this.get('sortedGroups').map(g => g.groupId);\n            const sortTimes = this.get('_groupSortTimes') || {};\n            const updatedSortTimes = Object.fromEntries(\n                Object.entries(sortTimes).filter(([ts]) => groupIds.includes(ts))\n            );\n            this.set('_groupSortTimes', updatedSortTimes);\n        }\n    },\n\n    guxdismiss(event: GuxPopoverCustomEvent<void>) {\n        const targetForAttr = event.target.for;\n        doFocus(this, `#${targetForAttr}`);\n        this.send('closePopover');\n    },\n\n    init() {\n        this._super(...arguments);\n    },\n\n    didUpdateAttrs() {\n        this._super(...arguments);\n        debounce(() => this._cleanUpSortTimes(), 100);\n    },\n\n    actions: {\n        goOnQueue() {\n            this.actionGoOnQueue();\n        },\n        onCloseDialpad() {\n            this.set('showCallControls', false);\n        },\n\n        onCloseEmailDialog() {\n            this.set('showEmailDialog', false);\n        },\n\n        onCloseMessageDialog() {\n            this.set('showMessageDialog', false);\n        },\n\n        togglePopover() {\n            this.set('showSettings', !this.get('showSettings'));\n        },\n\n        closePopover() {\n            this.set('showSettings', false);\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"OxDVFTob\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[1,[28,[35,2],null,[[\\\"canCreateCall\\\",\\\"canCreateEmail\\\",\\\"canCreateMessage\\\",\\\"canShowActions\\\",\\\"currentUserId\\\",\\\"emergencyLocationData\\\",\\\"emergencyLocationOn\\\",\\\"acdPanelOpen\\\",\\\"hasOngoingInteraction\\\",\\\"agentAddressOnBehalfOfQueue\\\"],[[33,3],[33,4],[33,5],[28,[37,6],[[28,[37,7],[[33,8],[33,9]],null]],null],[33,10],[33,11],[33,12],[33,13],[33,14],[33,15,[\\\"featureToggles\\\",\\\"agentAddressOnBehalfOfQueue\\\"]]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"interaction-groups-header\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,\\\"role\\\",\\\"heading\\\"],[14,\\\"aria-level\\\",\\\"2\\\"],[14,\\\"tabindex\\\",\\\"-1\\\"],[14,0,\\\"header-text\\\"],[14,1,\\\"interactions-heading\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,16],[\\\"purecloud.acdInteraction.activeConversations\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"button\\\"],[14,1,\\\"interaction-settings-popover-target\\\"],[15,\\\"onclick\\\",[28,[37,17],[[30,0],\\\"togglePopover\\\"],null]],[15,\\\"aria-label\\\",[28,[37,16],[\\\"purecloud.settings\\\"],null]],[15,\\\"title\\\",[28,[37,16],[\\\"purecloud.settings\\\"],null]],[14,0,\\\"settings-toggle btn btn-link menu-selector\\\"],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"settings\\\"],[15,\\\"screenreader-text\\\",[28,[37,16],[\\\"purecloud.settings\\\"],null]],[12],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"gux-popover\\\"],[14,1,\\\"interaction-settings-popover\\\"],[14,\\\"position\\\",\\\"bottom-start\\\"],[14,\\\"for\\\",\\\"interaction-settings-popover-target\\\"],[15,\\\"isOpen\\\",[36,18]],[12],[1,\\\"\\\\n\\\"],[41,[33,18],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"section-header feature-header\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"header\\\"],[12],[1,[28,[35,16],[\\\"purecloud.acdInteraction.interactionSettings.header\\\"],null]],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"button\\\"],[15,\\\"aria-label\\\",[28,[37,16],[\\\"common.close\\\"],null]],[14,0,\\\"btn btn-link close-interaction-settings\\\"],[15,\\\"onclick\\\",[28,[37,17],[[30,0],\\\"closePopover\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"popover-action\\\",\\\"close\\\"],[14,\\\"icon-name\\\",\\\"close\\\"],[15,\\\"screenreader-text\\\",[28,[37,16],[\\\"common.close\\\"],null]],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,0],[12],[1,[34,19]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[51,[28,[37,7],[[33,8],[33,9]],null]],[[[41,[33,3],[[[6,[39,21],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[[33,22],\\\"acd-interactions-panel.interaction-list toggle on behalf dialog\\\"]],[[\\\"default\\\"],[[[[1,\\\"                    \\\"],[10,\\\"button\\\"],[14,0,\\\"new-call new-outbound btn btn-link menu-selector\\\"],[15,\\\"aria-label\\\",[28,[37,16],[\\\"purecloud.startNewCallTooltip\\\"],null]],[15,\\\"title\\\",[28,[37,16],[\\\"purecloud.startNewCallTooltip\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"phone\\\"],[15,\\\"screenreader-text\\\",[28,[37,16],[\\\"purecloud.startNewCallTooltip\\\"],null]],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,22],[[[1,\\\"                        \\\"],[10,0],[14,0,\\\"dialpad-dropdown add-participants\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,23],null,[[\\\"showDialpadToggle\\\",\\\"showTitle\\\",\\\"actionClose\\\"],[true,true,[28,[37,17],[[30,0],\\\"onCloseDialpad\\\"],null]]]]],[1,\\\"\\\\n\\\"],[41,[33,12],[[[1,\\\"                                \\\"],[1,[28,[35,24],null,[[\\\"emergencyLocationData\\\",\\\"showResetButton\\\",\\\"personId\\\",\\\"showTitle\\\"],[[33,11],false,[33,10],true]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]]]]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,4],[[[6,[39,21],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[[33,25],\\\"acd-interactions-panel.interaction-list show email dialog\\\"]],[[\\\"default\\\"],[[[[1,\\\"                    \\\"],[10,\\\"button\\\"],[14,0,\\\"new-email new-outbound btn btn-link menu-selector\\\"],[15,\\\"aria-label\\\",[28,[37,16],[\\\"purecloud.startNewEmailTooltip\\\"],null]],[15,\\\"title\\\",[28,[37,16],[\\\"purecloud.startNewEmailTooltip\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"message-email\\\"],[15,\\\"screenreader-text\\\",[28,[37,16],[\\\"purecloud.startNewEmailTooltip\\\"],null]],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,25],[[[1,\\\"                        \\\"],[10,0],[14,0,\\\"email-dialog\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,26],null,[[\\\"showTitle\\\",\\\"actionClose\\\"],[true,[28,[37,17],[[30,0],\\\"onCloseEmailDialog\\\"],null]]]]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]]]]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,5],[[[6,[39,21],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[[33,27],\\\"acd-interactions-panel.interaction-list show on behalf sms dialog\\\"]],[[\\\"default\\\"],[[[[1,\\\"                    \\\"],[10,\\\"button\\\"],[14,0,\\\"new-message new-outbound btn btn-link menu-selector\\\"],[15,\\\"aria-label\\\",[28,[37,16],[\\\"purecloud.startNewSmsInteractionTooltip\\\"],null]],[15,\\\"title\\\",[28,[37,16],[\\\"purecloud.startNewSmsInteractionTooltip\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,28],null,[[\\\"subMessageType\\\"],[\\\"sms\\\"]]]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,27],[[[1,\\\"                        \\\"],[10,0],[14,0,\\\"dialpad-dropdown add-participants\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,0],[14,0,\\\"message-dialog\\\"],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,29],null,[[\\\"showTitle\\\",\\\"actionClose\\\",\\\"agentAddressOnBehalfOfQueue\\\"],[true,[28,[37,17],[[30,0],\\\"onCloseMessageDialog\\\"],null],[33,15,[\\\"featureToggles\\\",\\\"agentAddressOnBehalfOfQueue\\\"]]]]]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]]]]],[]],null]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"interactions\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,31],[[28,[37,31],[[33,32]],null]],null],\\\"id\\\",[[[1,\\\"        \\\"],[1,[28,[35,33],null,[[\\\"group\\\",\\\"externalContacts\\\",\\\"selectedInteraction\\\",\\\"selectedWorkitem\\\",\\\"enableOutboundContact\\\",\\\"isTypingInteractions\\\",\\\"hideInteractionButtons\\\",\\\"acdAnnounceMonitoring\\\",\\\"acdAnnounceMonitoringDigital\\\",\\\"acdEngagementSourcesFT\\\",\\\"inactivityTimeoutFT\\\",\\\"acdExternalContactDivNameFT\\\",\\\"acdExternalContactWorkitemsDivNameFT\\\",\\\"enableCustomerIntent\\\",\\\"draftUpdateHash\\\",\\\"useNewNav\\\",\\\"canViewCasesViaRequest\\\",\\\"canViewWorkitemCases\\\",\\\"caseCacheVersion\\\",\\\"getCaseForInteraction\\\",\\\"permissions\\\",\\\"actionCreateCall\\\",\\\"actionCreateMessage\\\",\\\"actionCreateEmail\\\",\\\"actionDisplayError\\\",\\\"actionAnswerInteraction\\\",\\\"actionAnswerWorkitemInteraction\\\",\\\"actionDeclineInteraction\\\",\\\"actionDeclineWorkitemInteraction\\\",\\\"actionSelectInteraction\\\",\\\"actionSelectWorkitemInteraction\\\",\\\"actionLoadParticipantName\\\",\\\"actionFetchDefaultQueue\\\",\\\"actionFetchQueue\\\",\\\"actionLoadQueue\\\",\\\"loadDivisionName\\\"],[[30,1],[33,34],[33,35],[33,15,[\\\"selectedWorkitem\\\"]],[33,36],[33,15,[\\\"isTypingInteractions\\\"]],[33,15,[\\\"hideInteractionButtons\\\"]],[33,15,[\\\"featureToggles\\\",\\\"acdAnnounceMonitoring\\\"]],[33,15,[\\\"featureToggles\\\",\\\"acdAnnounceMonitoringDigital\\\"]],[33,15,[\\\"featureToggles\\\",\\\"acdEngagementSourcesFT\\\"]],[33,15,[\\\"featureToggles\\\",\\\"inactivityTimeoutFT\\\"]],[33,37],[33,38],[33,15,[\\\"permissions\\\",\\\"canViewCustomerIntents\\\"]],[33,15,[\\\"draftUpdateHash\\\"]],[33,15,[\\\"useNewNav\\\"]],[33,39],[33,40],[33,41],[33,42],[33,15,[\\\"permissions\\\"]],[33,43],[33,44],[33,45],[33,46],[33,47],[33,48],[33,49],[33,50],[33,51],[33,52],[33,53],[33,54],[33,55],[33,56],[33,57]]]]],[1,\\\"\\\\n\\\"]],[1]],[[[41,[33,58],[[[41,[28,[37,6],[[33,14]],null],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"no-interactions-roster-text\\\"],[15,\\\"aria-label\\\",[28,[37,16],[\\\"purecloud.acdInteraction.interactionRosterv2.startInteractionForScreenReader\\\"],null]],[12],[1,\\\"\\\\n                    \\\"],[10,1],[14,0,\\\"sr-only\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,16],[\\\"purecloud.acdInteraction.interactionRosterv2.startInteractionForScreenReader\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,1],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,16],[\\\"purecloud.acdInteraction.interactionRosterv2.startInteraction\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"no-interactions-roster-text\\\"],[12],[1,\\\"\\\\n\\\\n                \\\"],[10,1],[14,0,\\\"sr-only\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,16],[\\\"purecloud.acdInteraction.interactionRosterv2.startInteractionOrForScreenReader\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,1],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,16],[\\\"purecloud.acdInteraction.interactionRosterv2.startInteraction\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,1],[14,0,\\\"or\\\"],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,[28,[35,16],[\\\"purecloud.acdInteraction.interactionRosterv2.or\\\"],null]],[13],[1,\\\"\\\\n\\\\n                \\\"],[10,1],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-button\\\"],[14,\\\"accent\\\",\\\"secondary\\\"],[15,\\\"disabled\\\",[52,[28,[37,6],[[33,59]],null],\\\"disabled\\\"]],[14,0,\\\"onQueueButton\\\"],[15,\\\"onClick\\\",[28,[37,17],[[30,0],\\\"goOnQueue\\\"],null]],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,16],[\\\"purecloud.acdInteraction.interactionRosterv2.goOnQueue\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,1],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,[28,[35,16],[\\\"purecloud.acdInteraction.interactionRosterv2.acceptInteraction\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[]]],[13]],[\\\"group\\\"],false,[\\\"if\\\",\\\"useMultipanel\\\",\\\"acd-interactions-panel-v2/interaction-roster/interaction-roster-header\\\",\\\"permCanMakeCall\\\",\\\"permCanCreateEmail\\\",\\\"permCanSendMessage\\\",\\\"not\\\",\\\"or\\\",\\\"sessionShareActive\\\",\\\"isPopout\\\",\\\"currentUserId\\\",\\\"emergencyLocationData\\\",\\\"emergencyLocationOn\\\",\\\"acdPanelOpen\\\",\\\"hasActiveInteraction\\\",\\\"state\\\",\\\"t\\\",\\\"action\\\",\\\"showSettings\\\",\\\"acd-interactions-panel/interaction-settings\\\",\\\"unless\\\",\\\"drop-down\\\",\\\"showCallControls\\\",\\\"dial-pad\\\",\\\"emergency-location\\\",\\\"showEmailDialog\\\",\\\"acd-interactions-panel/interaction-create-email\\\",\\\"showMessageDialog\\\",\\\"acd-interactions-panel/interaction-messages-icon\\\",\\\"acd-interactions-panel/interaction-create-message\\\",\\\"each\\\",\\\"-track-array\\\",\\\"sortedGroups\\\",\\\"acd-interactions-panel/interaction-group\\\",\\\"externalContacts\\\",\\\"selectedInteraction\\\",\\\"enableOutboundContact\\\",\\\"acdExternalContactDivNameFT\\\",\\\"acdExternalContactWorkitemsDivNameFT\\\",\\\"canViewCasesViaRequest\\\",\\\"canViewWorkitemCases\\\",\\\"caseCacheVersion\\\",\\\"getCaseForInteraction\\\",\\\"actionCreateCall\\\",\\\"actionCreateMessage\\\",\\\"actionCreateEmail\\\",\\\"actionDisplayError\\\",\\\"actionAnswerInteraction\\\",\\\"actionAnswerWorkitemInteraction\\\",\\\"actionDeclineInteraction\\\",\\\"actionDeclineWorkitemInteraction\\\",\\\"actionSelectInteraction\\\",\\\"actionSelectWorkitemInteraction\\\",\\\"actionLoadParticipantName\\\",\\\"actionFetchDefaultQueue\\\",\\\"actionFetchQueue\\\",\\\"actionLoadQueue\\\",\\\"loadDivisionName\\\",\\\"onQueueOrInteracting\\\",\\\"streamingConnected\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel/interaction-roster/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport { reads } from '@ember/object/computed';\nimport Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport MessageNotificationsMixin from 'web-directory/mixins/chat-service/message-notifications';\nimport EmbeddedMessageEventHandlerMixin from 'web-directory/mixins/embedded-message-event-handler';\n\nexport default Component.extend(LoggerMixin, MessageNotificationsMixin, EmbeddedMessageEventHandlerMixin, {\n    classNames: ['interaction-script'],\n    tagName: 'iframe',\n    attributeBindings: ['role', 'allow', 'title'],\n    role: 'presentation',\n    allow: ['clipboard-write'],\n    title: computed('intl', function () {\n        return this.intl.safestring('purecloud.acdInteraction.scripts');\n    }),\n\n    didInsertElement() {\n        this._super(...arguments);\n        this._updateFrameUrl(this.frameUrl);\n        this._lastFrameUrl = this.frameUrl;\n    },\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n        const currentFrameUrl = this.frameUrl;\n        // Always update and track, even if URL is the same (maintains observer behavior)\n        this._lastFrameUrl = currentFrameUrl;\n        if (this.element) {\n            this._updateFrameUrl(currentFrameUrl);\n        }\n    },\n\n    intl: service(),\n    session: service(),\n    permissions: service(),\n\n    hasScriptViewPermission: reads('permissions.canViewPublishedScripts'),\n\n    frameUrl: computed('selectedInteraction', 'intl.isoLocale', 'session.publicApiUser.id', function () {\n        const pathName = '/scripter/';\n        const queryParameter = `?locale=${this.get('intl.isoLocale')}&user=${this.get('session.publicApiUser.id')}`;\n        const interactionId = this.get('selectedInteraction.id');\n        const isNotListeningOrAssistingAgent = !this.get('selectedInteraction.myselfIsMonitorV2');\n        const interactionSupportsScripts =\n            (this.get('selectedInteraction.isCall') ||\n                this.get('selectedInteraction.isCallback') ||\n                this.get('selectedInteraction.isChat') ||\n                this.get('selectedInteraction.isSms') ||\n                this.get('selectedInteraction.isEmail')) &&\n            isNotListeningOrAssistingAgent;\n\n        let hash = '#';\n        if (this.hasScriptViewPermission && interactionId && interactionSupportsScripts) {\n            hash = `#interactionId=${interactionId}`;\n        }\n\n        const url = `${pathName}${queryParameter}${hash}`;\n\n        this.logger.debug('Scripter component - handleLocationChange change', url);\n\n        return url;\n    }),\n\n    // Uses location.replace to update the url (rather than binding to \"src\")\n    //  in order to prevent the URL change from adding an entry to the page history\n    //  and allowing the browser back button to reverse it.\n    _updateFrameUrl: function (newUrl) {\n        // If the frame isn't ready yet, set a callback for later\n        if (!this.element.contentWindow) {\n            this.element.onload = () => {\n                this._updateFrameUrl(newUrl);\n                this.element.onload = null;\n            };\n        } else {\n            this.element.contentWindow.location.replace(newUrl);\n            const interactionId = this.get('selectedInteraction.id');\n            if (interactionId && (!newUrl || !newUrl.includes(`#interactionId=${interactionId}`))) {\n                // Scripter is not applicable for this interaction (i.e. permissions/interaction type)\n                // Dispatch an event so the parent component does not indefinitely wait on script resolution\n                const scriptReportCallback = this.scriptAvailabilityChanged;\n                if (typeof scriptReportCallback === 'function') {\n                    scriptReportCallback(false);\n                }\n            }\n        }\n    },\n\n    //These handlers are used by the EmbeddedMessageEventHandlerMixin when the message type matches the key\n    messageHandlers: {\n        toast(data) {\n            if (data.publishOnUserInteraction) {\n                data.clickHandler = () => {\n                    this.sendMessage('publish', data.publishOnUserInteraction);\n                };\n            }\n            this.sendEngageNotification(data);\n        },\n        scriptexists(data) {\n            this.scriptAvailabilityChanged(data);\n        }\n    }\n});\n","import { inject as service } from '@ember/service';\nimport Component from '@ember/component';\nimport {\n    GC_CONVERSATION_ID_URL_REPLACEMENT_TOKEN,\n    GC_LANG_TAG_URL_REPLACEMENT_TOKEN,\n    GC_USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN,\n    PC_ENV_URL_REPLACEMENT_TOKEN\n} from 'web-directory/models/app';\n\nconst BASE_APP_CONFIG = {\n    sandbox: ['allow-scripts', 'allow-same-origin', 'allow-forms', 'allow-modals', 'allow-popups'],\n    path: 'cobrowse-next/viewer.html',\n    query: `lang=${GC_LANG_TAG_URL_REPLACEMENT_TOKEN}&env=${PC_ENV_URL_REPLACEMENT_TOKEN}&conversationId=${GC_CONVERSATION_ID_URL_REPLACEMENT_TOKEN}&usePopupAuth=${GC_USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN}`\n};\n\nexport default Component.extend({\n    _intl: service('intl'),\n    _apps: service('apps'),\n    fullscreen: service(),\n\n    // Ember Comp Bits\n    classNames: ['interaction-co-browse-next'],\n\n    /**\n     * @attribute\n     * Interaction model passed in\n     */\n    interaction: null,\n\n    /**\n     * @attribute\n     * Determines whether fullscreen button is shown or not\n     */\n    allowFullscreen: true,\n\n    // Props\n    appName: 'Co-Browse Viewer',\n    cobrowseInterapption: null,\n\n    isFullScreen: false,\n\n    init() {\n        this._super(...arguments);\n        this.appName = this._intl.t('purecloud.acdInteraction.cobrowseNext.viewerInterapptionName');\n    },\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n\n        const interaction = this.interaction;\n        this.set('cobrowseInterapption', this._buildCobrowseInterapption(interaction));\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.fullscreen.endFullScreen();\n    },\n\n    _buildCobrowseInterapption(interaction) {\n        if (!interaction || !interaction.get('id')) {\n            return null;\n        }\n\n        const appCfg = Object.assign(\n            {\n                name: this.appName,\n                //\"fullscreen 'none'\" is explicitly required to disable fullscreen for nested iframes\n                permissions: this.allowFullscreen ? ['fullscreen'] : [\"fullscreen 'none'\"]\n            },\n            BASE_APP_CONFIG\n        );\n\n        const cobrowseInterapption = this._apps.buildValidInterapption(\n            'dynamic-app-provider-cobrowse-next',\n            'cobrowse-viewer',\n            appCfg,\n            true\n        );\n\n        cobrowseInterapption.set('interactionId', interaction.get('id'));\n        cobrowseInterapption.set('interactionType', 'conversation');\n\n        return cobrowseInterapption;\n    },\n    closeCobrowse() {\n        this.setProperties({\n            'interaction.cobrowseSessionShareActive': false,\n            'interaction.sessionShareActiveOnLoad': false,\n            'interaction.isCobrowseV2Disconnected': true,\n            'interaction.isCobrowseV2': false\n        });\n    },\n    fullScreen() {\n        if (!this.isFullScreen) {\n            this.fullscreen.startFullScreen();\n            this.isFullScreen = !this.isFullScreen;\n        } else {\n            this.fullscreen.endFullScreen();\n            this.isFullScreen = !this.isFullScreen;\n        }\n    },\n    actions: {\n        onAppApiCall(apiCall) {\n            switch (apiCall.action) {\n                case 'closeScreenShare':\n                    this.closeCobrowse();\n                    break;\n                case 'fullscreen':\n                    this.fullScreen();\n                    break;\n                default:\n                    this._apps.handleAppApiCall(apiCall);\n                    break;\n            }\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"phmSX+DL\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[1,[28,[35,2],null,[[\\\"appConfig\\\",\\\"name\\\",\\\"hidden\\\",\\\"class\\\",\\\"appsSdkEnabled\\\",\\\"title\\\",\\\"onAppApiCall\\\"],[[33,1],[33,3],false,\\\"visible\\\",true,\\\"components.embeddedAppTitles.cobrowseViewer\\\",[28,[37,4],[[30,0],\\\"onAppApiCall\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],null]],[],false,[\\\"if\\\",\\\"cobrowseInterapption\\\",\\\"app-embed\\\",\\\"appName\\\",\\\"action\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel/interaction-session-share/interaction-co-browse-next/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { inject } from '@ember/service';\nimport { run } from '@ember/runloop';\nimport { computed } from '@ember/object';\nimport Popper from 'popper.js';\nimport type { Conversation } from 'web-directory/types';\nimport { Maybe } from 'web-directory/types';\n\nexport interface SessionShareProvider {\n    title: string;\n    id: string;\n    action: () => void;\n}\n\nexport enum MediaRequestResponseState {\n    PENDING,\n    ACCEPTED,\n    DECLINED,\n    TIMEDOUT,\n    CANCELLED,\n    ERRORED\n}\n\nexport interface CodeResponse {\n    conversation: Conversation;\n    addCommunicationCode: string;\n    sourceCommunicationId: string;\n    jwt: string;\n    features: Map<string, boolean>;\n}\n\nexport interface MediaRequestResponse {\n    state: MediaRequestResponseState;\n}\n\nexport default Component.extend({\n    tagName: 'ul',\n    classNames: ['session-share-dropdown'],\n    classNameBindings: ['displayDropdown:display-dropdown:hide'],\n\n    permissions: inject('permissions'),\n    intl: inject('intl'),\n\n    attachTo: null as any,\n    attachClickHandler: false,\n    interaction: null as any,\n\n    _displayDropdown: false,\n\n    _popper: null as Maybe<Popper>,\n    _targetEl: null as Maybe<HTMLElement>,\n    _onWindowClick: null as Maybe<(event: Event) => void>,\n    _onTargetClick: null as Maybe<(event: Event) => void>,\n\n    actions: {\n        hide() {\n            this.set('_displayDropdown', false);\n        },\n        // Default implementation is to just run the provider action\n        selectProvider(provider: SessionShareProvider) {\n            run.once(provider, provider.action);\n            this.send('hide');\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        run.schedule('afterRender', this, this.setup);\n    },\n\n    willDestroyElement() {\n        if (this._popper) {\n            this._popper.destroy();\n            this._popper = null;\n        }\n\n        const targetEl = this._targetEl;\n\n        if (this._onWindowClick) {\n            window.removeEventListener('click', this._onWindowClick);\n            this._onWindowClick = null;\n        }\n        if (targetEl && this._onTargetClick) {\n            targetEl.removeEventListener('click', this._onTargetClick);\n            this._onTargetClick = null;\n        }\n\n        this._super(...arguments);\n    },\n\n    setup() {\n        const targetEl = document.querySelector(this.get('attachTo'));\n        if (!targetEl) {\n            // Let's wait for a bit and check again...\n            // This might happen when we are waiting on asynchronous helpers\n            run.later(() => this.setup(), 500);\n\n            return;\n        }\n\n        if (this._targetEl) {\n            // We've already setup, dont try again\n            return;\n        }\n\n        this._targetEl = targetEl as Maybe<HTMLElement>;\n\n        const popoverEl = this.element;\n        this._popper = new Popper(targetEl, popoverEl, {\n            placement: 'bottom',\n            modifiers: {\n                flip: {\n                    behavior: ['bottom', 'top', 'left']\n                },\n                preventOverflow: {\n                    padding: 1\n                }\n            }\n        });\n\n        this._onTargetClick = run.bind(this, () => {\n            run.once(this, this.handleClick);\n        });\n        targetEl.addEventListener('click', this._onTargetClick);\n\n        this._onWindowClick = run.bind(this, this.handleOutsideClick);\n        window.addEventListener('click', this._onWindowClick);\n    },\n\n    handleClick() {\n        this.toggleProperty('_displayDropdown');\n\n        run.join(() => run.scheduleOnce('afterRender', this, () => this._popper && this._popper.scheduleUpdate()));\n    },\n\n    handleOutsideClick(event: Event) {\n        if (!this.get('displayDropdown')) {\n            return;\n        }\n\n        const target = event.target as HTMLElement;\n        const attachTarget = document.querySelector(this.attachTo);\n        const isAttachTarget = target === attachTarget || (attachTarget && attachTarget.contains(target));\n        const isInsideComponent = this.element && this.element.contains(target);\n        const isInsideAttachTarget = attachTarget && attachTarget.contains(target);\n\n        if (!isAttachTarget && !isInsideComponent && !isInsideAttachTarget) {\n            this.send('hide');\n        }\n    },\n\n    beginCobrowse: () => {\n        console.error('Parent needs to Supply Cobrowse Start Action');\n    },\n\n    beginScreenShare: () => {\n        console.error('Parent needs to Supply ScreenShare Start Action');\n    },\n\n    providers: computed('interaction', function () {\n        return [\n            {\n                title: this.get('intl').t('purecloud.acdInteraction.cobrowseNext.startCobrowse'),\n                id: 'cobrowse',\n                action: this.beginCobrowse\n            },\n            {\n                title: this.get('intl').t('purecloud.acdInteraction.sessionShare.start'),\n                id: 'session-share',\n                action: this.beginScreenShare\n            }\n        ];\n    }),\n\n    displayDropdown: computed(\n        '_displayDropdown',\n        'permissions.canViewAcdCoBrowseV2ForVoice',\n        'permissions.canViewAcdScreenShare',\n        'interaction.type',\n        function () {\n            if (this.get('_displayDropdown')) {\n                if (this.get('interaction.type') === 'message') {\n                    this.set('_displayDropdown', false);\n                    run.once(this.get('providers')[0], this.beginCobrowse, {\n                        sendNotification: true\n                    });\n                    return this.get('_displayDropdown');\n                }\n\n                if (\n                    !this.get('permissions.canViewAcdScreenShare') &&\n                    this.get('permissions.canViewAcdCoBrowseV2ForVoice')\n                ) {\n                    this.set('_displayDropdown', false);\n                    run.once(this.get('providers')[0], this.beginCobrowse, {\n                        sendNotification: true\n                    });\n                    return this.get('_displayDropdown');\n                }\n\n                let targetEl = this._targetEl;\n                if (!targetEl) {\n                    return false;\n                }\n\n                return this.get('_displayDropdown');\n            }\n\n            let targetEl = this._targetEl;\n            if (!targetEl) {\n                return false;\n            }\n\n            return this.get('_displayDropdown');\n        }\n    )\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"IK+yIXYu\",\"block\":\"[[[42,[28,[37,1],[[28,[37,1],[[33,2]],null]],null],null,[[[1,\\\"    \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"button\\\"],[14,0,\\\"btn btn-link btn-sm\\\"],[15,\\\"onclick\\\",[28,[37,3],[[30,0],\\\"selectProvider\\\",[30,1]],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[30,1,[\\\"title\\\"]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[10,0],[14,0,\\\"session-share-arrow\\\"],[12],[13]],[\\\"provider\\\"],false,[\\\"each\\\",\\\"-track-array\\\",\\\"providers\\\",\\\"action\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel/interaction-session-share/session-share-dropdown/template.hbs\",\"isStrictMode\":false});","import { equal } from '@ember/object/computed';\nimport Component from '@ember/component';\n\nexport default Component.extend({\n    classNames: ['interaction-settings'],\n\n    openSection: 'avSettings',\n\n    showAvSettings: equal('openSection', 'avSettings'),\n    showCallForwarding: equal('openSection', 'callForwarding'),\n\n    actions: {\n        toggleSection(sectionName) {\n            this.set('openSection', sectionName);\n        },\n        close() {\n            this.set('parentView.showDropdown', false);\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"nWHL2P3X\",\"block\":\"[[[10,0],[14,0,\\\"settings-section\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"section-body queues\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[34,0]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[15,0,[29,[\\\"section-body media \\\",[52,[51,[33,2]],\\\"hide\\\"]]]],[12],[1,\\\"\\\\n        \\\"],[1,[34,3]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"components/application-preferences/interactions\\\",\\\"unless\\\",\\\"showAvSettings\\\",\\\"device-selection-with-preview\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel/interaction-settings/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport { later, cancel } from '@ember/runloop';\nimport Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport AcdUtilitiesMixin from 'web-directory/mixins/acd-utilities';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nconst WAIT_FOR_TRANSCRIPTION = 2000;\n\nexport default Component.extend(AcdUtilitiesMixin, LoggerMixin, {\n    classNames: ['interaction-voicemail'],\n    classNameBindings: ['audioPlayerOptions.basicAudioPlayer:basic-audio-player'],\n    acdVoicemailService: service('acdvoicemail'),\n    webrtc: service('webrtc'),\n    session: service('session'),\n    permissions: service('permissions'),\n    selectedInteraction: null,\n    loadingVoicemail: false,\n    voicemail: null,\n    voicemailId: null,\n    transcription: null,\n    transcriptionLocked: true,\n    errorLoadingVoicemail: false,\n\n    audioPlayerOptions: {\n        basicAudioPlayer: true\n    },\n    audioOutputDeviceId: computed('webrtc.defaultOutputDevice.deviceId', function () {\n        return this.get('webrtc.defaultOutputDevice.deviceId');\n    }),\n\n    noAcdVoicemailStreamAccess: computed.not('permissions.hasAcdVoicemailStreamAccess'),\n\n    getVoicemail(voicemailId) {\n        this.set('loadingVoicemail', true);\n        this.set('errorLoadingVoicemail', false);\n\n        this.acdVoicemailService\n            .getVoicemailMediaInfo(voicemailId)\n            .then(voicemail => {\n                const mediaInfo = {\n                    mediaUri: voicemail.mediaFileUri,\n                    waveformData: voicemail.waveformData\n                };\n                let audioObject = {\n                    mediaUris: [mediaInfo]\n                };\n                this.set('voicemail', audioObject);\n                this.set('voicemailId', voicemailId);\n\n                return this.handleAsyncTranscription(voicemailId);\n            })\n            .catch(err => {\n                this.set('errorLoadingVoicemail', true);\n                const messageKey = 'purecloud.acdInteraction.voicemail.errors.loadingVoicemail';\n                this._displayError(messageKey);\n                this.logger.error('ACD: Error retrieving voicemail:', {\n                    error: err,\n                    remoteData: {\n                        voicemailId\n                    }\n                });\n            })\n            .finally(() => {\n                this.set('loadingVoicemail', false);\n            });\n    },\n\n    /**\n     * - Requests voicemail from acdvoicemail, verifies voicemail transcription.\n     * - When there's a transcription, update and unlock the transcription tab.\n     * - When there's no transcription wait the estimatedTime for transcription for another attempt.\n     */\n    handleAsyncTranscription(voicemailId) {\n        this.acdVoicemailService\n            .getVoicemailWithTranscription(voicemailId)\n            .then(voicemail => {\n                if (voicemail.transcription) {\n                    this.set('transcription', voicemail.transcription);\n                    this.set('transcriptionLocked', false);\n                } else {\n                    // amount of time since voicemail was created\n                    const timeElapsed = Date.now() - Date.parse(voicemail.createdDate);\n                    let estimatedTimeForTranscription =\n                        voicemail.audioRecordingDurationSeconds * WAIT_FOR_TRANSCRIPTION;\n                    // voicemail.createdDate may not be defined use full estimatedTime\n                    if (timeElapsed) {\n                        estimatedTimeForTranscription -= timeElapsed;\n                    }\n                    // Blocks infinite recursion\n                    if (estimatedTimeForTranscription >= 0) {\n                        const runTimer = later(() => {\n                            this.handleAsyncTranscription(voicemailId);\n                        }, estimatedTimeForTranscription);\n                        this.timers.push(runTimer);\n                    }\n                }\n            })\n            .catch(err => {\n                this._displayError('purecloud.acdInteraction.voicemail.errors.transcription');\n                this.logger.error('ACD: Error retrieving voicemail transcription', {\n                    error: err,\n                    remoteData: {\n                        voicemailId\n                    }\n                });\n            });\n    },\n\n    init() {\n        this._super(...arguments);\n        this.set('timers', []);\n    },\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n        if (this.get('noAcdVoicemailStreamAccess')) return; // don't fetch voicemail stuff if no stream access\n        const newVoicemailId = this.get(\n            'selectedInteraction.participantForCurrentUser.callbacks.firstObject.voicemail.id'\n        );\n        if (this.selectedInteraction && newVoicemailId && this.voicemailId != newVoicemailId) {\n            this.getVoicemail(newVoicemailId);\n        }\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.set('voicemail', null);\n        this.timers.forEach(runTimer => {\n            cancel(runTimer);\n        });\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"hmtUa68R\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"loading-voicemail\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[34,2]],[1,\\\"\\\\n        \\\"],[10,1],[14,0,\\\"loading-text\\\"],[12],[1,[28,[35,3],[\\\"purecloud.acdInteraction.loadingVoicemail\\\"],null]],[1,\\\" \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,4],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"alerts\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-inline-alert\\\"],[14,\\\"accent\\\",\\\"error\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,3],[\\\"purecloud.acdInteraction.voicemail.errors.noStreamAccess\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"    \\\"],[10,\\\"gux-tabs\\\"],[14,0,\\\"voicemail-tabs\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-tab-list\\\"],[14,\\\"slot\\\",\\\"tab-list\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-tab\\\"],[14,\\\"tab-id\\\",\\\"1-1\\\"],[12],[1,[28,[35,3],[\\\"purecloud.acdInteraction.voicemail.tabs.playback\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[10,\\\"gux-tab\\\"],[14,\\\"tab-id\\\",\\\"1-2\\\"],[15,0,[52,[33,5],\\\"hidden\\\"]],[15,\\\"gux-disabled\\\",[36,5]],[12],[1,\\\"\\\\n                \\\"],[10,1],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,3],[\\\"purecloud.acdInteraction.voicemail.tabs.transcription\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"gux-tab-panel\\\"],[14,\\\"tab-id\\\",\\\"1-1\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,6],null,[[\\\"recording\\\",\\\"theme\\\",\\\"inErrorState\\\",\\\"audioPlayerOptions\\\",\\\"audioOutputDeviceId\\\"],[[33,7],\\\"dark\\\",[33,8],[33,9],[33,10]]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"gux-tab-panel\\\"],[14,\\\"tab-id\\\",\\\"1-2\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"transcription\\\"],[12],[1,[34,11]],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[]]]],[],false,[\\\"if\\\",\\\"loadingVoicemail\\\",\\\"snail-progress\\\",\\\"t\\\",\\\"noAcdVoicemailStreamAccess\\\",\\\"transcriptionLocked\\\",\\\"audio-player-v2\\\",\\\"voicemail\\\",\\\"errorLoadingVoicemail\\\",\\\"audioPlayerOptions\\\",\\\"audioOutputDeviceId\\\",\\\"transcription\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel/interaction-voicemail/template.hbs\",\"isStrictMode\":false});","/**\n * PLEASE DO NOT ADD TO THIS FILE WITHOUT NOTIFYING ACE.\n *\n * We are in the process of restructing the Agent UI. Changes\n * made to this file may easily be missed in migration efforts\n * and will 100% result in conflicts.\n *\n * Reach out to Josh Rucker with questions.\n */\nimport Ember from 'ember';\nimport { inject as service } from '@ember/service';\nimport { bool, notEmpty, reads, readOnly, not, equal, alias, and, union, or, gt } from '@ember/object/computed';\nimport { getOwner } from '@ember/application';\nimport { A } from '@ember/array';\nimport Component from '@ember/component';\nimport { on } from '@ember/object/evented';\nimport { Promise, all } from 'rsvp';\nimport EmberObject, { get, getProperties, observer, computed } from '@ember/object';\nimport Clipboard from 'clipboard';\nimport { task, timeout } from 'ember-concurrency';\nimport webrtcConversationTypes from 'web-directory/utils/webrtc-conversation-types';\nimport _ from 'lodash';\nimport flatten from 'lodash/flatten';\nimport { throttle, run, bind } from '@ember/runloop';\nimport { INTEGRATIONS_INTERAPPTIONS_PROVIDER_ID } from 'web-directory/app-providers/integration-interapptions-provider';\nimport { NONE_PANEL } from 'web-directory/components/acd-interactions-panel/interaction/panel-manager/component';\nimport ExternalContactModel from 'web-directory/models/external-contact';\nimport RelateExternalContactModel from 'web-directory/models/externalcontacts/contact';\nimport GroupModel from 'web-directory/models/group';\nimport PersonModel from 'web-directory/models/person';\nimport QueueModel from 'web-directory/models/queue';\nimport { getCommunicationType, interactionHasSipErrors, warnClosureAction } from 'web-directory/utils/acd';\nimport participantStatus from 'web-directory/utils/acdParticipantStatuses';\nimport { AppsV2 } from 'web-directory/utils/apps';\nimport { formatTimestampForDisplay } from 'web-directory/utils/date-time';\nimport moment from 'web-directory/utils/dates';\nimport { doFocus } from 'web-directory/utils/focus-management';\nimport { addPageAction } from 'web-directory/utils/newrelic';\nimport { isTesting } from 'web-directory/utils/testing';\nimport { standardTransformationFtComputedDepKey, transformPanelId } from 'web-directory/utils/transform-panels';\nimport TtlCache from 'web-directory/utils/ttl-cache';\n\nconst INTERACTIONS_PATH = 'engage/admin/interactions';\n\nconst NOTIFICATION_HANDLED_REJECTIONS = [\n    'CALL_ALREADY_PLACED',\n    'CALLABLE_PHONE_NUMBER_COLUMNS_EMPTY',\n    'CONTACT_ATTEMPT_LIMIT_REACHED',\n    'CONTACT_CALLABLE_EVALUATION_ERROR',\n    'CONTACT_UNCALLABLE',\n    'DO_NOT_CALL',\n    'INTERACTION_NO_LONGER_EXISTS',\n    'NO_DESTINATION_ADDRESS',\n    'NOT_CALLABLE_TIME',\n    'NUMBER_ATTEMPT_LIMIT_REACHED',\n    'NUMBER_UNCALLABLE',\n    'RULE',\n    'RULE_EVALUATION_ERROR'\n];\n\nconst NOTES_GADGET_STATE_KEY = 'notesGadget&notesGadgetProvider';\n\nconst scriptSizes = ['', 'flex-2', 'flex-4', 'flex-full'];\nconst AGENT_ASSIST_SUMMARY_KEY = 'agentAssistSummary';\n\n/**\n * Throttling time to initiate callback; avoiding multiple click and sending multiple request to backend\n */\nconst CALLBACK_THROTTLE_TIME = 1000;\n\nexport default Component.extend({\n    classNames: ['acd-interaction'],\n    classNameBindings: [\n        'isChat',\n        'isMessage',\n        'isCoBrowse',\n        'interaction.iAmConsultInitiator:is-consult',\n        'panelSizeClass',\n        'panelResizerEnabled:new-panel-resizer-on',\n        'panelsOverrideObject.panelsOverride:query-param-panels'\n    ],\n    // ==================================================================\n    // Services\n    // ==================================================================\n\n    acdcallback: service(),\n    acdchat: service(),\n    acdemail: service(),\n    acdsms: service(),\n    acdworkitem: service(),\n    ajax: service(),\n    application: service(),\n    chat: service(),\n    communication: service(),\n    contactlist: service(),\n    externalContacts: service(),\n    fullscreen: service(),\n    interactionService: service('interaction'),\n    intl: service(),\n    logger: service('stash-logger'),\n    notification: service(),\n    participantName: service(),\n    permissions: service(),\n    phone: service(),\n    phoneIntegrations: service(),\n    preferences: service(),\n    relate: service(),\n    session: service(),\n    sidebar: service(),\n    webrtc: service(),\n    queue: service(),\n    pigeon: service(),\n\n    // ==================================================================\n    // Lifecycle\n    // ==================================================================\n\n    init() {\n        this._super(...arguments);\n        this.set('_timers', []);\n\n        this.set('searchList', []);\n        this.set('agentEndedCallsWithError', []);\n        this.set('isStartingAutoCallback', false);\n        this.set('isEndingAutoCallback', false);\n        this.set('autoCallbackIds', []);\n        this.set('beginCallbackPromise', null);\n        this.chat.on('connected', this, this._joinChat);\n\n        // Panel Manager V3 Initialization\n        this.set('panelSizeMap', {});\n        this.set('forcedPanelSelectionMap', {});\n\n        const preferences = this.preferences;\n        const currentUserId = this.get('session.publicApiUser.id');\n\n        // NOTE: init() runs inside the Glimmer render transaction. Under Ember\n        // 3.28 a throw here puts the app into an unrecoverable render-error\n        // state (tolerated in 2.18). Guard against the preferences service not\n        // being resolvable/ready during the loading substate. See\n        // ember-3-migration spec.\n        if (preferences && typeof preferences.getPreference === 'function') {\n            preferences\n                .getPreference(`scripts.${this.get('session.publicApiUser.id')}`)\n                .then(({ scriptSize = '' } = {}) => {\n                    this.setProperties({\n                        scriptSize\n                    });\n                    preferences.setPreference(`scripts.${currentUserId}`, { scriptSize });\n                })\n                .catch(e => {\n                    this.logger.error('Error getting script preferences:', {\n                        error: e\n                    });\n                    this.setProperties({\n                        scriptSize: ''\n                    });\n                });\n\n            preferences\n                .getPreference(`panelManager.${currentUserId}`)\n                .then(result => this.set('panelSizeMap', result || {}))\n                .catch(e => {\n                    this.logger.error('Error getting panelManager preferences:', {\n                        error: e\n                    });\n                    this.set('panelSizeMap', {});\n                });\n        } else {\n            this.logger.error('Preferences service unavailable in interaction init; skipping preference load');\n            this.setProperties({ scriptSize: '' });\n            this.set('panelSizeMap', {});\n        }\n\n        this.pigeon.on('conversation-summary', this, this._handleConversationSummaryEvent);\n    },\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n\n        this._updateDivisionName();\n\n        const interaction = this.interaction;\n\n        if (interaction) {\n            this._joinChat();\n            this._updateCustomerParticipantName.perform();\n            this.retrieveNotesHistory.perform();\n            this.fetchCommunicationBasedACWSetting.perform();\n\n            this.set('prevInteractionId', get(interaction, 'id'));\n\n            const prevUseCommunicationACW = this.prevUseCommunicationACW;\n            const useCommunicationACW = this.useCommunicationACW;\n            if (useCommunicationACW !== prevUseCommunicationACW) {\n                this.set('prevUseCommunicationACW', useCommunicationACW);\n            }\n\n            /**\n             * Determines if the current interaction is different than the last interaction that rendered\n             */\n            let oldInteractionId = this._oldInteractionId;\n\n            if (oldInteractionId) {\n                // sometimes interaction refreshes causing the same interaction to trigger here twice\n                if (get(interaction, 'id') !== oldInteractionId) {\n                    /**\n                     * If the current interaction is different that the interaction rendered in the last frame.\n                     * Essentially triggering when the current interactions changes for any possible reason.\n                     */\n                    this._resetDropdown();\n                }\n            }\n\n            this.set('_oldInteraction', get(interaction, 'id'));\n        } else {\n            // If no interaction is selected, then the dropdowns should be reset for when an interaction has become selected\n            this._resetDropdown();\n\n            const workitem = this.workitem;\n            if (workitem) {\n                // when interaction is `null` and workitem is provided, we need to clear the\n                // `_customerParticipantName` in order for the workitem name to take its place\n                this.set('_customerParticipantName', null);\n            }\n        }\n\n        if (this.autoCallbackQueueId !== this.lastAutoCallbackQueueId) {\n            this._updateCallbackMediaSettings.perform();\n            this.set('lastAutoCallbackQueueId', this.autoCallbackQueueId);\n        }\n\n        const activeInteractions = this.activeInteractions || [];\n\n        this._determineActiveAttendedTransfers.perform();\n\n        const prevForcedPanelTrackingMap = this._didReceiveAttrsPrevForcedPanelTrackingMap || {};\n        const newForcedPanelTrackingMap = activeInteractions.reduce((acc, interaction) => {\n            const interactionId = get(interaction, 'id');\n            const showWrapup = this._shouldShowWrapup(interaction);\n            const requiresStructuredMessage = this._doesRequireStructuredMessage(interaction);\n            acc[interactionId] = { showWrapup, requiresStructuredMessage };\n            return acc;\n        }, {});\n        // Compare previous wrap up & requires structured message state to compute forced selection\n        // for all active interactions\n        const forcedSelectionMap = this.forcedPanelSelectionMap;\n        const newForcedSelectionMap = activeInteractions.reduce((acc, interaction) => {\n            const interactionId = interaction.get('id');\n            const panelContextKey = this.getInteractionPanelContextKey(interaction);\n            const prevData = prevForcedPanelTrackingMap[interactionId];\n            const newData = newForcedPanelTrackingMap[interactionId];\n            const panelsOverride = this.get('panelsOverrideObjectTx.panelsOverride');\n            if (newData.showWrapup && (!prevData || !prevData.showWrapup)) {\n                acc[panelContextKey] = 'wrapup';\n            } else if (\n                newData.requiresStructuredMessage &&\n                (!prevData || !prevData.requiresStructuredMessage) &&\n                (this.isNotPopout ||\n                    !panelsOverride ||\n                    (Array.isArray(panelsOverride) &&\n                        panelsOverride.includes(transformPanelId('responses', this.get('session.features') || {}))))\n            ) {\n                acc[panelContextKey] = 'responses';\n            } else {\n                // Maintain old forced selection\n                acc[panelContextKey] = forcedSelectionMap[panelContextKey];\n            }\n            return acc;\n        }, {});\n        this.set('forcedPanelSelectionMap', newForcedSelectionMap);\n        this.set('_didReceiveAttrsPrevForcedPanelTrackingMap', newForcedPanelTrackingMap);\n\n        const deploymentId = this.deploymentId;\n\n        if (this.get('interaction.subMessageType') === 'webmessaging') {\n            if (deploymentId && !this.cobrowseV2EnabledCache.has(deploymentId)) {\n                // fetch the enabled flag\n                this.communication\n                    .getDeploymentConfig(deploymentId)\n                    .then(config => {\n                        if (!this._componentDestroyed()) {\n                            if (\n                                config &&\n                                config.configurationVersion &&\n                                config.configurationVersion.cobrowse &&\n                                config.configurationVersion.cobrowse.enabled\n                            ) {\n                                this.cobrowseV2EnabledCache.put(\n                                    deploymentId,\n                                    config.configurationVersion.cobrowse.enabled\n                                );\n                            } else {\n                                this.cobrowseV2EnabledCache.put(deploymentId, false);\n                            }\n\n                            // notify property change since we're mutating the instance vs the ref\n                            this.notifyPropertyChange('cobrowseV2EnabledCache');\n                        }\n                    })\n                    .catch(err => {\n                        this.logger.error('Failed to get Deployment Config', {\n                            err\n                        });\n                        // Will try again in 5 mins\n                        this.cobrowseV2EnabledCache.put(deploymentId, false);\n\n                        // notify property change since we're mutating the instance vs the ref\n                        this.notifyPropertyChange('cobrowseV2EnabledCache');\n                    });\n            }\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.phone.on('agentEndedCallWithError', this, this._handleAgentEndedCallWithError);\n\n        this._setUpCopyBtn();\n        this._setUpExternalCustomerPhoneNumberCopyBtn();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n\n        this._timers.forEach(item => run.cancel(item));\n\n        // Note: relate.off() removed - was called incorrectly without handler reference\n        // If relate listener cleanup is needed, the handler must be stored and passed here\n\n        if (this.phone && typeof this.phone.off === 'function') {\n            this.phone.off('agentEndedCallWithError', this, this._handleAgentEndedCallWithError);\n        }\n\n        if (this.interactionCopyBtn) {\n            this.interactionCopyBtn.destroy();\n        }\n\n        if (this.chat && typeof this.chat.off === 'function') {\n            this.chat.off('connected', this, this._joinChat);\n        }\n\n        if (this.customerPhoneNumberCopyBtn) {\n            this.customerPhoneNumberCopyBtn.destroy();\n        }\n\n        if (this.pigeon && typeof this.pigeon.off === 'function') {\n            this.pigeon.off('conversation-summary', this, this._handleConversationSummaryEvent);\n        }\n\n        localStorage.removeItem(AGENT_ASSIST_SUMMARY_KEY);\n    },\n\n    // ==================================================================\n    // Attributes\n    // ==================================================================\n\n    /**\n     * The amount of time in `ms` to wait for a request to be initiated to determine if the action was initiated again.\n     * This is needed so the backend doesn't constantly get pinged with updates every time a key has been pressed. Instead\n     * if multiple keys are pressed in succession it will wait until this timeout has elapsed and then attempt to update.\n     */\n    requestTimeout: 500,\n\n    /**\n     * The max amount the conference participant counter can display before truncating\n     */\n    maxConferenceParticipantCounter: 9,\n\n    /**\n     * Map to store what conversations are currently being transferred\n     * `new Map<string, interaction>()`\n     */\n    currentActiveTransfers: new Map(),\n\n    /**\n     * `true` if the conference invite participant dropdown is currently open and displaying\n     */\n    showConferenceInviteDropdown: false,\n\n    /**\n     * `true` if the conference roster dropdown is currently open and displaying\n     */\n    showConferenceRoster: false,\n\n    /**\n     * `true` if the end call option is being shown. Only should be shown\n     * if the current call is a conference and the user is trying to end\n     * the call\n     */\n    showHangupChoiceDropdown: false,\n\n    // Action to fire when the subpanel tab selection changes\n    onSubPanelSelectionChanged: null,\n\n    // Maps panel -> panelSize. Initially loaded from preferences service\n    // and persisted on each change\n    panelSizeMap: null,\n\n    // The pool V2 to render that will manage interapptions\n    appPoolV2: null,\n    // Chromium 86 is crashing on the layout manager's use of web-components and adoptedStyleSheets\n    // Returning early so the ui tests can still run. It's gross, I know.\n    isTesting: isTesting,\n\n    // list of applicable interapption panels to render as tabs for the subpanel\n    interapptionPanels: null,\n\n    isScriptAvailable: false,\n    scriptSize: '',\n    acdVoicemailPlayerVisible: true,\n    room: null,\n    isEndingChat: false,\n    hideTransferButtons: null,\n    showTransferDropdown: false,\n    showConsultTransferDropdown: false,\n    showParkSmsDropdown: false,\n    cobrowseV2EnabledCache: new TtlCache({ defaultTtl: 300000 }),\n    forcedPanelSelectionMap: null,\n    isEndingSms: false,\n    isStructuredMessage: false,\n    interaction: null,\n    workitem: null,\n    interactionCopyBtn: null,\n    customerPhoneNumberCopyBtn: null,\n    isLoadingAcwRequest: false,\n    isDialingClbk: false,\n    isParking: false,\n    showNumbersDropdownClbk: false,\n    insertChatText: text => warnClosureAction('insertChatText', text),\n    insertSmsText: response => warnClosureAction('insertSmsText', response),\n    insertEmailText: text => warnClosureAction('insertEmailText', text),\n    loadDivisionName: divisionId => warnClosureAction('loadDivisionName', divisionId),\n    cannedResponseChatText: null,\n    cannedResponseSmsText: null,\n    cannedResponseEmailText: null,\n    structuredMessage: null,\n\n    /**\n     * @attribute\n     * determines whether user has the org setting to enforce ACW at the communication level enabled\n     */\n    useCommunicationACW: null,\n\n    /**\n     * the previous useCommunicationACW value, used in comparison logic with updated useCommunicationACW value in didReceiveAttrs.\n     */\n    prevUseCommunicationACW: null,\n\n    /**\n     * @Attribute\n     * FT for external contact division labels\n     */\n    acdExternalContactDivNameFT: false,\n    acdExternalContactWorkitemsDivNameFT: false,\n\n    externalContactDivisionName: undefined,\n\n    _oldInteractionId: null,\n\n    // ==================================================================\n    // Observers\n    // ==================================================================\n\n    hideTransferButtonsObserver: observer(\n        'canBlindTransfer',\n        'canConsultTransfer',\n        'interaction.{iAmConsulted,isSessionSharing,isAgentDisconnectedFromSharedSession,isCustomerDisconnectedFromSharedSession,isWaitingForCustomerToConnect,cobrowseSessionShareActive,myselfIsMonitor,myselfIsCoach,myselfIsMonitorV2}',\n        function () {\n            run.once(this, '_computeHideTransferButtons');\n        }\n    ),\n\n    /**\n     * Fetches campaign and contact information for the\n     * callback if there is an associated dialer preview.\n     */\n    fetchDialerPreviewDetails: on(\n        'init',\n        observer('interaction.dialerPreview', function () {\n            const dialerPreview = this.get('interaction.dialerPreview');\n            if (dialerPreview && !this.get('interaction.contact')) {\n                return this.get('contactlist')\n                    .getContact(dialerPreview.contactListId, dialerPreview.contactId)\n                    .then(contact => {\n                        if (this.get('interaction')) {\n                            this.set('interaction.contact', contact);\n                        }\n                    });\n            }\n        })\n    ),\n\n    // ==================================================================\n    // Computeds\n    // ==================================================================\n\n    useScripterGadget: bool('session.features.PURE-6186_Scripter_Gadget_GCUI'),\n\n    _rawCustomerParticipantName: computed(\n        'interaction.participantForCustomer.id',\n        'interaction',\n        'interaction.messages',\n        'interaction.messages.[]',\n        'interaction.messages.firstObject.from.email',\n        'interaction.messages.firstObject.from.name',\n        'interaction.messages.firstObject.to.email',\n        'interaction.draft',\n        'interaction.draft.to.firstObject.email',\n        function () {\n            const id = this.get('interaction.participantForCustomer.id');\n            const conversation = this.interaction;\n            if (id && conversation) {\n                const rawParticipant = this.getRawParticipant(conversation, id);\n                return this.participantName.getRawParticipantName(rawParticipant);\n            }\n            return null;\n        }\n    ),\n\n    _externalCanonicalContact: computed(\n        'externalContacts.contacts.[]',\n        'interaction.participantForCustomer.externalContactId',\n        'workitem.customer.externalContactId',\n        function () {\n            const contactId =\n                this.get('interaction.participantForCustomer.externalContactId') ||\n                this.get('workitem.customer.externalContactId');\n\n            if (!contactId) {\n                return;\n            }\n\n            return this.externalContacts.getCanonicalContactSync(contactId);\n        }\n    ),\n\n    externalContactNameV2: computed('_externalCanonicalContact.name', function () {\n        const contact = this._externalCanonicalContact;\n        if (!contact) return;\n        return get(contact, 'name');\n    }),\n\n    /**\n     * The calculated participant name for customer we ran though particiantName service.\n     */\n    customerParticipantName: computed(\n        '_rawCustomerParticipantName',\n        '_customerParticipantName',\n        'externalContactNameV2',\n        function () {\n            const name = this._customerParticipantName;\n            const rawName = this._rawCustomerParticipantName;\n            const ecName = this.externalContactNameV2;\n            const noName = this.intl.t('purecloud.acdInteraction.noName');\n            return ecName || name || rawName || noName;\n        }\n    ),\n\n    /**\n     * `true` if the active interaction has a history of notes. Determines visuals to the user in the toolbar\n     */\n    hasNotesHistory: notEmpty('notesHistory'),\n\n    /**\n     * An array of the history of notes taken during this interaction. Should be arranged based on endTime.\n     */\n    notesHistory: reads('interaction.notesHistory'),\n\n    /**\n     * returns `true` if the blind transfer option should be disabled in the call controls.\n     */\n    blindTransferDisabled: readOnly('interaction.onConsult'),\n\n    /**\n     * `true` if the current user can view the chat when clicking on the authors avatar\n     */\n    canViewChat: reads('permissions.canViewBusinessChat'),\n\n    /**\n     * The current authenticated user from the session service\n     */\n    authUser: reads('session.publicApiUser'),\n\n    /**\n     * All of the participants in the conversation\n     */\n    participants: reads('interaction.participants'),\n\n    /**\n     * All of the other participants in the conversation excluding the authenticated user.\n     * Only contains participants that are connected or connecting\n     */\n    otherParticipants: readOnly('interaction.otherParticipants'),\n\n    /**\n     * Includes all of the active participant ids in the conversation. Excludes any participant\n     * with an endTime so the host can readd a user who has disconnected.\n     */\n    activeParticipantIds: readOnly('interaction.activeParticipantIds.[]'),\n\n    /**\n     * Participants that should be shown in a conference roster\n     */\n    connectedConferenceParticipants: readOnly('interaction.allConferenceParticipants'),\n\n    /**\n     * `true` if the authenticated user is the host of the interaction.\n     */\n    isHostParticipant: computed('interaction.hostParticipant', 'authUser.id', function () {\n        return this.get('interaction.hostParticipant.userId') === this.get('authUser.id');\n    }),\n\n    /**\n     * Array of filters that should be excluded in the conversation participant dropdown\n     * based on the type of interaction being handled and associated transfer permission.\n     */\n    excludeBlindTransferFilters: computed(\n        'interaction.type',\n        'permissions.{canBlindTransferAgent,canBlindTransferQueue,canBlindTransferExternal}',\n        function () {\n            const type = this.get('interaction.type');\n            const filtersToExclude = [];\n            const shouldExcludeUsers = !this.get('permissions.canBlindTransferAgent');\n            const shouldExcludeQueues = !this.get('permissions.canBlindTransferQueue');\n            const shouldExcludeExternals =\n                !this.get('permissions.canBlindTransferExternal') || (type !== 'call' && type !== 'callback');\n\n            if (shouldExcludeUsers) {\n                filtersToExclude.push('user');\n            }\n\n            if (shouldExcludeQueues) {\n                filtersToExclude.push('queue');\n            }\n\n            if (shouldExcludeExternals) {\n                filtersToExclude.push('external');\n            }\n\n            return filtersToExclude;\n        }\n    ),\n\n    /**\n     * Array of filters that should be excluded for consult transfers in the conversation participant dropdown\n     * based on the type of interaction being handled and associated transfer permission.\n     */\n    excludeConsultTransferFilters: computed(\n        'interaction.type',\n        'permissions.{canConsultTransferAgent,canConsultTransferQueue,canConsultTransferExternal}',\n        function () {\n            const type = this.get('interaction.type');\n            const filtersToExclude = [];\n            const shouldExcludeUsers = !this.get('permissions.canConsultTransferAgent');\n            const shouldExcludeQueues = !this.get('permissions.canConsultTransferQueue');\n            const shouldExcludeExternals = !this.get('permissions.canConsultTransferExternal') || type !== 'call';\n\n            if (shouldExcludeUsers) {\n                filtersToExclude.push('user');\n            }\n            if (shouldExcludeQueues) {\n                filtersToExclude.push('queue');\n            }\n            if (shouldExcludeExternals) {\n                filtersToExclude.push('external');\n            }\n            return filtersToExclude;\n        }\n    ),\n\n    /**\n     * Determines whether or not the agent can select a raw search value from the `target-dropdown`\n     * component when searching for a target. Based off the type of the interaction in question.\n     */\n    allowRawDropdownInputSelection: computed('interaction.type', function () {\n        const type = this.get('interaction.type');\n        switch (type) {\n            case 'call':\n            case 'callback':\n                return true;\n            default:\n                return false;\n        }\n    }),\n\n    /**\n     * Determines whether or not the agent can select a raw search value from the `target-dropdown`\n     * component when searching for a target. Based off the type of the interaction in question.\n     */\n    targetDropdownPlaceholderText: computed('interaction.type', function () {\n        const type = this.get('interaction.type');\n        switch (type) {\n            case 'call':\n            case 'callback':\n                return 'purecloud.searchEntryWithQueueSentenceCase';\n            default:\n                return 'purecloud.searchEntryNameOrQueueSentenceCase';\n        }\n    }),\n\n    disabledScriptButton: not('isScriptAvailable'),\n\n    interactionScriptContainerState: computed('isCall', 'isCallback', function () {\n        return this.isCall || this.isCallback ? '' : 'hidden';\n    }),\n\n    isPopout: reads('application.isPopout'),\n\n    isNotPopout: not('application.isPopout'),\n\n    isChat: reads('interaction.isChat'),\n\n    isCall: reads('interaction.isCall'),\n\n    isCallback: reads('interaction.isCallback'),\n\n    isDialerCall: computed(\n        'interaction',\n        'interaction.dialerPreview',\n        'interaction.campaignId',\n        'interaction.participants',\n        'interaction.participants.[]',\n        function () {\n            if (this.get('interaction.dialerPreview') || this.get('interaction.campaignId')) {\n                return true;\n            }\n\n            const participants = this.get('interaction.participants');\n            if (!participants) {\n                return false;\n            }\n            return participants.some(\n                part => part.dialerPreview || (part.attributes && part.attributes.dialerInteractionId)\n            );\n        }\n    ),\n\n    autoStartIsDispositioned: computed(\n        'interaction.calls.[]',\n        'interaction.calls.@each.disconnectedTime',\n        'interaction.isAfterCallWorkCompleted',\n        'interaction.participantForCurrentUser',\n        'interaction.participantForCurrentUser.wrapup.endTime',\n        'interaction.participantForCurrentUser.endAcwTime',\n        'interaction.participantForCurrentUser.wrapupExpected',\n        'interaction.participantForCurrentUser.wrapupRequired',\n        function () {\n            if (this.get('interaction.participantForCurrentUser.wrapup.endTime')) {\n                return true;\n            }\n\n            let currentUser = this.get('interaction.participantForCurrentUser');\n            if (!currentUser) {\n                return false;\n            }\n            if (\n                this.get('interaction.participantForCurrentUser.wrapupExpected') ||\n                this.get('interaction.participantForCurrentUser.wrapupRequired')\n            ) {\n                if (this.get('interaction.isAfterCallWorkCompleted')) {\n                    return true;\n                }\n            } else {\n                let calls = currentUser.calls || [];\n                for (let call of calls) {\n                    if (call && call.disconnectedTime) {\n                        return true;\n                    }\n                }\n            }\n            return false;\n        }\n    ),\n    autoEndIsDispositioned: computed(\n        'interaction.calls.[]',\n        'interaction.calls.@each.disconnectedTime',\n        'interaction.isAfterCallWorkCompleted',\n        'interaction.participantForCurrentUser.endAcwTime',\n        'interaction.participantForCurrentUser.wrapupExpected',\n        'interaction.participantForCurrentUser.wrapupRequired',\n        function () {\n            let currentUser = this.get('interaction.participantForCurrentUser');\n            if (!currentUser) {\n                return false;\n            }\n            if (currentUser.wrapupExpected || currentUser.wrapupRequired) {\n                if (this.get('interaction.isAfterCallWorkCompleted')) {\n                    return true;\n                }\n                // This...doesn't work on the backend right now\n                // } else {\n                //     let calls = currentUser.calls || [];\n                //     for (let call of calls) {\n                //         if (call && call.disconnectedTime) {\n                //             return true;\n                //         }\n                //     }\n            }\n            return false;\n        }\n    ),\n\n    autoCallbackQueueId: computed(\n        'interaction',\n        'interaction.agentParticipants',\n        'interaction.agentParticipants.[]',\n        'interaction.participantForCurrentUser',\n        'interaction.participantForCurrentUser.queueId',\n        function () {\n            if (this.get('interaction.participantForCurrentUser.queueId')) {\n                return this.get('interaction.participantForCurrentUser.queueId');\n            }\n            if (this.get('interaction.agentParticipants')) {\n                const participants = this.get('interaction.agentParticipants').filter(p => p.queueId);\n\n                for (let participant of participants) {\n                    return participant.queueId;\n                }\n            }\n            return null;\n        }\n    ),\n\n    autoCallbackStartTime: computed(\n        'interaction.callbackNumbers.length',\n        'autoDialTimeSeconds',\n        'interaction.participantForCurrentUser.connectedTime',\n        function () {\n            const gracePeriod = this.autoDialTimeSeconds;\n            const startTime = this.get('interaction.participantForCurrentUser.connectedTime');\n            if (this.get('callbackNumbers.length') > 0 && gracePeriod > 0 && startTime) {\n                return moment(startTime).add(gracePeriod, 'seconds');\n            } else {\n                return null;\n            }\n        }\n    ),\n\n    autoCallbackEndTime: computed(\n        'callbackNumbers.length',\n        'autoEndTimeSeconds',\n        'interaction.participantForCurrentUser.wrapup.endTime',\n        'interaction.participantForCurrentUser.endAcwTime',\n        function () {\n            const gracePeriod = this.autoEndTimeSeconds;\n            const startTime =\n                this.get('interaction.participantForCurrentUser.wrapup.endTime') ||\n                this.get('interaction.participantForCurrentUser.endAcwTime');\n            if (this.get('callbackNumbers.length') > 0 && gracePeriod > 0 && startTime) {\n                return moment(startTime).add(gracePeriod, 'seconds');\n            } else {\n                return null;\n            }\n        }\n    ),\n\n    isAlmostAutoCallbackStart: computed('timeToAutoCallbackStart', 'isAutoCallbackStartEligible', function () {\n        if (!this.isAutoCallbackStartEligible) {\n            return false;\n        }\n        const duration = this.timeToAutoCallbackStart;\n        if (duration === null) {\n            return false;\n        }\n\n        // If we're overdue, something went wrong, so we enable the button\n        // again.\n        return duration < 5000 && duration > -5000;\n    }),\n\n    isAutoCallbackStartEligible: computed(\n        'hasCallbackNumbers',\n        'isDialerCall',\n        'isCallback',\n        'isDialingClbk',\n        'isConnected',\n        'isPlacingCall',\n        'autoStartIsDispositioned',\n        'callbackMediaSettings.enableAutoDialAndEnd',\n        'interaction.hasVoicemail',\n        function () {\n            return (\n                !this.isDialerCall &&\n                !this.get('interaction.hasVoicemail') &&\n                this.get('callbackMediaSettings.enableAutoDialAndEnd') &&\n                this.isCallback &&\n                !this.isDialingClbk &&\n                this.get('interaction.mostRecentTransfer.transferType') !== 'unattended' &&\n                this.isConnected &&\n                this.hasCallbackNumbers &&\n                !this.isPlacingCall &&\n                // If there are multiple numbers, they can try a different one now...\n                !this.autoStartIsDispositioned\n            );\n        }\n    ),\n\n    isAutoCallbackEndEligible: computed(\n        'autoCallbackQueueId',\n        'isDialerCall',\n        'interaction.hasVoicemail',\n        'autoEndIsDispositioned',\n        'callbackMediaSettings.enableAutoDialAndEnd',\n        'hasMultipleCallbackNumbers',\n        'isConnected',\n        'isCallback',\n        function () {\n            return (\n                this.autoCallbackQueueId &&\n                !this.isDialerCall &&\n                !this.get('interaction.hasVoicemail') &&\n                this.autoEndIsDispositioned &&\n                this.get('callbackMediaSettings.enableAutoDialAndEnd') &&\n                !this.hasMultipleCallbackNumbers &&\n                this.isConnected &&\n                this.isCallback\n            );\n        }\n    ),\n\n    isEmail: reads('interaction.isEmail'),\n\n    isSms: reads('interaction.isSms'),\n\n    isInternalProvider: reads('interaction.isInternalProvider'),\n\n    isV2ChatProvider: reads('interaction.isV2Provider'),\n\n    isExternalCampaign: reads('interaction.isExternalCampaign'),\n\n    isMessage: equal('interaction.type', 'message'),\n\n    isOnQueue: alias('interactionService.isOnQueue'),\n\n    isConnected: reads('interaction.isConnected'),\n\n    isContacting: reads('interaction.isContacting'),\n\n    isDisconnected: reads('interaction.isDisconnected'),\n\n    isDialing: reads('interaction.isDialing'),\n\n    isTerminated: reads('interaction.isTerminated'),\n\n    showInteractionGUID: bool('session.org.orgPreferences.preferInteractionGUID'),\n\n    canAgentRequestACW: bool('interaction.canAgentRequestACW'),\n\n    showAgentRequestACWButton: computed('canAgentRequestACW', 'isConnected', 'isCallback', function () {\n        return this.canAgentRequestACW && this.isConnected && !this.isCallback;\n    }),\n\n    showAcdVoicemailAudioPlayer: and('showAcdVoicemailButton', 'acdVoicemailPlayerVisible'),\n\n    isCampaignCallback: bool('interaction.isCampaignCallback'),\n\n    isNotCampaignCallback: not('interaction.isCampaignCallback'),\n\n    showFinishCallback: computed(\n        '{hasActiveCallback,hasActiveCall,hasAttemptedCall}',\n        'interaction.{needsCallWrapUp,dialerPreview,isAlerting}',\n        function () {\n            // Show finish button for callback communications when\n            // no call is active, or for dialer previews when a call\n            // has been attempted and is not longer active. Agents should\n            // have met their wrapup requirements as well.\n\n            const isAlerting = this.get('interaction.isAlerting');\n            const hasCallback = this.hasActiveCallback;\n            const isPreview = !!this.get('interaction.dialerPreview');\n            const meetsCallRequirement = !this.hasActiveCall && (!isPreview || (isPreview && this.hasAttemptedCall));\n            const needsCallWrapup = this.get('interaction.needsCallWrapUp');\n\n            return (hasCallback || isPreview) && meetsCallRequirement && !needsCallWrapup && !isAlerting;\n        }\n    ),\n\n    showSkipCallback: computed(\n        'isCallback',\n        'isConnected',\n        'interaction.dialerPreview',\n        'hasAttemptedCall',\n        function () {\n            return (\n                this.isCallback && this.isConnected && this.get('interaction.dialerPreview') && !this.hasAttemptedCall\n            );\n        }\n    ),\n\n    showCallbackCountdown: computed(\n        '{isCallback,hasCallbackNumbers}',\n        'interaction.{callbackTimeoutTime,needsCallWrapUp}',\n        function () {\n            return (\n                this.isCallback &&\n                this.hasCallbackNumbers &&\n                this.get('interaction.callbackTimeoutTime') &&\n                !this.get('interaction.needsCallWrapUp')\n            );\n        }\n    ),\n\n    showAutoCallbackStartCountdown: computed(\n        'isAutoCallbackStartEligible',\n        'autoCallbackStartTime',\n        'autoStartIsDispositioned',\n        'autoEndIsDispositioned',\n        function () {\n            return (\n                this.isAutoCallbackStartEligible &&\n                this.autoCallbackStartTime &&\n                !this.autoStartIsDispositioned &&\n                !this.autoEndIsDispositioned\n            );\n        }\n    ),\n    showAutoCallbackEndCountdown: and('isAutoCallbackEndEligible', 'autoEndIsDispositioned', 'autoCallbackEndTime'),\n\n    showParkEmailButton: readOnly('permissions.canPark'),\n\n    showParkSMSButton: computed('permissions.canParkMessage', 'interaction.cobrowseSessionShareActive', function () {\n        const interaction = this.interaction;\n        if (interaction && get(interaction, 'cobrowseSessionShareActive')) {\n            return false;\n        }\n        return this.get('permissions.canParkMessage');\n    }),\n\n    autoCallbackStartCountdownExpired: computed('timeToAutoCallbackStart', function () {\n        const duration = this.timeToAutoCallbackStart;\n        if (duration === null) {\n            return false;\n        }\n        return duration <= 0;\n    }),\n\n    timeToAutoCallbackStart: computed('autoCallbackStartTime', 'clock.second', function () {\n        // Consume clock.second to establish Glimmer autotracking (Ember 3.28 compatibility)\n        this.get('clock.second');\n        const now = new Date();\n        const timestamp = this.autoCallbackStartTime;\n        if (!timestamp) {\n            return null;\n        }\n        const then = new Date(timestamp);\n\n        const diff = then.getTime() - now.getTime();\n        return diff;\n    }),\n\n    timeToAutoCallbackEnd: computed('autoCallbackEndTime', 'clock.second', function () {\n        // Consume clock.second to establish Glimmer autotracking (Ember 3.28 compatibility)\n        this.get('clock.second');\n        const now = new Date();\n        const timestamp = this.autoCallbackEndTime;\n        if (!timestamp) {\n            return null;\n        }\n        const then = new Date(timestamp);\n\n        if (now >= then) {\n            return 0;\n        }\n\n        const diff = then.getTime() - now.getTime();\n        return diff;\n    }),\n\n    autoCallbackEndCountdownExpired: computed('timeToAutoCallbackEnd', function () {\n        const duration = this.timeToAutoCallbackEnd;\n        if (duration === null) {\n            return false;\n        }\n        return duration <= 0;\n    }),\n\n    enableAcdVoicemail: computed(\n        'permissions.hasAcdVoicemailAccess',\n        'interaction.isCurrentUserInConversation',\n        function () {\n            return this.get('permissions.hasAcdVoicemailAccess') || this.get('interaction.isCurrentUserInConversation');\n        }\n    ),\n\n    // Indicates if either voice/screen recording is happening,\n    // used to determine \"Secure Pause\" button state\n    isRecordingPaused: computed('interaction.{securePause,recordingState,participantForCurrentUser}', function () {\n        const interaction = this.interaction;\n        if (!interaction) {\n            return false;\n        }\n\n        const securePause = this.get('interaction.securePause');\n        const recordingState = (this.get('interaction.recordingState') || '').toLowerCase();\n        const screenRecordingState = (\n            this.get('interaction.participantForCurrentUser.screenRecordingState') || ''\n        ).toLowerCase();\n\n        return (\n            //expected behavior when voice recording is paused\n            (recordingState === 'paused' && securePause) ||\n            //expected behavior when screen recording is paused\n            (recordingState === 'paused' && screenRecordingState === 'paused')\n        );\n    }),\n\n    showAcdVoicemailButton: computed('enableAcdVoicemail', 'interaction.{hasVoicemail,isAlerting}', function () {\n        return this.enableAcdVoicemail && this.get('interaction.hasVoicemail') && !this.get('interaction.isAlerting');\n    }),\n\n    sessionShareClassNames: computed(\n        'isCustomerConfiguredForScreenShare',\n        'isCustomerConfiguredForCobrowse',\n        'isAgentAllowedToScreenShare',\n        'isAgentAllowedtoCobrowse',\n        'cobrowseMisconfiguration',\n        'screenShareMisconfiguration',\n        'isChat',\n        function () {\n            let classes = '';\n            if (this.isChat) {\n                if (this.isCustomerConfiguredForScreenShare) {\n                    classes += ' customer-configured-screen-share';\n                }\n                if (this.isCustomerConfiguredForCobrowse) {\n                    classes += ' customer-configured-cobrowse';\n                }\n                if (this.cobrowseMisconfiguration) {\n                    classes += ' cobrowse-misconfiguration';\n                }\n                if (this.screenShareMisconfiguration) {\n                    classes += ' screen-share-misconfiguration';\n                }\n            }\n            if (this.isAgentAllowedToScreenShare) {\n                classes += ' agent-allowed-screen-share';\n            }\n            if (this.isAgentAllowedtoCobrowse) {\n                classes += ' agent-allowed-cobrowse';\n            }\n            return classes;\n        }\n    ),\n\n    onConsult: computed('interaction.{consultAgentParticipant,onConsult}', function () {\n        const participant = this.get('interaction.consultAgentParticipant');\n        if (!participant) return false;\n        const status = get(participant, 'status') || '';\n        return 'terminated' !== status.toLowerCase() && 'disconnected' !== status.toLowerCase();\n    }),\n\n    isHeld: computed('interaction.{isHeld,iAmConsultInitiator,isConsultParticipantHolding}', function () {\n        if (this.get('interaction.iAmConsultInitiator')) {\n            return this.get('interaction.isConsultParticipantHolding');\n        }\n        return this.get('interaction.isHeld');\n    }),\n\n    isConfined: and('interaction.onConsult', 'interaction.isConfined'),\n\n    stationIsWebrtc: reads('phone.station.isWebrtc'),\n\n    phoneCallsWithErrors: reads('phone.callsWithErrors'),\n\n    formattedCustomerPhoneNumber: reads('interaction.formattedCustomerPhoneNumber'),\n\n    webrtcConversation: computed(\n        'stationIsWebrtc',\n        'webrtc.conversations.@each.conversationId',\n        'interaction.id',\n        function () {\n            const conversationId = this.get('interaction.id');\n            if (conversationId && this.stationIsWebrtc) {\n                return this.webrtc.getConversation({\n                    conversationId,\n                    conversationType: webrtcConversationTypes.SOFTPHONE\n                });\n            }\n            return null;\n        }\n    ),\n\n    showNumber: computed('formattedCustomerPhoneNumber', 'customerParticipantName', function () {\n        if (this.formattedCustomerPhoneNumber === this.customerParticipantName) {\n            return false;\n        }\n        return this.formattedCustomerPhoneNumber && !!this.formattedCustomerPhoneNumber.match(/^[^a-zA-Z@]*$/);\n    }),\n\n    enablePhoneHangupBtn: computed(\n        'agentEndedCallsWithError.[]',\n        'isCall',\n        'isDisconnected',\n        'isTerminated',\n        'stationIsWebrtc',\n        'webrtcConversation.isConnected',\n        'phoneCallsWithErrors.@each.conversationId',\n        'interaction.id',\n        'interaction.participantForCurrentUser.calls.@each.disconnectReasons',\n        function () {\n            const interaction = this.interaction;\n            const callHasEnded = this.isDisconnected || this.isTerminated;\n            const hasAgentEndedThisInteraction = interaction\n                ? this.agentEndedCallsWithError.includes(get(interaction, 'id'))\n                : false;\n\n            const stationError =\n                !this.stationIsWebrtc &&\n                this.get('phoneCallsWithErrors.length') &&\n                callHasEnded &&\n                !hasAgentEndedThisInteraction;\n            const webRtcError =\n                this.stationIsWebrtc &&\n                this.get('phoneCallsWithErrors.length') &&\n                this.get('webrtcConversation.isConnected');\n\n            const shouldShowDisconnectButton = this.isCall && !callHasEnded;\n\n            const callsError = interactionHasSipErrors(interaction);\n\n            if (interaction && (webRtcError || stationError || callsError)) {\n                const callSessionHasError = this.phoneCallsWithErrors.findBy('conversationId', get(interaction, 'id'));\n                return callSessionHasError ? true : shouldShowDisconnectButton || callsError;\n            }\n            return shouldShowDisconnectButton;\n        }\n    ),\n\n    showChatRoom: computed('isChat', 'room', 'isInternalProvider', 'isV2ChatProvider', function () {\n        // TODO: parse providers once we can route chats via API\n        const isChat = this.isChat;\n        const hasRoom = !!this.room;\n        const isInternal = this.isInternalProvider;\n        const isV2Chat = this.isV2ChatProvider;\n\n        return isChat && isInternal && (hasRoom || isV2Chat);\n    }),\n\n    hideAfterCallWork: computed('{hasActiveCallback,hasActiveCall,hasPlacedCalls}', function () {\n        return (\n            this.hasActiveCallback &&\n            this.get('interaction.dialerPreview') &&\n            !this.isExternalCampaign &&\n            (!this.hasPlacedCalls || this.hasActiveCall)\n        );\n    }),\n\n    canShowProfile: and('permissions.hasRelateAccess', 'permissions.hasExternalContactsViewContactAccess'),\n\n    shouldShowProfile: reads('isNotCampaignCallback'),\n\n    /**\n     * `true` if the selected interaction is currently an active conference\n     * Originally had this named as `isActiveConference` but it was conflicting\n     * with `interaction.isActiveConference` for some odd reasons by overriding\n     * the value in some occasions.\n     */\n    activeConference: readOnly('interaction.isActiveConference'),\n\n    /**\n     * `true` if the interaction was a conference at any point during its life. Value won't\n     * persist after a refresh, but it doesn't need to at this point.\n     */\n    wasConference: readOnly('interaction.wasConference'),\n\n    showDTMFDialpad: computed(\n        'isCall',\n        'isConnected',\n        'isDialing',\n        'session.features.acdDialpadDialing',\n        'interaction.myselfIsMonitor',\n        'interaction.myselfIsCoach',\n        function () {\n            const iAmMonitorOrCoach = this.get('interaction.myselfIsMonitor') || this.get('interaction.myselfIsCoach');\n            if (this.get('session.features.acdDialpadDialing')) {\n                return !iAmMonitorOrCoach && this.isCall && (this.isConnected || this.isDialing);\n            }\n            return !iAmMonitorOrCoach && this.isCall && this.isConnected;\n        }\n    ),\n\n    canBlindTransfer: computed(\n        'permissions.{canBlindTransferAgent,canBlindTransferQueue,canBlindTransferExternal}',\n        function () {\n            return (\n                this.get('permissions.canBlindTransferAgent') ||\n                this.get('permissions.canBlindTransferQueue') ||\n                this.get('permissions.canBlindTransferExternal')\n            );\n        }\n    ),\n\n    canConsultTransfer: computed(\n        'permissions.{canConsultTransferAgent,canConsultTransferQueue,canConsultTransferExternal}',\n        function () {\n            return (\n                this.get('permissions.canConsultTransferAgent') ||\n                this.get('permissions.canConsultTransferQueue') ||\n                this.get('permissions.canConsultTransferExternal')\n            );\n        }\n    ),\n\n    showTransfer: computed('{isCallback,isConnected,hasCallbackNumbers}', 'canBlindTransfer', function () {\n        if (!this.canBlindTransfer) {\n            return false;\n        }\n        return this.isCallback ? this.isConnected && this.hasCallbackNumbers : this.isConnected;\n    }),\n\n    showConsultTransfer: readOnly('canConsultTransfer'),\n\n    /**\n     * The participant that the agent is transferring the interaction to\n     */\n    transferringToParticipant: readOnly('interaction.transferringToParticipant'),\n\n    showCobrowseV2: computed(\n        'interaction.{cobrowseSessionShareActive,subMessageType,myselfIsMonitor,myselfIsCoach,myselfIsMonitorV2}',\n        'isCobrowseV2SetUpForWebMessaging',\n        'isCobrowseV2SetUpForVoice',\n        'interaction.cobrowseSessionShareActive',\n        'interaction.isConnected',\n        function () {\n            if (\n                this.get('interaction.myselfIsMonitor') ||\n                this.get('interaction.myselfIsCoach') ||\n                this.get('interaction.myselfIsMonitorV2')\n            ) {\n                return false;\n            }\n\n            if (!this.get('interaction.cobrowseSessionShareActive')) {\n                return false;\n            }\n\n            if (!this.get('interaction.isConnected')) {\n                return false;\n            }\n\n            if (this.isCobrowseV2SetUpForWebMessaging || this.isCobrowseV2SetUpForVoice) {\n                this.set('interaction.isCobrowseV2', true);\n                return true;\n            }\n\n            return false;\n        }\n    ),\n\n    deploymentId: computed(\n        'interaction.lastCustomerMessage.normalizedMessage.channel.to.additionalIds.0.value',\n        'interaction.subMessageType',\n        'interaction.participantForCustomer.messages.firstObject.toAddress.addressRaw',\n        function () {\n            const deploymentId =\n                this.get('interaction.lastCustomerMessage.normalizedMessage.channel.to.additionalIds.0.value') ||\n                this.get('interaction.participantForCustomer.messages.firstObject.toAddress.addressRaw');\n\n            return this.get('interaction.subMessageType') === 'webmessaging' ? deploymentId : null;\n        }\n    ),\n\n    isCobrowseV2DeploymentEnabled: computed('deploymentId', 'cobrowseV2EnabledCache', function () {\n        return !!this.cobrowseV2EnabledCache.get(this.deploymentId);\n    }),\n\n    isCobrowseV2SetUpForWebMessaging: computed(\n        'isCobrowseV2DeploymentEnabled',\n        'permissions.canViewAcdCoBrowseForWebMessaging',\n        'interaction.subMessagingType',\n        function () {\n            // If Interaction is WebMessaging check WM permission\n            return (\n                this.get('interaction.subMessageType') === 'webmessaging' &&\n                this.get('permissions.canViewAcdCoBrowseForWebMessaging') &&\n                this.isCobrowseV2DeploymentEnabled\n            );\n        }\n    ),\n    isCobrowseV2SetUpForVoice: computed('permissions.canViewAcdCoBrowseV2ForVoice', 'isCall', function () {\n        return this.isCall && this.get('permissions.canViewAcdCoBrowseV2ForVoice');\n    }),\n    showCobrowseV2Button: computed(\n        'interaction.{myselfIsMonitor,myselfIsCoach,myselfIsMonitorV2}',\n        'isCobrowseV2SetUpForWebMessaging',\n        'isCobrowseV2SetUpForVoice',\n        function () {\n            if (\n                this.get('interaction.myselfIsMonitor') ||\n                this.get('interaction.myselfIsCoach') ||\n                this.get('interaction.myselfIsMonitorV2')\n            ) {\n                return false;\n            }\n\n            if (this.isCobrowseV2SetUpForWebMessaging || this.isCobrowseV2SetUpForVoice) {\n                return true;\n            }\n\n            return false;\n        }\n    ),\n\n    disableCobrowseV2Button: computed('interaction.cobrowseSessionShareActive', 'interaction.isConnected', function () {\n        return this.get('interaction.cobrowseSessionShareActive') || !this.get('interaction.isConnected');\n    }),\n\n    beginScreenShareOrCoBrowse: computed('interaction.canScreenShare', function () {\n        bind(this, this.get('actions.beginScreenShareOrCoBrowse'));\n    }),\n\n    staticPanelAttentionCounts: computed('hasNotesHistory', function () {\n        let attentionCountObject = EmberObject.create({});\n        if (this.hasNotesHistory) {\n            attentionCountObject.set('notes', true);\n        }\n        return attentionCountObject;\n    }),\n\n    unionStaticAndInterapptionPanels: union('interapptionPanelConfigs', 'staticPanelConfigs'),\n\n    staticAndInterapptionPanelConfigs: computed(\n        'unionStaticAndInterapptionPanels',\n        'panelsOverrideObjectTx.panelsOverride',\n        function () {\n            let panels = this.unionStaticAndInterapptionPanels;\n            let availablePanelsOverride = this.get('panelsOverrideObjectTx.panelsOverride');\n\n            if (availablePanelsOverride) {\n                let filteredPanels = panels\n                    .filter(config => availablePanelsOverride.includes(config.get('id')))\n                    .sortBy('sortPriority');\n                return filteredPanels;\n            }\n            return panels.sortBy('sortPriority');\n        }\n    ),\n\n    staticAndInterapptionAttentionCounts: computed(\n        'interapptionPanels',\n        'staticPanelAttentionCounts',\n        'attentionCountPerCompositeId',\n        'hasNotesHistory',\n        function () {\n            const hasNotesHistory = this.hasNotesHistory;\n            const interapptions = this.interapptionPanels || [];\n            const attentionCountPerCompositeId = this.attentionCountPerCompositeId || {};\n            const interapptionAttentionCountsByStateKey = interapptions.reduce((acc, interapption) => {\n                const id = interapption.get('id');\n                const stateKey = interapption.get('stateKey');\n                if (id in attentionCountPerCompositeId) {\n                    // For now, web-directory fully handles the Notes gadget splat logic.\n                    // Once there is daemon/worker implementation to support the gadget's lazy-loading,\n                    // we can remove this and let the Notes gadget manage the splat logic\n                    if (stateKey === NOTES_GADGET_STATE_KEY) {\n                        acc[stateKey] = hasNotesHistory ? 1 : 0;\n                    } else {\n                        acc[stateKey] = attentionCountPerCompositeId[id];\n                    }\n                }\n                return acc;\n            }, {});\n            return EmberObject.create(this.staticPanelAttentionCounts, interapptionAttentionCountsByStateKey);\n        }\n    ),\n\n    screenShareConfigs: computed(\n        'enableAcdSessionShare',\n        'shouldShowSessionShareButton',\n        'isChat',\n        'isCall',\n        'disableShareButton',\n        'disableVideoButton',\n        'sessionShareClassNames',\n        'sessionShareStartTooltip',\n        'sessionShareStartVideoTooltip',\n        'webMessagingCobrowseStartTooltip',\n        'showCobrowseV2Button',\n        'disableCobrowseV2Button',\n        function () {\n            return [\n                EmberObject.create({\n                    id: 'sessionShareChatOrCall',\n                    showTab:\n                        this.enableAcdSessionShare &&\n                        this.shouldShowSessionShareButton &&\n                        (this.isChat || (this.isCall && !this.isCobrowseV2SetUpForVoice)),\n                    icon: {\n                        guxIcon: {\n                            name: 'cobrowse',\n                            decorative: 'true'\n                        }\n                    },\n                    disabled:\n                        (this.isChat && this.disableShareButton) ||\n                        (this.isCall && this.disableVideoButton) ||\n                        this.activeConference,\n                    onclick: run.bind(this, this.get('actions.beginScreenShareOrCoBrowse')),\n                    name: this.intl.t(this.sessionShareStartTooltip),\n                    supplementalClassNames: 'session-share-btn screen-share' + this.sessionShareClassNames\n                }),\n                EmberObject.create({\n                    id: 'sessionShareWebMessaging',\n                    showTab: this.showCobrowseV2Button,\n                    icon: {\n                        guxIcon: {\n                            name: 'cobrowse',\n                            decorative: true\n                        }\n                    },\n                    disabled: this.disableCobrowseV2Button,\n                    name: this.intl.t(this.webMessagingCobrowseStartTooltip),\n                    supplementalClassNames: 'session-share-btn screen-share cobrowse' + this.sessionShareClassNames\n                })\n            ];\n        }\n    ),\n\n    staticPanelConfigs: computed(\n        'isChat',\n        'isSms',\n        'isEmail',\n        'disabledScriptButton',\n        'scriptToolTip',\n        'interaction.iAmConsultInitiator',\n        'interaction.isThereAConsultAgentParticipant',\n        'interaction.myselfIsMonitorV2',\n        'useScripterGadget',\n        function () {\n            const isInConsult =\n                this.get('interaction.iAmConsultInitiator') && this.get('interaction.isThereAConsultAgentParticipant');\n            const myselfIsMonitorV2 = this.get('interaction.myselfIsMonitorV2');\n            const panelConfigs = [];\n\n            if (!this.useScripterGadget) {\n                panelConfigs.push(\n                    EmberObject.create({\n                        id: 'scripts',\n                        showTab: (this.isChat || this.isSms || this.isEmail) && !isInConsult && !myselfIsMonitorV2,\n                        icon: {\n                            guxIcon: {\n                                name: 'scripter',\n                                decorative: true\n                            }\n                        },\n                        disabled: this.disabledScriptButton,\n                        name: this.intl.t(this.scriptToolTip),\n                        supplementalClassNames: 'interaction-scripts-btn monochromic-icon',\n                        sortPriority: 200\n                    })\n                );\n            }\n            return panelConfigs;\n        }\n    ),\n\n    interapptionPanelConfigs: computed('interapptionPanels', function () {\n        let sortPriorityInterapptions = 100;\n        const interapptions = this.interapptionPanels || A([]);\n\n        return interapptions.sortBy('name').map(interapption => {\n            let icon;\n            let sortPriority;\n            let supplementalClassNames = 'interapption-btn';\n            const interapptionId = interapption.get('id');\n            const interapptionStateKey = interapption.get('stateKey');\n            if (interapptionStateKey) {\n                // Append a valid css selector 👍; for enabling in PEF via CSS 🙄\n                supplementalClassNames += ` ${interapptionStateKey.trim().replaceAll(/[\\s&]/g, '-')}`;\n            }\n            if (interapption.get('assets.monochromicIcon')) {\n                icon = interapption.get('assets.monochromicIcon');\n                supplementalClassNames += ' monochromic-icon';\n            } else if (interapption.get('assets.icon')) {\n                icon = interapption.get('assets.icon');\n            } else {\n                supplementalClassNames += ' monochromic-icon';\n            }\n            if (interapptionId.indexOf('scripts&scripterProvider') >= 0) {\n                sortPriority = 200;\n            } else if (interapptionId.indexOf('agent-narrow-composite-journey-gadget') >= 0) {\n                sortPriority = 203;\n            } else if (interapptionId.indexOf('external-contact-acd-profile-panel') >= 0) {\n                sortPriority = 202;\n            } else if (\n                interapptionId.indexOf('agent-conversation-summary') >= 0 ||\n                interapptionId.indexOf('conversation-details') >= 0 ||\n                interapptionId.indexOf('interaction-details') >= 0\n            ) {\n                sortPriority = 201;\n            } else if (interapptionId.indexOf('cannedResponsesProvider') >= 0) {\n                sortPriority = 204;\n            } else if (interapptionId.indexOf('notesGadgetProvider') >= 0) {\n                sortPriority = 205;\n            } else if (interapptionId.indexOf('scheduleCallbackGadgetProvider') >= 0) {\n                sortPriority = 206;\n            } else if (interapptionId.indexOf('wrapupCodesGadgetProvider') >= 0) {\n                sortPriority = 207;\n            } else {\n                sortPriority = sortPriorityInterapptions++;\n            }\n\n            return EmberObject.create({\n                id: interapption.get('stateKey'),\n                name: interapption.get('name'),\n                showTab: true,\n                supplementalClassNames,\n                sortPriority,\n                icon\n            });\n        });\n    }),\n\n    // Currently used to detect PEF and disable the ability to resize; Might be supported in the future\n    panelResizerEnabled: computed('application.isPopout', function () {\n        return !this.get('application.isPopout');\n    }),\n\n    panelSize: computed('panelSizeMap', '_effectivePanelSelection', function () {\n        if (this._effectivePanelSelection === NONE_PANEL) return null;\n        return this.panelSizeMap[this._effectivePanelSelection] || 25;\n    }),\n\n    panelSizeClass: computed('panelResizerEnabled', 'panelSize', function () {\n        if (!this.panelResizerEnabled || !this.panelSize) {\n            return '';\n        }\n        return `panel-size-${this.panelSize}`;\n    }),\n\n    forcedPanelSelection: computed('interactionPanelContextKey', 'forcedPanelSelectionMap', function () {\n        const panelContextKey = this.interactionPanelContextKey;\n        if (!panelContextKey) return null;\n        return this.get(`forcedPanelSelectionMap.${panelContextKey}`);\n    }),\n\n    participantsForCurrentUser: computed('activeInteractions.@each.participantForCurrentUser', function () {\n        return this.activeInteractions\n            .filter(interaction => interaction && 'participantForCurrentUser' in interaction)\n            .mapBy('participantForCurrentUser');\n    }),\n\n    callbacksForParticipantsForCurrentUser: computed('participantsForCurrentUser.@each.callbacks', function () {\n        return this.participantsForCurrentUser\n            .filter(participant => participant && 'callbacks' in participant)\n            .mapBy('callbacks');\n    }),\n\n    activePanelContextKeys: computed(\n        'activeInteractions',\n        'activeInteractions.@each.isCall',\n        'callbacksForParticipantsForCurrentUser.@each.length',\n        'activeWorkitems.[]',\n        function () {\n            const activeInteractions = this.activeInteractions || [];\n            const activeWorkitems = this.activeWorkitems || [];\n            const allActiveInteractions = activeInteractions.concat(activeWorkitems);\n\n            return flatten(\n                allActiveInteractions.map(interaction => {\n                    const keys = [this.getInteractionPanelContextKey(interaction)];\n                    // If call interaction was originally a callback, then persist\n                    // the panel selection state for both the call and callback.\n                    const hasCallback = !!get(interaction, 'participantForCurrentUser.callbacks.length');\n                    if (get(interaction, 'isCall') && hasCallback) {\n                        keys.push(`${interaction.get('id')}-callback`);\n                    }\n                    return keys;\n                })\n            );\n        }\n    ),\n\n    interactionPanelContextKey: computed('interaction.id', 'interaction.type', 'workitem', 'workitem.id', function () {\n        const interaction = this.interaction || this.workitem;\n\n        if (!interaction) {\n            return null;\n        }\n\n        return this.getInteractionPanelContextKey(interaction);\n    }),\n\n    orgDefaultPanelSetting: computed(\n        'interaction.type',\n        'interaction.subMessageType',\n        'workitem',\n        'defaultPanelSettings',\n        function () {\n            const mediaType = !!this.workitem ? 'workitem' : getCommunicationType(this.interaction);\n            const settings = this.defaultPanelSettings;\n            if (!(mediaType in settings)) return;\n            const { type, panelId } = settings[mediaType];\n            if (type === 'Integration') return [panelId, INTEGRATIONS_INTERAPPTIONS_PROVIDER_ID].join('&');\n            return panelId;\n        }\n    ),\n\n    initialPanelSelection: computed(\n        'isPopout',\n        'isProfilePanelAvailable',\n        'availablePanels.[]',\n        'panelsOverrideObjectTx.initialPanelOverride',\n        'orgDefaultPanelSetting',\n        function () {\n            const queryOverride = this.get('panelsOverrideObjectTx.initialPanelOverride');\n            const orgDefaultPanelSetting = this.orgDefaultPanelSetting;\n\n            // Query param override takes highest priority\n            if (queryOverride) return queryOverride;\n\n            // Return the organization's default panel setting for the current interaction\n            if (orgDefaultPanelSetting) return orgDefaultPanelSetting;\n\n            if (this.isProfilePanelAvailable) return this.profilePanel;\n\n            return null;\n        }\n    ),\n\n    /**\n     * Computed to calculate the transformed panel overrides specified via command line\n     */\n    panelsOverrideObjectTx: computed(\n        'panelsOverrideObject.{panelsOverride,initialPanelOverride}',\n        standardTransformationFtComputedDepKey,\n        function () {\n            const origOverrides = this.panelsOverrideObject;\n            if (!origOverrides) {\n                return {\n                    // Just using explict undefined to self-document the type\n                    panelsOverride: undefined,\n                    initialPanelOverride: undefined\n                };\n            }\n\n            const { panelsOverride, initialPanelOverride } = origOverrides;\n            const features = this.get('session.features') || {};\n\n            return {\n                panelsOverride:\n                    Array.isArray(panelsOverride) && panelsOverride.length > 0\n                        ? panelsOverride.map(currPanelId => transformPanelId(currPanelId, features))\n                        : panelsOverride,\n                initialPanelOverride: initialPanelOverride\n                    ? transformPanelId(initialPanelOverride, features)\n                    : initialPanelOverride\n            };\n        }\n    ),\n\n    connectedTimeForDisplay: computed('interaction.connectedTime', function () {\n        // connectedTime is expected to be a Moment object or undefined\n        const connectedTime = this.get('interaction.connectedTime');\n\n        return !!connectedTime ? formatTimestampForDisplay(connectedTime.toISOString()) : null;\n    }),\n\n    availablePanels: computed('staticAndInterapptionPanelConfigs', function () {\n        return this.staticAndInterapptionPanelConfigs.filterBy('showTab').mapBy('id').concat(NONE_PANEL);\n    }),\n\n    isScriptPanelAvailable: computed('isCall', 'isCallback', 'isScriptAvailable', function () {\n        return this.isScriptAvailable && !(this.isCall || this.isCallback);\n    }),\n\n    isProfilePanelAvailable: computed('canShowProfile', 'shouldShowProfile', 'availablePanels.[]', function () {\n        return (\n            this.availablePanels.indexOf(\n                'external-contact-acd-profile-panel&builtInExternalContactsInterapptionsProvider'\n            ) !== -1\n        );\n    }),\n\n    profilePanel: computed(function () {\n        return 'external-contact-acd-profile-panel&builtInExternalContactsInterapptionsProvider';\n    }),\n\n    requiresStructuredMessage: computed(\n        'interaction.subMessageType',\n        'interaction.lastCustomerMessage',\n        'interaction.lastCustomerMessage.{timestamp,messsageTime}',\n        function () {\n            const lastInbound = this.get('interaction.lastCustomerMessage');\n            if (this.get('interaction.subMessageType') === 'whatsapp' && !lastInbound) {\n                return true;\n            } else if (this.get('interaction.subMessageType') === 'whatsapp' && lastInbound) {\n                const lastMessageTime =\n                    this.get('interaction.lastCustomerMessage.timestamp') ||\n                    this.get('interaction.lastCustomerMessage.messageTime');\n                return moment(lastMessageTime).isSameOrBefore(moment().subtract(1, 'days'));\n            }\n            return false;\n        }\n    ),\n\n    typeIcon: computed('interaction.type', function () {\n        const type = this.get('interaction.type');\n\n        switch (type) {\n            case 'call':\n                return 'pc-moon pc-phone';\n            case 'chat':\n                return 'pc-moon pc-chat';\n            case 'email':\n                return 'pc-moon pc-email';\n            case 'callback':\n                return 'pc-moon pc-outbound-call';\n            default:\n                return '';\n        }\n    }),\n\n    /* Localized strings */\n    beginCallbackDefaultNumberText: computed('callbackNumbers', function () {\n        return this.get('callbackNumbers.0.name') || '';\n    }),\n\n    /**\n     * Whether or not skipping the callback is allowed.\n     */\n    isSkipDisabledClbk: or('isDialingClbk', 'interaction.skipDisabled'),\n\n    autoDialTimeSeconds: computed(\n        'autoCallbackQueueId',\n        'callbackMediaSettings',\n        'callbackMediaSettings.autoDialDelaySeconds',\n        function () {\n            if (this.get('callbackMediaSettings.autoDialDelaySeconds') === 0) {\n                return 1;\n            }\n            return this.get('callbackMediaSettings.autoDialDelaySeconds') || 30;\n        }\n    ),\n    autoEndTimeSeconds: computed(\n        'autoCallbackQueueId',\n        'callbackMediaSettings',\n        'callbackMediaSettings.autoEndDelaySeconds',\n        function () {\n            if (this.get('callbackMediaSettings.autoEndDelaySeconds') === 0) {\n                return 1;\n            }\n            return this.get('callbackMediaSettings.autoEndDelaySeconds') || 30;\n        }\n    ),\n\n    /**\n     * True if the participantForCurrentUser is connected to a call communication, false otherwise.\n     */\n    hasActiveCall: reads('interaction.hasActiveCall'),\n\n    /**\n     * True if the participantForCurrentUser is connected to a callback communication, false otherwise.\n     */\n    hasActiveCallback: reads('interaction.hasActiveCallback'),\n\n    /**\n     * True if there is at least one number left to dial, false otherwise.\n     */\n    hasCallbackNumbers: gt('callbackNumbers.length', 0),\n\n    /**\n     * True if there are multiple phone numbers that can be dialed, false otherwise.\n     */\n    hasMultipleCallbackNumbers: gt('callbackNumbers.length', 1),\n\n    /**\n     * True if the agent has attempted to place a call for the callback, false otherwise.\n     */\n    hasAttemptedCall: computed('placedCalls.length', 'interaction.placedBlockedCalls.length', function () {\n        return this.get('placedCalls.length') || this.get('interaction.placedBlockedCalls.length');\n    }),\n\n    /**\n     * True if the agent has placed calls for the callback, false otherwise.\n     */\n    hasPlacedCalls: gt('placedCalls.length', 0),\n\n    /**\n     * An array of calls that the agent has already placed.\n     */\n    placedCalls: reads('interaction.participantForCurrentUser.calls'),\n\n    /**\n     * True if the agent has clicked \"begin call\" but the call hasn't connected yet.\n     */\n    isPlacingCall: reads('interaction.isPlacingCall'),\n\n    /**\n     * An array of phone numbers associated with the callback. If a dialer preview\n     * is present, the phone number type is include in the phone number name.\n     * {\n     *     name: 317-222-2222 (Work)\n     *     number: 317-222-2222\n     * }\n     */\n    callbackNumbers: reads('interaction.callbackNumbers'),\n\n    personGuid: reads('session.person.guid'),\n\n    acdVoicemailTooltip: computed('acdVoicemailPlayerVisible', function () {\n        if (!this.acdVoicemailPlayerVisible) {\n            return 'purecloud.acdInteraction.voicemail.showAudioPlayer';\n        }\n        return 'purecloud.acdInteraction.voicemail.hideAudioPlayer';\n    }),\n\n    holdTooltipTitle: computed('interaction.isHeld', function () {\n        if (this.get('interaction.isHeld')) {\n            return 'purecloud.acdInteraction.unhold';\n        }\n        return 'purecloud.acdInteraction.hold';\n    }),\n\n    muteTooltipTitle: computed('interaction.conversation.isMuted', function () {\n        if (this.get('interaction.conversation.isMuted')) {\n            return 'purecloud.acdInteraction.unmute';\n        }\n        return 'purecloud.acdInteraction.mute';\n    }),\n\n    scriptToolTip: computed('disabledScriptButton', function () {\n        if (this.disabledScriptButton) {\n            return 'purecloud.acdInteraction.scriptsNotAvailable';\n        }\n        return 'purecloud.acdInteraction.scripts';\n    }),\n\n    skipACWTooltipTitle: computed('interaction.isCommunicationAfterCallWorkRequested', function () {\n        if (this.get('interaction.isCommunicationAfterCallWorkRequested')) {\n            return 'purecloud.acdInteraction.skipACW';\n        }\n        return 'purecloud.acdInteraction.requestACW';\n    }),\n\n    customerBrowserDetails: computed(\n        'interaction.customerDetails.{isChrome,isFirefox,isEdgeChromium,hasChromeExtension,cobrowseType,standAloneApplication,canScreenshare,canCobrowse}',\n        function () {\n            const customerDetails = this.get('interaction.customerDetails');\n\n            if (!customerDetails) {\n                return {};\n            }\n\n            // because the object we get has stringified the boolean values, need to convert these to true and false\n            const isChrome = get(customerDetails, 'isChrome') === 'true' ? true : false;\n            const isFirefox = get(customerDetails, 'isFirefox') === 'true' ? true : false;\n            const isEdgeChromium = get(customerDetails, 'isEdgeChromium') === 'true' ? true : false;\n            const hasChromeExtension = get(customerDetails, 'hasChromeExtension') === 'true' ? true : false;\n            const isStandAloneApplication = get(customerDetails, 'standAloneApplication') === 'true' ? true : false;\n            const canScreenshare = get(customerDetails, 'canScreenshare') === 'true' ? true : false;\n            const canCobrowse = get(customerDetails, 'canCobrowse') === 'true' ? true : false;\n            const cobrowseType = get(customerDetails, 'cobrowseType') || canCobrowse ? true : false;\n            return {\n                isChrome,\n                isFirefox,\n                isEdgeChromium,\n                hasChromeExtension,\n                cobrowseType,\n                isStandAloneApplication,\n                canScreenshare,\n                canCobrowse\n            };\n        }\n    ),\n\n    isCustomerConfiguredForCobrowse: or('customerBrowserDetails.cobrowseType', 'customerBrowserDetails.canCobrowse'),\n\n    isCustomerConfiguredForScreenShare: computed(\n        'interaction.isV2Provider',\n        'customerBrowserDetails.{isChrome,isFirefox,isEdgeChromium,hasChromeExtension,isStandAloneApplication}',\n        function () {\n            // screenshare is not supported for v2 providers\n            if (this.get('interaction.isV2Provider')) {\n                return false;\n            }\n\n            const customerBrowserDetails = this.customerBrowserDetails;\n            if (\n                get(customerBrowserDetails, 'canScreenshare') ||\n                get(customerBrowserDetails, 'isFirefox') ||\n                (get(customerBrowserDetails, 'isChrome') && get(customerBrowserDetails, 'hasChromeExtension')) ||\n                get(customerBrowserDetails, 'isEdgeChromium') ||\n                get(customerBrowserDetails, 'isStandAloneApplication')\n            ) {\n                return true;\n            }\n            return false;\n        }\n    ),\n\n    screenShareMisconfiguration: computed(\n        'isCustomerConfiguredForScreenShare',\n        'isAgentAllowedToScreenShare',\n        function () {\n            return this.isCustomerConfiguredForScreenShare === !this.isAgentAllowedToScreenShare;\n        }\n    ),\n\n    cobrowseMisconfiguration: computed('isCustomerConfiguredForCobrowse', 'isAgentAllowedToCobrowse', function () {\n        return this.isCustomerConfiguredForCobrowse === !this.isAgentAllowedToCobrowse;\n    }),\n\n    canCobrowseChat: reads('permissions.canViewAcdCoBrowseForChat'),\n\n    canCobrowseCall: reads('permissions.canViewAcdCoBrowseForCall'),\n\n    isAgentAllowedToCobrowseCall: and('isCall', 'canCobrowseCall'),\n\n    isAgentAllowedToCobrowseChat: and('isChat', 'canCobrowseChat'),\n\n    isAgentAllowedToCobrowse: or('isAgentAllowedToCobrowseCall', 'isAgentAllowedToCobrowseChat'),\n\n    canScreenShare: reads('permissions.canViewAcdScreenShare'),\n\n    isAgentAllowedToScreenShareCall: and('isCall', 'canScreenShare'),\n\n    isAgentAllowedToScreenShareChat: and('isChat', 'canScreenShare'),\n\n    isAgentAllowedToScreenShare: or('isAgentAllowedToScreenShareCall', 'isAgentAllowedToScreenShareChat'),\n\n    sessionShareStartVideoTooltip: computed('webrtc.activeBridge', function () {\n        if (!this.get('webrtc.activeBridge')) {\n            return 'purecloud.acdInteraction.sessionShare.noVideoWarning';\n        }\n        return 'purecloud.acdInteraction.sessionShare.startVideo';\n    }),\n\n    sessionShareStartTooltip: computed(\n        'webrtc.activeBridge',\n        'disableShareButtonReason',\n        'customerBrowserDetails.isStandAloneApplication',\n        'interaction.canScreenShare',\n        function () {\n            if (!this.get('interaction.canScreenShare') && !this.get('webrtc.activeBridge')) {\n                return 'purecloud.acdInteraction.sessionShare.noVideoWarning';\n            } else if (this.disableShareButtonReason && this.isChat) {\n                return this.disableShareButtonReason;\n            } else if (this.get('customerBrowserDetails.isStandAloneApplication') && this.isChat) {\n                return 'purecloud.acdInteraction.sessionShare.customerUsingStandAloneApplication';\n            }\n            return 'purecloud.acdInteraction.sessionShare.start';\n        }\n    ),\n\n    webMessagingCobrowseStartTooltip: computed('interaction.cobrowseSessionShareActive', function () {\n        if (!this.get('interaction.cobrowseSessionShareActive')) {\n            return 'purecloud.acdInteraction.cobrowseNext.startCobrowse';\n        }\n        return 'purecloud.acdInteraction.cobrowseNext.cobrowseActive';\n    }),\n\n    isCoBrowse: bool('interaction.isCoBrowse'),\n\n    isRequestingScreenShareOrCoBrowse: alias('interaction.isRequestingScreenShareOrCoBrowse'),\n\n    isRequestingVideo: alias('interaction.isRequestingVideo'),\n\n    isAgentDisconnectedFromSharedSession: reads('interaction.isAgentDisconnectedFromSharedSession'),\n\n    isCustomerDisconnectedFromSharedSession: reads('interaction.isCustomerDisconnectedFromSharedSession'),\n\n    isSessionCodeRequired: alias('interaction.isSessionCodeRequired'),\n\n    disableShareButtonReason: computed(\n        'screenShareMisconfiguration',\n        'cobrowseMisconfiguration',\n        'customerBrowserDetails.{isChrome,isFirefox,isEdgeChromium,hasChromeExtension,isStandAloneApplication}',\n        function () {\n            const customerBrowserDetails = this.customerBrowserDetails;\n            const isConfigured =\n                this.isCustomerConfiguredForCobrowse ||\n                this.isCustomerConfiguredForScreenShare ||\n                this.get('customerBrowserDetails.isStandAloneApplication');\n\n            if (!customerBrowserDetails || isConfigured) {\n                return false;\n            }\n\n            if (this.screenShareMisconfiguration) {\n                if (get(customerBrowserDetails, 'isChrome') && !get(customerBrowserDetails, 'hasChromeExtension')) {\n                    return 'purecloud.acdInteraction.sessionShare.error.noChromeExtension';\n                }\n                if (\n                    !get(customerBrowserDetails, 'isFirefox') &&\n                    !get(customerBrowserDetails, 'isChrome') &&\n                    !get(customerBrowserDetails, 'isEdgeChromium')\n                ) {\n                    return 'purecloud.acdInteraction.sessionShare.error.notUsingSupportedBrowser';\n                }\n            } else if (this.cobrowseMisconfiguration) {\n                return 'purecloud.acdInteraction.sessionShare.error.notConfiguredForCobrowse';\n            }\n        }\n    ),\n\n    disableVideoButton: bool('interactionService.hasActiveSessionShare'),\n\n    disableShareButton: computed(\n        'disableVideoButton',\n        'isCustomerConfiguredForCobrowse',\n        'isCustomerConfiguredForScreenShare',\n        'interaction.isV2Provider',\n        function () {\n            if (this.get('interaction.isV2Provider')) {\n                return false;\n            }\n            return (\n                this.disableVideoButton ||\n                !(this.isCustomerConfiguredForCobrowse || this.isCustomerConfiguredForScreenShare)\n            );\n        }\n    ),\n\n    shouldShowSessionShareButton: computed(\n        'interaction.isV2Provider',\n        'isAgentAllowedToScreenShare',\n        'isAgentAllowedToCobrowse',\n        'interaction.myselfIsMonitor',\n        'interaction.myselfIsCoach',\n        function () {\n            // session-share is not supported for v2 widgets or for MCB participants\n            if (\n                this.get('interaction.isV2Provider') ||\n                this.get('interaction.myselfIsMonitor') ||\n                this.get('interaction.myselfIsCoach')\n            ) {\n                return false;\n            }\n            // Show the button if agent has either permission\n            return this.isAgentAllowedToScreenShare || this.isAgentAllowedToCobrowse;\n        }\n    ),\n\n    enableAcdSessionShare: computed(\n        'isConnected',\n        'isCall',\n        'isChat',\n        'interaction.onConsult',\n        'isInternalProvider',\n        function () {\n            const isInternalProvider = this.isInternalProvider;\n            return (\n                isInternalProvider &&\n                (this.isCall || this.isChat) &&\n                this.isConnected &&\n                !this.get('interaction.onConsult')\n            );\n        }\n    ),\n\n    isCopilotACWEnabled: readOnly('permissions.canViewCopilot'),\n\n    callbacksInheritRoutingFromInboundCallToggle: computed('session.{features}', function () {\n        const features = this.get('session.features');\n        return features && features['callbacks.inherit.routing.from.inbound.call'];\n    }),\n\n    // ==================================================================\n    // Tasks\n    // ==================================================================\n\n    _updateCustomerParticipantName: task(function* () {\n        yield timeout(200);\n        const id = this.get('interaction.participantForCustomer.id');\n        const conversation = this.get('interaction.__interaction_metadata__');\n        if (id && conversation) {\n            const rawParticipant = this.getRawParticipant(conversation, id);\n            if (rawParticipant) {\n                return this.participantName\n                    .fetchNameFromParticipant(rawParticipant)\n                    .then(name => {\n                        this.set('_customerParticipantName', name);\n                    })\n                    .catch(() => {\n                        this.set('_customerParticipantName', null);\n                    });\n            }\n\n            this.logger.warn('ACD: Unable to find requested participant in conversation payload');\n        }\n\n        this.set('_customerParticipantName', null);\n    }).restartable(),\n\n    _updateCallbackMediaSettings: task(function* () {\n        const queueId = this.autoCallbackQueueId;\n        if (queueId) {\n            yield this.queue\n                .getQueue(queueId)\n                .then(queue => {\n                    const callbackMediaSettings = queue.mediaSettings.callback;\n                    if (callbackMediaSettings.enableAutoDialAndEnd) {\n                        this.set('callbackMediaSettings', callbackMediaSettings);\n                    } else {\n                        this.set('callbackMediaSettings', {});\n                    }\n                })\n                .catch(function () {\n                    this.set('callbackMediaSettings', {});\n                });\n        }\n    }).restartable(),\n\n    /**\n     * Retrieves the note history of the currently active interaction being viewed by the user.\n     * After fetching all of the notes it will also sort the notes in order based on\n     * endTime (when the note was submitted).\n     */\n    retrieveNotesHistory: task(function* () {\n        yield timeout(this.requestTimeout);\n\n        const interaction = this.interaction;\n        const participant = this.get('interaction.participantForCurrentUser');\n\n        if (interaction && participant) {\n            yield this.communication\n                .getAllHistoricalACWNotes(interaction)\n                .then(response => {\n                    const notesHistory = response\n                        .filter(item => item && item.notes)\n                        .sort((a, b) => {\n                            if (a.endTime > b.endTime) {\n                                return 1;\n                            } else if (a.endTime < b.endTime) {\n                                return -1;\n                            }\n                            return 0;\n                        });\n\n                    this.set('interaction.notesHistory', notesHistory);\n                })\n                .catch(() => {});\n        }\n\n        yield Promise.resolve();\n    }).restartable(),\n\n    /**\n     * Retrieves the org setting for Agent Requested based on communicationBasedACW\n     * property. Performing request at this level allows to refetch in case setting\n     * has changed.\n     */\n    fetchCommunicationBasedACWSetting: task(function* () {\n        yield timeout(3000);\n        this.interactionService.fetchCommunicationBasedACWSetting();\n    }).drop(),\n\n    /**\n     * Determines what conversations are currently being attended transferred to another participant and\n     * if any conversation has been declined so we can notify the agent that a conversation is returning to them.\n     */\n    _determineActiveAttendedTransfers: task(function* (delay = 500) {\n        yield timeout(delay);\n        const previousActiveTransfers = this.currentActiveTransfers;\n        const activeTransfers = new Map();\n\n        const activeInteractions = this.activeInteractions || [];\n        activeInteractions.forEach(interaction => {\n            if (interaction.get('isAttendedTransferring')) {\n                const id = interaction.get('id');\n                activeTransfers.set(id, interaction);\n            }\n        });\n\n        // if there were no previous active transfers, then there isn't anything to compare against\n        if (previousActiveTransfers.size) {\n            // needs to be set if there is an interaction that has been canceled.\n            let canceledInteraction = null;\n\n            // array of tasks to complete at the end of this logic\n            const tasks = [];\n\n            // if we previously had a transfer, but no longer do, then lets investigate\n            if (previousActiveTransfers.size && !activeTransfers.size) {\n                Array.from(previousActiveTransfers.values()).forEach(value => {\n                    if (value.get('wasTransferCompleted')) {\n                        if (value.get('isChat') && !value.get('isV2Provider')) {\n                            tasks.push(this.chat.leaveAcdRoom(value.get('roomId')));\n                        }\n                    } else if (value.get('wasTransferCanceled')) {\n                        canceledInteraction = value;\n                    }\n                });\n            } else {\n                // if we have more than one conversation transferring and one of them resolves\n                Array.from(previousActiveTransfers.values()).forEach(interaction => {\n                    if (!activeTransfers.has(interaction.get('id'))) {\n                        if (interaction) {\n                            if (interaction.get('wasTransferCompleted')) {\n                                if (interaction.get('isChat') && !interaction.get('isV2Provider')) {\n                                    tasks.push(this.chat.leaveAcdRoom(interaction.get('roomId')));\n                                }\n                            } else if (interaction.get('wasTransferCanceled')) {\n                                canceledInteraction = interaction;\n                            }\n                        }\n                    }\n                });\n            }\n\n            if (canceledInteraction) {\n                const mostRecentTransfer = get(canceledInteraction, 'mostRecentTransfer');\n                if (mostRecentTransfer) {\n                    const modifiedBy = get(mostRecentTransfer, 'modifiedBy.id');\n                    const initiator = get(mostRecentTransfer, 'initiator.userId');\n                    const destination = get(mostRecentTransfer, 'destination.userId');\n\n                    switch (modifiedBy) {\n                        // the initiator canceled\n                        case initiator:\n                            this._displayNotification(null, 'purecloud.acdInteraction.transferCanceled');\n                            break;\n                        // the recipient declined\n                        case destination:\n                            this._displayNotification(null, 'purecloud.acdInteraction.transferDeclined');\n                            break;\n                        // the transfer failed due to the system\n                        default:\n                            this._displayNotification(null, 'purecloud.acdInteraction.transferFailed');\n                            break;\n                    }\n                } else {\n                    this._displayNotification(null, 'purecloud.acdInteraction.transferFailed');\n                }\n            }\n\n            Promise.all(tasks).catch(error => this.logger.error('There was an issue resolving a task', error));\n        }\n\n        this.set('currentActiveTransfers', activeTransfers);\n    }).restartable(),\n\n    // ==================================================================\n    // Generic Functions\n    // ==================================================================\n\n    /**\n     * Sets the division name of the interaction based on the external contacts division\n     * or the initial division associated to the interaction.\n     */\n    _updateDivisionName() {\n        if (this.acdExternalContactDivNameFT) {\n            const setDivisionName = name => {\n                if (this && !(this.isDestroyed || this.isDestroying))\n                    run(() => {\n                        this.set('externalContactDivisionName', name);\n                    });\n            };\n            if (this.acdExternalContactWorkitemsDivNameFT) {\n                const externalContact = this._externalCanonicalContact;\n                if (externalContact) {\n                    setDivisionName(\n                        externalContact.division && externalContact.division.name\n                            ? externalContact.division.name\n                            : undefined\n                    );\n                    return;\n                }\n                if (this.workitem) {\n                    setDivisionName(undefined);\n                    return;\n                }\n                const divisionId = this.get('interaction.participantForCustomer.externalContactInitialDivisionId');\n                this.loadDivisionName(divisionId).then(divisionName => {\n                    setDivisionName(divisionName);\n                });\n            } else {\n                if (this.workitem) {\n                    setDivisionName(undefined);\n                    return;\n                }\n                const externalContact = this._externalCanonicalContact;\n                if (externalContact) {\n                    setDivisionName(\n                        externalContact.division && externalContact.division.name\n                            ? externalContact.division.name\n                            : undefined\n                    );\n                    return;\n                }\n                const divisionId = this.get('interaction.participantForCustomer.externalContactInitialDivisionId');\n                this.loadDivisionName(divisionId).then(divisionName => {\n                    setDivisionName(divisionName);\n                });\n            }\n        }\n    },\n\n    getRawParticipant: function (conversation, id) {\n        const participants = conversation.participants || [];\n        return participants.find(p => p.id === id);\n    },\n\n    _componentDestroyed() {\n        return this.isDestroyed || this.isDestroying;\n    },\n\n    setForcedPanelSelection(panel) {\n        const map = this.forcedPanelSelectionMap;\n        const panelContextKey = this.interactionPanelContextKey;\n        this.set('forcedPanelSelectionMap', Object.assign({}, map, { [panelContextKey]: panel }));\n    },\n\n    instrumentUserPanelSelection(details) {\n        const { newPanel } = details;\n        addPageAction(\n            'acdPanelManagerUserSelection',\n            Object.assign({}, details, {\n                panelSize: newPanel !== NONE_PANEL ? this.panelSizeMap[newPanel] : null,\n                userId: this.get('session.user.id'),\n                interactionId: this.get('interaction.id'),\n                interactionType: this.get('interaction.type'),\n                queueId:\n                    this.get('interaction.participantForQueue.queueId') ||\n                    this.get('interaction.participantForCurrentUser.queueId'),\n                isPef: this.get('application.isPopout')\n            })\n        );\n    },\n\n    getInteractionPanelContextKey(interaction) {\n        if (!!interaction.workitem) {\n            return `${get(interaction, 'id')}-workitem`;\n        }\n\n        const interactionId = interaction.get('id');\n        const interactionType = interaction.get('type');\n        return `${interactionId}-${interactionType}`;\n    },\n\n    _doesRequireStructuredMessage(interaction) {\n        const lastInbound = interaction.get('lastCustomerMessage');\n        if (interaction.get('subMessageType') === 'whatsapp' && lastInbound) {\n            return moment(lastInbound.timestamp).isSameOrBefore(moment().subtract(1, 'days'));\n        }\n        return false;\n    },\n\n    _handleAgentEndedCallWithError(conversationId) {\n        if (!this.agentEndedCallsWithError.includes(conversationId)) {\n            this.agentEndedCallsWithError.push(conversationId);\n        }\n    },\n\n    _computeHideTransferButtons() {\n        const iAmMonitorOrCoach =\n            this.get('interaction.myselfIsMonitor') ||\n            this.get('interaction.myselfIsCoach') ||\n            this.get('interaction.myselfIsMonitorV2');\n        const isSessionSharingActive =\n            this.get('interaction.isSessionSharing') &&\n            !this.get('interaction.isAgentDisconnectedFromSharedSession') &&\n            !this.get('interaction.isCustomerDisconnectedFromSharedSession');\n\n        const noPermissions = !this.canBlindTransfer && !this.canConsultTransfer;\n\n        this.set(\n            'hideTransferButtons',\n            iAmMonitorOrCoach ||\n                this.get('interaction.iAmConsulted') ||\n                isSessionSharingActive ||\n                this.get('interaction.isWaitingForCustomerToConnect') ||\n                this.get('interaction.cobrowseSessionShareActive') ||\n                noPermissions\n        );\n    },\n\n    _resetDropdown() {\n        this.set('showTransferDropdown', false);\n        this.set('showConferenceRoster', false);\n        this.set('showConsultTransferDropdown', false);\n        this.set('showConferenceInviteDropdown', false);\n        this.set('showParkSmsDropdown', false);\n        this.set('showHangupChoiceDropdown', false);\n    },\n\n    _endChat() {\n        if (this.isChat && this.get('chat.connected')) {\n            this.set('isEndingChat', true);\n\n            const chat = this.interaction;\n            this.acdchat\n                .endChat(chat)\n                .then(() => {\n                    this.logger.debug('ACD: End chat ' + chat.id);\n                })\n                .catch(() => {\n                    this._displayError('purecloud.acdInteraction.chats.errors.hangup');\n                })\n                .finally(() => {\n                    this.set('isEndingChat', false);\n                });\n        }\n    },\n\n    _endSms() {\n        if (this.isSms && this.isConnected) {\n            this.set('isEndingSms', true);\n            const sms = this.interaction;\n            this.acdsms\n                .endSms(sms)\n                .then(() => {\n                    this.logger.debug('ACD: End sms ' + sms.get('id'));\n                })\n                .catch(() => {\n                    this._displayError('purecloud.acdInteraction.sms.errors.hangup');\n                })\n                .finally(() => {\n                    this.set('isEndingSms', false);\n                });\n        }\n    },\n\n    _disconnect() {\n        return this.communication.disconnect(this.interaction).catch(() => {\n            this._displayError('purecloud.acdInteraction.errors.disconnect');\n        });\n    },\n\n    _park(resumeTime) {\n        const interaction = this.interaction;\n        if (interaction && !this.isParking) {\n            this.set('isParking', true);\n            return this.communication\n                .park(this.interaction, resumeTime)\n                .catch(error => {\n                    const errorResponse = get(error, 'jqXHR.responseJSON');\n                    if (\n                        errorResponse &&\n                        errorResponse.errors &&\n                        errorResponse.errors.length &&\n                        errorResponse.errors[0].code === 'conversation.error.park.user.concurrent.max.exceeded'\n                    ) {\n                        const titleKey = this.intl.t('purecloud.acdInteraction.park.limitError.title');\n                        const messageKey = this.intl.t('purecloud.acdInteraction.park.limitError.message');\n                        this.notification.error(titleKey, messageKey);\n                    } else {\n                        const titleKey = 'purecloud.acdInteraction.park.limitError.title';\n                        this._displayError(titleKey);\n                    }\n                })\n                .finally(() => {\n                    this.set('isParking', false);\n                    if (resumeTime) {\n                        this.set('showParkSmsDropdown', false);\n                    }\n                });\n        }\n    },\n\n    _handleConversationSummaryEvent(event) {\n        const interaction = this.interaction;\n        if (!interaction || (!get(interaction, 'isAgentAssistACWEnabled') && !this.isCopilotACWEnabled)) return;\n\n        const summaryEvt = event;\n        try {\n            const summaryFromStorage = JSON.parse(localStorage.getItem(AGENT_ASSIST_SUMMARY_KEY) || '{}') || {};\n            summaryFromStorage[summaryEvt.conversationId] = summaryEvt;\n            localStorage.setItem(AGENT_ASSIST_SUMMARY_KEY, JSON.stringify(summaryFromStorage));\n        } catch (err) {\n            this.logger.error('Error storing summary data in the local storage', {\n                conversationId: this.get('interaction.id'),\n                error: err\n            });\n        }\n    },\n\n    _joinChat() {\n        if (this.isChat && this.isInternalProvider && !this.isV2ChatProvider && this.get('chat.connected')) {\n            const state = this.get('interaction.interactionState');\n            const chat = this.interaction;\n\n            // If the user is still connected, we can re-enter\n            // the room\n            if (state.toLowerCase() === participantStatus.CONNECTED.toLowerCase()) {\n                this.acdchat.answerChat(chat).then(room => {\n                    this.set('room', room);\n                    this.chat.activateRoom(room);\n                });\n\n                // If the user isn't connected, we can at least focus\n                // the room if it's still active. If we still have the room\n                // object set -- it should still be active.\n            } else if (this.get('interaction.room')) {\n                const room = this.get('interaction.room');\n                this.set('room', room);\n\n                // If we're not connected, and the room isn't active,\n                // we don't rejoin the room (it'll create a new participant).\n            } else {\n                this.set('room', null);\n            }\n        }\n    },\n\n    _shouldShowWrapup(interaction) {\n        return interaction.get('isDisconnected') || interaction.get('isTerminated');\n    },\n\n    _getInteractionURL() {\n        const id = this.get('interaction.id');\n        const hostname = window.location.hostname;\n        const pathname = window.location.pathname;\n        const port = window.location.port;\n\n        if (id && port) {\n            return `https://${hostname}:${port}${pathname}#/${INTERACTIONS_PATH}/${id}`;\n        } else if (id) {\n            return `https://${hostname}${pathname}#/${INTERACTIONS_PATH}/${id}`;\n        }\n\n        return null;\n    },\n\n    _setUpCopyBtn() {\n        let interactionCopyBtn;\n\n        let getURL = () => {\n            return run(() => {\n                if (this.get('interaction.id')) {\n                    if (this.showInteractionGUID) {\n                        return this.get('interaction.id');\n                    }\n                    return this._getInteractionURL();\n                }\n                return '';\n            });\n        };\n\n        interactionCopyBtn = new Clipboard('.copy-interaction-url-btn', { text: getURL });\n        interactionCopyBtn.on('success', () => {\n            run(() => this._displayNotification(null, 'purecloud.acdInteraction.copyLinkSuccess'));\n        });\n        this.set('interactionCopyBtn', interactionCopyBtn);\n    },\n\n    _setUpExternalCustomerPhoneNumberCopyBtn() {\n        let customerPhoneNumberCopyBtn;\n\n        let getCustomerPhoneNumber = () => {\n            return run(() => {\n                return this.formattedCustomerPhoneNumber;\n            });\n        };\n\n        customerPhoneNumberCopyBtn = new Clipboard('.copy-external-campaign-customer-phonenumber-btn', {\n            text: getCustomerPhoneNumber\n        });\n        customerPhoneNumberCopyBtn.on('success', () => {\n            run(() =>\n                this._displayNotification(null, 'purecloud.acdInteraction.callbacks.customerPhoneNumberCopyLinkSuccess')\n            );\n        });\n        this.set('customerPhoneNumberCopyBtn', customerPhoneNumberCopyBtn);\n    },\n\n    _beginSessionShare() {\n        const customerId = this.get('interaction.participantForCustomer.id');\n        this.set('interaction.sessionShareDisconnectTimer', null);\n        this.set('interaction.isRequestingNewSessionShare', true); //This will get reset to false when the customer is connected.\n        this.set('interaction.sessionShareExplicitlyInitiated', true); // will remain true until session is terminated\n        this.communication\n            .initiateSessionShare(this.interaction, customerId)\n            .then(([codeResponse, mediaRequestResponse]) => {\n                if (codeResponse) {\n                    if (this.get('interaction.isV2Provider') && mediaRequestResponse) {\n                        this.set('interaction.mediaRequestState', mediaRequestResponse.state);\n                    }\n                    this.set('interaction.sessionShareCode', codeResponse.addCommunicationCode);\n                    this.set('interaction.sourceCommunicationId', codeResponse.sourceCommunicationId);\n                    this.interaction.trigger('sessionShareCodeHasChanged', this.get('interaction.id'));\n                }\n            })\n            .catch(err => {\n                this.logger.error('Error beginning session share:', { err });\n                this._displayError('purecloud.acdInteraction.errors.sessionShare');\n            })\n            .finally(() => {\n                this.set('isRequestingScreenShareOrCoBrowse', false);\n                this.set('isRequestingVideo', false);\n            });\n    },\n\n    _changeState(state) {\n        const conversation = this.get('interaction.conversation');\n        const interaction = this.interaction;\n        const consultActive =\n            this.get('interaction.iAmConsultInitiator') && this.get('interaction.isThereAConsultAgentParticipant');\n        if (state === 'held') {\n            if (consultActive) {\n                const participant = interaction.get('consultParticipant');\n                const confined = participant.calls[0].confined;\n                if (confined) {\n                    this.communication.consultBoth(interaction).catch(() => {\n                        this._displayError('purecloud.acdInteraction.calls.errors.hold');\n                    });\n                } else {\n                    this.communication.consultDestination(interaction).catch(() => {\n                        this._displayError('purecloud.acdInteraction.calls.errors.hold');\n                    });\n                }\n            } else {\n                this.phone.hold(conversation);\n            }\n        } else if (state === 'muted') {\n            this.phone.mute(conversation);\n        } else if (state === 'end') {\n            this.phone.endCallForAll(conversation);\n        } else if (state === 'hangup') {\n            this.phone.endCall(conversation);\n        } else if (state === 'pause') {\n            if (this.isRecordingPaused) {\n                this.communication.unpause(interaction).catch(() => {\n                    this._displayError('purecloud.acdInteraction.calls.errors.pause');\n                });\n            } else {\n                this.communication.pause(interaction).catch(() => {\n                    this._displayError('purecloud.acdInteraction.calls.errors.pause');\n                });\n            }\n        } else {\n            this.phone.handlePhoneStatusChange(state, conversation);\n        }\n    },\n\n    /**\n     * Determines the options needed for a call based on the participants instance model\n     */\n    _getInteractionOptions(participant, forConference = false) {\n        const options = {};\n\n        if (participant instanceof PersonModel) {\n            options['userId'] = get(participant, 'id');\n        } else if (participant instanceof QueueModel) {\n            options['queueId'] = get(participant, 'id');\n        } else if (this.isCall) {\n            if (participant instanceof GroupModel) {\n                options['address'] =\n                    participant.get('number.value.number') || participant.get('number.value.extension');\n            } else if (\n                participant instanceof RelateExternalContactModel ||\n                participant instanceof ExternalContactModel\n            ) {\n                if (!forConference) {\n                    const rawPhoneType = get(participant, 'getRawPhoneType');\n                    if (typeof rawPhoneType === 'function') {\n                        const phoneType = rawPhoneType.call(participant);\n\n                        //function to format key: 'workPhone' => 'WorkPhone'\n                        const formatKey = function (key) {\n                            if (!key || typeof key !== 'string') return '';\n                            return key.charAt(0).toUpperCase() + key.slice(1);\n                        };\n\n                        if (phoneType && get(participant, 'id')) {\n                            options['contactId'] = get(participant, 'id');\n                            options['phoneType'] = formatKey(phoneType);\n                        }\n                    } else {\n                        this.logger.error('ACD Transfer: getRawPhoneType not found');\n                        if (get(participant, 'id')) {\n                            options['contactId'] = get(participant, 'id');\n                            options['phoneType'] = 'CellPhone'; //Default fallback in error case\n                        }\n                    }\n                } else {\n                    options['address'] = get(participant, 'phoneNumber') || get(participant, 'bestPhoneNumber');\n                }\n            } else if (get(participant, 'phoneNumber')) {\n                options['address'] = get(participant, 'phoneNumber');\n            }\n        } else if (this.isEmail && get(participant, 'email')) {\n            options['address'] = get(participant, 'email');\n        }\n\n        if (Object.keys(options).length === 0 && get(participant, 'id')) {\n            options['userId'] = get(participant, 'id');\n        }\n\n        return options;\n    },\n\n    /**\n     * Determines what integration is currently being utilized and if any options need to be applied\n     */\n    async _getIntegrationOptions(participant, integrationKey) {\n        const transferType = get(participant, 'type');\n\n        let options = {};\n        let isIntegrationTransfer = false;\n\n        if (transferType === 'person') {\n            try {\n                const integrationTarget = await this.phoneIntegrations.getIntegrationTransferTarget(\n                    participant,\n                    integrationKey\n                );\n                if (integrationTarget) {\n                    options['address'] = integrationTarget;\n                    isIntegrationTransfer = true;\n                }\n            } catch (err) {\n                this.logger.error(\n                    'ACD PBX Transfer: attempted to fetch integration target, but failed. Falling back to entity guid.',\n                    { err }\n                );\n            }\n        }\n\n        return {\n            options,\n            isIntegrationTransfer,\n            transferType\n        };\n    },\n\n    /**\n     * Invoked when the user wants to return back to the conference roster from the invite view\n     */\n    _onBackToConferenceRoster() {\n        this.set('showConferenceInviteDropdown', false);\n        this.set('showConferenceRoster', true);\n    },\n\n    /**\n     * Invoked when a user selects a contact to start or update a conference with\n     *\n     * @param {any} participant The data to start or update a conference with\n     */\n    async _onConferenceDataSelected(participant) {\n        const options = this._getInteractionOptions(participant, true);\n        const interactionId = this.get('interaction.id');\n        const url = this.communication.participantsUri(interactionId, 'calls');\n\n        try {\n            await this.ajax.post(url, {\n                dataType: 'json',\n                data: {\n                    participants: [options]\n                }\n            });\n            this._onBackToConferenceRoster();\n        } catch (error) {\n            this.logger.error('There was an issue adding a participant to the call', error);\n        }\n    },\n\n    /**\n     * Transfers the interaction to the provided participant blindly\n     *\n     * @param {any} participant the participant to transfer the interaction to\n     */\n    async _onBlindTransferDataSelected(participant, integrationKey) {\n        this._resetDropdown();\n        if (this.isChat && !this.get('chat.connected')) {\n            return;\n        }\n\n        let { options, isIntegrationTransfer, transferType } = await this._getIntegrationOptions(\n            participant,\n            integrationKey\n        );\n\n        // Handle workitem transfer\n        const workitemInteraction = this.workitem;\n\n        if (workitemInteraction && !!workitemInteraction.workitem && participant) {\n            return this._handleWorkitemTransfer(workitemInteraction, participant);\n        }\n\n        // Regular conversation transfer\n        const interaction = this.interaction;\n        const transferToType = get(participant, 'type');\n\n        if (Object.keys(options).length === 0) {\n            options = this._getInteractionOptions(participant);\n        } else {\n            this.logger.error(`ACD: Unsupported transfer type:`, {\n                options,\n                isIntegrationTransfer,\n                remoteData: {\n                    transferType: transferToType,\n                    conversationId: interaction.id\n                }\n            });\n            return;\n        }\n\n        // only agent-to-agent digital conversations should not be attended transferred\n        if (!this.isCall && !this.isCallback && transferToType === 'person') {\n            options['transferType'] = 'Attended';\n        }\n\n        let success = false;\n\n        try {\n            await this.communication.transfer(interaction, null, options, transferType);\n            this.set('showTransferDropdown', true);\n            success = true;\n        } catch (error) {\n            if (error && error.jqXHR) {\n                this._displayApiError(error.jqXHR, 'purecloud.acdInteraction.errors.transfer');\n            } else {\n                this._displayApiError(null, 'purecloud.acdInteraction.errors.transfer');\n                this.logger.error('Error transferring interaction', {\n                    options,\n                    isIntegrationTransfer,\n                    remoteData: {\n                        conversationId: interaction.get('id')\n                    }\n                });\n            }\n        }\n\n        // Capture analytics & send to new relic for UC Integrations\n        if (isIntegrationTransfer) {\n            this.phoneIntegrations.sendNewRelicAction(\n                'acd-blind-transfer',\n                success ? 'success' : 'error',\n                integrationKey\n            );\n        }\n    },\n\n    /**\n     * Adds a consulting participant to the current interaction\n     *\n     * @param {any} participant the participant to add\n     */\n    async _onTransferDataSelected(participant, integrationKey) {\n        this._resetDropdown();\n\n        let { options, isIntegrationTransfer, transferType } = await this._getIntegrationOptions(\n            participant,\n            integrationKey\n        );\n\n        const interaction = this.interaction;\n        if (Object.keys(options).length === 0 && this.isCall) {\n            options = this._getInteractionOptions(participant);\n        } else {\n            this.logger.error(`ACD: Unsupported transfer type:`, {\n                destination: options,\n                isIntegrationTransfer,\n                remoteData: {\n                    transferType: get(participant, 'type'),\n                    conversationId: interaction.id\n                }\n            });\n            return;\n        }\n\n        let success = false;\n        try {\n            await this.communication.initiateConsult(interaction, options, transferType);\n            success = true;\n        } catch (error) {\n            if (error) {\n                if (error.message === 'customer not present') {\n                    this.logger.error('ACD: Unsupported consult, customer must be present to consult');\n                    this._displayError('purecloud.acdInteraction.consultError', null);\n                } else if (error.jqXHR) {\n                    this._displayApiError(error.jqXHR, 'purecloud.acdInteraction.errors.transfer');\n                }\n            }\n        }\n\n        // Capture analytics & send to new relic for UC Integrations\n        if (isIntegrationTransfer) {\n            this.phoneIntegrations.sendNewRelicAction(\n                'acd-consult-transfer',\n                success ? 'success' : 'error',\n                integrationKey\n            );\n        }\n    },\n\n    async _onDismissParticipant(participant) {\n        const interactionId = this.get('interaction.id');\n        const participantId = get(participant, 'id');\n        const url = this.application.pcV2Uri(\n            `api/v2/conversations/calls/${interactionId}/participants/${participantId}`\n        );\n\n        try {\n            await this.ajax.patch(url, {\n                dataType: 'json',\n                data: {\n                    state: 'disconnected'\n                }\n            });\n        } catch (error) {\n            this.logger.error('There was an issue adding a participant to the call', error);\n        }\n    },\n\n    /**\n     * Cancels the blind transfer that the agent initiated to bring the conversation back to them.\n     */\n    async _onCancelBlindTransfer() {\n        const interaction = this.interaction;\n        const participant = this.transferringToParticipant;\n\n        try {\n            await this.communication.cancelTransfer(interaction, participant);\n        } catch (error) {\n            this.logger.error('There was an issue cancelling the blind transfer', error);\n        } finally {\n            this._resetDropdown();\n        }\n    },\n\n    /**\n     * Transfer workitem interaction to an agent or a queue.\n     * @param workitemInteraction\n     * @param participant\n     * @private\n     */\n    async _handleWorkitemTransfer(workitemInteraction, participant) {\n        const { id, type } = getProperties(participant, 'id', 'type');\n        const transferOptions = {};\n        if (type === 'person') {\n            transferOptions.userId = id;\n        } else if (type === 'queue') {\n            transferOptions.queueId = id;\n        } else {\n            throw new Error('Unrecognized workitem transfer type.');\n        }\n        try {\n            await this.acdworkitem.transfer(workitemInteraction, type, transferOptions);\n            this._displayNotification(\n                'purecloud.acdInteraction.transfer',\n                'purecloud.acdInteraction.workitem.transferSuccess'\n            );\n            this.set('workitem', null);\n        } catch (error) {\n            const errorMessage =\n                error && error.jqXHR && error.jqXHR.status === 403\n                    ? 'purecloud.acdInteraction.workitem.errors.transfer'\n                    : 'purecloud.acdInteraction.errors.transfer';\n\n            this._displayError(errorMessage);\n        }\n    },\n\n    _disconnectWorkitem() {\n        return this.acdworkitem\n            .disconnect(this.workitem)\n            .then(() => this.set('workitem', null))\n            .catch(error => {\n                if (error.payload && error.payload.code === 'too.many.requests.retry.after') {\n                    this._displayError('purecloud.acdInteraction.workitem.errors.rateLimit');\n                } else {\n                    this._displayError('purecloud.acdInteraction.workitem.errors.disconnect');\n                }\n            });\n    },\n\n    _parkWorkitem() {\n        return this.acdworkitem\n            .park(this.workitem)\n            .then(() => this.set('workitem', null))\n            .catch(error => {\n                if (error.payload && error.payload.code === 'too.many.requests.retry.after') {\n                    this._displayError('purecloud.acdInteraction.workitem.errors.rateLimit');\n                } else {\n                    this._displayError('purecloud.acdInteraction.workitem.errors.park');\n                }\n            });\n    },\n\n    /**\n     * Places a call for the current callback using the first available phone number.\n     */\n    beginCallbackDefaultNumber() {\n        if (this.get('callbackNumbers.length') > 0) {\n            return this.beginCallback(this.get('callbackNumbers.firstObject'));\n        } else {\n            return Promise.reject('No numbers to dial');\n        }\n    },\n\n    holdAllOtherCalls() {\n        const promises = [];\n\n        const allInteractions = this.get('interactionService.activeInteractions');\n        allInteractions.forEach(currentInteraction => {\n            const { type, isConnected, isHeld } = currentInteraction;\n            if (type === 'call' && isConnected && !isHeld) {\n                promises.push(this.communication.hold(currentInteraction).catch(() => {}));\n            }\n        });\n        return promises;\n    },\n\n    /**\n     * Answers a callback using the given phone number.\n     * @param {Object} phoneNumber - the number to dial, from the callbackNumbers array\n     */\n    beginCallback(phoneNumber) {\n        this.set('showNumbersDropdownClbk', false);\n        this.set('isDialingClbk', true);\n\n        //\n        // We are no longer auto holding existing calls when a new call is being\n        // placed from a callback. This update ensures that other connected calls (if any)\n        // are being placed on hold when a callback call is being initiated.\n        //\n        return all(this.holdAllOtherCalls())\n            .then(() => {\n                return this.acdcallback.beginCallback(this.interaction, phoneNumber.number, phoneNumber.phoneColumn);\n            })\n            .catch(error => {\n                let errorCode = get(error, 'jqXHR.responseJSON.code');\n                let reason;\n\n                if (!errorCode || errorCode === 'conversation.error') {\n                    errorCode = 'begin';\n                } else if (errorCode === 'conversation.error.callback.call.cannot.be.placed') {\n                    reason = get(error, 'jqXHR.responseJSON.messageParams.reason');\n                    errorCode = 'blocked.' + (reason || 'unknown');\n                    if (reason !== 'CALL_ALREADY_PLACED') {\n                        this.get('interaction.placedBlockedCalls').addObject(phoneNumber.number);\n                    }\n                }\n\n                const messageKey = 'purecloud.acdInteraction.callbacks.errors.' + errorCode;\n                if (!_.includes(NOTIFICATION_HANDLED_REJECTIONS, reason)) {\n                    this._displayError(messageKey);\n                }\n            })\n            .finally((() => this.set('isDialingClbk', false)).bind(this));\n    },\n\n    /**\n     * Skip the current callback; the callback will NOT be routed to another agent.\n     */\n    skipCallback() {\n        return this.acdcallback\n            .skipCallback(this.interaction)\n            .catch(() => this._displayError('purecloud.acdInteraction.callbacks.errors.skip'));\n    },\n\n    /**\n     * Wrap up and disconnect the current callback.\n     */\n    endCallback() {\n        return this.acdcallback\n            .endCallback(this.interaction)\n            .catch(() => this._displayError('purecloud.acdInteraction.callbacks.errors.end'));\n    },\n\n    // TODO: Ultimately, we need to store these values somewhere other\n    // than the model. We may introduce a persistance service that will\n    // allow us to store interaction properties by id and persist them\n    // back to the public API via the preference API.\n    modelSet(model, property, value) {\n        if (model && !get(model, 'isDestroyed') && !get(model, 'isDestroying')) {\n            model.set(property, value);\n        }\n    },\n\n    _displayApiError(error, fallbackMessageKey) {\n        const code = _.get(error, 'responseJSON.code');\n        const key = code && `error.${code}`;\n        this._displayError(key && this.intl.exists(key) ? key : fallbackMessageKey);\n    },\n\n    _displayError(messageKey, messageKeyOption) {\n        const message = this.intl.t(messageKey, messageKeyOption).toString();\n        this.notification.error(null, message, {});\n    },\n\n    _displayNotification(titleKey, messageKey) {\n        let title = null;\n        let message = null;\n\n        if (titleKey) {\n            title = this.intl.t(titleKey).toString();\n        }\n\n        if (messageKey) {\n            message = this.intl.t(messageKey).toString();\n        }\n\n        this.notification.info(title, message);\n    },\n\n    _isInDOM() {\n        const isDestroyed =\n            this.isDestroyed ||\n            this.isDestroying ||\n            !this.interaction ||\n            this.get('interaction.isDestroyed') ||\n            this.get('interaction.isDestroying');\n\n        if (isDestroyed) {\n            return false;\n        } else if (this.get('interaction.isCall')) {\n            const conversation = this.get('interaction.conversation');\n            const conversationIsDestroyed =\n                !conversation || conversation.get('isDestroying') || conversation.get('isDestroyed');\n            if (conversationIsDestroyed) {\n                return false;\n            }\n        }\n\n        return true;\n    },\n\n    getInteractionTypeFromCP(interaction) {\n        let type = {\n            isCall: false,\n            isFax: false,\n            isChat: false,\n            isEmail: false,\n            isCallback: false,\n            isSms: false\n        };\n        const myselfAgent = _.findLast(interaction.participants, party => {\n            let partyIsUser = _.has(party, 'userId') ? party.userId === this.personGuid : false;\n            let partyIsAgent = _.has(party, 'purpose') ? party.purpose.toLowerCase() === 'agent' : false;\n            return partyIsUser && partyIsAgent;\n        });\n        type.isCallback = myselfAgent ? _.has(myselfAgent, 'callbacks') && myselfAgent.callbacks.length : false;\n        type.isCall = _.some(interaction.participants, party => !_.isEmpty(party.calls));\n        type.isFax = _.some(interaction.participants, party =>\n            _.has(party, 'purpose') ? party.purpose === 'fax' : false\n        );\n        type.isChat = _.some(interaction.participants, party => !_.isEmpty(party.chats));\n        type.isEmail = _.some(interaction.participants, party => !_.isEmpty(party.emails));\n        type.isSms = _.some(interaction.participants, party => !_.isEmpty(party.messages));\n\n        return type;\n    },\n\n    handleMissedTimedBoxTimer(ctx, payload, Interaction) {\n        // ownerInjection() must be the first arg in Ember 3.28\n        const tmpInteractionModel = Interaction.create(getOwner(ctx).ownerInjection());\n        Object.keys(payload).forEach(key => {\n            tmpInteractionModel.set(key, payload[key]);\n        });\n        const interactionHasMissedTimer = get(tmpInteractionModel, 'hasMissedTimer');\n        if (tmpInteractionModel && interactionHasMissedTimer) {\n            const titleKey = 'purecloud.acdInteraction.aftercallworkTitleMessage';\n            const messageKey = 'purecloud.acdInteraction.aftercallworkTimerExpiredBodyMessage';\n            this._displayNotification(titleKey, messageKey);\n        }\n        if (tmpInteractionModel) {\n            tmpInteractionModel.destroy();\n        }\n    },\n\n    windowInFocus() {\n        var hosted;\n        hosted = this.get('applicationService.hostedContext');\n        if (hosted != null ? hosted.isHosted() : void 0) {\n            return hosted.applicationHasFocus();\n        } else {\n            return document.hasFocus();\n        }\n    },\n\n    timeDiff(timeCreated) {\n        const diff = moment().diff(timeCreated);\n        if (diff < 500) {\n            this.logger.info('ACD: interaction create destroy diff', { diff });\n        }\n    },\n\n    // ==================================================================\n    // Actions\n    // ==================================================================\n\n    actions: {\n        /**\n         * Adds the corresponding participant to the active conversation to either make it a conference\n         * or add to the currently active conference\n         *\n         * @param {object} participant the participant to add to the conference\n         */\n        onConferenceDataSelected(participant) {\n            this._onConferenceDataSelected(participant);\n        },\n        /**\n         * Initiates a blind transfer to the corresponding participant\n         *\n         * @param {object} participant the participant to initiate a blind transfer with\n         * @param {string} integrationKey key corresponding to the corresponding integration desired\n         */\n        onBlindTransferDataSelected(participant, integrationKey) {\n            this._onBlindTransferDataSelected(participant, integrationKey);\n        },\n        /**\n         * Invoked when the user opts to cancel the blind transfer that they originally initiated\n         */\n        onCancelBlindTransfer() {\n            this._onCancelBlindTransfer();\n        },\n        /**\n         * Initiates a consult transfer to the corresponding participant\n         *\n         * @param {object} participant the participant to consult transfer with\n         * @param {string} integrationKey key corresponding to the corresponding integration desired\n         */\n        onTransferDataSelected(participant, integrationKey) {\n            this._onTransferDataSelected(participant, integrationKey);\n        },\n        /**\n         * Returns the user back to the conference roster, typically from the conversation participant dropdown\n         */\n        onBackToConferenceRoster() {\n            this._onBackToConferenceRoster();\n        },\n        /**\n         * Invoked when a participant has been connected within a conference\n         */\n        onConferenceParticipantConnected() {\n            this.set('showConferenceRoster', false);\n            this.set('showConferenceInviteDropdown', false);\n        },\n        /**\n         * Invoked when the user wants to leave the currently active conversation but\n         * keep the connection open if the conversation is a conference.\n         */\n        onLeaveCall() {\n            this.set('showHangupChoiceDropdown', false);\n            this._changeState('hangup');\n        },\n        /**\n         * Used for conferencing. Ends the connection for all participants that are connected\n         * to the active conversation.\n         */\n        onEndCallForAll() {\n            this.set('showHangupChoiceDropdown', false);\n            this._changeState('end');\n        },\n\n        onUserInitiatedPanelSelection(details) {\n            const { newPanel } = details;\n            const staticPanels = this.staticPanelConfigs;\n            const isStaticPanel = !!staticPanels.find(panel => panel.get('id') === newPanel);\n            // Ignore interapption panels for now since focusing iframe contents is tricky\n            if (isStaticPanel) {\n                run.scheduleOnce('afterRender', function () {\n                    let focusTarget = `.tabpanel-${newPanel}`;\n                    if (document.querySelectorAll(`.tabpanel-${newPanel} input`).length) {\n                        focusTarget = `.tabpanel-${newPanel} input:first`;\n                    } else if (document.querySelectorAll(`.tabpanel-${newPanel} textarea`).length) {\n                        focusTarget = `.tabpanel-${newPanel} textarea:first`;\n                    }\n                    doFocus(Ember, focusTarget);\n                });\n            }\n            this.instrumentUserPanelSelection(details);\n        },\n        instrumentPanelManagerStateUpdate(details) {\n            addPageAction(\n                'acdPanelManagerV3StateUpdate',\n                Object.assign({}, details, {\n                    panelSize: this.panelSize,\n                    userId: this.get('session.user.id'),\n                    interactionId: this.get('interaction.id'),\n                    interactionType: this.get('interaction.type'),\n                    queueId:\n                        this.get('interaction.participantForQueue.queueId') ||\n                        this.get('interaction.participantForCurrentUser.queueId'),\n                    isPef: this.get('application.isPopout')\n                })\n            );\n        },\n        onPanelSizeChanged(size) {\n            const map = this.panelSizeMap;\n            const userId = this.get('session.user.id');\n            const panel = this._effectivePanelSelection;\n            const prevSize = map[panel];\n            const updatedMap = Object.assign({}, map, { [panel]: size });\n            // Save our new panel size preferences\n            this.set('panelSizeMap', updatedMap);\n            this.preferences.setPreference(`panelManager.${userId}`, updatedMap).catch(e => {\n                this.logger.error('Error saving panelManager preferences:', { error: e });\n                return {};\n            });\n            addPageAction('acdPanelManagerUserResize', {\n                userId: this.get('session.user.id'),\n                interactionId: this.get('interaction.id'),\n                interactionType: this.get('interaction.type'),\n                queueId:\n                    this.get('interaction.participantForQueue.queueId') ||\n                    this.get('interaction.participantForCurrentUser.queueId'),\n                isPef: this.get('application.isPopout'),\n                panel,\n                prevSize,\n                newSize: size\n            });\n        },\n        onPanelSelectionChanged(panel) {\n            this.set('_effectivePanelSelection', panel);\n            if (this.onSubPanelSelectionChanged) {\n                this.onSubPanelSelectionChanged(panel);\n            }\n        },\n        clearForcedPanelSelection() {\n            const interaction = this.interaction;\n            if (!interaction) return;\n            this.setForcedPanelSelection(null);\n        },\n        onOfferMessage({ injectionMode, proposedMessage, conversationId }) {\n            const appPoolV2 = this.appPoolV2;\n            if (!appPoolV2 || !this.hasConversationAppForCurrInteraction) {\n                return;\n            }\n\n            if (!proposedMessage) {\n                this.logger.error('Failed to build propose message offer');\n                return;\n            }\n\n            appPoolV2.sendMessageToHost(\n                AppsV2.buildOfferMessageMessage(\n                    ['replaceAll', 'insert'].includes(injectionMode) ? injectionMode : 'insert',\n                    proposedMessage,\n                    conversationId\n                )\n            );\n            return;\n        },\n        insertChatText(text) {\n            this.insertChatText(text);\n        },\n        insertSmsText(response) {\n            this.insertSmsText(response);\n        },\n        insertEmailText(text) {\n            this.insertEmailText(text);\n        },\n        setOpenPanel(openPanel) {\n            if (this.setOpenPanel) {\n                this.setOpenPanel(openPanel);\n            }\n        },\n        closePanel() {\n            this.bubbleAction({\n                action: 'closePanel'\n            });\n        },\n        toggleTransfer() {\n            this.set('showConferenceRoster', false);\n            this.set('showConferenceInviteDropdown', false);\n            this.set('showConsultTransferDropdown', false);\n            this.set('showHangupChoiceDropdown', false);\n            this.toggleProperty('showTransferDropdown');\n        },\n        toggleConsult() {\n            this.set('showConferenceRoster', false);\n            this.set('showConferenceInviteDropdown', false);\n            this.set('showHangupChoiceDropdown', false);\n            this.set('showTransferDropdown', false);\n            this.toggleProperty('showConsultTransferDropdown');\n        },\n        toggleConference() {\n            this.set('showConsultTransferDropdown', false);\n            this.set('showHangupChoiceDropdown', false);\n            this.set('showTransferDropdown', false);\n\n            if (this.activeConference) {\n                if (this.showConferenceRoster || this.showConferenceInviteDropdown) {\n                    this.set('showConferenceRoster', false);\n                    this.set('showConferenceInviteDropdown', false);\n                } else {\n                    this.set('showConferenceRoster', true);\n                }\n            } else {\n                if (this.showConferenceRoster) {\n                    this.set('showConferenceInviteDropdown', false);\n                } else {\n                    this.toggleProperty('showConferenceInviteDropdown');\n                }\n                this.set('showConferenceRoster', false);\n            }\n        },\n        /**\n         * Sets the mute state of the corresponding participant based on the provided muted value\n         * @param {object} participant the participant to affect the muted state of\n         * @param {boolean} muted boolean value depicting the what the muted value of the participant should become\n         */\n        async onMuteParticipant(participant, muted) {\n            const interactionId = this.get('interaction.id');\n            const participantId = get(participant, 'id');\n            const url = this.application.pcV2Uri(\n                `api/v2/conversations/calls/${interactionId}/participants/${participantId}`\n            );\n\n            try {\n                await this.ajax.patch(url, {\n                    dataType: 'json',\n                    data: { muted }\n                });\n            } catch (error) {\n                this.logger.error('There was an issue adding a participant to the call', error);\n            }\n        },\n        async onMuteAllParticipants() {\n            const participants = this.participants || [];\n            const interactionId = this.get('interaction.id');\n            const url = this.application.pcV2Uri(`api/v2/conversations/calls/${interactionId}/participants`);\n\n            try {\n                await this.ajax.patch(url, {\n                    dataType: 'json',\n                    data: {\n                        participants: participants.map(p => ({ id: p.id, muted: true }))\n                    }\n                });\n            } catch (error) {\n                this.logger.error('There was an issue adding a participant to the call', error);\n            }\n        },\n        onDismissParticipant(participant) {\n            this._onDismissParticipant(participant);\n        },\n        inviteParticipantToConference() {\n            this.set('showConferenceRoster', false);\n            this.toggleProperty('showConferenceInviteDropdown');\n        },\n        toggleDTMFDialpad() {\n            this.toggleProperty('showDTMFDialpadDropdown', true);\n        },\n        toggleNumbers() {\n            this.toggleProperty('showNumbersDropdown');\n        },\n        toggleNumbersClbk() {\n            this.toggleProperty('showNumbersDropdownClbk');\n        },\n        toggleMuteAudio() {\n            this.toggleProperty('audioIsMuted');\n        },\n        toggleSecurePause() {\n            this._timers.push(run.throttle(this, this.actions.changeState, 'pause', 1000));\n        },\n        endChat() {\n            this._endChat();\n        },\n        disconnect() {\n            this._disconnect();\n        },\n        park(resumeTime) {\n            this._park(resumeTime);\n        },\n        onTogglePopover(prop, popoverId) {\n            const popover = document.querySelector(popoverId);\n            const popoverState = popover ? popover.isOpen : false;\n            const newState = !popoverState;\n            this.set(prop, newState);\n            if (popover) popover.isOpen = newState;\n        },\n        endSms() {\n            this._endSms();\n        },\n        /**\n         * Invoked when the user attempts to hangup a call.\n         * If the call is an active conference and they are the host they\n         * can choose to end the call for everyone or just leave the call\n         * themselves.\n         */\n        onHangup() {\n            if (this.activeConference && this.isHostParticipant) {\n                // fetch current state first before resetting\n                const showingHangupDropdown = this.showHangupChoiceDropdown;\n\n                this._resetDropdown();\n                this.set('showHangupChoiceDropdown', !showingHangupDropdown);\n            } else {\n                this._changeState('hangup');\n            }\n        },\n        changeState(state) {\n            this._changeState(state);\n        },\n        changeScriptSize(size) {\n            const currentSize = this.scriptSize;\n            const currentSizeIndex = scriptSizes.indexOf(currentSize);\n            const newSizeIndex = (currentSizeIndex + 1) % scriptSizes.length;\n\n            let newSize = size === undefined ? scriptSizes[newSizeIndex] : size;\n            this.set('scriptSize', newSize);\n\n            const currentUserId = this.get('session.publicApiUser.id');\n            const preferences = this.preferences;\n            return preferences.getPreference(`scripts.${currentUserId}`).then((prefs = {}) => {\n                const newPrefs = Object.assign({}, prefs, { scriptSize: newSize });\n                return preferences.setPreference(`scripts.${currentUserId}`, newPrefs);\n            });\n        },\n        beginCallDefaultNumber() {\n            this.beginCallDefaultNumber();\n        },\n        beginCall(phoneNumber) {\n            this.beginCall(phoneNumber);\n        },\n        skipPreview() {\n            this.skipPreview();\n        },\n        beginCallbackDefaultNumber() {\n            throttle(this, this.beginCallbackDefaultNumber, CALLBACK_THROTTLE_TIME);\n        },\n        beginCallback(phoneNumber) {\n            throttle(this, this.beginCallback, phoneNumber, CALLBACK_THROTTLE_TIME);\n        },\n        skipCallback() {\n            this.skipCallback();\n        },\n        beginScreenShareOrCoBrowse() {\n            this.set('isRequestingScreenShareOrCoBrowse', true);\n            this.set('isSessionCodeRequired', true);\n            this.set('interaction.isSessionShareDisconnected', false);\n            this.set('interaction.isCobrowseV2Disconnected', false);\n            this.set('interaction.isCobrowseV2', false);\n            this._beginSessionShare();\n        },\n        showCobrowseV2() {\n            this.set('interaction.cobrowseSessionShareActive', true);\n            this.set('interaction.sessionShareActiveOnLoad', true);\n            this.set('interaction.isCobrowseV2', true);\n            this.set('interaction.isCobrowseV2Disconnected', false);\n            this.set('selectedInteraction.hasScreenSharePermissionError', false);\n        },\n        beginVideoShare() {\n            if (!this.get('webrtc.activeBridge')) {\n                this._displayError('purecloud.acdInteraction.sessionShare.noVideoError');\n                return;\n            }\n\n            this.set('isRequestingVideo', true);\n            this.set('isSessionCodeRequired', true);\n            this._beginSessionShare();\n        },\n        endSessionShare() {\n            this._endSessionShare();\n        },\n        selectInteraction(interaction) {\n            this.triggerAction({\n                action: 'selectInteraction',\n                actionContext: [interaction]\n            });\n        },\n        toggleAcdVoicemail() {\n            this.toggleProperty('acdVoicemailPlayerVisible');\n        },\n        updateACWRequest() {\n            this.set('isLoadingAcwRequest', true);\n            const agentCommunicationId = this.get('interaction.agentCommunicationId');\n\n            const interactionId = this.get('interaction.id');\n            const participantId = this.get('interaction.participantForCurrentUser.id');\n            if (this.get('interaction.isCommunicationAfterCallWorkRequested')) {\n                this.communication\n                    .skipAcw(interactionId, participantId, agentCommunicationId)\n                    .catch(() => {\n                        this._displayError('purecloud.acdInteraction.requestACWError');\n                    })\n                    .finally(() => {\n                        this.set('isLoadingAcwRequest', false);\n                    });\n            } else {\n                this.communication\n                    .requestAcw(interactionId, participantId, agentCommunicationId)\n                    .catch(() => {\n                        this._displayError('purecloud.acdInteraction.requestACWError');\n                    })\n                    .finally(() => {\n                        this.set('isLoadingAcwRequest', false);\n                    });\n            }\n        },\n        parkWorkitem() {\n            this._parkWorkitem();\n        },\n        disconnectWorkitem() {\n            this._disconnectWorkitem();\n        }\n    }\n});\n","import { inject as service } from '@ember/service';\nimport { reads, readOnly } from '@ember/object/computed';\nimport Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport AcdUtilitiesMixin from 'web-directory/mixins/acd-utilities';\n\nexport default Component.extend(AcdUtilitiesMixin, LoggerMixin, {\n    classNames: ['acd-consult-controls'],\n    communication: service(),\n    intl: service(),\n    permissions: service(),\n\n    interaction: null,\n    customerName: null,\n    waitingConfineCustomer: false,\n    waitingConfineAgent: false,\n\n    participantForCurrentUser: readOnly('interaction.participantForCurrentUser'),\n    consultParticipant: reads('interaction.consultParticipant'),\n    consultAgentParticipant: reads('interaction.consultAgentParticipant'),\n\n    isCustomerConfined: reads('consultParticipant.calls.firstObject.confined'),\n    isAgentConfined: reads('consultAgentParticipant.calls.firstObject.confined'),\n    isHeld: reads('interaction.participantForCurrentUser.calls.firstObject.held'),\n\n    consultParticipantHeldTitle: computed('interaction.consultParticipant.calls.firstObject.confined', function () {\n        let key = 'purecloud.acdInteraction.consultTransfer.';\n        const customerName = this.customerName;\n        const options = {};\n\n        if (!!customerName) {\n            key += 'objectNamed.';\n            options.name = customerName;\n        } else {\n            key += 'object.';\n        }\n\n        if (this.get('interaction.consultParticipant.calls.firstObject.confined')) {\n            key += 'unhold';\n        } else {\n            key += 'hold';\n        }\n\n        return this.intl.t(key, options);\n    }),\n\n    consultAgentParticipantHeldTitle: computed(\n        'interaction.consultAgentParticipant.calls.firstObject.confined',\n        function () {\n            let key = 'purecloud.acdInteraction.consultTransfer.destination.hold';\n            if (this.get('interaction.consultAgentParticipant.calls.firstObject.confined')) {\n                key = 'purecloud.acdInteraction.consultTransfer.destination.unhold';\n            }\n            return this.intl.t(key);\n        }\n    ),\n\n    consulteeNotConnected: computed('consultAgentParticipant.calls.firstObject.state', function () {\n        const stateStr = this.get('consultAgentParticipant.calls.firstObject.state');\n\n        return stateStr !== 'connected';\n    }),\n\n    muteTooltipTitle: computed('interaction.conversation.isMuted', function () {\n        let key = 'purecloud.acdInteraction.mute';\n        if (this.get('interaction.conversation.isMuted')) {\n            key = 'purecloud.acdInteraction.unmute';\n        }\n        return this.intl.t(key);\n    }),\n\n    actions: {\n        toggleDTMFDialpad() {\n            this.toggleProperty('showDTMFDialpadDropdown');\n        },\n\n        changeState: function (state) {\n            this.bubbleAction({\n                action: 'changeState',\n                actionContext: [state]\n            });\n        },\n\n        toggleSecurePause: function () {\n            this.bubbleAction({\n                action: 'toggleSecurePause'\n            });\n        },\n\n        // Change Consult Object State (initiator)\n        changeObjectState: async function (state) {\n            if ('held' === state && this.isHeld) {\n                await this.unHoldAndSpeakTo('customer');\n            } else if ('held' === state) {\n                if (this.isCustomerConfined) {\n                    await this.speakToBoth();\n                } else {\n                    await this.speakToAgent();\n                }\n            } else if ('hangup' === state) {\n                await this.hangUp('customer');\n            }\n        },\n\n        morphConsultToConference: function () {\n            this.speakToConference();\n        },\n\n        // Change Consult Desitination Object State (transfer recipient)\n        changeDestinationState: async function (state) {\n            if ('held' === state && this.isHeld) {\n                await this.unHoldAndSpeakTo('agent');\n            } else if ('held' === state) {\n                if (this.isAgentConfined) {\n                    await this.speakToBoth();\n                } else {\n                    await this.speakToCustomer();\n                }\n            } else if ('hangup' === state) {\n                await this.hangUp('agent');\n            }\n        },\n\n        completeConsultTransfer: function () {\n            const consultInitiator = this.participantForCurrentUser;\n\n            const callId = this.get('interaction.id');\n            const type = this.get('interaction.type');\n            return this.communication.disconnectParticipant(callId, consultInitiator.id, type).catch(() => {\n                this._displayError('purecloud.acdInteraction.errors.completeTransfer');\n            });\n        },\n\n        updateACWRequest: function () {\n            this.attrs.updateACWRequest();\n        }\n    },\n\n    hangUp: async function (participant) {\n        const interaction = this.interaction;\n        const callId = this.get('interaction.id');\n        const type = this.get('interaction.type');\n        let participantId = this.get('consultParticipant.id');\n\n        if ('agent' === participant) {\n            participantId = this.get('consultAgentParticipant.id');\n            await this.communication.cancelConsult(interaction).catch(() => {});\n        }\n\n        return this.communication.disconnectParticipant(callId, participantId, type).catch(() => {\n            this._displayError('purecloud.acdInteraction.errors.disconnectParticipant');\n        });\n    },\n\n    speakToBoth() {\n        const interaction = this.interaction;\n\n        this.set('waitingConfineCustomer', true);\n        this.set('waitingConfineAgent', true);\n\n        return this.communication\n            .consultBoth(interaction)\n            .catch(() => {\n                this._displayError('purecloud.acdInteraction.calls.errors.hold');\n            })\n            .finally(() => {\n                this.modelSet(this, 'waitingConfineCustomer', false);\n                this.modelSet(this, 'waitingConfineAgent', false);\n            });\n    },\n\n    speakToAgent() {\n        const interaction = this.interaction;\n        this.set('waitingConfineCustomer', true);\n        this.set('waitingConfineAgent', true);\n\n        return this.communication\n            .consultDestination(interaction)\n            .catch(() => {\n                this._displayError('purecloud.acdInteraction.calls.errors.hold');\n            })\n            .finally(() => {\n                this.modelSet(this, 'waitingConfineCustomer', false);\n                this.modelSet(this, 'waitingConfineAgent', false);\n            });\n    },\n\n    speakToConference() {\n        const interaction = this.interaction;\n\n        return this.communication.consultConference(interaction).catch(() => {\n            this._displayError('purecloud.error.dialpad.participants');\n        });\n    },\n\n    speakToCustomer() {\n        const interaction = this.interaction;\n\n        this.set('waitingConfineCustomer', true);\n        this.set('waitingConfineAgent', true);\n\n        return this.communication\n            .consultObject(interaction)\n            .catch(() => {\n                this._displayError('purecloud.acdInteraction.calls.errors.hold');\n            })\n            .finally(() => {\n                this.modelSet(this, 'waitingConfineCustomer', false);\n                this.modelSet(this, 'waitingConfineAgent', false);\n            });\n    },\n\n    // ACE-1793, handle unholding conversation behind the scenes\n    // If conversation was held, we need to ignore current confinement\n    // state to set desired state based on user action.\n    unHoldAndSpeakTo: async function (speakTo) {\n        await this.unHold();\n        if ('customer' === speakTo) {\n            return this.speakToCustomer();\n        } else {\n            return this.speakToAgent();\n        }\n    },\n\n    unHold() {\n        const interaction = this.interaction;\n        return this.communication.unhold(interaction).catch(() => {\n            this._displayError('purecloud.acdInteraction.calls.errors.hold');\n        });\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"2MGdXDio\",\"block\":\"[[[10,0],[14,0,\\\"consult-interaction\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"consult-interaction-section-0\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"consult-interaction-control-section-joint\\\"],[12],[1,\\\"\\\\n\\\"],[6,[39,0],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[[33,1],\\\"acd-interactions-panel.interaction show dialpad on consult\\\"]],[[\\\"default\\\"],[[[[1,\\\"                \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link enabled dialpad-toggle\\\"],[16,1,[29,[[36,2],\\\"-dtmf-dialpad\\\"]]],[16,\\\"aria-label\\\",[28,[37,3],[\\\"purecloud.toggleDialpad\\\"],null]],[16,\\\"aria-expanded\\\",[52,[33,1],\\\"true\\\",\\\"false\\\"]],[24,4,\\\"button\\\"],[4,[38,5],[[30,0],\\\"toggleDTMFDialpad\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"phone-dialpad\\\"],[15,\\\"screenreader-text\\\",[28,[37,3],[\\\"purecloud.toggleDialpad\\\"],null]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,2],\\\"-dtmf-dialpad\\\"]]],[14,\\\"placement\\\",\\\"bottom\\\"],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,3],[\\\"purecloud.acdInteraction.dialPad\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,0],[15,0,[29,[\\\"dialpad-dtmf-dropdown \\\",[52,[51,[33,1]],\\\"hide\\\"]]]],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,7],null,[[\\\"addingParticipants\\\",\\\"showTitle\\\",\\\"showDialpad\\\",\\\"showCallInput\\\",\\\"isAcdDTMF\\\",\\\"sendDtmf\\\"],[false,false,[33,1],false,true,true]]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"consult-interaction-section-1\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"consult-interaction-controls customer-controls\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"consult-interaction-control-section\\\"],[12],[1,\\\"\\\\n                \\\"],[11,\\\"button\\\"],[16,1,[29,[[36,2],\\\"-consult-object-hold-btn\\\"]]],[16,0,[29,[\\\"btn btn-link interaction-hold-btn consult-object-hold-btn\\\\n                        \\\",[52,[28,[37,8],[[33,9,[\\\"isCall\\\"]],[33,9,[\\\"isConnected\\\"]]],null],\\\"enabled\\\"],\\\"\\\\n                        \\\",[52,[33,10,[\\\"calls\\\",\\\"firstObject\\\",\\\"confined\\\"]],\\\"interaction-held\\\"]]]],[16,\\\"aria-label\\\",[36,11]],[24,4,\\\"button\\\"],[4,[38,5],[[30,0],\\\"changeObjectState\\\",\\\"held\\\"],null],[12],[1,\\\"\\\\n\\\"],[41,[33,12],[[[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin loading-indicator\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[15,0,[29,[[52,[33,10,[\\\"calls\\\",\\\"firstObject\\\",\\\"confined\\\"]],\\\"consult-on-hold\\\"]]]],[14,\\\"icon-name\\\",\\\"control-pause\\\"],[15,\\\"screenreader-text\\\",[36,11]],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,2],\\\"-consult-object-hold-btn\\\"]]],[12],[1,\\\"\\\\n                    \\\"],[1,[34,11]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"consult-interaction-control-section\\\"],[12],[1,\\\"\\\\n                \\\"],[11,\\\"button\\\"],[16,1,[29,[[36,2],\\\"-consult-object-end-btn\\\"]]],[16,0,[29,[\\\"btn btn-link interaction-end-btn consult-object-end-btn\\\\n                        \\\",[52,[28,[37,8],[[33,9,[\\\"isCall\\\"]],[33,9,[\\\"isConnected\\\"]]],null],\\\"enabled\\\"],\\\"\\\\n                        \\\",[52,[28,[37,8],[[33,9,[\\\"isCall\\\"]],[33,9,[\\\"conversation\\\",\\\"isDialing\\\"]]],null],\\\"enabled\\\"]]]],[16,\\\"aria-label\\\",[28,[37,3],[\\\"purecloud.acdInteraction.consultTransfer.object.hangup\\\"],null]],[24,4,\\\"button\\\"],[4,[38,5],[[30,0],\\\"changeObjectState\\\",\\\"hangup\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/phone-hangup\\\"],[15,\\\"screenreader-text\\\",[28,[37,3],[\\\"purecloud.acdInteraction.consultTransfer.object.hangup\\\"],null]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,2],\\\"-consult-object-end-btn\\\"]]],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,3],[\\\"purecloud.acdInteraction.consultTransfer.objectNamed.hangup\\\"],[[\\\"name\\\"],[[28,[37,13],[[33,14],\\\"\\\"],null]]]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"consult-interaction-controls agent-controls\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"consult-interaction-control-section\\\"],[12],[1,\\\"\\\\n                \\\"],[11,\\\"button\\\"],[16,1,[29,[[36,2],\\\"-consult-destination-hold-btn\\\"]]],[16,\\\"aria-label\\\",[36,15]],[16,0,[29,[\\\"btn btn-link interaction-hold-btn consult-destination-hold-btn\\\\n                        \\\",[52,[28,[37,8],[[33,9,[\\\"isCall\\\"]],[33,9,[\\\"isConnected\\\"]]],null],\\\"enabled\\\"],\\\"\\\\n                        \\\",[52,[33,16,[\\\"calls\\\",\\\"firstObject\\\",\\\"confined\\\"]],\\\"interaction-held\\\"]]]],[24,4,\\\"button\\\"],[4,[38,5],[[30,0],\\\"changeDestinationState\\\",\\\"held\\\"],null],[12],[1,\\\"\\\\n\\\"],[41,[33,17],[[[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin loading-indicator\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,16,[\\\"calls\\\",\\\"firstObject\\\",\\\"confined\\\"]],[[[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"consult-on-hold\\\"],[14,\\\"icon-name\\\",\\\"control-pause\\\"],[15,\\\"screenreader-text\\\",[36,15]],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"control-pause\\\"],[15,\\\"screenreader-text\\\",[36,15]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]],[]]],[1,\\\"                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,2],\\\"-consult-destination-hold-btn\\\"]]],[12],[1,\\\"\\\\n                    \\\"],[1,[34,15]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"consult-interaction-control-section\\\"],[12],[1,\\\"\\\\n                \\\"],[11,\\\"button\\\"],[16,1,[29,[[36,2],\\\"-consult-destination-end-btn\\\"]]],[16,0,[29,[\\\"btn btn-link interaction-end-btn consult-destination-end-btn\\\\n                        \\\",[52,[28,[37,8],[[33,9,[\\\"isCall\\\"]],[33,9,[\\\"isConnected\\\"]]],null],\\\"enabled\\\"],\\\"\\\\n                        \\\",[52,[28,[37,8],[[33,9,[\\\"isCall\\\"]],[33,9,[\\\"conversation\\\",\\\"isDialing\\\"]]],null],\\\"enabled\\\"]]]],[16,\\\"aria-label\\\",[28,[37,3],[\\\"purecloud.acdInteraction.consultTransfer.destination.hangup\\\"],null]],[24,4,\\\"button\\\"],[4,[38,5],[[30,0],\\\"changeDestinationState\\\",\\\"hangup\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/phone-hangup\\\"],[15,\\\"screenreader-text\\\",[28,[37,3],[\\\"purecloud.acdInteraction.consultTransfer.destination.hangup\\\"],null]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,2],\\\"-consult-destination-end-btn\\\"]]],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,3],[\\\"purecloud.acdInteraction.consultTransfer.destination.hangup\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"consult-interaction-section-2\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"consult-interaction-control-section-joint\\\"],[12],[1,\\\"\\\\n            \\\"],[11,\\\"button\\\"],[16,1,[29,[[36,2],\\\"-complete-consult-btn\\\"]]],[24,0,\\\"btn btn-link enabled complete-consult-btn\\\"],[16,\\\"aria-label\\\",[28,[37,3],[\\\"purecloud.acdInteraction.consultTransfer.both.transfer\\\"],null]],[24,4,\\\"button\\\"],[4,[38,5],[[30,0],\\\"completeConsultTransfer\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"arrow-right\\\"],[15,\\\"screenreader-text\\\",[28,[37,3],[\\\"purecloud.acdInteraction.consultTransfer.both.transfer\\\"],null]],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,2],\\\"-complete-consult-btn\\\"]]],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,3],[\\\"purecloud.acdInteraction.consultTransfer.both.transfer\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[14,0,\\\"consult-interaction-control-section-joint\\\"],[12],[1,\\\"\\\\n            \\\"],[11,\\\"button\\\"],[16,1,[29,[[36,2],\\\"-morph-to-conference-btn\\\"]]],[16,\\\"aria-label\\\",[28,[37,3],[\\\"purecloud.acdInteraction.conference\\\"],null]],[16,0,[29,[\\\"btn btn-link enabled morph-to-conference-btn \\\",[52,[33,18],\\\"temporarily-disabled\\\"]]]],[16,\\\"disabled\\\",[36,18]],[24,4,\\\"button\\\"],[4,[38,5],[[30,0],\\\"morphConsultToConference\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"conference\\\"],[14,\\\"icon-name\\\",\\\"legacy/people\\\"],[15,\\\"screenreader-text\\\",[28,[37,3],[\\\"purecloud.acdInteraction.conference\\\"],null]],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,2],\\\"-morph-to-conference-btn\\\"]]],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,3],[\\\"purecloud.acdInteraction.conference\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[14,0,\\\"consult-interaction-control-section-joint\\\"],[12],[1,\\\"\\\\n            \\\"],[11,\\\"button\\\"],[16,1,[29,[[36,2],\\\"-mute-all-consult-btn\\\"]]],[16,0,[29,[\\\"btn btn-link interaction-mute-btn mute-all-consult-btn\\\\n                    \\\",[52,[33,9,[\\\"conversation\\\",\\\"isMuted\\\"]],\\\"consult-muted\\\"],\\\"\\\\n                    \\\",[52,[28,[37,8],[[33,9,[\\\"isCall\\\"]],[33,9,[\\\"isConnected\\\"]]],null],\\\"enabled\\\"]]]],[16,\\\"aria-label\\\",[36,19]],[24,4,\\\"button\\\"],[4,[38,5],[[30,0],\\\"changeState\\\",\\\"muted\\\"],null],[12],[1,\\\"\\\\n\\\"],[41,[33,20,[\\\"loading\\\",\\\"muted\\\"]],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin loading-indicator\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,9,[\\\"conversation\\\",\\\"isMuted\\\"]],[[[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"microphone-disable\\\"],[15,\\\"screenreader-text\\\",[36,19]],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"microphone\\\"],[15,\\\"screenreader-text\\\",[36,19]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,2],\\\"-mute-all-consult-btn\\\"]]],[12],[1,\\\"\\\\n                \\\"],[1,[34,19]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,8],[[33,9,[\\\"isConnected\\\"]],[33,9,[\\\"isCall\\\"]],[33,9,[\\\"canTogglePause\\\"]],[33,21,[\\\"canSecurePause\\\"]]],null],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"consult-interaction-control-section-joint\\\"],[12],[1,\\\"\\\\n                \\\"],[11,\\\"button\\\"],[16,1,[29,[[36,2],\\\"-secure-pause-btn\\\"]]],[16,0,[29,[\\\"btn btn-link interaction-secure-pause-btn enabled\\\\n                        \\\",[52,[33,22],\\\"interaction-paused\\\"]]]],[16,\\\"aria-label\\\",[28,[37,3],[\\\"purecloud.acdInteraction.securePause\\\"],null]],[24,4,\\\"button\\\"],[4,[38,5],[[30,0],\\\"toggleSecurePause\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"lock-hold\\\"],[15,\\\"screenreader-text\\\",[28,[37,3],[\\\"purecloud.acdInteraction.securePause\\\"],null]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,2],\\\"-secure-pause-btn\\\"]]],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,3],[\\\"purecloud.acdInteraction.securePause\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,23],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"consult-interaction-control-section-joint\\\"],[12],[1,\\\"\\\\n                \\\"],[11,\\\"button\\\"],[16,1,[29,[[36,2],\\\"-acw-request-btn\\\"]]],[16,0,[29,[\\\"btn btn-link acw-request-btn enabled\\\\n                        \\\",[52,[33,9,[\\\"isCommunicationAfterCallWorkRequested\\\"]],\\\"acw-requested\\\",\\\"acw-skipped\\\"]]]],[16,\\\"aria-label\\\",[28,[37,3],[[33,24]],null]],[24,4,\\\"button\\\"],[4,[38,5],[[30,0],\\\"updateACWRequest\\\"],null],[12],[1,\\\"\\\\n\\\"],[41,[33,25],[[[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin loading-indicator\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"user\\\"],[15,\\\"screenreader-text\\\",[28,[37,3],[[33,24]],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,2],\\\"-acw-request-btn\\\"]]],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,3],[[33,24]],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"drop-down\\\",\\\"showDTMFDialpadDropdown\\\",\\\"elementId\\\",\\\"t\\\",\\\"if\\\",\\\"action\\\",\\\"unless\\\",\\\"dial-pad\\\",\\\"and\\\",\\\"interaction\\\",\\\"consultParticipant\\\",\\\"consultParticipantHeldTitle\\\",\\\"waitingConfineCustomer\\\",\\\"or\\\",\\\"customerName\\\",\\\"consultAgentParticipantHeldTitle\\\",\\\"consultAgentParticipant\\\",\\\"waitingConfineAgent\\\",\\\"consulteeNotConnected\\\",\\\"muteTooltipTitle\\\",\\\"phone\\\",\\\"permissions\\\",\\\"isRecordingPaused\\\",\\\"showAgentRequestACWButton\\\",\\\"skipACWTooltipTitle\\\",\\\"isLoadingAcwRequest\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel/interaction/interaction-consult-controls/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { inject } from '@ember/service';\nimport { warnClosureAction } from 'web-directory/utils/acd';\nimport { standardTransformationFtComputedDepKey, transformPanelId } from 'web-directory/utils/transform-panels';\nexport const NONE_PANEL = 'none';\n\nexport default Component.extend({\n    // Need to set to '' to avoid extra div wrapper\n    tagName: '',\n\n    session: inject('session'),\n\n    // List of available panels\n    panels: null,\n\n    // If set, overrides user & initial selection\n    forcedPanelSelection: null,\n\n    // Maps panelContextKey -> user panel selection\n    // Maintain state to support \"sticky\" panel behavior\n    userPanelSelectionMap: null,\n\n    panelContextKey: null,\n    activePanelContextKeys: null,\n\n    _prevSelectionState: null,\n    _prevPanelContextKey: null,\n\n    // Represents user selection states, overrides initial selection\n    userPanelSelection: computed('panelContextKey', 'userPanelSelectionMap', function () {\n        const panelContextKey = this.panelContextKey;\n        return this.userPanelSelectionMap[panelContextKey] || null;\n    }),\n\n    // The panel selection to honor if the user has not explicitly selected a panel\n    initialPanelSelection: null,\n\n    // Compute the actual panel selection\n    effectivePanelSelection: computed(\n        'panels',\n        'forcedPanelSelection',\n        'userPanelSelection',\n        'initialPanelSelection',\n        standardTransformationFtComputedDepKey,\n        function () {\n            const features = this.session.get('features');\n            let forced = this.forcedPanelSelection;\n            // Transform the forced panelIds internally so the \"api\" doesn't have to change\n            // e.g. 'wrapup' works regardless of panel provider (native or decomped)\n            forced = transformPanelId(forced, features);\n            // The user selection panelIds should use the transformed value inherently\n            // however, if the panelIds are changed behind the scenes due to a FT change,\n            // we need to transform the panel to maintain selection.\n            const user = transformPanelId(this.userPanelSelection, features);\n            // Initial panel id will be transformed externally\n            // when fetching default panel settings or reading the query params\n            const initial = this.initialPanelSelection;\n            if (forced && this._isPanelAvailable(forced)) return forced;\n            if (user && this._isPanelAvailable(user)) return user;\n            if (initial && this._isPanelAvailable(initial)) return initial;\n            return NONE_PANEL;\n        }\n    ),\n\n    init() {\n        this._super(...arguments);\n        this.set('_prevSelectionState', {});\n        this.set('userPanelSelectionMap', {});\n        if (this.setOpenPanel) {\n            this.setOpenPanel(this.openPanel.bind(this));\n        }\n    },\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n        const userSelectionMap = this.userPanelSelectionMap;\n        const activePanelContextKeys = this.activePanelContextKeys;\n        const cleanedUserSelectionMap = activePanelContextKeys.reduce((acc, key) => {\n            if (key in userSelectionMap) {\n                acc[key] = userSelectionMap[key];\n            }\n            return acc;\n        }, {});\n        this.set('userPanelSelectionMap', cleanedUserSelectionMap);\n    },\n\n    onPanelSelectionChanged: selection => warnClosureAction('onPanelSelectionChanged', { selection }),\n    clearForcedPanelSelection: () => warnClosureAction('clearForcedPanelSelection'),\n    onUserInitiatedPanelSelection: () => warnClosureAction('onUserInitiatedPanelSelection'),\n    instrumentPanelManagerStateUpdate: () => warnClosureAction('instrumentPanelManagerStateUpdate'),\n\n    didRender() {\n        this._super(...arguments);\n        const prevPanelContextKey = this._prevPanelContextKey;\n        const prevSelection = this._prevSelectionState;\n        const prevUserSelection = prevSelection.user || null;\n        const prevForcedSelection = prevSelection.forced || null;\n        const prevInitialSelection = prevSelection.initial || null;\n        const prevEffectiveSelection = prevSelection.effective || null;\n\n        const newPanelContextKey = this.panelContextKey;\n        const newForcedSelection = this.forcedPanelSelection;\n        const newUserSelection = this.userPanelSelection;\n        const newInitialSelection = this.initialPanelSelection;\n        const newEffectiveSelection = this.effectivePanelSelection;\n\n        const effectiveSelectionChanged = newEffectiveSelection !== prevEffectiveSelection;\n        const panelContextKeyChanged = prevPanelContextKey !== newPanelContextKey;\n\n        if (this.onPanelSelectionChanged && effectiveSelectionChanged) {\n            this.onPanelSelectionChanged(newEffectiveSelection);\n        }\n\n        if (this.instrumentPanelManagerStateUpdate && (effectiveSelectionChanged || panelContextKeyChanged)) {\n            this.instrumentPanelManagerStateUpdate({\n                prevEffectiveSelection,\n                prevForcedSelection,\n                prevUserSelection,\n                prevInitialSelection,\n                prevPanelContextKey,\n                newEffectiveSelection,\n                newForcedSelection,\n                newUserSelection,\n                newInitialSelection,\n                newPanelContextKey\n            });\n        }\n\n        this.set('_prevPanelContextKey', newPanelContextKey);\n        this.set('_prevSelectionState', {\n            forced: newForcedSelection,\n            user: newUserSelection,\n            initial: newInitialSelection,\n            effective: newEffectiveSelection\n        });\n    },\n\n    openPanel(panelId) {\n        const prevPanel = this.effectivePanelSelection;\n        const panelContextKey = this.panelContextKey;\n        const newPanel = prevPanel === panelId ? NONE_PANEL : panelId;\n        const updatedMap = Object.assign({}, this.userPanelSelectionMap, {\n            [panelContextKey]: newPanel\n        });\n        this.set('userPanelSelectionMap', updatedMap);\n        // Since a user has manually clicked a panel, clear the forced selection\n        if (this.clearForcedPanelSelection) {\n            this.clearForcedPanelSelection();\n        }\n        if (this.onUserInitiatedPanelSelection) {\n            this.onUserInitiatedPanelSelection({\n                prevPanel,\n                newPanel\n            });\n        }\n    },\n\n    actions: {\n        onUserPanelSelection(_, panel) {\n            this.openPanel(panel);\n        }\n    },\n\n    _isPanelAvailable(panel) {\n        return this.panels.indexOf(panel) >= 0;\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"pfDIPHm3\",\"block\":\"[[[41,[48,[30,1]],[[[1,\\\"    \\\"],[18,1,[[33,3],[28,[37,4],[[30,0],\\\"onUserPanelSelection\\\"],null]]],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"&default\\\"],false,[\\\"if\\\",\\\"has-block\\\",\\\"yield\\\",\\\"effectivePanelSelection\\\",\\\"action\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel/interaction/panel-manager/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\n\nexport default Component.extend({\n    classNames: ['interactions-panel-sizer'],\n\n    showTooltip: false,\n\n    setPanelSize: () => {},\n    changeScriptSize: () => {},\n\n    actions: {\n        toggleTooltip() {\n            this.toggleProperty('showTooltip');\n        },\n\n        selectPanelSize(num, userClicked = false) {\n            this.setPanelSize(num, userClicked);\n            this.set('showTooltip', false);\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"A5FrXLQ9\",\"block\":\"[[[10,\\\"button\\\"],[15,\\\"onclick\\\",[28,[37,0],[[30,0],\\\"toggleTooltip\\\"],null]],[14,0,\\\"panel-resizer\\\"],[15,\\\"aria-label\\\",[28,[37,1],[\\\"purecloud.acdInteraction.panelResizer\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\\n\\\"],[1,\\\"    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/resize-handle\\\"],[15,\\\"screenreader-text\\\",[28,[37,1],[\\\"purecloud.acdInteraction.panelResizer\\\"],null]],[14,0,\\\"svg-icon resize-handle\\\"],[12],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[15,0,[29,[\\\"sizing-tooltip \\\",[52,[28,[37,3],[[33,4]],null],\\\"hide\\\"]]]],[12],[1,\\\"\\\\n    \\\"],[11,\\\"button\\\"],[16,0,[29,[\\\"interactions-panel-sizing-choice clickable \\\",[52,[28,[37,5],[[33,6],100],null],\\\"selected\\\"]]]],[24,\\\"data-size\\\",\\\"100\\\"],[16,\\\"aria-label\\\",[28,[37,1],[\\\"purecloud.acdInteraction.panelResizerFull\\\"],null]],[24,4,\\\"button\\\"],[4,[38,0],[[30,0],\\\"selectPanelSize\\\",100,true],null],[12],[13],[1,\\\"\\\\n    \\\"],[11,\\\"button\\\"],[16,0,[29,[\\\"interactions-panel-sizing-choice clickable \\\",[52,[28,[37,5],[[33,6],75],null],\\\"selected\\\"]]]],[24,\\\"data-size\\\",\\\"75\\\"],[16,\\\"aria-label\\\",[28,[37,1],[\\\"purecloud.acdInteraction.panelResizer3Quarter\\\"],null]],[24,4,\\\"button\\\"],[4,[38,0],[[30,0],\\\"selectPanelSize\\\",75,true],null],[12],[13],[1,\\\"\\\\n    \\\"],[11,\\\"button\\\"],[16,0,[29,[\\\"interactions-panel-sizing-choice clickable \\\",[52,[28,[37,5],[[33,6],50],null],\\\"selected\\\"]]]],[24,\\\"data-size\\\",\\\"50\\\"],[16,\\\"aria-label\\\",[28,[37,1],[\\\"purecloud.acdInteraction.panelResizerHalf\\\"],null]],[24,4,\\\"button\\\"],[4,[38,0],[[30,0],\\\"selectPanelSize\\\",50,true],null],[12],[13],[1,\\\"\\\\n    \\\"],[11,\\\"button\\\"],[16,0,[29,[\\\"interactions-panel-sizing-choice clickable \\\",[52,[28,[37,5],[[33,6],25],null],\\\"selected\\\"]]]],[24,\\\"data-size\\\",\\\"25\\\"],[16,\\\"aria-label\\\",[28,[37,1],[\\\"purecloud.acdInteraction.panelResizerQuarter\\\"],null]],[24,4,\\\"button\\\"],[4,[38,0],[[30,0],\\\"selectPanelSize\\\",25,true],null],[12],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"action\\\",\\\"t\\\",\\\"if\\\",\\\"not\\\",\\\"showTooltip\\\",\\\"eq\\\",\\\"currPanelSize\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel/interaction/panel-sizer/template.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"mT87/auT\",\"block\":\"[[[10,0],[14,0,\\\"interaction-header\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[15,0,[29,[\\\"interaction-type-icon\\\\n            \\\",[52,[28,[37,1],[[33,2],[33,3,[\\\"isThirdPartyMessenger\\\"]]],null],\\\"third-party-messenger\\\"],\\\"\\\\n            \\\",[52,[33,2],[33,3,[\\\"subMessageType\\\"]]]]]],[12],[1,\\\"\\\\n        \\\"],[10,1],[14,0,\\\"interaction-detail-type-indicator\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,4],null,[[\\\"type\\\",\\\"subtype\\\",\\\"engagementSource\\\",\\\"state\\\",\\\"size\\\",\\\"isDisconnected\\\",\\\"isCampaign\\\",\\\"acdEngagementSourcesFT\\\"],[[52,[33,5],\\\"workitem\\\",[33,3,[\\\"type\\\"]]],[33,3,[\\\"subMessageType\\\"]],[33,3,[\\\"engagementSource\\\"]],[33,6],\\\"large\\\",[28,[37,7],[[33,3,[\\\"isDisconnected\\\"]],[33,3,[\\\"isTerminated\\\"]]],null],[33,3,[\\\"isCampaignCallback\\\"]],[33,8]]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"header-text-container\\\"],[12],[1,\\\"\\\\n        \\\"],[10,2],[14,0,\\\"participant-name\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[34,9]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,1],[[33,10],[33,11]],null],[[[6,[39,12],null,null,[[\\\"default\\\"],[[[[1,\\\"                \\\"],[1,[34,11]],[1,\\\"\\\\n\\\"]],[]]]]]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,1],[[33,13],[33,14]],null],[[[1,\\\"            \\\"],[10,2],[14,0,\\\"external-campaign\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,15],[\\\"purecloud.acdInteraction.callbacks.externalCampaign\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[51,[28,[37,7],[[33,13],[33,5]],null]],[[[41,[33,17],[[[1,\\\"            \\\"],[10,\\\"button\\\"],[15,1,[29,[[36,18],\\\"-interaction-url-work-item-button\\\"]]],[14,0,\\\"btn copy-interaction-url-btn\\\"],[15,\\\"aria-label\\\",[28,[37,15],[\\\"purecloud.acdInteraction.copyLink\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"copy\\\"],[15,\\\"screenreader-text\\\",[28,[37,15],[\\\"purecloud.acdInteraction.copyLink\\\"],null]],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,18],\\\"-interaction-url-work-item-button\\\"]]],[14,\\\"placement\\\",\\\"bottom\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,15],[\\\"purecloud.acdInteraction.copyLink\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,19],[[[1,\\\"            \\\"],[10,2],[14,0,\\\"participant-number\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,20],[[33,21]],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,1],[[33,3,[\\\"connectedTime\\\"]],[28,[37,22],[[33,3,[\\\"isAlerting\\\"]]],null]],null],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"participant-detail-timer\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[15,\\\"aria-label\\\",[28,[37,15],[\\\"purecloud.acdInteraction.connectedSince\\\"],[[\\\"connectedTime\\\"],[[33,23]]]]],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,7],[[33,24],[33,25]],null],[[[1,\\\"                    \\\"],[1,[28,[35,26],null,[[\\\"durationInMs\\\"],[[33,3,[\\\"connectedDuration\\\"]]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[1,[28,[35,26],null,[[\\\"startTime\\\"],[[33,3,[\\\"connectedTime\\\"]]]]]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[6,[39,27],null,[[\\\"panels\\\",\\\"panelContextKey\\\",\\\"activePanelContextKeys\\\",\\\"initialPanelSelection\\\",\\\"forcedPanelSelection\\\",\\\"onPanelSelectionChanged\\\",\\\"clearForcedPanelSelection\\\",\\\"onUserInitiatedPanelSelection\\\",\\\"setOpenPanel\\\",\\\"instrumentPanelManagerStateUpdate\\\"],[[33,28],[33,29],[33,30],[33,31],[33,32],[28,[37,33],[[30,0],\\\"onPanelSelectionChanged\\\"],null],[28,[37,33],[[30,0],\\\"clearForcedPanelSelection\\\"],null],[28,[37,33],[[30,0],\\\"onUserInitiatedPanelSelection\\\"],null],[28,[37,33],[[30,0],\\\"setOpenPanel\\\"],null],[28,[37,33],[[30,0],\\\"instrumentPanelManagerStateUpdate\\\"],null]]],[[\\\"default\\\"],[[[[41,[28,[37,1],[[33,3,[\\\"iAmConsultInitiator\\\"]],[33,3,[\\\"isThereAConsultAgentParticipant\\\"]]],null],[[[1,\\\"        \\\"],[1,[28,[35,34],null,[[\\\"interaction\\\",\\\"showAgentRequestACWButton\\\",\\\"skipACWTooltipTitle\\\",\\\"updateACWRequest\\\",\\\"customerName\\\",\\\"isRecordingPaused\\\"],[[33,3],[33,35],[33,36],[28,[37,33],[[30,0],\\\"updateACWRequest\\\"],null],[33,9],[33,37]]]]],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"consult-panel-wrapper\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,38],null,[[\\\"classNames\\\",\\\"onchange\\\",\\\"toggleItemConfigs\\\",\\\"selection\\\",\\\"attentionStarburst\\\"],[\\\"consult-panel-item-bar\\\",[28,[37,33],[[30,0],[30,2]],null],[33,39],[30,1],[33,40]]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"interaction-controls\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,\\\"role\\\",\\\"toolbar\\\"],[15,\\\"label\\\",[28,[37,15],[\\\"common.primary\\\"],null]],[14,0,\\\"interaction-controls-primary toggle-item-container\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,41],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"interaction-dialpad-btn\\\"],[12],[1,\\\"\\\\n\\\"],[6,[39,42],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[[33,43],\\\"acd-interactions-panel.interaction show dialpad\\\"]],[[\\\"default\\\"],[[[[1,\\\"                            \\\"],[11,\\\"button\\\"],[16,1,[29,[[36,18],\\\"-dtmf-dialpad-button\\\"]]],[24,0,\\\"btn btn-link enabled\\\"],[16,\\\"aria-label\\\",[28,[37,15],[\\\"purecloud.toggleDialpad\\\"],null]],[16,\\\"aria-expanded\\\",[29,[[52,[33,43],\\\"true\\\",\\\"false\\\"]]]],[24,4,\\\"button\\\"],[4,[38,33],[[30,0],\\\"toggleDTMFDialpad\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"phone-dialpad\\\"],[15,\\\"screenreader-text\\\",[28,[37,15],[\\\"purecloud.toggleDialpad\\\"],null]],[12],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                            \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,18],\\\"-dtmf-dialpad-button\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,15],[\\\"purecloud.acdInteraction.dialPad\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                            \\\"],[10,0],[15,0,[29,[\\\"dialpad-dtmf-dropdown \\\",[52,[51,[33,43]],\\\"hide\\\"]]]],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,44],null,[[\\\"addingParticipants\\\",\\\"showTitle\\\",\\\"showCallInput\\\",\\\"showDialpad\\\",\\\"isAcdDTMF\\\",\\\"sendDtmf\\\"],[false,false,false,[33,43],true,true]]]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,1],[[33,45],[33,46],[28,[37,22],[[33,3,[\\\"myselfIsMonitor\\\"]]],null]],null],[[[1,\\\"                    \\\"],[11,\\\"button\\\"],[16,1,[29,[[36,18],\\\"-mute-button\\\"]]],[16,0,[29,[\\\"btn btn-link interaction-mute-btn enabled\\\\n                            \\\",[52,[33,3,[\\\"conversation\\\",\\\"isMuted\\\"]],\\\"interaction-muted\\\"]]]],[16,\\\"aria-label\\\",[28,[37,15],[[33,47]],null]],[16,\\\"aria-pressed\\\",[29,[[52,[33,3,[\\\"conversation\\\",\\\"isMuted\\\"]],\\\"true\\\",\\\"false\\\"]]]],[24,4,\\\"button\\\"],[4,[38,33],[[30,0],\\\"changeState\\\",\\\"muted\\\"],null],[12],[1,\\\"\\\\n\\\"],[41,[33,48,[\\\"loading\\\",\\\"muted\\\"]],[[[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin loading-indicator\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,3,[\\\"conversation\\\",\\\"isMuted\\\"]],[[[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"microphone-disable\\\"],[15,\\\"screenreader-text\\\",[28,[37,15],[[33,47]],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"microphone\\\"],[15,\\\"screenreader-text\\\",[28,[37,15],[[33,47]],null]],[12],[13],[1,\\\"\\\\n                        \\\"]],[]]]],[]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,18],\\\"-mute-button\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,15],[[33,47]],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,1],[[33,45],[33,46],[28,[37,22],[[28,[37,7],[[33,3,[\\\"myselfIsMonitor\\\"]],[33,3,[\\\"myselfIsCoach\\\"]]],null]],null]],null],[[[1,\\\"                    \\\"],[11,\\\"button\\\"],[16,1,[29,[[36,18],\\\"-hold-button\\\"]]],[16,0,[29,[\\\"btn btn-link interaction-hold-btn enabled\\\\n                            \\\",[52,[28,[37,7],[[33,49],[33,50]],null],\\\"interaction-held\\\"]]]],[16,\\\"aria-label\\\",[28,[37,15],[[33,51]],null]],[16,\\\"aria-pressed\\\",[29,[[52,[28,[37,7],[[33,49],[33,50]],null],\\\"true\\\",\\\"false\\\"]]]],[24,4,\\\"button\\\"],[4,[38,33],[[30,0],\\\"changeState\\\",\\\"held\\\"],null],[12],[1,\\\"\\\\n\\\"],[41,[33,48,[\\\"loading\\\",\\\"held\\\"]],[[[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin loading-indicator\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"control-pause\\\"],[15,\\\"screenreader-text\\\",[28,[37,15],[[33,51]],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,18],\\\"-hold-button\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,15],[[33,51]],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[51,[33,52]],[[[41,[33,53],[[[1,\\\"                        \\\"],[10,0],[14,0,\\\"interaction-transfer-btn transfer-blind-btn\\\"],[12],[1,\\\"\\\\n\\\"],[6,[39,42],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[true,\\\"acd-interactions-panel.interaction blind transfer\\\"]],[[\\\"default\\\"],[[[[1,\\\"                                \\\"],[11,\\\"button\\\"],[16,1,[29,[[36,18],\\\"-blind-transfer-button\\\"]]],[16,0,[29,[\\\"btn btn-link enabled toggle-blind-transfer-btn\\\\n                                        \\\",[52,[33,54],\\\"temporarily-disabled\\\"]]]],[16,\\\"disabled\\\",[36,54]],[16,\\\"aria-label\\\",[28,[37,15],[\\\"purecloud.acdInteraction.transfer\\\"],null]],[16,\\\"aria-expanded\\\",[29,[[52,[33,55],\\\"true\\\",\\\"false\\\"]]]],[24,4,\\\"button\\\"],[4,[38,33],[[30,0],\\\"toggleTransfer\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"arrow-right\\\"],[15,\\\"screenreader-text\\\",[28,[37,15],[\\\"purecloud.acdInteraction.transfer\\\"],null]],[12],[13],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n                                \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,18],\\\"-blind-transfer-button\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n                                    \\\"],[1,[28,[35,15],[\\\"purecloud.acdInteraction.transfer\\\"],null]],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,55],[[[41,[33,3,[\\\"isAttendedTransferring\\\"]],[[[1,\\\"                                        \\\"],[1,[28,[35,56],null,[[\\\"participantId\\\",\\\"interactionType\\\",\\\"actionCancelTransfer\\\"],[[33,57,[\\\"userId\\\"]],[33,3,[\\\"type\\\"]],[28,[37,33],[[30,0],\\\"onCancelBlindTransfer\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                        \\\"],[1,[28,[35,58],null,[[\\\"authUser\\\",\\\"header\\\",\\\"interaction\\\",\\\"addButtonIcon\\\",\\\"addButtonTooltip\\\",\\\"participants\\\",\\\"activeParticipantIds\\\",\\\"excludeFilters\\\",\\\"allowRawInputSelection\\\",\\\"searchPlaceholderText\\\",\\\"actionSelected\\\"],[[33,59],\\\"purecloud.acdInteraction.transfer\\\",[33,3],\\\"arrow-right\\\",\\\"purecloud.acdInteraction.transfer\\\",[33,60],[33,61],[33,62],[33,63],[33,64],[28,[37,33],[[30,0],\\\"onBlindTransferDataSelected\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]]]],[]],null]],[]]]]],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,1],[[33,45],[33,46]],null],[[[41,[33,65],[[[1,\\\"                            \\\"],[10,0],[14,0,\\\"interaction-transfer-btn transfer-consult-btn\\\"],[12],[1,\\\"\\\\n\\\"],[6,[39,42],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[true,\\\"acd-interactions-panel.interaction consult transfer\\\"]],[[\\\"default\\\"],[[[[1,\\\"                                    \\\"],[11,\\\"button\\\"],[16,1,[29,[[36,18],\\\"-consult-transfer-button\\\"]]],[16,0,[29,[\\\"btn btn-link enabled toggle-consult-transfer-btn\\\\n                                            \\\",[52,[28,[37,7],[[33,66],[33,67]],null],\\\"temporarily-disabled\\\"]]]],[16,\\\"disabled\\\",[28,[37,7],[[33,66],[33,67]],null]],[16,\\\"aria-label\\\",[28,[37,15],[\\\"purecloud.acdInteraction.consult\\\"],null]],[16,\\\"aria-expanded\\\",[29,[[52,[33,68],\\\"true\\\",\\\"false\\\"]]]],[24,4,\\\"button\\\"],[4,[38,33],[[30,0],\\\"toggleConsult\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/agent-group\\\"],[15,\\\"screenreader-text\\\",[28,[37,15],[\\\"purecloud.acdInteraction.consult\\\"],null]],[12],[13],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n                                    \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,18],\\\"-consult-transfer-button\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n                                        \\\"],[1,[28,[35,15],[\\\"purecloud.acdInteraction.consult\\\"],null]],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,69],[[[1,\\\"                                        \\\"],[1,[28,[35,58],null,[[\\\"authUser\\\",\\\"header\\\",\\\"interaction\\\",\\\"participants\\\",\\\"addButtonIcon\\\",\\\"addButtonTooltip\\\",\\\"activeParticipantIds\\\",\\\"excludeFilters\\\",\\\"actionSelected\\\"],[[33,59],\\\"purecloud.acdInteraction.consult\\\",[33,3],[33,60],\\\"legacy/agent-group\\\",\\\"purecloud.acdInteraction.consult\\\",[33,61],[33,70],[28,[37,33],[[30,0],\\\"onTransferDataSelected\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],null]],[]]]]],[1,\\\"                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n                        \\\"],[10,0],[14,0,\\\"interaction-conference-btn conference-btn\\\"],[12],[1,\\\"\\\\n\\\"],[6,[39,42],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[true,\\\"acd-interactions-panel.interaction conference\\\"]],[[\\\"default\\\"],[[[[1,\\\"                                \\\"],[11,\\\"button\\\"],[16,1,[29,[[36,18],\\\"-conference-button\\\"]]],[24,0,\\\"btn btn-link enabled toggle-conference-btn\\\"],[16,\\\"aria-label\\\",[28,[37,15],[\\\"purecloud.acdInteraction.conference\\\"],null]],[16,\\\"aria-expanded\\\",[29,[[52,[33,68],\\\"true\\\",\\\"false\\\"]]]],[24,4,\\\"button\\\"],[4,[38,33],[[30,0],\\\"toggleConference\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/people\\\"],[15,\\\"screenreader-text\\\",[28,[37,15],[\\\"purecloud.acdInteraction.conference\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"],[41,[33,66],[[[1,\\\"                                        \\\"],[10,2],[14,0,\\\"active-conference-counter\\\"],[15,\\\"title\\\",[33,71,[\\\"length\\\"]]],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,72],[[33,71,[\\\"length\\\"]],[33,73]],null],[[[1,\\\"                                                \\\"],[1,[28,[35,15],[\\\"purecloud.acdInteraction.conferenceDropdown.maxParticipantCount\\\"],[[\\\"count\\\"],[[33,73]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                                \\\"],[1,[33,71,[\\\"length\\\"]]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                                \\\"],[13],[1,\\\"\\\\n                                \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,18],\\\"-conference-button\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n                                    \\\"],[1,[28,[35,15],[\\\"purecloud.acdInteraction.conference\\\"],null]],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,74],[[[1,\\\"                                    \\\"],[1,[28,[35,58],null,[[\\\"authUser\\\",\\\"header\\\",\\\"interaction\\\",\\\"participants\\\",\\\"activeParticipantIds\\\",\\\"showBack\\\",\\\"addButtonIcon\\\",\\\"addButtonTooltip\\\",\\\"backText\\\",\\\"actionBack\\\",\\\"actionSelected\\\"],[[33,59],\\\"purecloud.acdInteraction.conference\\\",[33,3],[33,60],[33,61],[33,66],\\\"legacy/people\\\",\\\"purecloud.acdInteraction.conferenceDropdown.addToConference\\\",\\\"purecloud.acdInteraction.conferenceDropdown.backToConference\\\",[28,[37,33],[[30,0],\\\"onBackToConferenceRoster\\\"],null],[28,[37,33],[[30,0],\\\"onConferenceDataSelected\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,75],[[[1,\\\"                                    \\\"],[1,[28,[35,76],null,[[\\\"participants\\\",\\\"authUser\\\",\\\"onConnected\\\",\\\"mute\\\",\\\"muteAll\\\",\\\"dismiss\\\",\\\"invite\\\"],[[33,71],[33,59],[28,[37,33],[[30,0],\\\"onConferenceParticipantConnected\\\"],null],[28,[37,33],[[30,0],\\\"onMuteParticipant\\\"],null],[28,[37,33],[[30,0],\\\"onMuteAllParticipants\\\"],null],[28,[37,33],[[30,0],\\\"onDismissParticipant\\\"],null],[28,[37,33],[[30,0],\\\"inviteParticipantToConference\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],null]],[]]]]],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,1],[[33,46],[33,45],[33,3,[\\\"canTogglePause\\\"]],[33,77,[\\\"canSecurePause\\\"]],[28,[37,22],[[28,[37,7],[[33,3,[\\\"myselfIsMonitor\\\"]],[33,3,[\\\"myselfIsCoach\\\"]]],null]],null]],null],[[[1,\\\"                    \\\"],[11,\\\"button\\\"],[16,1,[29,[[36,18],\\\"-secure-pause-button\\\"]]],[16,0,[29,[\\\"btn btn-link interaction-secure-pause-btn enabled\\\\n                            \\\",[52,[33,37],\\\"interaction-paused\\\"]]]],[16,\\\"aria-label\\\",[52,[33,37],[28,[37,15],[\\\"purecloud.acdInteraction.securePauseEnd\\\"],null],[28,[37,15],[\\\"purecloud.acdInteraction.securePauseStart\\\"],null]]],[16,\\\"aria-pressed\\\",[29,[[52,[33,37],\\\"true\\\",\\\"false\\\"]]]],[24,4,\\\"button\\\"],[4,[38,33],[[30,0],\\\"toggleSecurePause\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"lock-hold\\\"],[15,\\\"screenreader-text\\\",[52,[33,37],[28,[37,15],[\\\"purecloud.acdInteraction.securePauseEnd\\\"],null],[28,[37,15],[\\\"purecloud.acdInteraction.securePauseStart\\\"],null]]],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,18],\\\"-secure-pause-button\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,37],[[[1,\\\"                            \\\"],[1,[28,[35,15],[\\\"purecloud.acdInteraction.securePauseEnd\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[1,[28,[35,15],[\\\"purecloud.acdInteraction.securePauseStart\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,78],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"interaction-hangup-btn hangup-btn\\\"],[12],[1,\\\"\\\\n\\\"],[6,[39,42],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[[33,66],\\\"acd-interactions-panel.hangup\\\"]],[[\\\"default\\\"],[[[[1,\\\"                            \\\"],[11,\\\"button\\\"],[16,1,[29,[[36,18],\\\"-attended-transfer-button\\\"]]],[16,\\\"disabled\\\",[33,3,[\\\"isAttendedTransferring\\\"]]],[16,0,[29,[\\\"btn btn-link interaction-end-btn enabled\\\\n                                    \\\",[52,[33,3,[\\\"isAttendedTransferring\\\"]],\\\"temporarily-disabled\\\"]]]],[16,\\\"aria-label\\\",[52,[33,3,[\\\"myselfIsMonitor\\\"]],[28,[37,15],[\\\"purecloud.acdInteraction.endMonitoring\\\"],null],[28,[37,15],[\\\"purecloud.acdInteraction.endCall\\\"],null]]],[24,4,\\\"button\\\"],[4,[38,33],[[30,0],\\\"onHangup\\\"],null],[12],[1,\\\"\\\\n\\\"],[41,[33,48,[\\\"loading\\\",\\\"hangup\\\"]],[[[1,\\\"                                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin loading-indicator\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,3,[\\\"myselfIsMonitor\\\"]],[[[1,\\\"                                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"custom/regular-binoculars-slash\\\"],[15,\\\"screenreader-text\\\",[28,[37,15],[\\\"purecloud.acdInteraction.endMonitoring\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/phone-hangup\\\"],[15,\\\"screenreader-text\\\",[28,[37,15],[\\\"purecloud.acdInteraction.endCall\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]],[]]],[1,\\\"                            \\\"],[13],[1,\\\"\\\\n                            \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,18],\\\"-attended-transfer-button\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,3,[\\\"myselfIsMonitor\\\"]],[[[1,\\\"                                    \\\"],[1,[28,[35,15],[\\\"purecloud.acdInteraction.endMonitoring\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                    \\\"],[1,[28,[35,15],[\\\"purecloud.acdInteraction.endCall\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                            \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,79],[[[1,\\\"                                \\\"],[1,[28,[35,80],null,[[\\\"leave\\\",\\\"endForAll\\\"],[[28,[37,33],[[30,0],\\\"onLeaveCall\\\"],null],[28,[37,33],[[30,0],\\\"onEndCallForAll\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],null]],[]]]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,1],[[33,46],[33,81]],null],[[[1,\\\"                    \\\"],[11,\\\"button\\\"],[16,1,[29,[[36,18],\\\"-end-chat-button\\\"]]],[16,\\\"disabled\\\",[33,3,[\\\"isAttendedTransferring\\\"]]],[16,0,[29,[\\\"btn btn-link interaction-end-btn enabled\\\\n                            \\\",[52,[33,3,[\\\"isAttendedTransferring\\\"]],\\\"temporarily-disabled\\\"]]]],[16,\\\"aria-label\\\",[28,[37,15],[\\\"purecloud.acdInteraction.endChat\\\"],null]],[24,4,\\\"button\\\"],[4,[38,33],[[30,0],\\\"endChat\\\"],null],[12],[1,\\\"\\\\n\\\"],[41,[33,82],[[[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin loading-indicator\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"chat-disable\\\"],[15,\\\"screenreader-text\\\",[28,[37,15],[\\\"purecloud.acdInteraction.endChat\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,18],\\\"-end-chat-button\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,15],[\\\"purecloud.acdInteraction.endChat\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,1],[[33,2],[33,46]],null],[[[41,[33,83],[[[1,\\\"                        \\\"],[11,\\\"button\\\"],[16,1,[29,[[36,18],\\\"-park-sms-button\\\"]]],[16,\\\"disabled\\\",[28,[37,7],[[33,3,[\\\"isAttendedTransferring\\\"]],[33,84]],null]],[16,0,[29,[\\\"btn btn-link interaction-block-btn park-sms-button enabled\\\\n                                \\\",[52,[33,3,[\\\"isAttendedTransferring\\\"]],\\\"temporarily-disabled\\\"]]]],[16,\\\"aria-label\\\",[28,[37,15],[\\\"purecloud.acdInteraction.park.label\\\"],null]],[16,\\\"aria-expanded\\\",[29,[[52,[33,85],\\\"true\\\",\\\"false\\\"]]]],[24,4,\\\"button\\\"],[4,[38,33],[[30,0],\\\"onTogglePopover\\\",\\\"showParkSmsDropdown\\\",[28,[37,86],[\\\"#\\\",[33,18],\\\"-park-sms-popover\\\"],null]],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/list-ul-regular\\\"],[15,\\\"screenreader-text\\\",[28,[37,15],[\\\"purecloud.acdInteraction.park.label\\\"],null]],[12],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-popover\\\"],[15,1,[29,[[36,18],\\\"-park-sms-popover\\\"]]],[15,\\\"for\\\",[29,[[36,18],\\\"-park-sms-button\\\"]]],[12],[1,\\\"\\\\n\\\"],[41,[33,85],[[[1,\\\"                                \\\"],[1,[28,[35,87],null,[[\\\"onParkConfirm\\\"],[[28,[37,33],[[30,0],\\\"park\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,18],\\\"-park-sms-button\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,15],[\\\"purecloud.acdInteraction.park.label\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                    \\\"],[11,\\\"button\\\"],[16,1,[29,[[36,18],\\\"-end-sms-button\\\"]]],[16,\\\"disabled\\\",[33,3,[\\\"isAttendedTransferring\\\"]]],[16,0,[29,[\\\"btn btn-link interaction-end-btn enabled\\\\n                            \\\",[52,[33,3,[\\\"isAttendedTransferring\\\"]],\\\"temporarily-disabled\\\"]]]],[16,\\\"aria-label\\\",[28,[37,15],[\\\"purecloud.acdInteraction.endSms\\\"],null]],[24,4,\\\"button\\\"],[4,[38,33],[[30,0],\\\"endSms\\\"],null],[12],[1,\\\"\\\\n\\\"],[41,[33,88],[[[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin loading-indicator\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,3,[\\\"myselfIsMonitorV2\\\"]],[[[1,\\\"                                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"custom/regular-binoculars-slash\\\"],[15,\\\"screenreader-text\\\",[28,[37,15],[\\\"purecloud.acdInteraction.endMonitoring\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/roster-sms-disable\\\"],[15,\\\"screenreader-text\\\",[28,[37,15],[\\\"purecloud.acdInteraction.endSms\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]],[]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n\\\\n                    \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,18],\\\"-end-sms-button\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,3,[\\\"myselfIsMonitorV2\\\"]],[[[1,\\\"                            \\\"],[1,[28,[35,15],[\\\"purecloud.acdInteraction.endMonitoring\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[1,[28,[35,15],[\\\"purecloud.acdInteraction.endSms\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,1],[[33,89],[33,46]],null],[[[41,[33,90],[[[1,\\\"                        \\\"],[11,\\\"button\\\"],[16,1,[29,[[36,18],\\\"-park-email-button\\\"]]],[16,\\\"disabled\\\",[28,[37,7],[[33,3,[\\\"isAttendedTransferring\\\"]],[33,84]],null]],[16,0,[29,[\\\"btn btn-link interaction-block-btn park-email-button enabled\\\\n                                \\\",[52,[33,3,[\\\"isAttendedTransferring\\\"]],\\\"temporarily-disabled\\\"]]]],[16,\\\"aria-label\\\",[28,[37,15],[\\\"purecloud.acdInteraction.park.label\\\"],null]],[24,4,\\\"button\\\"],[4,[38,33],[[30,0],\\\"park\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/list-ul-regular\\\"],[15,\\\"screenreader-text\\\",[28,[37,15],[\\\"purecloud.acdInteraction.park.label\\\"],null]],[12],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,18],\\\"-park-email-button\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,15],[\\\"purecloud.acdInteraction.park.label\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                    \\\"],[11,\\\"button\\\"],[16,1,[29,[[36,18],\\\"-disconnect-email-button\\\"]]],[16,\\\"disabled\\\",[33,3,[\\\"isAttendedTransferring\\\"]]],[16,\\\"aria-label\\\",[28,[37,15],[\\\"purecloud.acdInteraction.disconnectEmail\\\"],null]],[16,0,[29,[\\\"btn btn-link interaction-block-btn disconnect-email-button enabled\\\\n                            \\\",[52,[33,3,[\\\"isAttendedTransferring\\\"]],\\\"temporarily-disabled\\\"]]]],[24,4,\\\"button\\\"],[4,[38,33],[[30,0],\\\"disconnect\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/roster-email-disable\\\"],[15,\\\"screenreader-text\\\",[28,[37,15],[\\\"purecloud.acdInteraction.disconnectEmail\\\"],null]],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,18],\\\"-disconnect-email-button\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,15],[\\\"purecloud.acdInteraction.disconnectEmail\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,35],[[[1,\\\"                    \\\"],[11,\\\"button\\\"],[16,1,[29,[[36,18],\\\"-acw-button\\\"]]],[16,0,[29,[\\\"btn btn-link acw-request-btn enabled\\\\n                            \\\",[52,[33,3,[\\\"isCommunicationAfterCallWorkRequested\\\"]],\\\"acw-requested\\\",\\\"acw-skipped\\\"]]]],[16,\\\"aria-label\\\",[28,[37,15],[[33,36]],null]],[24,4,\\\"button\\\"],[4,[38,33],[[30,0],\\\"updateACWRequest\\\"],null],[12],[1,\\\"\\\\n\\\"],[41,[33,91],[[[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin loading-indicator\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"user\\\"],[15,\\\"screenreader-text\\\",[28,[37,15],[[33,36]],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,18],\\\"-acw-button\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,15],[[33,36]],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,13],[[[41,[33,92],[[[1,\\\"                        \\\"],[10,0],[15,0,[29,[\\\"phone-numbers-dropdown item-toggle \\\",[52,[33,93],\\\"selected\\\"]]]],[12],[1,\\\"\\\\n\\\"],[6,[39,42],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[[33,93],\\\"acd-interactions-panel.interaction place callback\\\"]],[[\\\"default\\\"],[[[[41,[28,[37,1],[[33,13],[33,46]],null],[[[1,\\\"                                    \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link place-callback enabled\\\"],[16,\\\"disabled\\\",[28,[37,7],[[33,94],[33,95],[33,96]],null]],[16,\\\"aria-label\\\",[28,[37,15],[\\\"purecloud.acdInteraction.callbacks.beginCall\\\"],null]],[16,\\\"aria-expanded\\\",[52,[33,93],\\\"true\\\",\\\"false\\\"]],[24,4,\\\"button\\\"],[4,[38,33],[[30,0],\\\"toggleNumbersClbk\\\"],null],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,7],[[33,94],[33,95]],null],[[[1,\\\"                                            \\\"],[10,\\\"i\\\"],[14,0,\\\"pc-moon pc-loading pc-spin\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"phone-callback\\\"],[15,\\\"screenreader-text\\\",[28,[37,15],[\\\"purecloud.acdInteraction.callbacks.beginCall\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                                \\\"],[10,\\\"ul\\\"],[15,0,[29,[\\\"dropdown-menu \\\",[52,[33,93],\\\"show\\\"]]]],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,98],[[28,[37,98],[[33,99]],null]],null],null,[[[1,\\\"                                        \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n                                            \\\"],[11,3],[24,6,\\\"#\\\"],[16,\\\"aria-label\\\",[28,[37,15],[\\\"purecloud.acdInteraction.callbacks.callNumber\\\"],[[\\\"phoneNumber\\\"],[[28,[37,20],[[28,[37,100],[[28,[37,7],[[30,3,[\\\"number\\\"]],[30,3,[\\\"name\\\"]]],null]],null]],null]]]]],[4,[38,33],[[30,0],\\\"beginCallback\\\",[30,3]],null],[12],[1,\\\"\\\\n                                                \\\"],[10,1],[12],[1,\\\"\\\\n                                                    \\\"],[1,[28,[35,7],[[30,3,[\\\"number\\\"]],[30,3,[\\\"name\\\"]]],null]],[1,\\\"\\\\n                                                \\\"],[13],[1,\\\"\\\\n                                            \\\"],[13],[1,\\\"\\\\n                                        \\\"],[13],[1,\\\"\\\\n\\\"]],[3]],null],[1,\\\"                                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,101],[[[41,[28,[37,1],[[33,13],[33,46]],null],[[[1,\\\"                            \\\"],[10,0],[14,0,\\\"phone-number-container\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,14],[[[1,\\\"                                    \\\"],[10,1],[14,0,\\\"external-campaign-customer-phonenumber\\\"],[12],[1,\\\"\\\\n                                        \\\"],[1,[28,[35,20],[[33,21]],null]],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,102],[[[1,\\\"                                        \\\"],[10,\\\"button\\\"],[15,1,[29,[[36,18],\\\"-interaction-url-button\\\"]]],[14,0,\\\"btn btn-link copy-external-campaign-customer-phonenumber-btn toggle-item enabled\\\"],[15,\\\"aria-label\\\",[28,[37,15],[\\\"purecloud.acdInteraction.callbacks.customerPhoneNumberCopyLink\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"copy\\\"],[15,\\\"screenreader-text\\\",[28,[37,15],[\\\"purecloud.acdInteraction.callbacks.customerPhoneNumberCopyLink\\\"],null]],[12],[13],[1,\\\"\\\\n                                        \\\"],[13],[1,\\\"\\\\n                                        \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,18],\\\"-interaction-url-button\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n                                            \\\"],[1,[28,[35,15],[\\\"purecloud.acdInteraction.callbacks.customerPhoneNumberCopyLink\\\"],null]],[1,\\\"\\\\n                                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],[[[1,\\\"                                    \\\"],[11,\\\"button\\\"],[16,1,[29,[[36,18],\\\"-begin-call-button\\\"]]],[24,0,\\\"btn btn-link place-callback enabled\\\"],[16,\\\"disabled\\\",[28,[37,7],[[33,94],[33,95],[33,96]],null]],[24,4,\\\"button\\\"],[4,[38,33],[[30,0],\\\"beginCallbackDefaultNumber\\\"],null],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,7],[[33,94],[33,95]],null],[[[1,\\\"                                            \\\"],[10,\\\"i\\\"],[14,0,\\\"pc-moon pc-loading pc-spin\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"phone\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                                            \\\"],[10,1],[12],[1,\\\"\\\\n                                                \\\"],[1,[34,103]],[1,\\\"\\\\n                                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                                    \\\"],[13],[1,\\\"\\\\n                                    \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,18],\\\"-begin-call-button\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n                                        \\\"],[1,[28,[35,15],[\\\"purecloud.acdInteraction.beginCall\\\"],null]],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                    \\\"]],[]],null]],[]]],[1,\\\"\\\\n\\\"],[1,\\\"\\\\n\\\"],[41,[33,104],[[[1,\\\"                        \\\"],[10,0],[12],[1,\\\"\\\\n                            \\\"],[11,\\\"button\\\"],[16,1,[29,[[36,18],\\\"-skip-callback-button\\\"]]],[24,0,\\\"btn btn-link skip-callback enabled\\\"],[16,\\\"disabled\\\",[36,105]],[16,\\\"aria-label\\\",[28,[37,15],[\\\"purecloud.acdInteraction.skip\\\"],null]],[24,4,\\\"button\\\"],[4,[38,33],[[30,0],\\\"skipCallback\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"control-skip-right\\\"],[15,\\\"screenreader-text\\\",[28,[37,15],[\\\"purecloud.acdInteraction.skip\\\"],null]],[12],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                            \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,18],\\\"-skip-callback-button\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,105],[[[1,\\\"                                    \\\"],[1,[28,[35,15],[\\\"purecloud.acdInteraction.skipDisabled\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                    \\\"],[1,[28,[35,15],[\\\"purecloud.acdInteraction.skip\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,106],[[[1,\\\"                        \\\"],[10,\\\"gux-button\\\"],[14,\\\"accent\\\",\\\"primary\\\"],[15,0,[29,[\\\"interaction-finish-callback-btn item-toggle\\\\n                                \\\",[52,[51,[33,107,[\\\"sidebarExpanded\\\"]]],\\\"sidebar-collapsed\\\"],\\\"\\\\n                                enabled\\\"]]],[15,\\\"onclick\\\",[28,[37,33],[[30,0],\\\"disconnect\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,1],[[33,3,[\\\"dialerPreview\\\"]],[28,[37,22],[[33,14]],null]],null],[[[1,\\\"                                \\\"],[1,[28,[35,15],[\\\"purecloud.acdInteraction.callbacks.donePreview\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                \\\"],[1,[28,[35,15],[\\\"purecloud.acdInteraction.callbacks.done\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,1],[[33,5],[28,[37,108],[[33,5,[\\\"workitem\\\",\\\"assignmentState\\\"]],\\\"Connected\\\"],null]],null],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"interaction-transfer-btn transfer-blind-btn\\\"],[12],[1,\\\"\\\\n\\\"],[6,[39,42],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[true,\\\"acd-interactions-panel.interaction blind transfer\\\"]],[[\\\"default\\\"],[[[[1,\\\"                            \\\"],[11,\\\"button\\\"],[16,1,[29,[[36,18],\\\"-blind-transfer-button\\\"]]],[16,0,[29,[\\\"btn btn-link enabled toggle-blind-transfer-btn\\\\n                                    \\\",[52,[28,[37,7],[[33,66],[33,67]],null],\\\"temporarily-disabled\\\"]]]],[16,\\\"disabled\\\",[28,[37,7],[[33,66],[33,67]],null]],[16,\\\"aria-label\\\",[28,[37,15],[\\\"purecloud.acdInteraction.transfer\\\"],null]],[16,\\\"aria-expanded\\\",[29,[[52,[33,55],\\\"true\\\",\\\"false\\\"]]]],[24,4,\\\"button\\\"],[4,[38,33],[[30,0],\\\"toggleTransfer\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"arrow-right\\\"],[15,\\\"screenreader-text\\\",[28,[37,15],[\\\"purecloud.acdInteraction.transfer\\\"],null]],[12],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                            \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,18],\\\"-blind-transfer-button\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,15],[\\\"purecloud.acdInteraction.blindTransfer\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,55],[[[1,\\\"                                \\\"],[1,[28,[35,58],null,[[\\\"authUser\\\",\\\"header\\\",\\\"interaction\\\",\\\"addButtonIcon\\\",\\\"addButtonTooltip\\\",\\\"participants\\\",\\\"activeParticipantIds\\\",\\\"excludeFilters\\\",\\\"allowRawInputSelection\\\",\\\"searchPlaceholderText\\\",\\\"actionSelected\\\"],[[33,59],\\\"purecloud.acdInteraction.transfer\\\",[33,5],\\\"arrow-right\\\",\\\"purecloud.acdInteraction.transfer\\\",[33,60],[33,61],[33,62],[33,63],[33,64],[28,[37,33],[[30,0],\\\"onBlindTransferDataSelected\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],null]],[]]]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[11,\\\"button\\\"],[16,1,[29,[[36,18],\\\"-park-task-button\\\"]]],[24,0,\\\"btn btn-link interaction-block-btn enabled park-task-button\\\"],[16,\\\"aria-label\\\",[28,[37,15],[\\\"purecloud.acdInteraction.workitem.park\\\"],null]],[24,4,\\\"button\\\"],[4,[38,33],[[30,0],\\\"parkWorkitem\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/list-ul-regular\\\"],[15,\\\"screenreader-text\\\",[28,[37,15],[\\\"purecloud.acdInteraction.workitem.park\\\"],null]],[12],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,18],\\\"-park-task-button\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,15],[\\\"purecloud.acdInteraction.workitem.park\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[11,\\\"button\\\"],[16,1,[29,[[36,18],\\\"-end-task-button\\\"]]],[24,0,\\\"btn btn-link interaction-block-btn enabled disconnect-task-button\\\"],[16,\\\"aria-label\\\",[28,[37,15],[\\\"purecloud.disconnect\\\"],null]],[24,4,\\\"button\\\"],[4,[38,33],[[30,0],\\\"disconnectWorkitem\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"custom/regular-clipboard-list-slash\\\"],[15,\\\"screenreader-text\\\",[28,[37,15],[\\\"purecloud.disconnect\\\"],null]],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,18],\\\"-end-task-button\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,15],[\\\"purecloud.disconnect\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,0],[14,0,\\\"interaction-controls-secondary\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,109],[[[1,\\\"                    \\\"],[10,1],[14,0,\\\"btn btn-link btn-right callback-countdown enabled toggle-item\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,26],null,[[\\\"endTime\\\"],[[33,3,[\\\"callbackTimeoutTime\\\"]]]]]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,110],[[[1,\\\"                    \\\"],[10,1],[14,0,\\\"btn btn-link btn-right callback-countdown auto-start enabled toggle-item\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,26],null,[[\\\"endTime\\\"],[[33,111]]]]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,112],[[[1,\\\"                    \\\"],[10,1],[14,0,\\\"btn btn-link btn-right callback-countdown auto-end enabled toggle-item\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,26],null,[[\\\"endTime\\\"],[[33,113]]]]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"]],[]],null]],[]]]],[]]],[1,\\\"\\\\n\\\"],[41,[33,114],[[[1,\\\"                    \\\"],[11,\\\"button\\\"],[16,1,[29,[[36,18],\\\"-toggle-acd-voicemail-button\\\"]]],[24,0,\\\"btn btn-link btn-right acd-voicemail-btn enabled toggle-item\\\"],[16,\\\"aria-label\\\",[28,[37,15],[[33,115]],null]],[16,\\\"aria-pressed\\\",[29,[[52,[33,116],\\\"true\\\",\\\"false\\\"]]]],[24,4,\\\"button\\\"],[4,[38,33],[[30,0],\\\"toggleAcdVoicemail\\\"],null],[12],[1,\\\"\\\\n                        \\\"],[10,1],[12],[1,\\\"\\\\n\\\"],[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"voicemail\\\"],[15,\\\"screenreader-text\\\",[28,[37,15],[[33,115]],null]],[12],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,18],\\\"-toggle-acd-voicemail-button\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,15],[[33,115]],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                \\\"],[1,[28,[35,38],null,[[\\\"classNames\\\",\\\"toggleItemConfigs\\\"],[\\\"screen-share-items\\\",[33,117]]]]],[1,\\\"\\\\n                \\\"],[1,[28,[35,38],null,[[\\\"classNames\\\",\\\"onchange\\\",\\\"selection\\\",\\\"toggleItemConfigs\\\",\\\"attentionStarburst\\\"],[\\\"sub-panel-item-bar\\\",[28,[37,33],[[30,0],[30,2]],null],[30,1],[33,39],[33,40]]]]],[1,\\\"\\\\n\\\"],[41,[33,118],[[[1,\\\"                    \\\"],[1,[28,[35,119],null,[[\\\"attachTo\\\",\\\"interaction\\\",\\\"attachClickHandler\\\",\\\"beginCobrowse\\\",\\\"beginScreenShare\\\"],[[28,[37,86],[\\\"#\\\",[33,18],\\\" .session-share-btn\\\"],null],[33,3],true,[28,[37,33],[[30,0],\\\"showCobrowseV2\\\"],null],[28,[37,33],[[30,0],\\\"beginScreenShareOrCoBrowse\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"interaction-content-wrapper\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[15,0,[29,[\\\"interaction-content\\\\n                \\\",[52,[33,120],\\\"is-co-browse\\\"],\\\"\\\\n                \\\",[52,[28,[37,108],[[30,1],\\\"scripts\\\"],null],\\\"non-call-script vertical-script\\\"]]]],[12],[1,\\\"\\\\n\\\"],[41,[33,121],[[[1,\\\"                \\\"],[1,[28,[35,122],null,[[\\\"selectedInteraction\\\"],[[33,3]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,120],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"session-main-panel session-share\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,123],null,[[\\\"interaction\\\"],[[33,3]]]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,22],[[33,124]],null],[[[1,\\\"                \\\"],[10,0],[15,0,[29,[\\\"interaction-script-container no-headers\\\\n                        \\\",[52,[28,[37,108],[[30,1],\\\"scripts\\\"],null],\\\"non-call\\\",[33,125]],\\\"\\\\n                        \\\",[52,[51,[33,45]],[33,126]]]]],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,127],null,[[\\\"scriptAvailabilityChanged\\\",\\\"selectedInteraction\\\"],[[33,128],[33,3]]]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,1],[[28,[37,22],[[33,129]],null],[28,[37,7],[[33,81],[33,89]],null]],null],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"interaction-messages\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"external-provider-message\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,2],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,15],[\\\"purecloud.acdInteraction.externalProvider\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,1],[[33,130],[28,[37,22],[[33,131]],null]],null],[[[1,\\\"                \\\"],[1,[28,[35,132],null,[[\\\"name\\\",\\\"isVisible\\\"],[\\\"conversation\\\",[33,133]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[15,0,[29,[\\\"sub-panel-wrapper\\\\n                \\\",[52,[28,[37,108],[[30,1],\\\"none\\\"],null],\\\"hidden no-width\\\"],\\\"\\\\n                \\\",[52,[33,134],\\\"subpanelWidth\\\"]]]],[12],[1,\\\"\\\\n\\\"],[41,[33,135],[[[1,\\\"                \\\"],[1,[28,[35,136],null,[[\\\"currPanelSize\\\",\\\"setPanelSize\\\"],[[33,137],[28,[37,33],[[30,0],\\\"onPanelSizeChanged\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,1],[[33,130],[28,[37,22],[[33,131]],null]],null],[[[1,\\\"                \\\"],[1,[28,[35,132],null,[[\\\"class\\\",\\\"name\\\",\\\"isVisible\\\"],[\\\"contextual\\\",\\\"contextual\\\",[33,138]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[1,2]]]]]],[\\\"effectivePanelSelection\\\",\\\"onUserPanelSelection\\\",\\\"phoneNumber\\\"],false,[\\\"if\\\",\\\"and\\\",\\\"isSms\\\",\\\"interaction\\\",\\\"acd-interactions-panel-v2/interaction-type-icon\\\",\\\"workitem\\\",\\\"state\\\",\\\"or\\\",\\\"acdEngagementSourcesFT\\\",\\\"customerParticipantName\\\",\\\"acdExternalContactDivNameFT\\\",\\\"externalContactDivisionName\\\",\\\"tags-input/label\\\",\\\"isCallback\\\",\\\"isExternalCampaign\\\",\\\"t\\\",\\\"unless\\\",\\\"interactionCopyBtn\\\",\\\"elementId\\\",\\\"showNumber\\\",\\\"await\\\",\\\"formattedCustomerPhoneNumber\\\",\\\"not\\\",\\\"connectedTimeForDisplay\\\",\\\"isDisconnected\\\",\\\"isTerminated\\\",\\\"duration-format\\\",\\\"acd-interactions-panel/interaction/panel-manager\\\",\\\"availablePanels\\\",\\\"interactionPanelContextKey\\\",\\\"activePanelContextKeys\\\",\\\"initialPanelSelection\\\",\\\"forcedPanelSelection\\\",\\\"action\\\",\\\"acd-interactions-panel/interaction/interaction-consult-controls\\\",\\\"showAgentRequestACWButton\\\",\\\"skipACWTooltipTitle\\\",\\\"isRecordingPaused\\\",\\\"toggle-item-bar\\\",\\\"staticAndInterapptionPanelConfigs\\\",\\\"staticAndInterapptionAttentionCounts\\\",\\\"showDTMFDialpad\\\",\\\"drop-down\\\",\\\"showDTMFDialpadDropdown\\\",\\\"dial-pad\\\",\\\"isCall\\\",\\\"isConnected\\\",\\\"muteTooltipTitle\\\",\\\"phone\\\",\\\"isHeld\\\",\\\"isConfined\\\",\\\"holdTooltipTitle\\\",\\\"hideTransferButtons\\\",\\\"showTransfer\\\",\\\"blindTransferDisabled\\\",\\\"showTransferDropdown\\\",\\\"acd-interactions-panel/interaction-blind-transfer-participant-dropdown\\\",\\\"transferringToParticipant\\\",\\\"target-dropdown\\\",\\\"authUser\\\",\\\"otherParticipants\\\",\\\"activeParticipantIds\\\",\\\"excludeBlindTransferFilters\\\",\\\"allowRawDropdownInputSelection\\\",\\\"targetDropdownPlaceholderText\\\",\\\"showConsultTransfer\\\",\\\"activeConference\\\",\\\"wasConference\\\",\\\"showDropdown\\\",\\\"showConsultTransferDropdown\\\",\\\"excludeConsultTransferFilters\\\",\\\"connectedConferenceParticipants\\\",\\\"gt\\\",\\\"maxConferenceParticipantCounter\\\",\\\"showConferenceInviteDropdown\\\",\\\"showConferenceRoster\\\",\\\"acd-interactions-panel/interaction-conference-roster-dropdown\\\",\\\"permissions\\\",\\\"enablePhoneHangupBtn\\\",\\\"showHangupChoiceDropdown\\\",\\\"acd-interactions-panel/interaction-conference-hangup-dropdown\\\",\\\"isChat\\\",\\\"isEndingChat\\\",\\\"showParkSMSButton\\\",\\\"isParking\\\",\\\"showParkSmsDropdown\\\",\\\"concat\\\",\\\"park-schedule-popover\\\",\\\"isEndingSms\\\",\\\"isEmail\\\",\\\"showParkEmailButton\\\",\\\"isLoadingAcwRequest\\\",\\\"hasMultipleCallbackNumbers\\\",\\\"showNumbersDropdownClbk\\\",\\\"isDialing\\\",\\\"isPlacingCall\\\",\\\"isAlmostAutoCallbackStart\\\",\\\"each\\\",\\\"-track-array\\\",\\\"callbackNumbers\\\",\\\"address-format\\\",\\\"hasCallbackNumbers\\\",\\\"customerPhoneNumberCopyBtn\\\",\\\"beginCallbackDefaultNumberText\\\",\\\"showSkipCallback\\\",\\\"isSkipDisabledClbk\\\",\\\"showFinishCallback\\\",\\\"sidebar\\\",\\\"eq\\\",\\\"showCallbackCountdown\\\",\\\"showAutoCallbackStartCountdown\\\",\\\"autoCallbackStartTime\\\",\\\"showAutoCallbackEndCountdown\\\",\\\"autoCallbackEndTime\\\",\\\"showAcdVoicemailButton\\\",\\\"acdVoicemailTooltip\\\",\\\"acdVoicemailPlayerVisible\\\",\\\"screenShareConfigs\\\",\\\"showCobrowseV2Button\\\",\\\"acd-interactions-panel/interaction-session-share/session-share-dropdown\\\",\\\"showCobrowseV2\\\",\\\"showAcdVoicemailAudioPlayer\\\",\\\"acd-interactions-panel/interaction-voicemail\\\",\\\"acd-interactions-panel/interaction-session-share/interaction-co-browse-next\\\",\\\"useScripterGadget\\\",\\\"interactionScriptContainerState\\\",\\\"scriptSize\\\",\\\"acd-interactions-panel/interaction-script\\\",\\\"scriptAvailabilityChanged\\\",\\\"isInternalProvider\\\",\\\"appPoolV2\\\",\\\"isTesting\\\",\\\"app-view-stack\\\",\\\"hasConversationAppForCurrInteraction\\\",\\\"resetSubpanelWidth\\\",\\\"panelResizerEnabled\\\",\\\"acd-interactions-panel/interaction/panel-sizer\\\",\\\"panelSize\\\",\\\"hasContextualAppForCurrInteraction\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel/interaction/template.hbs\",\"isStrictMode\":false});","import Ember from 'ember';\nimport isEqual from 'lodash/isEqual';\nimport appUtils, { AppContext } from 'web-directory/utils/apps';\nimport { Maybe } from 'web-directory/types';\nimport { assertNever, hasKey } from 'web-directory/utils/types';\nimport { isTesting } from 'web-directory/utils/testing';\nimport { warnClosureAction } from 'web-directory/utils/acd';\nimport {\n    AppDef,\n    WorkerDef,\n    AppLogDetails,\n    AppLogger,\n    AppPool,\n    GcAnalyticsConversationAppContext,\n    GcAppContext,\n    GcConversationAppContext,\n    GcExternalContactAppContext,\n    GcWorkitemAppContext,\n    GcWorkerContext,\n    GroupInstances,\n    IframeAppDef,\n    SerializableRecord,\n    TraceLoggerLevel,\n    LRU,\n    deepEqualityAppDiffer,\n    toSerializableRecord,\n    PoolState,\n    GroupState\n} from '@genesys/apps-v2-host';\nimport { inject } from '@ember/service';\nimport { AppViewStackHostLayoutController, AppViewStackHostLayoutTemplate } from '@genesys/apps-v2-host-layout';\nimport {\n    OpenPanel,\n    buildFindInstanceState,\n    buildFindWorkerInstance,\n    createAppsV2SdkHandler\n} from 'web-directory/services/apps-v2-api-handlers/apps-v2-sdk-handler';\nimport { INTEGRATIONS_INTERAPPTIONS_PROVIDER_ID } from 'web-directory/app-providers/integration-interapptions-provider';\nimport { task, timeout } from 'ember-concurrency';\nimport { addPageAction } from 'web-directory/utils/newrelic';\nimport { transformPanelId } from 'web-directory/utils/transform-panels';\nimport { mapValidActiveInteractionsToConversations } from 'web-directory/utils/active-interactions-to-conversations';\nimport { INTERAPPTION_COMMUNICATION_TYPE_FILTERS, URL_REPLACEMENTS } from 'web-directory/models/app';\n\nconst appGroupKeys = ['conversation', 'contextual'] as const;\ntype AppGroupKey = (typeof appGroupKeys)[number];\n\nexport type ResolvedApp = {\n    compositeId: string;\n    appDefId: string;\n    providerId: string;\n    interactionId: string;\n    /** The media/communication type used for composite IDs and pool grouping (e.g. 'call', 'email', 'workitem', 'analyticsConversation'). */\n    interactionType: string;\n    /** The originating AppContext.type that triggered the provider request (e.g. 'conversation', 'workitem', 'analyticsConversation'). */\n    appContextType: AppContext['type'];\n    appGroupKey: AppGroupKey;\n    appDef: AppDef;\n};\n\ntype AppGroup = {\n    apps: ResolvedApp[];\n};\n\ntype InteractionAppGroup = {\n    selected: boolean;\n    groups: Record<AppGroupKey, AppGroup>;\n};\n\ntype InteractionAppGroups = Record<string, InteractionAppGroup>;\n\ntype AppsUpdateCallback = (updatedApps: any[]) => void;\nexport type AppProvider = {\n    id: string;\n    type: 'programmatic';\n    group?: AppGroupKey;\n    trustedProvider?: boolean;\n    monitorInteractionUpdates?: boolean;\n    getAppConfigs: (interaction: AppContext, callback?: AppsUpdateCallback) => Promise<any[]>;\n    interactionRemoved?: (interaction: AppContext) => void;\n    getAppGroup?: (appDef: AppDef) => AppGroupKey | undefined;\n};\n\nexport type WorkerProvider = {\n    id: string;\n    trustedProvider?: boolean;\n    monitorInteractionUpdates?: boolean;\n    getWorkerConfig: () => WorkerDef;\n};\n\ntype IssuedAppRequest = {\n    providerId: string;\n    // interactionKey equates to workitem|id-type and contains some duplication with interactionId for conversations\n    // However, different filtering/clean-up purposes require different values\n    interactionId: string;\n    interactionKey: string;\n    appContextType: AppContext['type'];\n    request: Promise<{ appConfigs: unknown[] }>;\n    requestId: string;\n};\ntype IssuedAppRequestSearchQuery = Partial<\n    Pick<IssuedAppRequest, 'providerId' | 'interactionId' | 'interactionKey' | 'appContextType' | 'requestId'>\n>;\n\nexport type InterapptionProviderAppDef = AppDef & {\n    compositeId: string;\n    providerId: string;\n};\n\nconst { Component, computed, observer, get, guidFor, typeOf, isBlank, RSVP, run } = Ember;\nconst OUT_OF_DATE_ASYNC_PROVIDER_RESPONSE = 'outOfDateAsyncProviderResponse';\n\nconst defaultMetadataReporterConfig = {\n    initialReportDelay: 30000,\n    reportInterval: 300000,\n    shouldSendInitial: true,\n    shouldSendPeriodic: true\n};\n\n// TODO: Remove message type once we go to subtype (don't forget we need a migraton from 'message' before removing)\n// Add in message type since we don't yet persist layouts by messaging subtype\nconst conversationMediaTypes = [...INTERAPPTION_COMMUNICATION_TYPE_FILTERS, 'message'];\n\nexport default Component.extend({\n    classNames: ['interapptions-manager-v2'],\n\n    // Injections\n    application: inject('application'),\n    session: inject('session'),\n    intl: inject('intl'),\n    logger: inject('stash-logger'),\n    streaming: inject('streaming'),\n    appsService: inject('apps'),\n    alerting: inject('alerting'),\n    notification: inject('notification'),\n    acdinitialization: inject('acdinitialization'),\n\n    // Attributes\n    useAppsV2ConversationInterapptionManager: false as Maybe<boolean>,\n    appProviders: [] as Maybe<AppProvider[]>,\n    workerProviders: [] as Maybe<WorkerProvider[]>,\n    activeInteractions: [] as Maybe<AppContext[]>,\n    selectedInteraction: null as Maybe<AppContext>,\n    subPanelSelectedAppId: null as Maybe<string>,\n    openPanel: null as Maybe<OpenPanel>,\n    // Exposed for testing.  Not intended to be set externally.\n    _metadataReporterConfig: { ...defaultMetadataReporterConfig },\n    // State\n    appPoolV2: null as AppPool | null,\n    _poolState: null as Maybe<PoolState>,\n    resolvedApps: [] as ResolvedApp[],\n    attentionCountPerCompositeId: {} as Record<string, number>,\n    _viewStackConversationController: null as AppViewStackHostLayoutController | null,\n    _viewStackContextualController: null as AppViewStackHostLayoutController | null,\n    _issuedAppRequests: [] as IssuedAppRequest[],\n    // Previous State\n    _prevAppProviders: [] as null | AppProvider[],\n    _prevActiveInteractions: null as null | AppContext[],\n    _prevSubPanelSelectedAppId: null as string | null,\n    _prevRawActiveInteractions: {} as Record<string, unknown>,\n    _prevSelectedInteraction: null as Maybe<AppContext>,\n    // Derived\n    _validAppGroupKeys: computed('useAppsV2ConversationInterapptionManager', function (): Array<AppGroupKey> {\n        const res: AppGroupKey[] = ['contextual'];\n        if (this.get('useAppsV2ConversationInterapptionManager')) {\n            res.push('conversation');\n        }\n        return res;\n    }),\n    validActiveInteractions: computed('activeInteractions.[]', function (): Array<AppContext> {\n        const activeInteractions = this.get('activeInteractions');\n        if (!Array.isArray(activeInteractions)) {\n            return [];\n        }\n        return activeInteractions.filter(curr => appUtils.isAppContext(curr) && curr.id.trim());\n    }),\n    // list of valid appProviders filtered from appProviders\n    _validAppProviders: computed('appProviders.[]', function (): AppProvider[] {\n        const appProviders = this.get('appProviders');\n\n        if (!appProviders || !Array.isArray(appProviders)) {\n            return [];\n        }\n\n        const validAppProviders: AppProvider[] = [];\n        if (appProviders && typeOf(appProviders) === 'array') {\n            appProviders.reduce<AppProvider[]>((result, currProvider) => {\n                if (isValidAppProvider(currProvider)) {\n                    result.push(currProvider);\n                } else {\n                    this.get('logger').error(\n                        appUtils.buildInterapptionsLogMsg('Invalid App Provider passed to interapptions manager'),\n                        {\n                            appProvider: currProvider,\n                            remoteData: {\n                                providerId: Ember.get(currProvider, 'id')\n                            }\n                        }\n                    );\n                }\n\n                return result;\n            }, validAppProviders);\n        }\n\n        return validAppProviders;\n    }),\n    interactionAppGroups: computed(\n        '_validAppGroupKeys',\n        'resolvedApps',\n        'validActiveInteractions',\n        'selectedInteraction',\n        function (): InteractionAppGroups {\n            // Remove group checks once both pools are GA'd\n            const validAppGroupKeys = this.get('_validAppGroupKeys') as AppGroupKey[];\n            const includeConversationGroup = validAppGroupKeys.includes('conversation');\n            const includeContextualGroup = validAppGroupKeys.includes('contextual');\n\n            const res: InteractionAppGroups = {};\n            const resolvedApps: ResolvedApp[] = this.get('resolvedApps');\n            const validActiveInteractions: AppContext[] = this.get('validActiveInteractions');\n            const selectedInteraction: AppContext | null = this.get('selectedInteraction') || null;\n            for (const validActiveInteraction of validActiveInteractions) {\n                const interactionKey = computeInteractionKey(\n                    validActiveInteraction.id,\n                    getInteractionType(validActiveInteraction)\n                );\n                const conversationGroup: AppGroup = {\n                    apps: includeConversationGroup\n                        ? resolvedApps.filter(\n                              ({ interactionId, interactionType, appGroupKey }) =>\n                                  appGroupKey === 'conversation' &&\n                                  interactionKey === computeInteractionKey(interactionId, interactionType)\n                          )\n                        : []\n                };\n                const contextualGroup: AppGroup = {\n                    apps: includeContextualGroup\n                        ? resolvedApps.filter(\n                              ({ interactionId, interactionType, appGroupKey }) =>\n                                  appGroupKey === 'contextual' &&\n                                  interactionKey === computeInteractionKey(interactionId, interactionType)\n                          )\n                        : []\n                };\n                const interactionAppGroup: InteractionAppGroup = {\n                    selected: selectedInteraction\n                        ? computeInteractionKey(selectedInteraction.id, getInteractionType(selectedInteraction)) ===\n                          interactionKey\n                        : false,\n                    groups: {\n                        conversation: conversationGroup,\n                        contextual: contextualGroup\n                    }\n                };\n                res[interactionKey] = interactionAppGroup;\n            }\n            return res;\n        }\n    ),\n    hasConversationAppForCurrInteraction: computed('interactionAppGroups', 'selectedInteraction', function (): boolean {\n        let hasConversationAppForCurrInteraction = false;\n        const selectedInteraction = this.get('selectedInteraction');\n        if (selectedInteraction) {\n            const interactionKey = computeInteractionKey(\n                selectedInteraction.id,\n                getInteractionType(selectedInteraction)\n            );\n            const interactionAppGroups: InteractionAppGroups = this.get('interactionAppGroups');\n            const interactionAppGroup: InteractionAppGroup = interactionAppGroups[interactionKey];\n            if (interactionAppGroup) {\n                hasConversationAppForCurrInteraction = interactionAppGroup.groups.conversation.apps.length > 0;\n            }\n        }\n        return hasConversationAppForCurrInteraction;\n    }),\n    hasContextualAppForCurrInteraction: computed(\n        'interactionAppGroups',\n        'selectedInteraction',\n        'subPanelSelectedAppId',\n        function (): boolean {\n            let hasContextualAppForCurrInteraction = false;\n            const subPanelSelectedAppId = this.get('subPanelSelectedAppId');\n            const selectedInteraction = this.get('selectedInteraction');\n            if (selectedInteraction) {\n                const interactionKey = computeInteractionKey(\n                    selectedInteraction.id,\n                    getInteractionType(selectedInteraction)\n                );\n                const interactionAppGroups: InteractionAppGroups = this.get('interactionAppGroups');\n                const interactionAppGroup: InteractionAppGroup = interactionAppGroups[interactionKey];\n                if (interactionAppGroup) {\n                    hasContextualAppForCurrInteraction = interactionAppGroup.groups.contextual.apps.some(\n                        ({ compositeId }) => compositeId === subPanelSelectedAppId\n                    );\n                }\n            }\n            return hasContextualAppForCurrInteraction;\n        }\n    ),\n    currentTelemetryMetadata: computed(\n        'validActiveInteractions',\n        '_poolState',\n        'selectedInteraction',\n        function (): ReturnType<typeof getTelemetryMetadata> {\n            return getTelemetryMetadata({\n                interactions: this.get('validActiveInteractions'),\n                poolState: this.get('_poolState') ?? undefined,\n                selectedInteraction: this.get('selectedInteraction')\n            });\n        }\n    ),\n    // Observers\n    // This observer helps a lot with code readability as it provides a unique place where we update the AppPool\n    // When one of \"interactionAppGroups\" dependencies is updated, namely \"resolvedApps\", \"validActiveInteractions\" or \"selectedInteraction\"\n    // The interaction groups are updated and we need to update pool definitions\n    interactionAppGroupsObserver: observer('appPoolV2', 'interactionAppGroups', function (this: any) {\n        this.get('_updateManagerState').perform();\n    }),\n    // Actions\n    onAppPoolReady: (appPoolV2: AppPool) => warnClosureAction('onAppPoolReady', { appPoolV2 }),\n    onContextualAvailableAppsChanged: (resolvedApps: ResolvedApp[]) =>\n        warnClosureAction('onContextualAvailableAppsChanged', { resolvedApps }),\n    onAppAttentionCountChanged: (attentionCountPerCompositeId: Record<string, number>) =>\n        warnClosureAction('onAppAttentionCountChanged', { attentionCountPerCompositeId }),\n    onHasConversationAppForCurrInteractionChanged: (hasConversationAppForCurrInteraction: boolean) =>\n        warnClosureAction('onHasConversationAppForCurrInteractionChanged', { hasConversationAppForCurrInteraction }),\n    onHasContextualAppForCurrInteractionChanged: (hasContextualAppForCurrInteraction: boolean) =>\n        warnClosureAction('onHasContextualAppForCurrInteractionChanged', { hasContextualAppForCurrInteraction }),\n    insertChatText: (text: string) => warnClosureAction('insertChatText', { text }),\n    insertSmsText: (response: { strippedText?: string; structuredMessage?: string }) =>\n        warnClosureAction('insertSmsText', { response }),\n    insertEmailText: (text: string) => warnClosureAction('insertEmailText', { text }),\n    /**\n     * @Action\n     * Builds and validates Interapptions from the provided config.\n     */\n    buildValidInterapption: (typeId: string, id: string, config: any, trustedProvider?: boolean) =>\n        warnClosureAction('buildValidInterapption', { typeId, id, config, trustedProvider }),\n\n    init() {\n        this._super(...arguments);\n\n        // Get computed property to start observable\n        this.get('interactionAppGroups');\n\n        // Inject telemetry metadata into any logger calls\n        const withTelemetryMetadata = (details?: AppLogDetails): AppLogDetails => {\n            if (this.isDestroyed || this.isDestroying) return new AppLogDetails({ ...details?.getLogs() });\n            return new AppLogDetails({ ...details?.getLogs() }).addRemote(this.get('currentTelemetryMetadata'));\n        };\n\n        const logToStashLogger = this.get('_logToStashLogger').bind(this);\n        const logger: AppLogger = {\n            info: (msg: string, details?: AppLogDetails) => {\n                logToStashLogger('info', msg, withTelemetryMetadata(details));\n            },\n            debug: (msg: string, details?: AppLogDetails) => {\n                logToStashLogger('debug', msg, withTelemetryMetadata(details));\n            },\n            warn: (msg: string, details?: AppLogDetails) => {\n                logToStashLogger('warn', msg, withTelemetryMetadata(details));\n            },\n            error: (msg: string, details?: AppLogDetails) => {\n                logToStashLogger('error', msg, withTelemetryMetadata(details));\n            }\n        };\n        const workers = [];\n        const workerProviders = this.get('workerProviders') || [];\n        const retryForAppsV2Workers = this.get('session')?.get('features')?.['AURA-1668_retryForAppsV2Workers'];\n        const keepaliveForAppsV2Workers = this.get('session')?.get('features')?.['AURA-1810_keepaliveForAppsV2Workers'];\n        for (const wp of workerProviders) {\n            const workerConfig = wp?.getWorkerConfig();\n            if (workerConfig) {\n                if (!retryForAppsV2Workers) {\n                    if (!workerConfig.lifecycleConfig) {\n                        workerConfig.lifecycleConfig = {};\n                    }\n                    //TODO: Remove the casting to any here when new version of AppsV2 is pushed in WD, including AURA-1659\n                    (workerConfig.lifecycleConfig as any).loadMaxRetries = 0;\n                }\n                if (!keepaliveForAppsV2Workers) {\n                    if (!workerConfig.lifecycleConfig) {\n                        workerConfig.lifecycleConfig = {};\n                    }\n                    //TODO: Remove the casting to any here when new version of AppsV2 is pushed in WD, including AURA-1650\n                    if (!(workerConfig.lifecycleConfig as any).keepAlive) {\n                        (workerConfig.lifecycleConfig as any).keepAlive = {};\n                    }\n                    (workerConfig.lifecycleConfig as any).keepAlive.enabled = false;\n                }\n                workers.push(workerConfig);\n                logger.debug(\n                    `[AppsV2Worker] displayName: ${workerConfig.displayName || ''} - src: ${workerConfig.src || ''}`\n                );\n            }\n        }\n        // Initialize Attributes (Avoid the prototype)\n        const appPoolV2 = new AppPool(\n            {},\n            {\n                poolId: 'appPoolV2',\n                hostAppName: 'web-directory',\n                hostAppVersion: this.get('application').get('semver') || 'unknown',\n                maxPoolSize: 50,\n                evictApp: this.get('_evictApp').bind(this),\n                appDiffer: deepEqualityAppDiffer,\n                allowedSandboxValues: [\n                    'allow-forms',\n                    'allow-modals',\n                    'allow-popups',\n                    'allow-presentation',\n                    'allow-same-origin',\n                    'allow-scripts',\n                    'allow-downloads'\n                ],\n                allowedPermissionsPolicyValues: [\n                    'camera',\n                    'clipboard-write',\n                    'display-capture',\n                    'fullscreen',\n                    'geolocation',\n                    'microphone',\n                    'local-network',\n                    'loopback-network',\n                    'local-network-access'\n                ],\n                telemetryAgent: {\n                    addTelemetryEvent: (name, attributes) => {\n                        if (this.isDestroyed || this.isDestroying) return;\n                        // Attempt to remove the interaction precision so we can aggregate on appName\n                        let appName = undefined;\n                        if (\n                            attributes &&\n                            hasKey(attributes, 'appDefId') &&\n                            typeof attributes.appDefId === 'string' &&\n                            hasKey(attributes, 'groupId') &&\n                            typeof attributes.groupId === 'string'\n                        ) {\n                            const { appDefId, groupId } = attributes;\n                            const groupTokens = groupId.split(':');\n                            if (groupTokens.length === 3) {\n                                const interactionContext = groupTokens.slice(0, 2).join('&');\n                                if (appDefId.startsWith(interactionContext)) {\n                                    appName = appDefId.slice(interactionContext.length + 1);\n                                }\n                            }\n                        }\n                        // Ensure the telemetry metadata is serializable\n                        const serializableTelemetryMetadata = Object.entries(\n                            this.get('currentTelemetryMetadata')\n                        ).reduce<Record<string, string | number>>((acc, [key, value]) => {\n                            if (typeof value === 'number') {\n                                acc[key] = value;\n                            }\n                            return acc;\n                        }, {});\n                        this._addPageAction(name, {\n                            ...attributes,\n                            ...serializableTelemetryMetadata,\n                            ...(name === 'clientAppInteractionV2' ? { appDisplayType: 'interactionWidget' } : {}),\n                            // appName is reserved by NR\n                            ...(appName ? { gcAppName: appName } : {})\n                        });\n                    }\n                },\n                logger,\n                getBootstrapData: (appDef: AppDef, groupId: string): SerializableRecord => {\n                    if (appDef.type === 'iframe' && !appDef.trustedDataPassing) {\n                        return {};\n                    }\n\n                    const { application, intl, session } = this.getProperties(['application', 'intl', 'session']);\n                    const basicContext: GcAppContext = {\n                        type: 'gcApp',\n                        langTag: intl.get('isoLocale') || 'en-us',\n                        accessToken: session.get('accessToken') || '',\n                        userId: session.get('user')?.id || '',\n                        envName: application.get('runtime').name\n                    };\n\n                    const tokens = computeTokensFromGroupId(groupId);\n                    if (!tokens) {\n                        // Unknown groupId; shouldn't happen, but returning the best we have\n                        return basicContext;\n                    }\n\n                    const interaction = this.get('validActiveInteractions').find(\n                        curr => tokens.interactionId === curr.id && tokens.interactionType === getInteractionType(curr)\n                    );\n\n                    if (interaction && interaction.type === 'conversation') {\n                        const gcConversationAppContext: GcConversationAppContext = {\n                            ...basicContext,\n                            type: 'conversation',\n                            conversationId: interaction.id,\n                            displayMode: 'interactive',\n                            conversation: hasKey(interaction.payload, '__interaction_metadata__')\n                                ? (interaction.payload.__interaction_metadata__ as any)\n                                : {\n                                      id: interaction.id\n                                  }\n                        };\n                        return gcConversationAppContext;\n                    }\n\n                    if (interaction && interaction.type === 'workitem') {\n                        const gcWorkitemAppContext: GcWorkitemAppContext = {\n                            ...basicContext,\n                            type: 'workitem',\n                            workitemId: interaction.id,\n                            workitem: toSerializableRecord(interaction.payload.workitem)\n                        };\n                        return gcWorkitemAppContext;\n                    }\n\n                    if (interaction && interaction.type === 'externalContact') {\n                        if (!interaction.id) {\n                            throw new Error('ExternalContactAppContext.id must be the external contact ID');\n                        }\n                        const gcExternalContactAppContext: GcExternalContactAppContext = {\n                            ...basicContext,\n                            type: 'externalContact',\n                            externalContactId: interaction.id\n                        };\n                        return gcExternalContactAppContext;\n                    }\n\n                    if (interaction && interaction.type === 'analyticsConversation') {\n                        if (!interaction.id) {\n                            throw new Error('AnalyticsConversationAppContext.id must be the conversation ID');\n                        }\n                        const gcAnalyticsConversationAppContext: GcAnalyticsConversationAppContext = {\n                            ...basicContext,\n                            type: 'analyticsConversation',\n                            conversationId: interaction.id,\n                            ...(interaction.payload ? { conversation: toSerializableRecord(interaction.payload) } : {})\n                        };\n                        return gcAnalyticsConversationAppContext;\n                    }\n\n                    // Unknown context; shouldn't happen, but returning the best we have\n                    return basicContext;\n                },\n                getSdkTelemetryDetails: () => {\n                    return {\n                        appDisplayType: 'interactionWidget',\n                        selectedInteractionId: this.get('selectedInteraction')?.id || 'none'\n                    };\n                },\n                defaultTimeouts: {\n                    bootstrapReadyTimeoutMillis: 15000,\n                    bootstrapTimeoutMillis: 15000,\n                    loadTimeoutMillis: 15000,\n                    stopTimeoutMillis: 15000\n                }\n            },\n            {\n                workers: workers,\n                config: {\n                    getBootstrapWorkerData: async (): Promise<SerializableRecord> => {\n                        const { application, intl, session } = this.getProperties(['application', 'intl', 'session']);\n                        const result: GcWorkerContext = {\n                            type: 'worker',\n                            langTag: intl.get('isoLocale') || 'en-us',\n                            envName: application.get('runtime').name,\n                            accessToken: session.get('accessToken') || '',\n                            userId: session.get('user')?.id || ''\n                        };\n                        return result;\n                    },\n                    computeGroupId: (conversationId: string, group: string): string => {\n                        const activeInteractions = this.get('activeInteractions');\n                        // Filtering out analyticsConversation until we add support for it\n                        // ATEAM-2223: Add support for analyticsConversation\n                        const interaction = activeInteractions?.find(\n                            i => i.id === conversationId && i.type !== 'analyticsConversation'\n                        );\n                        return interaction && ['conversation', 'contextual'].includes(group)\n                            ? computeGroupId(interaction.id, getInteractionType(interaction), group as AppGroupKey)\n                            : '';\n                    },\n                    computeAppDefId: (conversationId: string, appDefId: string, providerId: string): string => {\n                        const activeInteractions = this.get('activeInteractions');\n                        // Filtering out analyticsConversation until we add support for it\n                        // ATEAM-2223: Add support for analyticsConversation\n                        const interaction = activeInteractions?.find(\n                            i => i.id === conversationId && i.type !== 'analyticsConversation'\n                        );\n                        return interaction\n                            ? [interaction.id, getInteractionType(interaction), appDefId, providerId].join('&')\n                            : '';\n                    }\n                }\n            }\n        );\n        appPoolV2.addMessageListener(\n            createAppsV2SdkHandler({\n                getSelectedInteraction: () => this.get('selectedInteraction') || null,\n                findInstanceState: buildFindInstanceState(appPoolV2),\n                findWorkerInstance: buildFindWorkerInstance(appPoolV2),\n                openPanel: (panelId: string) => {\n                    const openPanel = this.get('openPanel');\n                    if (openPanel) {\n                        openPanel(transformPanelId(panelId, this.get('session').get('features')));\n                    }\n                },\n                getActiveConversationGroupId: () => {\n                    const selectedInteraction = this.get('selectedInteraction');\n                    return selectedInteraction\n                        ? computeGroupId(\n                              selectedInteraction.id,\n                              getInteractionType(selectedInteraction),\n                              'conversation'\n                          )\n                        : null;\n                },\n                sendMessageToGroup: appPoolV2.sendMessageToGroup.bind(appPoolV2),\n                sendMessageByInstanceId: appPoolV2.sendMessageByInstanceId.bind(appPoolV2),\n                logger: this.get('logger'),\n                notificationService: this.get('notification'),\n                sendLegacyApiCall: this.get('appsService').handleAppApiCall.bind(this.get('appsService')),\n                streamingService: this.get('streaming'),\n                alerting: this.get('alerting'),\n                proposeMessageTools: {\n                    insertChatText: this.get('insertChatText'),\n                    insertSmsText: this.get('insertSmsText'),\n                    insertEmailText: this.get('insertEmailText')\n                },\n                getHasConversationAppForCurrInteraction: () => this.get('hasConversationAppForCurrInteraction'),\n                getActiveInteractions: async () => {\n                    const timeout = new RSVP.Promise(resolve => run.later(resolve, 10000));\n                    await RSVP.race([this.get('acdinitialization').waitForAll(1000), timeout]);\n                    return mapValidActiveInteractionsToConversations(this.get('validActiveInteractions'));\n                }\n            })\n        );\n        appPoolV2.addPoolStateChangeListener(({ detail: { poolState } }) => {\n            run.next(this, () => {\n                if (this.get('isDestroying') || this.get('isDestroyed')) {\n                    return;\n                }\n                const attentionCountPerCompositeId: Record<string, number> = {};\n                Object.values(poolState).forEach(({ appDefs }) => {\n                    for (const { appDef, attentionCount } of appDefs) {\n                        attentionCountPerCompositeId[appDef.id] = attentionCount;\n                    }\n                });\n                this.set('attentionCountPerCompositeId', attentionCountPerCompositeId);\n                this.set('_poolState', poolState);\n                this._triggerOnAppAttentionCountChangedAction();\n            });\n        });\n        this.set('appPoolV2', appPoolV2);\n        this.set('resolvedApps', []);\n        this.set('attentionCountPerCompositeId', {});\n        this.set(\n            '_viewStackConversationController',\n            new AppViewStackHostLayoutController('conversation', appPoolV2, {\n                getLayoutTemplate: (groupId, groupState) => {\n                    return this._getConversationLayoutTemplate(groupId, groupState);\n                }\n            })\n        );\n        this.set(\n            '_viewStackContextualController',\n            new AppViewStackHostLayoutController('contextual', appPoolV2, {\n                getLayoutTemplate: (groupId, groupState, previousLayoutTemplate) => {\n                    return this._getContextualLayoutTemplate(groupId, groupState, previousLayoutTemplate);\n                }\n            })\n        );\n        this.set('_prevAppProviders', null);\n        this.set('_prevActiveInteractions', null);\n        this.set('_prevRawActiveInteractions', {});\n        this.set('_prevSelectedInteraction', null);\n        this.set('_issuedAppRequests', []);\n\n        this._triggerOnAppPoolReadyAction();\n        const config = this.get('_metadataReporterConfig') ?? defaultMetadataReporterConfig;\n        const { initialReportDelay, shouldSendInitial } = config;\n        // Suppress the default 30s telemetry timer in tests to prevent it from\n        // leaking into subsequent tests. Tests that explicitly set a short\n        // initialReportDelay (< 30s) are opting in to test this path.\n        const isDefaultDelay =\n            (initialReportDelay ?? defaultMetadataReporterConfig.initialReportDelay) >=\n            defaultMetadataReporterConfig.initialReportDelay;\n        if (shouldSendInitial && !(isTesting && isDefaultDelay)) {\n            run.later(() => this._sendTelemetryMetadata(), Math.max(0, initialReportDelay ?? 0));\n        }\n    },\n\n    _sendTelemetryMetadata: function () {\n        if (this.get('isDestroying') || this.get('isDestroyed')) {\n            return;\n        }\n\n        const { reportInterval, shouldSendPeriodic } =\n            this.get('_metadataReporterConfig') ?? defaultMetadataReporterConfig;\n\n        const appPool = this.get('appPoolV2');\n        if (!appPool) {\n            if (shouldSendPeriodic) {\n                run.later(() => this._sendTelemetryMetadata(), Math.max(reportInterval ?? 300000, 0));\n            }\n            return;\n        }\n\n        const metadata = getTelemetryMetadata({\n            interactions: this.get('validActiveInteractions'),\n            poolState: appPool.getPoolState() ?? undefined,\n            selectedInteraction: this.get('selectedInteraction') || undefined,\n            getInteractionBuckets: interaction => [...new Set([interaction.type, getInteractionType(interaction)])]\n        });\n        const flattenedMetadata = Object.entries(metadata).reduce<Record<string, string | number>>(\n            (acc, [key, value]) => {\n                if (typeof value === 'number') {\n                    acc[key] = value;\n                }\n                return acc;\n            },\n            {}\n        );\n\n        this._addPageAction('appsv2PeriodicTelemetry', flattenedMetadata);\n        if (shouldSendPeriodic) {\n            run.later(() => this._sendTelemetryMetadata(), Math.max(reportInterval ?? 300000, 0));\n        }\n    },\n\n    _logToStashLogger: function (level: TraceLoggerLevel, message: string, appLogDetails?: AppLogDetails) {\n        this.get('logger')[level](\n            appUtils.buildInterapptionsLogMsg(message),\n            appUtils.buildStashLoggerDetails(appLogDetails?.getLogs())\n        );\n    },\n    _evictApp: function (groupInstances: GroupInstances) {\n        const groupInstancesDetails = Object.entries(groupInstances).flatMap(([currGroupId, appInstances]) => {\n            const tokens = computeTokensFromGroupId(currGroupId);\n            if (!tokens) {\n                this.get('logger').error('Unable to evict from a group with an invalid groupId', {\n                    remoteData: { groupId: currGroupId }\n                });\n                return [];\n            }\n            if (appInstances.length === 0) {\n                return [];\n            }\n            const { interactionId, interactionType, appGroupKey } = tokens;\n            return {\n                groupId: currGroupId,\n                appInstances,\n                groupType: appGroupKey,\n                selectedInteraction:\n                    // compare appContextType here to differentiate between live and historical interactions but preserve call/callback\n                    interactionId === this.get('selectedInteraction')?.id &&\n                    computeAppContextTypeFromInteractionType(interactionType) === this.get('selectedInteraction')?.type\n            };\n        });\n\n        // First try to remove LRU of nonselected contextual groups\n        const nonselectedContextualGroups = groupInstancesDetails\n            .filter(curr => {\n                return !curr.selectedInteraction && curr.groupType === 'contextual';\n            })\n            .map(curr => [curr.groupId, curr.appInstances]);\n        if (nonselectedContextualGroups.length > 0) {\n            return LRU(Object.fromEntries(nonselectedContextualGroups));\n        }\n\n        // Try to remove LRU of nonselected conversation groups\n        const nonselectedConversationGroups = groupInstancesDetails\n            .filter(curr => {\n                return !curr.selectedInteraction && curr.groupType === 'conversation';\n            })\n            .map(curr => [curr.groupId, curr.appInstances]);\n        if (nonselectedConversationGroups.length > 0) {\n            return LRU(Object.fromEntries(nonselectedConversationGroups));\n        }\n\n        // Try to remove LRU of selected contextual groups\n        const selectedContextualGroups = groupInstancesDetails\n            .filter(curr => {\n                return curr.selectedInteraction && curr.groupType === 'contextual';\n            })\n            .map(curr => [curr.groupId, curr.appInstances]);\n        if (selectedContextualGroups.length > 0) {\n            return LRU(Object.fromEntries(selectedContextualGroups));\n        }\n\n        // Never evict from current conversation group\n        throw new Error('Unable to evict an app');\n    },\n\n    _triggerOnAppPoolReadyAction: function () {\n        run.next(this, () => {\n            if (this.get('isDestroying') || this.get('isDestroyed')) {\n                return;\n            }\n            this.onAppPoolReady?.(this.appPoolV2!);\n        });\n    },\n    _triggerOnContextualAvailableAppsChangedAction: function () {\n        run.next(this, () => {\n            if (this.get('isDestroying') || this.get('isDestroyed')) {\n                return;\n            }\n            let resolvedApps: ResolvedApp[] = [];\n            const selectedInteraction = this.get('selectedInteraction');\n            if (selectedInteraction) {\n                const interactionAppGroups = this.get('interactionAppGroups');\n                const interactionAppGroup =\n                    interactionAppGroups[\n                        computeInteractionKey(selectedInteraction.id, getInteractionType(selectedInteraction))\n                    ];\n                if (interactionAppGroup) {\n                    resolvedApps = interactionAppGroup.groups.contextual.apps;\n                }\n            }\n            this.onContextualAvailableAppsChanged?.(resolvedApps);\n        });\n    },\n    _triggerOnAppAttentionCountChangedAction: function () {\n        this.onAppAttentionCountChanged?.(this.get('attentionCountPerCompositeId'));\n    },\n    _triggerOnHasConversationAppForCurrInteractionChangedAction: function () {\n        run.next(this, () => {\n            if (this.get('isDestroying') || this.get('isDestroyed')) {\n                return;\n            }\n            // Unconditionally fire the current state.  if v2 is off, we want this to be false\n            this.onHasConversationAppForCurrInteractionChanged?.(this.get('hasConversationAppForCurrInteraction'));\n        });\n    },\n    _triggerOnHasContextualAppForCurrInteractionChangedAction: function () {\n        run.next(this, () => {\n            if (this.get('isDestroying') || this.get('isDestroyed')) {\n                return;\n            }\n            // Unconditionally fire the current state.  if v2 is off, we want this to be false\n            this.onHasContextualAppForCurrInteractionChanged?.(this.get('hasContextualAppForCurrInteraction'));\n        });\n    },\n\n    _updateManagerState: task(function* (this: any): any {\n        yield timeout(100);\n        const interactionAppGroups: InteractionAppGroups = this.get('interactionAppGroups');\n        const appDefUpdate: Record<string, AppDef[]> = {};\n        for (const interactionKey in interactionAppGroups) {\n            const tokens = computeTokensFromInteractionKey(interactionKey);\n            if (tokens) {\n                // Conversation\n                const conversationGroupId = computeGroupId(\n                    tokens.interactionId,\n                    tokens.interactionType,\n                    'conversation'\n                );\n                appDefUpdate[conversationGroupId] = interactionAppGroups[interactionKey].groups.conversation.apps.map(\n                    ({ appDef }) => appDef\n                );\n                // Contextual\n                const contextualGroupId = computeGroupId(tokens.interactionId, tokens.interactionType, 'contextual');\n                appDefUpdate[contextualGroupId] = interactionAppGroups[interactionKey].groups.contextual.apps.map(\n                    ({ appDef }) => appDef\n                );\n            }\n        }\n        // Update State\n        this.appPoolV2.updateAppDefs(appDefUpdate);\n        // Trigger Actions\n        this._triggerOnContextualAvailableAppsChangedAction();\n        this._triggerOnHasConversationAppForCurrInteractionChangedAction();\n        this._triggerOnHasContextualAppForCurrInteractionChangedAction();\n    }).keepLatest(),\n\n    _addAppProvider(provider: AppProvider) {\n        // Request Apps for all current interactions\n        let interactions = this.get('activeInteractions');\n        if (interactions && interactions.length > 0) {\n            interactions.forEach(currInteraction => {\n                this._requestAppsFromProvider(provider, currInteraction)\n                    .then(({ appConfigs }) => {\n                        if (this.get('isDestroying') || this.get('isDestroyed')) {\n                            return;\n                        }\n\n                        this._updateResolvedApps(provider.id, appConfigs, currInteraction);\n                        return;\n                    })\n                    .catch(reason => {\n                        if (this.get('isDestroying') || this.get('isDestroyed')) {\n                            return;\n                        }\n\n                        // Out of date async requests are allowed, expected, and silently ignored\n                        if (reason !== OUT_OF_DATE_ASYNC_PROVIDER_RESPONSE) {\n                            // Encountered an unexpected error\n                            this.get('logger').error(\n                                appUtils.buildInterapptionsLogMsg(\n                                    'Provider appConfig request triggered by an added provider rejected unexpectedly.'\n                                ),\n                                {\n                                    reason,\n                                    remoteData: {\n                                        appProviderId: get(provider, 'id'),\n                                        interactionId: currInteraction.id,\n                                        interactionType: getInteractionType(currInteraction)\n                                    }\n                                }\n                            );\n                        }\n\n                        return;\n                    });\n            });\n        }\n    },\n\n    _removeAppProvider(provider: AppProvider) {\n        let providerIdToRemove = provider.id;\n\n        // Clear out any issued requests for this provider\n        this._removeIssuedAppRequests({ providerId: providerIdToRemove });\n\n        this._deleteProviderResolvedApps(providerIdToRemove);\n    },\n\n    _addInteraction(interaction: AppContext) {\n        let appProviders = this.get('_validAppProviders');\n\n        const interactionType = getInteractionType(interaction);\n\n        if (appProviders && appProviders.length > 0) {\n            appProviders.forEach(currProvider => {\n                this._requestAppsFromProvider(currProvider, interaction)\n                    .then(({ appConfigs }) => {\n                        if (this.get('isDestroying') || this.get('isDestroyed')) {\n                            return;\n                        }\n\n                        // Immediately update the pool so a slow provider doesn't slow up other providers\n                        this._updateResolvedApps(currProvider.id, appConfigs, interaction);\n                    })\n                    .catch(reason => {\n                        if (this.get('isDestroying') || this.get('isDestroyed')) {\n                            return;\n                        }\n\n                        // Out of date async requests are allowed, expected, and silently ignored\n                        if (reason !== OUT_OF_DATE_ASYNC_PROVIDER_RESPONSE) {\n                            // Encountered an unexpected error\n                            this.get('logger').error(\n                                appUtils.buildInterapptionsLogMsg(\n                                    `App Provider appConfig request triggered by an added ${interactionType} rejected unexpectedly.`\n                                ),\n                                {\n                                    reason,\n                                    remoteData: {\n                                        appProviderId: get(currProvider, 'id'),\n                                        interactionId: interaction.id,\n                                        interactionType\n                                    }\n                                }\n                            );\n                        }\n\n                        return;\n                    });\n            });\n        }\n    },\n\n    _updateInteraction(interaction: AppContext, prevInteraction: AppContext) {\n        let appProviders = this.get('_validAppProviders');\n\n        const interactionType = getInteractionType(interaction);\n\n        if (appProviders && appProviders.length > 0) {\n            appProviders\n                .filter(currProvider => get(currProvider, 'monitorInteractionUpdates'))\n                .forEach(currProvider => {\n                    this._requestAppsFromProvider(currProvider, interaction, prevInteraction)\n                        .then(({ appConfigs }) => {\n                            if (this.get('isDestroying') || this.get('isDestroyed')) {\n                                return;\n                            }\n\n                            // Immediately update the pool so a slow provider doesn't slow up other providers\n                            this._updateResolvedApps(currProvider.id, appConfigs, interaction);\n                        })\n                        .catch(reason => {\n                            if (this.get('isDestroying') || this.get('isDestroyed')) {\n                                return;\n                            }\n\n                            // Out of date async requests are allowed, expected, and silently ignored\n                            if (reason !== OUT_OF_DATE_ASYNC_PROVIDER_RESPONSE) {\n                                // Encountered an unexpected error\n                                this.get('logger').error(\n                                    appUtils.buildInterapptionsLogMsg(\n                                        `App Provider appConfig request triggered by an updated ${interactionType} rejected unexpectedly.`\n                                    ),\n                                    {\n                                        reason,\n                                        remoteData: {\n                                            appProviderId: get(currProvider, 'id'),\n                                            interactionId: interaction.id\n                                        }\n                                    }\n                                );\n                            }\n\n                            return;\n                        });\n                });\n        }\n    },\n\n    _removeInteraction(interaction: AppContext) {\n        const { id: interactionId, type: interactionType } = interaction;\n\n        // Clear out any and all issued requests for this interaction based on app context type\n        this._removeIssuedAppRequests({ interactionId, appContextType: interactionType });\n\n        // Notify the providers of the interaction removal\n        let providers = this.get('_validAppProviders');\n        if (providers) {\n            providers\n                .filter(currProvider => typeof currProvider.interactionRemoved === 'function')\n                .forEach(currProvider => {\n                    try {\n                        currProvider.interactionRemoved!(interaction);\n                    } catch (e) {\n                        this.get('logger').warn(\n                            appUtils.buildInterapptionsLogMsg(\n                                'Asynchronous App Provider interactionRemoved handler threw an error.'\n                            ),\n                            {\n                                reason: e,\n                                remoteData: {\n                                    appProviderId: currProvider.id,\n                                    interactionId: interactionId,\n                                    interactionType\n                                }\n                            }\n                        );\n                    }\n                });\n        }\n\n        this._deleteInteractionResolvedApps(interactionId, interactionType);\n    },\n\n    _getProviderById: function (providerId: string): AppProvider | null {\n        const appProviders = this.get('_validAppProviders');\n        return appProviders.find(({ id }) => providerId === id) || null;\n    },\n\n    _getAppDefsFromAppConfigs: function (appConfigs: any[], provider: AppProvider, interaction: AppContext) {\n        const appDefs: AppDef[] = [];\n        for (const appConfig of appConfigs) {\n            const appDef = appUtils.isAppDefV2(appConfig)\n                ? appConfig\n                : this._convertV1AppToV2AppDef(appConfig, provider, interaction);\n            if (appDef) {\n                appDefs.push(appDef);\n                // Log use of pc-prefixed params in app url\n                const foundParams: Record<string, string> = {};\n                if ('src' in appDef && appDef.src) {\n                    URL_REPLACEMENTS.forEach(replacement => {\n                        if (\n                            replacement.queryParamName.startsWith('pc') &&\n                            appDef.src.toString().search(replacement.regExp) !== -1\n                        ) {\n                            foundParams[replacement.queryParamName] = 'true';\n                        }\n                    });\n                    if (Object.keys(foundParams).length > 0) {\n                        this._addPageAction('pcParamsInAppUrl', {\n                            appDefId: appDef.id,\n                            ...foundParams\n                        });\n                    }\n                }\n            }\n        }\n        return appDefs;\n    },\n\n    _updateControllerState: function () {\n        const selectedInteraction = this.get('selectedInteraction');\n        const validActiveInteractions = this.get('validActiveInteractions');\n        this._viewStackConversationController?.updateState({\n            groupIds: validActiveInteractions.map(interaction =>\n                computeGroupId(interaction.id, getInteractionType(interaction), 'conversation')\n            ),\n            activeGroupId: selectedInteraction\n                ? computeGroupId(selectedInteraction.id, getInteractionType(selectedInteraction), 'conversation')\n                : null\n        });\n        this._viewStackContextualController?.updateState({\n            groupIds: validActiveInteractions.map(interaction =>\n                computeGroupId(interaction.id, getInteractionType(interaction), 'contextual')\n            ),\n            activeGroupId: selectedInteraction\n                ? computeGroupId(selectedInteraction.id, getInteractionType(selectedInteraction), 'contextual')\n                : null\n        });\n    },\n\n    _updateResolvedApps: function (providerId: string, appConfigs: any[], interaction: AppContext) {\n        const provider = this._getProviderById(providerId);\n        if (provider) {\n            const interactionType = getInteractionType(interaction);\n            const appContextType = interaction.type;\n            const appGroupKey: AppGroupKey = provider?.group || 'contextual';\n            const appDefs: AppDef[] = this._getAppDefsFromAppConfigs(appConfigs, provider, interaction);\n            const newResolvedApps: ResolvedApp[] = appDefs.map(appDef => {\n                const compositeId = computeInterapptionCompositeId(\n                    interaction.id,\n                    interactionType,\n                    appDef.id,\n                    providerId\n                );\n                return {\n                    compositeId,\n                    appDefId: compositeId,\n                    providerId,\n                    interactionId: interaction.id,\n                    interactionType,\n                    appContextType,\n                    appGroupKey: provider.getAppGroup?.(appDef) ?? appGroupKey,\n                    appDef: {\n                        ...appDef,\n                        id: compositeId\n                    }\n                };\n            });\n            this._modifyResolvedApps(\n                newResolvedApps,\n                // Remove resolved apps by interactionId/providerId/appContextType.\n                // interactionType (media type) may change within a conversation (call→callback),\n                // but appContextType scopes cleanup so different context types sharing an id don't collide.\n                resolvedApp =>\n                    resolvedApp.interactionId === interaction.id &&\n                    resolvedApp.providerId === providerId &&\n                    resolvedApp.appContextType === appContextType\n            );\n        }\n    },\n\n    _deleteProviderResolvedApps: function (providerId: string) {\n        this._modifyResolvedApps([], resolvedApp => providerId === resolvedApp.providerId);\n    },\n\n    _deleteInteractionResolvedApps: function (interactionId: string, appContextType: AppContext['type']) {\n        this._modifyResolvedApps(\n            [],\n            resolvedApp => interactionId === resolvedApp.interactionId && resolvedApp.appContextType === appContextType\n        );\n    },\n\n    _modifyResolvedApps: function (additions: ResolvedApp[], deleteFilter?: (resolution: ResolvedApp) => boolean) {\n        const resolvedApps = this.get('resolvedApps');\n        const res = deleteFilter ? resolvedApps.filter(resolvedApp => !deleteFilter(resolvedApp)) : [...resolvedApps];\n        res.push(...additions);\n        this.set('resolvedApps', res);\n    },\n\n    _convertV1AppToV2AppDef: function (model: any, provider: AppProvider, interaction: AppContext) {\n        const { id: interactionId, type: interactionType } = interaction;\n        let appInstance = model;\n\n        let trustedDataPassing = true;\n\n        if (typeOf(model) === 'instance') {\n            if (provider.id !== INTEGRATIONS_INTERAPPTIONS_PROVIDER_ID) {\n                // Only the integration provider should return app instances\n                return null;\n            }\n            appInstance = model;\n            // Checks whether the integration is an InternallyHostedApp or is exempted from checks (externalUrlExemptIntegrationTypeIds)\n            trustedDataPassing = this.get('appsService').isTrustedApp(appInstance);\n        } else {\n            const finalAppConfig = { ...model };\n            delete finalAppConfig['id'];\n            appInstance = this.buildValidInterapption(\n                'dynamic-app-provider-interaction-widget',\n                model.id || crypto.randomUUID(),\n                finalAppConfig,\n                !!provider.trustedProvider\n            );\n        }\n\n        appInstance.set('interactionId', interactionId);\n        appInstance.set('interactionType', interactionType);\n\n        // Compute valid URL\n        let src: URL | null = null;\n        try {\n            src = new URL(appInstance.get('url'));\n        } catch {\n            // Nothing to do, if we cannot compute an URL from V1 def, a generic log message is sent below\n        }\n\n        if (!src) {\n            this.get('logger').error(\n                appUtils.buildInterapptionsLogMsg('Could not compute a valid URL from V1 AppDef'),\n                {\n                    remoteData: {\n                        providerId: provider.id\n                    }\n                }\n            );\n            return null;\n        }\n\n        const result: IframeAppDef = {\n            type: 'iframe',\n            id: appInstance.get('id') || crypto.randomUUID(),\n            displayName: appInstance.get('name'),\n            src,\n            startBehavior: 'lazy',\n            trustedDataPassing,\n            sandbox: appInstance.get('sandbox')\n        };\n\n        const permissionsPolicy = appInstance.get('permissionsPolicy');\n        if (Array.isArray(permissionsPolicy)) {\n            result.allow = permissionsPolicy;\n        }\n\n        const lifecycleConfig = appInstance.get('lifecycle');\n        if (lifecycleConfig) {\n            result.lifecycleConfig = {\n                // This is a V1 app, we should bootstrap in case of timeout to keep\n                // the same behavior as AppsV1\n                bootstrapLenient: true,\n                bootstrap: lifecycleConfig.hooks.bootstrap,\n                focus: lifecycleConfig.hooks.focus,\n                blur: lifecycleConfig.hooks.blur,\n                stop: lifecycleConfig.hooks.stop\n            };\n        }\n\n        const assets = appInstance.get('assets');\n        if (assets) {\n            result.monochromicIcon = appUtils.buildV2IconAsset(assets.monochromicIcon);\n            result.icon = appUtils.buildV2IconAsset(assets.icon);\n        }\n\n        return result;\n    },\n\n    /**\n     * A function that will be bound to this object, a specific provider, an interaction, and an apps requestId and passed\n     * to a provider.  This function can be used by the provider to update the list of apps for the\n     * interaction at a later time as the provider sees fit.\n     *\n     * @param {string} providerId The id of the prover for which the apps will be updated\n     * @param {string} interaction The interaction for which the apps will be updated\n     * @param {string} requestId The id of the request for which this callback is applicable. If the request is no longer applicable, the apps update will be ignored and logged\n     * @param {*} appConfigs The full list of appConfigs the provider wishes to show for the current app state\n     */\n    _providerUpdateAppConfigsCallback(\n        providerId: string,\n        interaction: AppContext,\n        requestId: string,\n        appConfigs: unknown\n    ) {\n        Ember.run.join(() => {\n            if (this.get('isDestroying') || this.get('isDestroyed')) {\n                return;\n            }\n\n            const interactionType = getInteractionType(interaction);\n            const interactionKey = computeInteractionKey(interaction.id, interactionType);\n\n            // Check to see if this request is still applicable (provider/interaction still exist and interaction has not be updated)\n            let [existingRequest] = this._findIssuedAppRequests({\n                providerId,\n                interactionKey,\n                requestId\n            });\n\n            if (!existingRequest) {\n                // This request is out-of-date.  Provider/Interaction Removed or Interaction updated\n\n                let [currentRequest] = this._findIssuedAppRequests({\n                    providerId,\n                    interactionKey\n                });\n\n                this.get('logger').warn(\n                    appUtils.buildInterapptionsLogMsg(\n                        'App Provider apps update callback called on out-of-date request.  Apps update will be ignored.'\n                    ),\n                    {\n                        remoteData: {\n                            interactionId: interaction.id,\n                            interactionType,\n                            appProviderId: providerId,\n                            outOfDateReason: !currentRequest ? 'removed' : 'interactionUpdated'\n                        }\n                    }\n                );\n\n                return;\n            }\n\n            let finalAppConfigs = [];\n            if (Array.isArray(appConfigs)) {\n                // Individual AppConfigs will be validated downstream\n                finalAppConfigs = appConfigs;\n            } else if (appConfigs) {\n                this.get('logger').info(\n                    appUtils.buildInterapptionsLogMsg(\n                        'App Provider callback called with invalid payload.  Valid results are falsy values or an array.'\n                    ),\n                    {\n                        remoteData: {\n                            type: typeOf(appConfigs),\n                            interactionId: interaction.id,\n                            interactionType,\n                            appProviderId: providerId\n                        }\n                    }\n                );\n            }\n\n            this._updateResolvedApps(providerId, finalAppConfigs, interaction);\n        });\n    },\n\n    // No cleanup currently needded for willDestroyElement()\n    // No need to cancel outstanding appConfig requests.  They'll be dropped\n    // Interapptions should use app-instance for NR and attempt to trigger a pageAction on windowUnload\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n\n        // ----- Handle appProviders changes\n        let appProviderChange = false;\n        let prevAppProviders = this.get('_prevAppProviders');\n        const validAppProviders = this.get('_validAppProviders');\n\n        // Check for removals\n        if (prevAppProviders) {\n            prevAppProviders.forEach(prevAppProvider => {\n                let newAppProvider = !validAppProviders\n                    ? null\n                    : validAppProviders.find(curr => curr.id === prevAppProvider.id);\n                if (!newAppProvider) {\n                    // Remove case\n                    appProviderChange = true;\n                    this._removeAppProvider(prevAppProvider);\n                }\n            });\n        }\n\n        // Check for additions/updates\n        if (validAppProviders) {\n            validAppProviders.forEach(newAppProvider => {\n                let prevAppProvider = !prevAppProviders\n                    ? null\n                    : prevAppProviders.find(curr => curr.id === newAppProvider.id);\n                if (!prevAppProvider) {\n                    // Add case\n                    appProviderChange = true;\n                    this._addAppProvider(newAppProvider);\n                } else {\n                    // For now, we dont handle/care about edits to providers\n                    // Future: iframe/dsl based app providers will need to account for edit\n                }\n            });\n        }\n\n        if (appProviderChange) {\n            this.set('_prevAppProviders', validAppProviders);\n        }\n\n        // ----- Handle interaction changes\n        let interactionChange = false;\n        let prevInteractions = this.get('_prevActiveInteractions');\n        let interactions: AppContext[] | null | undefined = this.get('activeInteractions');\n\n        let prevRawInteractions = this.get('_prevRawActiveInteractions');\n        let rawInteractions: Record<string, any> = {};\n        if (interactions) {\n            interactions.forEach(currInteraction => {\n                const { type: currInteractionType, id: interactionId } = currInteraction;\n                const interactionType = getInteractionType(currInteraction);\n\n                switch (currInteractionType) {\n                    case 'conversation': {\n                        const metadata = currInteraction.payload.get('__interaction_metadata__');\n                        if (!metadata) {\n                            this.get('logger').error(\n                                appUtils.buildInterapptionsLogMsg(\n                                    'No metadata found on the conversation interaction model.'\n                                ),\n                                {\n                                    remoteData: {\n                                        interactionId: interactionId,\n                                        interactionType\n                                    }\n                                }\n                            );\n                        } else {\n                            rawInteractions[interactionId] = metadata;\n                        }\n                        break;\n                    }\n                    case 'workitem': {\n                        const workitem = currInteraction.payload.workitem;\n                        if (!workitem) {\n                            this.get('logger').error(appUtils.buildInterapptionsLogMsg('No workitem found.'), {\n                                remoteData: {\n                                    interactionId: interactionId,\n                                    interactionType\n                                }\n                            });\n                        } else {\n                            rawInteractions[interactionId] = workitem;\n                        }\n                        break;\n                    }\n                    case 'externalContact': {\n                        rawInteractions[interactionId] = { externalContactId: interactionId };\n                        break;\n                    }\n                    case 'analyticsConversation': {\n                        const interactionKey = computeInteractionKey(currInteraction.id, currInteractionType);\n\n                        rawInteractions[interactionKey] = {\n                            conversationId: interactionId\n                        };\n                        break;\n                    }\n                    default:\n                        assertNever(currInteractionType);\n                }\n            });\n        }\n\n        // Check for removals\n        if (prevInteractions) {\n            prevInteractions.forEach(prevInteraction => {\n                let newInteraction = !interactions\n                    ? null\n                    : interactions.find(curr => curr.id === prevInteraction.id && curr.type === prevInteraction.type);\n                if (!newInteraction) {\n                    // Remove case\n                    interactionChange = true;\n\n                    this._removeInteraction(prevInteraction);\n                }\n            });\n        }\n\n        // Check for additions/updates\n        if (interactions) {\n            interactions.forEach(newInteraction => {\n                let prevInteraction = !prevInteractions\n                    ? null\n                    : prevInteractions.find(curr => curr.id === newInteraction.id && curr.type === newInteraction.type);\n                if (!prevInteraction) {\n                    // Add case\n                    interactionChange = true;\n                    this._addInteraction(newInteraction);\n                } else {\n                    const prevRawInteractionKey =\n                        prevInteraction.type === 'analyticsConversation'\n                            ? computeInteractionKey(prevInteraction.id, prevInteraction.type)\n                            : prevInteraction.id;\n                    const newRawInteractionKey =\n                        newInteraction.type === 'analyticsConversation'\n                            ? computeInteractionKey(newInteraction.id, newInteraction.type)\n                            : newInteraction.id;\n\n                    const prevRawInteraction = prevRawInteractions[prevRawInteractionKey];\n                    const newRawInteraction = rawInteractions[newRawInteractionKey];\n                    const isRawInteractionChange =\n                        !prevRawInteraction || !newRawInteraction || !isEqual(prevRawInteraction, newRawInteraction);\n\n                    // Check the model's type for deltas in addition to the raw hawk payload\n                    // The model's type update between call and callback can lag behind the hawk payload\n                    // Since we bin interapptions by interaction id and type,\n                    // it's critical we update our interapptions in response to the type change as well\n                    // TODO: in the future, we should derive the type from the raw payload vs the model to avoid this check\n                    const prevInteractionType = prevInteraction ? getInteractionType(prevInteraction) : undefined;\n                    const newInteractionType = getInteractionType(newInteraction);\n                    const isModelTypeChange = newInteractionType !== prevInteractionType;\n\n                    if (isRawInteractionChange || isModelTypeChange) {\n                        // Found delta or raw interaction cannot be extracted.\n                        // Update case\n                        interactionChange = true;\n                        this._updateInteraction(newInteraction, prevInteraction);\n                    }\n                }\n            });\n        }\n\n        if (interactionChange) {\n            this.set('_prevActiveInteractions', interactions || null);\n            this.set('_prevRawActiveInteractions', rawInteractions);\n        }\n        // ----- Handle selectedInteraction changes\n\n        let prevSelectedInteraction = this.get('_prevSelectedInteraction');\n        let selectedInteraction = this.get('selectedInteraction');\n        /*\n         * Note: v1 of interapptions-manager used strict equality comparisons;\n         * including differentiating between null and undefined.  We are being\n         * a bit verbose here to maintain that consistency.  We'll clean this up in appsv2.\n         */\n        const prevSelected =\n            prevSelectedInteraction && 'payload' in prevSelectedInteraction\n                ? prevSelectedInteraction.payload\n                : prevSelectedInteraction;\n        const currSelected =\n            selectedInteraction && 'payload' in selectedInteraction ? selectedInteraction.payload : selectedInteraction;\n        if (prevSelected !== currSelected) {\n            this.set('_prevSelectedInteraction', selectedInteraction);\n        }\n\n        // ----- Handle subPanelSelectedAppId, i.e. interapption, changes\n        let prevSubPanelSelectedAppId = this.get('_prevSubPanelSelectedAppId') || null;\n        let subPanelSelectedAppId = this.get('subPanelSelectedAppId') || null;\n        if (subPanelSelectedAppId !== prevSubPanelSelectedAppId) {\n            this.set('_prevSubPanelSelectedAppId', subPanelSelectedAppId);\n            this._handleSubPanelAppChange();\n        }\n\n        // Update Controller State\n        this._updateControllerState();\n    },\n\n    _getConversationLayoutTemplate: function (groupId: string, groupState: GroupState): AppViewStackHostLayoutTemplate {\n        const layoutTemplate: AppViewStackHostLayoutTemplate = { items: [] };\n        const tokens = computeTokensFromGroupId(groupId);\n        if (tokens) {\n            const appDefState = groupState.appDefs[0];\n            if (appDefState) {\n                layoutTemplate.visibleAppDefId = appDefState.appDef.id;\n                layoutTemplate.items = [\n                    {\n                        appDefId: layoutTemplate.visibleAppDefId,\n                        active: true\n                    }\n                ];\n            }\n        }\n        return layoutTemplate;\n    },\n\n    _getContextualLayoutTemplate: function (\n        groupId: string,\n        groupState: GroupState,\n        previousLayoutTemplate: AppViewStackHostLayoutTemplate | null\n    ): AppViewStackHostLayoutTemplate {\n        const layoutTemplate: AppViewStackHostLayoutTemplate = { items: [] };\n        const tokens = computeTokensFromGroupId(groupId);\n        if (tokens) {\n            const selectedInteraction = this.get('selectedInteraction');\n            let visibleAppDefId = previousLayoutTemplate?.visibleAppDefId;\n            if (\n                selectedInteraction?.id === tokens.interactionId &&\n                computeAppContextTypeFromInteractionType(tokens.interactionType) === selectedInteraction.type\n            ) {\n                visibleAppDefId = this.get('subPanelSelectedAppId') || undefined;\n            }\n            layoutTemplate.visibleAppDefId = groupState.appDefs.some(({ appDef }) => appDef.id === visibleAppDefId)\n                ? visibleAppDefId\n                : undefined;\n            layoutTemplate.items = groupState.appDefs.map(({ appDef }) => {\n                const previousLayoutTemplateItem = previousLayoutTemplate?.items.find(\n                    item => item.appDefId === appDef.id\n                );\n                return {\n                    appDefId: appDef.id,\n                    active:\n                        appDef.id === layoutTemplate.visibleAppDefId\n                            ? true\n                            : previousLayoutTemplateItem\n                            ? previousLayoutTemplateItem.active\n                            : false\n                };\n            });\n        }\n        return layoutTemplate;\n    },\n\n    _handleSubPanelAppChange: function () {\n        const selectedInteraction = this.get('selectedInteraction');\n        const subPanelSelectedAppId = this.get('subPanelSelectedAppId') || undefined;\n        if (selectedInteraction) {\n            const interactionType = getInteractionType(selectedInteraction);\n            const interactionKey = computeInteractionKey(selectedInteraction.id, interactionType);\n            const tokens = subPanelSelectedAppId ? computeTokensFromCompositeId(subPanelSelectedAppId) : null;\n            // We should only update the layout template if the subPanelSelectedAppId relates to the selected interaction, or if it's being hidden\n            if (!tokens || interactionKey === computeInteractionKey(tokens.interactionId, tokens.interactionType)) {\n                const groupId = computeGroupId(selectedInteraction.id, interactionType, 'contextual');\n                this._viewStackContextualController?.updateLayoutTemplate(\n                    groupId,\n                    (groupId, groupState, previousLayoutTemplate) => {\n                        return this._getContextualLayoutTemplate(groupId, groupState, previousLayoutTemplate);\n                    }\n                );\n            }\n        }\n        this._triggerOnHasContextualAppForCurrInteractionChangedAction();\n    },\n\n    /**\n     * Requests apps from the specified provider and returns\n     * a promise which either resolves with a non-null list of apps or rejects if the response becomes inapplicable.\n     *\n     * This method also maintains a cache of previously issued app requests to deal with race\n     * conditions of modifying both providers and interactions in the same didReceiveAttrs set.\n     * The cache persists until the interaction or provider is removed or the interaction is updated.\n     * If the interaction is updated, a new request will be made to the provider for an updated list of apps.\n     * This cache also controls the validity of the provider promise response and usage of the app update callback.\n     *\n     * @returns {Promise} The result of the apps request\n     * @resolve {Object} An object of the form {appConfigs: []}; the array will be empty if the provider returns an invalid payload or throws\n     * @reject {string} The reason code that the request is no longer applicable.  Currently this can only happen if the\n     *  provider/interaction was removed or if the interaction was updated before the appConfig response resolved\n     */\n    _requestAppsFromProvider(\n        provider: AppProvider,\n        interaction: AppContext,\n        prevInteraction: null | AppContext = null\n    ): Promise<{ appConfigs: any[] }> {\n        const interactionKey = computeInteractionKey(interaction.id, getInteractionType(interaction));\n        if (prevInteraction) {\n            // Interaction Update Case\n            // Remove the requests for the previous version of the interaction\n            const prevInteractionKey = computeInteractionKey(prevInteraction.id, getInteractionType(prevInteraction));\n            this._removeIssuedAppRequests({ providerId: provider.id, interactionKey: prevInteractionKey });\n        } else {\n            let [existingRequest] = this._findIssuedAppRequests({\n                providerId: provider.id,\n                interactionKey\n            });\n\n            if (existingRequest) {\n                return existingRequest.request;\n            }\n        }\n\n        let result: Promise<{ appConfigs: any[] }>;\n\n        let requestId = guidFor({});\n        let callback = this._providerUpdateAppConfigsCallback.bind(this, provider.id, interaction, requestId);\n        if (provider.type === 'programmatic') {\n            result = this._requestAppsFromAsyncProgrammaticProvider(provider, interaction, callback).then(apps => {\n                // Check to see if this request is still applicable (provider/interaction still exist and interaction has not be updated)\n                let [existingRequest] = this._findIssuedAppRequests({\n                    providerId: provider.id,\n                    interactionKey,\n                    requestId\n                });\n\n                if (existingRequest) {\n                    // apps will only be undefined if this component is destroying\n                    return apps || { appConfigs: [] };\n                } else {\n                    // Since this request was not found in issuedRequests there's no concern of this rejection being cached and later encountered\n                    return RSVP.reject(OUT_OF_DATE_ASYNC_PROVIDER_RESPONSE);\n                }\n            });\n        } else {\n            // Providers are validated and this should never be hit/thrown\n            throw new Error('Invalid provider type specified');\n        }\n\n        this.get('_issuedAppRequests').push({\n            providerId: provider.id,\n            interactionId: interaction.id,\n            interactionKey,\n            appContextType: interaction.type,\n            request: result,\n            requestId\n        });\n\n        return result;\n    },\n\n    /**\n     * Requests apps from the specified asynchronous provider and returns\n     * a promise which always resolves with a list of any non-empty objects\n     * returned by the provider. The validity of the objects wrt an app config\n     * is not assessed.\n     *\n     * @param {Object} provider - The app provider from which to request apps\n     * @param {Object} interaction - The interaction model on which to request\n     * @param {function} appUpdCallback - The appsUpdCallback function passed to providers for out-of-band updates\n     *\n     * @returns a promise which always resolves to a list of any non-empty objects\n     * returned by the provider, {appConfigs: []}.\n     */\n    _requestAppsFromAsyncProgrammaticProvider(\n        provider: AppProvider,\n        interaction: AppContext,\n        appUpdCallback: AppsUpdateCallback\n    ): Promise<undefined | { appConfigs: any[] }> {\n        const interactionType = getInteractionType(interaction);\n        try {\n            return provider\n                .getAppConfigs(interaction, appUpdCallback)\n                .then(result => {\n                    if (this.get('isDestroying') || this.get('isDestroyed')) {\n                        return;\n                    }\n\n                    let appConfigs = [];\n\n                    if (typeOf(result) === 'array') {\n                        // Individual AppConfigs will be validated downstream\n                        appConfigs = result;\n                    } else if (result) {\n                        this.get('logger').info(\n                            appUtils.buildInterapptionsLogMsg(\n                                'Asynchronous App Provider returned an invalid result.  Valid results are falsy values or an array.'\n                            ),\n                            {\n                                remoteData: {\n                                    type: typeOf(result),\n                                    interactionId: interaction.id,\n                                    interactionType,\n                                    appProviderId: provider.id\n                                }\n                            }\n                        );\n                    }\n\n                    return { appConfigs };\n                })\n                .catch(() => {\n                    return { appConfigs: [] };\n                });\n        } catch (e) {\n            this.get('logger').info(\n                appUtils.buildInterapptionsLogMsg(\n                    'Asynchronous App Provider returned non-promise object or threw exception when requesting apps'\n                ),\n                {\n                    exception: e,\n                    remoteData: {\n                        interactionId: interaction.id,\n                        interactionType,\n                        appProviderId: provider.id\n                    }\n                }\n            );\n\n            return RSVP.resolve({ appConfigs: [] });\n        }\n    },\n\n    _findIssuedAppRequests(\n        searchQuery: IssuedAppRequestSearchQuery,\n        issuedAppRequests?: IssuedAppRequest[]\n    ): IssuedAppRequest[] {\n        return (issuedAppRequests || this.get('_issuedAppRequests')).filter(\n            matchesIssuedAppRequest.bind(this, searchQuery)\n        );\n    },\n\n    _removeIssuedAppRequests(\n        searchQuery: IssuedAppRequestSearchQuery,\n        issuedAppRequests?: IssuedAppRequest[]\n    ): IssuedAppRequest[] {\n        const targetIssuedAppRequests = issuedAppRequests || this.get('_issuedAppRequests');\n\n        let result: IssuedAppRequest[] = [];\n        for (let index = targetIssuedAppRequests.length - 1; index >= 0; index--) {\n            let currRequest = targetIssuedAppRequests[index];\n            if (matchesIssuedAppRequest(searchQuery, currRequest)) {\n                result.push(currRequest);\n                targetIssuedAppRequests.splice(index, 1);\n            }\n        }\n        return result.reverse();\n    },\n\n    // Exposed for test mocking purposes\n    _addPageAction(eventName: string, attrs: Record<string, string | number>): void {\n        addPageAction(eventName, attrs);\n    }\n});\n\ntype AppMetadata = {\n    conversationAppDefs: number;\n    conversationRunningApps: number;\n    contextualAppDefs: number;\n    contextualRunningApps: number;\n};\n/**\n * Calculates interaction and binned telemetry metadata from the given interactions and interaction app groups.\n */\nfunction getTelemetryMetadata({\n    interactions,\n    poolState,\n    selectedInteraction,\n    getInteractionBuckets = interaction => [interaction.type]\n}: {\n    interactions: AppContext[];\n    poolState?: PoolState;\n    selectedInteraction?: AppContext;\n    getInteractionBuckets?: (interaction: AppContext) => string[];\n}) {\n    const interactionsMetadata = Object.fromEntries(\n        interactions.map(interaction => {\n            return [\n                computeInteractionKey(interaction.id, interaction.type),\n                {\n                    type: getInteractionType(interaction),\n                    isActive:\n                        interaction.id === selectedInteraction?.id && interaction.type === selectedInteraction?.type,\n                    ...getInteractionAppMetadata({ interaction, poolState })\n                }\n            ];\n        })\n    );\n\n    const bucketCounts: Record<string, { interactions: number } & AppMetadata> = {};\n    interactions.forEach(currInteraction => {\n        const currMetadata = interactionsMetadata[computeInteractionKey(currInteraction.id, currInteraction.type)];\n        if (!currMetadata) {\n            return;\n        }\n\n        const { conversationAppDefs, conversationRunningApps, contextualAppDefs, contextualRunningApps } = currMetadata;\n\n        getInteractionBuckets(currInteraction).forEach(currBucketName => {\n            let currBucket = bucketCounts[currBucketName];\n            if (!currBucket) {\n                currBucket = {\n                    interactions: 0,\n                    conversationAppDefs: 0,\n                    conversationRunningApps: 0,\n                    contextualAppDefs: 0,\n                    contextualRunningApps: 0\n                };\n                bucketCounts[currBucketName] = currBucket;\n            }\n\n            currBucket.interactions++;\n            currBucket.conversationAppDefs += conversationAppDefs;\n            currBucket.conversationRunningApps += conversationRunningApps;\n            currBucket.contextualAppDefs += contextualAppDefs;\n            currBucket.contextualRunningApps += contextualRunningApps;\n        });\n    });\n\n    const bucketMetadata = Object.entries(bucketCounts).reduce(\n        (\n            acc,\n            [\n                bucketName,\n                { interactions, conversationAppDefs, conversationRunningApps, contextualAppDefs, contextualRunningApps }\n            ]\n        ) => {\n            return {\n                ...acc,\n                [`${bucketName}InteractionCount`]: interactions,\n                [`${bucketName}TotalConversationAppDefs`]: conversationAppDefs,\n                [`${bucketName}TotalConversationRunningApps`]: conversationRunningApps,\n                [`${bucketName}TotalContextualAppDefs`]: contextualAppDefs,\n                [`${bucketName}TotalContextualRunningApps`]: contextualRunningApps\n            };\n        },\n        {}\n    );\n\n    return {\n        ...bucketMetadata,\n        currentInteractions: {\n            ...interactionsMetadata\n        }\n    };\n}\n\nfunction getInteractionAppMetadata({\n    interaction,\n    poolState\n}: {\n    interaction: AppContext;\n    poolState?: PoolState;\n}): AppMetadata {\n    const result = {\n        conversationAppDefs: 0,\n        conversationRunningApps: 0,\n        contextualAppDefs: 0,\n        contextualRunningApps: 0\n    };\n\n    const type = getInteractionType(interaction);\n\n    if (!type || !poolState) {\n        return result;\n    }\n\n    (['conversation', 'contextual'] as const).forEach(currGroupType => {\n        const currGroup = poolState[computeGroupId(interaction.id, type, currGroupType)];\n        if (!currGroup) {\n            return;\n        }\n\n        const appCount = currGroup.appDefs.length;\n        const runningAppCount = currGroup.renderedInstances.filter(({ appState }) => appState !== 'STOPPING').length;\n\n        switch (currGroupType) {\n            case 'conversation':\n                result.conversationAppDefs += appCount;\n                result.conversationRunningApps += runningAppCount;\n                break;\n            case 'contextual':\n                result.contextualAppDefs += appCount;\n                result.contextualRunningApps += runningAppCount;\n                break;\n            default:\n                assertNever(currGroupType);\n        }\n    });\n\n    return result;\n}\n\nfunction matchesIssuedAppRequest(\n    searchQuery: IssuedAppRequestSearchQuery,\n    issuedAppRequest: IssuedAppRequest\n): boolean {\n    if (searchQuery.interactionKey && searchQuery.interactionKey !== issuedAppRequest.interactionKey) {\n        return false;\n    }\n\n    if (searchQuery.interactionId && searchQuery.interactionId !== issuedAppRequest.interactionId) {\n        return false;\n    }\n\n    if (searchQuery.appContextType && searchQuery.appContextType !== issuedAppRequest.appContextType) {\n        return false;\n    }\n\n    if (searchQuery.providerId && searchQuery.providerId !== issuedAppRequest.providerId) {\n        return false;\n    }\n\n    if (searchQuery.requestId && searchQuery.requestId !== issuedAppRequest.requestId) {\n        return false;\n    }\n\n    return true;\n}\n\nfunction isValidAppProvider(provider: AppProvider): boolean {\n    if (\n        !['object', 'instance'].includes(typeOf(provider)) ||\n        typeOf(provider.id) !== 'string' ||\n        isBlank(provider.id) ||\n        typeOf(provider.getAppConfigs) !== 'function'\n    ) {\n        return false;\n    }\n\n    if (!['undefined', 'boolean'].includes(typeOf(get(provider, 'trustedProvider')))) {\n        return false;\n    }\n\n    if (!['undefined', 'function'].includes(typeOf(get(provider, 'interactionRemoved')))) {\n        return false;\n    }\n\n    if (!['undefined', 'boolean'].includes(typeOf(get(provider, 'monitorInteractionUpdates')))) {\n        return false;\n    }\n\n    // Future, support iframe, worker, etc.\n    if (provider.type !== 'programmatic') {\n        return false;\n    }\n\n    // Programmatic Provider Validations\n    if (provider.type === 'programmatic') {\n        if (!['null', 'undefined', 'boolean'].includes(typeOf(provider.trustedProvider))) {\n            return false;\n        }\n    }\n\n    return true;\n}\n\nfunction getInteractionType(interaction: AppContext): string {\n    const { type } = interaction;\n    switch (type) {\n        case 'conversation':\n            return interaction.payload.get('type');\n        case 'workitem':\n            return 'workitem';\n        case 'externalContact':\n            return 'externalContact';\n        case 'analyticsConversation':\n            return 'analyticsConversation';\n        default:\n            assertNever(type);\n            return '';\n    }\n}\n\nfunction computeGroupId(interactionId: string, interactionType: string, group: AppGroupKey) {\n    return [interactionId, interactionType, group].join(':');\n}\n\nfunction computeTokensFromGroupId(groupId: string) {\n    const tokens = groupId.split(':');\n    if (tokens.length === 3) {\n        let [interactionId, interactionType, appGroupKey] = tokens.map(token => decodeURIComponent(token));\n        if ((appGroupKeys as Readonly<string[]>).includes(appGroupKey)) {\n            return {\n                interactionId,\n                interactionType,\n                appGroupKey: appGroupKey as AppGroupKey\n            };\n        }\n    }\n    return null;\n}\n\nfunction computeInteractionKey(interactionId: string, interactionType: string) {\n    return [interactionId, interactionType].join('|');\n}\n\nfunction computeTokensFromInteractionKey(interactionKey: string) {\n    const tokens = interactionKey.split('|');\n    if (tokens.length === 2) {\n        let [interactionId, interactionType] = tokens.map(token => decodeURIComponent(token));\n        return {\n            interactionId,\n            interactionType\n        };\n    }\n    return null;\n}\n\nfunction computeInterapptionCompositeId(\n    interactionId: string,\n    interactionType: string,\n    appDefId: string,\n    providerId: string\n) {\n    return [interactionId, interactionType, appDefId, providerId].map(token => encodeURIComponent(token)).join('&');\n}\n\nfunction computeTokensFromCompositeId(compositeId: string) {\n    const tokens = compositeId.split('&');\n    if (tokens.length === 4) {\n        let [interactionId, interactionType, appDefId, providerId] = tokens.map(token => decodeURIComponent(token));\n        return {\n            interactionId,\n            interactionType,\n            appDefId,\n            providerId\n        };\n    }\n    return null;\n}\n\nfunction computeAppContextTypeFromInteractionType(interactionType: string): string {\n    if (conversationMediaTypes.includes(interactionType)) {\n        return 'conversation';\n    }\n    return interactionType;\n}\n","import Component from '@ember/component';\nimport { inject } from '@ember/service';\nimport { computed } from '@ember/object';\nimport { Maybe } from 'web-directory/types';\nimport { Conversation, Participant, WorkitemInteraction } from '@genesys/genesys-cloud-conversation-utils';\nimport { debounce } from '@ember/runloop';\n\nconst _stubOldParticipant = {\n    userId: null,\n    externalContactId: null,\n    queueId: null\n};\n\nexport default Component.extend({\n    classNames: ['participant-name'],\n    attributeBindings: ['aria-label:name'],\n\n    participantName: inject('participant-name'),\n    logger: inject('stash-logger'),\n    externalContacts: inject('external-contacts'),\n    intl: inject('intl'),\n\n    /**\n     * @attribute\n     * determines what element this component will render as\n     */\n    tagName: 'span',\n\n    /**\n     * @attribute\n     * Conversation payload\n     */\n    conversation: null as Maybe<Conversation>,\n\n    /**\n     * @attribute\n     * Conversation participant Id\n     */\n    participantId: null as Maybe<string>,\n\n    /**\n     * An array of contactIds we're listening to for changes\n     */\n    _trackedContacts: [] as string[],\n\n    /**\n     * Participant name fetched from stores\n     */\n    _name: null as Maybe<string>,\n\n    /**\n     * Stored previous Conversation and Participant Ids\n     */\n    _oldParticipant: _stubOldParticipant as {\n        userId: Maybe<string>;\n        externalContactId: Maybe<string>;\n        queueId: Maybe<string>;\n    },\n\n    /**\n     * Participant name fetched from conversation\n     */\n    _rawName: computed(\n        'conversation',\n        'participantId',\n        'conversation.messages',\n        'conversation.messages.[]',\n        'conversation.messages.firstObject.from.email',\n        'conversation.messages.firstObject.from.name',\n        'conversation.messages.firstObject.to.email',\n        'conversation.draft',\n        'conversation.draft.to.firstObject.email',\n        function (this: any): Maybe<string> {\n            const conversation = this.get('conversation');\n            const participantId = this.get('participantId');\n            const participant: Maybe<Participant> = this._getParticipant(conversation, participantId);\n            if (!participant) {\n                this.get('logger').warn('ACD: Unable to find requested participant in conversation payload');\n                return null;\n            }\n            return this.get('participantName').getRawParticipantName(participant);\n        }\n    ),\n\n    /**\n     * Bind to the _fetchParticipantName function to ensure the same function is used\n     * every time rather than creating a new function every time bind is called\n     */\n    boundFetchParticipantName: computed(function () {\n        return this._fetchParticipantName.bind(this);\n    }),\n\n    /**\n     * Rendered name for participant.  Use the synchronous\n     * value until the asynchronous fetch resolves.\n     */\n    name: computed('_name', '_rawName', function (): Maybe<string> {\n        const name = this.get('_name') || this.get('_rawName');\n        return name || this.get('intl').t('purecloud.acdInteraction.noName');\n    }),\n\n    /**\n     * Return the participant for a given converastion and participant id.\n     * @returns the Participant or null\n     */\n    _getParticipant(\n        conversation: Maybe<Conversation | WorkitemInteraction>,\n        participantId: Maybe<string>\n    ): Maybe<Participant | Partial<Participant>> {\n        if ((conversation as WorkitemInteraction)?.workitem && participantId) {\n            return (conversation as WorkitemInteraction).customer;\n        }\n\n        if (conversation && participantId && !(conversation as WorkitemInteraction).workitem) {\n            const participants = (conversation as Conversation).participants || [];\n            return participants.find((p: Participant) => p.id === participantId);\n        }\n\n        return null;\n    },\n\n    /**\n     * Return the participant for the conversation and participantId passed\n     * into the component.\n     * @returns the Participant or null\n     */\n    _getPassedParticipant() {\n        const conversation = this.get('conversation');\n        const participantId = this.get('participantId');\n        const participant = this._getParticipant(conversation, participantId);\n\n        if (!participant) {\n            this.get('logger').warn('ACD: Unable to find requested participant in conversation payload');\n            return null;\n        }\n\n        return participant;\n    },\n\n    /**\n     * Fetch user name from given participant.\n     */\n    async _fetchParticipantName() {\n        const conversation = this.get('conversation');\n        const participantId = this.get('participantId');\n        const participant = this._getParticipant(conversation, participantId);\n        if (!participant) {\n            this.get('logger').warn('ACD: Unable to find requested participant in conversation payload');\n            return;\n        }\n\n        const name: Maybe<string> = await this.get('participantName').fetchNameFromParticipant(\n            participant as Participant\n        );\n\n        if (name && !this.isDestroyed && !this.isDestroying) {\n            this.set('_name', name);\n        }\n    },\n\n    /**\n     * Set up a change listener for the canonical contact associated with the\n     * external contact id on the requested participant name.\n     */\n    subscribeToExternalContact() {\n        const participant = this._getPassedParticipant();\n        if (participant) {\n            const externalContactId: string = participant.externalContactId || '';\n            if (externalContactId) {\n                const trackedContacts = this.get('_trackedContacts');\n                const isTracked = trackedContacts.includes(externalContactId);\n                if (!isTracked) {\n                    trackedContacts.push(externalContactId);\n                    this.get('externalContacts').addContactChangeListener(\n                        externalContactId,\n                        this.get('boundFetchParticipantName')\n                    );\n                }\n            }\n            this.set('_oldParticipant', {\n                userId: participant.userId,\n                externalContactId,\n                queueId: participant.queueId\n            });\n        }\n    },\n\n    /**\n     * Remove change listener for the canonical contact associated with the\n     * external contact id on the requested participant name.\n     */\n    unSubscribetoExternalContacts() {\n        const contacts = this.get('_trackedContacts');\n        if (contacts.length > 0) {\n            contacts.forEach(externalContactId => {\n                this.get('externalContacts').removeContactChangeListener(\n                    externalContactId,\n                    this.get('boundFetchParticipantName')\n                );\n            });\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n        this.set('_trackedContacts', []);\n    },\n\n    didReceiveAttrs() {\n        if (this.get('conversation') && this.get('participantId') && this.get('_oldParticipant')) {\n            const newConversation: Maybe<Conversation> = this.get('conversation');\n            const newParticipantId: Maybe<string> = this.get('participantId');\n\n            if (!newConversation || !newParticipantId) {\n                return;\n            }\n\n            const oldParticipant = this.get('_oldParticipant');\n            const newParticipant = this._getParticipant(newConversation, newParticipantId);\n\n            if (\n                oldParticipant &&\n                newParticipant &&\n                oldParticipant?.userId === newParticipant?.userId &&\n                oldParticipant?.externalContactId === newParticipant?.externalContactId &&\n                oldParticipant?.queueId === newParticipant?.queueId\n            ) {\n                return;\n            }\n        }\n\n        this.subscribeToExternalContact();\n\n        debounce(() => this._fetchParticipantName(), 200);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        this.unSubscribetoExternalContacts();\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"XZA3vfuu\",\"block\":\"[[[1,[34,0]]],[],false,[\\\"name\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel/participant-name/template.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"/vWk4CSn\",\"block\":\"[[[10,0],[14,0,\\\"interactions chat-container\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"left-chat-rail\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,0],null,[[\\\"state\\\",\\\"actionGetCanonicalContactSync\\\",\\\"actionDisplayError\\\",\\\"actionAnswerInteraction\\\",\\\"actionAnswerWorkitemInteraction\\\",\\\"actionDeclineInteraction\\\",\\\"actionDeclineWorkitemInteraction\\\",\\\"actionSelectInteraction\\\",\\\"actionSelectWorkitemInteraction\\\",\\\"actionGoOnQueue\\\",\\\"actionCreateCall\\\",\\\"actionCreateEmail\\\",\\\"actionCreateMessage\\\",\\\"actionLoadQueue\\\",\\\"actionLoadParticipantName\\\",\\\"actionFetchDefaultQueue\\\",\\\"actionFetchQueue\\\",\\\"loadDivisionName\\\"],[[33,1],[28,[37,2],[[30,0],\\\"getCanonicalContactSync\\\"],null],[28,[37,2],[[30,0],\\\"displayError\\\"],null],[28,[37,2],[[30,0],\\\"answerInteraction\\\"],null],[28,[37,2],[[30,0],\\\"answerWorkitemInteraction\\\"],null],[28,[37,2],[[30,0],\\\"declineInteraction\\\"],null],[28,[37,2],[[30,0],\\\"declineWorkitemInteraction\\\"],null],[28,[37,2],[[30,0],\\\"selectInteraction\\\"],null],[28,[37,2],[[30,0],\\\"selectWorkitemInteraction\\\"],null],[28,[37,2],[[30,0],\\\"goOnQueue\\\"],null],[28,[37,2],[[30,0],\\\"createCall\\\"],null],[28,[37,2],[[30,0],\\\"createEmail\\\"],null],[28,[37,2],[[30,0],\\\"createMessage\\\"],null],[28,[37,2],[[30,0],\\\"loadQueueName\\\"],null],[28,[37,2],[[30,0],\\\"loadParticipantName\\\"],null],[28,[37,2],[[30,0],\\\"fetchDefaultQueue\\\"],null],[28,[37,2],[[30,0],\\\"fetchQueue\\\"],null],[28,[37,2],[[30,0],\\\"loadDivisionName\\\"],null]]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"interaction-container\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[15,0,[29,[\\\"selected-interaction-container \\\",[52,[51,[28,[37,4],[[33,5],[33,6]],null]],\\\"hidden\\\"]]]],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,7],null,[[\\\"acdEngagementSourcesFT\\\",\\\"activeInteractions\\\",\\\"interaction\\\",\\\"useCommunicationACW\\\",\\\"activeWorkitems\\\",\\\"workitem\\\",\\\"appPoolV2\\\",\\\"hasConversationAppForCurrInteraction\\\",\\\"hasContextualAppForCurrInteraction\\\",\\\"interapptionPanels\\\",\\\"attentionCountPerCompositeId\\\",\\\"isScriptAvailabilityPending\\\",\\\"scriptAvailabilityChanged\\\",\\\"isScriptAvailable\\\",\\\"onSubPanelSelectionChanged\\\",\\\"panelsOverrideObject\\\",\\\"confineConsultedParty\\\",\\\"completeConsultTransfer\\\",\\\"cancelConsultTransfer\\\",\\\"defaultPanelSettings\\\",\\\"actionDisplayError\\\",\\\"setOpenPanel\\\",\\\"agentAddressOnBehalfOfQueue\\\",\\\"acdExternalContactDivNameFT\\\",\\\"acdExternalContactWorkitemsDivNameFT\\\",\\\"insertChatText\\\",\\\"insertSmsText\\\",\\\"insertEmailText\\\",\\\"cannedResponseChatText\\\",\\\"cannedResponseSmsText\\\",\\\"structuredMessage\\\",\\\"cannedResponseEmailText\\\",\\\"loadDivisionName\\\"],[[33,1,[\\\"featureToggles\\\",\\\"acdEngagementSourcesFT\\\"]],[33,8],[33,5],[33,9],[33,10],[33,6],[33,11],[33,12],[33,13],[33,14],[33,15],[33,16],[28,[37,2],[[30,0],\\\"scriptAvailabilityChanged\\\"],null],[33,17],[28,[37,2],[[30,0],\\\"onSubPanelSelectionChanged\\\"],null],[33,18],[28,[37,2],[[30,0],\\\"confineConsultedParty\\\"],null],[28,[37,2],[[30,0],\\\"completeConsultTransfer\\\"],null],[28,[37,2],[[30,0],\\\"cancelConsultTransfer\\\"],null],[33,19],[28,[37,2],[[30,0],\\\"displayError\\\"],null],[28,[37,2],[[30,0],\\\"setOpenPanel\\\"],null],[33,1,[\\\"featureToggles\\\",\\\"agentAddressOnBehalfOfQueue\\\"]],[33,1,[\\\"featureToggles\\\",\\\"acdExternalContactDivNameFT\\\"]],[33,1,[\\\"featureToggles\\\",\\\"acdExternalContactWorkitemsDivNameFT\\\"]],[28,[37,2],[[30,0],\\\"insertChatText\\\"],null],[28,[37,2],[[30,0],\\\"insertSmsText\\\"],null],[28,[37,2],[[30,0],\\\"insertEmailText\\\"],null],[33,20],[33,21],[33,22],[33,23],[28,[37,2],[[30,0],\\\"loadDivisionName\\\"],null]]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[51,[28,[37,4],[[33,5],[33,6]],null]],[[[1,\\\"\\\\n\\\\n            \\\"],[1,[28,[35,24],null,[[\\\"isOnQueue\\\"],[[33,25,[\\\"isOnQueue\\\"]]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[1,\\\"    \\\"],[1,[28,[35,26],null,[[\\\"useAppsV2ConversationInterapptionManager\\\",\\\"activeInteractions\\\",\\\"openPanel\\\",\\\"onAppPoolReady\\\",\\\"onAppAttentionCountChanged\\\",\\\"onContextualAvailableAppsChanged\\\",\\\"onHasConversationAppForCurrInteractionChanged\\\",\\\"onHasContextualAppForCurrInteractionChanged\\\",\\\"appProviders\\\",\\\"workerProviders\\\",\\\"selectedInteraction\\\",\\\"subPanelSelectedAppId\\\",\\\"activeInteractionsMetadataMap\\\",\\\"buildValidInterapption\\\",\\\"insertChatText\\\",\\\"insertSmsText\\\",\\\"insertEmailText\\\"],[[33,27],[33,28],[33,29],[28,[37,2],[[30,0],\\\"onAppPoolReady\\\"],null],[28,[37,2],[[30,0],\\\"onAppAttentionCountChanged\\\"],null],[28,[37,2],[[30,0],\\\"onContextualAvailableAppsChanged\\\"],null],[28,[37,2],[[30,0],\\\"onHasConversationAppForCurrInteractionChanged\\\"],null],[28,[37,2],[[30,0],\\\"onHasContextualAppForCurrInteractionChanged\\\"],null],[33,30],[33,31],[33,32],[33,33],[33,34],[28,[37,2],[[30,0],\\\"buildValidInterapption\\\"],null],[28,[37,2],[[30,0],\\\"insertChatText\\\"],null],[28,[37,2],[[30,0],\\\"insertSmsText\\\"],null],[28,[37,2],[[30,0],\\\"insertEmailText\\\"],null]]]]],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"acd-interactions-panel/interaction-roster\\\",\\\"state\\\",\\\"action\\\",\\\"unless\\\",\\\"or\\\",\\\"selectedInteraction\\\",\\\"selectedWorkitem\\\",\\\"acd-interactions-panel/interaction\\\",\\\"activeInteractions\\\",\\\"useCommunicationACW\\\",\\\"activeWorkitems\\\",\\\"appPoolV2\\\",\\\"hasConversationAppForCurrInteraction\\\",\\\"hasContextualAppForCurrInteraction\\\",\\\"activeSubPanelInterapptions\\\",\\\"attentionCountPerCompositeId\\\",\\\"isScriptAvailabilityPending\\\",\\\"isScriptAvailable\\\",\\\"panelsOverrideObject\\\",\\\"defaultPanelSettings\\\",\\\"cannedResponseChatText\\\",\\\"cannedResponseSmsText\\\",\\\"structuredMessage\\\",\\\"cannedResponseEmailText\\\",\\\"acd-interactions-panel/interaction-queue-status\\\",\\\"interaction\\\",\\\"acd-interactions-panel/interapptions-manager-v2\\\",\\\"useAppsV2ConversationInterapptionManager\\\",\\\"activeAppContexts\\\",\\\"openPanel\\\",\\\"v2InterapptionProviders\\\",\\\"workerProviders\\\",\\\"selectedAppContext\\\",\\\"selectedSubPanelInterapptionId\\\",\\\"activeInteractionsMetadataMap\\\"]]\",\"moduleName\":\"web-directory/components/acd-interactions-panel/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport { readOnly, reads, bool, gt } from '@ember/object/computed';\nimport { scheduleOnce } from '@ember/runloop';\nimport Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport ConversationModel from '../../models/conversation-legacy';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport { requestFocus } from 'web-directory/utils/focus-management';\nimport _ from 'lodash';\n\nconst ActiveCallEntry = Component.extend(LoggerMixin, {\n    classNames: ['active-call-entry'],\n    classNameBindings: ['conversation.onConference'],\n\n    webrtc: service(),\n    session: service(),\n    phone: service(),\n    notification: service(),\n    intl: service(),\n    clock: service(), // EPC service\n    application: service(),\n    streaming: service(),\n\n    showCallControls: false,\n    conversation: null,\n    handleActiveCallChanges: true,\n    Model: ConversationModel,\n    dropDataType: 'text/x-conversationId',\n    clearPanels: null,\n    setPanels: null,\n\n    actions: {\n        sendToProfile(entity) {\n            this.bubbleAction({\n                action: 'transitionToEntityDetail',\n                actionContext: [entity]\n            });\n        },\n        itemDropped(dropEvent) {\n            const conversationId = dropEvent.dataTransfer.getData('text/x-conversationId');\n            this.logger.info('conversation: ', {\n                draggedConversation: conversationId,\n                conversation: this.get('conversation.id')\n            });\n            const droppedConversation = this.get('phone.conversations').findBy('id', conversationId);\n\n            if (!droppedConversation) {\n                this.logger.error('Failed to find conversation for dropped conversationId', {\n                    remoteData: {\n                        conversationId\n                    }\n                });\n                return;\n            }\n\n            if (droppedConversation === this.conversation) {\n                this.logger.warn('Cannot merge active call with itself', {\n                    remoteData: {\n                        conversationId: this.get('conversation.id')\n                    }\n                });\n                return;\n            }\n\n            const callsToMerge = [];\n            callsToMerge.push(this.conversation);\n            callsToMerge.push(droppedConversation);\n            this.phone\n                .mergeCalls(callsToMerge)\n                .then(() => {\n                    this.clearPanels();\n                    this.setPanels({\n                        call: true\n                    });\n\n                    const currentConversation = this.get('phone.activeCall');\n                    if (this.conversation !== currentConversation) {\n                        this.phone.setActiveCall(this.conversation);\n                        this.phone._holdOtherActiveConversations(this.conversation);\n                    }\n                })\n                .catch(err => {\n                    this.logger.error('Error merging calls:', {\n                        error: err\n                    });\n                    this.notification.error(null, this.intl.t('purecloud.failedToMerge'));\n                });\n        },\n        answer: function () {\n            const conversationId = this.get('conversation.id');\n            this.logger.info('Answer button clicked', { conversationId });\n            this.phone.answer(this.conversation);\n            const hostedContext = this.get('application.hostedContext');\n            if (hostedContext) {\n                hostedContext.dismissNotification(conversationId);\n            }\n        },\n        decline: function () {\n            this.phone.sendToVoicemail(this.conversation);\n            const conversationId = this.get('conversation.id');\n            const hostedContext = this.get('application.hostedContext');\n            if (hostedContext) {\n                hostedContext.dismissNotification(conversationId);\n            }\n        },\n        declineConference: function () {\n            this.phone.endCall(this.conversation);\n            const conversationId = this.get('conversation.id');\n            const hostedContext = this.get('application.hostedContext');\n            if (hostedContext) {\n                hostedContext.dismissNotification(conversationId);\n            }\n        },\n        groupCallBack: function () {\n            this.set('makingCall', true);\n            this.phone\n                .makeCall(this.get('conversation.groupRingGroup.contactInfo.groupNumber.firstObject'))\n                .catch(err => {\n                    this.logger.error('Error redialing from call history', {\n                        error: err\n                    });\n                })\n                .finally(() => {\n                    this.set('makingCall', false);\n                });\n        }\n    },\n\n    conversationId: reads('conversation.id'),\n\n    entity: computed(\n        'conversation.{isGroupRing,otherPartyModel,groupRingCaller,isDisconnected,lastDisconnectedPartyModel,monitoredParticipant,coachedParticipant,bargedParticipant}',\n        'isGroup',\n        'isMonitoring',\n        'isCoaching',\n        'isBarging',\n        'onConsult',\n        'conversationIsAConsult',\n        'consultOtherPartyModel',\n        'conversation.connectedParties.[]',\n        function () {\n            if (this.get('conversation.isGroupRing')) {\n                if (this.get('conversation.isOutboundGroupRing')) {\n                    return this.get('conversation.groupRingGroup');\n                }\n                // For inbound group ring (I'm a group member being called), show the caller\n                return this.get('conversation.groupRingCaller');\n            }\n            if (this.isMonitoring && this.get('conversation.monitoredParticipant.userId')) {\n                return this.store.find('person', this.get('conversation.monitoredParticipant.userId'));\n            }\n            if (this.isCoaching && this.get('conversation.coachedParticipant.userId')) {\n                return this.store.find('person', this.get('conversation.coachedParticipant.userId'));\n            }\n            if (this.isBarging && this.get('conversation.bargedParticipant.userId')) {\n                return this.store.find('person', this.get('conversation.bargedParticipant.userId'));\n            }\n            if (this.conversationIsAConsult) {\n                if (this.get('conversation.isDisconnected')) {\n                    return this.get('conversation.otherDisconnectedPartyModel');\n                }\n                return this.get('conversation.consultOtherPartyModel');\n            }\n            if (this.get('conversation.isDisconnected')) {\n                return this.get('conversation.otherDisconnectedPartyModel');\n            }\n            if (this.isGroup && !_.isEmpty(this.get('conversation.otherParties.firstObject.userId'))) {\n                return this.store.find('person', this.get('conversation.otherParties.firstObject.userId'));\n            }\n\n            return this.get('conversation.otherPartyModel');\n        }\n    ),\n\n    onConsult: reads('conversation.onConsult'),\n    isMonitoring: bool('phone.activeCall.myselfIsMonitor'),\n    isCoaching: bool('phone.activeCall.myselfIsCoach'),\n    isBarging: bool('phone.activeCall.myselfIsBarged'),\n\n    conversationIsAConsult: reads('conversation.conversationIsAConsult'),\n    consultOtherPartyModel: reads('conversation.consultOtherPartyModel'),\n    number: reads('conversation.otherPartyNumber'),\n\n    didInsertElement() {\n        this._super(...arguments);\n        if (this.showCallControls) {\n            scheduleOnce('afterRender', this, () => {\n                requestFocus(this, '.incoming-controls button.answer-call');\n            });\n        }\n    },\n\n    isDisconnectedAndNoError: computed(\n        'conversation.isDisconnected',\n        'phone.userCallSessionsWithErrors.[]',\n        function () {\n            let conversationHasError = this.get('phone.userCallSessionsWithErrors').findBy(\n                'id',\n                this.get('conversation.id')\n            );\n            return this.get('conversation.isDisconnected') && !conversationHasError;\n        }\n    ),\n\n    rawNumber: computed('conversation.otherParty.address', function () {\n        let number = this.get('conversation.otherParty.address');\n        if (number) {\n            number = number.replace(/tel:/gi, '');\n            number = number.replace(/sip:/gi, '');\n        }\n        return number;\n    }),\n\n    participantCount: reads('conversation.callParties.length'),\n    isIncomingConference: gt('participantCount', 2),\n\n    isGroup: computed('conversation.otherParty.purpose', function () {\n        return this.get('conversation.otherParty.purpose') === 'group';\n    }),\n\n    shouldShowDialButton: computed('conversation.connectedParties.[]', 'conversation.onConference', function () {\n        return this.get('conversation.connectedParties.length') < 3 && !this.get('conversation.onConference');\n    }),\n\n    hasAlertingPriority: computed(\n        'streaming.alertingLeader.voice',\n        'streaming.alertingLeader.voice.alerting',\n        'streaming.alertingLeader.voice.configured',\n        'session.features.CHAT-3526_enableAlertingLeaderPublicApi',\n        function () {\n            if (\n                !this.get('session.features.CHAT-3526_enableAlertingLeaderPublicApi') ||\n                !this.get('streaming.alertingLeader.voice.configured')\n            ) {\n                return true;\n            } else {\n                return !!this.get('streaming.alertingLeader.voice.alerting');\n            }\n        }\n    ),\n\n    isExternalCall: computed(\n        'conversation.otherParty.purpose',\n        'conversation.onConference',\n        'conversation.onConsult',\n        function () {\n            return (\n                'external' === this.get('conversation.otherParty.purpose') &&\n                !this.get('conversation.onConference') &&\n                !this.get('conversation.onConsult')\n            );\n        }\n    ),\n    activeCallerName: computed(\n        'isMonitoring',\n        'isCoaching',\n        'isBarging',\n        'onConsult',\n        'isExternalCall',\n        'conversation.voicemailParties',\n        'entity.name',\n        'externalContactFound',\n        'number',\n        async function () {\n            const entity = await this.get('entity');\n            return (entity && entity.name) || (await this.number);\n        }\n    ),\n    durationFormatter: computed('intl.isoLocale', function () {\n        if (window.Intl.DurationFormat) {\n            return new Intl.DurationFormat(this.get('intl.isoLocale'), { style: 'long' });\n        }\n        return undefined;\n    }),\n    readableDurationFormat: computed('conversation.startTime', 'clock.second', 'durationFormatter', function () {\n        try {\n            // Consume clock.second to establish Glimmer autotracking (Ember 3.28 compatibility)\n            this.get('clock.second');\n            const durationFormatter = this.durationFormatter;\n            const conversationStartTime = this.get('conversation.startTime');\n            if (!conversationStartTime) {\n                return '';\n            }\n            let startTimeVal = conversationStartTime;\n            // Handle legacy moment objects or plain values\n            if (startTimeVal && typeof startTimeVal === 'object' && typeof startTimeVal.toDate === 'function') {\n                startTimeVal = startTimeVal.toDate();\n            }\n            const startTime = new Date(startTimeVal);\n            if (isNaN(startTime.getTime())) {\n                return '';\n            }\n            const now = new Date();\n            const diffInMS = now - startTime;\n            const seconds = Math.floor((diffInMS / 1000) % 60);\n            const minutes = Math.floor((diffInMS / (1000 * 60)) % 60);\n            const hours = Math.floor(diffInMS / (1000 * 60 * 60));\n            const durationInfo = {\n                hours: hours,\n                minutes: minutes,\n                seconds: seconds\n            };\n            return !!durationFormatter ? durationFormatter.format(durationInfo) : '';\n        } catch (err) {\n            this.logger.warn('<active-call-entry> duration format failed!', err);\n            return '';\n        }\n    }),\n\n    showIndicator: computed('conversation.securePause', 'conversation.isRecording', function () {\n        return this.get('conversation.isRecording') || this.get('conversation.securePause');\n    }),\n\n    showRecordingToolTipText: computed('conversation.recordingState', function () {\n        return this.get('conversation.recordingState') === 'active';\n    })\n});\n\nActiveCallEntry.reopenClass({\n    positionalParams: ['conversation']\n});\n\nexport default ActiveCallEntry;\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"KpTCwsJr\",\"block\":\"[[[6,[39,0],null,[[\\\"dropped\\\"],[\\\"itemDropped\\\"]],[[\\\"default\\\"],[[[[6,[39,1],null,[[\\\"data\\\",\\\"dataType\\\"],[[33,2],[33,3]]],[[\\\"default\\\"],[[[[1,\\\"        \\\"],[10,0],[14,0,\\\"call-info\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,5,[\\\"onConference\\\"]],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"participant-count\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[34,6]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[51,[33,8]],[[[41,[51,[33,5,[\\\"isOutboundGroupRing\\\"]]],[[[41,[33,9,[\\\"type\\\"]],[[[1,\\\"                            \\\"],[10,0],[15,0,[29,[\\\"presence-indicator \\\",[33,9,[\\\"activityPresenceClass\\\"]]]]],[12],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null]],[]],null]],[]]],[1,\\\"\\\\n            \\\"],[10,1],[15,0,[29,[\\\"name\\\\n                    \\\",[52,[33,10],\\\"external-call\\\"],\\\"\\\\n                    \\\",[52,[33,5,[\\\"onConsult\\\"]],\\\"on-consult\\\"],\\\"\\\\n                    \\\",[52,[33,5,[\\\"onConference\\\"]],\\\"on-conference\\\"]]]],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,11],[[33,12],[33,13]],null],[[[1,\\\"                    \\\"],[1,[28,[35,14],[[33,15]],null]],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,5,[\\\"onConsult\\\"]],[[[1,\\\"                    \\\"],[1,[28,[35,16],[\\\"purecloud.transfer.consult\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,5,[\\\"isOutboundGroupRing\\\"]],[[[1,\\\"                    \\\"],[1,[33,5,[\\\"groupRingGroup\\\",\\\"name\\\"]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,17],[[33,5,[\\\"isGroupRing\\\"]],[33,5,[\\\"groupRingCaller\\\"]]],null],[[[1,\\\"                    \\\"],[1,[28,[35,16],[\\\"purecloud.callFrom\\\"],[[\\\"caller\\\"],[[28,[37,11],[[33,5,[\\\"groupRingCaller\\\",\\\"name\\\"]],\\\"\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,5,[\\\"onConference\\\"]],[[[1,\\\"                    \\\"],[1,[28,[35,16],[\\\"purecloud.conference\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,9,[\\\"type\\\"]],[[[41,[33,5,[\\\"isDisconnectedQueueCall\\\"]],[[[1,\\\"                        \\\"],[1,[28,[35,14],[[33,15]],null]],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,5,[\\\"isConnectedWithExternalContact\\\"]],[[[1,\\\"                        \\\"],[8,[39,18],null,[[\\\"@route\\\",\\\"@model\\\"],[\\\"relate.contacts-ui-redirect\\\",[33,5,[\\\"externalContactProfile\\\",\\\"id\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n                            \\\"],[1,[33,5,[\\\"externalContactFullName\\\"]]],[1,\\\"\\\\n                        \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"active-call-entry-link-to-profile\\\"],[4,[38,19],[[30,0],\\\"sendToProfile\\\",[33,9]],null],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,14],[[33,15]],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"]],[]]]],[]]]],[]],[[[1,\\\"                    \\\"],[1,[28,[35,14],[[33,15]],null]],[1,\\\"\\\\n                \\\"]],[]]]],[]]]],[]]]],[]]]],[]]]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,20],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"recording-indicator\\\"],[15,\\\"data-indicator-state\\\",[33,5,[\\\"recordingState\\\"]]],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"placement\\\",\\\"bottom\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,1],[14,0,\\\"indicator-tooltip\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,21],[[[1,\\\"                                \\\"],[1,[28,[35,16],[\\\"purecloud.recording.toolTipText\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                \\\"],[1,[28,[35,16],[\\\"purecloud.securePause.toolTipText\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,5,[\\\"isDisconnected\\\"]],[[[1,\\\"                \\\"],[10,1],[14,0,\\\"duration is-disconnected\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,22],null,[[\\\"durationInMs\\\"],[[33,5,[\\\"connectedDuration\\\"]]]]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,23],[[33,5,[\\\"isIncoming\\\"]]],null],[[[1,\\\"                \\\"],[10,1],[14,0,\\\"duration\\\"],[15,\\\"aria-hidden\\\",[29,[[52,[33,24],\\\"true\\\",\\\"false\\\"]]]],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,22],null,[[\\\"startTime\\\"],[[33,5,[\\\"startTime\\\"]]]]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,1],[14,0,\\\"sr-only\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[34,25]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"]],[]],null]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,5,[\\\"isIncoming\\\"]],[[[41,[33,26],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"incoming-controls\\\"],[12],[1,\\\"\\\\n                    \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-purecloud btn-success answer-call\\\"],[16,\\\"disabled\\\",[33,27,[\\\"phoneDisabled\\\"]]],[24,4,\\\"button\\\"],[4,[38,19],[[30,0],\\\"answer\\\"],null],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,16],[\\\"common.answer\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,28],[[[1,\\\"                        \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-purecloud btn-danger decline-conferenceCall\\\"],[24,4,\\\"button\\\"],[4,[38,19],[[30,0],\\\"declineConference\\\"],null],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,16],[\\\"common.decline\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-purecloud btn-danger decline-call\\\"],[24,4,\\\"button\\\"],[4,[38,19],[[30,0],\\\"decline\\\"],null],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,16],[\\\"common.decline\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"controls\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,29],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"connection-status\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,16],[\\\"purecloud.disconnected\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,17],[[33,30],[33,26]],null],[[[41,[33,5,[\\\"isOutboundGroupRing\\\"]],[[[1,\\\"                            \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-purecloud btn-phone group-callback\\\"],[16,\\\"aria-label\\\",[28,[37,16],[\\\"components.inbox.actions.call\\\"],null]],[16,\\\"disabled\\\",[36,31]],[24,4,\\\"button\\\"],[4,[38,19],[[30,0],\\\"groupCallBack\\\"],null],[12],[1,\\\"\\\\n\\\\n\\\"],[41,[33,31],[[[1,\\\"                                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/phone\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,5,[\\\"isDisconnectedQueueCall\\\"]],[[[1,\\\"                            \\\"],[1,[28,[35,32],null,[[\\\"queue\\\"],[[33,9]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[1,[28,[35,33],null,[[\\\"showPhone\\\",\\\"phoneNumber\\\",\\\"contact\\\",\\\"shouldDisplayDropdown\\\"],[true,[33,34],[33,9],false]]]],[1,\\\"\\\\n                        \\\"]],[]]]],[]]]],[]],null]],[]],[[[41,[28,[37,23],[[33,26]],null],[[[1,\\\"                        \\\"],[10,0],[14,0,\\\"connection-status\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,16],[\\\"purecloud.connected\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[1,[28,[35,35],[[33,5]],[[\\\"small\\\"],[true]]]],[1,\\\"\\\\n\\\"]],[]]]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[]]]]]],[]]]]]],[],false,[\\\"drag-drop-container\\\",\\\"drag-drop-item\\\",\\\"conversationId\\\",\\\"dropDataType\\\",\\\"if\\\",\\\"conversation\\\",\\\"participantCount\\\",\\\"unless\\\",\\\"onConsult\\\",\\\"entity\\\",\\\"isExternalCall\\\",\\\"or\\\",\\\"isMonitoring\\\",\\\"isCoaching\\\",\\\"await\\\",\\\"activeCallerName\\\",\\\"t\\\",\\\"and\\\",\\\"link-to\\\",\\\"action\\\",\\\"showIndicator\\\",\\\"showRecordingToolTipText\\\",\\\"duration-format\\\",\\\"not\\\",\\\"durationFormatter\\\",\\\"readableDurationFormat\\\",\\\"hasAlertingPriority\\\",\\\"phone\\\",\\\"isIncomingConference\\\",\\\"isDisconnectedAndNoError\\\",\\\"shouldShowDialButton\\\",\\\"makingCall\\\",\\\"entity-contact-queue\\\",\\\"entity-contact\\\",\\\"rawNumber\\\",\\\"conversation-controls\\\"]]\",\"moduleName\":\"web-directory/components/active-call-entry/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport { reads, equal } from '@ember/object/computed';\nimport Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport _ from 'lodash';\n\nexport default Component.extend({\n    classNames: ['active-fax'],\n\n    faxErrorInfo: reads('fax.errorInfo'),\n    faxTransmissionStatus: reads('fax.faxStatus'),\n\n    // uploading, transmitting, converting, dialing, connected, disconnected\n    faxState: computed('fax.state', function () {\n        return this.get('fax.state').toLowerCase();\n    }),\n    isDisconnected: equal('faxState', 'disconnected'),\n\n    intl: service(),\n\n    faxStatusMessage: computed('faxState', 'faxStatus', function () {\n        const intl = this.intl;\n\n        const faxState = this.faxState;\n        const faxErrors = this.faxErrors;\n\n        let statusMessage = '';\n\n        if (faxState === 'uploading') {\n            statusMessage = intl.t('purecloud.fax.status.uploading');\n        }\n\n        if (_.includes(['converting', 'transmitting', 'dialing', 'connected'], faxState)) {\n            let localizeMessageKey = 'purecloud.fax.status.preparingFax',\n                localizeArguments = null;\n\n            const currentPage = this.get('faxTransmissionStatus.activePage');\n            const pageTotal = this.get('faxTransmissionStatus.expectedPages');\n\n            if (currentPage && pageTotal) {\n                localizeMessageKey = 'purecloud.fax.status.faxingProgress';\n                localizeArguments = {\n                    currentPage: currentPage,\n                    pageTotal: pageTotal\n                };\n            }\n\n            statusMessage = intl.t(localizeMessageKey, localizeArguments);\n        }\n\n        if (faxState === 'disconnected' && faxErrors === undefined) {\n            statusMessage = intl.t('purecloud.fax.status.successful');\n        }\n\n        if (faxState === 'disconnected') {\n            const errors = this.faxErrorInfo;\n            const failMessage = intl.t('purecloud.fax.error.requestFailed');\n            const succeedMessage = intl.t('purecloud.fax.status.successful');\n\n            statusMessage = errors ? failMessage : succeedMessage;\n        }\n\n        return statusMessage;\n    })\n}).reopenClass({ positionalParams: ['fax'] });\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"mv935ZEq\",\"block\":\"[[[10,0],[15,0,[29,[\\\"fax-number-status \\\",[33,0,[\\\"id\\\"]]]]],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"fax-number\\\"],[12],[1,[33,0,[\\\"receiverDisplayName\\\"]]],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"fax-status\\\"],[12],[1,[34,1]],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,0],[15,0,[29,[\\\"fax-timer \\\",[36,2],\\\" \\\",[52,[33,4],\\\"error\\\"]]]],[12],[1,\\\"\\\\n    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/fax\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"],[41,[33,5],[[[1,\\\"        \\\"],[1,[28,[35,6],null,[[\\\"startTime\\\",\\\"endTime\\\"],[[33,0,[\\\"connectedTime\\\"]],[33,0,[\\\"endTime\\\"]]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[1,[28,[35,6],null,[[\\\"startTime\\\"],[[33,0,[\\\"startTime\\\"]]]]]],[1,\\\"\\\\n\\\"]],[]]],[13]],[],false,[\\\"fax\\\",\\\"faxStatusMessage\\\",\\\"faxState\\\",\\\"if\\\",\\\"faxErrorInfo\\\",\\\"isDisconnected\\\",\\\"duration-format\\\"]]\",\"moduleName\":\"web-directory/components/active-fax/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport { get } from '@ember/object';\nimport { run } from '@ember/runloop';\nimport { on } from '@ember/object/evented';\nimport Component from '@ember/component';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['admin-ui-modal'],\n\n    application: service(),\n    adminui: service(),\n    session: service(),\n\n    src: '',\n    name: 'admin-ui-modal',\n\n    sendClose() {\n        this.sendAction('closeAdminModal');\n    },\n\n    handleMessageEvent(event) {\n        run(() => {\n            if (!event) {\n                return;\n            }\n            try {\n                const sameHost = get(event, 'originalEvent.source.document.location.host') === location.host;\n                const sameName = get(event, 'originalEvent.source.name') === this.name;\n                if (!(sameHost & sameName)) {\n                    return;\n                }\n                const message = get(event, 'originalEvent.data');\n                if (message.type === 'modal:close') {\n                    this.sendClose();\n                } else if (message.type === 'content:route:changed') {\n                    if (!message.data.hash.match(/^\\/directory\\/people\\/(add|import|link)/)) {\n                        const hash = `#/admin${message.data.hash}`;\n                        location.hash = hash;\n                    }\n                } else if (message.type === 'toast') {\n                    this.adminui.toast(message.data);\n                }\n            } catch (error) {\n                if (error && error.name === 'SecurityError') {\n                    return;\n                }\n                this.logger.error('error handling frame message', {\n                    error\n                });\n            }\n        });\n    },\n\n    startMessageListener: on('didInsertElement', function () {\n        $(window).on(`message.${this.elementId}`, this.handleMessageEvent.bind(this));\n    }),\n\n    stopMessageListener: on('willDestroyElement', function () {\n        $(window).off(`message.${this.elementId}`);\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"p/3Jc6CG\",\"block\":\"[[[10,\\\"iframe\\\"],[15,\\\"title\\\",[29,[[36,0]]]],[15,3,[29,[[36,0]]]],[15,\\\"src\\\",[29,[[36,1]]]],[14,\\\"role\\\",\\\"presentation\\\"],[14,\\\"seamless\\\",\\\"\\\"],[12],[13]],[],false,[\\\"name\\\",\\\"src\\\"]]\",\"moduleName\":\"web-directory/components/admin-ui-modal/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport { readOnly } from '@ember/object/computed';\nimport { computed } from '@ember/object';\nimport Component from '@ember/component';\n\nexport default Component.extend({\n    classNames: ['agent-greeting-container'],\n    session: service(),\n    currentUserId: readOnly('session.person.guid'),\n\n    frameUrl: computed('currentUserId', function () {\n        return '/agent-ui-settings-v2/#/' + this.currentUserId + '/agent-greeting';\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"89lKZ/n0\",\"block\":\"[[[10,\\\"iframe\\\"],[14,0,\\\"agent-greeting\\\"],[15,\\\"title\\\",[28,[37,0],[\\\"components.agentGreeting.title\\\"],null]],[14,\\\"sandbox\\\",\\\"allow-popups-to-escape-sandbox allow-scripts allow-same-origin allow-modals allow-forms allow-popups allow-top-navigation-by-user-activation\\\"],[15,\\\"src\\\",[36,1]],[12],[13]],[],false,[\\\"t\\\",\\\"frameUrl\\\"]]\",\"moduleName\":\"web-directory/components/agent-greeting/template.hbs\",\"isStrictMode\":false});","import Ember from 'ember';\nimport ComputedProperty from '@ember/object/computed';\nimport { DisplayedModalConfig } from 'web-directory/services/alerting';\n\nconst { computed, inject, Component } = Ember;\n\nexport default Component.extend({\n    classNames: ['alerting-container'],\n\n    alerting: inject.service('alerting'),\n\n    modalConfig: computed.readOnly('alerting.displayedModal') as ComputedProperty<DisplayedModalConfig | null>,\n\n    /**\n     * @Action\n     * Handles closing the current modal\n     */\n    async actionCloseModal(): Promise<void> {\n        this.get('alerting').popModal();\n    },\n\n    actions: {\n        closeModal() {\n            this.actionCloseModal();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"y8wvblRf\",\"block\":\"[[[10,0],[14,0,\\\"alerting-modal-container\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,1],[[[1,\\\"        \\\"],[1,[28,[35,2],null,[[\\\"modalConfig\\\",\\\"closeModal\\\"],[[33,1],[28,[37,3],[[30,0],\\\"closeModal\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],null],[13]],[],false,[\\\"if\\\",\\\"modalConfig\\\",\\\"alerting-modal\\\",\\\"action\\\"]]\",\"moduleName\":\"web-directory/components/alerting-container/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { get, set, computed } from '@ember/object';\nimport { inject } from '@ember/service';\nimport { Maybe } from 'web-directory/types';\nimport { EVENTS } from 'web-directory/utils/hosted-context';\nimport { warnClosureAction } from 'web-directory/utils/acd';\nimport { getQueueMediaSettings } from 'web-directory/utils/acd-ts';\nimport { UnionFromTuple } from 'web-directory/utils/types';\nimport { getOwner } from '@ember/application';\nimport { addPageAction } from 'web-directory/utils/newrelic';\nimport SimpleCache from 'web-directory/utils/simple-cache';\nimport type { BaseMediaSettings } from 'web-directory/types/queue-media-settings';\nimport { openVoltPopout } from 'web-directory/utils/volt-popout';\n\nexport const DEFAULT_ALERT_TIMEOUT = 30000;\nconst CALLER_NAME_MAX_LENGTH = 30;\nconst QUEUE_OR_GROUP_NAME_MAX_LENGTH = 15;\nconst MILLIS_IN_SECS = 1000;\nconst CACHE_TTL = 5; // minutes\n\nconst NOTIFICATIONS = [\n    'alertingInteractionToast',\n    'alertingWorkitemToast',\n    'alertingUcToast',\n    'alertingUcVideoToast',\n    'connectedAcdCallToast',\n    'phoneDisabledToast',\n    'currentWebrtcVideoToast'\n] as const;\nexport type NotificationType = UnionFromTuple<typeof NOTIFICATIONS>;\n\nconst ALERT_STATES = ['noop', 'start', 'stop', 'start-new'] as const;\nexport type AlertingState = UnionFromTuple<typeof ALERT_STATES>;\n\nexport default Component.extend({\n    classNames: ['alerting-manager'],\n\n    ring: inject('ring'),\n    acdvoicemail: inject('acdvoicemail'),\n    notification: inject('notification'),\n    intl: inject('intl'),\n    session: inject('session'),\n    webrtcSdk: inject('webrtc-sdk'),\n    logger: inject('stash-logger'),\n    participantName: inject('participantName'),\n    store: inject('store'),\n    application: inject('application'),\n    ajax: inject('ajax'),\n    streaming: inject('streaming'),\n\n    /**\n     * @attribute\n     * The alerting conversation that's contextually relevant\n     */\n    alertingConversation: null as any,\n\n    /**\n     * @attribute\n     * Flag to notify if there is another active conversation\n     */\n    isOnConnectedCall: false,\n\n    /**\n     * @attribute\n     * Flag to notify if there is another active ACD conversation\n     */\n    isOnConnectedAcdCall: false,\n\n    /**\n     * @attribute\n     * Flag to notify if phone is disabled\n     */\n    phoneDisabled: false,\n\n    /**\n     * Existing webrtc video\n     */\n    webrtcShowingVideo: false,\n\n    /**\n     * Existing webrtc phone call\n     */\n    webrtcPhoneService: false,\n\n    /**\n     * @attribute\n     * Hosted context object, if hosted\n     */\n    hostedContext: null as any,\n\n    /**\n     * @attribute\n     * Flag to denote if the browser is in the background\n     */\n    browserHidden: false,\n\n    /**\n     * @attribute\n     * Flag notifying we're popped out of the main application for screen recording\n     */\n    isScreenRecordingPopout: false,\n\n    /**\n     * @attribute\n     * Flag notifying the Agent UI panel is open\n     */\n    isInteractionViewOpen: false,\n\n    /**\n     * @attribute\n     * The public API user object from session service\n     */\n    publicApiUser: null as any,\n\n    /**\n     * @attribute\n     * The output device id from webrtc service\n     */\n    notificationOutputDeviceId: null,\n\n    /**\n     * Reference to the exiting alerting ACD toast\n     */\n    alertingInteractionToast: null as any,\n\n    /**\n     * Reference to the exiting workitem toast\n     */\n    alertingWorkitemToast: null as any,\n\n    /**\n     * Reference to the exiting uc toast\n     */\n    alertingUcToast: null as any,\n\n    /**\n     * Reference to the exiting acd call toast\n     */\n    connectedAcdCallToast: null as any,\n\n    /**\n     * Reference to disabled phone toast\n     */\n    phoneDisabledToast: null as any,\n\n    /**\n     * Reference to existing webrtc connection toast\n     */\n    currentWebrtcVideoToast: null as any,\n\n    /**\n     * Existing phone disabled warning message\n     */\n    phoneDisabledMessage: null as any,\n\n    /**\n     * Reference to the exiting uc video toast\n     */\n    alertingUcVideoToast: null as any,\n\n    /**\n     * Asynchronicity within `playRingtone` function causes play and stop\n     * functionality to run out of order causing constant ringing. This flag\n     * prevents ringing when `stopRingtones` was called prior to resolution\n     * in `playRingtone`\n     */\n    shouldRing: true,\n\n    /**\n     * @attribute\n     * Feature toggle to enable ring timeouts from qms\n     * ACE-2879 | PURE-3878\n     */\n    ftAcdRingTimeout: null as Maybe<boolean>,\n\n    /**\n     * @attribute\n     * Cache map that stores the queue setting ring time for workitems.\n     * The value is acquired from routing/queue api response.\n     * Stored on a per queue id basis: Map<string,  { value: number, timestamp: number }>\n     */\n    alertingWorkitemRingTimeCache: new SimpleCache<BaseMediaSettings['manualAnswerAlertToneSeconds']>(),\n\n    _serviceWorkerRegistration: null as any,\n\n    allowActionableNotifications: false,\n\n    /**\n     * Determine if softphone sessions should be ignored based on SDK configuration.\n     */\n    ignoreSoftphone: computed<boolean>('webrtcSdk.shouldIgnoreSoftphone', function () {\n        return this.get('webrtcSdk').shouldIgnoreSoftphone();\n    }),\n\n    /**\n     * Get the current video invitation from webrtc-sdk\n     */\n    currentVideoInvitation: computed.reads('webrtcSdk.videoInvitations.lastObject'),\n\n    /**\n     * Feature toggle to enable alerting presence override.\n     */\n    enableAlertablePresencesOverrides: computed<boolean>('session.features', function () {\n        const features = this.get('session.features');\n        return features && features['PURE-5149_ui_enableAlertablePresencesOverrides'];\n    }),\n\n    /**\n     * Authenticated user's presence\n     */\n    presence: computed.reads('session.person.presence'),\n\n    /**\n     * @action\n     * Closure action passed to the component to be invoked at the parent level.\n     * Send a UC Call to voicemail.\n     */\n    actionToVoicemail: (conversation: any): void => warnClosureAction('actionToVoicemail', { conversation }),\n\n    /**\n     * @action\n     * Closure action passed to the component to be invoked at the parent level.\n     * Answer a UC Call.\n     */\n    actionAnswer: (conversation: any): void => warnClosureAction('actionAnswer', { conversation }),\n\n    /**\n     * @action\n     * Closure action passed to the component to be invoked at the parent level.\n     * Answer the selected interaction.\n     */\n    actionAnswerInteraction: (): void => warnClosureAction('actionAnswerInteraction', {}),\n\n    /**\n     * @action\n     * Closure action passed to the component to be invoked at the parent level.\n     * Open the Agent UI Panel\n     */\n    actionOpenAcdInteraction: (): void => warnClosureAction('actionOpenAcdInteraction', {}),\n\n    /**\n     * @action\n     * Closure action passed to the component to be invoked at the parent level.\n     * Answer the selected workitem interaction.\n     */\n    actionAnswerWorkitemInteraction: (): void => warnClosureAction('actionAnswerWorkitemInteraction', {}),\n\n    /**\n     * Determines if interaction is voice or digital\n     * @param {object} conversation - the ember conversation model\n     * @returns {string} voice/digital\n     */\n    getAlertType(conversation: any) {\n        if (get(conversation || {}, 'myself')) return 'voice';\n        return get(conversation || {}, 'isCall') ? 'voice' : 'digital';\n    },\n\n    /**\n     * storage for previous state's conversationId\n     */\n    _oldConversation: null as Maybe<any>,\n\n    /**\n     * Determines if the given conversation should be auto-answered.\n     *\n     * For call interactions (unlike digital), we cannot rely on initialState and state\n     * properties alone. Instead we evaluate:\n     *\n     *  1. `transferSource` — The agent communication's transferSource property. When set to\n     *     \"ACD\", the call was routed through a queue. This replaces the previous approach of\n     *     checking whether the queue participant was in a connected state, which was unreliable\n     *     when an in-queue workflow routed directly to an agent (the queue would still appear\n     *     connected, falsely indicating ACD routing).\n     *\n     *  2. Queue media settings — `queueMediaSettings.enableAutoAnswer` on the agent's call.\n     *\n     *  3. Agent configuration — `loggedInUser.acdAutoAnswer` (the agent's personal setting).\n     *\n     * Both agent and queue auto-answer settings are only honoured when `transferSource === 'ACD'`.\n     * If the call was not routed via ACD (direct transfer, workflow, etc.), auto-answer is\n     * always suppressed regardless of queue or agent configuration.\n     *\n     * Scenario examples:\n     *\n     *   1. Customer calls a queue, routed to agent via ACD:\n     *      a. transferSource = ACD (T)\n     *      b. queueAASetting (T) = enableAutoAnswer (T) && transferSource (T)\n     *      c. agentAASetting (T) = iAmAgent (T) && transferSource (T) && acdAutoAnswer (T)\n     *      d. isAutoAnswerCall (T) = agentAASetting (T) || queueAASetting (T)\n     *\n     *   2. Agent A receives and auto answer call and transfers call directly to Agent B (not via ACD):\n     *      a. transferSource != ACD (F)\n     *      b. queueAASetting (F) = enableAutoAnswer (T) && transferSource (F)\n     *      c. agentAASetting (F) = iAmAgent (T) && transferSource (F) && acdAutoAnswer (T)\n     *      d. isAutoAnswerCall (F) = agentAASetting (F) || queueAASetting (F)\n     *\n     *   3. Customer calls an in-queue workflow that routes directly to an agent:\n     *      Same observable state as scenario 1 (queue is connected), but transferSource\n     *      disambiguates — the workflow routes directly, so transferSource != ACD.\n     *      a. transferSource != ACD (F)\n     *      b. queueAASetting (F) = enableAutoAnswer (T) && transferSource (F)\n     *      c. agentAASetting (F) = iAmAgent (T) && transferSource (F) && acdAutoAnswer (T)\n     *      d. isAutoAnswerCall (F) = agentAASetting (F) || queueAASetting (F)\n     *      Note: with the previous connectedQueue approach, agentAASetting would have\n     *      incorrectly evaluated to true here since the queue is still connected.\n     *\n     * @param conversation\n     * @returns {boolean}\n     */\n    isAutoAnswerCall(conversation: any): boolean {\n        // If we are not a voice interaction, return early\n        if (this.get('ftAcdRingTimeout') && this.getAlertType(conversation) !== 'voice') {\n            return false;\n        }\n        const loggedInUser = this.get('publicApiUser');\n        const iAmAgent = get(conversation, 'conversation.isAgentCall');\n\n        const conversationParticipants = get(conversation, 'participants') || [];\n\n        const currentUserParticipant = conversationParticipants.find(\n            (p: any) => p.purpose === 'agent' && p.userId === loggedInUser.id\n        );\n        const queueMediaSettings = get(currentUserParticipant || {}, 'calls.firstObject.queueMediaSettings') || {};\n\n        const transferSource = get(currentUserParticipant || {}, 'calls.firstObject.transferSource');\n        const isTransferSourceACD = transferSource === 'ACD';\n        // Both agent and queue config are used only when transfer is via ACD.\n        // Auto-answer is enabled if either the agent or queue setting is on.\n        const agentAASetting = isTransferSourceACD && iAmAgent && loggedInUser.acdAutoAnswer;\n        const queueAASetting = isTransferSourceACD && queueMediaSettings.enableAutoAnswer;\n        return agentAASetting || queueAASetting;\n    },\n\n    init() {\n        this._super(...arguments);\n        this._loadConversationSettings();\n\n        // Subscribe to video invitation events from webrtc-sdk\n        const webrtcSdk = this.get('webrtcSdk');\n        webrtcSdk.on('videoInvitationReceived', this, this._onVideoInvitationReceived);\n        webrtcSdk.on('videoInvitationCancelled', this, this._onVideoInvitationCancelled);\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        const webrtcSdk = this.get('webrtcSdk');\n        webrtcSdk.off('videoInvitationReceived', this, this._onVideoInvitationReceived);\n        webrtcSdk.off('videoInvitationCancelled', this, this._onVideoInvitationCancelled);\n    },\n\n    /**\n     * Handler for video invitation received event from webrtc-sdk.\n     * Shows toast and plays ringtone when new invitations arrive.\n     */\n    _onVideoInvitationReceived(invitation: any) {\n        this.get('logger').info('Video invitation received', {\n            remoteData: {\n                sessionId: invitation.get('id'),\n                fromUserId: invitation.get('fromUserId')\n            }\n        });\n\n        if (!invitation.get('hasDisplayedToast')) {\n            invitation.set('hasDisplayedToast', true);\n            this._displayVideoInvitationToast(invitation);\n            this.get('ring').playRingtone(invitation.get('conversationId'), false, 30000, true);\n        }\n    },\n\n    /**\n     * Handler for video invitation cancelled event from webrtc-sdk.\n     * Dismisses toast and stops ringtone.\n     */\n    _onVideoInvitationCancelled() {\n        this.get('logger').info('Video invitation cancelled');\n        this._cleanupVideoNotification();\n    },\n\n    _loadConversationSettings: function () {\n        const url = this.get('application').pcV2Uri(`api/v2/conversations/settings`);\n        return this.get('ajax')\n            .request(url)\n            .then(data => {\n                this.set('allowActionableNotifications', data.allowActionableNotifications);\n                if (data.allowActionableNotifications) {\n                    this._registerServiceWorker();\n                    this._initializeServiceWorkerListener();\n                }\n            })\n            .catch(error => {\n                this.set('allowActionableNotifications', false);\n                this.get('logger').error('Could not get conversation settings:', { error });\n            });\n    },\n\n    _registerServiceWorker() {\n        if ('serviceWorker' in navigator) {\n            this.get('logger').debug('registering service worker');\n            navigator.serviceWorker\n                .register('./notificationWorker.js', {\n                    scope: './'\n                })\n                .then(registration => {\n                    this.set('_serviceWorkerRegistration', registration);\n                    this.get('logger').info('Notification ServiceWorker registered successfully');\n                })\n                .catch(error => {\n                    this.get('logger').error('ServiceWorker registration failed:', { error });\n                });\n        }\n    },\n\n    _initializeServiceWorkerListener() {\n        if ('serviceWorker' in navigator) {\n            navigator.serviceWorker.addEventListener('message', event => {\n                if (!this.get('allowActionableNotifications')) {\n                    return;\n                }\n                this.get('logger').debug('service worker sent event', event);\n                const { type, data } = event.data;\n                if (type === 'notification-clicked') {\n                    const { conversationId, action } = data;\n                    if (!conversationId) {\n                        this.get('logger').error('Missing conversationId');\n                        return;\n                    }\n\n                    const conversation = this.get('alertingConversation');\n                    if (!conversation || conversation.id !== conversationId) {\n                        this.get('logger').warn('Conversation not found for notification action', { conversationId });\n                        return;\n                    }\n\n                    const isUcCall = !!get(conversation, 'myself');\n\n                    switch (action) {\n                        case 'answer-action':\n                            if (isUcCall) {\n                                this.actionAnswer(conversation);\n                            } else {\n                                this.actionAnswerInteraction();\n                            }\n\n                            // Focus window after answering the call for CEF\n                            const hostedContext = this.get('hostedContext');\n                            if (hostedContext) {\n                                hostedContext.focusWindow();\n                            }\n                            break;\n                        case 'decline-action':\n                            this.actionToVoicemail(conversation);\n                            break;\n                        case '': // when the user clicks on the notification, the service worker will focus the app so not much to do for this case\n                            this.get('logger').debug('No action required for notification');\n                            break;\n                        default:\n                            this.get('logger').warn('Unknown notification action received', { action });\n                    }\n                }\n            });\n        }\n    },\n\n    /**\n     * Calculates the timeout for an alerting conversation.\n     * @param {object} conversation - the ember conversation/interaction model or workitem interaction model\n     * @param {string} conversationType Conversation type\n     * @returns {number} timeout in milliseconds\n     */\n    async getAlertRingTimeout(conversation: any, conversationType: string, isAutoAnswerCall: boolean): Promise<number> {\n        function verifyTimeout(timeout: Maybe<number>): number {\n            return timeout ? timeout : DEFAULT_ALERT_TIMEOUT;\n        }\n\n        if (conversationType === 'digital') {\n            if (this.get('ftAcdRingTimeout')) {\n                let queueManualAlertingRingTime: BaseMediaSettings['manualAnswerAlertToneSeconds'];\n                /**\n                 * If we have a work item, we need to request the queue details from the api\n                 * since the mediaSettings object does not live on the interaction.\n                 *\n                 * If the conversation is not a workitem, or the workitem has no queue id, or the\n                 * request fails, we fall back to just playing the typical digital alert tone.\n                 */\n                if (conversation.workitem) {\n                    const workitemQueueId = conversation.workitem?.queueId;\n                    if (workitemQueueId) {\n                        const ringTimeCache = this.get('alertingWorkitemRingTimeCache');\n                        const cachedRingTimeForQueue = ringTimeCache.get(workitemQueueId);\n                        if (cachedRingTimeForQueue) {\n                            queueManualAlertingRingTime = cachedRingTimeForQueue;\n                        } else {\n                            try {\n                                const queueDetailsUrl = this.get('application').pcV2Uri(`api/v2/routing/queues`);\n                                const queueDetailsRes = await this.get('ajax').request(\n                                    `${queueDetailsUrl}/${workitemQueueId}`\n                                );\n                                const mediaSettings: BaseMediaSettings = get(queueDetailsRes, 'mediaSettings.workitem');\n                                const ringTimeResVal = mediaSettings.manualAnswerAlertToneSeconds;\n                                ringTimeCache.set(workitemQueueId, ringTimeResVal, CACHE_TTL);\n                                queueManualAlertingRingTime = ringTimeResVal;\n                            } catch (e: unknown) {\n                                if (e instanceof Error) {\n                                    this.get('logger').error(\n                                        `name: ${e.name}\\nmessage: ${e.message}\\nstack: ${e.stack}`\n                                    );\n                                }\n                            }\n                        }\n                    }\n                } else {\n                    const queueMediaSettings = getQueueMediaSettings(conversation);\n                    if ('manualAnswerAlertToneSeconds' in queueMediaSettings)\n                        queueManualAlertingRingTime = queueMediaSettings.manualAnswerAlertToneSeconds;\n                }\n                // return time in seconds that we should alert for (0 ≤ x ≤ 900)\n                if (queueManualAlertingRingTime != null && queueManualAlertingRingTime >= 0)\n                    return queueManualAlertingRingTime * MILLIS_IN_SECS;\n            }\n\n            const timeout =\n                get(conversation, 'participantForCurrentUser.alertingTimeoutMs') ||\n                get(conversation, 'workitem.alertTimeoutSeconds') * MILLIS_IN_SECS;\n            return verifyTimeout(timeout);\n        } else {\n            if (this.get('ftAcdRingTimeout')) {\n                const queueMediaSettings = getQueueMediaSettings(conversation);\n                let queueAlertingRingTime;\n                if (isAutoAnswerCall) {\n                    if ('autoAnswerAlertToneSeconds' in queueMediaSettings)\n                        queueAlertingRingTime = queueMediaSettings.autoAnswerAlertToneSeconds;\n                    // We have to check if the auto answer ring time property is undefined and set it to 0\n                    // since we dont want to fallback on the default ring time for voice interactions.\n                    if (queueAlertingRingTime == null) queueAlertingRingTime = 0;\n                } else {\n                    if ('manualAnswerAlertToneSeconds' in queueMediaSettings)\n                        queueAlertingRingTime = queueMediaSettings.manualAnswerAlertToneSeconds;\n                }\n\n                if (queueAlertingRingTime != null && queueAlertingRingTime >= 0)\n                    return queueAlertingRingTime * MILLIS_IN_SECS;\n            }\n\n            if (get(conversation, 'conversation.isAgentCall')) {\n                const timeout = get(conversation, 'conversation.myself.alertingTimeoutMs');\n                return verifyTimeout(timeout);\n            } else if (get(conversation, 'isGroupRing')) {\n                const groupRingId = conversation.get('groupRingId');\n                const groupAlertTime = await this.get('acdvoicemail').getGroupAlertTime(groupRingId);\n                if (groupAlertTime && groupAlertTime.rotateCallsSecs) {\n                    return groupAlertTime.rotateCallsSecs * MILLIS_IN_SECS;\n                }\n            } else {\n                const publicApiUser = this.get('publicApiUser');\n                const userId: string = get(publicApiUser, 'id');\n                const voicemailAlertTime = await this.get('acdvoicemail').getUserAlertTime(userId);\n                if (voicemailAlertTime && voicemailAlertTime.alertTimeoutSeconds) {\n                    return voicemailAlertTime.alertTimeoutSeconds * MILLIS_IN_SECS;\n                }\n            }\n        }\n\n        return DEFAULT_ALERT_TIMEOUT;\n    },\n\n    /**\n     * Play an appropriate ringtone for given conversation\n     * @param {object} conversation - the ember conversation model\n     */\n    async playRingtone(conversation: any, isAutoAnswerCall: boolean) {\n        const conversationId = get(conversation, 'id');\n        const conversationType = this.getAlertType(conversation);\n        const alertTimeout = await this.getAlertRingTimeout(conversation, conversationType, isAutoAnswerCall);\n\n        this.get('logger').info('alerting-manager:playRingtone', {\n            conversationId,\n            isAutoAnswerCall\n        });\n\n        if (!this.get('shouldRing')) {\n            return;\n        }\n\n        if (conversationType === 'voice') {\n            if (this.get('ftAcdRingTimeout')) {\n                addPageAction('voiceRingtoneAlertingEvent', {\n                    autoAnswer: isAutoAnswerCall,\n                    conversationId,\n                    alertTimout: alertTimeout\n                });\n                // This could be a voice conversation that has it's ring time set to zero or an\n                // auto answer voice conversation with no set ring time, either way we dont want to ring\n                if (alertTimeout === 0) return;\n            } else {\n                if (isAutoAnswerCall) {\n                    addPageAction('voiceRingtoneAlertingEvent', {\n                        autoAnswer: true,\n                        conversationId\n                    });\n                    return;\n                }\n\n                addPageAction('voiceRingtoneAlertingEvent', {\n                    autoAnswer: false,\n                    conversationId\n                });\n            }\n\n            const isAgentCall = get(conversation, 'isAgentCall');\n            const isPresenceBusy = this.get('presence') === 'busy';\n            const enableAlertablePresencesOverrides = this.get('enableAlertablePresencesOverrides');\n\n            if (!enableAlertablePresencesOverrides && !isAgentCall && isPresenceBusy) {\n                return;\n            }\n            this.get('ring').playRingtone(conversationId, this.get('isOnConnectedCall'), alertTimeout);\n        }\n\n        if (conversationType === 'digital') {\n            if (this.get('ftAcdRingTimeout') && alertTimeout === 0) return;\n\n            this.get('ring').playRingtone(conversationId, false, alertTimeout, false, 'digital');\n        }\n    },\n\n    /**\n     * Stop playing ringtones\n     */\n    stopRingtones() {\n        this.get('ring').stopRingtone('digital');\n        this.get('ring').stopRingtone();\n    },\n\n    /**\n     * Create the 'Alerting Interaction' Toast\n     */\n    displayIncomingAcdNotification() {\n        const intlNS = 'purecloud.acdInteraction.alertingACDNotification';\n        const message = this.get('intl').t(`${intlNS}.alertingInteractions`);\n        const answerText = this.get('intl').t(`${intlNS}.answer`);\n        const openText = this.get('intl').t(`${intlNS}.openAcdPanel`);\n        const notificationOptions = {\n            showNotificationEverywhere: !this.get('allowActionableNotifications'),\n            forceBrowserNotification: this.get('allowActionableNotifications'),\n            showCloseButton: true,\n            hideAfter: false,\n            messageStyle: 'pin-to-top',\n            type: 'alerting-interaction-message',\n            target: this,\n            tag: 'alerting-interaction-message',\n            actionHandlers: {\n                answerInteraction: answerText,\n                openAcdInteraction: openText\n            }\n        };\n\n        this.set(\n            'alertingInteractionToast',\n            this.get('notification').info(null, message, notificationOptions, getOwner(this))\n        );\n    },\n\n    async createMessage(conversation: any) {\n        let messageGroupDetails = null;\n        let messageName = this.get('intl').t('notification.purecloud.incomingCall');\n\n        //Get Group Caller Details\n        if (get(conversation, 'isGroupRing')) {\n            if (get(conversation, 'groupRingCaller')) {\n                const groupRingCaller = await get(conversation, 'groupRingCaller');\n                messageGroupDetails = this.get('intl').t('purecloud.callFrom', {\n                    caller: get(groupRingCaller, 'name') || ''\n                });\n            } else if (get(conversation, 'otherParty.purpose') == 'user') {\n                const otherPartyModel = await get(conversation, 'otherPartyModel');\n                messageGroupDetails = this.get('intl').t('purecloud.callFrom', {\n                    caller: get(otherPartyModel, 'name') || ''\n                });\n            } else {\n                const otherParty = await get(conversation, 'otherParty');\n                messageGroupDetails = this.get('intl').t('purecloud.callFrom', {\n                    caller: get(otherParty, 'name') || ''\n                });\n            }\n        }\n        // Get Caller/GroupName Details\n        if (get(conversation, 'onConsult')) {\n            messageName = this.get('intl').t('purecloud.transfer.consult');\n        } else if (get(conversation, 'myselfIsMonitor')) {\n            const monitoredParticipantPerson = await get(conversation, 'monitoredParticipantPerson');\n            messageName = this.get('intl').t('purecloud.incomingCallFrom', {\n                caller: get(monitoredParticipantPerson, 'name') || ''\n            });\n        } else if (get(conversation, 'myselfIsCoach')) {\n            const coachedParticipantPerson = await get(conversation, 'coachedParticipantPerson');\n            messageName = this.get('intl').t('purecloud.incomingCallFrom', {\n                caller: get(coachedParticipantPerson, 'name') || ''\n            });\n        } else if (get(conversation, 'myselfIsBarged')) {\n            const bargedParticipantPerson = await get(conversation, 'bargedParticipantPerson');\n            messageName = this.get('intl').t('purecloud.incomingCallFrom', {\n                caller: get(bargedParticipantPerson, 'name') || ''\n            });\n        } else {\n            if (get(conversation, 'isGroupRing')) {\n                const groupRingGroup = await get(conversation, 'groupRingGroup');\n                messageName = get(groupRingGroup, 'name');\n            } else if (get(conversation, 'onConference')) {\n                messageName = this.get('intl').t('purecloud.incomingConference');\n            } else if (get(conversation, 'isIncomingFromExternalContacts')) {\n                if (get(conversation, 'hasMultipleExternalContactMatches')) {\n                    messageName = this.get('intl').t('purecloud.incomingCallFromPhoneNumber', {\n                        number: (await get(conversation, 'otherPartyNumber')) || ''\n                    });\n                } else {\n                    messageName = this.get('intl').t('purecloud.incomingCallFromExternalContact', {\n                        caller: ((await get(conversation, 'externalContactFullName')) as string) || ''\n                    });\n                }\n            } else {\n                const otherPartyModel = await get(conversation, 'otherPartyModel');\n                messageName = this.get('intl').t('purecloud.incomingCallFrom', {\n                    caller: get(otherPartyModel, 'name') || ''\n                });\n            }\n        }\n        const fullMessage =\n            messageGroupDetails !== null && messageName ? messageGroupDetails + ', ' + messageName : messageName;\n        return fullMessage;\n    },\n\n    /**\n     * Create the 'Incoming UC Call' Toast for hosted context\n     * @param {object} conversation - the alerting conversation\n     */\n    async displayIncomingUcNotification(conversation: any) {\n        //@ts-ignore\n        if (this.get('session.useNewNav')) {\n            const title = this.get('intl').t('notification.titles.incomingCall');\n            const message = await this.createMessage(this.get('alertingConversation'));\n            const answerText = this.get('intl').t('common.answer');\n            const declineText = this.get('intl').t('common.decline');\n            const notificationOptions: any = {\n                showNotificationEverywhere: !this.get('allowActionableNotifications'),\n                forceBrowserNotification: this.get('allowActionableNotifications'),\n                type: 'alerting-interaction-message',\n                target: this,\n                tag: 'alerting-interaction-message',\n                hideAfter: false,\n                meta: {\n                    conversation: conversation\n                },\n                actionHandlers: {\n                    answerUcInteraction: answerText,\n                    voicemailUcInteraction: declineText\n                },\n                notificationOutputDeviceId: this.get('notificationOutputDeviceId')\n            };\n            this.set('alertingUcToast', this.get('notification').info(title, message, notificationOptions));\n            if (this.get('isOnConnectedAcdCall')) {\n                this.set(\n                    'connectedAcdCallToast',\n                    this.get('notification').info(null, this.get('intl').t('purecloud.acdInteraction.answerWarning'), {\n                        forceBrowserNotification: true,\n                        showCloseButton: false,\n                        hideAfter: false,\n                        messageStyle: 'pin-to-top',\n                        type: 'warning-message',\n                        target: this,\n                        tag: 'warning-message'\n                    })\n                );\n            }\n            if (this.get('phoneDisabled')) {\n                this.set(\n                    'phoneDisabledToast',\n                    this.get('notification').info(null, this.get('phoneDisabledMessage'), {\n                        forceBrowserNotification: true,\n                        showCloseButton: false,\n                        hideAfter: false,\n                        messageStyle: 'pin-to-top',\n                        type: 'warning-message',\n                        target: this,\n                        tag: 'warning-message'\n                    })\n                );\n            }\n            if (this.get('webrtcShowingVideo') && this.get('webrtcPhoneService')) {\n                this.set(\n                    'currentWebrtcVideoToast',\n                    this.get('notification').info(null, this.get('intl').t('ewc.notificationWarning'), {\n                        forceBrowserNotification: true,\n                        showCloseButton: false,\n                        hideAfter: false,\n                        messageStyle: 'pin-to-top',\n                        type: 'warning-message',\n                        target: this,\n                        tag: 'warning-message'\n                    })\n                );\n            }\n        } else {\n            let isHosted, applicationHasFocus;\n            const hosted: any = this.get('hostedContext');\n            if (hosted) {\n                isHosted = hosted.isHosted();\n                applicationHasFocus = hosted.applicationHasFocus();\n            }\n\n            if (this.get('browserHidden') || (isHosted && !applicationHasFocus)) {\n                const title = this.get('intl').t('notification.titles.incomingCall');\n                const message = this.get('intl').t('notification.purecloud.incomingCall');\n                const notificationOptions: any = {\n                    fallbackToInBrowser: false,\n                    hideAfter: 8,\n                    tag: EVENTS.INCOMING_CALL,\n                    meta: {\n                        conversation: conversation\n                    },\n                    notificationOutputDeviceId: this.get('notificationOutputDeviceId'),\n                    clickHandler: (conversation: any, action: string) => {\n                        if (conversation && action) {\n                            if (action.indexOf('ignore') > -1) {\n                                return this.actionToVoicemail(conversation);\n                            } else if (action.indexOf('answer') > -1) {\n                                return this.actionAnswer(conversation);\n                            }\n                        }\n                    }\n                };\n\n                this.set('alertingUcToast', this.get('notification').info(title, message, notificationOptions));\n            }\n        }\n    },\n\n    /**\n     * Display a video invitation toast from webrtc-sdk\n     */\n    _displayVideoInvitationToast(invitation: any) {\n        const user = invitation.get('user');\n        const userName = (user && get(user, 'name')) || this.get('intl').t('common.unknownUser');\n        const message = this.get('intl').t('volt.incomingVideoInvitation', {\n            name: userName\n        });\n        const answerText = this.get('intl').t('common.answer');\n        const declineText = this.get('intl').t('common.decline');\n        const notificationOptions: any = {\n            showNotificationEverywhere: true,\n            type: 'alerting-interaction-message',\n            target: this,\n            tag: 'alerting-interaction-message',\n            hideAfter: false,\n            meta: {\n                invitation: invitation\n            },\n            actionHandlers: {\n                answerVideoInvitation: answerText,\n                declineVideoInvitation: declineText\n            },\n            notificationOutputDeviceId: this.get('notificationOutputDeviceId')\n        };\n        this.set('alertingUcVideoToast', this.get('notification').info('', message, notificationOptions));\n    },\n\n    /**\n     * Answer a video invitation by opening Volt in a popout window\n     */\n    _answerVideoInvitation(invitation: any) {\n        const roomJid = invitation.get('roomJid') || invitation.get('originalRoomJid');\n        const isHosted = !!(this.get('hostedContext') as any)?.isHosted?.();\n\n        this.get('logger').info('Answering video invitation via popout', {\n            remoteData: {\n                roomJid,\n                sessionId: invitation.get('id'),\n                conversationId: invitation.get('conversationId')\n            }\n        });\n\n        // Remove the invitation from the list\n        this.get('webrtcSdk').removeVideoInvitation(invitation);\n        this._cleanupVideoNotification();\n\n        // Open Volt in a popout window\n        if (roomJid) {\n            openVoltPopout(roomJid, { hosted: isHosted });\n        }\n    },\n\n    /**\n     * Decline a video invitation\n     */\n    _declineVideoInvitation(invitation: any) {\n        this.get('logger').info('Declining video invitation', {\n            remoteData: {\n                roomJid: invitation.get('roomJid'),\n                sessionId: invitation.get('id'),\n                conversationId: invitation.get('conversationId')\n            }\n        });\n\n        // Decline via SDK (this also removes from list)\n        this.get('webrtcSdk').declineVideoInvitation(invitation);\n        this._cleanupVideoNotification();\n    },\n\n    _cleanupVideoNotification(): void {\n        this.get('ring').stopRingtone();\n        this.destroyNotification('alertingUcVideoToast');\n    },\n\n    /**\n     * Create the Workitem Alerting Interaction Toast\n     */\n    displayIncomingWorkitemNotification() {\n        const intlNS = 'purecloud.acdInteraction.workitem.notification';\n        const message = this.get('intl').t(`${intlNS}.alertingWorkitem`);\n        const answerText = this.get('intl').t(`${intlNS}.answer`);\n        const openText = this.get('intl').t(`${intlNS}.view`);\n        const notificationOptions = {\n            showNotificationEverywhere: true,\n            showCloseButton: true,\n            hideAfter: false,\n            messageStyle: 'pin-to-top',\n            type: 'alerting-interaction-message',\n            target: this,\n            tag: 'alerting-interaction-message',\n            actionHandlers: {\n                answerWorkitemInteraction: answerText,\n                openAcdInteraction: openText\n            }\n        };\n\n        this.set(\n            'alertingWorkitemToast',\n            this.get('notification').info(null, message, notificationOptions, getOwner(this))\n        );\n    },\n\n    /**\n     * Destroy a given toast notification\n     * @param {NotificationType} notification - The notification type to destroy\n     */\n    destroyNotification(notification: NotificationType) {\n        const storedNotification = this.get(notification);\n        // 'alertingInteractionToast' notification type is not an instance of Notification class\n        // therefore 'alertingInteractionToast' notification type will not have the 'hide' method.\n        if (notification && storedNotification && storedNotification.hide) {\n            storedNotification.hide();\n        }\n        this.set(notification, null);\n    },\n\n    destroyActionableDesktopNotification(conversation: any) {\n        const hostedContext = this.get('hostedContext');\n        const useNativeNotifications = hostedContext && hostedContext.supportsActionableNotifications();\n        if (useNativeNotifications) {\n            hostedContext.dismissNotification(get(conversation, 'id'));\n        } else {\n            const registration = this.get('_serviceWorkerRegistration') as ServiceWorkerRegistration;\n            if (registration) {\n                registration\n                    .getNotifications()\n                    .then(actionableNotifications => {\n                        actionableNotifications.forEach(actionableNotification => {\n                            actionableNotification.close();\n                        });\n                    })\n                    .catch(err => {\n                        this.get('logger').error(\n                            '<alerting-manager> destroyActionableDesktopNotification failed to getNotifications',\n                            {\n                                err\n                            }\n                        );\n                    });\n            }\n        }\n    },\n\n    /**\n     * Determine if we should show the 'Incoming UC Call' notification\n     * @param conversation - the alerting UC conversation\n     */\n    manageUcNotification(conversation: any) {\n        const isUcCall = !!get(conversation, 'myself');\n        const hasDisplayedDesktopNotification = get(conversation, 'hasDisplayedDesktopNotification');\n        if (isUcCall && !hasDisplayedDesktopNotification) {\n            set(conversation, 'hasDisplayedDesktopNotification', true);\n            if (this.get('allowActionableNotifications')) {\n                this.handleIncomingCall(conversation);\n            }\n            if (!this.get('alertingUcToast')) {\n                this.displayIncomingUcNotification(conversation);\n            }\n        }\n    },\n\n    truncateString(text: string, maximumLength: number) {\n        if (text.length > maximumLength) return text.substring(0, maximumLength) + '...';\n        return text;\n    },\n\n    async handleIncomingCall(conversation: any) {\n        let callerName;\n        let groupName;\n        if (get(conversation, 'isGroupRing')) {\n            const groupRingCaller = await get(conversation, 'groupRingCaller');\n            callerName = get(groupRingCaller, 'name');\n            const groupRingGroup = await get(conversation, 'groupRingGroup');\n            groupName = get(groupRingGroup, 'name');\n        } else if (\n            get(conversation, 'otherParty.purpose') === 'external' ||\n            get(conversation, 'otherParty.purpose') === 'user' ||\n            get(conversation, 'otherParty.purpose') === 'group'\n        ) {\n            const externalCaller = get(conversation, 'otherParties.firstObject');\n            callerName = await this.get('participantName').fetchNameFromParticipant(externalCaller);\n        } else {\n            const otherPartyModel = get(conversation, 'otherPartyModel');\n            callerName = otherPartyModel.name;\n        }\n        const incomingCallerName = callerName || get(conversation, 'otherPartyNumber');\n        const hostedContext = this.get('hostedContext');\n        const useNativeNotifications = hostedContext && hostedContext.supportsActionableNotifications();\n\n        const intl = this.get('intl');\n        const title = intl.t('notification.titles.incomingCall');\n        let body;\n        if (get(conversation, 'isGroupRing')) {\n            body = intl.t('purecloud.incomingCallFromGroupRing', {\n                caller: this.truncateString(incomingCallerName, CALLER_NAME_MAX_LENGTH),\n                groupName: this.truncateString(groupName, QUEUE_OR_GROUP_NAME_MAX_LENGTH)\n            });\n        } else {\n            body = intl.t('purecloud.incomingCallFrom', {\n                caller: this.truncateString(incomingCallerName, CALLER_NAME_MAX_LENGTH)\n            });\n        }\n        const answerText = intl.t('common.answer');\n        const declineText = intl.t('common.decline');\n\n        if (useNativeNotifications) {\n            this.get('logger').debug('Using native notifications for incoming call');\n            hostedContext.showNativeNotification({\n                title: title,\n                message: body,\n                tag: conversation.id,\n                mute: false,\n                actions: [\n                    {\n                        title: answerText,\n                        actionId: 'answer-action',\n                        bringToForeground: true\n                    },\n                    {\n                        title: declineText,\n                        actionId: 'decline-action',\n                        bringToForeground: false\n                    }\n                ],\n                onclick: (tag: string, actionId: string) => {\n                    // Get the current alerting conversation to ensure we're working with the most up-to-date data\n                    const currentConversation = this.get('alertingConversation');\n                    if (!currentConversation || currentConversation.id !== tag) {\n                        this.get('logger').warn('Conversation not found or changed for notification action', {\n                            tag,\n                            currentConversationId: currentConversation ? currentConversation.id : 'none'\n                        });\n                        return;\n                    }\n\n                    if (actionId) {\n                        this.get('logger').debug('Native notification action clicked:', { actionId, tag });\n\n                        if (actionId === 'answer-action') {\n                            this.actionAnswer(currentConversation);\n                        } else if (actionId === 'decline-action') {\n                            this.actionToVoicemail(currentConversation);\n                        }\n                    } else {\n                        this.get('logger').debug('Native notification clicked:', { tag });\n                    }\n                }\n            });\n        } else {\n            const registration = this.get('_serviceWorkerRegistration') as ServiceWorkerRegistration;\n            if (!(window.Notification && window.Notification.permission === 'granted')) {\n                const result = await window.Notification.requestPermission();\n                if (result !== 'granted') {\n                    this.get('logger').error('<component/alerting-manager>: No notification permission!');\n                    return;\n                }\n            }\n            if (registration && registration.active) {\n                registration.active.postMessage({\n                    title: title,\n                    body: body,\n                    data: conversation.id,\n                    translations: {\n                        answerCall: answerText,\n                        declineCall: declineText\n                    }\n                });\n            } else {\n                this.get('logger').warn('ServiceWorker not ready for notifications');\n            }\n        }\n    },\n\n    /**\n     * Determine if we should show/hide the 'Alerting Interaction' notification\n     * @param conversation - the alerting interaction\n     */\n    manageAcdNotification(conversation: any) {\n        const isNotAcdInteraction = !!get(conversation, 'myself');\n        const isAutoAnswerCall = this.isAutoAnswerCall(conversation);\n        const isWorkitem = !!get(conversation, 'workitem');\n        const isUCVideo = get(conversation, 'user.name');\n        const hasDisplayedDesktopNotification = get(conversation, 'hasDisplayedDesktopNotification');\n\n        if (this.get('isScreenRecordingPopout') || isNotAcdInteraction || isAutoAnswerCall) {\n            this.destroyNotification('alertingInteractionToast');\n        } else if (!isWorkitem && !hasDisplayedDesktopNotification && !isUCVideo) {\n            if (this.get('allowActionableNotifications')) {\n                this.handleIncomingAcdCall(conversation);\n                set(conversation, 'hasDisplayedDesktopNotification', true);\n            }\n            if (!this.get('alertingInteractionToast')) {\n                this.displayIncomingAcdNotification();\n            }\n        }\n    },\n\n    async handleIncomingAcdCall(conversation: any) {\n        const hostedContext = this.get('hostedContext');\n        const useNativeNotifications = hostedContext && hostedContext.supportsActionableNotifications();\n\n        const participantForCustomer = get(conversation, 'participantForCustomer');\n        let name;\n        if (\n            (participantForCustomer.purpose === 'user' || participantForCustomer.purpose === 'agent') &&\n            participantForCustomer.userId\n        ) {\n            const person = await this.get('store').findRecord('person', participantForCustomer.userId);\n            name = person.get('name');\n        } else {\n            name = this.get('participantName').getRawParticipantName(participantForCustomer) || '';\n        }\n        const activeQueue = conversation.participants.filter((p: any) => p.purpose === 'acd' && !p.endTime);\n        const intlNS = 'purecloud.acdInteraction.alertingACDNotification';\n        const title = this.get('intl').t(`${intlNS}.alertingInteractionsVerbose`, {\n            type: conversation.type\n        });\n\n        const truncatedName = this.truncateString(name, CALLER_NAME_MAX_LENGTH);\n        let truncatedQueueName = '';\n        if (activeQueue.length > 0) {\n            truncatedQueueName = this.truncateString(activeQueue[0].name, QUEUE_OR_GROUP_NAME_MAX_LENGTH);\n        }\n\n        const body = this.get('intl').t(`${intlNS}.openAcdPanelVerbose`, {\n            type: conversation.type,\n            name: truncatedName,\n            queue: truncatedQueueName\n        });\n        const answerCall = this.get('intl').t(`${intlNS}.answer`);\n\n        if (useNativeNotifications) {\n            this.get('logger').debug('Using native notifications for incoming ACD call');\n\n            hostedContext.showNativeNotification({\n                title: title,\n                message: body,\n                tag: conversation.id,\n                mute: false,\n                actions: [\n                    {\n                        title: answerCall,\n                        actionId: 'answer-action',\n                        bringToForeground: true\n                    }\n                    // No decline option for ACD\n                ],\n                onclick: (tag: string, actionId: string) => {\n                    // Get the current alerting conversation to ensure we're working with the most up-to-date data\n                    const currentConversation = this.get('alertingConversation');\n                    if (!currentConversation || currentConversation.id !== tag) {\n                        this.get('logger').warn('Conversation not found or changed for notification action', {\n                            tag,\n                            currentConversationId: currentConversation ? currentConversation.id : 'none'\n                        });\n                        return;\n                    }\n\n                    if (actionId) {\n                        this.get('logger').debug('Native notification action clicked:', { actionId, tag });\n\n                        if (actionId === 'answer-action') {\n                            this.actionAnswerInteraction();\n                        }\n                    } else {\n                        this.get('logger').debug('Native notification clicked:', { tag });\n                        this.actionOpenAcdInteraction();\n                    }\n                }\n            });\n        } else {\n            if (!(window.Notification && window.Notification.permission === 'granted')) {\n                const result = await window.Notification.requestPermission();\n                if (result !== 'granted') {\n                    this.get('logger').error(\n                        '<component/alerting-manager> handleIncomingAcdCall: No notification permission!'\n                    );\n                    return;\n                }\n            }\n            const registration = this.get('_serviceWorkerRegistration') as ServiceWorkerRegistration;\n            if (registration && registration.active) {\n                registration.active.postMessage({\n                    title,\n                    body,\n                    data: conversation.id,\n                    type: 'acd',\n                    translations: {\n                        answerCall\n                        // No decline option for ACD\n                    }\n                });\n            }\n        }\n    },\n\n    /**\n     * Determine if we should show the Workitem notification\n     * @param interaction - the alerting interaction\n     */\n    manageWorkitemNotification(interaction: any) {\n        const isWorkitem = !!interaction.workitem;\n        const isUCVideo = get(interaction, 'user.name');\n        const isInteractionViewOpen = this.get('isInteractionViewOpen');\n        const browserIsHidden = this.get('browserHidden');\n\n        if (isInteractionViewOpen && !browserIsHidden && !isUCVideo) {\n            this.destroyNotification('alertingWorkitemToast');\n        } else if (!this.get('alertingWorkitemToast') && isWorkitem) {\n            this.displayIncomingWorkitemNotification();\n        }\n    },\n\n    /**\n     * Handle ring states for given alerting object\n     * @param {AlertingState} state - the alerting state\n     * @param conversation - the alerting conversation/interaction\n     */\n    handleAlerting(state: AlertingState, newConversation: any, oldConversation: any) {\n        this.set('shouldRing', true);\n        if (state === 'start') {\n            this.playRingtone(newConversation, this.isAutoAnswerCall(newConversation));\n        } else if (state === 'start-new') {\n            this.stopRingtones();\n            this.playRingtone(newConversation, this.isAutoAnswerCall(newConversation));\n        } else if (state === 'stop') {\n            // With ftAcdRingTimeout on, we dont want to stop the ringtone if it is an auto answer call\n            // because even though the interaction is 'connected', the setting may be greater than 0.\n            if (!(this.get('ftAcdRingTimeout') && this.isAutoAnswerCall(oldConversation))) {\n                this.set('shouldRing', false);\n                this.stopRingtones();\n            }\n        }\n    },\n\n    /**\n     * Handle notifications for given alerting object\n     * @param {AlertingState} state - the alerting state\n     * @param conversation - the alerting conversation/interaction\n     */\n    handleNotifications(state: AlertingState, newConversation: any, oldConversation: any) {\n        if (state === 'stop') {\n            this.destroyNotification('alertingInteractionToast');\n            this.destroyNotification('alertingWorkitemToast');\n            this.destroyNotification('alertingUcToast');\n            this.destroyNotification('alertingUcVideoToast');\n            this.destroyNotification('connectedAcdCallToast');\n            this.destroyNotification('phoneDisabledToast');\n            this.destroyNotification('currentWebrtcVideoToast');\n            // if we have actionable notifications, we should close them\n            if (this.get('allowActionableNotifications')) {\n                this.destroyActionableDesktopNotification(oldConversation);\n            }\n        } else {\n            this.manageUcNotification(newConversation);\n            this.manageAcdNotification(newConversation);\n            this.manageWorkitemNotification(newConversation);\n        }\n    },\n\n    actions: {\n        answerInteraction() {\n            this.actionAnswerInteraction();\n        },\n\n        openAcdInteraction() {\n            this.actionOpenAcdInteraction();\n        },\n\n        answerWorkitemInteraction() {\n            this.actionAnswerWorkitemInteraction();\n        },\n        answerUcInteraction() {\n            this.actionAnswer(this.get('alertingConversation'));\n        },\n        voicemailUcInteraction() {\n            this.actionToVoicemail(this.get('alertingConversation'));\n        },\n        answerVideoInvitation() {\n            const invitation = this.get('currentVideoInvitation');\n            if (invitation) {\n                this._answerVideoInvitation(invitation);\n            }\n        },\n        declineVideoInvitation() {\n            const invitation = this.get('currentVideoInvitation');\n            if (invitation) {\n                this._declineVideoInvitation(invitation);\n            }\n        }\n    },\n\n    didReceiveAttrs() {\n        let oldConversation, oldConversationId;\n        let newConversation, newConversationId;\n        let state: AlertingState = 'noop';\n\n        if (this.get('_oldConversation')) {\n            oldConversation = this.get('_oldConversation');\n            oldConversationId = get(oldConversation || {}, 'id');\n        }\n\n        if (this.get('alertingConversation')) {\n            newConversation = this.get('alertingConversation');\n            newConversationId = get(newConversation || {}, 'id');\n        }\n\n        if (!oldConversationId && !newConversationId) {\n            this.set('_oldConversation', newConversation);\n            return; // nothing to do\n        }\n\n        if (oldConversation && newConversation) {\n            if (oldConversationId === newConversationId) {\n                state = 'noop';\n            } else if (!newConversationId) {\n                state = 'stop';\n            } else if (!oldConversationId) {\n                state = 'start';\n            } else if (oldConversationId !== newConversationId) {\n                state = 'start-new';\n            }\n        } else if (newConversation && newConversationId) {\n            state = 'start-new';\n        } else if (oldConversation && oldConversationId) {\n            state = 'stop';\n        }\n\n        // If softphone sessions are disabled in the SDK, don't alert/ring for incoming softphone calls.\n        // UC calls do not seem to have a 'type' property on the conversation object.\n        // We only want to ignore starting new alerts, not stopping alerts.\n        if (\n            this.get('ignoreSoftphone') &&\n            this.getAlertType(newConversation) === 'voice' &&\n            (state === 'start-new' || state === 'start')\n        ) {\n            this.get('logger').debug('Ignoring incoming softphone call because softphone is disabled.');\n            this.set('_oldConversation', newConversation);\n            return;\n        } else if (\n            this.get('session').features['CHAT-3526_enableAlertingLeaderPublicApi'] &&\n            this.getAlertType(newConversation) === 'voice' &&\n            this.get('streaming').alertingLeader.voice &&\n            !this.get('streaming').alertingLeader.voice.alerting &&\n            this.get('streaming').alertingLeader.voice.configured\n        ) {\n            this.get('logger').debug(\n                'Ignoring incoming softphone call and stopping ringtones because softphone alerts are currently prioritized elsewhere'\n            );\n            this.stopRingtones();\n            this.set('_oldConversation', newConversation);\n            return;\n        }\n\n        this.handleAlerting(state, newConversation, oldConversation);\n        this.handleNotifications(state, newConversation, oldConversation);\n\n        this.set('_oldConversation', newConversation);\n    }\n});\n","import Ember from 'ember';\nimport { DisplayedModalConfig } from 'web-directory/services/alerting';\nimport { Maybe } from 'web-directory/types';\nconst { Component, computed, inject } = Ember;\nimport { modalClients } from '../../iframe-client-config';\nimport { modalDataToQueryString } from 'web-directory/utils/modal';\n// todo check if this is fine with legacy build\n\nexport default Component.extend({\n    classNames: ['alerting-modal'],\n\n    alerting: inject.service('alerting'),\n    intl: inject.service(),\n\n    modalConfig: null as Maybe<DisplayedModalConfig>,\n\n    buttonAlignment: computed('modalConfig.buttonAlignment', function () {\n        return this.get('modalConfig').buttonAlignment || 'end';\n    }),\n\n    modalSize: computed('modalConfig.size', function () {\n        return this.get('modalConfig').size || 'dynamic';\n    }),\n\n    modalContent: computed.reads('modalConfig.content'),\n\n    ifcModalContent: computed.reads('modalConfig.ifcModalData'),\n\n    ifcModalId: computed.reads('modalConfig.ifcModalId'),\n\n    /**\n     * Computed property that translates defaultTitle keys in modalClients config\n     */\n    clientConfig: computed('intl.locale', 'intl.loaded', function () {\n        const intl = this.get('intl');\n        const translatedConfig: any = {};\n\n        // Clone and translate each modal client config\n        Object.keys(modalClients).forEach(key => {\n            const config = modalClients[key];\n            translatedConfig[key] = Object.assign({}, config);\n\n            // Translate defaultTitle if it exists\n            if (translatedConfig[key].defaultTitle) {\n                translatedConfig[key].defaultTitle = intl.t(translatedConfig[key].defaultTitle).toString();\n            }\n        });\n\n        return translatedConfig;\n    }),\n\n    parsedQueryParams: computed.reads('alerting.parsedQueryParams'),\n\n    ifcModalRoute: computed('ifcModalId', function () {\n        const displayedIfcModal = this.get('ifcModalId');\n        if (displayedIfcModal) {\n            const modalFrameData = this.get('clientConfig')[displayedIfcModal];\n            if (modalFrameData) {\n                const queryStr = modalDataToQueryString(this.get('ifcModalContent'));\n                return `${modalFrameData.assignedRoute}${queryStr}`;\n            }\n        }\n        return null;\n    }),\n\n    applyQueryOverrides(modalData: any) {\n        const queryParams = this.get('parsedQueryParams');\n        if (!queryParams) {\n            return this.get('clientConfig');\n        }\n        let clientConfig = this.get('clientConfig');\n        Object.keys(clientConfig).forEach(clientId => {\n            let urlOverride = queryParams[`global-modal-${clientId}`];\n            if (urlOverride !== undefined && modalData && modalData[clientId]) {\n                if (typeof modalData[clientId].timeMachineUrl === 'function') {\n                    modalData[clientId].url = modalData[clientId].timeMachineUrl(urlOverride);\n                } else {\n                    modalData[clientId].url = urlOverride;\n                }\n            }\n        });\n        return modalData;\n    },\n\n    _cleanupDismissHandler: null as Maybe<() => void>,\n\n    initialFocusSelector: computed('modalConfig', function (): string | undefined {\n        const modalConfig: DisplayedModalConfig = this.get('modalConfig');\n        if (!modalConfig) return;\n        if (modalConfig.actions?.negative) return '.alerting-modal-negative-button';\n        if (modalConfig.actions?.secondary) return '.alerting-modal-secondary-button';\n        if (modalConfig.actions?.positive) return '.alerting-modal-positive-button';\n        return;\n    }),\n\n    /**\n     * @Action\n     * Handles closing the current modal\n     */\n    closeModal: null as (() => Promise<void>) | null,\n\n    /**\n     * @Action\n     * Handles a positive button click for current modal\n     */\n    async actionOnModalPositiveClick(): Promise<void> {\n        const modalConfig = this.get('modalConfig');\n        if (modalConfig?.actions?.positive) {\n            modalConfig.actions.positive.action();\n            if (this.closeModal) this.closeModal();\n        }\n    },\n\n    /**\n     * @Action\n     * Handles a secondary button click for current modal\n     */\n    async actionOnModalSecondaryClick(): Promise<void> {\n        const modalConfig = this.get('modalConfig');\n        if (modalConfig?.actions?.secondary) {\n            modalConfig.actions.secondary.action();\n            if (this.closeModal) this.closeModal();\n        }\n    },\n\n    /**\n     * @Action\n     * Handles a negative button click for current modal\n     */\n    async actionOnModalNegativeClick(): Promise<void> {\n        const modalConfig = this.get('modalConfig');\n        if (modalConfig?.actions?.negative) {\n            modalConfig.actions.negative.action();\n            if (this.closeModal) this.closeModal();\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        const modal = document.getElementsByClassName('alerting-gux-modal')[0];\n        if (!modal) return;\n\n        let currData = this.get('clientConfig');\n        let newData = this.applyQueryOverrides(currData);\n        this.set('clientConfig', newData);\n\n        let dismissHandler = (e: Event) => {\n            e.preventDefault();\n            if (this.modalConfig?.actions?.dismiss) {\n                this.modalConfig.actions.dismiss();\n            }\n            if (this.closeModal) this.closeModal();\n        };\n\n        dismissHandler = dismissHandler.bind(this);\n\n        modal.addEventListener('guxdismiss', dismissHandler);\n        const removeListener = () => {\n            const modal = document.getElementsByClassName('alerting-gux-modal')[0];\n            if (!modal) return;\n            modal.removeEventListener('guxdismiss', dismissHandler);\n        };\n        this.set('_cleanupDismissHandler', removeListener);\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        if (this._cleanupDismissHandler) this._cleanupDismissHandler();\n    },\n\n    actions: {\n        onModalPositiveClick() {\n            this.actionOnModalPositiveClick();\n        },\n        onModalSecondaryClick() {\n            this.actionOnModalSecondaryClick();\n        },\n        onModalNegativeClick() {\n            this.actionOnModalNegativeClick();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"bPO3crlY\",\"block\":\"[[[10,\\\"gux-modal\\\"],[15,\\\"size\\\",[36,0]],[15,\\\"initial-focus\\\",[36,1]],[14,0,\\\"alerting-gux-modal\\\"],[14,\\\"open\\\",\\\"\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,3,[\\\"title\\\"]],[[[1,\\\"        \\\"],[10,0],[14,\\\"slot\\\",\\\"title\\\"],[14,0,\\\"alerting-modal-title\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[33,3,[\\\"title\\\"]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,4],[[[1,\\\"        \\\"],[10,0],[14,\\\"slot\\\",\\\"content\\\"],[14,0,\\\"alerting-modal-content\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[34,4]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,5],[[[1,\\\"        \\\"],[10,0],[14,\\\"slot\\\",\\\"content\\\"],[14,0,\\\"alerting-modal-ifc-content\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,6],null,[[\\\"clientConfig\\\",\\\"route\\\"],[[33,7],[33,8]]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[28,[37,9],[[33,3,[\\\"actions\\\",\\\"negative\\\"]],[33,3,[\\\"actions\\\",\\\"secondary\\\"]],[33,3,[\\\"actions\\\",\\\"positive\\\"]]],null],[[[1,\\\"        \\\"],[10,\\\"gux-cta-group\\\"],[14,\\\"slot\\\",\\\"footer\\\"],[15,\\\"align\\\",[36,10]],[14,0,\\\"alerting-modal-buttons\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,3,[\\\"actions\\\",\\\"negative\\\"]],[[[1,\\\"                \\\"],[10,\\\"gux-button\\\"],[14,\\\"slot\\\",\\\"dismiss\\\"],[15,\\\"onclick\\\",[28,[37,11],[[30,0],\\\"onModalNegativeClick\\\"],null]],[14,0,\\\"alerting-modal-negative-button\\\"],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[33,3,[\\\"actions\\\",\\\"negative\\\",\\\"label\\\"]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,3,[\\\"actions\\\",\\\"secondary\\\"]],[[[1,\\\"                \\\"],[10,\\\"gux-button\\\"],[14,\\\"slot\\\",\\\"secondary\\\"],[15,\\\"onclick\\\",[28,[37,11],[[30,0],\\\"onModalSecondaryClick\\\"],null]],[14,0,\\\"alerting-modal-secondary-button\\\"],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[33,3,[\\\"actions\\\",\\\"secondary\\\",\\\"label\\\"]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,3,[\\\"actions\\\",\\\"positive\\\"]],[[[1,\\\"                \\\"],[10,\\\"gux-button\\\"],[14,\\\"slot\\\",\\\"primary\\\"],[15,\\\"onclick\\\",[28,[37,11],[[30,0],\\\"onModalPositiveClick\\\"],null]],[14,0,\\\"primary alerting-modal-positive-button\\\"],[14,\\\"accent\\\",\\\"primary\\\"],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[33,3,[\\\"actions\\\",\\\"positive\\\",\\\"label\\\"]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13]],[],false,[\\\"modalSize\\\",\\\"initialFocusSelector\\\",\\\"if\\\",\\\"modalConfig\\\",\\\"modalContent\\\",\\\"ifcModalContent\\\",\\\"frame-router\\\",\\\"clientConfig\\\",\\\"ifcModalRoute\\\",\\\"or\\\",\\\"buttonAlignment\\\",\\\"action\\\"]]\",\"moduleName\":\"web-directory/components/alerting-modal/template.hbs\",\"isStrictMode\":false});","import { htmlSafe } from '@ember/template';\nimport { computed, observer } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@ember/component';\nimport Ember from 'ember';\nimport { isValidEmailAddress } from 'web-directory/utils/email';\n\nvar AnchorTagComponent = Component.extend({\n    tagName: 'span',\n\n    intl: service(),\n\n    httpRegex: /(http|https):\\/\\/(?:www\\.)?(.*)/i,\n\n    // Anchor tag text body: <a>{{label}}</a>\n    label: null,\n\n    //href components: <a href=\"{{protocol & value}}\">{{label}}</a>\n    value: null, //email address, phone number, URL\n    protocol: null, //protocol of the href in the case of mailto, tel, sms, etc.\n\n    title: null,\n    target: '_blank',\n\n    init: function () {\n        this._super();\n\n        this.decorateLabel();\n    },\n\n    text: computed('value', 'label', function () {\n        var label = this.label;\n        if (label) {\n            return label;\n        }\n\n        var value = this.value,\n            protocol = this.protocol;\n\n        // If the value already has a protocol for http, gods be good lets not waste space showing it.\n        if (value && value.match(this.httpRegex)) {\n            value = value.replace(this.httpRegex, '$2');\n        }\n\n        if (protocol === 'map') {\n            value = htmlSafe(Ember.Handlebars.Utils.escapeExpression(value).replace(/\\n/g, '<br />'));\n        }\n\n        return value;\n    }),\n\n    anchor: computed('value', 'protocol', function () {\n        var value = this.value,\n            protocol = this.protocol;\n\n        if (protocol === 'map' && value) {\n            this.set('target', '_new');\n            return 'https://maps.google.com/?q=' + window.encodeURIComponent(value);\n        }\n\n        //mailto:, tel:, sms:\n        if (protocol && value) {\n            return `${protocol}:${value}`;\n        }\n\n        if (value && value.match(this.httpRegex)) {\n            return value;\n        }\n        // No protocol assumes plain http:// unless the value already has it set.\n        return `http://${value}`;\n    }),\n\n    decorateLabel: observer('value', function () {\n        var value = this.value,\n            protocol = this.protocol;\n\n        if (protocol === 'mailto' && value) {\n            this.set('target', null);\n\n            // TODO: [Glimmer] fix this value issue\n            value = value.toString();\n\n            if (!isValidEmailAddress(value)) {\n                return this.set('label', this.intl.t('purecloud.acdInteraction.relate.validation.invalidEmail'));\n            }\n\n            this.set('label', value);\n        }\n    })\n});\n\nexport default AnchorTagComponent;\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"lkFIG42y\",\"block\":\"[[[10,3],[15,6,[36,0]],[15,\\\"title\\\",[36,1]],[15,\\\"target\\\",[36,2]],[12],[1,[34,3]],[13]],[],false,[\\\"anchor\\\",\\\"title\\\",\\\"target\\\",\\\"text\\\"]]\",\"moduleName\":\"web-directory/components/anchor-tag/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { inject } from '@ember/service';\nimport { registerAppCarouselToolbar, setLocale } from '@genesys/apps-v2-host-layout';\nimport type { Maybe } from 'web-directory/types';\n\nexport default Component.extend({\n    classNames: ['app-carousel-toolbar'],\n    classNameBindings: ['name'],\n    attributeBindings: ['ariaHidden:aria-hidden'],\n\n    intl: inject('intl'),\n\n    ariaHidden: computed('isVisible', function (): 'true' | 'false' {\n        return this.get('isVisible') ? 'false' : 'true';\n    }),\n\n    /**\n     * @Attribute\n     */\n    name: undefined as Maybe<string>,\n\n    init() {\n        this._super(...arguments);\n        registerAppCarouselToolbar();\n        setLocale(this.get('intl').get('isoLocale'));\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"LMlXbPSs\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[10,\\\"app-carousel-toolbar\\\"],[15,3,[36,1]],[14,\\\"theme\\\",\\\"legacy\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],null]],[],false,[\\\"if\\\",\\\"name\\\"]]\",\"moduleName\":\"web-directory/components/app-carousel-toolbar/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { inject } from '@ember/service';\nimport { registerAppCarouselView, setLocale } from '@genesys/apps-v2-host-layout';\nimport type { Maybe } from 'web-directory/types';\n\nexport default Component.extend({\n    classNames: ['app-carousel-view'],\n    classNameBindings: ['name'],\n    attributeBindings: ['ariaHidden:aria-hidden'],\n\n    intl: inject('intl'),\n    session: inject('session'),\n\n    enableNewAppSizer: computed.reads('session.features.PURE-6790_enableNewAppSizer'),\n\n    ariaHidden: computed('isVisible', function (): 'true' | 'false' {\n        return this.get('isVisible') ? 'false' : 'true';\n    }),\n\n    /**\n     * @Attribute\n     */\n    name: undefined as Maybe<string>,\n\n    init() {\n        this._super(...arguments);\n        registerAppCarouselView();\n        setLocale(this.get('intl').get('isoLocale'));\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"d0lVhpe7\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[10,\\\"app-carousel-view\\\"],[15,3,[36,1]],[14,\\\"theme\\\",\\\"legacy\\\"],[15,\\\"app-sizer\\\",[52,[33,2],\\\"list\\\",\\\"kebab\\\"]],[12],[1,\\\"\\\\n        \\\"],[18,1,null],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"&default\\\"],false,[\\\"if\\\",\\\"name\\\",\\\"enableNewAppSizer\\\",\\\"yield\\\"]]\",\"moduleName\":\"web-directory/components/app-carousel-view/template.hbs\",\"isStrictMode\":false});","import { reads, bool } from '@ember/object/computed';\nimport { isArray } from '@ember/array';\nimport $ from 'jquery';\nimport { dasherize } from '@ember/string';\nimport { inject as service } from '@ember/service';\nimport Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { run } from '@ember/runloop';\nimport { typeOf, isBlank } from '@ember/utils';\nimport { parseMessage } from '../../models/app-api-call';\nimport appUtils from '../../utils/apps';\nimport _ from 'lodash';\n\nconst defaultInternalSandboxOptions = ['allow-same-origin'];\nconst API_USER_MESSAGE_PREFIX = 'PureCloud Apps API Error: ';\n\nconst AppEmbedComponent = Component.extend({\n    tagName: 'iframe',\n    classNameBindings: [':app-embed', 'appConfig.internal:internal-app:external-app', 'appMarkerClass'],\n    attributeBindings: [\n        'name',\n        'src',\n        'sandbox',\n        'ariaHiddenAttr:aria-hidden',\n        'hiddenAttr:hidden',\n        'permissionsPolicy:allow',\n        'viewId:data-app-id',\n        'title'\n    ],\n\n    intl: service(),\n\n    // Attributes\n    appConfig: null,\n    hidden: false,\n    onAppLoad: null,\n    onAppApiCall: null,\n\n    name: computed('appConfig.id', function () {\n        let appId = this.get('appConfig.id');\n        if (!appId) {\n            appId = 'unknown';\n        }\n\n        return dasherize(`app-${appId}`);\n    }),\n    src: reads('appConfig.url'),\n\n    sandbox: computed('appConfig.id', 'appConfig.sandbox', 'appConfig.internal', function () {\n        let finalSandboxOptions = [];\n        const appSandboxSettings = this.get('appConfig.sandbox');\n        if (appSandboxSettings && Array.isArray(appSandboxSettings)) {\n            finalSandboxOptions = appSandboxSettings;\n        }\n\n        if (this.get('appConfig.internal') === true) {\n            finalSandboxOptions = _.union(finalSandboxOptions, defaultInternalSandboxOptions);\n        }\n\n        return finalSandboxOptions.join(' ');\n    }),\n\n    ariaHiddenAttr: computed('hidden', function () {\n        return this.hidden ? 'true' : 'false';\n    }),\n\n    hiddenAttr: bool('hidden'),\n\n    /*\n     * Grant specific features to the src domain.  This attribute will be consulted by a subset of\n     * our supported browsers (e.g. Chrome, Safari) and ignored by the rest. If all of our supported\n     * browsers use this attribute in the future, we can deny by default and use an opt-in paradigm.\n     */\n    permissionsPolicy: computed('appConfig.permissionsPolicy', function () {\n        const configPolicy = this.get('appConfig.permissionsPolicy');\n        if (!configPolicy || !Array.isArray(configPolicy)) return '';\n        return configPolicy.join('; ');\n    }),\n\n    viewId: computed('appConfig.id', function () {\n        const appId = this.get('appConfig.id');\n        if (!appId) return;\n        return appUtils.buildViewId(appId);\n    }),\n\n    title: computed('appConfig.title', function () {\n        const intl = this.intl;\n        const appTitle = this.get('appConfig.title');\n        if (!appTitle) return intl.t('components.embeddedAppTitle');\n        return intl.t(appTitle).toString();\n    }),\n\n    appMarkerClass: computed('appConfig.id', function () {\n        let result = '';\n\n        let appId = this.get('appConfig.id');\n        if (appId) {\n            result = dasherize(`app-${appId}`);\n        }\n\n        return result;\n    }),\n\n    // Listener tracking vars\n    $lastFrame: null,\n    lastFrameSrc: null,\n    lastFrameLoaded: false,\n\n    willInsertElement() {\n        this._super(...arguments);\n\n        let $iframe = this.$();\n        if ($iframe && !isBlank($iframe.attr('src'))) {\n            this.$lastFrame = $iframe;\n            this.lastFrameSrc = $iframe.attr('src');\n            this._monitorFrameLoad(this.$lastFrame);\n        }\n    },\n\n    willRender() {\n        this._super(...arguments);\n\n        let $iframe = this.$();\n        if ($iframe !== this.$lastFrame || this.src !== this.lastFrameSrc) {\n            // New iframe or url\n            if (this.$lastFrame && !this.lastFrameLoaded) {\n                // remove previous listener\n                this.$lastFrame.off(`load.${this.elementId}`);\n            }\n\n            this.lastFrameLoaded = false;\n            if ($iframe && !isBlank(this.src)) {\n                this.$lastFrame = $iframe;\n                this.lastFrameSrc = this.src;\n\n                this._monitorFrameLoad(this.$lastFrame);\n            } else {\n                this.$lastFrame = null;\n                this.lastFrameSrc = null;\n            }\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        $(window).on(`message.${this.elementId} onmessage.${this.elementId}`, run.bind(this, '_handlePostMessage'));\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n\n        if (this.$lastFrame && !this.lastFrameLoaded) {\n            // remove previous listener\n            this.$lastFrame.off(`load.${this.elementId}`);\n        }\n\n        $(window).off(`message.${this.elementId} onmessage.${this.elementId}`);\n    },\n\n    _monitorFrameLoad($iframe) {\n        let onAppLoad = this.onAppLoad;\n        if (onAppLoad && typeof onAppLoad === 'function') {\n            // Not using jQuery.one as I want the ability to explicitly remove this\n            // listener in case it doesn't fire for some reason\n            $iframe.on(`load.${this.elementId}`, () => {\n                run(() => {\n                    this.lastFrameLoaded = true;\n                    $iframe.off(`load.${this.elementId}`);\n\n                    if (!this.isDestroyed) {\n                        onAppLoad();\n                    }\n                });\n            });\n        }\n    },\n\n    _handlePostMessage(evt) {\n        let appApiHandler = this.onAppApiCall;\n        let appUrl = this.get('appConfig.url');\n\n        // Base state check\n        if (\n            !appApiHandler ||\n            !appUrl ||\n            this.isDestroying ||\n            this.isDestoyed ||\n            !evt.originalEvent ||\n            !evt.originalEvent.source ||\n            !evt.originalEvent.origin ||\n            evt.originalEvent.origin.trim().length === 0\n        ) {\n            // Fail fast - Invalid/Noop state or invalid postMessage event\n            return;\n        }\n\n        // Validate this postMessage is from our app's frame\n        let $iframe = this.$();\n        let iframeWindow = null;\n        try {\n            iframeWindow = $iframe.length === 1 ? $iframe[0].contentWindow : null;\n        } catch (e) {\n            console.error(\n                appUtils.buildApiLogMsg('Error occurred obtaining iframe window for app message source validation'),\n                e\n            );\n            iframeWindow = null;\n        }\n\n        if (!iframeWindow || evt.originalEvent.source !== iframeWindow) {\n            return;\n        }\n\n        // Validate message sender is still the app\n        /* eslint-disable no-console */\n        let evtOrigin = evt.originalEvent.origin;\n        if (evtOrigin === 'null') {\n            let sandboxPermissions = this.get('appConfig.sandbox');\n            let hasSameOrigin =\n                sandboxPermissions &&\n                isArray(sandboxPermissions) &&\n                sandboxPermissions.indexOf('allow-same-origin') >= 0;\n            let messagePrefix = `${API_USER_MESSAGE_PREFIX}API Message origin could not be determined.  `;\n            if (hasSameOrigin) {\n                console.warn(\n                    appUtils.buildApiLogMsg(\n                        \"App posted message with origin reported as 'null' but has 'allow-same-origin' sandbox flag.\"\n                    ),\n                    {\n                        appUrl,\n                        remoteData: {\n                            appId: this.get('appConfig.id')\n                        }\n                    }\n                );\n                console.error(\n                    `${messagePrefix}Please notify the PureCloud dev team at https://developer.mypurecloud.com`\n                );\n            } else {\n                console.error(`${messagePrefix}Ensure your app has the 'allow-same-origin' permission enabled.`);\n            }\n            return;\n        }\n        try {\n            if (!this._validateMessageOrigin(evtOrigin, appUrl)) {\n                console.error(appUtils.buildApiLogMsg('App posted message from invalid origin.'), {\n                    appUrl,\n                    origin: evtOrigin,\n                    expectedOrigin: appUrl,\n                    remoteData: {\n                        appId: this.get('appConfig.id')\n                    }\n                });\n                console.error(\n                    `${API_USER_MESSAGE_PREFIX}For security reasons, you can only submit an API call from the registered app's domain.`\n                );\n                return;\n            }\n        } catch (e) {\n            console.error(\n                appUtils.buildApiLogMsg('Error occurred when validating apps message origin.'),\n                {\n                    appUrl,\n                    origin: evtOrigin,\n                    expectedOrigin: appUrl,\n                    remoteData: {\n                        appId: this.get('appConfig.id')\n                    }\n                },\n                e\n            );\n            return;\n        }\n\n        let apiCall = null;\n        let failureReason = null;\n\n        try {\n            // Strict parse\n            apiCall = parseMessage(evt.originalEvent.data, true);\n        } catch (parseError) {\n            // TECHDEBT: Remove lenient retry after deprecation period\n            if (parseError.message === 'missingProtocol') {\n                try {\n                    // Re-parse leniently to allow for short deprecation period and logging\n                    apiCall = parseMessage(evt.originalEvent.data, false);\n\n                    console.warn(appUtils.buildApiLogMsg('App posted message without protocol information'), {\n                        appUrl,\n                        remoteData: {\n                            appId: this.get('appConfig.id')\n                        }\n                    });\n                    console.warn(\n                        API_USER_MESSAGE_PREFIX,\n                        'Deprecation Warning.  Protocol information will soon be required for all app api calls.',\n                        `We recommend using the official Client Apps SDK (${appUtils.SDK_REPO_URL}).`\n                    );\n                } catch (lenientParseFailure) {\n                    failureReason = lenientParseFailure;\n                }\n            } else {\n                failureReason = parseError;\n            }\n        }\n        /* eslint-enable no-console */\n\n        if (apiCall) {\n            if (!this.appsSdkEnabled) {\n                let msg = 'Client App SDK is disabled. Incoming API calls will be ignored.';\n                console.warn(appUtils.buildApiLogMsg(msg), {\n                    appUrl,\n                    remoteData: {\n                        appId: this.get('appConfig.id')\n                    }\n                });\n                return;\n            }\n\n            apiCall.set('internalPcCall', false);\n            apiCall.set('srcApp', this.appConfig);\n            appApiHandler(apiCall);\n        } else {\n            console.warn(appUtils.buildApiLogMsg('App posted invalid message'), {\n                appUrl,\n                failureReason,\n                remoteData: {\n                    appId: this.get('appConfig.id')\n                }\n            });\n        }\n    },\n\n    /**\n     * Validates if origin is the base url of expected.\n     *\n     * URLs will be normalized (e.g. default ports and paths) for the comparison as\n     * the browser may drop defaults or make other slight mods to the origin from\n     * the explicit URL.  Because of the need to parse the URLs, urls must explicitly\n     * include the protocol or the check will fail fast.\n     *\n     * @returns true if origin is the base url of expected; false otherwise.\n     */\n    _validateMessageOrigin(origin, expected) {\n        try {\n            return _.startsWith(this._normalizeUrl(expected), this._normalizeUrl(origin));\n        } catch (e) {\n            return false;\n        }\n    },\n\n    _normalizeUrl(url) {\n        if (!url || typeOf(url) !== 'string' || !url.match(/^https?:\\/\\/[^\\s\\/\\:\\?#]+/)) {\n            throw new Error('invalidUrl');\n        }\n\n        let parser = document.createElement('a');\n        parser.href = url;\n\n        if (!parser.hostname) {\n            throw new Error('invalidUrl');\n        }\n\n        let result = `${parser.protocol}//${parser.hostname}`;\n        let normalizedPort = parser.port;\n        if (!normalizedPort) {\n            switch (parser.protocol) {\n                case 'http:':\n                    normalizedPort = '80';\n                    break;\n                case 'https:':\n                    normalizedPort = '443';\n                    break;\n                default:\n                    break;\n            }\n        }\n\n        if (normalizedPort) {\n            result += `:${normalizedPort}`;\n        }\n\n        result += parser.pathname + parser.search + parser.hash;\n        return result;\n    }\n});\n\nexport default AppEmbedComponent;\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"sNI9QChf\",\"block\":\"[[[10,2],[12],[1,[28,[35,0],[\\\"common.noIframes\\\"],null]],[13]],[],false,[\\\"t\\\"]]\",\"moduleName\":\"web-directory/components/app-embed/template.hbs\",\"isStrictMode\":false});","import { equal } from '@ember/object/computed';\n\nimport { isArray } from '@ember/array';\nimport { assert } from '@ember/debug';\nimport Component from '@ember/component';\nimport { get, computed } from '@ember/object';\nimport _ from 'lodash';\n\nconst DEFAULT_IMG_TYPE = 'icon';\n\n// Possible Future Types: smallIcon (16x16), notificationIcon, launcherIcon, splashIcon (512x512)\nconst IMG_TYPE_CFG_MAP = {\n    icon: {\n        width: 24,\n        height: 24,\n        assetBasePath: 'assets.icon',\n        // The max allowable multiplier delta that is acceptable for a flexible image size\n        // Formally: delta <= closestSizeMaxMultiplierDelta where delta = Math.abs(1 - imgMultiplier)\n        // e.g. x12 - x36 when img size is 24\n        closestSizeMaxMultiplierDelta: 1,\n        minSupplimentalRes: 1.5,\n        maxSupplimentalRes: 3\n    },\n    tile: {\n        width: 128,\n        height: 128,\n        assetBasePath: 'assets.icon',\n        // The max allowable multiplier delta that is acceptable for a flexible image size\n        // Formally: delta <= closestSizeMaxMultiplierDelta where delta = Math.abs(1 - imgMultiplier)\n        // e.g. x12 - x36 when img size is 24\n        closestSizeMaxMultiplierDelta: 1,\n        minSupplimentalRes: 1.5,\n        maxSupplimentalRes: 3\n    }\n};\n\nconst VECTOR_IMG_PROP_NAME = 'vector';\nconst RASTER_IMGS_PROP_NAME = 'raster';\nconst RASTER_IMG_KEY_REG_EXP = /^x(\\d+)$/i;\nconst CLASS_NAMES_PROP_NAME = 'classNames';\nconst SVG_PATH_PROP_NAME = 'svgSpriteHref';\nconst GUX_ICON_PROPS_PATH = 'guxIcon';\n\nconst NO_TITLE_MODE = 'none';\nconst NATIVE_TITLE_MODE = 'native';\nconst TOOLTIP_TITLE_MODE = 'tooltip';\nconst DEFAULT_TITLE_MODE = TOOLTIP_TITLE_MODE;\nconst TITLE_MODES = [NO_TITLE_MODE, NATIVE_TITLE_MODE, TOOLTIP_TITLE_MODE];\n\n/**\n * Generates the image markup for the specified app that is best suited\n * for the specified imgType.  imgType dictates the target environment for\n * the image display while the app's assets contain the dictionary of\n * image categories (icon, launcher, splash, etc.) and sizes (x16, x24, x512, etc.)\n *\n * In general, this algorithm is:\n * <ul>\n *   <li>Utilize the app assets appropriate for the imgType<li>\n *   <li>Use vector (svg) if in config and supported by browser</li>\n *   <li>Use exact or closest (within threshold) sized raster img for src</li>\n *   <li>\n *      Add any supplimental urls (with multiplier > 1 and within threshold)\n *      to srcset attribute if supported by browser\n *   <li>\n *   <li>If no applicable image can be found, use classNames</li>\n *   <li>If no classNames are configured, use the no-img placeholder</li>\n * </ul>\n */\nexport default Component.extend({\n    tagName: 'div',\n    classNames: ['app-img'],\n    classNameBindings: ['imgType'],\n    attributeBindings: ['title'],\n\n    app: null,\n\n    titleMode: computed({\n        get: () => DEFAULT_TITLE_MODE,\n        set(key, value) {\n            if (TITLE_MODES.indexOf(value) < 0) {\n                assert(`app-img Invalid titleMode: ${value}`);\n            }\n\n            return value;\n        }\n    }),\n\n    showTooltip: equal('titleMode', TOOLTIP_TITLE_MODE),\n\n    title: computed('titleMode', 'app.name', function () {\n        let result = '';\n\n        const appName = this.get('app.name');\n        const titleMode = this.titleMode;\n\n        if (appName && appName.trim().length > 0 && titleMode === NATIVE_TITLE_MODE) {\n            result = appName;\n        }\n\n        return result;\n    }),\n\n    imgType: computed({\n        get: () => DEFAULT_IMG_TYPE,\n        set(key, value) {\n            if (Object.prototype.hasOwnProperty.call(IMG_TYPE_CFG_MAP, value)) {\n                return value;\n            } else {\n                assert(`Invalid app-img type ${value}`);\n            }\n        }\n    }),\n\n    imgWidth: computed('app', 'imgType', function () {\n        return IMG_TYPE_CFG_MAP[this.imgType].width;\n    }),\n\n    imgHeight: computed('app', 'imgType', function () {\n        return IMG_TYPE_CFG_MAP[this.imgType].height;\n    }),\n\n    _sortedRasterMultipliers: computed('app', 'imgType', function () {\n        let result = [];\n\n        let cfg = IMG_TYPE_CFG_MAP[this.imgType];\n        let allRasterImgs = get(this, `app.${cfg.assetBasePath}.${RASTER_IMGS_PROP_NAME}`);\n\n        if (allRasterImgs && typeof allRasterImgs === 'object') {\n            _.forEach(allRasterImgs, (rasterUrl, rasterKey) => {\n                let rasterMatch = RASTER_IMG_KEY_REG_EXP.exec(rasterKey);\n                if (rasterMatch) {\n                    let currRasterWidth = parseInt(rasterMatch[1], 10);\n                    if (currRasterWidth && currRasterWidth > 0) {\n                        let currRasterMultiplier = currRasterWidth / cfg.width;\n\n                        result.push({\n                            url: rasterUrl,\n                            multiplier: currRasterMultiplier\n                        });\n                    }\n                }\n            });\n        }\n\n        return result.sort((a, b) => a.multiplier - b.multiplier);\n    }),\n\n    /**\n     * Returns the vectorImgUrl if one exists in the app config\n     */\n    _vectorImgUrl: computed('app', 'imgType', function () {\n        let result = null;\n\n        let app = this.app;\n        let cfg = IMG_TYPE_CFG_MAP[this.imgType];\n        if (app) {\n            result = get(app, `${cfg.assetBasePath}.${VECTOR_IMG_PROP_NAME}`) || null;\n        }\n\n        return result;\n    }),\n\n    defaultImgUrl: computed('imgType', '_vectorImgUrl', '_sortedRasterMultipliers', function () {\n        let vectorImgUrl = this._vectorImgUrl;\n        if (vectorImgUrl) {\n            return vectorImgUrl;\n        }\n\n        let result = null;\n        let cfg = IMG_TYPE_CFG_MAP[this.imgType];\n\n        let allRasters = this._sortedRasterMultipliers;\n        if (allRasters.length > 0) {\n            let lowestDelta = null;\n\n            for (let index = 0; index < allRasters.length; index++) {\n                let curr = allRasters[index];\n                let currDelta = Math.abs(1 - curr.multiplier);\n\n                if (lowestDelta === null || currDelta < lowestDelta) {\n                    lowestDelta = currDelta;\n                    result = curr.url;\n                }\n            }\n\n            // Ensure the best size default img is within the threshold\n            if (cfg.closestSizeMaxMultiplierDelta && lowestDelta > cfg.closestSizeMaxMultiplierDelta) {\n                result = null;\n            }\n        }\n\n        return result;\n    }),\n\n    imgSrcSet: computed('imgType', '_vectorImgUrl', 'defaultImgUrl', '_sortedRasterMultipliers', function () {\n        let result = '';\n\n        let vectorImgUrl = this._vectorImgUrl;\n        let defaultImgUrl = this.defaultImgUrl;\n        let cfg = IMG_TYPE_CFG_MAP[this.imgType];\n        let allRasters = this._sortedRasterMultipliers;\n\n        if (!vectorImgUrl && defaultImgUrl && allRasters.length > 0) {\n            let supImgs = [];\n\n            allRasters.forEach(({ url, multiplier }) => {\n                if (\n                    url !== defaultImgUrl &&\n                    multiplier > 1 &&\n                    (!cfg.minSupplimentalRes || multiplier >= cfg.minSupplimentalRes) &&\n                    (!cfg.maxSupplimentalRes || multiplier <= cfg.maxSupplimentalRes)\n                ) {\n                    supImgs.push({\n                        url,\n                        multiplier\n                    });\n                }\n            });\n\n            if (supImgs.length > 0) {\n                // Sort the images by descending multiplier so the best one is choosen\n                supImgs.reverse();\n                result = supImgs.map(curr => `${curr.url} ${curr.multiplier}x`).join(',');\n            }\n        }\n\n        return result;\n    }),\n\n    svgSpriteHref: computed('app', 'imgType', function () {\n        let result = null;\n\n        let app = this.app;\n        if (app) {\n            let cfg = IMG_TYPE_CFG_MAP[this.imgType];\n            let svgPropPath = `${cfg.assetBasePath}.${SVG_PATH_PROP_NAME}`;\n\n            let svgSpriteHref = app.get(svgPropPath);\n            if (svgSpriteHref) {\n                result = svgSpriteHref;\n            }\n        }\n\n        return result;\n    }),\n\n    imgClasses: computed('app', 'imgType', function () {\n        let result = null;\n\n        let app = this.app;\n        if (app) {\n            let cfg = IMG_TYPE_CFG_MAP[this.imgType];\n            let classesPath = `${cfg.assetBasePath}.${CLASS_NAMES_PROP_NAME}`;\n\n            let classNames = app.get(classesPath);\n            if (classNames && isArray(classNames)) {\n                result = classNames.join(' ');\n            }\n        }\n\n        return result;\n    }),\n\n    guxIcon: computed('app', 'imgType', function () {\n        let result = null;\n\n        let app = this.app;\n        if (app) {\n            let cfg = IMG_TYPE_CFG_MAP[this.imgType];\n            let guxIconPropsPath = `${cfg.assetBasePath}.${GUX_ICON_PROPS_PATH}`;\n\n            let guxIconProps = app.get(guxIconPropsPath);\n            if (\n                guxIconProps &&\n                Object.prototype.hasOwnProperty.call(guxIconProps, 'name') &&\n                guxIconProps.hasOwnProperty('decorative')\n            ) {\n                result = guxIconProps;\n            }\n        }\n\n        return result;\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"5i9XmvZd\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[10,\\\"img\\\"],[15,1,[29,[[36,2],\\\"-app-img\\\"]]],[15,\\\"src\\\",[29,[[36,1]]]],[15,\\\"srcset\\\",[29,[[36,3]]]],[15,\\\"alt\\\",[29,[[33,4,[\\\"name\\\"]]]]],[15,\\\"aria-label\\\",[29,[[33,4,[\\\"name\\\"]]]]],[15,\\\"width\\\",[29,[[36,5]]]],[15,\\\"height\\\",[29,[[36,6]]]],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,7],[[[1,\\\"    \\\"],[10,\\\"i\\\"],[15,1,[29,[[36,2],\\\"-app-img\\\"]]],[15,0,[29,[[36,7]]]],[15,\\\"aria-label\\\",[29,[[33,4,[\\\"name\\\"]]]]],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,8],[[[1,\\\"    \\\"],[10,\\\"svg\\\"],[15,1,[29,[[36,2],\\\"-app-img\\\"]]],[14,0,\\\"svg-icon\\\"],[15,\\\"aria-label\\\",[29,[[33,4,[\\\"name\\\"]]]]],[12],[1,\\\"\\\\n        \\\"],[10,\\\"use\\\"],[15,6,[36,8]],[12],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,9],[[[1,\\\"    \\\"],[10,\\\"gux-icon\\\"],[15,1,[29,[[36,2],\\\"-app-img\\\"]]],[15,\\\"icon-name\\\",[33,9,[\\\"name\\\"]]],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"    \\\"],[10,\\\"gux-icon\\\"],[15,1,[29,[[36,2],\\\"-app-img\\\"]]],[14,\\\"icon-name\\\",\\\"legacy/cube\\\"],[15,\\\"screenreader-text\\\",[33,4,[\\\"name\\\"]]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]],[]]]],[]]]],[]]],[41,[28,[37,10],[[33,11],[33,4,[\\\"name\\\"]]],null],[[[1,\\\"    \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,2],\\\"-app-img\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[33,4,[\\\"name\\\"]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[],false,[\\\"if\\\",\\\"defaultImgUrl\\\",\\\"elementId\\\",\\\"imgSrcSet\\\",\\\"app\\\",\\\"imgWidth\\\",\\\"imgHeight\\\",\\\"imgClasses\\\",\\\"svgSpriteHref\\\",\\\"guxIcon\\\",\\\"and\\\",\\\"showTooltip\\\"]]\",\"moduleName\":\"web-directory/components/app-img/template.hbs\",\"isStrictMode\":false});","import { dasherize } from '@ember/string';\nimport Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { run } from '@ember/runloop';\nimport { APP_STATES, APP_PROBLEMS, LIFECYCLE_HOOK_EVENT } from '../../models/app-instance';\nimport { buildOutboundMsgPayload } from '../../models/app-api-call';\nimport appUtils from '../../utils/apps';\n\nexport default Component.extend({\n    classNames: ['app-instance'],\n    classNameBindings: ['appMarkerClass', 'appInstanceMarkerClass'],\n    attributeBindings: ['ariaHiddenAttr:aria-hidden', 'hiddenAttr:hidden'],\n\n    // Public Attributes\n    instance: null,\n    hidden: false,\n\n    // Private Variables\n    _targetAppIframe: null,\n    _targetAppWindow: null,\n    _targetAppOrigin: null,\n    _prevInstance: null,\n\n    appMarkerClass: computed('instance.appId', function () {\n        let result = '';\n\n        let appId = this.get('instance.appId');\n        if (appId) {\n            result = dasherize(`app-${appId}`);\n        }\n\n        return result;\n    }),\n\n    appInstanceMarkerClass: computed('instance.instanceId', function () {\n        let result = '';\n\n        let appInstanceId = this.get('instance.instanceId');\n        if (appInstanceId) {\n            result = dasherize(`app-instance-${appInstanceId}`);\n        }\n\n        return result;\n    }),\n\n    ariaHiddenAttr: computed('hidden', function () {\n        return this.hidden ? 'true' : 'false';\n    }),\n\n    hiddenAttr: computed('hidden', function () {\n        return this.hidden ? true : null;\n    }),\n\n    appEmbedName: computed('appInstanceMarkerClass', 'appMarkerClass', function () {\n        return this.appInstanceMarkerClass || this.appMarkerClass || 'app-instance-unknown';\n    }),\n\n    actions: {\n        onAppLoad() {\n            this.instance.loaded();\n        },\n\n        onAppApiCall(apiCall) {\n            let handler = this.onAppInstanceApiCall;\n            if (handler && typeof handler === 'function') {\n                apiCall.set('srcAppInstance', this.instance);\n                handler(apiCall);\n            }\n        },\n\n        reloadUpdatedApp() {\n            let reloadFn = this.reloadUpdatedApp;\n            if (reloadFn) {\n                reloadFn(this.instance);\n            }\n        },\n\n        closeDeletedApp() {\n            let closeFn = this.closeDeletedApp;\n            if (closeFn) {\n                closeFn(this.instance);\n            }\n        }\n    },\n\n    instanceStarting: computed('instance.currState', function () {\n        let currState = this.get('instance.currState');\n        return APP_STATES.RUNNING.compareTo(currState) > 0;\n    }),\n\n    licenseUnavailable: computed('instance.problem.name', function () {\n        return this.get('instance.problem.name') === APP_PROBLEMS.LICENSE_UNAVAILABLE;\n    }),\n\n    instanceUpdated: computed('instance.problem.name', function () {\n        return this.get('instance.problem.name') === APP_PROBLEMS.APP_UPDATED;\n    }),\n\n    instanceDeleted: computed('instance.problem.name', function () {\n        return this.get('instance.problem.name') === APP_PROBLEMS.APP_DELETED;\n    }),\n\n    exclusiveAppProblem: computed('instance.problem.name', function () {\n        return this.get('instance.problem.name') === APP_PROBLEMS.LICENSE_UNAVAILABLE;\n    }),\n\n    appVisible: computed('hidden', 'instance', 'instance.currState', 'exclusiveAppProblem', function () {\n        let result = false;\n\n        let instance = this.instance;\n        if (!this.hidden && instance) {\n            result = instance.get('currState') === APP_STATES.RUNNING && !this.exclusiveAppProblem;\n        }\n\n        return result;\n    }),\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n        let prevAppInstance = this._prevInstance;\n        let currAppInstance = this.instance;\n\n        if (currAppInstance !== prevAppInstance) {\n            this._unsubscribe(prevAppInstance);\n            this.setProperties({\n                _targetAppIframe: null,\n                _targetAppWindow: null,\n                _targetAppOrigin: null\n            });\n\n            this._subscribe(currAppInstance);\n            this.set('_prevInstance', currAppInstance);\n        }\n    },\n\n    willRender() {\n        this._super(...arguments);\n\n        let $iFrame = this.$('iframe');\n        if (!$iFrame || $iFrame.length !== 1) {\n            this.setProperties({\n                _targetAppIframe: null,\n                _targetAppWindow: null,\n                _targetAppOrigin: null\n            });\n        } else if ($iFrame[0] !== this._targetAppIframe) {\n            this._targetAppIframe = $iFrame[0] || null;\n            this._targetAppWindow = $iFrame[0].contentWindow || null;\n\n            this._targetAppOrigin = null;\n            if (this._targetAppIframe && this._targetAppIframe.src && document && document.createElement) {\n                try {\n                    let parser = document.createElement('a');\n                    parser.href = this._targetAppIframe.src;\n\n                    let port = parser.port && parser.port.trim().length > 0 ? `:${parser.port}` : '';\n                    this._targetAppOrigin = `${parser.protocol}//${parser.hostname}${port}`;\n                } catch (e) {\n                    // ignored; origin already set to null\n                }\n            }\n        }\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n\n        this._unsubscribe(this.instance);\n    },\n\n    _subscribe(appInstance) {\n        if (appInstance != null) {\n            appInstance.on(LIFECYCLE_HOOK_EVENT, this, this._onLifecycleHook);\n        }\n    },\n\n    _unsubscribe(appInstance) {\n        if (appInstance != null) {\n            appInstance.off(LIFECYCLE_HOOK_EVENT, this, this._onLifecycleHook);\n        }\n    },\n\n    _onLifecycleHook(payload) {\n        run.schedule('afterRender', this, '_sendAppNotification', payload.hook);\n    },\n\n    _sendAppNotification(hook) {\n        if (\n            this.isDestroying ||\n            this.isDestroyed ||\n            this._targetAppWindow === null ||\n            this._targetAppOrigin === null ||\n            this.get('appInstance.currState') <= APP_STATES.LOADING\n        ) {\n            return;\n        }\n\n        if (!this.appsSdkEnabled) {\n            let msg = 'Client App SDK is disabled. Lifecycle hook events will not be triggered.';\n            console.warn(appUtils.buildApiLogMsg(msg), {\n                appUrl: this.get('instance.app.url'),\n                remoteData: {\n                    appId: this.get('instance.appId')\n                }\n            });\n            return;\n        }\n\n        this._targetAppWindow.postMessage(buildOutboundMsgPayload('appLifecycleHook', { hook }), this._targetAppOrigin);\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"JxNrYSSQ\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"exclusive-app-status\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,2],null,[[\\\"app\\\",\\\"imgType\\\",\\\"titleMode\\\",\\\"class\\\"],[[33,3,[\\\"app\\\"]],\\\"tile\\\",\\\"tooltip\\\",\\\"loading\\\"]]]],[1,\\\"\\\\n\\\\n        \\\"],[10,1],[14,0,\\\"description\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,4],[\\\"apps.appInstance.loading\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,5],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"exclusive-app-status\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,2],null,[[\\\"app\\\",\\\"imgType\\\",\\\"titleMode\\\",\\\"class\\\"],[[33,3,[\\\"app\\\"]],\\\"tile\\\",\\\"tooltip\\\",\\\"disabled\\\"]]]],[1,\\\"\\\\n\\\\n        \\\"],[10,1],[14,0,\\\"description\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,4],[\\\"apps.appInstance.licenseUnavailable.description\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,6],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"app-banner app-updated\\\"],[12],[1,\\\"\\\\n        \\\"],[10,1],[14,0,\\\"description\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,4],[\\\"apps.appInstance.appUpdated.description\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[11,\\\"button\\\"],[24,4,\\\"button\\\"],[4,[38,7],[[30,0],\\\"reloadUpdatedApp\\\"],null],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,4],[\\\"apps.appInstance.appUpdated.update\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,8],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"app-banner app-deleted\\\"],[12],[1,\\\"\\\\n\\\\n        \\\"],[10,1],[14,0,\\\"description\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,4],[\\\"apps.appInstance.appDeleted.description\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[11,\\\"button\\\"],[24,4,\\\"button\\\"],[4,[38,7],[[30,0],\\\"closeDeletedApp\\\"],null],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,4],[\\\"apps.appInstance.appDeleted.close\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]]],[]]]],[]]],[1,\\\"\\\\n\\\"],[1,[28,[35,9],null,[[\\\"appConfig\\\",\\\"name\\\",\\\"hidden\\\",\\\"class\\\",\\\"onAppLoad\\\",\\\"onAppApiCall\\\",\\\"appsSdkEnabled\\\"],[[33,3,[\\\"app\\\"]],[33,10],[28,[37,11],[[33,12]],null],[52,[33,12],\\\"visible\\\"],[28,[37,7],[[30,0],\\\"onAppLoad\\\"],null],[28,[37,7],[[30,0],\\\"onAppApiCall\\\"],null],[33,13]]]]]],[],false,[\\\"if\\\",\\\"instanceStarting\\\",\\\"app-img\\\",\\\"instance\\\",\\\"t\\\",\\\"licenseUnavailable\\\",\\\"instanceUpdated\\\",\\\"action\\\",\\\"instanceDeleted\\\",\\\"app-embed\\\",\\\"appEmbedName\\\",\\\"not\\\",\\\"appVisible\\\",\\\"appsSdkEnabled\\\"]]\",\"moduleName\":\"web-directory/components/app-instance/template.hbs\",\"isStrictMode\":false});","import { equal, or } from '@ember/object/computed';\nimport { dasherize } from '@ember/string';\nimport Component from '@ember/component';\nimport { computed, get } from '@ember/object';\nimport { POOL_STATES } from '../../models/app-pool';\n\n/*\n    Renders the app-pool which consists of the app instances and exclusive app\n    pool states (e.g. app loading failure, Unknown app, pool allocation status).\n    This component must always render the instances indicated by the app-pool model\n    regardless of state.  The app-pool manages app lifecycle internally and may be\n    bringing the app into or taking the app out of service.\n*/\nexport default Component.extend({\n    classNames: ['app-pool'],\n    classNameBindings: ['poolStateClassName'],\n\n    // attrs\n    appPool: null,\n\n    poolStateClassName: computed('appPool.currState', function () {\n        let result = '';\n\n        let currState = this.get('appPool.currState');\n\n        if (currState && currState.name) {\n            result = `pool-state-${dasherize(currState.name)}`;\n        }\n\n        return result;\n    }),\n\n    inAutoLoadRetry: computed('appPool.currState.{name,details}', function () {\n        return (\n            (this.get('appPool.currState.name') === POOL_STATES.LOAD_FAILED &&\n                this.get('appPool.currState.details.loadRetryScheduled') === true) ||\n            (this.get('appPool.currState.name') === POOL_STATES.LOADING &&\n                this.get('appPool.currState.details.loadRetryAttempt') === true &&\n                this.get('appPool.currState.details.autoAttempt') === true)\n        );\n    }),\n\n    loadFailed: equal('appPool.currState.name', POOL_STATES.LOAD_FAILED),\n\n    appNotFound: equal('appPool.currState.name', POOL_STATES.APP_NOT_FOUND),\n\n    allocatingApp: computed('appPool.currState', function () {\n        let result = null;\n\n        let currState = this.get('appPool.currState');\n\n        if (currState && typeof currState === 'object' && currState.name === POOL_STATES.ALLOCATING_SPACE) {\n            result = get(currState, 'details.instance.app');\n        }\n\n        return result;\n    }),\n\n    allocationFailureApp: computed('appPool.currState', function () {\n        let result = null;\n\n        let currState = this.get('appPool.currState');\n\n        if (currState && typeof currState === 'object' && currState.name === POOL_STATES.ALLOCATION_FAILED) {\n            result = get(currState, 'details.app');\n        }\n\n        return result;\n    }),\n\n    showPoolState: or('inAutoLoadRetry', 'loadFailed', 'appNotFound', 'allocatingApp', 'allocationFailureApp'),\n\n    visibleInstanceId: computed('appPool.currState', function () {\n        let result = null;\n\n        let currState = this.get('appPool.currState');\n\n        if (currState && typeof currState === 'object' && currState.name === POOL_STATES.SHOWING_APP) {\n            result = get(currState, 'details.instance.instanceId');\n        }\n\n        return result;\n    }),\n\n    actions: {\n        reloadApps() {\n            this.appPool.reloadApps();\n        },\n\n        onAppInstanceApiCall() {\n            let handler = this.onAppInstanceApiCall;\n            if (handler && typeof handler === 'function') {\n                handler(...arguments);\n            }\n        },\n\n        reloadUpdatedApp(instance) {\n            let appPool = this.appPool;\n            let instanceIdToReload = instance.get('instanceId');\n\n            return appPool\n                .hideApp(instanceIdToReload)\n                .then(() => appPool.stopApp(instanceIdToReload))\n                .then(() => appPool.reloadApps())\n                .then(() => appPool.showApp(instance.get('appId')));\n        },\n\n        closeDeletedApp(instance) {\n            let appPool = this.appPool;\n            let instanceIdToStop = instance.get('instanceId');\n\n            return appPool\n                .hideApp(instanceIdToStop)\n                .then(() => appPool.stopApp(instanceIdToStop))\n                .then(() => appPool.reloadApps())\n                .then(() => {\n                    let handler = this.onDeletedAppClose;\n                    if (handler) {\n                        handler(instance);\n                    }\n                });\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"/PDI9zGS\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"pool-state\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,2],[[[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[15,\\\"aria-labeled-by\\\",[29,[[36,3],\\\"-load-retry-status\\\"]]],[12],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,1],[15,1,[29,[[36,3],\\\"-load-retry-status\\\"]]],[14,0,\\\"status\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,4],[\\\"apps.appPool.loadRetryScheduled.header\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,1],[14,0,\\\"details\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,4],[\\\"apps.appPool.loadRetryScheduled.indeterminateRetryLabel\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,5],[[[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"svg-icon icon-apps-alpha\\\"],[14,\\\"icon-name\\\",\\\"toolbar-apps\\\"],[15,\\\"screenreader-text\\\",[28,[37,4],[\\\"apps.appPool.loadFailed\\\"],null]],[12],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,1],[14,0,\\\"status\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,4],[\\\"apps.appPool.loadFailed\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[11,\\\"button\\\"],[24,0,\\\"reloadApps\\\"],[24,4,\\\"button\\\"],[4,[38,6],[[30,0],\\\"reloadApps\\\"],null],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,4],[\\\"apps.appPool.retryAppLoad.label\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,7],[[[1,\\\"            \\\"],[1,[28,[35,8],null,[[\\\"app\\\",\\\"imgType\\\",\\\"title\\\",\\\"aria-labeled-by\\\",\\\"class\\\"],[null,\\\"tile\\\",[28,[37,4],[\\\"apps.appPool.notFound\\\"],null],\\\"{{elementId}}-app-not-found-status\\\",\\\"disabled\\\"]]]],[1,\\\"\\\\n\\\\n            \\\"],[10,1],[15,1,[29,[[36,3],\\\"-app-not-found-status\\\"]]],[14,0,\\\"status\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,4],[\\\"apps.appPool.notFound\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,9],[[[1,\\\"            \\\"],[1,[28,[35,8],null,[[\\\"app\\\",\\\"imgType\\\",\\\"class\\\"],[[33,9],\\\"tile\\\",\\\"loading\\\"]]]],[1,\\\"\\\\n\\\\n            \\\"],[10,1],[14,0,\\\"status\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,4],[\\\"apps.appPool.allocatingSpace\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,10],[[[1,\\\"            \\\"],[1,[28,[35,8],null,[[\\\"app\\\",\\\"imgType\\\",\\\"class\\\"],[[33,10],\\\"tile\\\",\\\"disabled\\\"]]]],[1,\\\"\\\\n\\\\n            \\\"],[10,1],[14,0,\\\"status\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,4],[\\\"apps.appPool.allocationFailed.title\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"]],[]],null]],[]]]],[]]]],[]]]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[42,[28,[37,12],[[28,[37,12],[[33,13,[\\\"renderedAppInstances\\\"]]],null]],null],\\\"instanceId\\\",[[[1,\\\"    \\\"],[1,[28,[35,14],null,[[\\\"instance\\\",\\\"onAppInstanceApiCall\\\",\\\"reloadUpdatedApp\\\",\\\"closeDeletedApp\\\",\\\"class\\\",\\\"hidden\\\",\\\"appsSdkEnabled\\\"],[[30,1],[28,[37,6],[[30,0],\\\"onAppInstanceApiCall\\\"],null],[28,[37,6],[[30,0],\\\"reloadUpdatedApp\\\"],null],[28,[37,6],[[30,0],\\\"closeDeletedApp\\\"],null],[28,[37,15],[\\\"rendered-app\\\",[52,[28,[37,16],[[30,1,[\\\"instanceId\\\"]],[33,17]],null],\\\" visible\\\"]],null],[28,[37,18],[[28,[37,16],[[30,1,[\\\"instanceId\\\"]],[33,17]],null]],null],[33,19]]]]],[1,\\\"\\\\n\\\"]],[1]],null]],[\\\"renderedAppInstance\\\"],false,[\\\"if\\\",\\\"showPoolState\\\",\\\"inAutoLoadRetry\\\",\\\"elementId\\\",\\\"t\\\",\\\"loadFailed\\\",\\\"action\\\",\\\"appNotFound\\\",\\\"app-img\\\",\\\"allocatingApp\\\",\\\"allocationFailureApp\\\",\\\"each\\\",\\\"-track-array\\\",\\\"appPool\\\",\\\"app-instance\\\",\\\"concat\\\",\\\"eq\\\",\\\"visibleInstanceId\\\",\\\"not\\\",\\\"appsSdkEnabled\\\"]]\",\"moduleName\":\"web-directory/components/app-pool/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { inject } from '@ember/service';\nimport { registerAppViewStack, setLocale } from '@genesys/apps-v2-host-layout';\nimport type { Maybe } from 'web-directory/types';\n\nexport default Component.extend({\n    classNames: ['app-view-stack'],\n    classNameBindings: ['name'],\n    attributeBindings: ['ariaHidden:aria-hidden'],\n\n    intl: inject('intl'),\n\n    ariaHidden: computed('isVisible', function (): 'true' | 'false' {\n        return this.get('isVisible') ? 'false' : 'true';\n    }),\n\n    /**\n     * @Attribute\n     */\n    name: undefined as Maybe<string>,\n\n    init() {\n        this._super(...arguments);\n        registerAppViewStack();\n        setLocale(this.get('intl').get('isoLocale'));\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"Joa50JfX\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[10,\\\"app-view-stack\\\"],[15,3,[36,1]],[14,\\\"theme\\\",\\\"legacy\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],null]],[],false,[\\\"if\\\",\\\"name\\\"]]\",\"moduleName\":\"web-directory/components/app-view-stack/template.hbs\",\"isStrictMode\":false});","import { readOnly } from '@ember/object/computed';\nimport { A } from '@ember/array';\nimport { on } from '@ember/object/evented';\nimport { inject as service } from '@ember/service';\nimport Component from '@ember/component';\nimport { getOwner } from '@ember/application';\nimport EmberObject, { observer, computed } from '@ember/object';\nimport { run } from '@ember/runloop';\nimport { typeOf } from '@ember/utils';\nimport _ from 'lodash';\nimport CodeUtils from 'web-directory/utils/code-utils';\nimport { FEATURE_CATEGORIES as APP_FEATURE_CATEGORIES } from '../../models/app';\nimport { APPS_RELOADED_EVENT } from '../../models/app-pool';\nimport { getActiveTopLevelMenuItem } from '../../utils/menu';\n\nconst GENERAL_APP_FEATURE_CATEGORY = 'GENERAL';\n\nconst PERFORMANCE_NAV_ORDER = [\n    '#/analytics/dashboards',\n    'dashboard',\n    'dashboard/agent',\n    '#/analytics/queues/activity/me',\n    '#/analytics/queues/activity',\n    '#/analytics/queues/performance',\n    '#/analytics/agents/performance/me',\n    '#/analytics/agents/development/me',\n    '#/analytics/agents/schedule/me',\n    '#/analytics/agents/performance',\n    '#/analytics/agents/development',\n    'agents',\n    '#/analytics/interactions',\n    '#/analytics/content',\n    '#/analytics/dnis/performance',\n    '#/analytics/skills/performance',\n    '#/analytics/wrapup/performance',\n    '#/analytics/flows/performance',\n    '#/analytics/outcomes/performance',\n    '#/analytics/quality/surveys/performance',\n    'outbound/dashboards/outboundCampaigns',\n    'dashboards/outboundCampaigns',\n    'admin/scheduledCallbacks',\n    '#/analytics/outbound/scheduledCallbacks',\n    '#/analytics/journey/actionMaps',\n    '#/admin/wfm/intradayMonitoring',\n    '#/admin/wfm/adherence/realtime',\n    '#/admin/wfm/adherence/historicalV2/historical-adherence',\n    '#/admin/wfm/shrinkage/historical',\n    '#/analytics/api-usage',\n    '#/analytics/topic/trends',\n    '#/analytics/bots/performance',\n    '#/analytics/predictive-routing/queues'\n];\n\n/**\n * Maps path prefixes to top-level menu-items (by className).\n * You can specify [] to opt out of path-based lookups.\n * See utils/menu:getActiveTopLevelMenuItem for more details\n */\nconst menuSearchPaths = ['/person-v2/', '/group-v2/', '/card-v2/'];\nconst menuItemActivePathPrefixesMap = {\n    'menu-search': menuSearchPaths,\n    'menu-content-management': ['/content-management/'],\n    'menu-performance-ddl': ['/analytics/', '/engage/dashboard/'],\n    'menu-partners': ['/partners/'],\n    'menu-admin': [\n        '/admin/',\n        '/engage/telephonyAdmin/',\n        '/engage/admin/',\n        '/engage/outbound/admin/',\n        '/admin/outbound/admin/',\n        '/engage/quality/admin/',\n        '/quality/admin/',\n        '/topics-definitions/',\n        '/engage/wfm/admin/'\n    ]\n};\n\nexport default Component.extend({\n    classNames: ['application-links'],\n    classNameBindings: ['application.showTinyNavMenu:mobile-links', 'session.user.isTrustee'],\n    session: service(),\n    application: service(),\n    apps: service(),\n    adminAccess: service(),\n    adminui: service('adminui'),\n    sidebar: service(),\n    engage: service(),\n    permissions: service(),\n    documents: service(),\n    intl: service(),\n\n    router: null,\n    // Used to trigger active helper updates for the menu\n    currentURL: readOnly('router.currentURL'),\n\n    showTinyNavDropdown: false,\n    canSeeReports: false,\n\n    appMenuItemsByFeatureCategory: null,\n\n    activityLinkTitle: computed(function () {\n        return this.intl.t('components.navMenu.activity');\n    }),\n    searchLinkTitle: computed(function () {\n        return this.intl.t('components.navMenu.directory');\n    }),\n    myOrganizationLinkTitle: computed(function () {\n        return this.intl.t('components.navMenu.myOrganization');\n    }),\n    documentsLinkTitle: computed(function () {\n        return this.intl.t('components.navMenu.documents');\n    }),\n    tasksLinkTitle: computed(function () {\n        return this.intl.t('components.navMenu.tasks');\n    }),\n    reportsLinkTitle: computed(function () {\n        return this.intl.t('components.navMenu.reports');\n    }),\n    journeyAnalyticsLinkTitle: computed(function () {\n        return this.intl.t('components.navMenu.journeyAnalytics');\n    }),\n    adminLinkTitle: computed(function () {\n        return this.intl.t('components.navMenu.admin');\n    }),\n    performanceLinkTitle: computed(function () {\n        return this.intl.t('components.navMenu.performance');\n    }),\n    appsLinkTitle: computed(function () {\n        return this.intl.t('components.navMenu.apps');\n    }),\n    relateLinkTitle: computed(function () {\n        return this.intl.t('components.navMenu.externalContacts');\n    }),\n\n    actions: {\n        leafItemClick(node) {\n            this.closeMenus();\n            this.sidebar.ensureRouteVisibility();\n\n            if (node && node.action && typeof node.action === 'function') {\n                try {\n                    node.action();\n                } catch (e) {\n                    // Empty error handling\n                }\n            }\n        },\n        leafItemClickEmpty() {\n            this.closeMenus();\n            this.sidebar.ensureRouteVisibility();\n        },\n        onDropdownChange(topLevelMenuItem, isOpen) {\n            if (isOpen) {\n                this.set('openSubMenuClassName', topLevelMenuItem.className);\n            } else {\n                this.set('openSubMenuClassName', null);\n            }\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        try {\n            const router = getOwner(this).lookup('router:main');\n            if (!router) {\n                console.error('Located empty router service.  Active menu marking disabled.', {\n                    remoteData: { type: typeOf(router) }\n                });\n            }\n            this.set('router', router || null);\n        } catch (e) {\n            console.error('Failed to lookup router service.  Active menu marking disabled.', { thrownError: e });\n            this.set('router', null);\n        }\n\n        // Unlikely the app will be ready at this point, the observer will handle apps env changes\n        this._buildAppMenuItems();\n\n        let standaloneAppPool = this.get('apps.standaloneAppPool');\n        if (standaloneAppPool) {\n            standaloneAppPool.on(APPS_RELOADED_EVENT, this, this._buildAppMenuItems);\n        }\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n\n        let standaloneAppPool = this.get('apps.standaloneAppPool');\n        if (standaloneAppPool) {\n            standaloneAppPool.off(APPS_RELOADED_EVENT, this, this._buildAppMenuItems);\n        }\n    },\n\n    _appsEnvChanged: observer('session.isAuthenticated', function () {\n        this._buildAppMenuItems();\n    }),\n\n    _buildAppMenuItems() {\n        // Only fetch when authenticated for orgId, etc\n        if (this.get('session.isAuthenticated')) {\n            run.once(this, function () {\n                this.get('apps.standaloneAppPool')\n                    .findAllApps()\n                    .then(standaloneApps => {\n                        let appMenuItemsByCategory = {};\n\n                        if (standaloneApps && standaloneApps.length > 0) {\n                            standaloneApps\n                                .sort((menuItem1, menuItem2) => {\n                                    return menuItem1.get('name').localeCompare(menuItem2.get('name'));\n                                })\n                                .reduce((result, currApp) => {\n                                    let currCategory = currApp.get('featureCategory') || GENERAL_APP_FEATURE_CATEGORY;\n                                    let currAppEntry = {\n                                        className: `menu-app-${currApp.get('id')}`,\n                                        label: currApp.get('name'),\n                                        route: {\n                                            name: 'third-party.app-embed',\n                                            segment: currApp.get('id')\n                                        }\n                                    };\n\n                                    if (Object.prototype.hasOwnProperty.call(result, currCategory)) {\n                                        result[currCategory].push(currAppEntry);\n                                    } else {\n                                        result[currCategory] = [currAppEntry];\n                                    }\n\n                                    return result;\n                                }, appMenuItemsByCategory);\n                        }\n\n                        this.set('appMenuItemsByFeatureCategory', appMenuItemsByCategory);\n                    })\n                    .catch(reason => {\n                        console.error('Failed to fetch standalone apps for menu', reason);\n                        this.set('appMenuItemsByFeatureCategory', null);\n                    });\n            });\n        } else {\n            this.set('appMenuItemsByFeatureCategory', null);\n        }\n    },\n\n    /**\n     * Attempt to locate one and only one top-level menu item to mark as active.\n     * This implementation is decent (espeically with the path prefixes map); however,\n     * there are edge cases.  An even more robust approach might be to pass down\n     * more of the route structure (embedded engage/admin) with this menu to convey\n     * proper hierarchy.  But, for now, the existing hierarchy and path prefixes\n     * should suffice.\n     *\n     * Note: currentURL triggers recalculation and is required (even though it's not directly consumed)\n     */\n    activeTopLevelMenuItem: computed('menu', 'router', 'currentURL', function () {\n        const menu = this.menu;\n        const router = this.router;\n\n        if (!menu || !router) {\n            return null;\n        }\n\n        const menuItemBasePathsMap = Object.entries(menuItemActivePathPrefixesMap).reduce(\n            (acc, [className, basePaths]) => {\n                const topLevelMatch = menu.find(curr => curr.className === className);\n                if (topLevelMatch) {\n                    acc.set(topLevelMatch, basePaths);\n                }\n\n                return acc;\n            },\n            new Map()\n        );\n\n        return getActiveTopLevelMenuItem(menu, router, {\n            menuItemBasePathsMap\n        });\n    }),\n\n    menu: computed(\n        'session.person.{isAdmin,isContentUser}',\n        'permissions',\n        'adminAccess.userHasAdminAccess',\n        'adminui.adminEntries',\n        'navEntries',\n        'canSeeReports',\n        'appMenuItemsByFeatureCategory',\n        'documentsSegment',\n        'permissions.canViewDirectory',\n        'router',\n        'currentURL',\n        function () {\n            const adminEntries = this.get('adminui.adminEntries');\n            const appMenuItemsByFeatureCategory = this.appMenuItemsByFeatureCategory;\n\n            const useNewActivityRoute = this.get('permissions.canViewAgentActivity');\n\n            menuItemActivePathPrefixesMap['menu-search'] = menuSearchPaths;\n\n            const router = this.router;\n            if (!router) return [];\n\n            const currentURL = this.currentURL;\n\n            const isHubEnabled = this.get('session.features')\n                ? this.get('session.features')['WEM-1476_Agent-Activity-Migration']\n                : false;\n            const activityRoute = isHubEnabled ? 'center-stage-frame-operationsHub' : 'center-stage-frame-agentHome';\n\n            let result = [\n                {\n                    className: 'menu-activity',\n                    iconClassNames: ['pc', 'pc-no-activity'],\n                    label: this.activityLinkTitle,\n                    route: useNewActivityRoute ? activityRoute : 'timeline'\n                }\n            ];\n\n            let directoryMenuItems = [];\n            let pcDirectoryMenuItem;\n            if (this.get('permissions.canViewDirectory')) {\n                pcDirectoryMenuItem = {\n                    className: 'menu-search',\n                    iconClassNames: ['pc-moon', 'pc-directory'],\n                    label: this.searchLinkTitle,\n                    route: 'center-stage-frame-search'\n                };\n                directoryMenuItems.push(pcDirectoryMenuItem);\n            }\n\n            if (\n                this.get('permissions.hasExternalContactsViewContactAccess') ||\n                this.get('permissions.hasExternalContactsViewOrganizationAccess')\n            ) {\n                const linkData = {\n                    className: 'menu-relate',\n                    iconClassNames: ['pc-moon', 'pc-relate'],\n                    label: this.relateLinkTitle,\n                    route: 'center-stage-frame-contactsAndOrganizationsUI'\n                };\n                directoryMenuItems.push(linkData);\n            }\n\n            const directoryAppMenuItems = appMenuItemsByFeatureCategory\n                ? appMenuItemsByFeatureCategory[APP_FEATURE_CATEGORIES.DIRECTORY]\n                : [];\n            if (!_.isEmpty(directoryAppMenuItems)) {\n                directoryMenuItems = directoryMenuItems.concat(directoryAppMenuItems);\n            }\n\n            if (directoryMenuItems.length > 1) {\n                // Change the title of the internal PureCloud directory menu item\n                if (!!pcDirectoryMenuItem) {\n                    pcDirectoryMenuItem.label = this.myOrganizationLinkTitle;\n                }\n                result.push({\n                    className: 'menu-search',\n                    iconClassNames: ['pc-moon', 'pc-directory'],\n                    label: this.searchLinkTitle,\n                    open: false,\n                    children: directoryMenuItems\n                });\n            } else if (!!directoryMenuItems[0]) {\n                // Push the internal PureCloud directory menu item as the top-level item\n                result.push(directoryMenuItems[0]);\n            }\n\n            if (this.get('session.person.isContentUser')) {\n                result.push({\n                    className: 'menu-content-management',\n                    iconClassNames: ['pc', 'pc-content'],\n                    label: this.documentsLinkTitle,\n                    route: {\n                        name: 'content-management',\n                        segment: this.documentsSegment\n                    }\n                });\n            }\n\n            if (this.permissions.validateDonutPermission('affiliateOrganization:clients:view')) {\n                result.push({\n                    className: 'menu-partners',\n                    iconClassNames: ['pc', 'pc-tasks'],\n                    label: this.intl.t('components.navMenu.partners.partners'),\n                    route: 'partners.clients'\n                });\n            }\n\n            const perfNav = this.get('navEntries.performanceNav');\n\n            if (perfNav) {\n                const perfNavEntry = {\n                    className: 'menu-performance-ddl',\n                    iconClassNames: ['pc', 'pc-performance'],\n                    label: this.performanceLinkTitle,\n                    open: false,\n                    children: []\n                };\n\n                const isNewAgentsViewEnabled = this.get('permissions.canViewAgentPerformance');\n\n                // Add all embedded engage nav items\n                perfNavEntry.children = perfNav\n                    .filter(\n                        currPerfNavItem =>\n                            !(currPerfNavItem.path === 'agents' && isNewAgentsViewEnabled) &&\n                            !(currPerfNavItem.path === 'queues') &&\n                            !(currPerfNavItem.path === 'admin/scheduledCallbacks')\n                    )\n                    .map(currPerfNavItem => {\n                        return {\n                            className: currPerfNavItem.className,\n                            label: currPerfNavItem.text,\n                            route: {\n                                name: currPerfNavItem.name || 'engage.embedded',\n                                segment: currPerfNavItem.path\n                            }\n                        };\n                    });\n\n                perfNavEntry.children.push({\n                    className: CodeUtils.generateClassName('workspace', 'menu-'),\n                    label: this.intl.t('components.navMenu.workspace'),\n                    url: '#/analytics',\n                    target: '_top'\n                });\n\n                if (Array.isArray(adminEntries)) {\n                    const wfmAdminEntry = adminEntries.find(e => e.id === 'WFM');\n                    if (wfmAdminEntry && Array.isArray(wfmAdminEntry.subLinks)) {\n                        wfmAdminEntry.subLinks\n                            .filter(wfmAdminEntrySubLink => {\n                                const isIntraday = wfmAdminEntrySubLink.id === 'WFM_INTRADAY';\n                                const isRTA = wfmAdminEntrySubLink.id === 'WFM_REALTIMEADHERENCE';\n                                let isHA = wfmAdminEntrySubLink.id === 'WFM_HISTORICALADHERENCEV2';\n                                const isHS = wfmAdminEntrySubLink.id === 'WFM_HISTORICALSHRINKAGE';\n\n                                if (this.get('permissions.hasShrinkageViewAccess')) {\n                                    return isIntraday || isRTA || isHA || isHS;\n                                }\n\n                                return isIntraday || isRTA || isHA;\n                            })\n                            .forEach(wfmLink => {\n                                perfNavEntry.children.push({\n                                    className: CodeUtils.generateClassName(wfmLink.id, 'menu-'),\n                                    label: wfmLink.text,\n                                    url: `#/admin/${wfmLink.href}`,\n                                    target: '_top'\n                                });\n                            });\n                    }\n                }\n\n                perfNavEntry.children = _.sortBy(perfNavEntry.children, navObj =>\n                    _.findIndex(PERFORMANCE_NAV_ORDER, path => {\n                        const route = navObj.route;\n                        const url = navObj.url;\n                        const isRouteMatch = route && (path === route.segment || path === route);\n                        const isUrlMatch = path === url;\n                        return isRouteMatch || isUrlMatch;\n                    })\n                );\n\n                const perfAppMenuItems = appMenuItemsByFeatureCategory\n                    ? appMenuItemsByFeatureCategory[APP_FEATURE_CATEGORIES.CONTACT_CENTER_INSIGHTS]\n                    : [];\n                if (!_.isEmpty(perfAppMenuItems)) {\n                    perfNavEntry.children = perfNavEntry.children.concat(perfAppMenuItems);\n                }\n\n                if (perfNavEntry.children.length > 0) {\n                    result.push(perfNavEntry);\n                }\n            }\n\n            if (this.canSeeReports) {\n                result.push({\n                    className: 'menu-reports',\n                    iconClassNames: ['pc', 'pc-reports'],\n                    label: this.reportsLinkTitle,\n                    route: {\n                        name: 'engage.embedded',\n                        segment: 'reports'\n                    }\n                });\n            }\n\n            if (this.get('permissions.canViewJourneyAnalytics')) {\n                result.push({\n                    className: 'menu-journey-analytics',\n                    iconClassNames: ['pc', 'pc-journey-analytics'],\n                    label: this.journeyAnalyticsLinkTitle,\n                    url: '/journey-management',\n                    target: '_blank'\n                });\n            }\n\n            let generalAppMenuItems = appMenuItemsByFeatureCategory\n                ? appMenuItemsByFeatureCategory[GENERAL_APP_FEATURE_CATEGORY]\n                : [];\n            if (!_.isEmpty(generalAppMenuItems)) {\n                result.push({\n                    className: 'menu-apps-ddl',\n                    label: this.appsLinkTitle,\n                    open: false,\n                    children: generalAppMenuItems\n                });\n            }\n\n            if (this.get('adminAccess.userHasAdminAccess')) {\n                result.push({\n                    className: 'menu-admin',\n                    label: this.adminLinkTitle,\n                    route: {\n                        name: 'admin',\n                        segment: 'welcomeV2'\n                    }\n                });\n            }\n\n            // Restore the previously open menu item, if any\n            var prevOpenSubMenuClassName = this.openSubMenuClassName;\n            if (prevOpenSubMenuClassName) {\n                _.forEach(result, curr => {\n                    if (curr.className === prevOpenSubMenuClassName) {\n                        curr.open = true;\n                        return false;\n                    }\n                });\n            }\n            return emberifyMenu.call(this, result, currentURL);\n        }\n    ),\n\n    navEntries: computed('engage.navTree', 'session.person.isEngageUser', function () {\n        var navEntries = this.get('engage.navTree');\n        var performanceNav = [];\n        var adminNav = [];\n\n        if (!navEntries) {\n            navEntries = [];\n        }\n\n        if (this.get('permissions.canViewOutboundCampaigns')) {\n            const textKey = 'outbound.primaryNavigation.dashboards.outboundCampaigns';\n            if (!navEntries.some(item => item.textKey == textKey)) {\n                navEntries.push({\n                    text: this.intl.t('components.navMenu.outboundCampaigns'),\n                    textKey: textKey,\n                    href: 'dashboards/outboundCampaigns',\n                    roles: [\n                        {\n                            any: ['perm:outbound:campaign:view']\n                        }\n                    ],\n                    ignoreDivisions: true,\n                    routeName: 'center-stage-frame-outbound.internal'\n                });\n            }\n        }\n\n        // Reset visible flags\n        this.set('canSeeReports', false);\n\n        _.each(navEntries, entry => {\n            var navObj = {\n                text: entry.text,\n                className: CodeUtils.generateClassName(entry.text, 'menu-')\n            };\n\n            if (entry.href) {\n                navObj.path = entry.href.replace('#', '');\n            } else if (entry.subLinks && entry.subLinks.length > 0) {\n                navObj.path = entry.subLinks[0].href.replace('#', '');\n            }\n\n            if (entry.routeName) {\n                navObj.name = entry.routeName;\n            }\n\n            // Ignore report component\n            if (entry.fromPlaceholder === 'reports-component') {\n                this.set('canSeeReports', true);\n                return;\n            }\n\n            // Do not show alerts in this context\n            if (entry.fromPlaceholder === 'alerting-component') {\n                return;\n            }\n\n            if (entry.href === '#admin/scheduledCallbacks') {\n                performanceNav.push(navObj);\n                return;\n            }\n\n            var match = new RegExp('architect').test(entry.href);\n            if (match) {\n                navObj.path = entry.href;\n                navObj.isArchitect = adminNav.push(navObj);\n            } else if (isPerformanceEntry(entry)) {\n                performanceNav.push(navObj);\n            } else {\n                adminNav.push(navObj);\n            }\n        });\n\n        return {\n            performanceNav,\n            adminNav: _.sortBy(adminNav, 'text')\n        };\n    }),\n\n    documentsSegment: computed('documents.lastSegment', function () {\n        let lastSegment = this.get('documents.lastSegment');\n\n        if (lastSegment) {\n            return lastSegment;\n        } else {\n            return 'dashboard';\n        }\n    }),\n\n    closeMenus() {\n        this.set('showTinyNavDropdown', false);\n\n        const menu = this.menu;\n        _.forEach(menu, function (curr) {\n            if (curr.get('open')) {\n                curr.set('open', false);\n            }\n        });\n\n        this.set('openSubMenuClassName', null);\n    },\n\n    handleShowTinyNavMenu: on(\n        'init',\n        observer('application.showTinyNavMenu', function () {\n            if (!this.get('application.showTinyNavMenu')) {\n                this.closeMenus();\n            }\n        })\n    )\n});\n\nfunction ensureRouteURl(src, currentURL) {\n    let isCurrentURL = false;\n    if (src.url) {\n        if (src.url.replace(/^#/, '') == currentURL) {\n            isCurrentURL = true;\n        }\n        src.isCurrentURL = isCurrentURL;\n        return;\n    }\n\n    const router = this.router;\n    if (!router || !router.generate) return;\n    let url;\n    if (typeof src.route === 'string') {\n        url = router.generate(src.route);\n    }\n    if (typeof src.route === 'object') {\n        url = router.generate(src.route.name, src.route.segment);\n    }\n    if (url) {\n        if (url.replace(/^#/, '') == currentURL) {\n            isCurrentURL = true;\n        }\n        src.url = url;\n        src.isCurrentURL = isCurrentURL;\n    }\n}\n\n/**\n * Convert the raw js menu array of objects into Ember objects for easy use in components\n *  @param {array} src The raw js array of objects\n *  @returns {array} An ember-wrapped array of ember-wrapped objects\n */\nfunction emberifyMenu(src, currentURL) {\n    const _this = this;\n    if (Array.isArray(src)) {\n        return A(\n            _.map(src, function (curr) {\n                return emberifyMenu.call(_this, curr, currentURL);\n            })\n        );\n    }\n    if (src.children) {\n        src.children = A(\n            _.map(src.children, function (currChild) {\n                return emberifyMenu.call(_this, currChild, currentURL);\n            })\n        );\n    } else {\n        ensureRouteURl.call(_this, src, currentURL);\n    }\n\n    return EmberObject.create(src);\n}\n\n/**\n * Evaluate a nav entry object to determine if\n * it should be grouped in the performance category.\n *\n * @param {object} entry\n * @returns {boolean}\n */\nfunction isPerformanceEntry(entry) {\n    // Components that should be pushed into the\n    // performance navigation\n    var performanceComponents = ['queues-component', 'agents-component'];\n\n    // Core paths that should be pushed into the\n    // performance navigation\n    var performancePaths = [\n        '#dashboard',\n        '#agentDashboard',\n        '#admin/scheduledCallbacks',\n        '#outbound/dashboards/outboundCampaigns',\n        'dashboards/outboundCampaigns'\n    ];\n\n    if (entry.fromPlaceholder && !_.includes(performanceComponents, entry.fromPlaceholder)) {\n        return false;\n    } else if (entry.fromPlaceholder === undefined && !_.includes(performancePaths, entry.href)) {\n        return false;\n    }\n\n    return true;\n}\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"SmtHyClK\",\"block\":\"[[[10,\\\"ul\\\"],[14,0,\\\"application-links-items list-unstyled\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"li\\\"],[15,0,[29,[\\\"menu-mobile-links\\\\n            \\\",[52,[33,1],\\\"menu-open\\\"],\\\"\\\\n            \\\",[52,[28,[37,2],[[33,3],[33,4]],null],\\\"active\\\"]]]],[12],[1,\\\"\\\\n\\\"],[6,[39,5],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[[33,1],\\\"application-links showTinyNavDropdown\\\"]],[[\\\"default\\\"],[[[[1,\\\"            \\\"],[10,3],[14,6,\\\"#\\\"],[14,0,\\\"menu-selector application-links-selector\\\"],[12],[1,\\\"\\\\n                \\\"],[10,1],[14,0,\\\"menu-item-label\\\"],[12],[1,[28,[35,6],[\\\"navBar.appLinks\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[1,[28,[35,7],null,[[\\\"menu\\\",\\\"class\\\",\\\"classNames\\\",\\\"leafItemClick\\\",\\\"showIcons\\\"],[[33,8],\\\"dropdown-menu\\\",[52,[33,1],\\\"show\\\"],\\\"leafItemClick\\\",false]]]],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"],[42,[28,[37,10],[[28,[37,10],[[33,8]],null]],null],null,[[[41,[30,1,[\\\"children\\\"]],[[[1,\\\"            \\\"],[10,\\\"li\\\"],[15,0,[29,[\\\"menu-top-level-item\\\\n                    \\\",[30,1,[\\\"className\\\"]],\\\"\\\\n                    \\\",[52,[30,1,[\\\"open\\\"]],\\\"menu-open\\\"],\\\"\\\\n                    \\\",[52,[28,[37,2],[[30,1],[33,4]],null],\\\"active\\\"]]]],[12],[1,\\\"\\\\n\\\"],[6,[39,5],null,[[\\\"showDropdown\\\",\\\"onDropdownChange\\\",\\\"dropdownInfo\\\",\\\"attachOutsideClick\\\"],[[30,1,[\\\"open\\\"]],[28,[37,11],[[30,0],\\\"onDropdownChange\\\",[30,1]],null],\\\"application-links topLevelItem.open\\\",true]],[[\\\"default\\\"],[[[[1,\\\"                    \\\"],[1,[28,[35,12],null,[[\\\"menuItem\\\",\\\"classNames\\\",\\\"labelIdentifierClass\\\",\\\"isMenuBranchActive\\\"],[[30,1],\\\"menu-selector\\\",\\\"top-level-menu-item-label\\\",[28,[37,2],[[30,1],[33,4]],null]]]]],[1,\\\"\\\\n\\\\n                    \\\"],[1,[28,[35,7],null,[[\\\"menu\\\",\\\"class\\\",\\\"leafItemClick\\\",\\\"leafItemClickEmpty\\\",\\\"showIcons\\\"],[[30,1,[\\\"children\\\"]],\\\"dropdown-menu\\\",[28,[37,11],[[30,0],\\\"leafItemClick\\\"],null],[28,[37,11],[[30,0],\\\"leafItemClickEmpty\\\"],null],false]]]],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[10,\\\"li\\\"],[15,0,[29,[\\\"menu-top-level-item\\\\n                    \\\",[30,1,[\\\"className\\\"]],\\\"\\\\n                    \\\",[52,[28,[37,2],[[30,1],[33,4]],null],\\\"active\\\"]]]],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,12],null,[[\\\"menuItem\\\",\\\"leafItemClick\\\",\\\"leafItemClickEmpty\\\",\\\"labelIdentifierClass\\\",\\\"isMenuBranchActive\\\"],[[30,1],\\\"leafItemClick\\\",\\\"leafItemClickEmpty\\\",\\\"top-level-menu-item-label\\\",[28,[37,2],[[30,1],[33,4]],null]]]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[1]],null],[13]],[\\\"topLevelItem\\\"],false,[\\\"if\\\",\\\"showTinyNavDropdown\\\",\\\"eq\\\",\\\"topLevelItem\\\",\\\"activeTopLevelMenuItem\\\",\\\"drop-down\\\",\\\"t\\\",\\\"carousel-menu\\\",\\\"menu\\\",\\\"each\\\",\\\"-track-array\\\",\\\"action\\\",\\\"menu-item\\\"]]\",\"moduleName\":\"web-directory/components/application-links/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport _ from 'lodash';\nimport { doFocus } from 'web-directory/utils/focus-management';\n\nexport default Component.extend({\n    classNames: ['preferences'],\n\n    settings: service(),\n    permissions: service(),\n\n    activePreference: 'notifications',\n    defaultPreference: 'notifications',\n\n    init() {\n        this._super(...arguments);\n\n        const focusTarget = '[role=\"tab\"]:first';\n        doFocus(this, focusTarget);\n\n        if (!this.settings.canOpenPreference('notifications')) {\n            this.set('activePreference', 'chat');\n            this.set('defaultPreference', 'chat');\n        }\n\n        this.settings.on('openPreference', this, this.openPreference);\n    },\n\n    willDestroyElement() {\n        this.settings.off('openPreference', this, this.openPreference);\n\n        this._super(...arguments);\n    },\n\n    actions: {\n        changeTab(preferenceKey) {\n            this.openPreference(preferenceKey);\n        },\n\n        handleTabKeydown(preferenceKey, event) {\n            const { key } = event;\n\n            if (key === 'Enter' || key === ' ') {\n                event.preventDefault();\n                this.openPreference(preferenceKey);\n                return;\n            }\n\n            // Arrow key navigation for vertical tabs\n            if (key === 'ArrowDown' || key === 'ArrowUp' || key === 'Home' || key === 'End') {\n                event.preventDefault();\n                const tabs = this.element.querySelectorAll('[role=\"tab\"]');\n                const tabsArray = Array.from(tabs);\n                const currentIndex = tabsArray.indexOf(event.currentTarget);\n\n                let nextIndex;\n                if (key === 'ArrowDown') {\n                    nextIndex = (currentIndex + 1) % tabsArray.length;\n                } else if (key === 'ArrowUp') {\n                    nextIndex = (currentIndex - 1 + tabsArray.length) % tabsArray.length;\n                } else if (key === 'Home') {\n                    nextIndex = 0;\n                } else if (key === 'End') {\n                    nextIndex = tabsArray.length - 1;\n                }\n\n                tabsArray[nextIndex].focus();\n            }\n        }\n    },\n\n    tabs: computed(\n        'activePreference',\n        'defaultPreference',\n        'settings.{commonPreferences,customPreferences,commonPreferencesSortOrder}',\n        'permissions.canViewBusinessChat',\n        function () {\n            const order = this.get('settings.commonPreferencesSortOrder');\n\n            const common = this.get('settings.commonPreferences').sort(\n                (prefA, prefB) => order.indexOf(prefA.key) - order.indexOf(prefB.key)\n            );\n\n            const custom = this.get('settings.customPreferences').sort((prefA, prefB) =>\n                prefA.name.localeCompare(prefB.name)\n            );\n\n            let tabs = _.cloneDeep([...common, ...custom]);\n\n            // fix SafeString garble\n            tabs.forEach(tab => {\n                tab.isActive = false;\n                if (tab.name && tab.name.string) {\n                    tab.name = tab.name.string;\n                }\n            });\n\n            const activePreference = this.activePreference;\n            const defaultPreference = this.defaultPreference;\n\n            let preference =\n                tabs.find(preference => preference.key === activePreference) ||\n                tabs.find(preference => preference.key === defaultPreference);\n\n            preference.isActive = true;\n\n            if (!this.get('permissions.canViewBusinessChat')) {\n                tabs = tabs.reject(tab => tab.key === 'chat');\n            }\n\n            if (!this.get('permissions.phoneEnabled')) {\n                tabs = tabs.reject(tab => tab.key === 'pin');\n            }\n\n            return tabs;\n        }\n    ),\n\n    currentTab: computed('tabs', function () {\n        return this.tabs.find(tab => tab.isActive);\n    }),\n\n    openPreference(preferenceKey) {\n        this.set('activePreference', preferenceKey);\n    }\n});\n","import { inject as service } from '@ember/service';\nimport Component from '@ember/component';\nimport { computed } from '@ember/object';\n\nexport default Component.extend({\n    classNames: ['queue-settings'],\n\n    intl: service(),\n    preferences: service(),\n\n    enableDefaultQueues: false,\n    checkboxName: computed(function () {\n        return this.intl.t('purecloud.acdInteraction.defaultQueueSetting');\n    }),\n\n    init() {\n        this._super(...arguments);\n\n        this.preferences.getPreference('interactions.defaultQueuesEnabled').then(val => {\n            this.set('enableDefaultQueues', val);\n        });\n    },\n\n    actions: {\n        changeSetting(value) {\n            this.set('enableDefaultQueues', value);\n            this.preferences.setPreference('interactions.defaultQueuesEnabled', value);\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"93/VBlmd\",\"block\":\"[[[1,[28,[35,0],null,[[\\\"headerKey\\\",\\\"labelKey\\\",\\\"type\\\",\\\"value\\\",\\\"setPreference\\\",\\\"autofocus\\\"],[\\\"purecloud.acdInteraction.queues\\\",[33,1],\\\"checkbox\\\",[33,2],[28,[37,3],[[30,0],\\\"changeSetting\\\"],null],true]]]]],[],false,[\\\"preference-setting\\\",\\\"checkboxName\\\",\\\"enableDefaultQueues\\\",\\\"action\\\"]]\",\"moduleName\":\"web-directory/components/application-preferences/interactions/template.hbs\",\"isStrictMode\":false});","import { debounce, cancel, later } from '@ember/runloop';\nimport { resolve } from 'rsvp';\nimport EmberObject, { computed, observer } from '@ember/object';\nimport { reads, alias } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport Component from '@ember/component';\nimport AutoSaveDevicesMixin from 'web-directory/mixins/webrtc-service/auto-save-devices';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nconst sounds = {\n    phone: 'phone',\n    ringer: 'phone',\n    chat: 'chat',\n    interaction: 'interaction',\n    digital: 'digital'\n};\n\nconst debounceTimeout = 500;\n\nexport default Component.extend(AutoSaveDevicesMixin, LoggerMixin, {\n    classNames: ['sound-preferences'],\n\n    phone: service(),\n    sound: service(),\n    chat: service(),\n    preferences: service(),\n    webrtc: service(),\n    session: service(),\n    intl: service(),\n    permissions: service(),\n    webrtcSettings: service(),\n    ring: service(),\n    volt: service(),\n\n    minCallVolume: 10,\n    minCallActiveRingerVolume: 0,\n    minPhoneRingVolume: 0,\n    minChatNotificationVolume: 0,\n    minInteractionNotificationVolume: 10,\n\n    defaultVolume: 100,\n    callVolume: 100,\n    ringerVolume: 100,\n    // alert volume while on call\n    callActiveRingerVolume: 100,\n    chatNotificationVolume: 100,\n    interactionNotificationVolume: 100,\n    videoNotificationVolume: 100,\n    soundRunLater: null,\n    advancedMicSettingsExpanded: false,\n    skipServerUpdates: true,\n\n    outputDevices: reads('webrtc.outputDeviceList'),\n    currentOutputDevice: null,\n\n    autoGain: alias('settings.generalSettings.advancedMicSettings.autoGain'),\n    echoCancellation: alias('settings.generalSettings.advancedMicSettings.echoCancellation'),\n    noiseSuppression: alias('settings.generalSettings.advancedMicSettings.noiseSuppression'),\n\n    hasOutputDevices: computed('outputDevices.[]', function () {\n        return this.outputDevices.length > 0;\n    }),\n    ringtones: reads('sound.ringtones'),\n    settings: reads('webrtcSettings.settings'),\n    ringtoneSelection: alias('settings.generalSettings.ringtoneSelection'),\n    videoIcon: computed('videoNotificationVolume', function () {\n        return this.videoNotificationVolume === 0 ? 'video-disable' : 'video';\n    }),\n\n    init() {\n        this._super(...arguments);\n        this.set('currentOutputDevice', this.get('webrtc.defaultOutputDevice'));\n\n        try {\n            this.loadVolumesForCurrentDevice();\n        } catch (err) {\n            console.error(err);\n        }\n\n        this.updateOutputTranslations();\n    },\n\n    micPermissionGranted: reads('webrtc.hasMicPermission'),\n\n    ringerIsMuted: computed('ringerVolume', function () {\n        return this.ringerVolume === 0;\n    }),\n\n    chatNotificationIsMuted: computed('chatNotificationVolume', function () {\n        return this.chatNotificationVolume === 0;\n    }),\n\n    currentDeviceSanitizedLabel: computed('currentOutputDevice', function () {\n        const currentDevice = this.currentOutputDevice;\n        if (!currentDevice) {\n            return '';\n        }\n\n        if (currentDevice.get('deviceId') === 'default') {\n            return 'default';\n        }\n\n        const deviceLabel = currentDevice.get('label');\n        let sanatizedLabel = this.webrtc.sanitizeDeviceLabel(deviceLabel) || '';\n        if (sanatizedLabel.indexOf('webrtcDevices.default') > -1) {\n            sanatizedLabel = this.intl.t('preferences.sound.systemDefault');\n        }\n\n        return sanatizedLabel;\n    }),\n\n    currentVolumes: computed(\n        'callVolume',\n        'ringerVolume',\n        'callActiveRingerVolume',\n        'chatNotificationVolume',\n        'interactionNotificationVolume',\n        function () {\n            const volumes = {\n                callVolume: this.callVolume,\n                ringerVolume: this.ringerVolume,\n                chatNotificationVolume: this.chatNotificationVolume,\n                interactionNotificationVolume: this.interactionNotificationVolume,\n                callActiveRingerVolume: this.callActiveRingerVolume\n            };\n            return volumes;\n        }\n    ),\n\n    outputDeviceChanged: observer('currentOutputDevice', function () {\n        this.loadVolumesForCurrentDevice();\n    }),\n\n    phoneVolumeChange: observer(\n        'callVolume',\n        'ringerVolume',\n        'callActiveRingerVolume',\n        'skipServerUpdates',\n        function () {\n            const currentVolumes = this.currentVolumes;\n            // this is so we don't send 4 server updates when we change the selected device\n            const skipServerUpdates = this.skipServerUpdates;\n\n            if (!skipServerUpdates) {\n                const newVolumes = this.currentVolumes;\n                const label = `volumeSettings.${this.currentDeviceSanitizedLabel}`;\n                this.webrtcSettings.updateSetting(label, newVolumes);\n            }\n\n            if (this._shouldUpdatePhoneVolumes()) {\n                const newPhoneVolumes = {\n                    callVolume: currentVolumes.callVolume,\n                    ringerVolume: currentVolumes.ringerVolume,\n                    callActiveRingerVolume: currentVolumes.callActiveRingerVolume\n                };\n                this.setAppVolumes(newPhoneVolumes);\n            }\n        }\n    ),\n\n    notificationVolumeChange: observer(\n        'chatNotificationVolume',\n        'interactionNotificationVolume',\n        'skipServerUpdates',\n        function () {\n            const currentVolumes = this.currentVolumes;\n            // this is so we don't send 4 server updates when we change the selected device\n            if (!this.skipServerUpdates) {\n                this.webrtcSettings.updateSetting(\n                    `volumeSettings.${this.currentDeviceSanitizedLabel}`,\n                    this.currentVolumes\n                );\n            }\n\n            if (this._shouldUpdateNotificationVolumes()) {\n                const newNotificationVolumes = {\n                    chatNotificationVolume: currentVolumes.chatNotificationVolume,\n                    interactionNotificationVolume: currentVolumes.interactionNotificationVolume\n                };\n                this.setAppVolumes(newNotificationVolumes);\n            }\n        }\n    ),\n\n    // Video's join/leave notification volume.\n    videoNotificationVolumeChange: observer('videoNotificationVolume', 'skipServerUpdates', function () {\n        // Skip while loading volumes for the current device (see loadVolumesForCurrentDevice).\n        if (this.skipServerUpdates) {\n            return;\n        }\n\n        // voltSettings may be absent for users who have never saved video settings.\n        // Setting a nested path on an undefined object is a no-op, so the volume would\n        // never persist. Ensure the container exists before writing.\n        if (!this.get('settings.voltSettings')) {\n            this.set('settings.voltSettings', {});\n        }\n\n        this.set('settings.voltSettings.notificationVolume', this.videoNotificationVolume);\n        this.webrtcSettings.updateSettings(this.settings);\n    }),\n\n    _shouldUpdatePhoneVolumes() {\n        const selectedDevice = this.currentOutputDevice;\n        const currentWebrtcDevice = this.get('webrtc.defaultOutputDevice');\n        const selectedDeviceIsCurrentOutput = currentWebrtcDevice\n            ? selectedDevice.get('deviceId') === currentWebrtcDevice.get('deviceId')\n            : false;\n        return selectedDeviceIsCurrentOutput;\n    },\n\n    _shouldUpdateNotificationVolumes() {\n        const selectedDevice = this.currentOutputDevice;\n\n        let currentWebrtcDevice = this.get('webrtc.defaultNotificationDevice');\n        const selectedDeviceIsCurrentOutput = currentWebrtcDevice\n            ? selectedDevice.get('deviceId') === currentWebrtcDevice.get('deviceId')\n            : false;\n        return selectedDeviceIsCurrentOutput;\n    },\n\n    setAppVolumes(volumes) {\n        const phone = this.phone;\n\n        if (this.volumeValueIsDefined(volumes.callVolume)) {\n            phone.set('callVolume', volumes.callVolume);\n        }\n        if (this.volumeValueIsDefined(volumes.ringerVolume)) {\n            phone.set('ringerVolume', volumes.ringerVolume);\n        }\n\n        if (this.volumeValueIsDefined(volumes.callActiveRingerVolume)) {\n            phone.set('callActiveRingerVolume', volumes.callActiveRingerVolume);\n        }\n\n        const chat = this.chat;\n        const chatVolumes = {};\n        if (this.volumeValueIsDefined(volumes.chatNotificationVolume)) {\n            chatVolumes.chatNotificationVolume = volumes.chatNotificationVolume;\n        }\n        if (this.volumeValueIsDefined(volumes.interactionNotificationVolume)) {\n            this.set('ring.interactionVolume', volumes.interactionNotificationVolume);\n            chatVolumes.interactionNotificationVolume = volumes.interactionNotificationVolume;\n        }\n        chat.updateVolumes(chatVolumes);\n    },\n\n    volumeValueIsDefined(volumeValue) {\n        return volumeValue !== null && volumeValue !== undefined;\n    },\n\n    loadVolumesForCurrentDevice() {\n        const haveDevice = this.currentDeviceIsValid();\n        if (!haveDevice) {\n            return;\n        }\n\n        let promise;\n        this.logger.debug('using device volumes from webrtc settings endpoint');\n        promise = resolve(this.get(`webrtcSettings.settings.volumeSettings.${this.currentDeviceSanitizedLabel}`));\n\n        if (\n            this.get('settings.voltSettings.notificationVolume') ||\n            this.get('settings.voltSettings.notificationVolume') === 0\n        ) {\n            this.set('videoNotificationVolume', this.get('settings.voltSettings.notificationVolume'));\n        }\n\n        return promise.then(volumes => {\n            this.set('skipServerUpdates', true);\n\n            if (!volumes) {\n                this.logger.info('no device volumes saved, using defaults');\n                this.send('resetAllVolumes');\n            } else {\n                const callVolume = volumes.callVolume !== undefined ? volumes.callVolume : this.defaultVolume;\n                const ringerVolume = volumes.ringerVolume !== undefined ? volumes.ringerVolume : this.defaultVolume;\n                const chatNotificationVolume =\n                    volumes.chatNotificationVolume !== undefined ? volumes.chatNotificationVolume : this.defaultVolume;\n                const interactionNotificationVolume =\n                    volumes.interactionNotificationVolume !== undefined\n                        ? volumes.interactionNotificationVolume\n                        : this.defaultVolume;\n\n                this.setProperties({\n                    callVolume,\n                    ringerVolume,\n                    chatNotificationVolume,\n                    interactionNotificationVolume\n                });\n\n                const callActiveRingerVolume =\n                    volumes.callActiveRingerVolume !== undefined\n                        ? volumes.callActiveRingerVolume\n                        : this.callActiveRingerVolume;\n                this.set('callActiveRingerVolume', callActiveRingerVolume);\n            }\n\n            this.set('skipServerUpdates', false);\n        });\n    },\n\n    currentDeviceIsValid() {\n        let currentDevice = this.currentOutputDevice;\n        let validDevice = this._validDevice(currentDevice);\n        if (!validDevice) {\n            this.setCurrentDeviceToFirstInDeviceList();\n            currentDevice = this.currentOutputDevice;\n            validDevice = this._validDevice(currentDevice);\n        }\n\n        return validDevice;\n    },\n\n    _validDevice(webrtcDevice) {\n        if (!webrtcDevice) {\n            return false;\n        }\n\n        const deviceHasIdAndLabel = !!webrtcDevice.get('deviceId') && !!webrtcDevice.get('label');\n        return deviceHasIdAndLabel;\n    },\n\n    setCurrentDeviceToFirstInDeviceList() {\n        let currentDevice = this.outputDevices[0];\n        if (!currentDevice) {\n            currentDevice = this.getSystemDefaultDevice();\n        }\n        this.set('currentOutputDevice', currentDevice);\n    },\n\n    getSystemDefaultDevice() {\n        // Create a fake device to represent the system default for browsers that don't let us enumerate the output devices\n        return EmberObject.create({\n            deviceId: 'SystemDefault',\n            label: this.intl.t('preferences.sound.systemDefault')\n        });\n    },\n\n    updateOutputTranslations() {\n        this.webrtc.enumerateDevices();\n    },\n\n    updateAdvancedMicSettings() {\n        this.webrtcSettings.updateSetting(\n            'generalSettings.advancedMicSettings',\n            this.get('settings.generalSettings.advancedMicSettings')\n        );\n    },\n\n    updatePropDebounced(prop, val) {\n        if (this.isDestroyed || this.isDestroying) return;\n        this.set(prop, val);\n    },\n\n    actions: {\n        toggleAdvancedMicSettings() {\n            this.toggleProperty('advancedMicSettingsExpanded');\n        },\n\n        toggleAutoGain(ev) {\n            if (ev.key && ev.key !== 'Enter' && ev.key !== ' ') {\n                return;\n            }\n            const value = this.toggleProperty('autoGain');\n            this.updateAdvancedMicSettings();\n            this.logger.info('Sound Preference: Mic Gain changed', { value });\n        },\n\n        toggleNoiseSuppression(ev) {\n            if (ev.key && ev.key !== 'Enter' && ev.key !== ' ') {\n                return;\n            }\n            const value = this.toggleProperty('noiseSuppression');\n            this.updateAdvancedMicSettings();\n            this.logger.info('Sound Preference: Noise Suppression changed', { value });\n        },\n\n        toggleEchoCancellation(ev) {\n            if (ev.key && ev.key !== 'Enter' && ev.key !== ' ') {\n                return;\n            }\n            const value = this.toggleProperty('echoCancellation');\n            this.updateAdvancedMicSettings();\n            this.logger.info('Sound Preference: Echo Cancellation changed', { value });\n        },\n\n        changeOutputDevice(event) {\n            const id = event.target.value;\n            if (this.get('currentOutputDevice.deviceId') !== id) {\n                const newDevice = this.get('webrtc.outputDeviceList').findBy('deviceId', id);\n                this.set('currentOutputDevice', newDevice);\n            }\n        },\n\n        playCallVolumeSound() {\n            const callVolume = this.callVolume;\n            if (this.ringtoneSelection) {\n                this._playSound(this.ringtoneSelection, callVolume);\n            } else {\n                this._playSound(sounds.phone, callVolume);\n            }\n        },\n\n        /**\n         * 'callActiveRingerVolume'\n         * volume for incoming call while on call\n         */\n        playCallActiveRingerSound() {\n            const callActiveRingerVolume = this.callActiveRingerVolume;\n            if (this.ringtoneSelection) {\n                this._playSound(this.ringtoneSelection, callActiveRingerVolume);\n            } else {\n                this._playSound(sounds.phone, callActiveRingerVolume);\n            }\n        },\n\n        playRingerSound() {\n            const ringerVolume = this.ringerVolume;\n            if (this.ringtoneSelection) {\n                this._playSound(this.ringtoneSelection, ringerVolume);\n            } else {\n                this._playSound(sounds.phone, ringerVolume);\n            }\n        },\n\n        playChatNotificationSound() {\n            const chatNotificationVolume = this.chatNotificationVolume;\n            this._playSound(sounds.chat, chatNotificationVolume);\n        },\n\n        playInteractionNotificationSound() {\n            const interactionNotificationVolume = this.interactionNotificationVolume;\n            this._playSound(sounds.digital, interactionNotificationVolume);\n        },\n\n        toggleRingerMute() {\n            this.toggleMute('ringerVolume');\n        },\n\n        toggleChatSoundMute() {\n            this.toggleMute('chatNotificationVolume');\n        },\n\n        toggleCallVolumeMinVolume() {\n            const currentVolume = this.callVolume;\n            if (currentVolume === this.minCallVolume) {\n                this.set('callVolume', this.defaultVolume);\n            } else {\n                const minVolume = this.minCallVolume;\n                this.set('callVolume', minVolume);\n            }\n        },\n\n        toggleInteractionNotificationVolumeMinVolume() {\n            const currentVolume = this.interactionNotificationVolume;\n            if (currentVolume === this.minInteractionNotificationVolume) {\n                this.set('interactionNotificationVolume', this.defaultVolume);\n            } else {\n                const minVolume = this.minInteractionNotificationVolume;\n                this.set('interactionNotificationVolume', minVolume);\n            }\n        },\n\n        selectCallVolume(e) {\n            debounce(this, this.updatePropDebounced, 'callVolume', e.target.value, debounceTimeout);\n        },\n\n        selectRingerVolume(e) {\n            debounce(this, this.updatePropDebounced, 'ringerVolume', e.target.value, debounceTimeout);\n        },\n\n        selectCallActiveRingerVolume(e) {\n            debounce(this, this.updatePropDebounced, 'callActiveRingerVolume', e.target.value, debounceTimeout);\n        },\n\n        selectChatNotificationVolume(e) {\n            debounce(this, this.updatePropDebounced, 'chatNotificationVolume', e.target.value, debounceTimeout);\n        },\n\n        selectInteractionNotificationVolume(e) {\n            debounce(this, this.updatePropDebounced, 'interactionNotificationVolume', e.target.value, debounceTimeout);\n        },\n\n        selectVideoNotificationVolume(e) {\n            debounce(this, this.updatePropDebounced, 'videoNotificationVolume', e.target.value, debounceTimeout);\n        },\n\n        resetAllVolumes() {\n            const defaultVolume = this.defaultVolume;\n            this.set('callVolume', defaultVolume);\n            this.set('ringerVolume', defaultVolume);\n            this.set('callActiveRingerVolume', defaultVolume);\n            this.set('chatNotificationVolume', defaultVolume);\n            this.set('interactionNotificationVolume', defaultVolume);\n            this.set('videoNotificationVolume', defaultVolume);\n\n            if (this._shouldUpdatePhoneVolumes()) {\n                const volumes = {\n                    callVolume: defaultVolume,\n                    ringerVolume: defaultVolume,\n                    callActiveRingerVolume: defaultVolume\n                };\n                this.setAppVolumes(volumes);\n            }\n            if (this._shouldUpdateNotificationVolumes()) {\n                this.setAppVolumes({\n                    chatNotificationVolume: defaultVolume,\n                    interactionNotificationVolume: defaultVolume\n                });\n            }\n        },\n\n        changeRingtoneSelection(event) {\n            const ringtoneSelection = event.target.value;\n            const previewVolume = this.ringerVolume;\n            this._playSound(ringtoneSelection, previewVolume);\n            if (!this.get('settings.generalSettings')) {\n                this.set('settings.generalSettings', { ringtoneSelection });\n            } else {\n                this.set('settings.generalSettings.ringtoneSelection', ringtoneSelection);\n            }\n            this.webrtcSettings.updateSettings(this.settings);\n        },\n\n        toggleVideoNotificationVolume() {\n            const currentVolume = this.videoNotificationVolume;\n            if (currentVolume === 0) {\n                this.set('videoNotificationVolume', this.defaultVolume);\n            } else {\n                this.set('videoNotificationVolume', 0);\n            }\n        },\n\n        // Video's join/leave notification sound.\n        playVideoNotificationSound() {\n            this.volt.playVideoNotificationPreview(this.currentOutputDevice);\n        }\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        this.stopAllSounds();\n    },\n\n    stopAllSounds() {\n        for (let s in sounds) {\n            this.sound.stopSound(sounds[s]);\n        }\n        if (this.ringtoneSelection) {\n            this.ringtones.forEach(ringtone => {\n                this.sound.stopSound(ringtone.id);\n            });\n        }\n\n        // Stops the Ember.run.later in _playSound\n        cancel(this.soundRunLater);\n    },\n\n    toggleMute: function (volumeSetting) {\n        if (this.get(volumeSetting) === 0) {\n            this.set(volumeSetting, this.defaultVolume);\n        } else {\n            this.set(volumeSetting, 0);\n        }\n    },\n\n    _playSound: function (sound, volume) {\n        const volumeDecimalValue = volume / 100;\n\n        if (volumeDecimalValue > 0) {\n            const outputDeviceId =\n                this.get('currentOutputDevice.deviceId') !== 'SystemDefault'\n                    ? this.get('currentOutputDevice.deviceId')\n                    : null;\n            this.sound.playSound(sound, volumeDecimalValue, outputDeviceId);\n\n            const runLater = later(\n                this,\n                function () {\n                    this.sound.stopSound(sound);\n                },\n                2500\n            );\n\n            this.set('soundRunLater', runLater);\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"V6zQRgru\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[10,0],[12],[1,\\\"\\\\n        \\\"],[10,\\\"h4\\\"],[12],[1,[28,[35,2],[\\\"preferences.sound.audioProfile\\\"],null]],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"profile-selection-container\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,3],null,[[\\\"video\\\",\\\"troubleshoot\\\"],[true,false]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"h4\\\"],[12],[1,[28,[35,2],[\\\"preferences.sound.volumeSettings\\\"],null]],[13],[1,\\\"\\\\n\\\"],[41,[33,4],[[[1,\\\"            \\\"],[10,0],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-form-field-select\\\"],[14,\\\"label-position\\\",\\\"screenreader\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"select\\\"],[15,\\\"aria-label\\\",[28,[37,2],[\\\"preferences.sound.selectOutputDevice\\\"],null]],[14,\\\"slot\\\",\\\"input\\\"],[14,3,\\\"select\\\"],[15,\\\"onchange\\\",[28,[37,5],[[30,0],\\\"changeOutputDevice\\\"],null]],[14,4,\\\"select\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,7],[[28,[37,7],[[33,8]],null]],null],null,[[[1,\\\"                            \\\"],[10,\\\"option\\\"],[15,2,[29,[[30,1,[\\\"deviceId\\\"]]]]],[15,\\\"selected\\\",[52,[28,[37,9],[[33,10,[\\\"deviceId\\\"]],[30,1,[\\\"deviceId\\\"]]],null],\\\"selected\\\"]],[12],[1,\\\"\\\\n                                \\\"],[1,[30,1,[\\\"label\\\"]]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[12],[1,[28,[35,2],[\\\"preferences.sound.selectOutputDevice\\\"],null]],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,11,[\\\"phoneEnabled\\\"]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"entry-row\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"entry-values\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-form-field-range\\\"],[14,\\\"data-test-id\\\",\\\"call-slide\\\"],[14,0,\\\"entity-slider\\\"],[14,\\\"label-position\\\",\\\"above\\\"],[14,\\\"value-in-tooltip\\\",\\\"\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                        \\\"],[10,\\\"input\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,\\\"min\\\",[36,12]],[14,\\\"max\\\",\\\"100\\\"],[15,2,[36,13]],[15,\\\"onchange\\\",[28,[37,5],[[30,0],\\\"selectCallVolume\\\"],null]],[14,4,\\\"range\\\"],[12],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,2],[\\\"preferences.sound.callVolume\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"play-sound\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"button\\\"],[14,1,\\\"phone-voice-play\\\"],[15,\\\"aria-label\\\",[28,[37,2],[\\\"preferences.sound.playSoundCalls\\\"],null]],[14,0,\\\"btn btn-link\\\"],[15,\\\"onclick\\\",[28,[37,5],[[30,0],\\\"playCallVolumeSound\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"play-sound-icon\\\"],[14,\\\"icon-name\\\",\\\"control-play\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"placement\\\",\\\"right\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,1],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,[28,[35,2],[\\\"preferences.sound.playSound\\\"],null]],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[1,\\\"            \\\"],[10,0],[14,0,\\\"entry-row\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"entry-values\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-form-field-range\\\"],[14,\\\"data-test-id\\\",\\\"phone-ringer-slide\\\"],[14,0,\\\"entity-slider\\\"],[14,\\\"value-in-tooltip\\\",\\\"\\\"],[14,\\\"label-position\\\",\\\"above\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                        \\\"],[10,\\\"input\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,\\\"min\\\",[36,14]],[14,\\\"max\\\",\\\"100\\\"],[15,2,[36,15]],[15,\\\"onchange\\\",[28,[37,5],[[30,0],\\\"selectRingerVolume\\\"],null]],[14,4,\\\"range\\\"],[12],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,2],[\\\"preferences.sound.phoneRingerVolume\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"play-sound\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"button\\\"],[14,1,\\\"phone-ringer-play\\\"],[15,\\\"aria-label\\\",[28,[37,2],[\\\"preferences.sound.playSoundCallRinger\\\"],null]],[14,0,\\\"btn btn-link\\\"],[15,\\\"onclick\\\",[28,[37,5],[[30,0],\\\"playRingerSound\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"play-sound-icon\\\"],[14,\\\"icon-name\\\",\\\"control-play\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"placement\\\",\\\"right\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,1],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,[28,[35,2],[\\\"preferences.sound.playSound\\\"],null]],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"],[1,\\\"            \\\"],[10,0],[14,0,\\\"entry-row\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"entry-values\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-form-field-range\\\"],[14,\\\"value-in-tooltip\\\",\\\"\\\"],[14,\\\"label-position\\\",\\\"above\\\"],[14,0,\\\"entity-slider\\\"],[14,\\\"data-testid\\\",\\\"call-active-ringer-slide\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                        \\\"],[10,\\\"input\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,\\\"min\\\",[36,16]],[14,\\\"max\\\",\\\"100\\\"],[15,2,[36,17]],[15,\\\"onchange\\\",[28,[37,5],[[30,0],\\\"selectCallActiveRingerVolume\\\"],null]],[14,4,\\\"range\\\"],[12],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,2],[\\\"preferences.sound.callActiveRingerVolume\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"play-sound\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"button\\\"],[14,1,\\\"phone-call-active-ringer-play\\\"],[15,\\\"aria-label\\\",[28,[37,2],[\\\"preferences.sound.playCallActiveRingerVolume\\\"],null]],[14,0,\\\"btn btn-link\\\"],[15,\\\"onclick\\\",[28,[37,5],[[30,0],\\\"playCallActiveRingerSound\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"play-sound-icon\\\"],[14,\\\"icon-name\\\",\\\"control-play\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"placement\\\",\\\"right\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,1],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,[28,[35,2],[\\\"preferences.sound.playSound\\\"],null]],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,18],[[33,11,[\\\"canViewBusinessChat\\\"]],[33,11,[\\\"canGoOnQueue\\\"]]],null],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"entry-row\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"entry-values\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-form-field-range\\\"],[14,\\\"data-test-id\\\",\\\"chat-slide\\\"],[14,\\\"value-in-tooltip\\\",\\\"\\\"],[14,0,\\\"entity-slider\\\"],[14,\\\"label-position\\\",\\\"above\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                        \\\"],[10,\\\"input\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,\\\"min\\\",[36,19]],[14,\\\"max\\\",\\\"100\\\"],[15,2,[36,20]],[15,\\\"onchange\\\",[28,[37,5],[[30,0],\\\"selectChatNotificationVolume\\\"],null]],[14,4,\\\"range\\\"],[12],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,2],[\\\"preferences.sound.chatNotificationVolume\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"play-sound\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"button\\\"],[14,1,\\\"chat-notification-play\\\"],[15,\\\"aria-label\\\",[28,[37,2],[\\\"preferences.sound.playSoundChatNotification\\\"],null]],[14,0,\\\"btn btn-link\\\"],[15,\\\"onclick\\\",[28,[37,5],[[30,0],\\\"playChatNotificationSound\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"play-sound-icon\\\"],[14,\\\"icon-name\\\",\\\"control-play\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"placement\\\",\\\"right\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,1],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,[28,[35,2],[\\\"preferences.sound.playSound\\\"],null]],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[1,\\\"        \\\"],[10,0],[14,0,\\\"entry-row\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"entry-values\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-form-field-range\\\"],[14,\\\"data-test-id\\\",\\\"interaction-slide\\\"],[14,0,\\\"entity-slider\\\"],[14,\\\"value-in-tooltip\\\",\\\"\\\"],[14,\\\"label-position\\\",\\\"above\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                    \\\"],[10,\\\"input\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,\\\"min\\\",[36,21]],[14,\\\"max\\\",\\\"100\\\"],[15,2,[36,22]],[15,\\\"onchange\\\",[28,[37,5],[[30,0],\\\"selectInteractionNotificationVolume\\\"],null]],[14,4,\\\"range\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,2],[\\\"preferences.sound.interactionNotificationVolume\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"play-sound\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"button\\\"],[14,1,\\\"interaction-notification-play\\\"],[15,\\\"aria-label\\\",[28,[37,2],[\\\"preferences.sound.playSoundInteractionNotification\\\"],null]],[14,0,\\\"btn btn-link\\\"],[15,\\\"onclick\\\",[28,[37,5],[[30,0],\\\"playInteractionNotificationSound\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"play-sound-icon\\\"],[14,\\\"icon-name\\\",\\\"control-play\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"placement\\\",\\\"right\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,1],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,[28,[35,2],[\\\"preferences.sound.playSound\\\"],null]],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[1,\\\"        \\\"],[10,0],[14,0,\\\"entry-row\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"entry-values\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-form-field-range\\\"],[14,\\\"data-test-id\\\",\\\"video-slide\\\"],[14,0,\\\"entity-slider\\\"],[14,\\\"value-in-tooltip\\\",\\\"\\\"],[14,\\\"label-position\\\",\\\"above\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                    \\\"],[10,\\\"input\\\"],[14,\\\"slot\\\",\\\"input\\\"],[14,\\\"min\\\",\\\"0\\\"],[14,\\\"max\\\",\\\"100\\\"],[15,2,[36,23]],[15,\\\"onchange\\\",[28,[37,5],[[30,0],\\\"selectVideoNotificationVolume\\\"],null]],[14,4,\\\"range\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,2],[\\\"preferences.sound.videoNotificationVolumeLabel\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"play-sound\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"button\\\"],[14,1,\\\"video-notification-play\\\"],[15,\\\"aria-label\\\",[28,[37,2],[\\\"preferences.sound.playSoundVideoNotification\\\"],null]],[14,0,\\\"btn btn-link\\\"],[15,\\\"onclick\\\",[28,[37,5],[[30,0],\\\"playVideoNotificationSound\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"play-sound-icon\\\"],[14,\\\"icon-name\\\",\\\"control-play\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"placement\\\",\\\"right\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,1],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,[28,[35,2],[\\\"preferences.sound.playSound\\\"],null]],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[14,0,\\\"reset-link\\\"],[12],[1,\\\"\\\\n            \\\"],[11,3],[24,1,\\\"reset-volumes-link\\\"],[24,\\\"role\\\",\\\"button\\\"],[24,6,\\\"#\\\"],[4,[38,5],[[30,0],\\\"resetAllVolumes\\\"],null],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,2],[\\\"preferences.sound.resetLink\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[1,\\\"    \\\"],[10,\\\"h4\\\"],[12],[1,[28,[35,2],[\\\"preferences.sound.ringtones\\\"],null]],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"ringtone-selection-container\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"h5\\\"],[12],[1,[28,[35,2],[\\\"preferences.sound.generalRingtone\\\"],null]],[13],[1,\\\"\\\\n        \\\"],[10,0],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-form-field-select\\\"],[14,1,\\\"ringtone-general-form\\\"],[14,\\\"label-position\\\",\\\"screenreader\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"select\\\"],[14,1,\\\"ringtone-general-select\\\"],[15,\\\"aria-label\\\",[28,[37,2],[\\\"preferences.sound.selectRingtone\\\"],null]],[14,\\\"slot\\\",\\\"input\\\"],[14,3,\\\"select\\\"],[15,\\\"onchange\\\",[28,[37,5],[[30,0],\\\"changeRingtoneSelection\\\"],null]],[14,4,\\\"select\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,7],[[28,[37,7],[[33,24]],null]],null],null,[[[1,\\\"                        \\\"],[10,\\\"option\\\"],[15,2,[29,[[30,2,[\\\"id\\\"]]]]],[15,\\\"selected\\\",[29,[[52,[28,[37,9],[[33,25],[30,2,[\\\"id\\\"]]],null],\\\"selected\\\"]]]],[12],[1,\\\"\\\\n                            \\\"],[1,[30,2,[\\\"label\\\"]]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[2]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[12],[1,[28,[35,2],[\\\"preferences.sound.selectRingtone\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"advanced-mic-settings\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"h4\\\"],[14,0,\\\"expandable-header\\\"],[12],[1,\\\"\\\\n            \\\"],[11,3],[24,\\\"role\\\",\\\"button\\\"],[24,0,\\\"btn btn-link settings-toggle\\\"],[16,\\\"aria-expanded\\\",[29,[[52,[33,26],\\\"true\\\",\\\"false\\\"]]]],[24,6,\\\"#\\\"],[4,[38,5],[[30,0],\\\"toggleAdvancedMicSettings\\\"],null],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,2],[\\\"preferences.sound.advMicSettings\\\"],null]],[1,\\\"\\\\n                \\\"],[10,\\\"i\\\"],[15,0,[29,[\\\"toggle-icon pc \\\",[52,[33,26],\\\"pc-caret-up\\\",\\\"pc-caret-down\\\"]]]],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,26],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"mic-settings-description\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,2],[\\\"preferences.sound.advMicSettingsDescription\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,0],[14,0,\\\"adv-mic-toggle auto-gain\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-toggle\\\"],[14,0,\\\"adv-mic-toggle-button\\\"],[15,\\\"checked\\\",[36,27]],[15,\\\"onkeydown\\\",[28,[37,5],[[30,0],\\\"toggleAutoGain\\\"],null]],[15,\\\"onclick\\\",[28,[37,5],[[30,0],\\\"toggleAutoGain\\\"],null]],[15,\\\"checked-label\\\",[29,[[28,[37,2],[\\\"preferences.sound.autoGain\\\"],null],\\\" \\\",[28,[37,2],[\\\"toggle.on\\\"],null]]]],[15,\\\"unchecked-label\\\",[29,[[28,[37,2],[\\\"preferences.sound.autoGain\\\"],null],\\\" \\\",[28,[37,2],[\\\"toggle.off\\\"],null]]]],[12],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"alert-info\\\"],[14,1,\\\"autoGain-toggle\\\"],[14,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"screenreader-text\\\",[29,[[28,[37,2],[\\\"preferences.sound.autoGainDescription\\\"],null]]]],[12],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"autoGain-toggle\\\"],[14,\\\"placement\\\",\\\"bottom-end\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,1],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,[28,[35,2],[\\\"preferences.sound.autoGainDescription\\\"],null]],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,0],[14,0,\\\"adv-mic-toggle echo-cancellation\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-toggle\\\"],[14,0,\\\"adv-mic-toggle-button\\\"],[15,\\\"checked\\\",[36,28]],[15,\\\"onkeydown\\\",[28,[37,5],[[30,0],\\\"toggleEchoCancellation\\\"],null]],[15,\\\"onclick\\\",[28,[37,5],[[30,0],\\\"toggleEchoCancellation\\\"],null]],[15,\\\"checked-label\\\",[29,[[28,[37,2],[\\\"preferences.sound.echoCancellation\\\"],null],\\\" \\\",[28,[37,2],[\\\"toggle.on\\\"],null]]]],[15,\\\"unchecked-label\\\",[29,[[28,[37,2],[\\\"preferences.sound.echoCancellation\\\"],null],\\\" \\\",[28,[37,2],[\\\"toggle.off\\\"],null]]]],[12],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"alert-info\\\"],[14,1,\\\"echoCancellation-toggle\\\"],[14,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"screenreader-text\\\",[29,[[28,[37,2],[\\\"preferences.sound.echoCancellationDescription\\\"],null]]]],[12],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"echoCancellation-toggle\\\"],[14,\\\"placement\\\",\\\"bottom-end\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,1],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,[28,[35,2],[\\\"preferences.sound.echoCancellationDescription\\\"],null]],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,0],[14,0,\\\"adv-mic-toggle noise-suppression\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-toggle\\\"],[14,0,\\\"adv-mic-toggle-button\\\"],[15,\\\"checked\\\",[36,29]],[15,\\\"onkeydown\\\",[28,[37,5],[[30,0],\\\"toggleNoiseSuppression\\\"],null]],[15,\\\"onclick\\\",[28,[37,5],[[30,0],\\\"toggleNoiseSuppression\\\"],null]],[15,\\\"checked-label\\\",[29,[[28,[37,2],[\\\"preferences.sound.noiseSuppression\\\"],null],\\\" \\\",[28,[37,2],[\\\"toggle.on\\\"],null]]]],[15,\\\"unchecked-label\\\",[29,[[28,[37,2],[\\\"preferences.sound.noiseSuppression\\\"],null],\\\" \\\",[28,[37,2],[\\\"toggle.off\\\"],null]]]],[12],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"alert-info\\\"],[14,1,\\\"noiseSuppression-toggle\\\"],[14,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"screenreader-text\\\",[29,[[28,[37,2],[\\\"preferences.sound.noiseSuppressionDescription\\\"],null]]]],[12],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"noiseSuppression-toggle\\\"],[14,\\\"placement\\\",\\\"bottom-end\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,1],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,[28,[35,2],[\\\"preferences.sound.noiseSuppressionDescription\\\"],null]],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"centered\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"centered-item\\\"],[12],[1,[28,[35,2],[\\\"preferences.sound.enableMicPermission\\\"],null]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[\\\"outputDevice\\\",\\\"ringtone\\\"],false,[\\\"if\\\",\\\"micPermissionGranted\\\",\\\"t\\\",\\\"profile-selection-v2\\\",\\\"hasOutputDevices\\\",\\\"action\\\",\\\"each\\\",\\\"-track-array\\\",\\\"outputDevices\\\",\\\"eq\\\",\\\"currentOutputDevice\\\",\\\"permissions\\\",\\\"minCallVolume\\\",\\\"callVolume\\\",\\\"minRingerVolume\\\",\\\"ringerVolume\\\",\\\"minCallActiveRingerVolume\\\",\\\"callActiveRingerVolume\\\",\\\"or\\\",\\\"minChatNotificationVolume\\\",\\\"chatNotificationVolume\\\",\\\"minInteractionNotificationVolume\\\",\\\"interactionNotificationVolume\\\",\\\"videoNotificationVolume\\\",\\\"ringtones\\\",\\\"ringtoneSelection\\\",\\\"advancedMicSettingsExpanded\\\",\\\"autoGain\\\",\\\"echoCancellation\\\",\\\"noiseSuppression\\\"]]\",\"moduleName\":\"web-directory/components/application-preferences/preferences-sound/template.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"gis7clay\",\"block\":\"[[[10,0],[14,0,\\\"preferences-layout\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"preferences-side-nav\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"h4\\\"],[14,0,\\\"preferences-title\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,0],[\\\"components.navMenu.preferences\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"preferences-nav\\\"],[14,\\\"role\\\",\\\"tablist\\\"],[15,\\\"aria-label\\\",[28,[37,0],[\\\"components.navMenu.preferences\\\"],null]],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,2],[[28,[37,2],[[33,3]],null]],null],null,[[[41,[30,1,[\\\"canShow\\\"]],[[[1,\\\"                    \\\"],[10,\\\"li\\\"],[15,0,[29,[[52,[30,1,[\\\"isActive\\\"]],\\\"active\\\"],\\\" \\\",[30,1,[\\\"key\\\"]]]]],[14,\\\"role\\\",\\\"tab\\\"],[15,1,[29,[\\\"pref-tab-\\\",[30,1,[\\\"key\\\"]]]]],[15,\\\"tabindex\\\",[29,[[52,[30,1,[\\\"isActive\\\"]],\\\"0\\\",\\\"-1\\\"]]]],[15,\\\"aria-selected\\\",[29,[[30,1,[\\\"isActive\\\"]]]]],[14,\\\"aria-controls\\\",\\\"pref-tabpanel\\\"],[15,\\\"onclick\\\",[28,[37,5],[[30,0],\\\"changeTab\\\",[30,1,[\\\"key\\\"]]],null]],[15,\\\"onkeydown\\\",[28,[37,5],[[30,0],\\\"handleTabKeydown\\\",[30,1,[\\\"key\\\"]]],null]],[12],[1,\\\"\\\\n                        \\\"],[10,1],[14,0,\\\"active-indicator\\\"],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                        \\\"],[1,[30,1,[\\\"name\\\"]]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[1]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"preferences-main\\\"],[14,\\\"role\\\",\\\"tabpanel\\\"],[14,1,\\\"pref-tabpanel\\\"],[15,\\\"aria-labelledby\\\",[29,[\\\"pref-tab-\\\",[33,6,[\\\"key\\\"]]]]],[12],[1,\\\"\\\\n        \\\"],[10,0],[15,0,[29,[\\\"preference-tab-\\\",[33,6,[\\\"key\\\"]]]]],[12],[1,\\\"\\\\n            \\\"],[46,[33,6,[\\\"component\\\"]],null,null,null],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[\\\"tab\\\"],false,[\\\"t\\\",\\\"each\\\",\\\"-track-array\\\",\\\"tabs\\\",\\\"if\\\",\\\"action\\\",\\\"currentTab\\\",\\\"component\\\"]]\",\"moduleName\":\"web-directory/components/application-preferences/template.hbs\",\"isStrictMode\":false});","/* global Notify, Notification */\n\nimport { on } from '@ember/object/evented';\n\nimport { later } from '@ember/runloop';\nimport { deprecate } from '@ember/debug';\nimport $ from 'jquery';\nimport { computed, observer, get } from '@ember/object';\nimport { reads, bool, readOnly, alias, and } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport Component from '@ember/component';\nimport { resolve, hash } from 'rsvp';\nimport { getOwner } from '@ember/application';\n\nimport { task, timeout } from 'ember-concurrency';\nimport OpenWindowHandler from 'web-directory/services/apps-api-handlers/open-window-handler';\nimport { isTesting } from 'web-directory/utils/testing';\nimport { POOL_STATES } from '../../models/app-pool';\nimport { openVoltPopout } from 'web-directory/utils/volt-popout';\n\nconst preferencesModalDeprecation = {\n    id: 'directory-core.deprecate-preference-modal-action-bubble',\n    until: '7.0.0',\n    url: 'https://bitbucket.org/inindca/web-directory/src/develop/DEPRECATIONS.md#markdown-header-preference-modal-action-bubbling'\n};\n\nvar ApplicationView = Component.extend({\n    classNameBindings: [\n        ':orgspan-app',\n        'session.authInProgress:authenticating:',\n        'session.isAuthenticated:authenticated:unauthenticated',\n        'session.hasAppAccess:authorized:unauthorized',\n        'session.useNewNav:nav-system-v2:',\n        'application.errorState:application-error',\n        'session.logoutInProgress:logging-out:',\n        'application.currentRouteClass',\n        'application.adminUIContext:adminui-context:directory-context',\n        'application.isPopout:is-popout',\n        'showNavbarAlert:has-incoming-conversation',\n        'webrtcSdkService.videoInvitations.length:has-incoming-conversation',\n        'webrtc.incomingInvitations.length:has-incoming-conversation',\n        'phone.onCall:on-call',\n        'multipanelEnabled'\n    ],\n\n    auditDrawerOpen: false,\n\n    application: service(),\n    ajax: service(),\n    session: service(),\n    chat: service(),\n    store: service(),\n    intl: service(),\n    webrtc: service(),\n    notification: service(),\n    preferences: service(),\n    permissions: service(),\n    settings: service(),\n    sidebar: service(),\n    phone: service(),\n    engage: service(),\n    faxService: service('fax'),\n    relate: service(),\n    apps: service(),\n    webrtcSdkService: service('webrtc-sdk'),\n    ring: service(),\n    streaming: service(),\n    adminNav: service(),\n    pigeon: service(),\n    frameService: service('center-stage-frame'),\n    interaction: service(),\n    acdworkitem: service(),\n    emergencyLocation: service('emergency-location'),\n    primaryVoice: reads('emergencyLocation.primaryVoice'),\n    inbox: service(),\n\n    multipanelEnabled: bool('session.useMultipanel'),\n\n    videoActiveRoom: readOnly('webrtc.activeRoom'),\n\n    ftAcdRingTimeout: computed('session.features', function () {\n        return this.get('session.features')['assignment.audioAlertDuration'];\n    }).readOnly(),\n\n    emergencyLocationOn: reads('session.features.emergencyLocation'),\n    eLocation: reads('emergencyLocation.eLocation'),\n\n    showPreferencesModal: reads('settings.isOpen'),\n\n    alertingConversation: computed(\n        'interaction.alertingInteractions.firstObject',\n        'phone.incomingNonAcdConversations.firstObject',\n        'acdworkitem.alertingWorkitems.firstObject',\n        function () {\n            return (\n                this.get('interaction.alertingInteractions.firstObject') ||\n                this.get('phone.incomingNonAcdConversations.firstObject') ||\n                this.get('acdworkitem.alertingWorkitems.firstObject')\n            );\n        }\n    ),\n\n    showNewInteractionDialog: alias('interaction.showInteractionModal'),\n    activeTab: alias('interaction.modalActiveTab'),\n    outboundMedia: alias('interaction.outboundMedia'),\n\n    showAlertingIcon: computed('permissions.hasReportingAlertAccess', 'session.hasTrusteeAccess', function () {\n        // Make sure we have the permissions to view alerting and that we are not a trustee, who has no need for alerting\n        return this.get('permissions.hasReportingAlertAccess') && !this.get('session.hasTrusteeAccess');\n    }),\n\n    chatEnabled: reads('chat.enabled'),\n    showAdminAuditFooter: and('application.isAdminRoute', 'permissions.canViewAudits'),\n\n    enableAlertablePresencesOverrides: computed('session.features', function () {\n        const features = this.get('session.features');\n        return features && features['PURE-5149_ui_enableAlertablePresencesOverrides'];\n    }),\n\n    showIncomingAnswerToast: computed('application.session.person', 'enableAlertablePresencesOverrides', function () {\n        if (this.enableAlertablePresencesOverrides) {\n            return true;\n        }\n        return this.get('application.session.person.isNotBusy');\n    }),\n\n    willDestroyElement() {\n        this._super(...arguments);\n        $(window).off(`.${this.elementId}`);\n        if (this.copyVoltConferenceBtn) {\n            this.copyVoltConferenceBtn.destroy();\n        }\n    },\n\n    standaloneHandlers: computed(function () {\n        const handlers = [];\n\n        handlers.push(\n            OpenWindowHandler.create(\n                {\n                    isActiveApp: id => id === this.activeStandaloneAppId\n                },\n                getOwner(this).ownerInjection()\n            )\n        );\n        return handlers;\n    }),\n\n    widgetHandlers: computed(function () {\n        const handlers = [];\n\n        handlers.push(\n            OpenWindowHandler.create(\n                {\n                    isActiveApp: id => id === this.activeWidgetAppId\n                },\n                getOwner(this).ownerInjection()\n            )\n        );\n        return handlers;\n    }),\n\n    // shows/hides loader in the center-stage container.\n    showLoader: reads('application.showLoader'),\n    trialSupport: reads('application.showTrialSupport'),\n\n    actions: {\n        answerAcdInteraction() {\n            this.interaction.answerInteraction();\n        },\n        openAcdInteraction() {\n            this.interaction.openAcdInteraction();\n        },\n        sendToVoicemail(conversation) {\n            this.phone.sendToVoicemail(conversation);\n            const conversationId = conversation.get('id');\n            const hostedContext = this.get('application.hostedContext');\n            if (hostedContext) {\n                hostedContext.dismissNotification(conversationId);\n            }\n        },\n        answerUcCall(conversation) {\n            this.phone.answer(conversation);\n        },\n        enable(notification) {\n            Notify.requestPermission();\n            const preferences = this.preferences;\n            preferences.getPreference('notifications.global').then((global = {}) => {\n                global.notify = true;\n                preferences.setPreference('notifications.global', global);\n            });\n            notification.hide();\n\n            if (Notification.permission === 'denied') {\n                this.notification.info(\n                    null,\n                    this.intl.safestring('preferences.notifications.checkBrowser').toString(),\n                    {\n                        target: this,\n                        hideAfter: 30\n                    }\n                );\n            }\n        },\n\n        cancel(notification) {\n            notification.hide();\n        },\n\n        neverAgain(notification) {\n            const preferences = this.preferences;\n            preferences.getPreference('notifications.global').then((global = {}) => {\n                global.notificationPrompt = false;\n                preferences.setPreference('notifications.global', global);\n            });\n            notification.hide();\n        },\n\n        refreshApp() {\n            window.location.reload(true);\n        },\n\n        showAdminModal(src) {\n            this.set('showAdminModal', true);\n            this.set('adminModalSrc', src);\n        },\n\n        closeWebrtcDebugModal() {\n            this.set('webrtc.showDebugModal', false);\n        },\n\n        closeAdminModal() {\n            this.set('showAdminModal', false);\n        },\n\n        closeMobileModal() {\n            this.set('application.offerMobileApp', false);\n        },\n\n        openPreferencesModal() {\n            deprecate(\n                'Please use \"services:settings.open()\" to open the preferences modal.',\n                false,\n                preferencesModalDeprecation\n            );\n            this.settings.open();\n        },\n\n        closePreferencesModal() {\n            deprecate(\n                'Please use \"services:settings.close()\" to close the preferences modal.',\n                false,\n                preferencesModalDeprecation\n            );\n            this.settings.close();\n        },\n\n        safeClosePreferencesModal() {\n            this.settings.close();\n        },\n\n        closeTrialSupport() {\n            this.application.dismissTrialSupport();\n        },\n\n        async endCallsAndInvalidateSession() {\n            let webrtc = this.webrtc;\n            webrtc.get('conversations').forEach(function (conversation) {\n                webrtc.endConversation({ jid: conversation.get('jid') });\n            });\n            await this.webrtcSdkService.endAllSoftphoneSessions();\n            let session = this.session;\n            later(session, session.invalidate, 500);\n        },\n\n        immediatelyResubscribe() {\n            // trigger subscribe request\n            this.pigeon._registerTopics();\n            this.set('session.shouldWarnNoLongerSubscribed', false);\n        },\n\n        engageNavigate(data, options = {}) {\n            this.engage.handleNavigation(data, options);\n        },\n\n        engageRedirect(data) {\n            this.engage.handleRedirect(data);\n        },\n\n        engageRegisterNavEntries(data) {\n            this.engage.registerNavEntries(data);\n        },\n\n        engageDocumentFax(data) {\n            if (this.get('phone.enabled')) {\n                this.sidebar.togglePanelSubstate('callControls', 'currentTab', 'fax');\n                this.sidebar.openPanel('callControls');\n                this.set('faxService.documentData', data);\n            }\n        },\n\n        engageHelpURL(data) {\n            this.engage.setHelpURL(data);\n        },\n\n        engageInteract() {\n            if (this.get('sidebar.communicationPanel') !== 'acdInteractions') {\n                this.sidebar.togglePanel('acdInteractions');\n            }\n        },\n\n        engagePhoneSelection() {\n            if (this.get('phone.enabled')) {\n                this.sidebar.togglePanelSubstate('callControls', 'currentTab', 'followMeSettings');\n                this.sidebar.openPanel('callControls');\n            }\n        },\n\n        engageSetBreadcrumb(data) {\n            this.engage.setBreadcrumb(data);\n        },\n\n        showInteractionDetails(data) {\n            this.engage.handleNavigation(`#admin/interactions/${data.conversationId}`);\n        },\n\n        relateNavigate(data) {\n            this.relate.handleNavigation(data);\n        },\n\n        relateRedirect(data) {\n            this.relate.handleRedirect(data);\n        },\n\n        relateRegisterNavEntries(data) {\n            this.relate.registerNavEntries(data);\n        },\n\n        answerVideo(invitation) {\n            this.webrtc.answerVideo(invitation);\n            this.sendAction('openChatRoomWithVideo', invitation.get('room.jid'));\n        },\n\n        declineVideo(invitation) {\n            this.webrtc.declineVideo(invitation);\n        },\n\n        /**\n         * Answer a video invitation from webrtc-sdk by opening Volt in a popout window\n         */\n        answerVideoInvitation(invitation) {\n            const roomJid = invitation.get('roomJid') || invitation.get('originalRoomJid');\n            const hostedContext = this.get('application.hostedContext');\n            const isHosted = (hostedContext && hostedContext.isHosted && hostedContext.isHosted()) || false;\n\n            // Remove the invitation from the list\n            this.webrtcSdkService.removeVideoInvitation(invitation);\n            this.ring.stopRingtone();\n\n            // Open Volt in a popout window\n            if (roomJid) {\n                openVoltPopout(roomJid, { hosted: isHosted });\n            }\n        },\n\n        /**\n         * Decline a video invitation from webrtc-sdk\n         */\n        declineVideoInvitation(invitation) {\n            this.webrtcSdkService.declineVideoInvitation(invitation);\n            this.ring.stopRingtone();\n        },\n\n        answer(conversation) {\n            if (conversation.get('isAgentCall') && !this.get('sidebar.showAcdInteractions')) {\n                this.sidebar.openPanel('acdInteractions');\n            } else if (!conversation.get('isAgentCall') && this.get('sidebar.showAcdInteractions')) {\n                this.sidebar.openPanel('callControls');\n            }\n            this.phone.answer(conversation);\n            const conversationId = conversation.get('id');\n            const hostedContext = this.get('application.hostedContext');\n            if (hostedContext) {\n                hostedContext.dismissNotification(conversationId);\n            }\n        },\n\n        endCall() {\n            this.phone.endCall();\n        },\n\n        decline(conversation) {\n            this.phone.sendToVoicemail(conversation);\n            const conversationId = conversation.get('id');\n            const hostedContext = this.get('application.hostedContext');\n            if (hostedContext) {\n                hostedContext.dismissNotification(conversationId);\n            }\n\n            const pendingSession = this.get('webrtc.pendingSessions').filter(session => {\n                return session.callInfo && session.callInfo.conversationId === conversationId;\n            });\n            const cancelPendingSession = this.webrtc._cancelPendingSession.bind(this);\n            pendingSession.forEach(cancelPendingSession);\n        },\n\n        closeRelateFrame() {\n            this.relate.closeRelateFrame();\n        },\n\n        profileVerified(data) {\n            this.relate.profileVerified(data.verificationRelevantData);\n        },\n\n        onWidgetAppSelectionChange(widgetAppId) {\n            if (this.get('sidebar.showApps')) {\n                // Only update the panel if the apps panel is open; otherwise, it clobbers other panel restores\n                this.sidebar.openAppsPanel(widgetAppId);\n            }\n        },\n\n        onWidgetAppInstanceApiCall(apiCall) {\n            this.apps.handleAppApiCall(apiCall, this.widgetHandlers);\n        },\n\n        onStandaloneAppInstanceApiCall(apiCall) {\n            this.apps.handleAppApiCall(apiCall, this.standaloneHandlers);\n        },\n\n        setActiveTab(media) {\n            this.get('interaction.setModalState').perform('activeTab', media);\n        },\n\n        openAlertInbox() {\n            this.sidebar.openPanel('notificationInbox');\n            this.inbox.set('inboxTabChoice', 'reportingAlerts');\n        },\n\n        closePermissionsModal(requestAdditionalPermissions = false) {\n            this.set('webrtcSdkService.showPermissionsModal', false);\n            if (requestAdditionalPermissions) {\n                this.webrtcSdkService.requestAdditionalPermissions();\n            }\n        },\n\n        answerWorkitemInteraction() {\n            const alertingWorkitem = this.get('acdworkitem.alertingWorkitems.firstObject');\n\n            if (alertingWorkitem) {\n                this.acdworkitem\n                    .answer(alertingWorkitem)\n                    .then(() => {\n                        this.interaction.openAcdInteraction();\n                        this.acdworkitem.handleWorkitemAnsweredEvent(alertingWorkitem);\n                    })\n                    .catch(error => console.error('Failed to answer workitem interaction.', { error }));\n            }\n        }\n    },\n\n    isPopout: reads('application.isPopout'),\n\n    showNavbarAlert: computed('phone.showNavbarAlert', function () {\n        return this.get('phone.showNavbarAlert');\n    }),\n\n    showAppChrome: computed(\n        'session.isAuthenticated',\n        'session.hasAppAccess',\n        'application.{errorState,adminUIContext}',\n        function () {\n            return (\n                this.get('session.isAuthenticated') &&\n                this.get('session.hasAppAccess') &&\n                !this.get('application.errorState') &&\n                !this.get('application.adminUIContext')\n            );\n        }\n    ),\n\n    currentRouteClass: computed('application.currentRouteName', function () {\n        var name = this.get('application.currentRouteName');\n        if (name) {\n            return name.replace(/[\\.\\/]+/g, '-');\n        }\n\n        return '';\n    }),\n\n    closeChatConversationView: observer('permissions.canViewBusinessChat', 'sidebar.showConversations', function () {\n        if (this.get('sidebar.showConversations') && !this.get('permissions.canViewBusinessChat')) {\n            this.sidebar.closePanel();\n        }\n    }),\n\n    activeStandaloneAppId: computed('apps.standaloneAppPool.currState', function () {\n        let result = null;\n\n        let currPoolState = this.get('apps.standaloneAppPool.currState');\n        if (currPoolState && currPoolState.name === POOL_STATES.SHOWING_APP) {\n            result = currPoolState.details.appId;\n        }\n\n        return result;\n    }),\n\n    activeWidgetAppId: computed('apps.widgetAppPool.currState', function () {\n        let result = null;\n\n        let currPoolState = this.get('apps.widgetAppPool.currState');\n        if (currPoolState && currPoolState.name === POOL_STATES.SHOWING_APP) {\n            result = currPoolState.details.appId;\n        }\n\n        return result;\n    }),\n\n    currentRouteChanged: observer('application.currentRouteName', function () {\n        window.scrollTo(0, 0);\n        this.frameService.updateActiveRoute();\n    }),\n\n    askForNotificationsPermission: on('didInsertElement', function () {\n        if (isTesting) return;\n\n        const notificationsDisabled = !this.preferences.get('notifications.global.notify');\n        const promptEnabled = this.preferences.get('notifications.global.notificationPrompt');\n        const intl = this.intl;\n        if (Notify.isSupported() && !this.get('application.adminUIContext')) {\n            if ((Notify.needsPermission || notificationsDisabled) && promptEnabled) {\n                this.notification.info(null, intl.safestring('notification.app.enablePrompt').toString(), {\n                    target: this,\n                    tag: 'notification-request',\n                    hideAfter: 30,\n                    actionHandlers: {\n                        enable: intl.safestring('notification.app.enable').toString(),\n                        cancel: intl.safestring('common.cancel').toString(),\n                        neverAgain: intl.safestring('notification.app.neverAgain').toString()\n                    }\n                });\n            }\n        }\n\n        // Periodically reload feature toggles\n        if (!isTesting) {\n            $(window).on(\n                `click.${this.elementId}`,\n                this._checkApplicationVersionTask.perform.bind(this._checkApplicationVersionTask)\n            );\n            // this.get('_queueFtUpdate').perform();\n        }\n\n        //ignore all drag and drop events that haven't been handled\n        $(window).on(`dragover.${this.elementId}`, this._ignoreEvent.bind(this));\n        $(window).on(`drop.${this.elementId}`, this._ignoreEvent.bind(this));\n    }),\n\n    _checkApplicationVersionTask: task(function* () {\n        yield this._checkApplicationVersion();\n        // Re-check application version every 30 minutes (30 * 60s * 1000ms)\n        yield timeout(30 * 60 * 1000);\n    }).drop(),\n\n    _ignoreEvent: function (e) {\n        e = e || event;\n        e.preventDefault();\n    },\n\n    isFirstFire: true,\n    _checkApplicationVersion: function () {\n        // Skip the first debounced fire, the app was just loaded.\n        if (this.isFirstFire) {\n            this.set('isFirstFire', false);\n            return resolve();\n        }\n\n        const intl = this.intl;\n        const ajax = this.ajax;\n        const currentVersionHtml = this.get('application.semver');\n\n        let currentStreamingServiceVersion = this.get('streaming.connection.manifestVersion');\n        let streamingVersionURL = '/static-realtime-js/manifest.json';\n\n        console.info('Checking for new build', { currentVersionHtml, currentStreamingServiceVersion });\n\n        return hash({\n            html: ajax.request(window.location.href, { dataType: 'html' }),\n            streaming: ajax.request(streamingVersionURL, { dataType: 'text' })\n        })\n            .then(hash => {\n                if (hash) {\n                    var remoteHtmlVersion, remoteStreamingServiceVersion;\n                    if (hash.html) {\n                        var latestEnv = $(hash.html)\n                            .filter('meta[name=\"web-directory/config/environment\"]')\n                            .attr('content');\n                        if (latestEnv) {\n                            try {\n                                // Must use deprecated 'unescape' method because ember-cli encodes config with 'escape'\n                                // See https://github.com/ember-cli/ember-cli/issues/6598\n                                remoteHtmlVersion = get(JSON.parse(window.unescape(latestEnv)), 'APP.semver');\n                            } catch (err) {\n                                console.error('Failed to parse version for upgrade check.', {\n                                    error: err\n                                });\n                            }\n                        }\n                    }\n                    var isHtmlDifferent = remoteHtmlVersion && currentVersionHtml !== remoteHtmlVersion;\n\n                    if (hash.streaming) {\n                        try {\n                            remoteStreamingServiceVersion = JSON.parse(hash.streaming).version;\n                        } catch (error) {\n                            console.error('Failed to fetch realtime manifest version: ', { error });\n                        }\n                    }\n                    var isStreamingServiceDifferent =\n                        remoteStreamingServiceVersion &&\n                        currentStreamingServiceVersion !== remoteStreamingServiceVersion;\n\n                    if (isHtmlDifferent || isStreamingServiceDifferent) {\n                        console.info('Remote version is not the same', {\n                            currentVersionHtml,\n                            remoteHtmlVersion,\n                            currentStreamingServiceVersion,\n                            remoteStreamingServiceVersion\n                        });\n\n                        this.notification.info(null, intl.safestring('notification.app.refresh').toString(), {\n                            target: this,\n                            tag: 'app-update',\n                            hideAfter: null,\n                            actionHandlers: {\n                                refreshApp: intl.safestring('common.yes').toString(),\n                                cancel: intl.safestring('common.no').toString()\n                            }\n                        });\n                    } else {\n                        console.info('Remote versions are the same.');\n                    }\n                }\n            })\n            .catch(function () {\n                console.warn('Failed to perform remote version check.');\n            });\n    }\n});\n\nexport default ApplicationView;\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"KKzj30tM\",\"block\":\"[[[10,0],[14,1,\\\"modal-destination\\\"],[12],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[1,[34,0]],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,2],[[33,3],[28,[37,4],[[33,5,[\\\"isScreenRecordingPopout\\\"]]],null]],null],[[[1,\\\"\\\\n    \\\"],[10,\\\"main\\\"],[15,0,[29,[\\\"action-panels \\\",[52,[33,6,[\\\"sidebarExpanded\\\"]],\\\"communication-sidebar-expanded\\\"]]]],[12],[1,\\\"\\\\n        \\\"],[10,1],[14,1,\\\"skip-link-main-target\\\"],[14,\\\"tabindex\\\",\\\"-1\\\"],[12],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,2],[[33,7],[33,8,[\\\"person\\\",\\\"jid\\\"]]],null],[[[1,\\\"            \\\"],[10,\\\"section\\\"],[15,0,[29,[\\\"action-panel conversations\\\\n                    \\\",[52,[33,9,[\\\"showingVideo\\\"]],\\\"volt-conversations\\\"],\\\"\\\\n                    \\\",[52,[51,[33,6,[\\\"showConversations\\\"]]],\\\"hidden-panel\\\"]]]],[12],[1,\\\"\\\\n                \\\"],[1,[34,11]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n        \\\"],[10,\\\"section\\\"],[15,0,[29,[\\\"action-panel acd-interactions \\\",[52,[51,[33,6,[\\\"showAcdInteractions\\\"]]],\\\"hidden-panel\\\"]]]],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,12],null,[[\\\"active\\\",\\\"isPopout\\\",\\\"onQueue\\\",\\\"selectedInteraction\\\",\\\"requestedInteraction\\\",\\\"activeInteractions\\\",\\\"activeWorkitems\\\",\\\"panelsOverrideObject\\\",\\\"emergencyLocationData\\\",\\\"emergencyLocationOn\\\",\\\"streamingConnected\\\"],[[33,6,[\\\"showAcdInteractions\\\"]],[33,5,[\\\"isPopout\\\"]],[33,8,[\\\"person\\\",\\\"isOnQueue\\\"]],[33,13,[\\\"selectedInteraction\\\"]],[33,13,[\\\"requestedInteraction\\\"]],[33,13,[\\\"activeInteractions\\\"]],[33,14,[\\\"activeWorkitems\\\"]],[33,15],[33,16,[\\\"emergencyLocationData\\\"]],[33,17],[33,18,[\\\"connectedV2\\\"]]]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[42,[28,[37,20],[[28,[37,20],[[33,21,[\\\"softphoneConversations\\\"]]],null]],null],null,[[[41,[30,1,[\\\"conversationId\\\"]],[[[1,\\\"            \\\"],[1,[28,[35,22],null,[[\\\"conversation\\\"],[[30,1]]]]],[1,\\\"\\\\n\\\"]],[]],null]],[1]],null]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,23],[[33,5,[\\\"adminUIContext\\\"]],[33,5,[\\\"isPopout\\\"]]],null],[[[1,\\\"    \\\"],[10,0],[15,0,[29,[\\\"application-scroll \\\",[36,24]]]],[12],[1,\\\"\\\\n        \\\"],[10,1],[14,1,\\\"orgspan-target\\\"],[14,\\\"tabindex\\\",\\\"-1\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,1,\\\"orgspan\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,25],null,[[\\\"route\\\",\\\"visible\\\",\\\"clientConfig\\\"],[[33,26,[\\\"activeRoute\\\"]],[52,[33,26,[\\\"activeRoute\\\"]],true,false],[33,26,[\\\"activeCenterStageClients\\\"]]]]]],[1,\\\"\\\\n\\\"],[41,[51,[33,26,[\\\"activeRoute\\\"]]],[[[1,\\\"                \\\"],[18,2,null],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,28],[[[1,\\\"    \\\"],[1,[34,29]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[1,[28,[35,30],null,[[\\\"ftAcdRingTimeout\\\",\\\"alertingConversation\\\",\\\"isOnConnectedCall\\\",\\\"hostedContext\\\",\\\"browserHidden\\\",\\\"isScreenRecordingPopout\\\",\\\"publicApiUser\\\",\\\"notificationOutputDeviceId\\\",\\\"isInteractionViewOpen\\\",\\\"actionAnswerInteraction\\\",\\\"actionOpenAcdInteraction\\\",\\\"actionToVoicemail\\\",\\\"actionAnswer\\\",\\\"actionAnswerWorkitemInteraction\\\"],[[33,31],[33,32],[33,33,[\\\"isOnConnectedCall\\\"]],[33,5,[\\\"hostedContext\\\"]],[33,5,[\\\"browserHidden\\\"]],[33,5,[\\\"isScreenRecordingPopout\\\"]],[33,8,[\\\"publicApiUser\\\"]],[33,21,[\\\"notificationOutputDeviceId\\\"]],[28,[37,34],[[33,6,[\\\"communicationPanel\\\"]],\\\"acdInteractions\\\"],null],[28,[37,35],[[30,0],\\\"answerAcdInteraction\\\"],null],[28,[37,35],[[30,0],\\\"openAcdInteraction\\\"],null],[28,[37,35],[[30,0],\\\"sendToVoicemail\\\"],null],[28,[37,35],[[30,0],\\\"answerUcCall\\\"],null],[28,[37,35],[[30,0],\\\"answerWorkitemInteraction\\\"],null]]]]],[1,\\\"\\\\n\\\\n\\\"],[1,[34,36]],[1,\\\"\\\\n\\\\n\\\"],[1,[34,37]]],[\\\"conversation\\\",\\\"&default\\\"],false,[\\\"alerting-container\\\",\\\"if\\\",\\\"and\\\",\\\"showAppChrome\\\",\\\"not\\\",\\\"application\\\",\\\"sidebar\\\",\\\"chatEnabled\\\",\\\"session\\\",\\\"videoActiveRoom\\\",\\\"unless\\\",\\\"chat-frame-router\\\",\\\"acd-interactions-panel\\\",\\\"interaction\\\",\\\"acdworkitem\\\",\\\"panelsOverrideObject\\\",\\\"emergencyLocation\\\",\\\"emergencyLocationOn\\\",\\\"streaming\\\",\\\"each\\\",\\\"-track-array\\\",\\\"webrtc\\\",\\\"webrtc-softphone-audio\\\",\\\"or\\\",\\\"currentRouteClass\\\",\\\"center-stage-frame\\\",\\\"frameService\\\",\\\"yield\\\",\\\"trialSupport\\\",\\\"free-trial-support\\\",\\\"alerting-manager\\\",\\\"ftAcdRingTimeout\\\",\\\"alertingConversation\\\",\\\"phone\\\",\\\"eq\\\",\\\"action\\\",\\\"global-modal\\\",\\\"global-side-panel\\\"]]\",\"moduleName\":\"web-directory/components/application-view/template.hbs\",\"isStrictMode\":false});","import EmberObject, { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@ember/component';\nimport RSVP from 'rsvp';\nimport _ from 'lodash';\nimport { POOL_STATES, APPS_RELOADED_EVENT } from '../../models/app-pool';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['apps-sidebar-panel item-toggle'],\n\n    session: service(),\n\n    // Attributes\n    appPool: null,\n    initialAutoSelect: false,\n    initialSelectedAppId: null,\n    appSelectionChanged: null,\n\n    // Public Props\n    widgetApps: [],\n\n    // Private Props\n    _prevPool: null,\n    _initialSelectAttempted: false,\n\n    init() {\n        this._super(...arguments);\n\n        this.set('widgetApps', []);\n        this._processAppPoolAttr();\n    },\n\n    didUpdateAttrs() {\n        this._super(...arguments);\n\n        this._processAppPoolAttr();\n    },\n\n    actions: {\n        onDeletedAppClose() {\n            // NICETOHAVE Select the last used app instead of first in the list\n            this._autoSelect();\n        }\n    },\n\n    itemToggled(_, value) {\n        this.setActive(value);\n    },\n\n    _processAppPoolAttr() {\n        let prevPool = this._prevPool;\n        let currPool = this.appPool;\n\n        if (prevPool !== currPool) {\n            if (prevPool !== null) {\n                prevPool.off(APPS_RELOADED_EVENT, this, '_onAppsReloaded');\n            }\n\n            if (!currPool) {\n                // Clear out the state so nothing shows\n                this.set('widgetApps', []);\n            } else {\n                let initialAutoSelect = this.initialAutoSelect;\n\n                // Mark as attempted if no initial selection is requested\n                this.set('_initialSelectAttempted', !initialAutoSelect);\n\n                this._setWidgetApps()\n                    .then(() => {\n                        if (initialAutoSelect) {\n                            this._autoSelect(this.initialSelectedAppId);\n                            this.set('_initialSelectAttempted', true);\n                        }\n                    })\n                    .catch(reason => {\n                        // Should only occur if the initial pool load failed\n                        // Log the failure but subscribe to the reload event to support the initial load recovery\n                        this.logger.error('Failed to load widget apps for initial tab load', reason);\n                    })\n                    .finally(() => {\n                        currPool.on(APPS_RELOADED_EVENT, this, '_onAppsReloaded');\n                    });\n            }\n\n            this.set('_prevPool', currPool);\n        }\n    },\n\n    _onAppsReloaded() {\n        if (this.isDestroying || this.isDestroyed) {\n            return;\n        }\n\n        this._setWidgetApps()\n            .then(() => {\n                // Only reattempt initial selection when recovering from initial load failure\n                // _initialSelectAttempted is only false if an initial selection was requested and initial load failed\n                if (!this._initialSelectAttempted) {\n                    this._autoSelect(this.initialSelectedAppId);\n                    this.set('_initialSelectAttempted', true);\n                }\n            })\n            .catch(reason => {\n                // Pool and tab state should remain unchanged\n                // Highly unlikely because the app fetch should have already been successful and the pool's backing promise should still be cached\n                this.logger.error('Failed to load widget apps for tabs on pool reload event', reason);\n            });\n    },\n\n    _setWidgetApps() {\n        return this.appPool\n            .findAllApps()\n            .then(widgetApps => {\n                if (widgetApps.length > 1) {\n                    widgetApps.sort((app1, app2) => {\n                        return app1.get('name').localeCompare(app2.get('name'));\n                    });\n                }\n\n                this.set('widgetApps', widgetApps);\n\n                return widgetApps;\n            })\n            .catch(reason => {\n                this.set('widgetApps', []);\n\n                return RSVP.reject(reason);\n            });\n    },\n\n    _autoSelect(prefWidgetId) {\n        let widgetApps = this.widgetApps;\n\n        let prefWidget = _.find(widgetApps, { id: prefWidgetId });\n        if (!prefWidget && !_.isEmpty(widgetApps)) {\n            prefWidget = widgetApps[0];\n        }\n\n        if (prefWidget) {\n            this.setActive(prefWidget.get('id'));\n        }\n    },\n\n    setActive(widgetAppId) {\n        let appPool = this.appPool;\n        let currShownAppId = this.activeWidgetAppId;\n\n        if (!currShownAppId || currShownAppId !== widgetAppId) {\n            let hideCurrAppPromise = RSVP.resolve();\n            if (currShownAppId) {\n                hideCurrAppPromise = appPool.hideApp(appPool.get('currState.details.instanceId')).catch(poolState => {\n                    // Ignore the failure as we still want to show the new app\n                    // Log this as it should not happen\n                    this.logger.error(\n                        `Failed to hide existing app with instanceId ${appPool.get(\n                            'currState.details.instanceId'\n                        )} when trying to show new appId, ${widgetAppId}. Pool State:`,\n                        poolState\n                    );\n                    return RSVP.resolve();\n                });\n            }\n\n            hideCurrAppPromise\n                .then(() => appPool.showApp(widgetAppId))\n                .then(() => {\n                    let notifyFn = this.appSelectionChanged;\n                    if (typeof notifyFn === 'function') {\n                        notifyFn(widgetAppId);\n                    }\n                })\n                .catch(reason => {\n                    // Pool state will alrady be updated and ui will show appropriate error and tab\n                    // Log this as it should not happen\n                    this.logger.error(`Failed to show app with id ${this.widgetAppId}`, reason);\n                });\n        }\n    },\n\n    activeWidgetAppId: computed('appPool.currState', function () {\n        let result = null;\n\n        let currPoolState = this.get('appPool.currState');\n        if (currPoolState && currPoolState.name === POOL_STATES.SHOWING_APP) {\n            result = currPoolState.details.appId;\n        }\n\n        return result;\n    }),\n\n    widgetAppTabConfigs: computed('widgetApps', function () {\n        let apps = [];\n        this.widgetApps.forEach(widgetApp => {\n            let icon;\n            let supplementalClassNames = '';\n            if (widgetApp.get('assets.monochromicIcon')) {\n                icon = widgetApp.get('assets.monochromicIcon');\n                supplementalClassNames = 'monochromic-icon';\n            } else if (widgetApp.get('assets.icon')) {\n                icon = widgetApp.get('assets.icon');\n            } else {\n                supplementalClassNames = 'monochromic-icon';\n            }\n            apps.pushObject(\n                EmberObject.create({\n                    icon,\n                    showTab: true,\n                    supplementalClassNames,\n                    id: widgetApp.get('id'),\n                    name: widgetApp.get('name')\n                })\n            );\n        });\n        return apps;\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"qB7zbB/4\",\"block\":\"[[[10,0],[14,0,\\\"panel-header item-toggle\\\"],[12],[1,\\\"\\\\n    \\\"],[1,[28,[35,0],null,[[\\\"toggleItemConfigs\\\",\\\"selection\\\",\\\"attentionStarburst\\\",\\\"onchange\\\"],[[33,1],[33,2],[33,3,[\\\"appAttentionCounts\\\"]],[28,[37,4],[[30,0],[33,5]],null]]]]],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"panel-content\\\"],[14,\\\"tabindex\\\",\\\"-1\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"tab-content\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"tab-pane active\\\"],[14,\\\"role\\\",\\\"tabpanel\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,6],null,[[\\\"appPool\\\",\\\"class\\\",\\\"onAppInstanceApiCall\\\",\\\"onDeletedAppClose\\\",\\\"appsSdkEnabled\\\"],[[33,3],\\\"widget-app-pool\\\",[33,7],[28,[37,4],[[30,0],\\\"onDeletedAppClose\\\"],null],true]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"toggle-item-bar\\\",\\\"widgetAppTabConfigs\\\",\\\"activeWidgetAppId\\\",\\\"appPool\\\",\\\"action\\\",\\\"itemToggled\\\",\\\"app-pool\\\",\\\"onAppInstanceApiCall\\\"]]\",\"moduleName\":\"web-directory/components/apps-sidebar-panel/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { inject } from '@ember/service';\nimport appUtils from 'web-directory/utils/apps';\nimport { assertNever } from 'web-directory/utils/types';\nimport {\n    AppPool,\n    GcAppContext,\n    AppDef,\n    TraceLoggerLevel,\n    AppLogDetails,\n    AppLogger,\n    MessageHandlerChain,\n    buildChainFailureLogDetails\n} from '@genesys/apps-v2-host';\nimport { AppViewStackHostLayoutController } from '@genesys/apps-v2-host-layout';\nimport { validatePortNumber } from 'web-directory/utils/app-provider';\nimport {\n    buildFindInstanceState,\n    buildFindWorkerInstance\n} from 'web-directory/services/apps-v2-api-handlers/apps-v2-sdk-handler';\nimport { HawkMessageHandler } from 'web-directory/services/apps-v2-api-handlers/hawk-message-handler';\nimport { ToastMessageHandler } from 'web-directory/services/apps-v2-api-handlers/toast-handler';\nimport { MonitoringMessageHandler } from 'web-directory/services/apps-v2-api-handlers/monitoring-message-handler';\nimport { addPageAction } from 'web-directory/utils/newrelic';\nimport { OpenWindowHandler } from 'web-directory/services/apps-v2-api-handlers/open-window-handler';\nimport { AssociateActivityHandler } from 'web-directory/services/apps-v2-api-handlers/associate-activity-message-handler';\nimport { LegacyMessageHandler } from 'web-directory/services/apps-v2-api-handlers/legacy-message-handler';\n\ntype NullType<T> = T | null;\ntype EmptyObject<T> = T | {};\n\nexport default Component.extend({\n    classNames: ['myActivity'],\n\n    application: inject('application'),\n    intl: inject('intl'),\n    permissions: inject('permissions'),\n    session: inject('session'),\n    streaming: inject('streaming'),\n    notification: inject('notification'),\n    logger: inject('stash-logger'),\n    appsService: inject('apps'),\n    phoneService: inject('phone'),\n    acdEmailService: inject('acdemail'),\n    acdSmsService: inject('acdsms'),\n    commandNav: inject('command-nav'),\n    store: inject('store'),\n\n    appPool: null as NullType<AppPool>,\n    layoutController: null as NullType<AppViewStackHostLayoutController>,\n\n    gadgetTargetOrigin: computed<string>('application.runtime', function () {\n        const runtimeEnv = this.get('application.runtime');\n\n        if (runtimeEnv.local) {\n            return `https://apps.${runtimeEnv.publicDomainName}`;\n        }\n\n        return window.location.origin;\n    }),\n\n    logToStashLogger(level: TraceLoggerLevel, message: string, appLogDetails?: AppLogDetails) {\n        const logMessage = appUtils.buildLogMsg(message);\n        const details = appUtils.buildStashLoggerDetails(appLogDetails?.getLogs());\n\n        switch (level) {\n            case 'info':\n                this.get('logger').info(logMessage, details);\n                break;\n            case 'debug':\n                this.get('logger').debug(logMessage, details);\n                break;\n            case 'warn':\n                this.get('logger').warn(logMessage, details);\n                break;\n            case 'error':\n                this.get('logger').error(logMessage, details);\n                break;\n            default:\n                assertNever(level);\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n\n        try {\n            const appDef = this.getAppDef();\n            const logToStashLogger = this.get('logToStashLogger').bind(this);\n            const logger: AppLogger = {\n                info: (msg, details) => {\n                    logToStashLogger('info', msg, details);\n                },\n                debug: (msg, details) => {\n                    logToStashLogger('debug', msg, details);\n                },\n                warn: (msg, details) => {\n                    logToStashLogger('warn', msg, details);\n                },\n                error: (msg, details) => {\n                    logToStashLogger('error', msg, details);\n                }\n            };\n            const appPool = new AppPool(\n                {},\n                {\n                    poolId: 'associate-activity-pool',\n                    hostAppName: 'web-directory',\n                    hostAppVersion: this.get('application').get('semver') || '',\n                    maxPoolSize: 1,\n                    logger,\n                    getBootstrapData: def => this.getBootstrapData(def),\n                    allowedSandboxValues: ['allow-same-origin', 'allow-scripts', 'allow-forms', 'allow-popups']\n                }\n            );\n            this.set('appPool', appPool);\n\n            const findInstanceState = buildFindInstanceState(appPool);\n            const findWorkerInstance = buildFindWorkerInstance(appPool);\n            const sendLegacyApiCall = this.get('appsService').handleAppApiCall.bind(this.get('appsService'));\n            const messageHandlerChain = new MessageHandlerChain(\n                [\n                    {\n                        handlerId: 'openWindowHandler',\n                        handler: new OpenWindowHandler({ findInstanceState, findWorkerInstance })\n                    },\n                    {\n                        handlerId: 'hawkMessageHandler',\n                        handler: new HawkMessageHandler({\n                            logger: this.get('logger'),\n                            sendMessageByInstanceId: appPool.sendMessageByInstanceId.bind(appPool),\n                            streamingService: this.get('streaming'),\n                            findInstanceState,\n                            findWorkerInstance\n                        })\n                    },\n                    {\n                        handlerId: 'toastMessageHandler',\n                        handler: new ToastMessageHandler({\n                            logger: this.get('logger'),\n                            sendMessageByInstanceId: appPool.sendMessageByInstanceId.bind(appPool),\n                            notificationService: this.get('notification')\n                        })\n                    },\n                    {\n                        handlerId: 'monitoringMessageHandler',\n                        handler: new MonitoringMessageHandler({\n                            logger: this.get('logger'),\n                            addTelemetryEvent: addPageAction,\n                            findInstanceState,\n                            findWorkerInstance\n                        })\n                    },\n                    {\n                        handlerId: 'legacyMessageHandler',\n                        handler: new LegacyMessageHandler({\n                            sendLegacyApiCall,\n                            findInstanceState\n                        })\n                    },\n                    {\n                        handlerId: 'customMessageHandler',\n                        handler: new AssociateActivityHandler({\n                            logger: this.get('logger'),\n                            phoneService: this.get('phoneService'),\n                            emailService: this.get('acdEmailService'),\n                            smsService: this.get('acdSmsService'),\n                            store: this.get('store'),\n                            commandNav: this.get('commandNav'),\n                            permissions: this.get('permissions')\n                        })\n                    }\n                ],\n                this.get('logger')\n            );\n\n            appPool.addMessageListener(async messageEnvelope => {\n                this.get('logger').debug('Associate activity debug', messageEnvelope);\n                const chainResult = await messageHandlerChain.handleMessage(messageEnvelope);\n                if (chainResult.type === 'failure') {\n                    this.get('logger').warn(\n                        'A chain error occurred while handling an Appsv2 message.',\n                        buildChainFailureLogDetails(chainResult, messageEnvelope)\n                    );\n                }\n                return chainResult;\n            });\n\n            appPool.updateGroupAppDefs([appDef], 'main');\n            const controller = new AppViewStackHostLayoutController('associateActivityFramework', appPool, {\n                getLayoutTemplate: _groupId => ({\n                    visibleAppDefId: appDef.id,\n                    items: [\n                        {\n                            appDefId: appDef.id,\n                            active: true\n                        }\n                    ]\n                })\n            });\n            this.set('layoutController', controller);\n        } catch (err) {\n            this.get('logger').error(appUtils.buildLogMsg('Unable to initialize activity pool and controller'));\n        }\n    },\n\n    didInsertElement() {\n        const controller = this.get('layoutController');\n        if (controller && controller.updateState) {\n            controller.updateState({\n                activeGroupId: 'main',\n                groupIds: ['main']\n            });\n        }\n    },\n\n    getBootstrapData(appDef: AppDef): EmptyObject<GcAppContext> {\n        if (appDef.type === 'iframe' && !appDef.trustedDataPassing) {\n            return {};\n        }\n        const intl = this.get('intl');\n\n        return {\n            type: 'gcApp',\n            langTag: intl.get('isoLocale') || 'en-us',\n            accessToken: this.get('session').get('accessToken') || '',\n            userId: this.get('session').get('user').id || '',\n            envName: this.get('application').get('runtime').name\n        };\n    },\n\n    getAppUrl(): string {\n        const gadgetOrigin = this.get('gadgetTargetOrigin');\n        const urlParams = new URLSearchParams(window.location.search);\n        const version = urlParams?.get('associateActivityGadgetVersion') || '';\n\n        if (!version) {\n            return `${gadgetOrigin}/hub-my-activity/index.html`;\n        }\n\n        if (version === 'local') {\n            const port = validatePortNumber(urlParams.get('associateActivityGadgetPort') || '', 8095);\n            return `https://localhost:${port}`;\n        }\n\n        if (version.match(/^https?:\\/\\//)) {\n            return version;\n        }\n\n        return `${gadgetOrigin}/hub-my-activity/${version}/index.html`;\n    },\n\n    getAppDef(): AppDef {\n        const appUrl = new URL(this.getAppUrl());\n        return {\n            id: 'hub-my-activity',\n            displayName: this.get('intl').t('associateActivity.displayName'),\n            type: 'iframe',\n            src: appUrl,\n            sandbox: ['allow-scripts', 'allow-same-origin', 'allow-forms', 'allow-popups'],\n            startBehavior: 'lazy',\n            trustedDataPassing: true,\n            lifecycleConfig: {\n                bootstrap: true,\n                stop: true\n            }\n        };\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"YiCeN8XC\",\"block\":\"[[[1,[28,[35,0],null,[[\\\"name\\\",\\\"isVisible\\\"],[\\\"associateActivityFramework\\\",true]]]]],[],false,[\\\"app-view-stack\\\"]]\",\"moduleName\":\"web-directory/components/associate-activity/template.hbs\",\"isStrictMode\":false});","import { equal } from '@ember/object/computed';\nimport { A } from '@ember/array';\nimport Component from '@ember/component';\nimport { later } from '@ember/runloop';\nimport { get, computed } from '@ember/object';\nimport moment from 'moment';\nimport layout from './template';\nimport LoggerMixin from '../../mixins/logger';\n\nconst START_END_MOMENT_FORMAT_STRING = 'LLL';\nconst AUDIO_ELEMENT_SELECTOR = 'audio.playback-audio';\n\nconst DEFAULT_PROPERTIES = {\n    channelOneVolumeSetting: 1,\n    channelTwoVolumeSetting: 1,\n    masterVolume: 1,\n    playbackRate: 1,\n    isPlaying: false,\n    totalDuration: null,\n    currentTime: 0,\n    isMasterVolumeVisible: false,\n    isChannelOneVolumeVisible: false,\n    isChannelTwoVolumeVisible: false,\n    annontationInputText: ''\n};\n\nexport default Component.extend(LoggerMixin, {\n    // layout\n    layout,\n\n    // audioPlayerOption\n    audioPlayerOptions: {\n        basicAudioPlayer: false\n    },\n\n    inErrorState: false,\n    ignoredErrorCodes: [20],\n    retryable4xxCodes: [416, 429],\n    audioOutputDeviceId: null,\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n        const newRecordingId = this.get('recording.id');\n        const oldRecordingId = this.recordingId;\n\n        if (newRecordingId !== oldRecordingId) {\n            // we need to reset our properties\n            this.setProperties(DEFAULT_PROPERTIES);\n            this.set('recordingId', newRecordingId);\n        }\n    },\n\n    recordingId: null,\n    isBasic: equal('audioPlayerOptions.basicAudioPlayer', true),\n    isDarkTheme: equal('theme', 'dark'),\n\n    channelOneVolume: computed('masterVolume', 'channelOneVolumeSetting', function () {\n        const channelOneSetting = this.channelOneVolumeSetting;\n        const master = this.masterVolume;\n\n        return channelOneSetting * master;\n    }),\n    channelTwoVolume: computed('masterVolume', 'channelTwoVolumeSetting', function () {\n        const channelTwoSetting = this.channelTwoVolumeSetting;\n        const master = this.masterVolume;\n\n        return channelTwoSetting * master;\n    }),\n    isMasterVolumeMuted: computed('masterVolume', function () {\n        return this.masterVolume <= 0;\n    }),\n    isChannelOneMuted: computed('channelOneVolume', function () {\n        return this.channelOneVolume <= 0;\n    }),\n    isChannelTwoMuted: computed('channelTwoVolume', function () {\n        return this.channelTwoVolume <= 0;\n    }),\n    masterVolumeButtonId: computed('elementId', function () {\n        return `${this.elementId}-audio-playback-master-volume-button`;\n    }),\n    channelOneParticipants: computed('participants', function () {\n        const participants = this.participants;\n        const includePurposes = A(['agent', 'user']);\n\n        return this.pickParticipantsByPurposes(participants, includePurposes);\n    }),\n    channelTwoParticipants: computed('participants', function () {\n        const participants = this.participants;\n        const includePurposes = A(['customer', 'external']);\n\n        return this.pickParticipantsByPurposes(participants, includePurposes);\n    }),\n    totalDurationInMs: computed('totalDuration', function () {\n        // should this be based on totalDuration or a computed of start/end time?\n        return this.totalDuration * 1000;\n    }),\n    currentTimeInMs: computed('currentTime', function () {\n        return this.currentTime * 1000;\n    }),\n    loadingTotalDuration: computed('totalDuration', function () {\n        const totalDuration = this.totalDuration;\n        return !(totalDuration || totalDuration === 0);\n    }),\n    loadingCurrentTime: computed('currentTime', function () {\n        const currentTime = this.currentTime;\n        return !(currentTime || currentTime === 0);\n    }),\n    startTime: computed('recording.startTime', function () {\n        return moment(this.get('recording.startTime')).format(START_END_MOMENT_FORMAT_STRING);\n    }),\n    endTime: computed('recording.endTime', function () {\n        return moment(this.get('recording.endTime')).format(START_END_MOMENT_FORMAT_STRING);\n    }),\n    // Tether ids\n    qualityEngineChannelOneVolumeId: computed('elementId', function () {\n        return `${this.elementId}-qualityEngineChannelOneVolume`;\n    }),\n\n    qualityEngineChannelTwoVolumeId: computed('elementId', function () {\n        return `${this.elementId}-qualityEngineChannelTwoVolume`;\n    }),\n\n    // actions\n    actions: {\n        playOrPause() {\n            const playing = this.isPlaying;\n            playing ? this.pause() : this.play();\n        },\n        handlePlaying() {\n            this.set('isPlaying', true);\n        },\n        handlePaused() {\n            this.set('isPlaying', false);\n        },\n        handlePositionChange(percent) {\n            const totalDuration = this.totalDuration;\n            const newPosition = totalDuration * percent;\n\n            this.setPlaybackPosition(newPosition);\n        },\n        handleTimeUpdate(event) {\n            // update currentTime based on a \"master\" channel (audio element with src === mediaUris['0'])\n            const isMaster = event.target.src === this.get('recording.mediaUris.0.mediaUri');\n            const currentTime = event.target.currentTime;\n            if (isMaster && currentTime) {\n                this.set('currentTime', currentTime);\n            }\n        },\n        handleDurationChange(event) {\n            if (event.target && event.target.duration) {\n                const duration = event.target.duration;\n                this.set('totalDuration', duration); // converted to ms\n            }\n        },\n        handleEnded() {\n            this.setPlaybackPosition(0);\n        },\n        setPlaybackRate() {\n            const rate = this.playbackRate;\n            this.set('playbackRate', rate > 1 ? 1 : 2);\n        },\n        downloadRecording() {\n            const recordingId = this.recordingId;\n            if (recordingId) {\n                this.downloadRecording(recordingId);\n            }\n        },\n        createAnnotation() {\n            const annotationInputText = this.annotationInputText;\n            const currentTimeInMs = this.currentTimeInMs;\n            const recordingId = this.get('recording.id');\n\n            this.sendAction('createAnnotation', annotationInputText, currentTimeInMs, recordingId);\n            this.set('annotationInputText', '');\n        },\n        toggleMasterVolumeVisbility() {\n            this.toggleProperty('isMasterVolumeVisible');\n        },\n        toggleChannelOneVolumeVisibility() {\n            this.toggleProperty('isChannelOneVolumeVisible');\n        },\n        toggleChannelTwoVolumeVisibility() {\n            this.toggleProperty('isChannelTwoVolumeVisible');\n        }\n    },\n    isRetryable(error) {\n        if (!error || !error.status) {\n            return false;\n        }\n\n        return this.retryable4xxCodes.includes(error.status) || error.status >= 500;\n    },\n    play(maxAttempts = 3) {\n        if (this.isDestroying || this.isDestroyed) {\n            return;\n        }\n\n        const audioOutputDeviceId = this.audioOutputDeviceId;\n\n        this.$(AUDIO_ELEMENT_SELECTOR).each((idx, element) => {\n            if (audioOutputDeviceId && element.setSinkId) {\n                element.setSinkId(audioOutputDeviceId);\n            }\n\n            const promise = element.play();\n            if (promise && promise.then && promise.catch) {\n                promise\n                    .then(() => this.set('inErrorState', false))\n                    .catch(error => {\n                        if (maxAttempts > 1 && this.isRetryable(error)) {\n                            this.logger.debug('Play error in audio-player-v2, retrying.', {\n                                error\n                            });\n                            later(() => this.play(maxAttempts - 1), (1 / maxAttempts) * 5000);\n                        } else {\n                            this.logger.debug('Play error in audio-player-v2, retries exhausted.', {\n                                error\n                            });\n                            const ignoredErrorCodes = this.ignoredErrorCodes;\n                            if (!ignoredErrorCodes.includes(error.code)) {\n                                this.set('inErrorState', true);\n                            }\n                        }\n                    });\n            }\n        });\n    },\n    pause() {\n        this.$(AUDIO_ELEMENT_SELECTOR).each((idx, element) => {\n            element.pause();\n        });\n    },\n    setPlaybackPosition(newPosition) {\n        this.$(AUDIO_ELEMENT_SELECTOR).each((idx, element) => {\n            element.currentTime = newPosition;\n        });\n    },\n    pickParticipantsByPurposes(participants, includePurposes) {\n        return participants.filter(participant => {\n            const purpose = get(participant, 'purpose');\n            return includePurposes.includes(purpose.toLowerCase());\n        });\n    }\n});\n","import Component from '@ember/component';\nimport layout from './template';\n\nexport default Component.extend({\n    layout,\n    showVolume: false,\n\n    actions: {\n        toggleShowVolume() {\n            this.toggleProperty('showVolume');\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"ZhkCm4iR\",\"block\":\"[[[10,0],[14,0,\\\"audio-playback-participant\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"audio-playback-participant-meta\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"audio-playback-participant-type\\\"],[12],[1,[33,0,[\\\"purpose\\\"]]],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"audio-playback-participant-name\\\"],[12],[1,[33,0,[\\\"name\\\"]]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"participant\\\"]]\",\"moduleName\":\"web-directory/components/audio-player-v2/participant/template.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"Y7bFO3ou\",\"block\":\"[[[44,[[33,1,[\\\"mediaUris\\\"]]],[[[1,\\\"    \\\"],[10,\\\"audio\\\"],[14,0,\\\"playback-audio\\\"],[15,\\\"src\\\",[30,1,[\\\"0\\\",\\\"mediaUri\\\"]]],[15,\\\"volume\\\",[36,2]],[15,\\\"playbackRate\\\",[36,3]],[15,\\\"onplay\\\",[28,[37,4],[[30,0],\\\"handlePlaying\\\"],null]],[15,\\\"onpause\\\",[28,[37,4],[[30,0],\\\"handlePaused\\\"],null]],[15,\\\"ondurationchange\\\",[28,[37,4],[[30,0],\\\"handleDurationChange\\\"],null]],[15,\\\"onended\\\",[28,[37,4],[[30,0],\\\"handleEnded\\\"],null]],[15,\\\"ontimeupdate\\\",[28,[37,4],[[30,0],\\\"handleTimeUpdate\\\"],null]],[12],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,\\\"audio\\\"],[14,0,\\\"playback-audio\\\"],[15,\\\"src\\\",[30,1,[\\\"1\\\",\\\"mediaUri\\\"]]],[15,\\\"volume\\\",[36,5]],[15,\\\"playbackRate\\\",[36,3]],[15,\\\"onplay\\\",[28,[37,4],[[30,0],\\\"handlePlaying\\\"],null]],[15,\\\"onpause\\\",[28,[37,4],[[30,0],\\\"handlePaused\\\"],null]],[15,\\\"ondurationchange\\\",[28,[37,4],[[30,0],\\\"handleDurationChange\\\"],null]],[15,\\\"onended\\\",[28,[37,4],[[30,0],\\\"handleEnded\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[1]]],[1,\\\"\\\\n\\\"],[10,0],[15,0,[29,[\\\"audio-playback-body\\\\n        \\\",[52,[33,7],\\\"audio-playback-body--basic\\\"],\\\"\\\\n        \\\",[52,[33,8],\\\"audio-playback-body--dark\\\"]]]],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"audio-playback-column audio-controls\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"audio-playback-header\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"audio-control-group audio-control-group-middle\\\"],[12],[1,\\\"\\\\n            \\\"],[11,\\\"button\\\"],[24,0,\\\"playback-control playback-control-large audio-playback-play-pause-button\\\"],[16,\\\"aria-label\\\",[28,[37,9],[[52,[33,10],\\\"audioPlayer.pause\\\",\\\"audioPlayer.play\\\"]],null]],[16,\\\"disabled\\\",[36,11]],[24,4,\\\"button\\\"],[4,[38,4],[[30,0],\\\"playOrPause\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[15,\\\"icon-name\\\",[52,[33,10],\\\"legacy/pause\\\",\\\"legacy/play\\\"]],[15,\\\"screenreader-text\\\",[28,[37,9],[[52,[33,10],\\\"audioPlayer.pause\\\",\\\"audioPlayer.play\\\"]],null]],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,0],[15,0,[29,[\\\"audio-playback-master-volume \\\",[52,[33,12],\\\"visible\\\"]]]],[12],[1,\\\"\\\\n\\\"],[41,[33,13,[\\\"basicAudioPlayer\\\"]],[[[1,\\\"                    \\\"],[1,[28,[35,14],null,[[\\\"type\\\",\\\"value\\\",\\\"min\\\",\\\"max\\\",\\\"step\\\",\\\"id\\\"],[\\\"range\\\",[33,15],0,1,0.01,[28,[37,16],[[33,17],\\\"-master-volume\\\"],null]]]]],[1,\\\"\\\\n                    \\\"],[10,\\\"label\\\"],[14,0,\\\"sr-only\\\"],[15,\\\"for\\\",[29,[[28,[37,16],[[33,17],\\\"-master-volume\\\"],null]]]],[12],[1,[28,[35,9],[\\\"audioPlayer.volume\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[6,[39,18],null,[[\\\"target\\\",\\\"attachment\\\",\\\"targetAttachment\\\"],[[28,[37,16],[\\\".\\\",[33,19]],null],\\\"bottom center\\\",\\\"top center\\\"]],[[\\\"default\\\"],[[[[1,\\\"                        \\\"],[1,[28,[35,20],null,[[\\\"volume\\\",\\\"markerPosition\\\",\\\"shouldShow\\\",\\\"toggleButtonSelector\\\"],[[28,[37,21],[[33,15]],null],\\\"bottom\\\",[28,[37,21],[[33,12]],null],[28,[37,16],[\\\".\\\",[33,19]],null]]]]],[1,\\\"\\\\n\\\"]],[]]]]]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"audio-control-group audio-playback-column-footer\\\"],[12],[1,\\\"\\\\n            \\\"],[11,\\\"button\\\"],[24,0,\\\"playback-control playback-control-small\\\"],[16,\\\"disabled\\\",[36,11]],[24,4,\\\"button\\\"],[4,[38,4],[[30,0],\\\"setPlaybackRate\\\"],null],[12],[1,\\\"\\\\n                \\\"],[10,1],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,9],[[52,[28,[37,22],[[33,3],1],null],\\\"audioPlayer.playbackRate.double\\\",\\\"audioPlayer.playbackRate.normal\\\"]],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[11,\\\"button\\\"],[16,0,[29,[\\\"playback-control \\\",[36,19],\\\" playback-control-small\\\"]]],[16,\\\"aria-label\\\",[28,[37,9],[\\\"audioPlayer.volume\\\"],null]],[16,\\\"disabled\\\",[36,11]],[24,4,\\\"button\\\"],[4,[38,4],[[30,0],\\\"toggleMasterVolumeVisbility\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[15,\\\"icon-name\\\",[52,[33,23],\\\"legacy/volume-off-alt\\\",\\\"legacy/volume-up\\\"]],[15,\\\"screenreader-text\\\",[28,[37,9],[\\\"audioPlayer.volume\\\"],null]],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"],[41,[51,[33,13,[\\\"basicAudioPlayer\\\"]]],[[[1,\\\"                \\\"],[11,\\\"button\\\"],[24,0,\\\"audio-playback-body__download-btn playback-control playback-control-small\\\"],[16,\\\"aria-label\\\",[28,[37,9],[\\\"audioPlayer.downloadRecording\\\"],null]],[16,\\\"disabled\\\",[36,11]],[24,4,\\\"button\\\"],[4,[38,4],[[30,0],\\\"downloadRecording\\\"],null],[12],[1,\\\"\\\\n\\\"],[41,[33,25],[[[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[15,\\\"screenreader-text\\\",[28,[37,9],[\\\"audioPlayer.downloadRecording\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,\\\"i\\\"],[14,0,\\\"pc pc-fw pc-cloud-download\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"audio-playback-column audio-current-time\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"audio-playback-column-header\\\"],[12],[13],[1,\\\"\\\\n\\\"],[41,[51,[33,26]],[[[1,\\\"            \\\"],[1,[28,[35,27],null,[[\\\"durationInMs\\\"],[[33,28]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/cog\\\"],[14,0,\\\"gux-spin audio-playback-body__duration-loading-icon\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[10,0],[14,0,\\\"audio-playback-column-footer\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"audio-playback-column audio-playback-middle-column\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"audio-playback-header audio-playback-column-header\\\"],[12],[1,\\\"\\\\n\\\"],[41,[51,[33,13,[\\\"basicAudioPlayer\\\"]]],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"playback-meta-section\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"playback-meta-title\\\"],[12],[1,[28,[35,9],[\\\"audioPlayer.audioRecordingStart\\\"],null]],[13],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"playback-meta-value\\\"],[12],[1,[34,29]],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"playback-meta-section\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"playback-meta-title\\\"],[12],[1,[28,[35,9],[\\\"audioPlayer.duration\\\"],null]],[13],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"playback-meta-value\\\"],[12],[1,\\\"\\\\n\\\"],[41,[51,[33,30]],[[[1,\\\"                            \\\"],[1,[28,[35,27],null,[[\\\"durationInMs\\\"],[[33,31]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/cog\\\"],[14,0,\\\"gux-spin audio-playback-body__duration-loading-icon\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"playback-meta-section\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"playback-meta-title\\\"],[12],[1,[28,[35,9],[\\\"audioPlayer.audioRecordingEnd\\\"],null]],[13],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"playback-meta-value\\\"],[12],[1,[34,32]],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[1,[28,[35,33],null,[[\\\"recording\\\",\\\"currentTime\\\",\\\"totalDuration\\\",\\\"onPositionChange\\\",\\\"theme\\\",\\\"inErrorState\\\",\\\"audioPlayerOptions\\\"],[[33,1],[33,34],[33,35],\\\"handlePositionChange\\\",[33,36],[33,11],[33,13]]]]],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[14,0,\\\"audio-playback-column-footer\\\"],[12],[1,\\\"\\\\n\\\"],[41,[51,[33,13,[\\\"basicAudioPlayer\\\"]]],[[[1,\\\"                \\\"],[10,1],[14,0,\\\"profile-picture-input-addon\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,37],null,[[\\\"entity\\\",\\\"enableMiniCard\\\",\\\"isLinkable\\\",\\\"showPresence\\\"],[[33,38],false,false,true]]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"label\\\"],[14,0,\\\"sr-only\\\"],[15,\\\"for\\\",[29,[[28,[37,16],[[33,17],\\\"-add-annotation\\\"],null]]]],[12],[1,[28,[35,9],[\\\"audioPlayer.addAnnotation\\\"],null]],[13],[1,\\\"\\\\n                \\\"],[1,[28,[35,14],null,[[\\\"enter\\\",\\\"type\\\",\\\"id\\\",\\\"class\\\",\\\"placeholder\\\",\\\"value\\\"],[[28,[37,4],[[30,0],\\\"createAnnotation\\\"],null],\\\"text\\\",[28,[37,16],[[33,17],\\\"-add-annotation\\\"],null],\\\"playback-add-annotation\\\",[28,[37,9],[\\\"audioPlayer.addAnnotation\\\"],null],[33,39]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"audio-playback-column audio-time-left\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"audio-playback-column-header\\\"],[12],[13],[1,\\\"\\\\n\\\"],[41,[51,[33,30]],[[[1,\\\"            \\\"],[1,[28,[35,27],null,[[\\\"durationInMs\\\"],[[33,31]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/cog\\\"],[14,0,\\\"gux-spin audio-playback-body__duration-loading-icon\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[10,0],[14,0,\\\"audio-playback-column-footer\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[41,[51,[33,13,[\\\"basicAudioPlayer\\\"]]],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"audio-playback-column audio-playback-participants\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"audio-playback-header audio-playback-header-participants\\\"],[12],[1,[28,[35,9],[\\\"audioPlayer.participants\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"audio-playback-participants-channel-header\\\"],[12],[1,\\\"\\\\n                \\\"],[11,\\\"button\\\"],[16,0,[29,[[36,40],\\\"\\\\n                        audio-playback-participants-channel-header-volume-control playback-control playback-control-xsmall\\\"]]],[16,\\\"aria-label\\\",[28,[37,9],[\\\"audioPlayer.channelVolume\\\"],[[\\\"channel\\\"],[[28,[37,9],[\\\"audioPlayer.internal\\\"],null]]]]],[16,\\\"disabled\\\",[36,11]],[24,4,\\\"button\\\"],[4,[38,4],[[30,0],\\\"toggleChannelOneVolumeVisibility\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[15,\\\"icon-name\\\",[52,[33,41],\\\"legacy/volume-off-alt\\\",\\\"legacy/volume-up\\\"]],[15,\\\"screenreader-text\\\",[28,[37,9],[\\\"audioPlayer.channelVolume\\\"],[[\\\"channel\\\"],[[28,[37,9],[\\\"audioPlayer.internal\\\"],null]]]]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,1],[12],[1,[28,[35,9],[\\\"audioPlayer.internal\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,0],[12],[1,\\\"\\\\n\\\"],[6,[39,18],null,[[\\\"target\\\",\\\"attachment\\\",\\\"targetAttachment\\\"],[[28,[37,16],[\\\".\\\",[33,40]],null],\\\"bottom center\\\",\\\"top center\\\"]],[[\\\"default\\\"],[[[[1,\\\"                    \\\"],[1,[28,[35,20],null,[[\\\"volume\\\",\\\"shouldShow\\\",\\\"toggleButtonSelector\\\"],[[28,[37,21],[[33,42]],null],[28,[37,21],[[33,43]],null],[28,[37,16],[\\\".\\\",[33,40]],null]]]]],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,0],[14,0,\\\"audio-playback-participants-group audio-playback-participants-channel-one\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,44],[[33,45,[\\\"length\\\"]],0],null],[[[42,[28,[37,47],[[28,[37,47],[[33,45]],null]],null],null,[[[1,\\\"                        \\\"],[1,[28,[35,48],null,[[\\\"participant\\\"],[[30,2]]]]],[1,\\\"\\\\n\\\"]],[2]],null]],[]],[[[1,\\\"                    \\\"],[1,[28,[35,9],[\\\"audioPlayer.noParticipants\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"audio-playback-participants-channel-header\\\"],[12],[1,\\\"\\\\n                \\\"],[11,\\\"button\\\"],[16,0,[29,[[36,49],\\\"\\\\n                        audio-playback-participants-channel-header-volume-control playback-control playback-control-xsmall\\\"]]],[16,\\\"aria-label\\\",[28,[37,9],[\\\"audioPlayer.channelVolume\\\"],[[\\\"channel\\\"],[[28,[37,9],[\\\"audioPlayer.external\\\"],null]]]]],[16,\\\"disabled\\\",[36,11]],[24,4,\\\"button\\\"],[4,[38,4],[[30,0],\\\"toggleChannelTwoVolumeVisibility\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[15,\\\"icon-name\\\",[52,[33,50],\\\"legacy/volume-off-alt\\\",\\\"legacy/volume-up\\\"]],[15,\\\"screenreader-text\\\",[28,[37,9],[\\\"audioPlayer.channelVolume\\\"],[[\\\"channel\\\"],[[28,[37,9],[\\\"audioPlayer.external\\\"],null]]]]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,1],[14,0,\\\"audio-playback-participants-channel-header-participant-group-name\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,9],[\\\"audioPlayer.external\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,0],[12],[1,\\\"\\\\n\\\"],[6,[39,18],null,[[\\\"target\\\",\\\"attachment\\\",\\\"targetAttachment\\\"],[[28,[37,16],[\\\".\\\",[33,49]],null],\\\"bottom center\\\",\\\"top center\\\"]],[[\\\"default\\\"],[[[[1,\\\"                    \\\"],[1,[28,[35,20],null,[[\\\"volume\\\",\\\"shouldShow\\\",\\\"toggleButtonSelector\\\"],[[28,[37,21],[[33,51]],null],[28,[37,21],[[33,52]],null],[28,[37,16],[\\\".\\\",[33,49]],null]]]]],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,0],[14,0,\\\"audio-playback-participants-group audio-playback-participants-channel-two\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,44],[[33,53,[\\\"length\\\"]],0],null],[[[42,[28,[37,47],[[28,[37,47],[[33,53]],null]],null],null,[[[1,\\\"                        \\\"],[1,[28,[35,48],null,[[\\\"participant\\\"],[[30,3]]]]],[1,\\\"\\\\n\\\"]],[3]],null]],[]],[[[1,\\\"                    \\\"],[1,[28,[35,9],[\\\"audioPlayer.noParticipants\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13]],[\\\"media\\\",\\\"participant\\\",\\\"participant\\\"],false,[\\\"let\\\",\\\"recording\\\",\\\"channelOneVolume\\\",\\\"playbackRate\\\",\\\"action\\\",\\\"channelTwoVolume\\\",\\\"if\\\",\\\"isBasic\\\",\\\"isDarkTheme\\\",\\\"t\\\",\\\"isPlaying\\\",\\\"inErrorState\\\",\\\"isMasterVolumeVisible\\\",\\\"audioPlayerOptions\\\",\\\"input\\\",\\\"masterVolume\\\",\\\"concat\\\",\\\"elementId\\\",\\\"ember-tether\\\",\\\"masterVolumeButtonId\\\",\\\"volume-input\\\",\\\"mut\\\",\\\"eq\\\",\\\"isMasterVolumeMuted\\\",\\\"unless\\\",\\\"downloadingRecording\\\",\\\"loadingCurrentTime\\\",\\\"duration-format\\\",\\\"currentTimeInMs\\\",\\\"startTime\\\",\\\"loadingTotalDuration\\\",\\\"totalDurationInMs\\\",\\\"endTime\\\",\\\"audio-player-v2/timeline\\\",\\\"currentTime\\\",\\\"totalDuration\\\",\\\"theme\\\",\\\"entity-image\\\",\\\"entity\\\",\\\"annotationInputText\\\",\\\"qualityEngineChannelOneVolumeId\\\",\\\"isChannelOneMuted\\\",\\\"channelOneVolumeSetting\\\",\\\"isChannelOneVolumeVisible\\\",\\\"gt\\\",\\\"channelOneParticipants\\\",\\\"each\\\",\\\"-track-array\\\",\\\"audio-player-v2/participant\\\",\\\"qualityEngineChannelTwoVolumeId\\\",\\\"isChannelTwoMuted\\\",\\\"channelTwoVolumeSetting\\\",\\\"isChannelTwoVolumeVisible\\\",\\\"channelTwoParticipants\\\"]]\",\"moduleName\":\"web-directory/components/audio-player-v2/template.hbs\",\"isStrictMode\":false});","import { equal } from '@ember/object/computed';\nimport Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport layout from './template';\n\nexport default Component.extend({\n    // config\n    layout,\n    classNames: ['audio-player__timeline'],\n    classNameBindings: ['isDarkTheme:audio-player__timeline--dark'],\n\n    audioPlayerOptions: null,\n    isDarkTheme: equal('theme', 'dark'),\n    percentComplete: computed('totalDuration', 'currentTime', function () {\n        const totalDuration = this.totalDuration;\n        const currentTime = this.currentTime;\n\n        return totalDuration && totalDuration > 0 ? (currentTime / totalDuration) * 100 : 0;\n    }),\n\n    // event handlers\n    click(event) {\n        const percentPosition = event.offsetX / this.element.clientWidth;\n        this.sendAction('onPositionChange', percentPosition);\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"Oyi3Ni0S\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[10,1],[14,0,\\\"audio-playback-error-message\\\"],[12],[1,\\\" \\\"],[1,[28,[35,2],[\\\"audioPlayer.errorPlayingAudio\\\"],null]],[1,\\\" \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"audio-progress-bar\\\"],[12],[1,\\\"\\\\n\\\"],[6,[39,3],null,[[\\\"width\\\",\\\"class\\\"],[[33,4],\\\"audio-progress-bar__underlay\\\"]],[[\\\"default\\\"],[[[[41,[33,5],[[[42,[28,[37,7],[[28,[37,7],[[33,8,[\\\"annotations\\\"]]],null]],null],null,[[[1,\\\"                    \\\"],[1,[28,[35,9],null,[[\\\"annotation\\\",\\\"totalDuration\\\"],[[30,1],[33,5]]]]],[1,\\\"\\\\n\\\"]],[1]],null]],[]],null]],[]]]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[44,[[33,8,[\\\"mediaUris\\\"]]],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"audio-player__waveform-graph\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,2,[\\\"0\\\",\\\"waveformData\\\"]],[[[1,\\\"                \\\"],[1,[28,[35,3],null,[[\\\"width\\\"],[[33,4]]]]],[1,\\\"\\\\n                \\\"],[1,[28,[35,11],null,[[\\\"waveformData\\\",\\\"theme\\\"],[[30,2,[\\\"0\\\",\\\"waveformData\\\"]],[33,12]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[14,0,\\\"audio-progress-bar\\\"],[12],[1,\\\"\\\\n\\\"],[6,[39,3],null,[[\\\"width\\\",\\\"class\\\"],[[33,4],\\\"audio-progress-bar__underlay\\\"]],[[\\\"default\\\"],[[[[41,[33,5],[[[42,[28,[37,7],[[28,[37,7],[[33,8,[\\\"annotations\\\"]]],null]],null],null,[[[1,\\\"                        \\\"],[1,[28,[35,9],null,[[\\\"annotation\\\",\\\"totalDuration\\\"],[[30,3],[33,5]]]]],[1,\\\"\\\\n\\\"]],[3]],null]],[]],null]],[]]]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[51,[33,14,[\\\"basicAudioPlayer\\\"]]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"audio-player__waveform-graph\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,2,[\\\"1\\\",\\\"waveformData\\\"]],[[[1,\\\"                    \\\"],[1,[28,[35,3],null,[[\\\"width\\\"],[[33,4]]]]],[1,\\\"\\\\n                    \\\"],[1,[28,[35,11],null,[[\\\"waveformData\\\",\\\"mirror\\\",\\\"theme\\\"],[[30,2,[\\\"1\\\",\\\"waveformData\\\"]],true,[33,12]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[2]]]],[]]]],[\\\"annotation\\\",\\\"media\\\",\\\"annotation\\\"],false,[\\\"if\\\",\\\"inErrorState\\\",\\\"t\\\",\\\"progress-underlay\\\",\\\"percentComplete\\\",\\\"totalDuration\\\",\\\"each\\\",\\\"-track-array\\\",\\\"recording\\\",\\\"interaction-annotation\\\",\\\"let\\\",\\\"audio-player-v2/waveform-graph\\\",\\\"theme\\\",\\\"unless\\\",\\\"audioPlayerOptions\\\"]]\",\"moduleName\":\"web-directory/components/audio-player-v2/timeline/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { equal } from '@ember/object/computed';\nimport { scheduleOnce } from '@ember/runloop';\nimport d3 from 'd3';\nconst { scaleSqrt, select } = d3;\n// these constants generate a width:height ratio\n// svg will preserve that ratio and automagically\n// scale our graph for us\nconst AUDIO_PLAYER_WIDTH = 800;\nconst AUDIO_PLAYER_HEIGHT = 80;\n\nexport default Component.extend({\n    // config\n    tagName: 'svg',\n\n    // attributes\n    classNames: ['audio-player__waveform'],\n    classNameBindings: ['mirror:audio-player__waveform--mirror', 'isDarkTheme:audio-player__waveform--dark'],\n    attributeBindings: ['viewBox', 'preserveAspectRatio'],\n    isDarkTheme: equal('theme', 'dark'),\n    viewBox: `0 0 ${AUDIO_PLAYER_WIDTH} ${AUDIO_PLAYER_HEIGHT}`,\n    preserveAspectRatio: 'none',\n    smoothedWaveformData: computed('waveformData', function () {\n        const waveformData = this.waveformData;\n\n        const normalized = waveformData.map(val => {\n            return window.Math.max(val - 0.5, 0);\n        });\n\n        if (normalized.length < 5) {\n            return normalized;\n        }\n\n        const smoothed = normalized.map((val, index, collection) => {\n            if ([0, 1, collection.length - 2, collection.length - 1].includes(index)) {\n                return 0;\n            }\n\n            return (\n                0.06136 * collection[index - 2] +\n                0.24477 * collection[index - 1] +\n                0.38774 * collection[index] +\n                0.24477 * collection[index + 1] +\n                0.06136 * collection[index + 2]\n            );\n        });\n\n        return smoothed;\n    }),\n\n    // lifecycle\n    didRender() {\n        this._super(...arguments);\n        scheduleOnce('afterRender', () => this.renderWaveform());\n    },\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n        scheduleOnce('afterRender', () => this.reRenderWaveform());\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.destroyWaveform();\n    },\n\n    // rendering\n    renderWaveform() {\n        const element = this.element;\n        const data = this.smoothedWaveformData;\n\n        const barWidth = AUDIO_PLAYER_WIDTH / data.length;\n\n        const y = scaleSqrt() // scale options: linear, sqrt, log, pow\n            .domain([0, 0.5])\n            .range([AUDIO_PLAYER_HEIGHT, 0]);\n\n        const chart = select(element);\n\n        const bar = chart\n            .selectAll('g')\n            .data(data)\n            .enter()\n            .append('g')\n            .attr('transform', (d, i) => `translate(${i * barWidth}, 0)`);\n\n        bar.append('rect')\n            .attr('shape-rendering', 'crispEdges')\n            .attr('y', 0)\n            .attr('width', barWidth)\n            .attr('height', d => y(d));\n    },\n\n    reRenderWaveform() {\n        this.destroyWaveform();\n        this.renderWaveform();\n    },\n\n    destroyWaveform() {\n        this.$('g').remove();\n    }\n});\n","import { inject as service } from '@ember/service';\nimport { observer, computed, get } from '@ember/object';\nimport RSVP from 'rsvp';\nimport Component from '@ember/component';\nimport _ from 'lodash';\nimport Howler from 'howler-but-with-updates';\n\nconst Howl = Howler.Howl;\n\nexport default Component.extend({\n    classNames: ['audio-player-v2'],\n\n    clock: service(),\n    logger: service('stash-logger'),\n    webrtc: service(),\n    phone: service(),\n\n    attrs: {\n        source: null,\n        options: {},\n        markAsRead: () => {},\n        onError: () => {}\n    },\n\n    playing: false,\n    didEnd: false,\n    loading: false,\n    loadingError: false,\n    registerStopVoicemailHandler: null,\n    sound: null,\n\n    playbackVolume: computed('phone.callVolume', function () {\n        const callVolume = this.get('phone.callVolume');\n        const decimalValue = callVolume / 100;\n        return decimalValue;\n    }),\n\n    selectedOutputDevice: computed('webrtc.defaultOutputDevice', function () {\n        let deviceId;\n        let defaultOutputDevice = this.get('webrtc.defaultOutputDevice');\n        if (defaultOutputDevice) {\n            deviceId = defaultOutputDevice.get('deviceId');\n        }\n\n        return deviceId;\n    }),\n\n    outputDeviceUpdate: observer('webrtc.defaultOutputDevice', function () {\n        if (!this.sound) {\n            return;\n        }\n\n        let restartSound = false;\n        if (this.playing) {\n            this.stopPlaying();\n            restartSound = true;\n        }\n\n        const newOutputDeviceId = this.selectedOutputDevice;\n        this.sound.setOutputDevice(newOutputDeviceId);\n\n        if (restartSound) {\n            this.sound.play();\n        }\n    }),\n\n    actions: {\n        togglePlay() {\n            const outputDeviceId = this.get('webrtc.defaultOutputDevice.deviceId');\n            if (outputDeviceId) {\n                this.sound.setOutputDevice(outputDeviceId);\n            }\n\n            this.sound.volume(this.playbackVolume);\n\n            if (this.playing) {\n                this.sound.pause();\n            } else {\n                if (this.didEnd) {\n                    this.sound.seek(0);\n                }\n                this.sound.play();\n            }\n        },\n\n        seekSound(value) {\n            this.sound.seek(value);\n        }\n    },\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n\n        const registerHandler = this.registerStopVoicemailHandler;\n        if (registerHandler && typeof registerHandler === 'function') {\n            registerHandler(this.stopPlaying.bind(this));\n        }\n\n        this.setupSound();\n    },\n\n    setupSound() {\n        this.set('loading', true);\n\n        const paths = this.getAttr('source');\n        const promise = RSVP.resolve(paths);\n        promise\n            .then(sources => {\n                if (sources && !Array.isArray(sources)) {\n                    return [sources];\n                }\n                return null;\n            })\n            .then(sources => {\n                if (sources) {\n                    const options = this.howlOptions;\n                    options.src = sources;\n                    options.html5 = true;\n                    this.sound = new Howl(options);\n                } else {\n                    this.set('loading', false);\n                    this.set('loadingError', true);\n\n                    this.logger.warn('There were no audio sources passed into the audio-player');\n\n                    this.attrs.onError();\n                }\n            })\n            .catch(err => {\n                this.set('loading', false);\n                this.set('loadingError', true);\n\n                this.logger.error('There was an error loading recorded audio', err);\n\n                this.attrs.onError(err);\n            });\n    },\n\n    duration: computed('loading', function () {\n        if (!this.sound) {\n            return 0;\n        }\n        return Math.floor(this.sound.duration() * 1000);\n    }),\n\n    currentTime: computed('clock.second', function () {\n        // Consume clock.second to establish Glimmer autotracking (Ember 3.28 compatibility)\n        this.get('clock.second');\n        if (!this.sound) {\n            return 0;\n        }\n        return Math.floor(this.sound.seek() * 1000);\n    }),\n\n    didInsertElement() {\n        this._super(...arguments);\n        // clock.second (0–59) does not reliably invalidate cross-object computeds\n        // in Ember 3.28. Subscribe to the clockTick event directly as a fallback.\n        this.get('clock').on('clockTick', this, this._onClockTick);\n    },\n\n    willDestroyElement() {\n        this.get('clock').off('clockTick', this, this._onClockTick);\n\n        if (this.sound) {\n            this.sound.off();\n            this.sound.pause();\n        }\n\n        this._super(...arguments);\n    },\n\n    _onClockTick() {\n        this.notifyPropertyChange('currentTime');\n    },\n\n    loadingAudio: computed(function () {\n        return false;\n    }),\n\n    howlOptions: computed('options', function () {\n        const defaultOptions = {\n            onload: this.onLoad.bind(this),\n            onplay: this.onPlay.bind(this),\n            onpause: this.onPause.bind(this),\n            onend: this.onEnd.bind(this)\n        };\n        return _.merge({}, defaultOptions, this.options);\n    }),\n\n    onLoad() {\n        this.set('loading', false);\n\n        this._checkSoundDuration();\n    },\n\n    onPlay() {\n        this.set('playing', true);\n    },\n\n    onPause() {\n        this.set('playing', false);\n    },\n\n    onEnd() {\n        this.set('playing', false);\n        this.set('didEnd', true);\n        if (this.attrs.markAsRead) {\n            this.attrs.markAsRead();\n        }\n    },\n\n    stopPlaying() {\n        this.sound && this.sound.pause();\n    },\n\n    _checkSoundDuration() {\n        const sound = this.sound;\n        if (!sound) {\n            return;\n        }\n\n        const audio = get(sound, '_sounds.0._node');\n        if (audio && audio.duration === Infinity) {\n            // We are dealing with a recording here\n            // See: http://stackoverflow.com/a/39971175\n            audio.currentTime = 1e101;\n            audio.ontimeupdate = () => {\n                audio.ontimeupdate = () => {};\n                audio.currentTime = 0;\n                sound._duration = audio.duration;\n\n                this.notifyPropertyChange('duration');\n            };\n        } else {\n            this.notifyPropertyChange('duration');\n        }\n    }\n});\n","import { inject as service } from '@ember/service';\nimport { run } from '@ember/runloop';\nimport { computed } from '@ember/object';\nimport Component from '@ember/component';\n\nexport default Component.extend({\n    classNames: ['seek-bar', 'clickable'],\n\n    clock: service(),\n\n    lastTimeValue: null,\n\n    attrs: {\n        sound: null,\n        duration: null,\n        currentTime: null\n    },\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n\n        if (!this.currentTime || !this.lastTimeValue) {\n            if (this.currentTime) this.set('lastTimeValue', this.currentTime);\n            return;\n        }\n\n        if (this.currentTime !== this.lastTimeValue) {\n            const position = this.position;\n            let left = position * 100;\n            if (left > 100) {\n                left = 100;\n            }\n            // this.$() was removed in Ember 3.x — use native DOM instead\n            run(() => {\n                const progressBar = this.element.querySelector('.progress-bar');\n                if (progressBar) {\n                    progressBar.style.marginLeft = `${left}%`;\n                }\n            });\n        }\n        this.set('lastTimeValue', this.currentTime);\n    },\n\n    click(event) {\n        // getAttr() was removed in Ember 3.x — access args directly via this\n        const seek = event.offsetX / this.element.offsetWidth;\n        const totalSeconds = this.duration / 1000;\n        this.didSeek(seek * totalSeconds);\n    },\n\n    position: computed('sound', 'currentTime', 'duration', function () {\n        // getAttr() was removed in Ember 3.x — access args directly via this\n        if (!this.sound) {\n            return 0;\n        }\n\n        return this.currentTime / this.duration;\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"omzvTRzg\",\"block\":\"[[[10,1],[14,0,\\\"progress-bar\\\"],[12],[13]],[],false,[]]\",\"moduleName\":\"web-directory/components/audio-player/seek-bar/template.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"LsIUXOeF\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[10,1],[14,0,\\\"loading\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,2],[\\\"common.loading\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,3],[[[1,\\\"        \\\"],[1,[28,[35,2],[\\\"components.audioPlayer.loadingError\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link play-toggle\\\"],[24,4,\\\"button\\\"],[4,[38,4],[[30,0],\\\"togglePlay\\\"],null],[12],[1,\\\"\\\\n\\\"],[41,[33,5],[[[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/pause\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/play\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[1,[28,[35,6],null,[[\\\"sound\\\",\\\"duration\\\",\\\"currentTime\\\",\\\"didSeek\\\"],[[33,7],[33,8],[33,9],[28,[37,4],[[30,0],\\\"seekSound\\\"],null]]]]],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[14,0,\\\"duration-container\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,10],null,[[\\\"classNames\\\",\\\"durationInMs\\\"],[\\\"current-time\\\",[33,9]]]]],[1,\\\"\\\\n            |\\\\n            \\\"],[1,[28,[35,10],null,[[\\\"classNames\\\",\\\"durationInMs\\\"],[\\\"total-time\\\",[33,8]]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[]]]],[],false,[\\\"if\\\",\\\"loading\\\",\\\"t\\\",\\\"loadingError\\\",\\\"action\\\",\\\"playing\\\",\\\"audio-player/seek-bar\\\",\\\"sound\\\",\\\"duration\\\",\\\"currentTime\\\",\\\"duration-format\\\"]]\",\"moduleName\":\"web-directory/components/audio-player/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { observer } from '@ember/object';\nimport { inject } from '@ember/service';\nimport layout from './template';\nimport { Maybe } from 'web-directory/types';\nimport { StashLoggerService } from '@web-directory/services';\n\ninterface AudioVisualizerComponent {\n    audioStream: Maybe<MediaStream>;\n    backgroundColor: string;\n    lineColor: string;\n    canvasEl: Maybe<HTMLCanvasElement>;\n    canvasCtx: Maybe<CanvasRenderingContext2D>;\n    audioCtx: Maybe<AudioContext>;\n    currentAnimationFrame: Maybe<number>;\n    hasStarted: boolean;\n    isInitialized: boolean;\n    isVisualizing: boolean;\n    logger: StashLoggerService;\n    _cleanupAnalyzer(): void;\n    _startVisualization(): void;\n    _visualizeAudio(stream: MediaStream): void;\n}\n\nexport default Component.extend({\n    /**\n     * The classes to be applied to the component upon render\n     */\n    classNames: ['audio-visualizer'] as const,\n\n    /**\n     * The template layout for this component\n     */\n    layout: layout,\n\n    /**\n     * Stash logger service for logging warnings and errors\n     */\n    logger: inject('stash-logger'),\n\n    /**\n     * @attribute\n     *\n     * The MediaStream from the user's microphone to visualize\n     */\n    audioStream: null as Maybe<MediaStream>,\n\n    /**\n     * @attribute\n     *\n     * The background color of the visualization canvas\n     */\n    backgroundColor: '#F5FCFF',\n\n    /**\n     * @attribute\n     *\n     * The color of the waveform line\n     */\n    lineColor: '#4F7787',\n\n    /**\n     * The canvas element reference\n     */\n    canvasEl: null as Maybe<HTMLCanvasElement>,\n\n    /**\n     * The 2D rendering context for the canvas\n     */\n    canvasCtx: null as Maybe<CanvasRenderingContext2D>,\n\n    /**\n     * The Web Audio API context\n     */\n    audioCtx: null as Maybe<AudioContext>,\n\n    /**\n     * The current animation frame ID for cleanup\n     */\n    currentAnimationFrame: null as Maybe<number>,\n\n    /**\n     * Flag to track if visualization has been started\n     */\n    hasStarted: false,\n\n    /**\n     * Flag to track if canvas has been initialized\n     */\n    isInitialized: false,\n\n    /**\n     * Flag to track if we're currently in the process of starting visualization\n     */\n    isVisualizing: false,\n\n    /**\n     * Lifecycle hook called after the component is inserted into the DOM.\n     * Sets up the canvas element and context, and starts visualization if an audio stream is available.\n     */\n    didInsertElement(this: Component & AudioVisualizerComponent) {\n        this._super(...arguments);\n        const canvas = this.element.querySelector('canvas') as HTMLCanvasElement;\n\n        if (!canvas) {\n            this.get('logger').warn('audio-visualizer: Canvas element not found');\n            return;\n        }\n\n        const ctx = canvas.getContext('2d');\n        if (!ctx) {\n            this.get('logger').warn('audio-visualizer: Could not get 2d context from canvas');\n            return;\n        }\n\n        // Set default canvas dimensions if not specified\n        if (!canvas.width) {\n            canvas.width = 300;\n        }\n        if (!canvas.height) {\n            canvas.height = 150;\n        }\n\n        this.set('canvasEl', canvas);\n        this.set('canvasCtx', ctx);\n        this.set('isInitialized', true);\n\n        // Start visualization after canvas is properly set up\n        if (this.get('audioStream') && !this.get('hasStarted')) {\n            this._startVisualization();\n        }\n    },\n\n    /**\n     * Lifecycle hook called before the component is destroyed.\n     * Cleans up the audio analyzer and animation frame to prevent memory leaks.\n     */\n    willDestroyElement() {\n        this._super(...arguments);\n        // Cancel any pending animation frame before cleanup\n        const currentFrame = this.get('currentAnimationFrame');\n        if (currentFrame) {\n            cancelAnimationFrame(currentFrame);\n            this.set('currentAnimationFrame', null);\n        }\n        this._cleanupAnalyzer();\n    },\n\n    /**\n     * Cleans up the Web Audio API context and cancels any pending animation frames.\n     * This prevents memory leaks and ensures proper resource cleanup.\n     */\n    _cleanupAnalyzer() {\n        const audioCtx = this.get('audioCtx');\n        if (audioCtx) {\n            audioCtx.close();\n            this.set('audioCtx', null);\n        }\n\n        const currentFrame = this.get('currentAnimationFrame');\n        if (currentFrame) {\n            cancelAnimationFrame(currentFrame);\n            this.set('currentAnimationFrame', null);\n        }\n    },\n\n    /**\n     * Starts the audio visualization process.\n     * Cleans up any existing visualization and initializes a new one with the current audio stream.\n     */\n    _startVisualization(this: Component & AudioVisualizerComponent) {\n        // Don't start if canvas isn't initialized yet\n        if (!this.get('isInitialized')) {\n            return;\n        }\n\n        // Prevent race condition if already visualizing\n        if (this.get('isVisualizing')) {\n            return;\n        }\n\n        this.set('isVisualizing', true);\n        this.set('hasStarted', true);\n        this._cleanupAnalyzer();\n\n        const stream = this.get('audioStream');\n        if (stream) {\n            this._visualizeAudio(stream);\n        } else {\n            this.set('isVisualizing', false);\n        }\n    },\n\n    /**\n     * @observer\n     *\n     * Observes changes to the audioStream property and restarts visualization when it changes.\n     * Only triggers when audioStream is not null, canvas is initialized, and component is not being destroyed.\n     */\n    resetVisualization: observer('audioStream', function (this: Component & AudioVisualizerComponent) {\n        if (this.get('isDestroying') || this.get('isDestroyed')) {\n            return;\n        }\n\n        if (this.get('audioStream') && this.get('isInitialized')) {\n            this._startVisualization();\n        }\n    }),\n\n    /**\n     * Visualizes the audio from a MediaStream using the Web Audio API.\n     * Creates an audio analyzer and draws a real-time waveform visualization on the canvas.\n     *\n     * @param stream - The MediaStream from the user's microphone to visualize\n     */\n    _visualizeAudio(this: Component & AudioVisualizerComponent, stream: MediaStream) {\n        // Check if AudioContext is supported\n        const AudioCtx = window.AudioContext || (window as any).webkitAudioContext;\n        if (!AudioCtx) {\n            this.get('logger').error('audio-visualizer: AudioContext is not supported in this browser');\n            this.set('isVisualizing', false);\n            return;\n        }\n\n        let audioCtx: AudioContext;\n        try {\n            audioCtx = new AudioCtx() as AudioContext;\n        } catch (error) {\n            this.get('logger').error('audio-visualizer: Failed to create AudioContext', { error } as any);\n            this.set('isVisualizing', false);\n            return;\n        }\n\n        this.set('audioCtx', audioCtx);\n\n        // Resume audio context if it's suspended\n        if (audioCtx.state === 'suspended') {\n            audioCtx.resume().catch(error => {\n                this.get('logger').error('audio-visualizer: Failed to resume AudioContext', { error } as any);\n                // Continue with visualization even if resume fails\n            });\n        }\n\n        const analyser = audioCtx.createAnalyser();\n        analyser.minDecibels = -90;\n        analyser.maxDecibels = -10;\n        analyser.smoothingTimeConstant = 0.65;\n\n        let source: MediaStreamAudioSourceNode;\n        try {\n            source = audioCtx.createMediaStreamSource(stream);\n            source.connect(analyser);\n        } catch (error) {\n            this.get('logger').error('audio-visualizer: Failed to create media stream source', { error } as any);\n            audioCtx.close();\n            this.set('audioCtx', null);\n            this.set('isVisualizing', false);\n            this.set('hasStarted', false);\n            return;\n        }\n\n        const canvas = this.get('canvasEl');\n        const canvasCtx = this.get('canvasCtx');\n\n        if (!canvas || !canvasCtx) {\n            this.set('isVisualizing', false);\n            return;\n        }\n\n        const width = canvas.width;\n        const height = canvas.height;\n\n        const bufferLength = (analyser.fftSize = 2048);\n        const dataArray = new Uint8Array(bufferLength);\n\n        canvasCtx.clearRect(0, 0, width, height);\n        const _this = this;\n\n        function draw() {\n            // Check if component is being destroyed before continuing\n            if (_this.get('isDestroying') || _this.get('isDestroyed')) {\n                // Cleanup if we're being destroyed\n                const currentFrame = _this.get('currentAnimationFrame');\n                if (currentFrame) {\n                    cancelAnimationFrame(currentFrame);\n                    _this.set('currentAnimationFrame', null);\n                }\n                _this.set('isVisualizing', false);\n                return;\n            }\n\n            // Recheck canvas context is still valid\n            const currentCtx = _this.get('canvasCtx');\n            const currentCanvas = _this.get('canvasEl');\n            if (!currentCtx || !currentCanvas) {\n                _this.set('isVisualizing', false);\n                return;\n            }\n\n            _this.set('currentAnimationFrame', requestAnimationFrame(draw));\n\n            analyser.getByteTimeDomainData(dataArray);\n\n            currentCtx.fillStyle = _this.get('backgroundColor');\n            currentCtx.fillRect(0, 0, width, height);\n\n            currentCtx.lineWidth = 1;\n            currentCtx.strokeStyle = _this.get('lineColor');\n\n            currentCtx.beginPath();\n\n            const sliceWidth = width / bufferLength;\n            let x = 0;\n\n            for (let i = 0; i < bufferLength; i++) {\n                const v = dataArray[i] / 128.0;\n                const y = (v * height) / 2;\n\n                if (i === 0) {\n                    currentCtx.moveTo(x, y);\n                } else {\n                    currentCtx.lineTo(x, y);\n                }\n\n                x += sliceWidth;\n            }\n\n            currentCtx.lineTo(currentCanvas.width, currentCanvas.height / 2);\n            currentCtx.stroke();\n        }\n\n        draw();\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"jQGho0Xm\",\"block\":\"[[[10,\\\"canvas\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[],false,[]]\",\"moduleName\":\"web-directory/components/audio-visualizer/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport { computed } from '@ember/object';\nimport Component from '@ember/component';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nexport default Component.extend(LoggerMixin, {\n    auditDrawerOpen: true,\n    showAppChrome: false,\n    auditDrawerTitle: computed('auditDrawerOpen', function () {\n        if (this.auditDrawerOpen) {\n            return this.intl.t('admin.audit_footer.hide');\n        } else {\n            return this.intl.t('admin.audit_footer.show');\n        }\n    }),\n\n    intl: service(),\n    session: service(),\n    sidebar: service(),\n    notification: service(),\n\n    route: '/audit-footer',\n\n    init() {\n        this._super(...arguments);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.setupFrameRouter();\n    },\n\n    setupFrameRouter() {\n        let appUrl = `${window.location.origin}/audit-viewer-ui/`;\n        if (window.location.hostname.indexOf('localhost') > -1) {\n            appUrl = 'https://localhost:5001/audit-viewer-ui/';\n        }\n\n        let frame = this.element.querySelector('frame-router');\n\n        if (!frame) {\n            return;\n        }\n\n        frame.setupFrames(\n            {\n                audit: {\n                    url: `${appUrl}#/audit-footer`,\n                    assignedRoute: this.route\n                }\n            },\n            {\n                locale: this.get('intl.isoRegionalLocale'),\n                hostRootUrl: window.location.origin,\n                custom: {\n                    authToken: this.get('session.accessToken')\n                }\n            }\n        );\n\n        frame.messaging.addListener('logger', this.handleLogger.bind(this));\n        frame.addEventListener('notifyRequest', this.notifyRequest.bind(this));\n    },\n\n    notifyRequest(event) {\n        const title = event.detail.title;\n        const message = event.detail.message;\n        const type = event.detail.custom && event.detail.custom.type;\n        const options = event.detail.custom || {};\n        if (!type || typeof this.notification[type] !== 'function') {\n            return;\n        }\n        const toastIdFromClient = options.id;\n        if (options.id) {\n            // Use unique ID to avoid conflicts with other iframe clients\n            options.id = this.getUniqueToastId(event.detail.clientId, toastIdFromClient);\n            // The desktop-notification component overwrites id with what's in the tag property, so add that as well\n            options.tag = options.id;\n        }\n        this.notification[type](title, message, options);\n    },\n\n    handleLogger(logMessage) {\n        if (logMessage && logMessage.payload && logMessage.payload.type === 'error') {\n            this.logger.error(logMessage.payload.message, logMessage.payload.error);\n        }\n    },\n\n    actions: {\n        toggleAuditDrawer() {\n            this.toggleProperty('auditDrawerOpen');\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"tB9XySFZ\",\"block\":\"[[[10,0],[15,0,[29,[\\\"audit-footer application-scroll\\\\n    \\\",[52,[51,[33,1]],\\\"audit-peekup\\\"],\\\"\\\\n    \\\",[52,[33,3],[33,4,[\\\"communicationOffset\\\"]]]]]],[15,\\\"title\\\",[36,5]],[14,\\\"tabindex\\\",\\\"0\\\"],[12],[1,\\\"\\\\n    \\\"],[11,0],[24,\\\"role\\\",\\\"button\\\"],[24,0,\\\"audit-top-panel\\\"],[16,\\\"aria-label\\\",[36,5]],[4,[38,6],[[30,0],\\\"toggleAuditDrawer\\\"],null],[12],[13],[1,\\\"\\\\n    \\\"],[11,\\\"button\\\"],[24,0,\\\"audit-button\\\"],[16,\\\"aria-label\\\",[36,5]],[24,4,\\\"button\\\"],[4,[38,6],[[30,0],\\\"toggleAuditDrawer\\\"],null],[12],[1,\\\"\\\\n\\\"],[41,[33,1],[[[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/chevron-down\\\"],[15,\\\"screenreader-text\\\",[36,5]],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/chevron-up\\\"],[14,0,\\\"audit-button-content\\\"],[15,\\\"screenreader-text\\\",[36,5]],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[15,0,[29,[\\\"panel-content \\\",[52,[51,[33,1]],\\\"hidden\\\"]]]],[12],[1,\\\"\\\\n        \\\"],[10,\\\"frame-router\\\"],[15,\\\"route\\\",[36,7]],[12],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[13]],[],false,[\\\"unless\\\",\\\"auditDrawerOpen\\\",\\\"if\\\",\\\"showAppChrome\\\",\\\"sidebar\\\",\\\"auditDrawerTitle\\\",\\\"action\\\",\\\"route\\\"]]\",\"moduleName\":\"web-directory/components/audit-footer/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\n\nexport default Component.extend({\n    classNames: ['auth-loading']\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"dTF5ZiCO\",\"block\":\"[[[10,0],[14,0,\\\"logo-container\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"logo\\\"],[12],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"loading-body\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"gux-page-loading-spinner\\\"],[12],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[]]\",\"moduleName\":\"web-directory/components/auth-loading/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { bool } from '@ember/object/computed';\nimport { computed } from '@ember/object';\nimport layout from './template';\n\nexport default Component.extend({\n    layout,\n    classNames: ['breadcrumb-bar'],\n    breadcrumbs: null,\n    home: null,\n    showBreadcrumbs: bool('breadcrumbs'),\n\n    alternateRoute: computed('breadcrumbs.{length,firstObject.alternateRoute}', function () {\n        if (this.get('breadcrumbs.length')) {\n            return this.get('breadcrumbs.firstObject.alternateRoute') || null;\n        }\n        return null;\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"XmTcvc1x\",\"block\":\"[[[41,[28,[37,1],[[33,2],[33,3]],null],[[[1,\\\"    \\\"],[10,\\\"ol\\\"],[15,0,[29,[\\\"breadcrumbs \\\",[52,[33,3],\\\"disabled\\\"]]]],[12],[1,\\\"\\\\n\\\"],[41,[33,4],[[[1,\\\"            \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,3],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/house\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,3],[15,6,[36,4]],[15,\\\"aria-label\\\",[28,[37,5],[\\\"navComponents.breadcrumbs.home\\\"],null]],[12],[1,\\\"\\\\n\\\"],[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/house\\\"],[15,\\\"screenreader-text\\\",[28,[37,5],[\\\"navComponents.breadcrumbs.home\\\"],null]],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[42,[28,[37,7],[[28,[37,7],[[33,8]],null]],null],null,[[[1,\\\"            \\\"],[10,\\\"li\\\"],[15,0,[29,[[52,[30,1,[\\\"active\\\"]],\\\"active\\\"],\\\" \\\",[30,1,[\\\"class\\\"]]]]],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,9],[[30,1,[\\\"hash\\\"]],[28,[37,10],[[33,3]],null]],null],[[[1,\\\"                    \\\"],[10,3],[15,6,[30,1,[\\\"hash\\\"]]],[15,\\\"target\\\",[30,1,[\\\"target\\\"]]],[12],[1,[30,1,[\\\"value\\\"]]],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[1,[30,1,[\\\"value\\\"]]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[30,1,[\\\"componentName\\\"]],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"component\\\"],[12],[1,\\\"\\\\n                    \\\"],[46,[30,1,[\\\"componentName\\\"]],null,[[\\\"params\\\"],[[30,1,[\\\"componentParams\\\"]]]],null],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[1]],null],[1,\\\"\\\\n\\\"],[41,[33,12],[[[1,\\\"            \\\"],[10,\\\"li\\\"],[14,0,\\\"saved-filter\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                \\\"],[10,\\\"i\\\"],[14,0,\\\"fa fa-save\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"filter-text\\\"],[12],[1,\\\" \\\"],[1,[33,12,[\\\"name\\\"]]],[1,\\\" \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,13],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"view-link-container\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,5],[\\\"navComponents.breadcrumbs.newLook\\\"],null]],[1,\\\"\\\\n            \\\"],[10,3],[14,0,\\\"view-link\\\"],[15,6,[36,13]],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,5],[\\\"navComponents.breadcrumbs.switchView\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null]],[\\\"breadcrumb\\\"],false,[\\\"if\\\",\\\"or\\\",\\\"showBreadcrumbs\\\",\\\"disabled\\\",\\\"home\\\",\\\"t\\\",\\\"each\\\",\\\"-track-array\\\",\\\"breadcrumbs\\\",\\\"and\\\",\\\"not\\\",\\\"component\\\",\\\"savedFilter\\\",\\\"alternateRoute\\\"]]\",\"moduleName\":\"web-directory/components/breadcrumb-bar/template.hbs\",\"isStrictMode\":false});","import { reads, gte, not, equal, notEmpty } from '@ember/object/computed';\nimport { resolve, all } from 'rsvp';\nimport Component from '@ember/component';\nimport EmberObject, { observer, computed, get } from '@ember/object';\nimport { on } from '@ember/object/evented';\nimport { run, debounce } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport Ember from 'ember';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport _ from 'lodash';\nimport { doFocus } from 'web-directory/utils/focus-management';\nimport { isScreenMonitoringParticipant } from 'web-directory/utils/acd';\nimport { isTesting } from 'web-directory/utils/testing';\nimport PromiseLoadingMixin from '../../mixins/promise-loading';\nimport { BASE_PERSON } from '../../models/person';\n\nexport default Component.extend(PromiseLoadingMixin, LoggerMixin, {\n    classNames: ['call-controls-container', 'draggable-dropzone'],\n    classNameBindings: ['phone.onCall:multiple-calls', 'dragClass'],\n\n    session: service(),\n    sidebar: service(),\n    commandNav: service('command-nav'),\n    phone: service(),\n    chatFrame: service(),\n    permissions: service(),\n    fax: service(),\n    intl: service(),\n    chat: service(),\n    webrtcSdkService: service('webrtcSdk'),\n    webrtc: service(),\n    clock: service(), // EPC service\n    emergencyLocation: service('emergency-location'),\n    activeCall: null,\n    activeFaxes: reads('fax.activeFaxes'),\n    station: reads('phone.station'),\n    onConference: reads('activeCall.onConference'),\n    onConsult: reads('activeCall.onConsult'),\n    activeCallId: reads('activeCall.id'),\n    transferPerson: null,\n    transferNumber: null,\n    transferParticipants: [],\n    numberInputType: 'person',\n    showTransfer: false,\n    showDropdown: false,\n    loadingChat: false,\n    reloading: false,\n    addingParticipants: false,\n    itemToDrop: null,\n    faxOutbound: reads('permissions.canFax'),\n    viewAssociateDashboard: reads('permissions.canViewAssociateDashboard'),\n    isActiveFaxes: gte('fax.activeFaxes.length', 1),\n    promptForMerge: reads('phone.shouldPromptForMerge'),\n    myGuid: reads('session.person.guid'),\n    personId: reads('myGuid'),\n    noStationSelected: reads('phone.noStationSelected'),\n    stationSelected: not('noStationSelected'),\n    needStation: reads('phone.needStation'),\n    showStationPicker: false,\n    enableStationPicker: false, // TODO: remove (!features.followMe)\n    peerDisconnectedCall: reads('activeCall.peerDisconnectedCall'),\n    myselfDisconnectedCall: reads('activeCall.myselfDisconnectedCall'),\n    roomJidToAddPartiesTo: null,\n    partiesToGetAddedToChat: null,\n    debouncePeriod: 1000,\n    debounceTimers: [],\n    participantsOnCall: [],\n    peopleCache: [],\n    dialpadShouldSendDtmf: reads('phone.thereIsAConnectedConversation'),\n    panel: null,\n    panels: {\n        callHistory: true,\n        directory: false,\n        dialpad: false,\n        inbox: false,\n        station: false,\n        call: false,\n        fax: false,\n        phoneSettings: false,\n        followMeSettings: false\n    },\n    dropdowns: {\n        held: false\n    },\n    testing: false,\n    // TODO: move this back to call forwarding mixin or phone service\n    canCallForward: reads('phone.canCallForward'),\n    callForwardingActive: reads('phone.callForwardingActive'),\n    offQueue: not('phone.onQueue'),\n    showEnableCallForwarding: computed('callForwardingActive', 'offQueue', function () {\n        return !this.callForwardingActive && this.offQueue;\n    }),\n\n    // Right now this value is based on the feature toggle PURE-5487_require_queue. When PURE-5487_require_queue will be globally enabled, we have to pass enableRequireQueueDialpadLogic=true from call-controls template.hbs file\n    // When PURE-5487_require_queue is enabled, there is some logic, we want to run only when dial-pad is rendered through the call-controls panel\n    enableRequireQueueDialpadLogic: reads('session.features.PURE-5487_require_queue'),\n\n    //note - changed this to computed here as the new nav was not setting this:\n    emergencyLocationOn: reads('session.features.emergencyLocation'),\n    emergencyLocationData: reads('emergencyLocation.emergencyLocationData'),\n\n    showEmergencyLocation: computed('emergencyLocationOn', 'phone.activeCall', function () {\n        const onActiveCall = !!this.get('phone.activeCall');\n        return this.emergencyLocationOn && !onActiveCall;\n    }),\n\n    showCallControls: computed('sidebar.showCallControls', 'session.useNewNav', 'commandNav.currentPanel', function () {\n        if (this.get('session.useNewNav')) {\n            return this.get('commandNav.currentPanel') == 'voice';\n        } else {\n            return this.get('sidebar.showCallControls');\n        }\n    }),\n\n    currentTab: computed(\n        'session.useNewNav',\n        'sidebar.substates.callControls.currentTab',\n        'commandNav.callControlsTab',\n        function () {\n            if (this.get('session.useNewNav')) {\n                return this.get('commandNav.callControlsTab');\n            } else {\n                return this.get('sidebar.substates.callControls.currentTab');\n            }\n        }\n    ),\n\n    persistentConnectionActive: computed(\n        'phone.persistentConnectionActive',\n        'webrtcSdkService.{useSdk,isPersistentConnection,hasActiveSoftphoneSession}',\n        function () {\n            if (!this.get('webrtcSdkService.useSdk')) {\n                return this.get('phone.persistentConnectionActive');\n            }\n\n            return (\n                this.get('webrtcSdkService.isPersistentConnection') &&\n                this.get('webrtcSdkService.hasActiveSoftphoneSession')\n            );\n        }\n    ),\n\n    isPoppedOut: computed('phone.activeRoom.isPopout', function () {\n        return this.get('phone.activeRoom.isPopout');\n    }),\n\n    removeScrollAndShrinkDialPad: computed('panels.dialpad', 'addingParticipants', function () {\n        return this.get('panels.dialpad') && !this.addingParticipants;\n    }),\n\n    actions: {\n        clearPanels() {\n            this.clearPanels();\n        },\n        setPanels(obj) {\n            Object.keys(obj).forEach(key => {\n                this.set(`panels.${key}`, obj[key]);\n            });\n        },\n        openStationPicker() {\n            this.send('changeActivePanel', 'followMeSettings', 'showStationPicker');\n            this.toggleNewCallFaxPopover(this.showDropdown);\n        },\n        closeStationPicker() {\n            this.set('showStationPicker', false);\n        },\n        callForwarding() {\n            this.send('changeActivePanel', 'followMeSettings');\n            this.onClosePopover();\n        },\n        cancelCallForwarding() {\n            this.set('configuringCallForwarding', false);\n        },\n        disassociateStation() {\n            return this.phone.disassociateStation();\n        },\n        disconnectPersistentConnection() {\n            if (this.get('webrtcSdkService.useSdk')) {\n                return this.webrtcSdkService.endAllSoftphoneSessions();\n            }\n            return this.phone.disconnectPersistentConnection();\n        },\n        chooseStation(uri) {\n            return this.phone.chooseStation(uri);\n        },\n        held() {\n            if (this.get('phone.activeCall.onConsult')) {\n                this.send('toggleDropdown', 'held');\n            } else {\n                this.phone.held();\n            }\n        },\n\n        itemDropped(dropEvent) {\n            const conversationId = dropEvent.dataTransfer.getData('text/x-conversationId');\n            const droppedConversation = this.get('phone.conversations').findBy('id', conversationId);\n\n            if (!droppedConversation) {\n                this.logger.error('Failed to find conversation for dropped conversationId', { conversationId });\n                return;\n            }\n\n            if (droppedConversation === this.get('phone.activeCall')) {\n                this.logger.warn('Cannot merge active call with itself');\n                return;\n            }\n\n            const callsToMerge = [];\n            callsToMerge.push(this.phone.activeCall);\n            callsToMerge.push(droppedConversation);\n            this.phone.mergeCalls(callsToMerge);\n            this.clearPanels();\n            this.set('panels.call', true);\n        },\n\n        makeMergeRequest() {\n            this.phone.makeMergeRequest();\n        },\n\n        cancelMerge() {\n            this.phone.clearMergeData();\n        },\n\n        mute() {\n            this.phone.mute();\n        },\n\n        endCall() {\n            if (this.get('phone.activeCall.onConsult')) {\n                this.send('toggleDropdown', 'hangup');\n            } else {\n                this.phone.endCall();\n                this.resetProperties();\n            }\n        },\n\n        record() {\n            this.phone.record();\n        },\n\n        changeActiveCall(conversation) {\n            if (!conversation.get('isIncoming')) {\n                this.logger.debug('call-controls:changeActiveCall: switching activeCall');\n                this.phone.setActiveCall(conversation);\n            }\n        },\n\n        addParticipant() {\n            this.set('addingParticipants', true);\n        },\n\n        dialNumber(person) {\n            const number = this.phoneNumber;\n            if (number) {\n                this.phone.makeCall(number.trim(), person);\n                this.set('phoneNumber', null);\n            }\n        },\n\n        toggleShowTransfer() {\n            this.toggleProperty('showTransfer');\n        },\n\n        toggleDropdown(type) {\n            if (this.get('phone.activeCall.canUpdateConsult')) {\n                this.toggleProperty(`dropdowns.${type}`);\n            }\n        },\n\n        selectPerson(person) {\n            const info = person.getFieldValue('primaryContactInfo.voice');\n            const number = get(info, 'value.number');\n            if (number) {\n                this.set('phoneNumber', number);\n                this.send('dialNumber', person);\n            }\n        },\n\n        changeActivePanel(panel, action) {\n            if (this.get('session.useNewNav')) {\n                this.set('commandNav.callControlsTab', panel);\n            } else {\n                this.set('sidebar.substates.callControls.currentTab', panel);\n            }\n\n            if (action === 'showStationPicker') {\n                this.set('showStationPicker', true);\n            } else {\n                this.set('showStationPicker', false);\n            }\n            if (action === 'addingCall') {\n                this.set('addingCall', true);\n            } else {\n                this.set('addingCall', false);\n            }\n        },\n\n        // Empty, used as a holder for chat-conversation\n        noop() {\n            return;\n        },\n\n        toggleNewCallFaxPopover(status) {\n            this.set('showDropdown', !status);\n        }\n    },\n\n    showChatRoom: computed('phone.activeRoom', 'showTransfer', 'permissions.canViewBusinessChat', function () {\n        if (!this.get('permissions.canViewBusinessChat')) {\n            return false;\n        }\n        return this.get('phone.activeRoom') && !this.showTransfer && !this.loadingChat;\n    }),\n    isInputNumber: equal('numberInputType', 'number'),\n    showTransferButtons: notEmpty('transferParticipants'),\n    onCall: computed('phone.{onCall,isActiveCallACD}', function () {\n        return this.get('phone.onCall') && !this.get('phone.isActiveCallACD');\n    }),\n\n    activeNonAcdCalls: reads('phone.activeNonAcdCalls'),\n\n    willDestroy() {\n        this._super(...arguments);\n        return this.debounceTimers.forEach(item => run.cancel(item));\n    },\n\n    init() {\n        this._super(...arguments);\n        this._activePanelChanged();\n    },\n\n    _setInitialPanel() {\n        const panels = this.panels;\n        const panelKeys = Object.keys(panels);\n        const isCallOnlyCurrentPanel = panelKeys.every(panel => !panels[panel] || (panel === 'call' && panels[panel]));\n\n        // if not on a call and no active calls and current panel is call, switch to call history\n        if (!this.onCall && _.isEmpty(this.activeNonAcdCalls) && isCallOnlyCurrentPanel) {\n            this.send('changeActivePanel', 'callHistory');\n            // if there's an active call that is not an agent call or originating from the webrtc-troubleshooter, switch to call panel\n        } else if (\n            !!this.activeCall &&\n            !this.get('activeCall.isAgentCall') &&\n            !this.get('webrtc.webrtcTroubleshooterCall')\n        ) {\n            this.send('changeActivePanel', 'call');\n            // if needs station, switch to station panel\n        } else if (this.needStation) {\n            this.send('changeActivePanel', 'station');\n            // otherwise, switch to whatever current tab was passed in unless another tab has been selected\n        }\n        this.bindPopover();\n    },\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n        if (this.get('session.useNewNav')) {\n            debounce(this, this._setInitialPanel, 100);\n        } else {\n            this._setInitialPanel();\n        }\n    },\n\n    didUpdateAttrs() {\n        this._super(...arguments);\n        const chat = this.chat;\n        if (!(chat.get('connected') && this.activeCall)) {\n            return;\n        }\n        const people = [];\n        const store = this.store;\n        let chatPartiesOnCall = this.chatPartiesOnCall;\n        if (!isTesting) {\n            _.each(chatPartiesOnCall, party => {\n                if (store.peekRecord('person', party)) {\n                    people.push(resolve(store.peekRecord('person', party)));\n                } else {\n                    people.push(store.find('person', party));\n                }\n            });\n            if (!_.eq(this.peopleCache, people) && this.get('activeCall.onCall')) {\n                run.scheduleOnce('actions', this, this.setupJidsAndRoom, people);\n            }\n            this.set('peopleCache', people);\n        }\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.unbindPopover();\n    },\n\n    bindPopover() {\n        $('gux-popover-list').on('guxdismiss', () => {\n            this.onClosePopover();\n        });\n    },\n\n    onClosePopover() {\n        $('gux-popover-list').each((index, element) => {\n            element.isOpen = false;\n            this.set('showDropdown', false);\n        });\n    },\n\n    unbindPopover() {\n        $('gux-popover-list').off('guxdismiss');\n    },\n\n    _activePanelChanged: on(\n        'init',\n        observer('currentTab', 'phone.activeCall.connectedParties', function () {\n            this.onClosePopover();\n            const panel = this.get('currentTab');\n            this.didUpdateAttrs();\n            const key = `panels.${panel}`;\n            if (!this.get(key)) {\n                // if panel is not already set, clear and set\n                this.logger.debug(`call-controls:changeActivePanel: setting panel to ${panel}`);\n                this.clearPanels();\n                this.set(key, true);\n            }\n        })\n    ),\n\n    itemToggled(_, value) {\n        this.send('changeActivePanel', value);\n        const focusTarget = '.panel-content';\n\n        // We auto focus the dialpad when sending dtmf signals\n        // PCUCC-89\n        // only focus the panel if we're not sending dtmf signals\n        if (value !== 'dialpad' && !this.dialpadShouldSendDtmf) {\n            doFocus(Ember, focusTarget);\n        }\n    },\n\n    _getHistoryConfig(canUseAssociateActivity) {\n        const associateActivityTitle = this.intl.t('associateActivity.title');\n        const callHistoryTitle = this.intl.t('purecloud.callHistory');\n        const historyTitle = canUseAssociateActivity ? associateActivityTitle : callHistoryTitle;\n\n        const callHistoryIcon = 'phone-call-history';\n        const associateActivityIcon = 'home';\n        const historyIcon = canUseAssociateActivity ? associateActivityIcon : callHistoryIcon;\n\n        return [historyTitle, historyIcon];\n    },\n\n    panelConfigs: computed(\n        'faxOutbound',\n        'noStationSelected',\n        'phone.webrtcPhoneWithIssues',\n        'permissions.canViewAssociateDashboard',\n        function () {\n            const canUseAssociateActivity = this.get('permissions.canViewAssociateDashboard');\n            const [historyTitle, historyIcon] = this._getHistoryConfig(canUseAssociateActivity);\n\n            return [\n                EmberObject.create({\n                    id: 'callHistory',\n                    showTab: true,\n                    icon: {\n                        guxIcon: {\n                            name: historyIcon,\n                            decorative: true\n                        }\n                    },\n                    name: historyTitle,\n                    supplementalClassNames: 'tab monochromic-icon',\n                    sortPriority: 100\n                }),\n                EmberObject.create({\n                    id: 'dialpad',\n                    showTab: true,\n                    icon: {\n                        guxIcon: {\n                            name: 'phone-dialpad',\n                            decorative: true\n                        }\n                    },\n                    name: this.intl.t('purecloud.dialPad'),\n                    supplementalClassNames: 'tab tab-dialpad monochromic-icon',\n                    sortPriority: 101\n                }),\n                EmberObject.create({\n                    id: 'inbox',\n                    showTab: true,\n                    icon: {\n                        guxIcon: {\n                            name: 'inbox',\n                            decorative: true\n                        }\n                    },\n                    name: this.intl.t('components.navMenu.inbox'),\n                    supplementalClassNames: 'tab monochromic-icon',\n                    sortPriority: 102\n                }),\n                EmberObject.create({\n                    id: 'followMeSettings',\n                    showTab: true,\n                    icon: {\n                        guxIcon: {\n                            name: this.noStationSelected ? 'legacy/phone-disable' : 'phone',\n                            decorative: true\n                        }\n                    },\n                    name: this.intl.t('followMe.panelTitle'),\n                    supplementalClassNames: this.noStationSelected\n                        ? 'tab station-picker no-station'\n                        : 'tab station-picker monochromic-icon',\n                    sortPriority: 103\n                }),\n                EmberObject.create({\n                    id: 'fax',\n                    showTab: this.faxOutbound,\n                    icon: {\n                        guxIcon: {\n                            name: 'fax',\n                            decorative: true\n                        }\n                    },\n                    name: this.intl.t('purecloud.fax.sendFax'),\n                    supplementalClassNames: 'tab monochromic-icon',\n                    sortPriority: 104\n                }),\n                EmberObject.create({\n                    id: 'phoneSettings',\n                    showTab: true,\n                    icon: {\n                        guxIcon: {\n                            name: 'settings',\n                            decorative: 'true'\n                        }\n                    },\n                    name: this.intl.t('followMe.phoneSettings'),\n                    supplementalClassNames: this.get('phone.webrtcPhoneWithIssues')\n                        ? 'no-station tab station-picker'\n                        : 'tab station-picker monochromic-icon',\n                    sortPriority: 105\n                })\n            ];\n        }\n    ),\n\n    setupJidsAndRoom(people) {\n        const chat = this.chat;\n        let partiesThatNeedToGetAdded = [];\n        return all(people)\n            .then(results => {\n                // This thenable handles a special case where jids are undefined,\n                // do a hard fetch with findMany\n                const missingJids = _.some(results, r => !r.get('jid'));\n                if (missingJids) {\n                    return this.store.findMany('person', results.mapBy('guid'), BASE_PERSON);\n                } else {\n                    return resolve(results);\n                }\n            })\n            .then(results => {\n                // This thenable just figures out which jids need to be added to which room.\n                // returns the room object to next thenable\n                const missingJids = _.some(results, r => !r.get('jid'));\n                if (missingJids) {\n                    console.error(\n                        'Unable to get create chat room because jids were missing for some participants ',\n                        this.activeCallId\n                    );\n                }\n                partiesThatNeedToGetAdded = results.mapBy('jid');\n\n                if (partiesThatNeedToGetAdded.length === 2 && !this.onConference) {\n                    partiesThatNeedToGetAdded = _.remove(results, party => {\n                        return party.get('guid') === this.myGuid;\n                    }).mapBy('jid');\n                    const otherParty = _.head(results);\n                    const jid = otherParty && otherParty.get('jid');\n                    if (jid) {\n                        return chat.getChatRoom(jid);\n                    }\n                } else if (this.onConference || this.onConsult) {\n                    let jidId;\n                    // prettier-ignore\n                    jidId = `conference-${this.activeCallId}@conference.${this.get('session.org.shortName')}.orgspan.com`;\n                    return chat.joinRoom(jidId);\n                }\n                return resolve(null);\n            })\n            .then(room => {\n                // Gets the room object and then calls addPartiesToRoom or sets chatroom to null\n                const duration = this.debouncePeriod;\n\n                let debounceTimer;\n                if (room) {\n                    debounceTimer = run.debounce(\n                        this,\n                        this.addPartiesToRoom,\n                        room,\n                        partiesThatNeedToGetAdded,\n                        duration,\n                        false\n                    );\n                } else {\n                    debounceTimer = run.debounce(this, () => this.set('phone.activeRoom', null), duration);\n                }\n                if (debounceTimer) {\n                    this.debounceTimers.push(debounceTimer);\n                }\n                return resolve(room);\n            })\n            .catch(error => console.error('could not set up chat room ', error));\n    },\n\n    addPartiesToRoom(room, partiesThatNeedToGetAdded) {\n        const chatService = this.chat;\n        this.set('partiesToGetAddedToChat', partiesThatNeedToGetAdded);\n        if (partiesThatNeedToGetAdded.length > 0) {\n            this.set('roomJidToAddPartiesTo', room.get('jid'));\n            console.log('Adding parties ' + partiesThatNeedToGetAdded + ' to the room ' + room.get('jid'));\n            chatService.addAllParticipantsToRoom(room, partiesThatNeedToGetAdded);\n        }\n        if (this.onConference) {\n            chatService.setRoomSubject(room, this.intl.t('purecloud.conference'));\n        }\n        chatService.loadRoomHistory(room);\n        chatService.activateRoom(room);\n        this.set('phone.activeRoom', room);\n    },\n\n    /*\n        find the parties that should get added to this call's chat room.\n        should only be connected participants and\n        when on transfer, the non-intiators are always connected to the initiator unless\n        it is an ad-hoc conference\n    */\n    chatPartiesOnCall: computed(\n        'activeCall.{connectedParties,connectedOnConsult,onConsult,initiator}',\n        'myGuid',\n        function () {\n            let participantsOnCall = this.get('activeCall.connectedParties');\n            const initiator = this.get('activeCall.initiator');\n            const iAmtheInitiator = initiator && initiator.userId === this.myGuid;\n            const connectedAndNotConfinedParticipants = _.reject(participantsOnCall, party => {\n                const communication = _.head(party.calls) || _.head(party.callbacks);\n                return communication.confined || communication.confined === 'true';\n            });\n            if (this.onConsult) {\n                // if only two connected, non-confined parties on call, and I'm not the initiator\n                if (connectedAndNotConfinedParticipants.length === 2 && !iAmtheInitiator) {\n                    participantsOnCall = [initiator, this.get('activeCall.myself')];\n                } else {\n                    participantsOnCall = connectedAndNotConfinedParticipants;\n                }\n            }\n\n            // Theres a chance participantsOnCall could have some undefined members,\n            // set to empty array in that case.\n            if (participantsOnCall && !_.some(participantsOnCall, value => value === undefined)) {\n                participantsOnCall = _.reject(participantsOnCall, participant => {\n                    return (\n                        !!participant.monitoredParticipantId ||\n                        !!participant.coachedParticipantId ||\n                        !!participant.bargedParticipantId ||\n                        isScreenMonitoringParticipant(participant)\n                    );\n                });\n                participantsOnCall = participantsOnCall.filterBy('userId').mapBy('userId');\n            } else {\n                participantsOnCall = [];\n            }\n            return participantsOnCall;\n        }\n    ),\n\n    numberOfChatParties: computed('chatPartiesOnCall.[]', function () {\n        return this.get('chatPartiesOnCall.length');\n    }),\n\n    chatPartiesClasses: computed('chatPartiesOnCall', function () {\n        let classNames = '';\n        _.each(this.chatPartiesOnCall, function (userId) {\n            classNames += `chat-party-${userId} `;\n        });\n        return classNames;\n    }),\n\n    durationFormatter: computed('intl.isoLocale', function () {\n        if (window.Intl.DurationFormat) {\n            return new Intl.DurationFormat(this.get('intl.isoLocale'), { style: 'long' });\n        }\n        return undefined;\n    }),\n    readableDurationFormat: computed('activeCall.startTime', 'clock.second', 'durationFormatter', function () {\n        try {\n            // Consume clock.second to establish Glimmer autotracking (Ember 3.28 compatibility)\n            this.get('clock.second');\n            const durationFormatter = this.durationFormatter;\n            const conversationStartTime = this.get('activeCall.startTime');\n            if (!conversationStartTime) {\n                return '';\n            }\n            let startTimeVal = conversationStartTime;\n            // Handle legacy moment objects or plain values\n            if (startTimeVal && typeof startTimeVal === 'object' && typeof startTimeVal.toDate === 'function') {\n                startTimeVal = startTimeVal.toDate();\n            }\n            const startTime = new Date(startTimeVal);\n            if (isNaN(startTime.getTime())) {\n                return '';\n            }\n            const now = new Date();\n            const diffInMS = now - startTime;\n            const seconds = Math.floor((diffInMS / 1000) % 60);\n            const minutes = Math.floor((diffInMS / (1000 * 60)) % 60);\n            const hours = Math.floor(diffInMS / (1000 * 60 * 60));\n            const durationInfo = {\n                hours: hours,\n                minutes: minutes,\n                seconds: seconds\n            };\n            return !!durationFormatter ? durationFormatter.format(durationInfo) : '';\n        } catch (err) {\n            this.logger.warn('<call-controls> duration format failed!', err);\n            return '';\n        }\n    }),\n\n    resetProperties() {\n        this.setProperties({\n            phoneNumber: null,\n            showTransfer: false,\n            addingParticipants: false,\n            numberInputType: 'person',\n            pickedPerson: null,\n            transferParticipants: []\n        });\n    },\n\n    clearPanels() {\n        this.set('showStationPicker', false);\n        this.set('panels', {\n            callHistory: false,\n            directory: false,\n            dialpad: false,\n            inbox: false,\n            station: false,\n            call: false,\n            fax: false,\n            phoneSettings: false,\n            followMeSettings: false\n        });\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"W7DTxhE7\",\"block\":\"[[[10,0],[15,0,[29,[\\\"conversations-container \\\",[52,[33,1,[\\\"hasActiveNonAcdCalls\\\"]],\\\"have-active-calls\\\"]]]],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"conversations-heading\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,\\\"role\\\",\\\"heading\\\"],[14,\\\"aria-level\\\",\\\"1\\\"],[14,0,\\\"active-call-heading\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,2],[\\\"purecloud.activeCalls\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,3],[[33,1,[\\\"enabled\\\"]],[33,4]],null],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"new-call-fax-button-container\\\"],[12],[1,\\\"\\\\n                \\\"],[11,\\\"button\\\"],[24,1,\\\"new-call-fax\\\"],[24,0,\\\"new-call-fax-button\\\"],[16,\\\"title\\\",[28,[37,2],[\\\"purecloud.startNewCallOrFaxTooltip\\\"],null]],[24,4,\\\"button\\\"],[4,[38,5],[[30,0],\\\"toggleNewCallFaxPopover\\\",[33,6]],null],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"add-circle\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,\\\"gux-popover-list\\\"],[14,1,\\\"new-call-fax-popover\\\"],[14,\\\"position\\\",\\\"bottom-end\\\"],[14,\\\"for\\\",\\\"new-call-fax\\\"],[15,\\\"isOpen\\\",[36,6]],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-list\\\"],[14,0,\\\"call-fax-popover\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-list-item\\\"],[14,0,\\\"new-phone-call\\\"],[15,\\\"onclick\\\",[28,[37,5],[[30,0],\\\"changeActivePanel\\\",\\\"dialpad\\\",\\\"addingCall\\\"],null]],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"small\\\"],[12],[1,[28,[35,2],[\\\"purecloud.startANewCall\\\"],null]],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\\n                    \\\"],[10,\\\"gux-list-item\\\"],[14,0,\\\"new-fax\\\"],[15,\\\"onclick\\\",[28,[37,5],[[30,0],\\\"changeActivePanel\\\",\\\"fax\\\"],null]],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"small\\\"],[12],[1,[28,[35,2],[\\\"purecloud.startANewFax\\\"],null]],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,4],[[[1,\\\"            \\\"],[11,\\\"button\\\"],[24,0,\\\"new-call btn btn-link\\\"],[16,\\\"title\\\",[28,[37,2],[\\\"purecloud.sendFaxTooltip\\\"],null]],[24,4,\\\"button\\\"],[4,[38,5],[[30,0],\\\"changeActivePanel\\\",\\\"fax\\\"],null],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"add-circle\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,1,[\\\"enabled\\\"]],[[[1,\\\"            \\\"],[11,\\\"button\\\"],[24,0,\\\"new-call btn btn-link\\\"],[16,\\\"title\\\",[28,[37,2],[\\\"purecloud.startNewCallTooltip\\\"],null]],[24,4,\\\"button\\\"],[4,[38,5],[[30,0],\\\"changeActivePanel\\\",\\\"dialpad\\\",\\\"addingCall\\\"],null],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"add-circle\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"]],[]],null]],[]]]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"active-conversations\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,8],[[28,[37,8],[[33,1,[\\\"activeNonAcdCalls\\\"]]],null]],null],null,[[[41,[30,1,[\\\"isConnected\\\"]],[[[1,\\\"                \\\"],[11,0],[16,0,[29,[\\\"participant-container clickable\\\\n                        \\\",[52,[30,1,[\\\"isActive\\\"]],\\\"is-active\\\"],\\\"\\\\n                        \\\",[52,[30,1,[\\\"isIncoming\\\"]],\\\"is-incoming\\\"],\\\"\\\\n                        \\\"]]],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[4,[38,5],[[30,0],\\\"changeActiveCall\\\",[30,1]],null],[12],[1,\\\"\\\\n\\\\n                    \\\"],[1,[28,[35,9],[[30,1]],[[\\\"clearPanels\\\",\\\"setPanels\\\"],[[28,[37,5],[[30,0],\\\"clearPanels\\\"],null],[28,[37,5],[[30,0],\\\"setPanels\\\"],null]]]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                \\\"],[11,0],[16,0,[29,[\\\"participant-container clickable\\\\n                        \\\",[52,[30,1,[\\\"isActive\\\"]],\\\"is-active\\\"],\\\"\\\\n                        \\\",[52,[30,1,[\\\"isIncoming\\\"]],\\\"is-incoming\\\"],\\\"\\\\n                        \\\"]]],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[4,[38,5],[[30,0],\\\"changeActiveCall\\\",[30,1]],null],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,9],[[30,1]],[[\\\"showCallControls\\\"],[[33,10]]]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[1]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[51,[33,1,[\\\"hasActiveNonAcdCalls\\\"]]],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"start-call\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,2],[\\\"purecloud.startNewCall\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,3],[[33,4],[33,12]],null],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"active-faxes\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,8],[[28,[37,8],[[33,13]],null]],null],null,[[[1,\\\"                \\\"],[1,[28,[35,14],[[30,2]],null]],[1,\\\"\\\\n\\\"]],[2]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[15,0,[29,[\\\"panel-container \\\",[52,[51,[33,15]],\\\"panel-hide-overflow\\\"]]]],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"heading\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,16],null,[[\\\"onchange\\\",\\\"selection\\\",\\\"toggleItemConfigs\\\"],[[28,[37,5],[[30,0],[33,17]],null],[33,18],[33,19]]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[15,0,[29,[\\\"panel-content call-controls-panels\\\\n            \\\",[52,[51,[33,15]],\\\"panel-with-scroll\\\"],\\\"\\\\n            \\\",[52,[33,1,[\\\"onCall\\\"]],\\\"on-call\\\"],\\\"\\\\n            \\\",[52,[33,20,[\\\"call\\\"]],\\\"call-panel\\\"],\\\"\\\\n            \\\",[52,[33,20,[\\\"dialpad\\\"]],\\\"dial-pad\\\"],\\\"\\\\n            \\\",[52,[33,20,[\\\"callHistory\\\"]],\\\"call-history\\\"],\\\"\\\\n            \\\",[52,[33,20,[\\\"phoneSettings\\\"]],\\\"phone-settings\\\"],\\\"\\\\n            \\\",[52,[33,20,[\\\"followMeSettings\\\"]],\\\"follow-me-settings\\\"],\\\"\\\\n            \\\",[52,[28,[37,3],[[33,21],[28,[37,22],[[33,23]],null]],null],\\\"dial-pad-is-dtmf\\\"],\\\"\\\\n            \\\",[52,[33,24],[28,[37,25],[\\\"chat-parties-on-call-\\\",[33,26]],null]],\\\"\\\\n            \\\",[52,[33,24],[33,27]]]]],[14,\\\"tabindex\\\",\\\"-1\\\"],[12],[1,\\\"\\\\n\\\"],[41,[51,[33,28]],[[[41,[33,29],[[[1,\\\"                \\\"],[10,0],[14,1,\\\"associateActivity-panel\\\"],[14,\\\"role\\\",\\\"tabpanel\\\"],[14,\\\"aria-labelledby\\\",\\\"associateActivity\\\"],[15,0,[29,[\\\"associate-activity-container \\\",[52,[51,[33,20,[\\\"callHistory\\\"]]],\\\"hide\\\"]]]],[12],[1,\\\"\\\\n                    \\\"],[1,[34,30]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                \\\"],[10,0],[15,0,[29,[\\\"call-scroll \\\",[52,[51,[33,20,[\\\"callHistory\\\"]]],\\\"hide\\\"]]]],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,31],null,[[\\\"showingCallHistory\\\",\\\"showCallControls\\\",\\\"disconnectedConversations\\\",\\\"useNewNav\\\"],[[33,20,[\\\"callHistory\\\"]],[33,10],[33,1,[\\\"disconnectedConversations\\\"]],[33,32,[\\\"useNewNav\\\"]]]]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[41,[33,20,[\\\"dialpad\\\"]],[[[41,[28,[37,3],[[33,21],[28,[37,22],[[33,23]],null]],null],[[[1,\\\"                    \\\"],[1,[28,[35,33],null,[[\\\"addingParticipants\\\",\\\"showTitle\\\",\\\"showDialpad\\\",\\\"showCallInput\\\",\\\"disableCallOnBehalfOfQueue\\\",\\\"sendDtmf\\\",\\\"enableRequireQueueDialpadLogic\\\"],[false,false,true,false,true,true,[33,34]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[1,[28,[35,33],null,[[\\\"showTitle\\\",\\\"showCallInput\\\",\\\"showDialpad\\\",\\\"showStationPicker\\\",\\\"disableCallOnBehalfOfQueue\\\",\\\"openStationPicker\\\",\\\"enableRequireQueueDialpadLogic\\\"],[[33,35],[33,36],[33,36],[33,35],true,[28,[37,5],[[30,0],\\\"openStationPicker\\\"],null],[33,34]]]]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"\\\\n\\\"],[41,[33,37],[[[1,\\\"                    \\\"],[1,[28,[35,38],null,[[\\\"emergencyLocationData\\\",\\\"showTitle\\\",\\\"personId\\\"],[[33,39],true,[33,40]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,41,[\\\"enabled\\\"]],[[[41,[33,42,[\\\"collabChatMainInitialized\\\"]],[[[1,\\\"                    \\\"],[10,1],[15,0,[29,[[52,[51,[33,20,[\\\"call\\\"]]],\\\"hide\\\"]]]],[12],[1,\\\"\\\\n                        \\\"],[19,\\\"purecloud/partials/on-call\\\",[]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],[[[41,[33,20,[\\\"call\\\"]],[[[1,\\\"                    \\\"],[19,\\\"purecloud/partials/on-call\\\",[]],[1,\\\"\\\\n\\\"]],[]],null]],[]]],[1,\\\"\\\\n            \\\"],[10,0],[15,0,[29,[\\\"inbox-panel-container \\\",[52,[51,[33,20,[\\\"inbox\\\"]]],\\\"hide\\\"]]]],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,44],null,[[\\\"showHeader\\\",\\\"inCallControls\\\"],[false,true]]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,0],[14,1,\\\"phoneSettings-panel\\\"],[14,\\\"role\\\",\\\"tabpanel\\\"],[14,\\\"aria-labelledby\\\",\\\"phoneSettings\\\"],[15,0,[29,[\\\"phone-settings-container \\\",[52,[51,[33,20,[\\\"phoneSettings\\\"]]],\\\"hide\\\"]]]],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,45],[[33,1,[\\\"station\\\"]],[33,1,[\\\"canCallForward\\\"]],[33,46]],[[\\\"showActions\\\",\\\"persistentConnectionActive\\\",\\\"showStationPicker\\\",\\\"showAudioControls\\\",\\\"callForwarding\\\",\\\"disassociateStation\\\",\\\"disconnectPersistentConnection\\\",\\\"openStationPicker\\\"],[true,[33,47],false,true,[28,[37,5],[[30,0],\\\"callForwarding\\\"],null],[28,[37,5],[[30,0],\\\"disassociateStation\\\"],null],[28,[37,5],[[30,0],\\\"disconnectPersistentConnection\\\"],null],[28,[37,5],[[30,0],\\\"openStationPicker\\\"],null]]]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,0],[15,0,[29,[[52,[51,[33,20,[\\\"fax\\\"]]],\\\"hide\\\"]]]],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,48],[[33,35]],[[\\\"changeActivePanel\\\",\\\"openStationPicker\\\"],[[28,[37,5],[[30,0],\\\"changeActivePanel\\\"],null],[28,[37,5],[[30,0],\\\"openStationPicker\\\"],null]]]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,0],[14,1,\\\"followMeSettings-panel\\\"],[14,\\\"role\\\",\\\"tabpanel\\\"],[14,\\\"aria-labelledby\\\",\\\"followMeSettings\\\"],[15,0,[29,[\\\"follow-me-settings-container \\\",[52,[51,[33,20,[\\\"followMeSettings\\\"]]],\\\"hide\\\"]]]],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,49],null,[[\\\"showStationPicker\\\"],[[33,50]]]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[\\\"conversation\\\",\\\"fax\\\"],true,[\\\"if\\\",\\\"phone\\\",\\\"t\\\",\\\"and\\\",\\\"faxOutbound\\\",\\\"action\\\",\\\"showDropdown\\\",\\\"each\\\",\\\"-track-array\\\",\\\"active-call-entry\\\",\\\"showCallControls\\\",\\\"unless\\\",\\\"isActiveFaxes\\\",\\\"activeFaxes\\\",\\\"active-fax\\\",\\\"removeScrollAndShrinkDialPad\\\",\\\"toggle-item-bar\\\",\\\"itemToggled\\\",\\\"currentTab\\\",\\\"panelConfigs\\\",\\\"panels\\\",\\\"dialpadShouldSendDtmf\\\",\\\"not\\\",\\\"addingCall\\\",\\\"chatPartiesOnCall\\\",\\\"concat\\\",\\\"numberOfChatParties\\\",\\\"chatPartiesClasses\\\",\\\"testing\\\",\\\"viewAssociateDashboard\\\",\\\"associate-activity\\\",\\\"call-history-v2\\\",\\\"session\\\",\\\"dial-pad\\\",\\\"enableRequireQueueDialpadLogic\\\",\\\"noStationSelected\\\",\\\"stationSelected\\\",\\\"showEmergencyLocation\\\",\\\"emergency-location\\\",\\\"emergencyLocationData\\\",\\\"personId\\\",\\\"chat\\\",\\\"chatFrame\\\",\\\"partial\\\",\\\"inbox-panel-v2\\\",\\\"phone-settings\\\",\\\"showEnableCallForwarding\\\",\\\"persistentConnectionActive\\\",\\\"fax-panel\\\",\\\"follow-me-settings-panel\\\",\\\"showStationPicker\\\"]]\",\"moduleName\":\"web-directory/components/call-controls/template.hbs\",\"isStrictMode\":false});","import { A } from '@ember/array';\nimport { all, Promise, reject } from 'rsvp';\nimport { computed, get } from '@ember/object';\nimport { reads, or, not, readOnly } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport Component from '@ember/component';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport moment from 'web-directory/utils/dates';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport { formatDateForDisplay } from 'web-directory/utils/date-time';\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['call-history-entity', 'clearfix'],\n    classNameBindings: ['isMissed:missed-call', 'call.id'],\n\n    timeline: service(),\n    clock: service(),\n    intl: service(),\n    phone: service(),\n    addressformat: service(),\n    permissions: service(),\n    store: service(),\n    application: service(),\n    ajax: service(),\n    names: service(),\n\n    call: null, // expected to be a model/callv2\n    showParticipants: false,\n\n    makingCall: false,\n\n    isGroupRing: reads('call.isGroupRing'),\n    isOutboundGroupRing: reads('call.isOutboundGroupRing'),\n    isConferenceCall: or('call.isConference', 'call.wasConference'),\n    isMultiParty: reads('call.isMultiParty'),\n    isBlindTransferCall: reads('call.isBlindTransfer'),\n    isIvrTransferCall: reads('call.isIvrTransfer'),\n    isConsultTransferCall: reads('call.isConsultTransfer'),\n    isOutboundCampaignCall: reads('call.isOutboundCampaign'),\n    isCallbackCall: reads('call.wasCallback'),\n    isOutbound: reads('call.isOutbound'),\n    isMissed: not('call.callAnswered'),\n    wentToVoicemail: reads('call.wentToVoicemail'), // went to my voicemail\n    someoneElseAnswered: reads('call.callAnsweredBySomeoneElse'), // I did not answer, but someone in the group did\n    neverConnected: reads('call.neverConnected'),\n    reachedVoicemail: reads('call.reachedVoicemail'), // went to someone elses voicemail\n    noStationSelected: reads('phone.noStationSelected'),\n    phoneDisabled: reads('phone.phoneDisabled'),\n\n    actions: {\n        callBack: function () {\n            this.phone.makeCall(this.telephone, this.person);\n        },\n        groupCallBack: function () {\n            this.set('makingCall', true);\n            this.phone.makeCall(this.get('call.groupRingGroup.contactInfo.groupNumber.firstObject')).finally(() => {\n                this.set('makingCall', false);\n            });\n        },\n        toggleParticipants: function () {\n            this.toggleProperty('showParticipants');\n        }\n    },\n\n    showDisconnectReason: computed('call.isConference', 'call.callEnd', 'clock.minute', function () {\n        // Consume clock.minute to establish Glimmer autotracking (Ember 3.28 compatibility)\n        this.get('clock.minute');\n        let minutesPassed = moment().diff(this.get('call.callEnd'), 'minutes');\n        if (!this.get('call.isConference') && minutesPassed < 5) {\n            return true;\n        }\n    }),\n\n    externalContact: computed('call.externalParticipants.lastObject.externalContact', function () {\n        const externalContact = this.get('call.externalParticipants.lastObject.externalContact');\n\n        if (typeof externalContact === 'object' && typeof externalContact.type === 'string') {\n            // Only use externalContact if it is a Curated type\n            return externalContact.type === 'Curated' ? externalContact : undefined;\n        }\n\n        return undefined;\n    }),\n\n    externalContactId: readOnly('externalContact.id'),\n\n    // see JIRA https://inindca.atlassian.net/browse/PCDWEBK-1808\n    // this vm logic can be removed when edge sends back a userId for a vm session\n    participant: computed('call.otherParties.[]', function () {\n        if (this.get('call.otherParties.length') > 0) {\n            return _.last(this.get('call.otherParties'));\n        }\n    }),\n\n    participantUserId: reads('participant.user.id'),\n\n    callParties: reads('call.callParties'),\n\n    // Used to detect loading state\n    callPartiesPromise: computed('call.callParties', function () {\n        let parties = this.callParties || [];\n        return DS.PromiseArray.create({\n            promise: all(parties)\n        });\n    }),\n\n    sortedCallParties: computed('callParties.[]', async function () {\n        let callParties = await Promise.all(this.callParties);\n\n        return callParties.sort((a, b) => {\n            let firstParty = get(a, 'name');\n            let secondParty = get(b, 'name');\n            if (firstParty < secondParty) {\n                return -1;\n            } else {\n                return 1;\n            }\n        });\n    }),\n\n    noCallParties: computed('sortedCallParties.[]', async function () {\n        const callParties = await this.sortedCallParties;\n        return callParties.length === 0;\n    }),\n\n    isSingleCallParty: computed('sortedCallParties', async function () {\n        const callParties = await this.sortedCallParties;\n        return callParties.length === 1;\n    }),\n\n    redialGroupLabel: computed('intl', 'callerName', async function () {\n        const callerName = await this.callerName;\n        return this.intl.t('components.callHistory.redial', { contact: callerName });\n    }),\n\n    loading: computed('person.isPending', 'queue.isPending', 'callPartiesPromise.isPending', function () {\n        const person = this.person;\n        const queue = this.queue;\n        const callParties = this.callPartiesPromise;\n        if (!person && !queue && !callParties) {\n            return false;\n        }\n        return get(person, 'isPending') || get(queue, 'isPending') || get(callParties, 'isPending');\n    }),\n\n    person: computed(\n        'participant',\n        'participantUserId',\n        'isGroupRing',\n        'call.groupRingCaller',\n        'isOutboundGroupRing',\n        function () {\n            let promise = Promise.resolve();\n\n            if (this.isGroupRing) {\n                promise = this.get('call.groupRingCaller');\n            } else if (this.participantUserId) {\n                // conversations v2\n                promise = this.store.find('person', this.participantUserId);\n            }\n\n            return DS.PromiseObject.create({ promise });\n        }\n    ),\n\n    queue: computed('call.{isQueueCall,isAcdCall}', function () {\n        let promise = Promise.resolve();\n        if (this.get('call.isQueueCall') || this.get('call.isAcdCall')) {\n            const queueId =\n                this.get('call.myself.queueId') ||\n                this.get('call.myself.queue.id') ||\n                this.get('call.queueParticipants.firstObject.queue.id');\n\n            if (queueId && this.get('permissions.canViewQueue')) {\n                promise = this.store\n                    .findRecord('queue', queueId, { adapterOptions: { divisionAware: true } })\n                    .catch(error => {\n                        this.logger.warn('There was an error accessing the queue:', { queueId, error });\n                        return reject();\n                    });\n            }\n        }\n\n        return DS.PromiseObject.create({ promise });\n    }),\n\n    _outboundCampaign: computed('call.isOutboundCampaign', 'call.otherParties.[]', function () {\n        let promise = Promise.resolve();\n        if (this.get('call.isOutboundCampaign')) {\n            let campaign;\n            try {\n                const participant = this.get('call.otherParties').find(p => get(p, 'outboundCampaign'));\n                campaign = get(participant, 'outboundCampaign');\n            } catch (e) {\n                return promise;\n            }\n\n            if (campaign && this.get('permissions.canViewOutboundCampaigns')) {\n                const baseUri = this.get('application.purecloudV2BaseUri');\n                const campaignSelfUri = get(campaign, 'selfUri');\n                promise = this.ajax.ajaxGet(baseUri + campaignSelfUri);\n            }\n        }\n\n        return DS.PromiseObject.create({ promise });\n    }),\n\n    outboundCampaign: computed('_outboundCampaign', function () {\n        return DS.PromiseObject.create({ promise: this._outboundCampaign });\n    }),\n\n    showContactControls: computed('call.isConferenceCall', 'participant.{userId,user}', 'isGroupRing', function () {\n        return !this.isConferenceCall || this.isGroupRing || this.get('participant.user');\n    }),\n\n    callStart: computed('call.callStart', function () {\n        let start = this.get('call.callStart');\n        if (!start && this.get('call.wentToVoicemail')) {\n            start = this.get('call.participants').findBy('purpose', 'voicemail').startTime;\n        }\n        return start;\n    }),\n\n    callTime: computed('call.callEnd', 'callStart', function () {\n        let locale = this.get('intl.isoLocale');\n        const start = this.callStart;\n\n        if (!start) {\n            return '';\n        }\n\n        const currDate = this.getCurrentDate();\n        const callStart = moment(start).locale(locale);\n        if (currDate.isSame(callStart, 'day')) {\n            return callStart.format('LT');\n        }\n        return formatDateForDisplay(start.toISOString(), 'long');\n    }),\n\n    getCurrentDate: function () {\n        return moment();\n    },\n\n    didInteract: reads('call.myParticipant.didInteract'),\n\n    callDuration: computed('call.callStart', 'call.callEnd', function () {\n        var startTime = this.get('call.callStart');\n        var endTime = this.get('call.callEnd');\n        var duration = moment(endTime) - moment(startTime);\n        let locale = this.get('intl.isoLocale');\n        return moment.duration(duration).locale(locale).humanize();\n    }),\n\n    // see JIRA https://inindca.atlassian.net/browse/PCDWEBK-1808\n    // this vm logic can be removed when edge sends back a userId for a vm session\n    _getNameForVoicemail() {\n        if (this.get('call.isPersonalVoicemail')) {\n            return this.intl.t('purecloud.station.voicemail');\n        }\n        return this.addressformat.formatAddressForDisplay(this.get('call.voicemailParticipant.dnis'), null, {\n            doLookup: true\n        });\n    },\n\n    // returns the name to display for group ring or single caller, not conference or transfer\n    callerName: computed(\n        'person.name',\n        'isOutbound',\n        'call.{isGroupRing,groupRingCaller}',\n        'otherParties.[]',\n        'externalContact',\n        function () {\n            const otherParties = this.get('call.otherParties') || A();\n            const party = otherParties.get('lastObject'); // safe because not used for conference/transfer\n            if (this.get('call.isGroupRing') && this.get('call.groupRingCaller.name')) {\n                return this.get('call.groupRingCaller.name');\n            }\n            if (otherParties.length === 0 || !party) {\n                if (this.get('call.wentToVoicemail')) {\n                    return this._getNameForVoicemail();\n                }\n                return this.addressDetailDisplay;\n            }\n\n            if (!this.get('call.isGroupRing') && this.get('person.name')) {\n                return this.get('person.name');\n            }\n\n            if (this.externalContact) {\n                return this.names.fullName(this.externalContact);\n            }\n\n            if (!this.get('call.isGroupRing') && party.name) {\n                return party.name;\n            }\n\n            const address = this.isOutbound ? party.dnis : party.ani;\n            return this.addressformat.formatAddressForDisplay(address, null, {\n                doLookup: true\n            });\n        }\n    ),\n\n    personNotDeleted: computed('person.state', function () {\n        return this.get('person.state') !== 'deleted';\n    }),\n\n    phoneNumber: computed('participant.{dnis,ani}', 'isOutbound', function () {\n        var party = this.participant;\n        let value;\n\n        if (!party || (!party.dnis && !party.ani)) {\n            party = this.get('call.initiator'); // Try the initiator as a last resort\n        }\n\n        if (party) {\n            if (this.isOutbound) {\n                value = party.dnis;\n            } else {\n                value = party.ani;\n            }\n        }\n\n        return value;\n    }),\n\n    addressDetailDisplay: computed('phoneNumber', 'person.name', function () {\n        if (this.get('person.name')) {\n            return this.get('person.name');\n        }\n        return this.addressformat.formatAddressForDisplay(this.phoneNumber, null, { doLookup: true });\n    }),\n\n    click: function () {\n        this.timeline.markRead('call', this.get('call.id'));\n    },\n\n    queueName: computed('call.{isAcdCall,isQueueCall}', 'queue.name', function () {\n        if (this.get('call.isAcdCall') || this.get('call.isQueueCall')) {\n            if (this.queue && !_.isEmpty(this.get('queue.name'))) {\n                return this.get('queue.name');\n            }\n            return this.intl.t('purecloud.acdInteraction.callHistory.notAvailable').toString();\n        }\n    }),\n\n    outboundCampaignName: computed('call.wasOutboundCampaign', 'outboundCampaign.name', function () {\n        if (this.get('call.wasOutboundCampaign')) {\n            if (this.outboundCampaign && !_.isEmpty(this.get('outboundCampaign.name'))) {\n                return this.get('outboundCampaign.name');\n            }\n            return this.intl.t('purecloud.acdInteraction.callHistory.notAvailable').toString();\n        }\n    }),\n\n    titleForName: computed(\n        'callerName',\n        'queueName',\n        'call.groupRingGroup.name',\n        'isConferenceCall',\n        'isOutboundGroupRing',\n        'isGroupRing',\n        function () {\n            if (this.isConferenceCall) {\n                return '';\n            }\n\n            const groupRingGroupName = this.get('call.groupRingGroup.name');\n            if (groupRingGroupName && this.isOutboundGroupRing) {\n                return groupRingGroupName;\n            }\n            const personName = this.get('person.name');\n            if (personName && !this.isGroupRing) {\n                return personName;\n            }\n            return this.addressformat.formatAddressForDisplay(this.phoneNumber, null, { doLookup: true });\n        }\n    )\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"+c6FHgHz\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[10,1],[14,0,\\\"loading\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"icon\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,2],[[[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"icon outbound-call\\\"],[14,\\\"icon-name\\\",\\\"phone-outbound\\\"],[15,\\\"title\\\",[28,[37,3],[\\\"purecloud.outbound\\\"],null]],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,4],[[[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"icon missed-call\\\"],[14,\\\"icon-name\\\",\\\"phone-missed-call\\\"],[15,\\\"title\\\",[28,[37,3],[\\\"purecloud.missed\\\"],null]],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"             \\\\n        \\\"]],[]]]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[15,0,[29,[\\\"information\\\\n            \\\",[52,[33,5,[\\\"wentToVoicemail\\\"]],\\\"went-to-voicemail\\\"],\\\"\\\\n            \\\",[52,[33,5,[\\\"isGroupRing\\\"]],\\\"group-ring-call\\\"],\\\"\\\\n            \\\",[52,[33,5,[\\\"isConferenceCall\\\"]],\\\"conference-call\\\"],\\\"\\\\n            \\\",[52,[33,5,[\\\"isMultiParty\\\"]],\\\"transfer-call\\\"],\\\"\\\\n            \\\",[52,[33,5,[\\\"isQueueCall\\\"]],\\\"queue-call\\\"],\\\"\\\\n            \\\",[52,[33,5,[\\\"wasOutboundCampaign\\\"]],\\\"outbound-campaign-call\\\"],\\\"\\\\n            \\\",[52,[33,5,[\\\"wasCallback\\\"]],\\\"callback-call\\\"],\\\"\\\\n            \\\",[52,[33,5,[\\\"isAcdCall\\\"]],\\\"acd-call\\\"],\\\"\\\\n            \\\",[52,[33,5,[\\\"isPersonalVoicemail\\\"]],\\\"personal-voicemail-call\\\"],\\\"\\\\n            \\\",[52,[33,5,[\\\"isOutbound\\\"]],\\\"outbound-call\\\"]]]],[15,1,[29,[[33,5,[\\\"conversationId\\\"]]]]],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"name\\\"],[15,\\\"title\\\",[29,[[28,[37,6],[[33,7]],null]]]],[12],[1,\\\"\\\\n\\\"],[41,[33,8],[[[41,[28,[37,6],[[33,9]],null],[[[1,\\\"                    \\\"],[1,[28,[35,10],[[28,[37,11],[[28,[37,6],[[33,12]],null]],null],\\\"name\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[11,0],[24,0,\\\"conference\\\"],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[4,[38,13],[[30,0],\\\"toggleParticipants\\\"],null],[12],[1,\\\"\\\\n                        \\\"],[10,0],[14,0,\\\"title\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,2],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,14],[[33,15],[28,[37,16],[[33,17]],null]],null],[[[1,\\\"                                    \\\"],[1,[28,[35,3],[\\\"purecloud.acdInteraction.callHistory.callback\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,18],[[[1,\\\"                                    \\\"],[1,[28,[35,3],[\\\"purecloud.acdInteraction.callHistory.transfer\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,17],[[[1,\\\"                                    \\\"],[1,[28,[35,3],[\\\"purecloud.acdInteraction.callHistory.outboundCampaign\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,19],[[[1,\\\"                                    \\\"],[1,[28,[35,3],[\\\"purecloud.acdInteraction.callHistory.groupRing\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,20],[[[1,\\\"                                    \\\"],[1,[28,[35,3],[\\\"purecloud.acdInteraction.callHistory.ivrTransfer\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,21],[[[1,\\\"                                    \\\"],[1,[28,[35,3],[\\\"purecloud.acdInteraction.callHistory.consult\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                    \\\"],[1,[28,[35,3],[\\\"purecloud.conference\\\"],null]],[1,\\\"\\\\n                                \\\"]],[]]]],[]]]],[]]]],[]]]],[]]]],[]]],[1,\\\"                            \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[51,[28,[37,6],[[33,23]],null]],[[[41,[33,24],[[[1,\\\"                                    \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"arrow-left\\\"],[14,\\\"icon-name\\\",\\\"arrow-solid-down\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                    \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"arrow-right\\\"],[14,\\\"icon-name\\\",\\\"arrow-solid-right\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]]],[]],null],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,20],[[[1,\\\"                            \\\"],[10,0],[14,0,\\\"ani\\\"],[12],[1,[28,[35,6],[[33,7]],null]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[]],[[[41,[33,5,[\\\"isQueueCall\\\"]],[[[1,\\\"                    \\\"],[1,[34,25]],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,26],[[[1,\\\"                    \\\"],[8,[39,27],null,[[\\\"@route\\\",\\\"@model\\\"],[\\\"relate.contacts-ui-redirect\\\",[99,28,[\\\"@model\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n                        \\\"],[1,[28,[35,6],[[33,29]],null]],[1,\\\"\\\\n                    \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[1,[28,[35,6],[[33,29]],null]],[1,\\\"\\\\n                \\\"]],[]]]],[]]],[41,[51,[28,[37,30],[[28,[37,6],[[33,29]],null],[28,[37,6],[[33,7]],null]],null]],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"ani\\\"],[12],[1,[28,[35,6],[[33,7]],null]],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,5,[\\\"isAcdCall\\\"]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"acd-call-queue-name\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,3],[\\\"purecloud.acdInteraction.callHistory.queueColon\\\"],null]],[1,\\\"\\\\n                \\\"],[1,[34,25]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,5,[\\\"isOutboundCampaign\\\"]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"outbound-campaign-name\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,3],[\\\"purecloud.acdInteraction.callHistory.ouboundCampaignColon\\\"],null]],[1,\\\"\\\\n                \\\"],[1,[34,31]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,19],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"group-ring\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[33,5,[\\\"groupRingGroup\\\",\\\"name\\\"]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n        \\\"],[1,[33,32,[\\\"content\\\"]]],[1,\\\"\\\\n\\\\n\\\"],[41,[51,[33,5,[\\\"isPersonalVoicemail\\\"]]],[[[41,[28,[37,33],[[33,34],[33,35]],null],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"disconnect disconnect-voicemail\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"],[41,[33,34],[[[1,\\\"                        \\\"],[1,[28,[35,3],[\\\"purecloud.disconnectReason.youReachedVoicemail\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,35],[[[1,\\\"                        \\\"],[1,[28,[35,3],[\\\"purecloud.disconnectReason.wentToYourVoicemail\\\"],null]],[1,\\\"\\\\n                    \\\"]],[]],null]],[]]],[1,\\\"                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,36],[[[1,\\\"                \\\"],[10,0],[15,0,[29,[\\\"disconnect-reason disconnect-reason-\\\",[33,5,[\\\"disconnectReason\\\"]]]]],[12],[1,\\\"\\\\n                    \\\"],[1,[33,5,[\\\"disconnectReason\\\"]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null],[41,[33,37],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"answered-by-someone-else\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[1,[28,[35,3],[\\\"purecloud.acdInteraction.callHistory.callAnsweredBySomeoneElse\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"timing\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"time\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[34,38]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[51,[33,35]],[[[41,[33,39],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"duration\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[34,40]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,41],[[[41,[51,[33,5,[\\\"invalidNumber\\\"]]],[[[41,[51,[28,[37,33],[[33,42,[\\\"webrtcPhoneWithIssues\\\"]],[33,43]],null]],[[[41,[28,[37,33],[[33,5,[\\\"isQueueCall\\\"]],[33,5,[\\\"isAcdCall\\\"]]],null],[[[1,\\\"                    \\\"],[1,[28,[35,44],null,[[\\\"showPhone\\\",\\\"queue\\\",\\\"otherParty\\\",\\\"phoneNumber\\\",\\\"call\\\",\\\"phoneNumberForDisplay\\\",\\\"isRedial\\\",\\\"flaggingSupportEnabled\\\"],[true,[33,45],[33,46],[33,47],[33,5],[28,[37,6],[[33,7]],null],true,true]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,19],[[[41,[51,[33,48]],[[[1,\\\"                        \\\"],[1,[28,[35,49],null,[[\\\"showPhone\\\",\\\"contact\\\",\\\"phoneNumber\\\",\\\"call\\\",\\\"phoneNumberForDisplay\\\",\\\"isRedial\\\",\\\"flaggingSupportEnabled\\\"],[true,[33,46],[33,47],[33,5],[28,[37,6],[[33,7]],null],true,true]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,0],[14,0,\\\"group-callback\\\"],[12],[1,\\\"\\\\n                            \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link btn-phone\\\"],[16,\\\"aria-label\\\",[28,[37,6],[[33,50]],null]],[16,\\\"disabled\\\",[36,51]],[24,4,\\\"button\\\"],[4,[38,13],[[30,0],\\\"groupCallBack\\\"],null],[12],[1,\\\"\\\\n\\\\n\\\"],[41,[33,51],[[[1,\\\"                                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                    \\\"],[10,\\\"gux-icon\\\"],[15,0,[29,[\\\"icon \\\",[52,[33,51],\\\"making-call\\\"]]]],[14,\\\"icon-name\\\",\\\"phone\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[]],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"normal-participant other-user\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,49],null,[[\\\"showPhone\\\",\\\"contact\\\",\\\"phoneNumber\\\",\\\"call\\\",\\\"isRedial\\\",\\\"flaggingSupportEnabled\\\"],[[33,52],[33,46],[33,47],[33,5],true,true]]]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"]],[]]]],[]]]],[]],null]],[]],null]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,24],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"parties\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,54],[[28,[37,54],[[28,[37,6],[[33,12]],null]],null]],null],null,[[[1,\\\"                \\\"],[10,0],[14,0,\\\"conference-party\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"party-name\\\"],[15,\\\"title\\\",[29,[[30,1,[\\\"address\\\"]]]]],[12],[1,\\\"\\\\n\\\"],[41,[51,[33,2]],[[[41,[30,1,[\\\"isOutbound\\\"]],[[[1,\\\"                                \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"icon outbound-call\\\"],[14,\\\"icon-name\\\",\\\"phone-outbound\\\"],[15,\\\"title\\\",[28,[37,3],[\\\"purecloud.outbound\\\"],null]],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null],[41,[30,1,[\\\"externalContact\\\"]],[[[1,\\\"                            \\\"],[8,[39,27],null,[[\\\"@route\\\",\\\"@model\\\"],[\\\"relate.contacts-ui-redirect\\\",[28,[37,6],[[33,28]],null]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n                                \\\"],[1,[28,[35,55],[[30,1,[\\\"externalContact\\\"]]],null]],[1,\\\"\\\\n                            \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[1,[28,[35,6],[[30,1,[\\\"name\\\"]]],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                        \\\"],[10,0],[14,0,\\\"party-address\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,6],[[30,1,[\\\"address\\\"]]],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"],[41,[51,[28,[37,33],[[33,56],[33,43]],null]],[[[41,[28,[37,33],[[33,5,[\\\"isQueueCall\\\"]],[33,5,[\\\"isAcdCall\\\"]]],null],[[[1,\\\"                            \\\"],[1,[28,[35,44],null,[[\\\"showPhone\\\",\\\"queue\\\",\\\"otherParty\\\",\\\"phoneNumber\\\",\\\"contact\\\",\\\"call\\\",\\\"isRedial\\\"],[true,[33,45],[33,46],[30,1,[\\\"address\\\"]],[30,1],[33,5],true]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[1,[28,[35,49],null,[[\\\"showPhone\\\",\\\"contact\\\",\\\"phoneNumber\\\",\\\"isRedial\\\"],[true,[30,1],[30,1,[\\\"address\\\"]],true]]]],[1,\\\"\\\\n\\\"]],[]]]],[]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]]],[\\\"party\\\"],false,[\\\"if\\\",\\\"loading\\\",\\\"isOutbound\\\",\\\"t\\\",\\\"isMissed\\\",\\\"call\\\",\\\"await\\\",\\\"titleForName\\\",\\\"isMultiParty\\\",\\\"isSingleCallParty\\\",\\\"get\\\",\\\"first\\\",\\\"sortedCallParties\\\",\\\"action\\\",\\\"and\\\",\\\"isCallbackCall\\\",\\\"not\\\",\\\"isOutboundCampaignCall\\\",\\\"isBlindTransferCall\\\",\\\"isGroupRing\\\",\\\"isIvrTransferCall\\\",\\\"isConsultTransferCall\\\",\\\"unless\\\",\\\"noCallParties\\\",\\\"showParticipants\\\",\\\"queueName\\\",\\\"externalContact\\\",\\\"link-to\\\",\\\"externalContactId\\\",\\\"callerName\\\",\\\"eq\\\",\\\"outboundCampaignName\\\",\\\"location\\\",\\\"or\\\",\\\"reachedVoicemail\\\",\\\"wentToVoicemail\\\",\\\"showDisconnectReason\\\",\\\"someoneElseAnswered\\\",\\\"callTime\\\",\\\"didInteract\\\",\\\"callDuration\\\",\\\"showContactControls\\\",\\\"phone\\\",\\\"noStationSelected\\\",\\\"entity-contact-queue\\\",\\\"queue\\\",\\\"person\\\",\\\"phoneNumber\\\",\\\"isOutboundGroupRing\\\",\\\"entity-contact\\\",\\\"redialGroupLabel\\\",\\\"makingCall\\\",\\\"personNotDeleted\\\",\\\"each\\\",\\\"-track-array\\\",\\\"full-name\\\",\\\"webrtcPhoneWithIssues\\\"]]\",\"moduleName\":\"web-directory/components/call-history-entity/template.hbs\",\"isStrictMode\":false});","import { A } from '@ember/array';\nimport Component from '@ember/component';\nimport { computed, get } from '@ember/object';\nimport { cancel, debounce, throttle } from '@ember/runloop';\nimport { inject } from '@ember/service';\nimport { some } from 'lodash';\nimport reject from 'lodash/reject';\nimport LoggerMixin from '../../mixins/logger';\n\nexport default Component.extend(LoggerMixin, {\n    timeline: inject('timeline'),\n    store: inject('store'),\n    phone: inject('phone'),\n\n    className: ['call-history'],\n    debounceTimers: [],\n    queuedConversationIds: A([]),\n    debouncePeriod: 3000,\n    useNewNav: false,\n    disconnectedConversations: [] as any[],\n    showingCallHistory: false as boolean,\n    showCallControls: false as boolean,\n\n    history: computed.readOnly('phone.currentCallHistory'),\n    sortedHistory: computed('history', 'history.[]', 'history.@each.startTime', function () {\n        return A(this.get('history')).sort((a: any, b: any) => {\n            const aStart = this.getStartTime(a);\n            const bStart = this.getStartTime(b);\n            if (aStart && bStart) {\n                // Check if they are invalid values\n                const aValue = aStart.valueOf();\n                const bValue = bStart.valueOf();\n                if (!isNaN(aValue) && !isNaN(bValue)) {\n                    if (bValue === aValue) {\n                        return 0;\n                    }\n                    return bValue - aValue < 0 ? -1 : 1;\n                }\n            }\n\n            this.logger.error('call-history-v2: Encountered invalid startTime information for call history', {\n                aStart,\n                bStart\n            });\n\n            return 0;\n        });\n    }),\n\n    init() {\n        this._super(...arguments);\n        if (this.get('useNewNav')) {\n            this.fetchRecentHistory([], true);\n        } else {\n            this.fetchHistory();\n        }\n    },\n\n    didReceiveAttrs(this: any) {\n        this._super(...arguments);\n        const disconnectedConversationIds = (this.get('disconnectedConversations') || []).map((conversation: any) => ({\n            id: get(conversation, 'id')\n        }));\n        if (this.get('showingCallHistory') && this.get('showCallControls')) {\n            // Find recently disconnected conversations and fetch the recent history.\n            const queuedConversationIds = this.get('queuedConversationIds');\n            const conversationIdsToFetch = [...queuedConversationIds, ...disconnectedConversationIds];\n            if (conversationIdsToFetch.length > 0) {\n                this.get('logger').debug('<call-history-v2> fetching queued conversations: ', conversationIdsToFetch);\n                const debounceTimer = debounce(\n                    this,\n                    this.fetchRecentHistory,\n                    conversationIdsToFetch,\n                    this.get('debouncePeriod')\n                );\n                this.get('debounceTimers').push(debounceTimer);\n            }\n        } else if (disconnectedConversationIds.length > 0) {\n            this.get('logger').debug('<call-history-v2> queuing conversations: ', disconnectedConversationIds);\n            this.get('queuedConversationIds').addObjects(disconnectedConversationIds);\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        const $el = this.$().parents('.call-controls-panels');\n        $el.on('scroll', () => throttle(this, this.shouldFetchNextBatch, 1000, false));\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.get('phone').truncateCallHistory();\n        this.get('debounceTimers').forEach((timer: any) => cancel(timer));\n        const $el = this.$().parents('.call-controls-panels');\n        $el.off('scroll');\n    },\n\n    /**\n     * conversationsNotInStore - takes an array of disconnected calls and returns conversationIds not yet in the store.\n     *\n     * @param recentDisconnectedCalls The array of recently disconnected calls.\n     * @return Array of conversationIds for calls not yet in store.\n     */\n    conversationsNotInStore(recentDisconnectedCalls: any[]) {\n        return reject(recentDisconnectedCalls, call =>\n            some(this.get('store').peekAll('callv2').content, value => value.id === call.id)\n        ).map(conversation => ({\n            id: conversation.id\n        }));\n    },\n\n    /**\n     * fetchHistory - Fetches the history on init.\n     * @return {Promise} Resolves to an array of conversations.\n     */\n    fetchHistory() {\n        return this.get('phone').fetchCallHistory();\n    },\n\n    /**\n     * fetchRecentHistory - Fetch the conversations by conversationId\n     *\n     * @param conversationsToFetch Array of conversationIds\n     */\n    fetchRecentHistory(conversationsToFetch: any[], isInit = false) {\n        let promise = this.get('phone').fetchRecentCallHistory(conversationsToFetch, isInit);\n\n        return promise.finally(() => {\n            const latestCall = []\n                .concat(\n                    this.get('store')\n                        .peekAll('callv2')\n                        .map((c: any) => c)\n                )\n                .pop() as any;\n\n            if (\n                latestCall &&\n                (get(latestCall, 'isMissed') || get(latestCall, 'missedCall')) &&\n                get(latestCall, 'callEnd')\n            ) {\n                // make sure latest call was both missed and is actually finished for user\n                return this.get('timeline').missedCallEvent(latestCall, true);\n            }\n            this.get('queuedConversationIds').clear();\n        });\n    },\n\n    /**\n     * shouldFetchNextBatch - Checks to see if scroll position is near bottom and then fetches more history\n     */\n    shouldFetchNextBatch(this: any) {\n        const $el = this.$().parents('.call-controls-panels');\n        const scrollPosition = $el[0].scrollHeight - $el.height() - $el.scrollTop();\n        const scrollPositionByHeight = scrollPosition / $el.height();\n        if (scrollPositionByHeight < 0.5) {\n            throttle(this, this.fetchHistory, 2000);\n        }\n    },\n\n    /**\n     * Get the start time of a particular conversation\n     *\n     * @param interaction\n     * @returns start time of the conversation\n     */\n    getStartTime(interaction: any) {\n        let time = null;\n\n        const startTime = get(interaction, 'startTime');\n        const myParticipant = get(interaction, 'myParticipant');\n\n        if (startTime) {\n            time = startTime;\n        } else if (myParticipant && myParticipant.startTime) {\n            time = myParticipant.startTime;\n        } else {\n            const otherParty: any = (get(interaction, 'otherParties') || []).find((party: any) => !!party.startTime);\n            if (otherParty && otherParty.startTime) {\n                time = otherParty.startTime;\n            }\n        }\n\n        if (!time) {\n            return null;\n        }\n\n        // Deal with the type serialization that ember-data might be doing based on where\n        // our data loads from\n        return typeof time === 'string' ? new Date(time) : time;\n    },\n\n    actions: {\n        /**\n         * fetchMoreHistory - fetches more history.\n         */\n        fetchMoreHistory() {\n            this.fetchHistory();\n        },\n\n        fetchRecentHistory(conversationsToFetch: any[]) {\n            return this.fetchRecentHistory(conversationsToFetch);\n        }\n    }\n}).reopenClass({ positionalParams: ['disconnectedConversations'] });\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"ySTN6CNh\",\"block\":\"[[[10,\\\"ul\\\"],[14,0,\\\"call-history-entity-list\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,1],[[28,[37,1],[[33,2]],null]],null],\\\"id\\\",[[[41,[30,1],[[[1,\\\"            \\\"],[1,[28,[35,4],null,[[\\\"tagName\\\",\\\"call\\\",\\\"fetchRecentHistory\\\"],[\\\"li\\\",[30,1],[28,[37,5],[[30,0],\\\"fetchRecentHistory\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],null]],[1]],null],[13],[1,\\\"\\\\n\\\"],[10,\\\"button\\\"],[14,0,\\\"btn btn-link action-fetch-more show-button\\\"],[15,\\\"onclick\\\",[28,[37,5],[[30,0],\\\"fetchMoreHistory\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"    \\\"],[10,1],[14,0,\\\"flex\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"custom/arrow-turn-left-clock-regular\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[1,[28,[35,6],[\\\"purecloud.fetchMoreHistory\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[\\\"call\\\"],false,[\\\"each\\\",\\\"-track-array\\\",\\\"sortedHistory\\\",\\\"if\\\",\\\"call-history-entity\\\",\\\"action\\\",\\\"t\\\"]]\",\"moduleName\":\"web-directory/components/call-history-v2/template.hbs\",\"isStrictMode\":false});","import { reads, equal } from '@ember/object/computed';\nimport { Promise } from 'rsvp';\nimport { inject as service } from '@ember/service';\nimport Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport ExternalContactsMixin from 'web-directory/mixins/external-contacts';\n\nexport default Component.extend(ExternalContactsMixin, {\n    classNames: ['participant', 'call-participant', 'text-center'],\n    classNameBindings: ['isHeld:on-hold', 'isMuted:is-muted', 'isDialing:dialing'],\n\n    store: service(),\n    addressformat: service(),\n    phone: service(),\n\n    activeCall: reads('phone.activeCall'),\n    participant: null,\n    showPresence: true,\n\n    actions: {\n        toggleHold(participantToHold) {\n            let holdingYourself = participantToHold.userId === this.get('session.user.id');\n            if (participantToHold && !holdingYourself) {\n                this.phone.handleOtherParticipantStatusChange('confined', participantToHold);\n            } else {\n                // Phone hold logic will handle participant\n                this.phone.hold(this.activeCall);\n            }\n        },\n\n        toggleMute(participantToMute) {\n            if (this.muteDisabled) {\n                return;\n            }\n\n            this.phone.handleOtherParticipantStatusChange('muted', participantToMute);\n        },\n\n        disconnectParticipant(participantToDisconnect) {\n            this.phone.handleOtherParticipantStatusChange('hangup', participantToDisconnect);\n        }\n    },\n\n    wentToVoicemail: computed('participant.purpose', 'participant', function () {\n        return this.get('participant.purpose') === 'voicemail';\n    }),\n    onConsult: reads('activeCall.onConsult'),\n    person: computed('participant.{userId,groupId}', function () {\n        if (this.get('participant.purpose') === 'group') {\n            let id = this.get('participant.groupId');\n            return this.store.findRecord('group', id, { reload: false, backgroundReload: false });\n        }\n        if (!_.isEmpty(this.get('participant.userId'))) {\n            return this.store.findRecord('person', this.get('participant.userId'), {\n                reload: false,\n                backgroundReload: false\n            });\n        }\n    }),\n    address: computed('participant.address', function () {\n        let address = this.get('participant.address');\n\n        let formattedAddress;\n        try {\n            if (this.isEmergencyNumber(address)) {\n                formattedAddress = this.addressformat.formatRawNumber(address);\n            } else {\n                formattedAddress = this.addressformat.formatOrLookupAddressForDisplay(address);\n            }\n        } catch (error) {\n            formattedAddress = address;\n        }\n\n        return formattedAddress;\n    }),\n    showParticipantAddress: computed('address', async function () {\n        const name = await this.name;\n        const address = this.address;\n        return name !== address;\n    }),\n    call: computed('participant.calls.@each.{state,held,confined,muted}', function () {\n        return _.head(this.get('participant.calls'));\n    }),\n    isDisconnected: computed('call.state', function () {\n        const state = this.get('call.state');\n        const isDisconnected =\n            state && (state.toLowerCase() === 'disconnected' || state.toLowerCase() === 'terminated');\n        const activeCallDisconnected = this.get('activeCall.isDisconnected');\n        return isDisconnected || activeCallDisconnected;\n    }),\n    isHeld: computed('call.held', 'call.confined', function () {\n        if (this.onConsult && this.get('activeCall.isConfined')) {\n            return true;\n        }\n        return this.get('call.held') || this.get('call.confined');\n    }),\n    isConferenceCall: reads('activeCall.onConference'),\n    shouldAttachParticipantControls: computed(\n        'isConferenceCall',\n        'isConnected',\n        'activeCall.callParties.[]',\n        function () {\n            return this.isConferenceCall && this.isConnected;\n        }\n    ),\n    isMuted: reads('call.muted'),\n    isExternal: computed('participant.purpose', function () {\n        return this.get('participant.purpose') !== 'user' && this.get('participant.purpose') !== 'station';\n    }),\n    isConferenceStation: equal('participant.purpose', 'station'),\n    isParticipantAQueue: equal('participant.purpose', 'acd'),\n    queue: computed('isParticipantAQueue', 'participant.queueId', function () {\n        if (this.isParticipantAQueue && this.get('participant.queueId')) {\n            return this.store.find('queue', this.get('participant.queueId'));\n        } else {\n            return Promise.resolve(null);\n        }\n    }),\n    isDialing: computed('call.state', function () {\n        const state = this.get('call.state');\n        const dialStates = ['dialing', 'alerting', 'contacting', 'offering'];\n        return dialStates.includes(state && state.toLowerCase());\n    }),\n    isConnected: computed('call.state', function () {\n        if (typeof this.get('call.state') === 'string') {\n            return this.get('call.state').toLowerCase() === 'connected';\n        }\n    }),\n    isAddressSip: computed('participant.address', function () {\n        const address = this.get('participant.address');\n        return !!address && address !== '' && address.includes('sip');\n    }),\n    isSipOnly: computed('participant.userId', 'isAddressSip', function () {\n        const noUser = _.isEmpty(this.get('participant.userId'));\n        const isAddressSip = this.isAddressSip;\n        return noUser && isAddressSip;\n    }),\n\n    isConnecting: reads('isDialing'),\n    number: computed('participant.{dnis,ani,address}', 'activeCall.callState.isOutbound', function () {\n        let party = this.participant;\n        let value;\n        if (!party) {\n            party = this.get('activeCall.initiator'); // Try the initiator as a last resort\n        }\n\n        if (party) {\n            if (this.get('activeCall.callState.isOutbound')) {\n                value = party.dnis;\n            } else {\n                value = party.ani;\n            }\n\n            if (!value) {\n                value = party.address;\n            }\n        }\n\n        try {\n            if (this.isEmergencyNumber(value)) {\n                return this.addressformat.formatRawNumber(value);\n            } else {\n                return this.addressformat.formatOrLookupAddressForDisplay(value);\n            }\n        } catch (error) {\n            return value;\n        }\n    }),\n\n    name: computed('participant.name', function () {\n        const name = this.get('participant.name') || this.get('person.name');\n\n        if (name || !this.get('participant.userId')) {\n            return name;\n        }\n\n        return DS.PromiseObject.create({\n            promise: this.store.find('person', this.get('participant.userId')).then(person => person.get('name'))\n        });\n    }),\n\n    muteDisabled: computed('participant', function () {\n        return this.isExternal && this.isConferenceCall;\n    }),\n\n    isEmergencyNumber(number) {\n        /*\n            Since our current port of libphonenumber does not support\n            the matchesEmergencyNumberHelper in shortNumberInfo,\n-           we will just display the number if it is not valid\n-           this handles 911 and 411\n        */\n        return !this.addressformat.isValidNumber(number);\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"xo+pGqkI\",\"block\":\"[[[41,[28,[37,1],[[33,2,[\\\"isOutboundGroupRing\\\"]],[28,[37,3],[[33,4]],null]],null],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"menu-selector overlay-container group-ring-container\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,5],null,[[\\\"entity\\\",\\\"size\\\",\\\"showPresence\\\",\\\"enableMiniCard\\\"],[[33,6],80,false,false]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[33,7],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"overlay held group-overlay\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/pause\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,8],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"overlay disconnected group-overlay\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/close-x\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,9],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"overlay dialing group-overlay\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"]],[]],null]],[]]]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,10],[[[6,[39,11],null,[[\\\"tetherBoundingBox\\\",\\\"shouldAttach\\\"],[\\\"call-panel\\\",[33,10]]],[[\\\"default\\\"],[[[[1,\\\"            \\\"],[10,0],[14,0,\\\"menu-selector overlay-container\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,5],null,[[\\\"entity\\\",\\\"size\\\",\\\"enableMiniCard\\\",\\\"showPresence\\\",\\\"showToolTip\\\"],[[33,6],80,false,[33,12],true]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[33,9],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"overlay dialing\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n                \\\"],[10,0],[15,0,[29,[\\\"overlay \\\",[52,[33,13],\\\"muted\\\"]]]],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/mic-off\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\\n                \\\"],[10,0],[15,0,[29,[\\\"overlay \\\",[52,[33,7],\\\"held\\\"]]]],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/pause\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,0],[14,0,\\\"menu participant-call-controls\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,14],[[[41,[33,15,[\\\"isExternal\\\"]],[[[1,\\\"                        \\\"],[10,0],[14,0,\\\"participant-address\\\"],[12],[1,[33,15,[\\\"name\\\"]]],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,0],[14,0,\\\"participant-address\\\"],[12],[1,[34,16]],[13],[1,\\\"\\\\n\\\"]],[]]]],[]],[[[41,[33,6,[\\\"name\\\"]],[[[1,\\\"                        \\\"],[10,0],[14,0,\\\"person-name\\\"],[12],[1,[33,6,[\\\"name\\\"]]],[13],[1,\\\"\\\\n                        \\\"],[10,0],[14,0,\\\"person-title\\\"],[12],[1,[33,6,[\\\"title\\\"]]],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,0],[14,0,\\\"participant-address\\\"],[12],[1,[33,15,[\\\"name\\\"]]],[13],[1,\\\"\\\\n\\\"]],[]]]],[]]],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"btn-group\\\"],[14,\\\"role\\\",\\\"group\\\"],[12],[1,\\\"\\\\n\\\\n\\\"],[41,[33,17],[[[1,\\\"                        \\\"],[11,\\\"button\\\"],[16,0,[29,[\\\"btn btn-sm hold \\\",[52,[33,7],\\\"is-held\\\"]]]],[16,\\\"title\\\",[28,[37,18],[\\\"purecloud.toggle.hold\\\"],null]],[24,4,\\\"button\\\"],[4,[38,19],[[30,0],\\\"changeActiveSpeaker\\\",[33,15]],null],[12],[1,\\\"\\\\n                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/pause\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[11,\\\"button\\\"],[16,0,[29,[\\\"btn btn-sm hold \\\",[52,[33,7],\\\"is-held\\\"]]]],[16,\\\"title\\\",[28,[37,18],[\\\"purecloud.toggle.hold\\\"],null]],[24,4,\\\"button\\\"],[4,[38,19],[[30,0],\\\"toggleHold\\\",[33,15]],null],[12],[1,\\\"\\\\n                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/pause\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"\\\\n                    \\\"],[11,\\\"button\\\"],[16,0,[29,[\\\"btn btn-sm mute \\\",[52,[33,13],\\\"is-muted\\\"],\\\" \\\",[52,[33,20],\\\"btn-disabled\\\"]]]],[16,\\\"title\\\",[28,[37,18],[\\\"purecloud.toggle.mute\\\"],null]],[16,\\\"aria-disabled\\\",[36,20]],[16,1,[29,[[36,21],\\\"-mute-btn\\\"]]],[24,4,\\\"button\\\"],[4,[38,19],[[30,0],\\\"toggleMute\\\",[33,15]],null],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/mic-off\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,20],[[[1,\\\"                        \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,21],\\\"-mute-btn\\\"]]],[14,\\\"placement\\\",\\\"bottom\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,18],[\\\"purecloud.toggle.muteDisabled\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n                    \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-sm hangup\\\"],[16,\\\"title\\\",[28,[37,18],[\\\"purecloud.disconnect\\\"],null]],[24,4,\\\"button\\\"],[4,[38,19],[[30,0],\\\"disconnectParticipant\\\",[33,15]],null],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/hangup\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\\n                \\\"],[10,0],[14,0,\\\"arrow\\\"],[12],[13],[1,\\\"\\\\n\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]]],[]],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"menu-selector overlay-container testing\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,5],null,[[\\\"entity\\\",\\\"size\\\",\\\"showPresence\\\",\\\"showToolTip\\\"],[[52,[33,22],[33,23],[33,6]],80,[33,12],true]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[33,9],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"overlay dialing\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,7],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"overlay held\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/pause\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,8],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"overlay disconnected\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/close-x\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[]]],[1,\\\"\\\\n\\\"],[41,[33,4],[[[1,\\\"    \\\"],[10,\\\"h4\\\"],[14,0,\\\"conference-call\\\"],[12],[1,\\\"\\\\n\\\\n\\\"],[41,[33,24],[[[1,\\\"            \\\"],[10,\\\"h4\\\"],[14,0,\\\"participant-name\\\"],[12],[1,[33,15,[\\\"name\\\"]]],[13],[1,\\\"\\\\n            \\\"],[10,\\\"h5\\\"],[14,0,\\\"disconnected-went-to-voicemail\\\"],[12],[1,[28,[35,18],[\\\"purecloud.disconnectReason.youReachedVoicemail\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,6],[[[1,\\\"                \\\"],[10,1],[14,0,\\\"person-name\\\"],[12],[1,[33,6,[\\\"name\\\"]]],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,25],[[[1,\\\"                \\\"],[10,1],[14,0,\\\"conference-station participant-name\\\"],[12],[1,[33,15,[\\\"name\\\"]]],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                \\\"],[10,1],[14,0,\\\"participant-name\\\"],[12],[1,[28,[35,26],[[33,27]],null]],[13],[1,\\\"\\\\n\\\"],[41,[33,28],[[[1,\\\"                    \\\"],[10,1],[14,0,\\\"number\\\"],[12],[1,[28,[35,26],[[33,16]],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,1],[14,0,\\\"non-number\\\"],[12],[1,\\\" \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"]],[]]]],[]]]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"    \\\"],[10,\\\"h4\\\"],[14,0,\\\"non-conference\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,22],[[[1,\\\"            \\\"],[10,\\\"h4\\\"],[14,0,\\\"queue queue-name\\\"],[12],[1,[33,23,[\\\"name\\\"]]],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,24],[[[41,[33,2,[\\\"isGroupRing\\\"]],[[[1,\\\"                \\\"],[1,[33,2,[\\\"groupRingGroup\\\",\\\"name\\\"]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                \\\"],[10,\\\"h4\\\"],[14,0,\\\"voicemail participant-name\\\"],[12],[1,[33,15,[\\\"name\\\"]]],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[10,\\\"h5\\\"],[14,0,\\\"disconnected-went-to-voicemail\\\"],[12],[1,[28,[35,18],[\\\"purecloud.disconnectReason.youReachedVoicemail\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,2,[\\\"isGroupRing\\\"]],[[[1,\\\"            \\\"],[10,1],[14,0,\\\"active-call-group-ring-name active-call-group-ring-caller-name\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,26],[[33,27]],null]],[1,\\\"\\\\n\\\"],[41,[28,[37,1],[[28,[37,3],[[33,29]],null],[33,28]],null],[[[1,\\\"                    \\\"],[10,1],[14,0,\\\"number\\\"],[12],[1,[28,[35,26],[[28,[37,30],[[33,15,[\\\"address\\\"]]],null]],null]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"group-ring\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[33,2,[\\\"groupRingGroup\\\",\\\"name\\\"]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,14],[[[41,[33,15,[\\\"name\\\"]],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"sip-only participant-name\\\"],[12],[1,[33,15,[\\\"name\\\"]]],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"sip-only\\\"],[12],[1,[28,[35,18],[\\\"purecloud.sipOnly\\\"],null]],[13],[1,\\\"\\\\n\\\"],[41,[51,[33,22]],[[[1,\\\"                        \\\"],[10,1],[14,0,\\\"address participant-not-queue\\\"],[12],[1,[34,16]],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]]],[]],[[[41,[33,6],[[[1,\\\"                    \\\"],[10,1],[14,0,\\\"non-sip person-name\\\"],[12],[1,[33,6,[\\\"name\\\"]]],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,1],[14,0,\\\"non-sip participant-name\\\"],[12],[1,[33,15,[\\\"name\\\"]]],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,32],[[[1,\\\"                        \\\"],[10,1],[14,0,\\\"number\\\"],[12],[1,[28,[35,26],[[33,32]],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,1],[14,0,\\\"non-number\\\"],[12],[1,\\\" \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[]]]],[]]],[1,\\\"        \\\"]],[]]]],[]]]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[],false,[\\\"if\\\",\\\"and\\\",\\\"activeCall\\\",\\\"not\\\",\\\"isConferenceCall\\\",\\\"entity-image\\\",\\\"person\\\",\\\"isHeld\\\",\\\"isDisconnected\\\",\\\"isConnecting\\\",\\\"shouldAttachParticipantControls\\\",\\\"participant-controls\\\",\\\"showPresence\\\",\\\"isMuted\\\",\\\"isSipOnly\\\",\\\"participant\\\",\\\"address\\\",\\\"onConsult\\\",\\\"t\\\",\\\"action\\\",\\\"muteDisabled\\\",\\\"elementId\\\",\\\"isParticipantAQueue\\\",\\\"queue\\\",\\\"wentToVoicemail\\\",\\\"isConferenceStation\\\",\\\"await\\\",\\\"name\\\",\\\"showParticipantAddress\\\",\\\"isAddressSip\\\",\\\"address-format\\\",\\\"unless\\\",\\\"number\\\"]]\",\"moduleName\":\"web-directory/components/call-participant/template.hbs\",\"isStrictMode\":false});","import { observer, computed } from '@ember/object';\nimport { on } from '@ember/object/evented';\nimport Component from '@ember/component';\nimport cloneDeep from 'lodash/cloneDeep';\nimport isEmpty from 'lodash/isEmpty';\nimport pick from 'lodash/pick';\nimport { warnClosureAction } from 'web-directory/utils/acd';\n\n/*\n * TODO (Ember Dep):\n * Use the current-when property of the menu component here and\n * in the template as soon as Ember cuts a 1.13.x release\n * supporting the bounded version of current-when.\n *\n * See: https://github.com/emberjs/ember.js/pull/12344\n */\n\nconst CarouselMenu = Component.extend({\n    tagName: 'ul',\n    classNames: ['carousel-menu'],\n    classNameBindings: ['inSubMenu'],\n\n    root: null,\n    currItem: null,\n    showIcons: true,\n\n    leafItemClick: () => warnClosureAction('leafItemClick'),\n    leafItemClickEmpty: () => warnClosureAction('leafItemClickEmpty'),\n\n    onMenuChange: on(\n        'init',\n        observer('menu', function () {\n            const root = buildMenuTree(this.menu);\n            this.set('root', root);\n            this.set('currItem', root);\n        })\n    ),\n\n    currItems: computed('currItem', function () {\n        let result = [];\n        let root = this.root;\n        let curr = this.currItem;\n\n        if (!curr) {\n            return result;\n        }\n\n        if (curr !== root) {\n            result.push(buildMenuItemViewModel(curr, true));\n        }\n\n        curr.children &&\n            curr.children.forEach(function (child) {\n                result.push(buildMenuItemViewModel(child));\n            });\n\n        return result;\n    }),\n\n    inSubMenu: computed('currItem', 'root', function () {\n        const curr = this.currItem;\n        const root = this.root;\n        if (root === null || curr === null) {\n            return false;\n        }\n\n        return curr !== root;\n    })\n});\n\nfunction buildMenuItemViewModel(menuNode, isBackNode) {\n    let result = pick(menuNode, ['className', 'iconClassNames', 'label', 'route', 'url', 'isCurrentURL', 'target']);\n\n    result.node = menuNode; // Used as payload for custom (i.e. non-link) actions\n\n    if (isBackNode) {\n        result.back = menuNode.parent;\n    } else {\n        // Back nodes are headers; they aren't forward nodes even though they have children\n        let forward = menuNode;\n        if (menuNode.children === null || menuNode.children === undefined) {\n            forward = null;\n        }\n        result.forward = forward;\n    }\n\n    return result;\n}\n\n/**\n * Converts an array of menu items into an internal tree structure.\n */\nfunction buildMenuTree(items) {\n    const root = { children: [] };\n\n    if (Array.isArray(items) && !isEmpty(items)) {\n        root.children = cloneDeep(items);\n        root.children.forEach(child => {\n            decorateMenuItem(child, root);\n        });\n    }\n\n    return root;\n}\n\nfunction decorateMenuItem(item, parent) {\n    item.parent = parent;\n\n    if (item.children) {\n        if (Array.isArray(item.children) && !isEmpty(item.children)) {\n            item.children.forEach(child => {\n                decorateMenuItem(child, item);\n            });\n        } else {\n            item.children = null;\n        }\n    }\n}\n\nexport default CarouselMenu;\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"bZLzzN6p\",\"block\":\"[[[42,[28,[37,1],[[28,[37,1],[[33,2]],null]],null],null,[[[1,\\\"    \\\"],[10,\\\"li\\\"],[15,0,[29,[[52,[30,1,[\\\"back\\\"]],\\\"back\\\"],\\\"\\\\n            \\\",[52,[30,1,[\\\"forward\\\"]],\\\"forward\\\"],\\\"\\\\n            \\\",[52,[30,1,[\\\"className\\\"]],[30,1,[\\\"className\\\"]]]]]],[15,\\\"title\\\",[29,[[30,1,[\\\"label\\\"]]]]],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,4],null,[[\\\"menuItem\\\",\\\"leafItemClick\\\",\\\"leafItemClickEmpty\\\",\\\"showIcon\\\"],[[30,1],[33,5],[33,6],[33,7]]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null]],[\\\"menuItem\\\"],false,[\\\"each\\\",\\\"-track-array\\\",\\\"currItems\\\",\\\"if\\\",\\\"menu-item\\\",\\\"leafItemClick\\\",\\\"leafItemClickEmpty\\\",\\\"showIcons\\\"]]\",\"moduleName\":\"web-directory/components/carousel-menu/template.hbs\",\"isStrictMode\":false});","import { alias, readOnly } from '@ember/object/computed';\nimport { run } from '@ember/runloop';\nimport { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@ember/component';\nimport _ from 'lodash';\nimport Clipboard from 'clipboard';\n\n// This is the only consumer using this logic\n// from utils/pigeon, so I moved it here.\nfunction getPigeonMaxPriority() {\n    const priorities = Object.values(newTopicPriority);\n    // Add 10 to give priority topics the max priority\n    return Math.max.apply(null, priorities) + PRIORITY_MAXIMIZER;\n}\n\nconst newTopicPriority = {\n    presence: 30,\n    routingStatus: 25,\n    conversationsummary: 20,\n    other: 15,\n    outofoffice: 10,\n    geolocation: 5\n};\n\nconst PRIORITY_MAXIMIZER = 10;\nconst FRAME_PRIORITY_MODIFIER = 5;\n\nexport default Component.extend({\n    classNames: ['center-stage-content'],\n    classNameBindings: ['visible:visible:hidden'],\n    visible: true,\n    showMenu: true,\n    enableCopyURLIcon: false,\n\n    session: service(),\n    permissionsService: service('permissions'),\n    engage: service(),\n    adminNav: service(),\n    adminui: service(),\n    coaching: service(),\n    frameService: service('center-stage-frame'),\n    inbox: service(),\n    intl: service(),\n    notification: service(),\n    phone: service(),\n    fax: service(),\n    sidebar: service(),\n    commandNav: service('command-nav'),\n    rollingLogCapture: service('rolling-log-capture'),\n\n    isActivityPlanRulesEnabled: readOnly('session.features.WEM-1246_ActivityPlanRules'),\n\n    // cached route value use for detecting\n    // route attribute changes\n    _route: null,\n\n    init() {\n        this._super(...arguments);\n        this.pageBreadcrumbs = [];\n        this.pubSubBindings = {\n            'agentHome.openCoachingAppointmentModal': event => {\n                this.coaching.openCoachingAppointmentModal(event.payload);\n            },\n\n            'agentHome.openCoachingAppointmentsInboxTab': () => {\n                this.inbox.openCoachingAppointments();\n            },\n\n            'agentHome.openLearningAssignmentsInboxTab': () => {\n                this.inbox.openLearningAssignments();\n            },\n\n            // Deprecated - use the page.data event\n            'page.breadcrumbs': event => {\n                this.updateBreadcrumbs(event.payload);\n            },\n\n            // Deprecated - use the page.data event\n            enableCopyUrlIcon: event => {\n                this.updateCopyIcon(event && !!event.payload);\n            },\n\n            // Deprecated - use the page.data event\n            helpPathChange: event => {\n                this.set('helpPath', (event && event.payload && event.payload.helpPath) || '');\n            },\n\n            // Deprecated - use the page.data event\n            setDocumentTitle: event => {\n                if (event && event.payload && event.payload.title) {\n                    document.title = event.payload.title;\n                }\n            },\n\n            'page.data': event => {\n                if (event && event.payload) {\n                    this.updatePageData(event.payload);\n                }\n            },\n\n            'page.promptOnLeave': event => {\n                if (event) {\n                    this.updatePromptOnLeave(event.payload);\n                }\n            },\n\n            'phone.makeCall': event => {\n                if (event && event.payload) {\n                    this.makePhoneCall(event.payload);\n                }\n            },\n\n            'fax.openFaxPanel': event => {\n                if (event && event.payload) {\n                    this.set('fax.address', event.payload.faxNumber);\n                    if (this.get('session.useNewNav')) {\n                        this.commandNav.selectPanel('voice');\n                        this.set('commandNav.callControlsTab', 'fax');\n                    } else {\n                        this.sidebar.openPanel('callControls');\n                        this.sidebar.togglePanelSubstate('callControls', 'currentTab', 'fax');\n                    }\n                    this.set('fax.documentData', event.payload);\n                }\n            },\n\n            'sidebar.expandCommunicationSidebar': () => {\n                if (this.get('session.useNewNav') && this.get('commandNav.currentPanel') != 'panel-not-active') {\n                    this.commandNav.set('expanded', true);\n                } else if (this.get('sidebar.communicationPanel')) {\n                    this.sidebar.expandCommunicationSidebar();\n                }\n            },\n\n            'sidebar.expandAcdPanel': () => {\n                if (this.get('session.useNewNav')) {\n                    this.commandNav.selectPanel('agent');\n                } else {\n                    if (!this.get('sidebar.showAcdInteractions')) {\n                        this.sidebar.togglePanel('acdInteractions');\n                    }\n                }\n            },\n\n            'session.proxyLogin': event => {\n                if (event && event.payload) {\n                    this.session.proxyLogin(event.payload.orgId, event.payload.hash);\n                }\n            },\n\n            'logCaptureOnDemand.submit': () => {\n                this.submitRollingLogs();\n            }\n        };\n\n        this.set('topicPriority', getPigeonMaxPriority() - FRAME_PRIORITY_MODIFIER);\n    },\n\n    didInsertElement() {\n        if (!this.isActivityPlanRulesEnabled) {\n            return;\n        }\n        this._super(...arguments);\n        const frameRouter = this.element.querySelector('frame-router');\n        if (frameRouter) {\n            this.frameService.registerFrameRouter(frameRouter);\n        }\n    },\n\n    willDestroyElement() {\n        if (!this.isActivityPlanRulesEnabled) {\n            return;\n        }\n        this._super(...arguments);\n        this.frameService.registerFrameRouter(null);\n    },\n\n    updatePromptOnLeave(prompt) {\n        this.frameService.set('promptOnLeave', prompt);\n    },\n\n    makePhoneCall(payload) {\n        this.phone.makeCall(\n            payload.phoneNumber,\n            payload.callingPerson,\n            payload.onbehalfOfQueue,\n            payload.externalContactId\n        );\n    },\n\n    // Updates metadata about the embedded page from a single data structure,\n    // removing the need for multiple messages after navigation.\n    updatePageData(pageInfo) {\n        if (pageInfo.title) {\n            document.title = pageInfo.title;\n            this.frameService.set('pageTitle', pageInfo.title);\n        } else if (!pageInfo.title) {\n            this.frameService.set('pageTitle', null);\n        }\n        this.set('helpPath', pageInfo.helpPath || '');\n        if (pageInfo.breadcrumbs) {\n            if (pageInfo.breadcrumbs.segments) {\n                this.updateBreadcrumbs(pageInfo.breadcrumbs.segments);\n            }\n            this.updateCopyIcon(pageInfo.breadcrumbs.enableCopyUrl);\n        }\n    },\n\n    checkBreadcrumbAuthorized(breadcrumb) {\n        const permissionsService = this.permissionsService;\n        const { permissions } = breadcrumb;\n\n        let isBreadcrumbAuthorized = true;\n\n        if (permissions) {\n            const allOfThesePermissionsAreRequired = permissions.all || [];\n            const oneOfThesePermissionsAreRequired = permissions.any || [];\n\n            isBreadcrumbAuthorized = permissionsService.validateAllPermissions(allOfThesePermissionsAreRequired);\n\n            if (oneOfThesePermissionsAreRequired.length) {\n                isBreadcrumbAuthorized =\n                    isBreadcrumbAuthorized &&\n                    permissionsService.validateAnyPermissions(oneOfThesePermissionsAreRequired);\n            }\n        }\n\n        return isBreadcrumbAuthorized;\n    },\n\n    // Updates the breadcrumbs based on data provided by the client\n    updateBreadcrumbs(segments) {\n        let baseRoute = this.frameService.baseRouteForPath(this.route);\n\n        if (segments && baseRoute) {\n            const crumbs = segments.map(entry => {\n                const { path, text, active, isHostPath, id } = entry;\n                const hasPath = !!path;\n                const isAuthorized = this.checkBreadcrumbAuthorized(entry);\n                const showAsLink = hasPath && isAuthorized;\n\n                let clientCrumb = { text, id };\n\n                if (showAsLink) {\n                    const normalizedBaseRoute = baseRoute.replace(/\\/$/, '');\n                    const normalizedEntryPath = path.replace(/^\\//, '');\n\n                    const href = isHostPath ? normalizedEntryPath : `#${normalizedBaseRoute}/${normalizedEntryPath}`;\n\n                    clientCrumb = { text, href, active, id };\n                }\n\n                return clientCrumb;\n            });\n            this.set('pageBreadcrumbs', crumbs);\n        } else {\n            this.set('pageBreadcrumbs', []);\n        }\n    },\n\n    // Updates the copy icon state based on data from the client\n    updateCopyIcon(enabled) {\n        this.set('enableCopyURLIcon', !!enabled);\n        this.updateCopyURLIcon();\n    },\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n        const _route = this._route;\n        const nextRoute = this.route;\n        if (getRouteWithoutParams(_route) !== getRouteWithoutParams(nextRoute)) {\n            this.setProperties({\n                pageBreadcrumbs: [],\n                enableCopyURLIcon: false,\n                _route: nextRoute\n            });\n        }\n    },\n\n    updateCopyURLIcon() {\n        const url = window.location.href;\n        const clipboard = new Clipboard('.copy-icon', {\n            text: function () {\n                return url;\n            }\n        });\n        clipboard.on('success', () => {\n            run(() => {\n                this.notification.info(null, this.intl.t('notification.inboxShare.copyUrl').toString(), {\n                    tag: 'copy-share-uri',\n                    type: 'info',\n                    hideAfter: 5\n                });\n            });\n        });\n    },\n\n    async submitRollingLogs() {\n        const permissionsService = this.permissionsService;\n        if (permissionsService.canAddLogCaptureOnDemand) {\n            try {\n                await this.rollingLogCapture.postMessages();\n\n                const title = this.intl.t('logCaptureHelp.success.title');\n                const message = this.intl.t('logCaptureHelp.success.message');\n                this.notification.success(title, message, {\n                    forceBrowserNotification: true,\n                    hideAfter: 5\n                });\n            } catch (err) {\n                if (err.code === 'NO_MESSAGES') {\n                    const title = this.intl.t('logCaptureHelp.empty.title');\n                    const message = this.intl.t('logCaptureHelp.empty.message');\n                    this.notification.info(title, message);\n                    return;\n                }\n\n                const title = this.intl.t('logCaptureHelp.fail.title');\n                const message = this.intl.t('logCaptureHelp.fail.message');\n                this.notification.error(title, message);\n            }\n        }\n    },\n\n    nav: computed(\n        'route',\n        'engage.navTree.@each.subLinks',\n        'session.isAuthenticated',\n        'adminui.adminEntries',\n        'adminNav.fullNav',\n        'adminNav.fullNavTree',\n        function () {\n            const navConfig = this.frameService.navForPath(this.route);\n\n            if (!navConfig) {\n                return null;\n            } else {\n                let menu = navConfig.menu;\n\n                if (typeof menu == 'string' && menu.startsWith('engage:')) {\n                    // This case should be temporary until we've migrated all the old PCBA\n                    // apps to iframe-coordinator\n                    menu = translateEngageMenu(menu.replace('engage:', ''), this.get('engage.navTree'));\n                }\n\n                if (typeof menu == 'string' && menu.startsWith('admin:')) {\n                    let adminMenu;\n                    if (this.get('session.isAuthenticated')) {\n                        adminMenu = this.get('adminNav.fullNavTree');\n                    } else {\n                        adminMenu = this.get('adminui.adminEntries');\n                    }\n                    menu = translateAdminMenu(menu.replace('admin:', ''), adminMenu);\n                }\n\n                return {\n                    breadcrumbs: navConfig.breadcrumbs || [],\n                    menu: menu\n                };\n            }\n        }\n    ),\n\n    // Combine the static breadcrumbs defined in the iframe-client-config with any\n    // supplied by the center-stage content window via updatePageData. Normalize\n    // the two into a single representation for use in the template.\n    combinedBreadcrumbs: computed('nav.breadcrumbs', 'pageBreadcrumbs', 'session.useNewNav', function () {\n        const staticCrumbs = this.get('nav.breadcrumbs') || [];\n        const dynamicCrumbs = this.pageBreadcrumbs || [];\n\n        // Breadcrumbs defined in the client config will have intl keys that need\n        // to be turned into a `text` value consistent with already-translated\n        // values provided in the page.data breadcrumbs.\n        const staticCrumbsNormalized = staticCrumbs.map(crumb => {\n            const { id, href, active, textKey } = crumb;\n            return { id, href, active, text: this.intl.safestring(textKey) };\n        });\n\n        // Join the static and dynamic breadcrumb lists and omit the `href` prop\n        // from any marked as `active` as those should not be rendered as links.\n        const breadcrumbs = [].concat(staticCrumbsNormalized, dynamicCrumbs).map(crumb => {\n            const { id, href, active, text } = crumb;\n            if (active) {\n                return { id, text };\n            }\n            return { id, href, text };\n        });\n\n        // Use existing breadcrumbs in new navigation, but chop off the head\n        // assuming it was used to classify the admin view into the legacy\n        // admin structure.\n        if (breadcrumbs.length > 1 && this.get('session.useNewNav')) {\n            return breadcrumbs.slice(1);\n        }\n\n        return breadcrumbs;\n    }),\n\n    hasMenu: computed('nav.menu', function () {\n        return this.nav && this.get('nav.menu');\n    }),\n\n    helpPath: alias('frameService.helpPath'),\n\n    actions: {\n        toggleMenu() {\n            this.set('showMenu', !this.showMenu);\n        }\n    },\n\n    isSidebarFullWidth: readOnly('sidebar.sidebarExpanded'),\n\n    displayRoute: computed('route', 'isSidebarFullWidth', 'session.useNewNav', 'commandNav.expanded', function () {\n        if (this.get('session.useNewNav') && this.get('commandNav.expanded')) {\n            return 'no-op-route';\n        } else if (!this.get('session.useNewNav') && this.isSidebarFullWidth) {\n            return 'no-op-route';\n        } else {\n            return this.route;\n        }\n    })\n});\n\nfunction translateEngageMenu(engageKey, engageMenu) {\n    // Handle local development without embedded engage\n    if (engageMenu && engageMenu.find) {\n        const navParent = engageMenu.find(menuItem => {\n            return menuItem.subLinks && menuItem.href === '#' + engageKey;\n        });\n\n        if (navParent) {\n            return navParent.subLinks.map(navItem => {\n                let href = navItem.href;\n                // If the link path startsWith a '#/', keep it as is, otherwise\n                // prepend '#/engage/'. This lets us distinguish older auto-prefixed\n                // links from new links that are fully specified\n                if (href.substring(0, 2) !== '#/') {\n                    href = href.replace(/^#?/, '#/engage/');\n                }\n\n                return { textKey: navItem.text, href: href, permissions: extractPermissions(navItem.roles) };\n            });\n        }\n    }\n\n    // Couldn't find it.\n    return null;\n}\n\n// Find parent menu item by matching items href with adminKey path.\n// Can match by parent path or any of child item paths.\nfunction translateAdminMenu(adminKey, adminMenu) {\n    if (adminMenu && adminMenu.find) {\n        const navParent = adminMenu.find(menuItem => {\n            if (menuItem.subLinks) {\n                return (\n                    menuItem.href === adminKey ||\n                    menuItem.id === adminKey ||\n                    menuItem.subLinks.find(childMenuItem => {\n                        return childMenuItem.href == adminKey;\n                    })\n                );\n            }\n        });\n\n        if (navParent) {\n            return navParent.subLinks.map(mapAdminNavItem);\n        }\n    }\n\n    // Couldn't find it.\n    return null;\n}\n\nfunction mapAdminNavItem(navItem) {\n    // Set the href to be the base route so that highlighting in the nav menu is handled for sub routes\n    if (navItem.href && navItem.href.startsWith('responseManagement')) {\n        navItem.href = navItem.href.substring(0, 'responseManagement'.length);\n    }\n    const mappedNavItem = {\n        textKey: navItem.text,\n        href: getAdminNavHref(navItem),\n        permissions: extractPermissions(navItem.roles)\n    };\n    if (navItem.id) {\n        mappedNavItem.id = navItem.id;\n    }\n    if (navItem.subLinks) {\n        mappedNavItem.subLinks = navItem.subLinks.map(mapAdminNavItem);\n    }\n    if (navItem.external) {\n        mappedNavItem.external = navItem.external;\n    }\n    return mappedNavItem;\n}\n\nfunction getAdminNavHref(adminNavItem) {\n    // direct-linked nav items should be used exactly as their href says, no prefixing\n    if (adminNavItem.direct) {\n        return adminNavItem.href;\n    }\n    // dashboardHref is on adminNav.fullNav or engage menu and has the correct href we want\n    if (adminNavItem.dashboardHref) {\n        return adminNavItem.dashboardHref;\n    }\n    if (adminNavItem.href) {\n        return '#/admin/' + adminNavItem.href;\n    }\n    return undefined;\n}\n\nfunction extractPermissions(engageNavRoles) {\n    let navRoles = checkArrayOfArray(engageNavRoles);\n    if (navRoles && navRoles.length) {\n        return navRoles\n            .filter(role => {\n                role.startsWith('perm:');\n            })\n            .map(permStr => {\n                permStr.replace(/^perm:/, '');\n            });\n    } else {\n        return [];\n    }\n}\n\nfunction checkArrayOfArray(navRoles) {\n    if (navRoles && navRoles[0] && navRoles[0]['any'] && Array.isArray(navRoles[0]['any'])) {\n        return _.isEmpty(navRoles[0]['any']) ? [] : navRoles[0]['any'];\n    } else {\n        return navRoles;\n    }\n}\n\nfunction getRouteWithoutParams(route) {\n    return route ? route.split('?')[0] : null;\n}\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"CEQ9a5Bj\",\"block\":\"[[[41,[28,[37,1],[[28,[37,2],[[33,3,[\\\"breadcrumbs\\\"]],[33,4,[\\\"length\\\"]]],null]],null],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"breadcrumb-bar\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,1],[[33,5],[28,[37,6],[[33,7,[\\\"useNewNav\\\"]]],null]],null],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"action-row\\\"],[12],[1,\\\"\\\\n                \\\"],[11,\\\"button\\\"],[24,0,\\\"toggle-menu-button\\\"],[16,\\\"aria-label\\\",[28,[37,8],[\\\"toggle.navigation\\\"],null]],[24,4,\\\"button\\\"],[4,[38,9],[[30,0],\\\"toggleMenu\\\"],null],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"i\\\"],[14,0,\\\"pc pc-bars\\\"],[15,\\\"aria-label\\\",[28,[37,8],[\\\"toggle.navigation\\\"],null]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[10,\\\"ol\\\"],[14,0,\\\"breadcrumbs\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,11],[[28,[37,11],[[33,12]],null]],null],null,[[[1,\\\"                \\\"],[10,\\\"li\\\"],[15,0,[29,[[52,[30,1,[\\\"id\\\"]],[28,[37,13],[\\\"-\\\",\\\"breadcrumb\\\",\\\"item\\\",[30,1,[\\\"id\\\"]]],null]]]]],[12],[1,\\\"\\\\n\\\"],[41,[30,1,[\\\"href\\\"]],[[[1,\\\"                        \\\"],[10,3],[14,0,\\\"breadcrumb-text\\\"],[15,6,[30,1,[\\\"href\\\"]]],[12],[1,[30,1,[\\\"text\\\"]]],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,1],[14,0,\\\"breadcrumb-text\\\"],[15,\\\"title\\\",[29,[[30,1,[\\\"text\\\"]]]]],[12],[1,[30,1,[\\\"text\\\"]]],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"client-and-menu\\\"],[12],[1,\\\"\\\\n    \\\"],[1,[28,[35,14],null,[[\\\"route\\\",\\\"class\\\",\\\"visible\\\",\\\"pubSubBindings\\\",\\\"topicPriority\\\",\\\"clientConfig\\\"],[[33,15],\\\"main-iframe\\\",[33,16],[33,17],[33,18],[33,19]]]]],[1,\\\"\\\\n\\\"],[13]],[\\\"breadcrumb\\\"],false,[\\\"if\\\",\\\"and\\\",\\\"or\\\",\\\"nav\\\",\\\"pageBreadcrumbs\\\",\\\"hasMenu\\\",\\\"not\\\",\\\"session\\\",\\\"t\\\",\\\"action\\\",\\\"each\\\",\\\"-track-array\\\",\\\"combinedBreadcrumbs\\\",\\\"join-strings\\\",\\\"frame-router\\\",\\\"displayRoute\\\",\\\"visible\\\",\\\"pubSubBindings\\\",\\\"topicPriority\\\",\\\"clientConfig\\\"]]\",\"moduleName\":\"web-directory/components/center-stage-frame/template.hbs\",\"isStrictMode\":false});","import { on } from '@ember/object/evented';\nimport { computed, observer } from '@ember/object';\nimport { later, scheduleOnce, cancel } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport Component from '@ember/component';\nimport _ from 'lodash';\nimport PasswordRulesMixin, { maxPasswordLength } from '../../mixins/password-rules';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nexport default Component.extend(PasswordRulesMixin, LoggerMixin, {\n    classNames: ['change-password'],\n\n    intl: service(),\n    application: service(),\n    ajax: service(),\n    session: service(),\n\n    currentPassword: null,\n    newPassword: null,\n    newPasswordRepeat: null,\n\n    isValidFromPasswordRulesPlugin: false,\n\n    resetError: false,\n    resetErrorMessages: [],\n    resetSuccess: false,\n\n    debounceTimers: [],\n\n    placeholderText: computed('minPasswordLength', function () {\n        const length = this.minPasswordLength ? this.minPasswordLength : 8;\n        return this.intl.safestring('auth.password.placeholder', { length });\n    }),\n\n    actions: {\n        submit() {\n            if (this.submitDisabled) {\n                return;\n            }\n\n            const intl = this.intl;\n\n            const request = this.session.resetPassword(this.newPassword, this.currentPassword);\n\n            request\n                .then(() => {\n                    this.set('resetSuccess', true);\n                    this.set('resetError', false);\n                    this.set('resetErrorMessages', []);\n\n                    const debounceTimer = later(\n                        this,\n                        () => {\n                            this.set('resetSuccess', false);\n                        },\n                        8000\n                    );\n                    this.debounceTimers.push(debounceTimer);\n\n                    this.emptyValues();\n                })\n                .catch(err => {\n                    this.logger.error('Error changing password:', {\n                        err: err\n                    });\n\n                    this.set('resetSuccess', false);\n                    this.set('resetError', true);\n\n                    let message = intl.t('auth.password.error');\n                    if (err.payload && err.payload.code) {\n                        const code = err.payload.code;\n                        let key = 'default';\n                        const keyPath = 'auth.password.changeError';\n                        if (code === 'invalid.new.password') {\n                            key = 'invalidNewPassword';\n                        } else if (code === 'invalid.old.password') {\n                            key = 'invalidOldPassword';\n                        } else if (code === 'invalid.password') {\n                            key = 'invalidPassword';\n                        }\n                        message = intl.t(`${keyPath}.${key}`);\n                    }\n\n                    this.set('resetErrorMessages', [message]);\n\n                    const debounceTimer = later(\n                        this,\n                        () => {\n                            this.set('resetError', false);\n                        },\n                        30000\n                    );\n                    this.debounceTimers.push(debounceTimer);\n\n                    this.emptyValues();\n                });\n        }\n    },\n\n    newPasswordError: computed('newPassword', 'newPasswordRepeat', function () {\n        return this.newPassword !== this.newPasswordRepeat;\n    }),\n\n    passwordLengthError: computed('newPassword', function () {\n        return this.get('newPassword.length') > maxPasswordLength;\n    }),\n\n    submitDisabled: computed(\n        'newPasswordError',\n        'isValidFromPasswordRulesPlugin',\n        'passwordLengthError',\n        'currentPassword',\n        'newPassword',\n        'newPasswordRepeat',\n        function () {\n            const currentPasswordEmpty = _.isEmpty(this.currentPassword);\n            const newPasswordEmpty = _.isEmpty(this.newPassword) || _.isEmpty('newPasswordRepeat');\n            return (\n                currentPasswordEmpty ||\n                newPasswordEmpty ||\n                this.newPasswordError ||\n                !this.isValidFromPasswordRulesPlugin ||\n                this.passwordLengthError\n            );\n        }\n    ),\n\n    resetPlugin: observer('newPassword', 'resetSuccess', function () {\n        if (this.resetSuccess && !this.newPassword) {\n            this.removeBehavior();\n            this.attachBehavior();\n        }\n    }),\n\n    newPasswordStrengthIndicator: observer('newPassword', function () {\n        scheduleOnce('afterRender', this, function () {\n            if (this.isDestroyed || this.isDestroying) {\n                return;\n            }\n\n            const progressBar = this.element.querySelector('.progress-bar');\n            if (progressBar) {\n                if (this.newPassword === '') {\n                    progressBar.classList.remove('show-strength');\n                } else {\n                    progressBar.classList.add('show-strength');\n                }\n            }\n        });\n    }),\n\n    cleanup: on('willDestroyElement', function () {\n        this.emptyValues();\n        if (this.debounceTimers) {\n            this.debounceTimers.forEach(function (timer) {\n                cancel(timer);\n            });\n        }\n    }),\n\n    emptyValues: function () {\n        this.setProperties({\n            currentPassword: null,\n            newPassword: null,\n            newPasswordRepeat: null\n        });\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"7bjePiby\",\"block\":\"[[[10,\\\"form\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,1],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"alerts\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-inline-alert\\\"],[14,\\\"accent\\\",\\\"success\\\"],[12],[1,[28,[35,2],[\\\"auth.password.success\\\"],null]],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,3],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"alerts\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-inline-alert\\\"],[14,\\\"accent\\\",\\\"error\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,5],[[28,[37,5],[[33,6]],null]],null],null,[[[1,\\\"                    \\\"],[1,[30,1]],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[10,0],[14,0,\\\"settings-preference current-password-container\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"label\\\"],[14,0,\\\"settings-header-text\\\"],[12],[1,[28,[35,2],[\\\"auth.password.change\\\"],null]],[13],[1,\\\"\\\\n        \\\"],[10,\\\"label\\\"],[15,\\\"for\\\",[29,[[28,[37,7],[[33,8],\\\"-current-password\\\"],null]]]],[14,0,\\\"setting-label current-password\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,2],[\\\"auth.password.current\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[1,[28,[35,9],null,[[\\\"id\\\",\\\"type\\\",\\\"classNames\\\",\\\"value\\\"],[[28,[37,7],[[33,8],\\\"-current-password\\\"],null],\\\"password\\\",\\\"form-control\\\",[33,10]]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"settings-preference new-password-container pwstrength-container\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"label\\\"],[15,\\\"for\\\",[29,[[28,[37,7],[[33,8],\\\"-new-password\\\"],null]]]],[15,0,[29,[\\\"setting-label new-password \\\",[52,[33,11],\\\"has-error\\\"]]]],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,2],[\\\"auth.password.new\\\"],null]],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"pwstrength-progress\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[1,[28,[35,9],null,[[\\\"id\\\",\\\"type\\\",\\\"placeholder\\\",\\\"classNames\\\",\\\"value\\\"],[[28,[37,7],[[33,8],\\\"-new-password\\\"],null],\\\"password\\\",[33,12],\\\"form-control\\\",[33,13]]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[15,0,[29,[\\\"settings-preference new-password-repeat-container \\\",[52,[33,14],\\\"has-error\\\"]]]],[12],[1,\\\"\\\\n        \\\"],[10,\\\"label\\\"],[15,\\\"for\\\",[29,[[28,[37,7],[[33,8],\\\"-verify-password\\\"],null]]]],[14,0,\\\"setting-label new-password-repeat\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,2],[\\\"auth.password.verify\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[1,[28,[35,9],null,[[\\\"id\\\",\\\"type\\\",\\\"classNames\\\",\\\"value\\\"],[[28,[37,7],[[33,8],\\\"-verify-password\\\"],null],\\\"password\\\",\\\"form-control password-repeat\\\",[33,15]]]]],[1,\\\"\\\\n\\\"],[41,[33,14],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"alerts\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-inline-alert\\\"],[14,\\\"accent\\\",\\\"error\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,2],[\\\"auth.password.validation.passwordRepeatError\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-purecloud btn-success\\\"],[16,\\\"disabled\\\",[36,16]],[24,4,\\\"submit\\\"],[4,[38,17],[[30,0],\\\"submit\\\"],null],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,2],[\\\"auth.password.change\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[\\\"message\\\"],false,[\\\"if\\\",\\\"resetSuccess\\\",\\\"t\\\",\\\"resetError\\\",\\\"each\\\",\\\"-track-array\\\",\\\"resetErrorMessages\\\",\\\"concat\\\",\\\"elementId\\\",\\\"input\\\",\\\"currentPassword\\\",\\\"passwordLengthError\\\",\\\"placeholderText\\\",\\\"newPassword\\\",\\\"newPasswordError\\\",\\\"newPasswordRepeat\\\",\\\"submitDisabled\\\",\\\"action\\\"]]\",\"moduleName\":\"web-directory/components/change-password/template.hbs\",\"isStrictMode\":false});","import { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@ember/component';\nimport { getEnvDetails } from 'web-directory/utils/net';\n\nconst MAX_PIN_LENGTH = 4;\nconst MAX_PIN_LENGTH_FIPS = 14;\n\nconst fipsEnvironments = ['fedramp', 'dev', 'dca'];\n\nconst ChangePinComponent = Component.extend({\n    classNames: ['change-pin'],\n\n    intl: service(),\n    ajax: service(),\n    session: service(),\n    application: service(),\n\n    newPin: null,\n    newPinRepeat: null,\n    newPinError: false,\n    errorMessage: null,\n    resetError: false,\n    resetSuccess: false,\n    message: null,\n\n    maxPinLength: MAX_PIN_LENGTH,\n\n    submitDisabled: computed('newPin', 'newPinRepeat', function () {\n        const newPin = this.newPin;\n        const repeat = this.newPinRepeat;\n        const inputValid = newPin && repeat && newPin === repeat;\n\n        return !inputValid;\n    }),\n\n    init() {\n        this._super(...arguments);\n        const envDetails = getEnvDetails();\n        // FIPS enabled requires pin to be 14 characters\n        if (fipsEnvironments.includes(envDetails.env)) {\n            this.set('maxPinLength', MAX_PIN_LENGTH_FIPS);\n        }\n    },\n\n    actions: {\n        submit() {\n            const newPin = this.newPin;\n            const verifyPin = this.newPinRepeat;\n            const flag = this._verifyInputs(newPin, verifyPin);\n\n            if (flag) {\n                const guid = this.get('session.person.guid');\n                const pinData = {\n                    pin: verifyPin\n                };\n                const path = this.application.pcV2Uri(`api/v2/voicemail/userpolicies/${guid}`);\n\n                const promise = this.ajax.patch(path, {\n                    data: pinData,\n                    timeout: 5000\n                });\n\n                promise\n                    .then(() => {\n                        this.setProperties({\n                            resetError: false,\n                            resetSuccess: true\n                        });\n                        this.resetValues();\n                    })\n                    .catch(() => {\n                        this.setProperties({\n                            resetError: true,\n                            resetSuccess: false,\n                            errorMessage: this.intl.t('auth.pin.error')\n                        });\n                    });\n            }\n        },\n        validate() {\n            if (arguments[0].length < this.get('newPin.length')) {\n                return this.set('newPinError', false);\n            }\n            if (arguments[0] !== this.newPin) {\n                return this.set('newPinError', true);\n            }\n            return this.set('newPinError', false);\n        }\n    },\n\n    resetValues() {\n        this.setProperties({\n            newPin: null,\n            newPinRepeat: null,\n            message: null,\n            submitDisabled: true\n        });\n    },\n\n    _verifyInputs(newP, verify) {\n        const intl = this.intl;\n        const maxPinLength = this.maxPinLength;\n\n        if (newP.length === maxPinLength && verify.length === maxPinLength) {\n            if (newP === verify) {\n                const regex = new RegExp(`^\\\\d{${maxPinLength}}$`);\n                var flag = regex.test(verify);\n                if (flag) {\n                    return true;\n                } else {\n                    this.setProperties({\n                        resetError: true,\n                        errorMessage: intl.t('auth.pin.validation.numberError')\n                    });\n                    return false;\n                }\n            } else {\n                this.setProperties({\n                    resetError: true,\n                    errorMessage: intl.t('auth.pin.validation.pinRepeatError')\n                });\n                return false;\n            }\n        } else {\n            this.setProperties({\n                resetError: true,\n                errorMessage: intl.t('auth.pin.validation.pinLength', { maxPinDigits: maxPinLength })\n            });\n            return false;\n        }\n    }\n});\n\nexport default ChangePinComponent;\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"+q6MF76h\",\"block\":\"[[[10,\\\"form\\\"],[14,0,\\\"form form-horizontal\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,1],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"alerts\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-inline-alert\\\"],[14,\\\"accent\\\",\\\"success\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,2],[\\\"auth.pin.success\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,3],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"alerts\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-inline-alert\\\"],[14,\\\"accent\\\",\\\"error\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[34,4]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"settings-preference\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"label\\\"],[14,0,\\\"settings-header-text\\\"],[12],[1,[28,[35,2],[\\\"auth.pin.change\\\"],null]],[13],[1,\\\"\\\\n        \\\"],[10,\\\"label\\\"],[15,\\\"for\\\",[29,[[28,[37,5],[[33,6],\\\"-new-pin\\\"],null]]]],[14,0,\\\"setting-label\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,2],[\\\"auth.pin.new\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[1,[28,[35,7],null,[[\\\"id\\\",\\\"type\\\",\\\"placeholder\\\",\\\"classNames\\\",\\\"value\\\"],[[28,[37,5],[[33,6],\\\"-new-pin\\\"],null],\\\"password\\\",[28,[37,2],[\\\"auth.pin.placeholder\\\"],[[\\\"maxPinDigits\\\"],[[33,8]]]],\\\"new-pin form-control\\\",[33,9]]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[15,0,[29,[\\\"settings-preference \\\",[52,[33,10],\\\"has-error\\\"]]]],[12],[1,\\\"\\\\n        \\\"],[10,\\\"label\\\"],[15,\\\"for\\\",[29,[[28,[37,5],[[33,6],\\\"-repeat-pin\\\"],null]]]],[14,0,\\\"setting-label\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,2],[\\\"auth.pin.verify\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[1,[28,[35,7],null,[[\\\"id\\\",\\\"type\\\",\\\"classNames\\\",\\\"value\\\",\\\"key-up\\\"],[[28,[37,5],[[33,6],\\\"-repeat-pin\\\"],null],\\\"password\\\",\\\"new-pin-repeat form-control pin-repeat\\\",[33,11],[28,[37,12],[[30,0],\\\"validate\\\"],null]]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-purecloud btn-success\\\"],[16,\\\"disabled\\\",[36,13]],[24,4,\\\"submit\\\"],[4,[38,12],[[30,0],\\\"submit\\\"],null],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,2],[\\\"auth.pin.change\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"if\\\",\\\"resetSuccess\\\",\\\"t\\\",\\\"resetError\\\",\\\"errorMessage\\\",\\\"concat\\\",\\\"elementId\\\",\\\"input\\\",\\\"maxPinLength\\\",\\\"newPin\\\",\\\"newPinError\\\",\\\"newPinRepeat\\\",\\\"action\\\",\\\"submitDisabled\\\"]]\",\"moduleName\":\"web-directory/components/change-pin/template.hbs\",\"isStrictMode\":false});","import { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@ember/component';\n\nexport default Component.extend({\n    tagName: 'p',\n    classNames: ['character-counter', 'small', 'help-block'],\n\n    intl: service(),\n\n    model: null,\n    maxCount: 0,\n\n    charactersUsed: computed('model.length', function () {\n        const length = this.get('model.length') || 0;\n        if (length > 1) {\n            return this.intl.t('components.navMenu.feedback.charactersUsed', {\n                characterCount: length,\n                maxCount: this.maxCount\n            });\n        }\n        return '';\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"3YzAk0ZX\",\"block\":\"[[[2,[36,0]]],[],false,[\\\"charactersUsed\\\"]]\",\"moduleName\":\"web-directory/components/characters-used/template.hbs\",\"isStrictMode\":false});","import Ember from 'ember';\nimport LoggerMixin from '../../mixins/logger';\nimport { COLLABORATE_CHAT_FRAME_ID, COLLABORATE_CHAT_EVENTS } from 'web-directory/utils/collab-chat-constants';\nimport { inject } from '@ember/service';\n\nconst { Component, computed } = Ember;\n\nexport type ChatFrameRouterType = HTMLElement & {\n    messaging: { addListener: (eventName: string, callback: unknown) => void };\n};\n\nexport type GlobalPreferenceType = {\n    displayDensity: string;\n    soundsMuted: boolean;\n    sortedAlpha: string;\n    mediaExpanded: boolean;\n    giphyKeyboard: string;\n    giphyState: boolean;\n    embedGithubReadme: boolean;\n};\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['chat-frame-router'],\n    isCallPane: false,\n\n    intl: inject('intl'),\n    session: inject('session'),\n    volt: inject('volt'),\n    chat: inject('chat'),\n    chatFrame: inject('chatFrame'),\n    sidebar: inject('sidebar'),\n    commandNav: inject('command-nav'),\n    chatCommands: inject('chatCommands'),\n    notification: inject('notification'),\n    settings: inject('settings'),\n    preferences: inject('preferences'),\n\n    collaborateChatConfig: computed.readOnly('chatFrame.collaborateChatFrameConfig'),\n    freeSeatPreference: computed.bool('session.org.orgPreferences.freeSeating'),\n    orgPreferences: computed.readOnly('session.org.orgPreferences'),\n\n    // prettier-ignore\n    config: computed('isCallPane', 'collaborateChatConfig', function() {\n        const config = JSON.parse(JSON.stringify(this.get('collaborateChatConfig')));\n\n        if (this.get('isCallPane')) {\n            config.collaborateChat.url = new URL(`${config.collaborateChat.url}?isCallPane=true`, window.location.href).toString();\n            return config;\n        }\n        return this.get('collaborateChatConfig');\n    }),\n\n    frameId: computed('isCallPane', function () {\n        return this.get('isCallPane') ? COLLABORATE_CHAT_FRAME_ID.PHONE : COLLABORATE_CHAT_FRAME_ID.MAIN;\n    }),\n\n    chatInstance: computed('frameId', function () {\n        switch (this.get('frameId')) {\n            case COLLABORATE_CHAT_FRAME_ID.PHONE:\n                return 'PHONE';\n            case COLLABORATE_CHAT_FRAME_ID.MAIN:\n            default:\n                return 'MAIN';\n        }\n    }),\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.initializeFrameRouter();\n    },\n\n    willDestroyElement: function () {\n        this._super(...arguments);\n        if (this.get('isCallPane')) {\n            this.get('chatFrame').set('collabChatPhoneReady', false);\n        }\n    },\n\n    initializeFrameRouter(this: any) {\n        this.logger.debug(`%c[${this.get('chatInstance')}]:::initialize frameRouter`, 'color: lightgreen');\n        this.get('chat').handleCmdIFrame();\n        const frameRouterElement = this.setupCollaborateChatFrameRouter();\n        // @ts-ignore\n        this.setupCollaborateChatFrameEvents(frameRouterElement);\n    },\n\n    setupCollaborateChatFrameRouter(this: any) {\n        const frameId = this.get('frameId');\n        const results = this.$(`[frame-id='${frameId}']`);\n\n        if (!results || !results.length) {\n            this.logger.error(`Failed to find ${frameId} frame router`);\n            return;\n        }\n        const frameRouter = results[0];\n        return frameRouter;\n    },\n\n    getUpdatedPreference(collabChatPreference: string) {\n        const showGithubEmbeds = collabChatPreference === 'showGithubEmbeds';\n        return {\n            name: showGithubEmbeds ? 'widgets' : 'chat.global',\n            setting: showGithubEmbeds ? 'githubRepo' : collabChatPreference,\n            settingType: showGithubEmbeds ? 'embed' : ''\n        };\n    },\n\n    setupCollaborateChatFrameEvents(this: any, iframe: ChatFrameRouterType) {\n        if (iframe) {\n            switch (iframe.getAttribute('frame-id')) {\n                case COLLABORATE_CHAT_FRAME_ID.PHONE:\n                    // @ts-ignore\n                    this.get('chatFrame').set('collaborateChatPhoneIFrame', iframe);\n                    break;\n                default:\n                    // @ts-ignore\n                    this.get('chatFrame').set('collaborateChatIFrame', iframe);\n                    break;\n            }\n\n            iframe.messaging.addListener('clientInitialized', () => {\n                const frame = `chatFrame.${\n                    this.get('isCallPane') ? 'collabChatPhoneInitialized' : 'collabChatMainInitialized'\n                }`;\n                // @ts-ignore\n                this.set(frame, true);\n                this.get('chatFrame').publishSideBarToCollabChat();\n                // @ts-ignore\n                this.get('chat').sendCommandsToIframe(this.get('chatFrame').get('chatCommands.queuedChatCommands'));\n                this.get('chatFrame').notifyCollaborateChat(COLLABORATE_CHAT_EVENTS.publish.freeSeatPreference, {\n                    freeSeating: this.get('freeSeatPreference')\n                });\n                const payload = {\n                    orgPreferences: this.get('orgPreferences')\n                };\n                this.get('chatFrame').notifyCollaborateChat(COLLABORATE_CHAT_EVENTS.publish.orgPreferences, payload);\n                // set up an event listener for when the iframe is clicked\n                // there are some actions that should reset when our frame is clicked\n                // for example, if you search for users in the suggest search and click our frame\n                // we need to 'close' the suggest search.\n                // Other components/services can now use `chatFrame.on('collaborateChatFrameClicked')` event.\n                const rawIframe = iframe.querySelector('iframe');\n                if (rawIframe) {\n                    rawIframe.contentDocument?.body.addEventListener('click', (evt: MouseEvent) => {\n                        this.get('chatFrame').triggerClick(evt);\n                    });\n                }\n            });\n            // event to hide the chat panel\n            iframe.messaging.addListener(\n                COLLABORATE_CHAT_EVENTS.listeners.hide,\n                ({ payload: { hide } }: { payload: { hide: boolean } }) => {\n                    if (hide == false) return;\n                    if (this.get('session').get('useNewNav')) {\n                        this.get('commandNav').selectPanel('panel-not-active');\n                    } else {\n                        this.get('sidebar').closePanel();\n                    }\n                    return null;\n                }\n            );\n\n            // event to collapse/expand side bar\n            iframe.messaging.addListener(\n                COLLABORATE_CHAT_EVENTS.listeners.toggleSidebar,\n                ({ payload: { toggle } }: any) => {\n                    if (toggle == false) return;\n                    if (this.get('session').get('useNewNav')) {\n                        this.get('commandNav').togglePanel();\n                    } else {\n                        this.get('sidebar').toggleCommunicationSidebarExpanded();\n                    }\n                    return null;\n                }\n            );\n\n            // event to popout chat\n            iframe.messaging.addListener(\n                COLLABORATE_CHAT_EVENTS.listeners.popout,\n                ({ payload: { popout, jid } }: any) => {\n                    if (popout == false || !Boolean(jid)) return;\n                    this.get('chat')\n                        .getChatRoom(jid)\n                        .then((room: any) => {\n                            // chat-commands mixin to popout room\n                            room && this.get('chat')._popoutRoom(room);\n                        });\n                    return null;\n                }\n            );\n\n            iframe.messaging.addListener(\n                COLLABORATE_CHAT_EVENTS.listeners.changeRoom,\n                ({ payload: { jid } }: { payload: { jid: string } }) => {\n                    this.logger.debug(`[web-dir:chat] Recieved ${COLLABORATE_CHAT_EVENTS.listeners.changeRoom}`, jid);\n                    this.get('chat').openRoom(jid, false);\n                }\n            );\n\n            iframe.messaging.addListener(COLLABORATE_CHAT_EVENTS.listeners.changeFavorite, (payload: any) => {\n                this.logger.info(\n                    `[web-dir:chat] Recieved ${COLLABORATE_CHAT_EVENTS.listeners.changeFavorite}`,\n                    payload\n                );\n                // @ts-ignore\n                this.get('chatFrame').notifyCollaborateChatIFrame(\n                    COLLABORATE_CHAT_EVENTS.publish.favoriteChanged,\n                    payload\n                );\n                // @ts-ignore\n                this.get('chatFrame').updateWebDirectoryFavoriteState(payload);\n            });\n\n            iframe.messaging.addListener(\n                COLLABORATE_CHAT_EVENTS.listeners.joinRoom,\n                ({ payload: { jid, error, rejoining = false } }: any) => {\n                    this.logger.debug(`[web-dir:chat] Recieved ${COLLABORATE_CHAT_EVENTS.listeners.joinRoom}`, jid);\n                    this.get('chat')\n                        .getChatRoom(jid)\n                        .then((room: any) => this.get('chat').joinRoomEvent(room, error, rejoining));\n                }\n            );\n\n            iframe.messaging.addListener(\n                COLLABORATE_CHAT_EVENTS.listeners.fromCollabChatCommand,\n                ({ payload: { command, message, roomJid } }: any) => {\n                    const commands = this.get('chatCommands').get('commands');\n                    const cmd = commands.find((value: any) => value.name === command);\n                    if (cmd) {\n                        this.get('chat')\n                            .getChatRoom(roomJid)\n                            .then((room: any) => {\n                                //video gets started here\n                                this.get('chat').set('activeRoom', room);\n                                const options = {};\n                                cmd.value.call(this, command, cmd.help, options, message);\n                            });\n                    }\n                }\n            );\n\n            iframe.messaging.addListener(COLLABORATE_CHAT_EVENTS.listeners.openVideoPane, () => {\n                this.logger.debug(`[web-dir:chat] Recieved ${COLLABORATE_CHAT_EVENTS.listeners.openVideoPane}`);\n                this.get('sidebar').openPanel('webrtc');\n            });\n\n            iframe.messaging.addListener(\n                COLLABORATE_CHAT_EVENTS.listeners.toast,\n                this.get('chatFrame').handleCollaborateToast.bind(this)\n            );\n\n            iframe.messaging.addListener(\n                COLLABORATE_CHAT_EVENTS.listeners.collabChatIntegrationError,\n                ({ payload: { title, message } }: any) => {\n                    this.get('notification').error(title, message, {\n                        target: this,\n                        hideAfter: 10\n                    });\n                }\n            );\n\n            // open preference modal with specific tab\n            iframe.messaging.addListener(\n                COLLABORATE_CHAT_EVENTS.listeners.openPreferenceModal,\n                ({ payload: { tab } }: { payload: { tab: string } }) => {\n                    switch (tab) {\n                        case 'volume':\n                            this.get('settings').openSoundPreference();\n                            break;\n                        case 'notification':\n                            this.get('settings').open();\n                            break;\n                        default:\n                            break;\n                    }\n                }\n            );\n\n            iframe.messaging.addListener(\n                COLLABORATE_CHAT_EVENTS.listeners.collabChatToggleMute,\n                async ({ payload: { roomJid, mute } }: { payload: { roomJid: string; mute: boolean } }) => {\n                    await this.get('chat').setRoomMuted(roomJid, mute);\n                    const mutedRooms = this.get('chat').get('mutedRooms');\n                    this.get('preferences').setPreference('chat.mutedRooms', JSON.stringify(mutedRooms), false);\n                    // @ts-ignore\n                    this.get('chatFrame').notifyCollaborateChatIFrame('host-relaying-mute-update');\n                }\n            );\n\n            iframe.messaging.addListener(\n                COLLABORATE_CHAT_EVENTS.listeners.collabChatUpdatePreference,\n                async ({\n                    payload\n                }: {\n                    payload: { value: string | boolean; name: any } | { value: string | boolean; name: any }[];\n                }) => {\n                    const preferenceChanges = !Array.isArray(payload) ? [payload] : payload;\n                    const preferences = this.get('preferences');\n                    for (const { value, name } of preferenceChanges) {\n                        const updatedPreference = this.getUpdatedPreference(name);\n                        await preferences.getPreference(updatedPreference.name).then(async (pref: any) => {\n                            if (updatedPreference.settingType) {\n                                pref[updatedPreference.setting][updatedPreference.settingType] = value;\n                            } else {\n                                pref[updatedPreference.setting] = value;\n                            }\n                            await preferences.setPreference(updatedPreference.name, pref, false);\n                        });\n                    }\n                }\n            );\n\n            /**\n             * Used to locally create a chat room and set it as the active video call. Collab-chat handles\n             * the creation of the room via realtime.\n             */\n            iframe.messaging.addListener(\n                COLLABORATE_CHAT_EVENTS.listeners.collabChatStartedConference,\n                ({ payload: { roomJid } }: { payload: { roomJid: string } }) => {\n                    this.get('chat')\n                        .getChatRoom(roomJid)\n                        .then((room: any) => {\n                            this.get('chat').trackRoomChange(room);\n                            room.set('showingVideo', true);\n                        });\n                }\n            );\n\n            /**\n             * event triggered when the PHONE instance of collaborate-chat is fully loaded\n             */\n            iframe.messaging.addListener(COLLABORATE_CHAT_EVENTS.listeners.collabChatPhoneFrameReady, () => {\n                const frameId = this.get('chatFrame').get('collaborateChatPhoneIFrame').firstChild.id;\n                this.logger.debug(`[chat:::web-dir] ${frameId} ready!!`, { frameId });\n                this.get('chatFrame').set('collabChatPhoneReady', true);\n            });\n\n            /**\n             * payload: string\n             * payload is the jid\n             */\n            iframe.messaging.addListener(\n                COLLABORATE_CHAT_EVENTS.listeners.clearNotificationSidebar,\n                ({ payload }: any) => {\n                    if (payload) {\n                        this.get('chat')\n                            .getChatRoom(payload)\n                            .then((room: any) => {\n                                if (room.get('unseen') > 0) {\n                                    room.set('unseen', 0);\n                                }\n                            });\n                    }\n                }\n            );\n\n            iframe.messaging.addListener(\n                COLLABORATE_CHAT_EVENTS.listeners.unauthorized,\n                ({ payload: { unauthorized } }: any) => {\n                    if (unauthorized) {\n                        this.get('chat').set('connected', false);\n                    }\n                }\n            );\n\n            iframe.messaging.addListener(COLLABORATE_CHAT_EVENTS.listeners.directMessageAtMention, async () => {\n                const notificationTitle = this.get('intl').t('chat.dmWarning.title');\n                const notificationMessage = this.get('intl').t('chat.dmWarning.message');\n                const preferences = this.get('preferences');\n\n                try {\n                    const notificationDisabled = await preferences.getPreference('chat.disableAtMentionNotification');\n                    if (!notificationDisabled) {\n                        this.get('notification').info(notificationTitle, notificationMessage, {\n                            target: this,\n                            actionHandlers: {\n                                neverShowNotification: {\n                                    label: this.get('intl').t('notification.app.neverShowAgain'),\n                                    action: (notification: any) => {\n                                        // save the preference in chat decomp\n                                        this.get('chatFrame').notifyCollaborateChatIFrame(\n                                            COLLABORATE_CHAT_EVENTS.publish.updateChatPreference,\n                                            {\n                                                value: true,\n                                                preferenceKey: 'disableAtMentionNotification'\n                                            }\n                                        );\n                                        notification.hide();\n                                    }\n                                },\n                                cancelAtMentionNotification: {\n                                    label: this.get('intl').t('common.cancel'),\n                                    action: (notification: any) => notification.hide()\n                                }\n                            }\n                        });\n                    }\n                } catch (err) {\n                    console.error('Error getting chat.disableAtMentionNotification preference:', {\n                        error: err\n                    });\n                }\n            });\n\n            iframe.messaging.addListener(\n                COLLABORATE_CHAT_EVENTS.listeners.collabChatMessageReceived,\n                async (messageRec: any) => {\n                    const { message } = messageRec.payload;\n                    this.get('chat').handleCollaborateChatMessage(message);\n                }\n            );\n\n            // event to show the chat badge icon on chat sidebar\n            iframe.messaging.addListener(\n                COLLABORATE_CHAT_EVENTS.listeners.collabChatUpdateSplatValue,\n                ({ payload: { display } }: { payload: { display: boolean } }) => {\n                    this.get('chat').set('collabChatShowChatSplat', display);\n                }\n            );\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"l0Hk+EI/\",\"block\":\"[[[1,[28,[35,0],null,[[\\\"class\\\",\\\"clientConfig\\\",\\\"route\\\",\\\"frame-id\\\"],[\\\"collaborate-chat\\\",[33,1],\\\"/\\\",[33,2]]]]]],[],false,[\\\"frame-router\\\",\\\"config\\\",\\\"frameId\\\"]]\",\"moduleName\":\"web-directory/components/chat-frame-router/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { Maybe } from 'web-directory/types';\nimport { warnClosureAction } from 'web-directory/utils/acd';\n\ntype BannerClass = 'trial' | 'info' | 'trustee';\ntype BadgeColor = 'neutral' | 'blue' | 'purple';\n\nexport default Component.extend({\n    classNames: ['command-banner'],\n\n    /**\n     * @attribute\n     * The banner theme to display\n     */\n    theme: 'info' as Maybe<BannerClass>,\n\n    /**\n     * @attribute\n     * GUX badge color\n     */\n    badgeColor: 'neutral' as BadgeColor,\n\n    /**\n     * @attribute\n     * GUX badge text key\n     */\n    badgeText: '',\n\n    /**\n     * @attribute\n     * Main banner text key\n     */\n    bannerText: '',\n\n    /**\n     * @attribute\n     * Primary button text\n     */\n    primaryButtonText: '',\n\n    /**\n     * @attribute\n     * Primary button icon\n     */\n    primaryButtonIcon: '',\n\n    /**\n     * @attribute\n     * Action closure for primary button\n     */\n    primaryButtonAction: () => warnClosureAction('primaryButtonAction', {}),\n\n    /**\n     * @attribute\n     * Secondary button text\n     */\n    secondaryButtonText: '',\n\n    /**\n     * @attribute\n     * Action closure for secondary button\n     */\n    secondaryButtonAction: () => warnClosureAction('secondaryButtonAction', {}),\n\n    actions: {\n        /**\n         * @action\n         * Action binding for primary button action\n         */\n        primaryButtonAction() {\n            this.primaryButtonAction();\n        },\n\n        /**\n         * @action\n         * Action binding for secondary button action\n         */\n        secondaryButtonAction() {\n            this.secondaryButtonAction();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"5Xu7xaNg\",\"block\":\"[[[10,0],[15,0,[29,[\\\"banner-container \\\",[36,0]]]],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"banner-content\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"banner-text-content\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"banner-content-display\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[15,0,[29,[\\\"banner-text \\\",[36,0]]]],[12],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"banner-text-icon\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/circle-info-solid\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,0],[12],[1,\\\"\\\\n                        \\\"],[10,2],[15,\\\"title\\\",[29,[[36,1]]]],[12],[1,[34,2]],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,4],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"custom-badge\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-badge\\\"],[14,\\\"accent\\\",\\\"inherit\\\"],[15,0,[36,5]],[12],[1,[34,4]],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,6],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"banner-buttons-container\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"primary-button-container\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-button-slot\\\"],[14,\\\"accent\\\",\\\"primary\\\"],[12],[1,\\\"\\\\n                        \\\"],[11,\\\"button\\\"],[24,0,\\\"primary-button\\\"],[16,\\\"gux-title\\\",[29,[[36,6]]]],[24,4,\\\"button\\\"],[4,[38,7],[[30,0],\\\"primaryButtonAction\\\"],null],[12],[1,\\\"\\\\n\\\"],[41,[33,8],[[[1,\\\"                                \\\"],[10,1],[14,0,\\\"primary-button-icon\\\"],[12],[1,\\\"\\\\n                                    \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"button-icon\\\"],[15,\\\"icon-name\\\",[29,[[36,8]]]],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                            \\\"],[1,[34,6]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,9],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"secondary-button-container\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-button-slot\\\"],[14,\\\"accent\\\",\\\"secondary\\\"],[12],[1,\\\"\\\\n                            \\\"],[11,\\\"button\\\"],[24,0,\\\"secondary-button\\\"],[16,\\\"gux-title\\\",[29,[[36,9]]]],[24,4,\\\"button\\\"],[4,[38,7],[[30,0],\\\"secondaryButtonAction\\\"],null],[12],[1,\\\"\\\\n                                \\\"],[10,1],[14,0,\\\"secondary-button-icon\\\"],[12],[1,\\\"\\\\n                                    \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"button-icon\\\"],[14,\\\"icon-name\\\",\\\"toolbar-help\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n                                \\\"],[1,[34,9]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"theme\\\",\\\"freeTrialStatus\\\",\\\"bannerText\\\",\\\"if\\\",\\\"badgeText\\\",\\\"badgeColor\\\",\\\"primaryButtonText\\\",\\\"action\\\",\\\"primaryButtonIcon\\\",\\\"secondaryButtonText\\\"]]\",\"moduleName\":\"web-directory/components/command-banner/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { scheduleOnce } from '@ember/runloop';\nimport { CommandButton } from 'web-directory/models/command-button-factory';\n\n/**\n * @component command-button-bookmark\n * Renders the bookmarks toolbar button on the command bar and owns the\n * open/closed state of the bookmarks popover.\n */\nexport default Component.extend({\n    classNames: ['bookmark-button-wrapper'],\n\n    /**\n     * @attribute\n     * The command-button model for this slot.  Contains display state (icon,\n     * aria label, color profile, accent) sourced from command-button-factory.\n     * Passed in by the parent command-bar component.\n     */\n    commandButton: null as CommandButton | null,\n\n    /**\n     * @attribute\n     * When true the component renders as an icon button on the command bar.\n     * When false it renders as a list item inside the overflow menu.\n     * Passed in by the parent command-bar template.\n     */\n    isButton: true,\n\n    /**\n     * @attribute\n     * Feature-toggle flag for the new persistent-call UI.\n     * Passed in by the parent when the toggle is active.\n     */\n    useNewPersistentCallFt: false,\n\n    /**\n     * Controls visibility of the bookmarks popover.\n     * Toggled by the toolbar button and closed by outside-click / Escape.\n     */\n    showBookmarks: false,\n\n    /**\n     * Bound reference to the window resize handler so it can be removed\n     * when the popover closes or the component is destroyed.\n     */\n    _boundResizeHandler: null as (() => void) | null,\n\n    /**\n     * Bound reference to the focusout handler so it can be removed on destroy.\n     */\n    _boundFocusOutHandler: null as EventListener | null,\n\n    /* @lifecycle */\n    init() {\n        this._super(...arguments);\n        this._handleOutsideClick = this._handleOutsideClick.bind(this);\n        this._handleFocusOut = this._handleFocusOut.bind(this);\n    },\n\n    /* @lifecycle\n     * Attaches a capture-phase click listener to detect clicks outside the\n     * popover so it can be dismissed without requiring a dedicated backdrop.\n     * Also attaches a focusout listener to close the popover when focus\n     * moves outside the component (e.g. via Tab key). */\n    didInsertElement() {\n        this._super(...arguments);\n        document.addEventListener('click', this._handleOutsideClick, true);\n        const handler: EventListener = this._handleFocusOut as EventListener;\n        this._boundFocusOutHandler = handler;\n        (this.element as HTMLElement).addEventListener('focusout', handler);\n    },\n\n    /* @lifecycle\n     * Removes the document click listener, focusout listener, and any pending\n     * resize listener to prevent memory leaks after the component is torn down. */\n    willDestroyElement() {\n        this._super(...arguments);\n        document.removeEventListener('click', this._handleOutsideClick, true);\n        if (this._boundFocusOutHandler) {\n            (this.element as HTMLElement).removeEventListener('focusout', this._boundFocusOutHandler);\n            this._boundFocusOutHandler = null;\n        }\n        this._detachResizeListener();\n    },\n\n    /**\n     * @function\n     * Closes the popover when a click is detected outside this component's\n     * root element.  Guards against running when the popover is already closed.\n     */\n    _handleOutsideClick(event: MouseEvent) {\n        if (!this.get('showBookmarks')) return;\n        if (this.element && !this.element.contains(event.target as Node)) {\n            this.closeUserSettings();\n        }\n    },\n\n    /**\n     * @function\n     * Closes the popover when focus moves outside this component via keyboard navigation (Tab / Shift+Tab).\n     */\n    _handleFocusOut(event: FocusEvent) {\n        if (!this.get('showBookmarks')) return;\n        const relatedTarget = event.relatedTarget as Node | null;\n\n        // Only close if focus demonstrably moved to a node outside the wrapper.\n        if (!relatedTarget) return;\n        if (this.element && this.element.contains(relatedTarget)) return;\n\n        this.closeUserSettings();\n    },\n\n    /**\n     * @function\n     * Reads the current top position of the popover element and stores it as a\n     * CSS custom property so the LESS stylesheet can position it correctly\n     * relative to the viewport, accounting for the command bar height.\n     */\n    _updatePopoverTop() {\n        const popover = this.element?.querySelector('.bookmarks-popover') as HTMLElement;\n        if (popover) {\n            const top = popover.getBoundingClientRect().top;\n            popover.style.setProperty('--popover-top', `${top}px`);\n        }\n    },\n\n    /**\n     * @function\n     * Adds a window resize listener that keeps the popover position CSS\n     * variable in sync while the popover is open.\n     */\n    _attachResizeListener() {\n        this._boundResizeHandler = () => this._updatePopoverTop();\n        window.addEventListener('resize', this._boundResizeHandler);\n    },\n\n    /**\n     * @function\n     * Removes the window resize listener.  Safe to call even if no listener\n     * is currently attached.\n     */\n    _detachResizeListener() {\n        if (this._boundResizeHandler) {\n            window.removeEventListener('resize', this._boundResizeHandler);\n            this._boundResizeHandler = null;\n        }\n    },\n\n    /**\n     * @function\n     * Closes the bookmarks popover, removes the resize listener, and returns\n     * keyboard focus to the toolbar trigger button.\n     */\n    closeUserSettings() {\n        this.set('showBookmarks', false);\n        this._detachResizeListener();\n        const trigger = this.element?.querySelector('#bookmarks-command-button') as HTMLElement;\n        if (trigger) {\n            trigger.focus();\n        }\n    },\n\n    actions: {\n        /**\n         * @action\n         * Toggles the bookmarks popover open or closed.  When opening,\n         * schedules a popover-position update and attaches the resize listener\n         * after the DOM has rendered.  When closing, removes the resize listener.\n         */\n        toggleBookmarksPopover() {\n            this.toggleProperty('showBookmarks');\n            if (this.get('showBookmarks')) {\n                scheduleOnce('afterRender', this, () => {\n                    this._updatePopoverTop();\n                    this._attachResizeListener();\n                });\n            } else {\n                this._detachResizeListener();\n            }\n        },\n\n        /**\n         * @action\n         * Closure action passed into the child {{command-bookmarks}} component\n         * so it can request the popover to close (e.g. after navigation).\n         */\n        closeBookmarks() {\n            this.closeUserSettings();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"TPAb2V8+\",\"block\":\"[[[10,\\\"gux-button-slot\\\"],[15,0,[29,[\\\"global-action-bookmark-button \\\",[33,0,[\\\"id\\\"]]]]],[15,\\\"accent\\\",[33,0,[\\\"accent\\\"]]],[12],[1,\\\"\\\\n    \\\"],[11,\\\"button\\\"],[24,1,\\\"bookmarks-command-button\\\"],[16,\\\"aria-label\\\",[28,[37,1],[[33,0,[\\\"currentState\\\",\\\"ariaLabel\\\"]]],null]],[16,\\\"aria-expanded\\\",[52,[33,3],\\\"true\\\",\\\"false\\\"]],[16,0,[29,[[33,0,[\\\"currentState\\\",\\\"colorProfile\\\"]],\\\" \\\",[52,[33,3],\\\"selected\\\"]]]],[24,4,\\\"button\\\"],[4,[38,4],[[30,0],\\\"toggleBookmarksPopover\\\"],null],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"global-action-icon\\\"],[15,\\\"icon-name\\\",[33,0,[\\\"currentState\\\",\\\"iconName\\\"]]],[14,\\\"decorative\\\",\\\"true\\\"],[15,\\\"screenreader-text\\\",[28,[37,1],[[33,0,[\\\"currentState\\\",\\\"ariaLabel\\\"]]],null]],[12],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"bookmarks-command-button\\\"],[14,\\\"placement\\\",\\\"bottom\\\"],[12],[1,\\\"\\\\n        \\\"],[10,1],[12],[1,[28,[35,1],[\\\"components.navMenu.bookmarks.title\\\"],null]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,3],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"bookmarks-popover\\\"],[14,\\\"role\\\",\\\"dialog\\\"],[15,\\\"aria-label\\\",[28,[37,1],[\\\"components.navMenu.bookmarks.dialogLabel\\\"],null]],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,5],null,[[\\\"closePopover\\\"],[[28,[37,4],[[30,0],\\\"closeBookmarks\\\"],null]]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[],false,[\\\"commandButton\\\",\\\"t\\\",\\\"if\\\",\\\"showBookmarks\\\",\\\"action\\\",\\\"command-bookmarks\\\"]]\",\"moduleName\":\"web-directory/components/command-bar/command-button/command-button-bookmark/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { warnClosureAction } from 'web-directory/utils/acd';\nimport { PanelId } from 'web-directory/components/command-panel/panel-definition';\nimport { CommandButton } from 'web-directory/models/command-button-factory';\n\nexport default Component.extend({\n    session: service(),\n\n    /**\n     * @attribute\n     * the information structure for a button\n     * contains all the information needed for displaying\n     * passed from command-bar\n     * */\n    commandButton: null as CommandButton | null,\n\n    /**\n     * @attribute\n     * a string flag that tells us what panel is currently open if any\n     * commandNav.currentPanel from command-bar\n     * */\n    currentPanel: '',\n\n    /**\n     * @attribute\n     * Flag to tell if this is a button on the command bar (true)\n     * or a list item in the menu (false)\n     * both share the same logic this is just to toggle the display\n     * passed from command-bar template\n     * */\n    isButton: true as boolean,\n\n    /**\n     * @attribute\n     * Feature toggle for the new persistent call UI\n     * passed from command-bar\n     * */\n    useNewPersistentCallFt: false,\n\n    /**\n     * @attribute\n     * Feature toggle to enable/disable bookmarking functionality\n     * passed from command-bar\n     * */\n    bookmarkingEnabledFt: false,\n\n    /**\n     * @attribute\n     * Flag to control visibility of the bookmarks popover\n     * */\n    showBookmarks: false,\n\n    /**\n     * @computed\n     * Returns true if the currentPanel matches this button's panel name\n     * */\n    isCurrentPanel: computed('currentPanel', 'commandButton.panel', function () {\n        const currentPanel = this.get('currentPanel');\n        const buttonPanel = this.get('commandButton')?.panel;\n        return currentPanel === buttonPanel;\n    }),\n\n    // editingBookmarks: false,\n\n    /**\n     * @action\n     * sends action to open/close panel\n     * action in command-bar\n     * */\n    actionTogglePanel: (panelName: PanelId) => {\n        warnClosureAction('actionTogglePanel', panelName);\n    },\n\n    actions: {\n        actionTogglePanel() {\n            const panelName = this.get('commandButton')?.panel as PanelId;\n            this.actionTogglePanel(panelName);\n        },\n        toggleBookmarksPopover() {\n            this.toggleProperty('showBookmarks');\n            // this.set('editingBookmarks', false);\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"caNpEJP4\",\"block\":\"[[[41,[33,1],[[[41,[28,[37,2],[[28,[37,3],[[33,4,[\\\"id\\\"]],\\\"command-bar-calls\\\"],null],[33,5],[33,4,[\\\"persistentSpinner\\\"]]],null],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"persistent-connection-calls-container global-action-icon-button\\\"],[12],[1,\\\"\\\\n            \\\"],[11,\\\"button\\\"],[16,1,[29,[[36,6],\\\"-command-button\\\"]]],[16,\\\"data-test-id\\\",[29,[[33,4,[\\\"id\\\"]]]]],[16,\\\"aria-label\\\",[28,[37,7],[[33,4,[\\\"currentState\\\",\\\"ariaLabel\\\"]]],null]],[16,\\\"aria-expanded\\\",[52,[33,8],\\\"true\\\",\\\"false\\\"]],[16,0,[29,[[33,4,[\\\"currentState\\\",\\\"colorProfile\\\"]],\\\"\\\\n                    \\\",[52,[28,[37,3],[[33,9],[33,4,[\\\"panel\\\"]]],null],\\\"selected\\\"],\\\"\\\\n                    persistent-connection-calls-button\\\"]]],[24,4,\\\"button\\\"],[4,[38,10],[[30,0],\\\"actionTogglePanel\\\"],null],[12],[1,\\\"\\\\n                \\\"],[10,1],[14,0,\\\"persistent-connection-button-content\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,1],[14,0,\\\"global-action-icon-signal\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"global-action-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/signal-stream-regular\\\"],[15,\\\"screenreader-text\\\",[28,[37,7],[[33,4,[\\\"currentState\\\",\\\"ariaLabel\\\"]]],null]],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,1],[14,0,\\\"global-action-icon-calls\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"global-action-icon\\\"],[15,\\\"icon-name\\\",[33,4,[\\\"currentState\\\",\\\"iconName\\\"]]],[15,\\\"screenreader-text\\\",[28,[37,7],[[33,4,[\\\"currentState\\\",\\\"ariaLabel\\\"]]],null]],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"],[41,[51,[33,12,[\\\"showAccountSwitcher\\\"]]],[[[1,\\\"                        \\\"],[10,1],[14,0,\\\"command-button-text\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,7],[[33,4,[\\\"label\\\"]]],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,4,[\\\"badge\\\"]],[[[1,\\\"                    \\\"],[10,1],[14,0,\\\"alert-badge-unread-badge-holder\\\"],[15,\\\"aria-label\\\",[36,13]],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"alert-badge-unread-badge\\\"],[14,\\\"icon-name\\\",\\\"toolbar-notification\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,14],[[28,[37,3],[[33,4,[\\\"id\\\"]],\\\"command-bar-bookmark\\\"],null]],null],[[[1,\\\"            \\\"],[10,\\\"gux-button-slot\\\"],[15,0,[29,[\\\"global-action-icon-button \\\",[52,[33,4,[\\\"iconOnly\\\"]],\\\"icon-only-button\\\"],\\\" \\\",[33,4,[\\\"id\\\"]]]]],[15,\\\"accent\\\",[33,4,[\\\"accent\\\"]]],[12],[1,\\\"\\\\n                \\\"],[11,\\\"button\\\"],[16,1,[29,[[36,6],\\\"-command-button\\\"]]],[16,\\\"data-test-id\\\",[29,[[33,4,[\\\"id\\\"]]]]],[16,\\\"aria-label\\\",[28,[37,7],[[33,4,[\\\"currentState\\\",\\\"ariaLabel\\\"]]],null]],[16,\\\"aria-expanded\\\",[52,[33,8],\\\"true\\\",\\\"false\\\"]],[16,0,[29,[[33,4,[\\\"currentState\\\",\\\"colorProfile\\\"]],\\\"\\\\n                        \\\",[52,[28,[37,3],[[33,9],[33,4,[\\\"panel\\\"]]],null],\\\"selected\\\"]]]],[24,4,\\\"button\\\"],[4,[38,10],[[30,0],\\\"actionTogglePanel\\\"],null],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"global-action-icon\\\"],[15,\\\"icon-name\\\",[33,4,[\\\"currentState\\\",\\\"iconName\\\"]]],[15,\\\"screenreader-text\\\",[28,[37,7],[[33,4,[\\\"currentState\\\",\\\"ariaLabel\\\"]]],null]],[12],[13],[1,\\\"\\\\n                    \\\"],[10,1],[14,0,\\\"command-button-text\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,7],[[33,4,[\\\"label\\\"]]],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,4,[\\\"persistentSpinner\\\"]],[[[1,\\\"                        \\\"],[10,\\\"svg\\\"],[14,\\\"data-test-id\\\",\\\"persistent-connection-on\\\"],[14,0,\\\"gux-svg-container\\\"],[14,\\\"viewBox\\\",\\\"0 0 24 24\\\"],[14,\\\"role\\\",\\\"presentation\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,\\\"circle\\\"],[14,\\\"cx\\\",\\\"50%\\\"],[14,\\\"cy\\\",\\\"50%\\\"],[14,\\\"r\\\",\\\"10.5\\\"],[14,0,\\\"gux-static-circle\\\"],[12],[13],[1,\\\"\\\\n                            \\\"],[10,\\\"circle\\\"],[14,\\\"cx\\\",\\\"50%\\\"],[14,\\\"cy\\\",\\\"50%\\\"],[14,\\\"r\\\",\\\"10.5\\\"],[14,0,\\\"gux-dynamic-circle\\\"],[14,\\\"stroke-linecap\\\",\\\"round\\\"],[12],[13],[1,\\\"\\\\n                            \\\"],[10,\\\"circle\\\"],[14,\\\"cx\\\",\\\"50%\\\"],[14,\\\"cy\\\",\\\"50%\\\"],[14,\\\"r\\\",\\\"10.5\\\"],[14,0,\\\"gux-dynamic-circle-mask\\\"],[14,\\\"stroke-linecap\\\",\\\"round\\\"],[12],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,4,[\\\"badge\\\"]],[[[41,[33,4,[\\\"canHaveNumberBadge\\\"]],[[[41,[33,4,[\\\"badgeNumber\\\"]],[[[1,\\\"                                \\\"],[10,1],[14,0,\\\"alert-badge-unread-holder\\\"],[12],[1,\\\"\\\\n                                    \\\"],[10,1],[14,0,\\\"alert-badge-unread\\\"],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,15],[[33,4,[\\\"badgeNumber\\\"]],9],null],[[[1,\\\"                                            \\\"],[1,[28,[35,7],[\\\"navBar.badgeOverflow\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                            \\\"],[1,[33,4,[\\\"badgeNumber\\\"]]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                                    \\\"],[13],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                \\\"],[10,1],[14,0,\\\"sr-only\\\"],[12],[1,\\\"\\\\n                                    \\\"],[1,[28,[35,7],[[33,4,[\\\"noUnreadText\\\"]]],null]],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[]],[[[1,\\\"                            \\\"],[10,1],[14,0,\\\"alert-badge-unread-badge-holder\\\"],[15,\\\"aria-label\\\",[36,13]],[12],[1,\\\"\\\\n                                \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"alert-badge-unread-badge\\\"],[14,\\\"icon-name\\\",\\\"toolbar-notification\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,16],[[[1,\\\"                \\\"],[1,[28,[35,17],null,[[\\\"commandButton\\\",\\\"isButton\\\"],[[33,4],true]]]],[1,\\\"\\\\n\\\"]],[]],null]],[]]]],[]]],[41,[33,4,[\\\"currentState\\\",\\\"showIconTooltip\\\"]],[[[1,\\\"        \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"placement\\\",\\\"bottom\\\"],[15,\\\"for\\\",[29,[[36,6],\\\"-command-button\\\"]]],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,7],[[33,4,[\\\"currentState\\\",\\\"tooltip\\\"]]],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[10,1],[14,0,\\\"global-tooltips\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"placement\\\",\\\"bottom\\\"],[15,\\\"for\\\",[29,[[36,6],\\\"-command-button\\\"]]],[12],[1,\\\"\\\\n                \\\"],[10,1],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,7],[[33,4,[\\\"currentState\\\",\\\"tooltip\\\"]]],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[]],[[[1,\\\"    \\\"],[10,\\\"gux-list-item\\\"],[15,\\\"aria-label\\\",[28,[37,7],[[33,4,[\\\"currentState\\\",\\\"ariaLabel\\\"]]],null]],[15,\\\"onclick\\\",[28,[37,10],[[30,0],\\\"actionTogglePanel\\\"],null]],[15,\\\"aria-expanded\\\",[52,[33,8],\\\"true\\\",\\\"false\\\"]],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"more-options more-options-line-item\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"more-dropdown-icon\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[15,\\\"icon-name\\\",[33,4,[\\\"currentState\\\",\\\"iconName\\\"]]],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,1],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,7],[[33,4,[\\\"label\\\"]]],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[],false,[\\\"if\\\",\\\"isButton\\\",\\\"and\\\",\\\"eq\\\",\\\"commandButton\\\",\\\"useNewPersistentCallFt\\\",\\\"elementId\\\",\\\"t\\\",\\\"isCurrentPanel\\\",\\\"currentPanel\\\",\\\"action\\\",\\\"unless\\\",\\\"session\\\",\\\"badgeAriaLabel\\\",\\\"not\\\",\\\"gt\\\",\\\"bookmarkingEnabledFt\\\",\\\"command-bar/command-button/command-button-bookmark\\\"]]\",\"moduleName\":\"web-directory/components/command-bar/command-button/template.hbs\",\"isStrictMode\":false});","import { getOwner } from '@ember/application';\nimport Component from '@ember/component';\nimport { computed, observer } from '@ember/object';\nimport { alias, not } from '@ember/object/computed';\nimport type RouterService from '@ember/routing/router-service';\nimport { inject } from '@ember/service';\nimport { getEvaluator } from 'boon-js';\nimport { APPS_RELOADED_EVENT } from 'web-directory/models/app-pool';\nimport CommandButtonFactory from 'web-directory/models/command-button-factory';\nimport { Maybe } from 'web-directory/types';\nimport { evaluateProviderExpression } from 'web-directory/utils/navigation-provider-expression-evaluator';\nimport {\n    setupGuxPopoverListA11y,\n    focusFirstGuxPopoverItem,\n    teardownGuxPopoverListA11y\n} from 'web-directory/utils/gux-popover-list-a11y';\nimport { MenuDefinition, NavMenu } from '../command-nav/navMenu';\nimport { PanelId } from '../command-panel/panel-definition';\n\nconst onQueue = 'on_queue';\n\nexport default Component.extend({\n    classNames: ['command-bar'],\n    events: inject('events'),\n    interaction: inject('interaction'),\n    session: inject('session'),\n    frameService: inject('center-stage-frame'),\n    intl: inject('intl'),\n    presence: inject('presence'),\n    apps: inject('apps'),\n    commandNav: inject('command-nav'),\n    permissions: inject('permissions'),\n    queueToggle: inject('queueToggle'),\n    adminui: inject('adminui'),\n    streaming: inject('streaming'),\n    phone: inject('phone'),\n    acdworkitem: inject('acdworkitem'),\n\n    /**\n     * Reference to Ember's RouterService.\n     * Used for transitioning routes.\n     */\n    router: null as Maybe<RouterService>,\n\n    hashProperty: null as Maybe<string>,\n\n    hashChangeListener: null as Maybe<(event: HashChangeEvent) => void>,\n\n    /**\n     * @attribute\n     * Flag indicating navigation sidebar is open/closed. Initially set by\n     * parent component.\n     */\n    navIsOpen: false,\n\n    _monitoredAppPool: null as any,\n\n    /**\n     * @attribute\n     * Flag indicating global search open/closed.\n     */\n    globalSearchOpen: false,\n\n    /**\n     * @attribute\n     * Flag indicating more options popover open/closed.\n     */\n    moreOptionsOpen: false,\n\n    _moreOptionsPopoverCleanup: null as { destroy: () => void } | null,\n\n    person: computed.reads('session.person'),\n\n    continueOnQueue: false,\n\n    checkQueue: alias('queueToggle.checkQueue'),\n\n    presenceHistory: alias('queueToggle.presenceHistory'),\n\n    commandButtons: null as any,\n\n    copilotButton: null as typeof CommandButtonFactory | null,\n\n    /**\n     * @attribute\n     * Flag indicating if queue should be force disabled\n     */\n    forceQueueDisabled: false,\n\n    /**\n     * @attribute\n     * Flag indicating streaming has disconnected\n     */\n    streamingDisconnected: not('streaming.connected'),\n\n    /**\n     * @observer\n     * legacy logic moved over from services/sidebar\n     * observes and handles case that the pool object was changed completely\n     */\n    _onAppsEnvChange: observer('apps.widgetAppPool', 'session.isAuthenticated', function (this: any) {\n        let monitoredAppPool = this.get('_monitoredAppPool');\n        let widgetAppPool = this.get('apps.widgetAppPool');\n\n        if (!this.get('session.isAuthenticated') || !widgetAppPool) {\n            if (monitoredAppPool) {\n                monitoredAppPool.off(APPS_RELOADED_EVENT, this, '_fetchWidgetApps');\n                this.set('_monitoredAppPool', null);\n            }\n        } else if (widgetAppPool !== monitoredAppPool) {\n            if (monitoredAppPool) {\n                monitoredAppPool.off(APPS_RELOADED_EVENT, this, '_fetchWidgetApps');\n            }\n\n            widgetAppPool.on(APPS_RELOADED_EVENT, this, '_fetchWidgetApps');\n            this.set('_monitoredAppPool', widgetAppPool);\n            this._fetchWidgetApps();\n        }\n    }),\n\n    /**\n     * @observer\n     * Check initially if the users presence is set from outside directory client.\n     */\n    presenceListener: observer('presence', 'streamingDisconnected', function (this: any) {\n        // If a person is provided, do not modify checkQueue as that is specific to the current logged-in user.\n        // The person could be any user.\n        if (this.get('streamingDisconnected') || this.get('person')) {\n            return;\n        }\n        const presence = this.get('presence');\n        this.set('checkQueue', presence === onQueue);\n        if (presence !== onQueue) {\n            this.get('presenceHistory').clear();\n        }\n    }),\n\n    /**\n     * @computed\n     * The user's permission gated menu structure\n     */\n    menuStructure: computed(\n        'session.{feature,person}',\n        'permissions.{rolePermissions,donutPermissions,allowedOrgPermissions}',\n        function () {\n            return this.checkMenuPermissions(NavMenu);\n        }\n    ),\n\n    /**\n     * @attribute\n     * Flag indicating queue toggle should be disabled\n     */\n    disableQueue: computed.or('streamingDisconnected', 'forceQueueDisabled'),\n\n    /**\n     * @computed\n     * Current page's breadcrumb value\n     */\n    currentBreadcrumbValue: computed('adminui.currentPageCrumbs', function () {\n        const crumbs = this.get('adminui.currentPageCrumbs');\n        if (crumbs && crumbs.length) {\n            return crumbs[0].label;\n        } else return null;\n    }),\n\n    /**\n     * @computed\n     * Flag for if user is currently on queue via presence status\n     */\n    isOnQueue: computed('queueToggle.checkQueue', 'person.presence', function () {\n        if (this.get('person.presence')) {\n            return this.get('person.presence') === onQueue;\n        }\n        return this.get('queueToggle').get('checkQueue');\n    }),\n\n    /**\n     * @computed\n     * Count for if agent should have a unread notification badge\n     * returning the number to be displayed\n     */\n    showAgentUIUnreadNumberLegacy: computed('interaction.acdCount', 'acdworkitem.activeWorkitems', function (): number {\n        const acdCount = this.get('interaction.acdCount') || 0;\n        const workitemCount = this.get('acdworkitem.activeWorkitems.length') || 0;\n        return acdCount + workitemCount;\n    }),\n\n    /**\n     * @todo PURE-7222: figure out a better way to determine the badge count\n     */\n    showAgentUIUnreadNumber: computed('session.useModes', 'showAgentUIUnreadNumberLegacy', function (): number {\n        if (this.get('session.useModes')) {\n            console.warn('PURE-7222 [command-bar]: showAgentUIUnreadNumber is currently not supported.');\n            return 0;\n        }\n        return this.get('showAgentUIUnreadNumberLegacy');\n    }),\n\n    /**\n     * @computed\n     * Flag for if the user has access to Agent Workspace/UI\n     */\n    isInteractionsEnabled: computed(\n        'showAgentUIUnreadNumber',\n        'permissions.canGoOnQueue',\n        'session.hasTrusteeAccess',\n        function (): boolean {\n            const hasInteractions = !!this.get('showAgentUIUnreadNumber');\n            const canGoOnQueue = this.get('permissions.canGoOnQueue');\n            const hasTrusteeAccess = this.get('session.hasTrusteeAccess');\n            return hasInteractions || (canGoOnQueue && !hasTrusteeAccess);\n        }\n    ),\n\n    /**\n     * @computed\n     * Flag for if the user has access to chat\n     */\n    isChatEnabled: computed.and('session.org.hasChatEnabled', 'session.person.jid', 'permissions.canViewBusinessChat'),\n\n    /**\n     * @computed\n     * Flag for if the user has access to calls\n     */\n    isCallsEnabled: computed.readOnly('phone.enabled'),\n\n    /**\n     * @lifecycle\n     */\n    init() {\n        this._super(...arguments);\n\n        const hashChangeHandler = () => this.updateHashProperty(window.location.hash);\n        this.set('hashChangeListener', hashChangeHandler);\n        window.addEventListener('hashchange', hashChangeHandler);\n\n        // Set EmberRouter reference for later\n        this.set('router', getOwner(this).lookup('router:main'));\n\n        // Queue Toggle Set Up\n        const owner = getOwner(this);\n        const queueToggle = owner.lookup('service:queue-toggle');\n        if (!queueToggle) {\n            this.set('forceQueueDisabled', true);\n        } else {\n            this.set('forceQueueDisabled', false);\n            this.set('queueToggle', queueToggle);\n        }\n        this.presenceListener(this);\n\n        // load widget apps pool\n        this._fetchWidgetApps();\n\n        /* Set up for command buttons\n         * All processing for command buttons is done in /models/command-button\n         *\n         * NOTE: In Ember 3.28, ownerInjection() must be merged into the first argument of create().\n         * Passing it as a second argument (as was valid in Ember 3.4) is silently ignored,\n         * causing getOwner() to return undefined inside CommandButtonFactory.init().\n         */\n        const ownerInjection = getOwner(this).ownerInjection();\n        this.set('commandButtons', [\n            CommandButtonFactory.create(Object.assign({ _buttonType: 'help' }, ownerInjection)),\n            CommandButtonFactory.create(Object.assign({ _buttonType: 'calls' }, ownerInjection)),\n            CommandButtonFactory.create(Object.assign({ _buttonType: 'chats' }, ownerInjection)),\n            CommandButtonFactory.create(Object.assign({ _buttonType: 'apps' }, ownerInjection)),\n            // Both the inbox and notifications buttons are registered; their canSee props react to\n            // the PURE-6632_inbox-ui toggle so visibility updates without re-registering the buttons.\n            CommandButtonFactory.create(Object.assign({ _buttonType: 'inbox' }, ownerInjection)),\n            CommandButtonFactory.create(Object.assign({ _buttonType: 'notifications' }, ownerInjection)),\n            CommandButtonFactory.create(Object.assign({ _buttonType: 'bookmarks' }, ownerInjection)),\n            CommandButtonFactory.create(Object.assign({ _buttonType: 'agent' }, ownerInjection)),\n            CommandButtonFactory.create(Object.assign({ _buttonType: 'account-switcher' }, ownerInjection))\n        ]);\n\n        this.set(\n            'copilotButton',\n            CommandButtonFactory.create(Object.assign({ _buttonType: 'copilot' }, ownerInjection))\n        );\n    },\n\n    /**\n     * @lifecycle\n     */\n    didInsertElement() {\n        this._super(...arguments);\n        this.addQueueToggleSetup();\n\n        const popoverList = this.element.querySelector('gux-popover-list') as HTMLElement;\n        if (popoverList) {\n            this._moreOptionsPopoverCleanup = setupGuxPopoverListA11y(popoverList, {\n                onDismiss: () => this.set('moreOptionsOpen', false)\n            });\n        }\n    },\n\n    /**\n     * @lifecycle\n     * Remove hash change listener if component is destroyed\n     */\n    willDestroy() {\n        this._super(...arguments);\n\n        teardownGuxPopoverListA11y(this.get('_moreOptionsPopoverCleanup'));\n\n        const handler = this.get('hashChangeListener');\n        if (handler) {\n            window.removeEventListener('hashchange', handler);\n            this.set('hashChangeListener', null);\n        }\n        this.updateHashProperty(null);\n\n        this.get('commandButtons')?.forEach((button: typeof CommandButtonFactory) => {\n            // @ts-ignore\n            button.destroy();\n        });\n\n        const copilotButton = this.get('copilotButton');\n        if (copilotButton) {\n            copilotButton.destroy();\n        }\n    },\n\n    /**\n     * Evaluate a given MenuDefinition for output to UI.\n     * @param menu MenuDefinition to evaluate\n     * @returns A new MenuDefinition filtered for access\n     */\n    checkMenuPermissions(menu: MenuDefinition[]) {\n        let output: MenuDefinition[] = [];\n\n        menu.forEach(menuItem => {\n            const session = this.get('session');\n            const permissions = this.get('permissions');\n            const shouldHide = evaluateProviderExpression(menuItem.hide ?? 'bool:false', permissions, session);\n\n            const evaluator = getEvaluator(menuItem.hide ?? 'bool:false');\n            if (!evaluator(shouldHide)) {\n                if (menuItem.subMenu) {\n                    menuItem.subMenu = this.checkMenuPermissions(menuItem.subMenu);\n                }\n                if ((menuItem.subMenu && menuItem.subMenu.length > 0) || menuItem.link) {\n                    output.push(menuItem);\n                }\n            }\n        });\n\n        return output;\n    },\n\n    updateHashProperty(hashValue: string | null) {\n        this.set('hashProperty', hashValue);\n    },\n\n    removeHashProperty() {\n        this.set('hashProperty', null);\n    },\n\n    /**\n     * Queue toggle listener - not using onClick because we need to over ride GUX immediate behavior\n     * in favor of checking that we can and do successfully go on queue\n     * this handles click and 'space' behavior - enter behavior is not standard for toggles and should not be implemented\n     */\n    addQueueToggleSetup() {\n        const queueToggle = this.get('element').querySelector('#command-bar-queue-toggle');\n        const queueToggleMoreMenu = this.get('element').querySelector('#command-bar-queue-toggle-more');\n        if (queueToggle) {\n            queueToggle.addEventListener('check', (ev: any) => {\n                ev.preventDefault();\n                this.get('actions').queueToggleClick.call(this, ev);\n            });\n        }\n\n        if (queueToggleMoreMenu) {\n            queueToggleMoreMenu.addEventListener('check', (ev: any) => {\n                ev.preventDefault();\n                this.get('actions').queueToggleClick.call(this, ev);\n            });\n        }\n\n        const queueToggleLabel = this.get('element').querySelector('#command-bar-queue label');\n        if (queueToggleLabel) {\n            queueToggleLabel.addEventListener('click', ev => {\n                this.get('actions').queueToggleClick.call(this, ev);\n            });\n        }\n    },\n\n    /**\n     * legacy logic moved over from services/sidebar\n     */\n    _fetchWidgetApps() {\n        // findAllApps will only fail on initial load, otherwise, this method is called in response to a successful reload\n        this.get('apps.widgetAppPool').findAllApps();\n    },\n\n    /**\n     * Sets the user presence to requested presence string.\n     * @param presence\n     */\n    setPresence(presence: Presence) {\n        const user = this.get('session').get('user');\n        this.get('presence').setUsersPresence(user, presence);\n    },\n\n    actions: {\n        /**\n         * @action\n         * Emit event requesting sidepanel open/close state change.\n         * @param panel SidePanel instance to open/close.\n         */\n        togglePanel(panel: PanelId) {\n            if (\n                panel == this.get('commandNav').get('currentPanel') ||\n                panel == this.get('commandNav').get('lastOpened.panel')\n            ) {\n                this.get('commandNav').togglePanel();\n            } else {\n                this.get('commandNav').selectPanel(panel, panel === 'agent');\n            }\n        },\n\n        /**\n         * @action\n         * Navigate to the search page.\n         */\n        navigateToSearch() {\n            this.set('globalSearchOpen', true);\n            let notSearch = document.querySelector('.all-but-global-search') as HTMLElement;\n            notSearch.style.display = 'none';\n            setTimeout(() => {\n                // time out needed because GUX form field takes a moment to build in dom\n                let searchInput = document.getElementById('search-field') as HTMLElement;\n                if (searchInput) {\n                    searchInput.focus();\n                }\n            }, 10);\n        },\n\n        /**\n         * @action\n         * Navigate to the search button.\n         */\n        navigateToSearchButton() {\n            this.set('globalSearchOpen', false);\n            let notSearch = document.querySelector('.all-but-global-search') as HTMLElement;\n            notSearch.style.display = 'flex';\n        },\n\n        /**\n         * @action\n         * Trigger continue to on queue in queueToggle service.\n         */\n        continueOnQueue() {\n            if (this.get('streamingDisconnected')) {\n                return;\n            }\n            this.get('queueToggle').continueOnQueue();\n        },\n\n        /**\n         * @action\n         * Handle queue toggle click events\n         */\n        queueToggleClick(this) {\n            if (!this.get('disableQueue')) {\n                this.get('queueToggle').handleToggle(null, this.get('continueOnQueue'));\n            }\n        },\n\n        /**\n         * @action\n         * Trigger selectPhone to on queue in queueToggle service.\n         */\n        selectPhone() {\n            if (this.get('disableQueue')) {\n                return;\n            }\n            this.get('queueToggle').selectPhone();\n        },\n\n        /**\n         * @action\n         * Toggle the more options popover open/closed.\n         */\n        toggleMoreOptions() {\n            this.toggleProperty('moreOptionsOpen');\n\n            if (this.get('moreOptionsOpen')) {\n                const popover = this.element.querySelector('gux-popover-list') as HTMLElement;\n                if (popover) {\n                    focusFirstGuxPopoverItem(popover);\n                }\n            }\n        },\n\n        /**\n         * @action\n         * Close the more options popover.\n         */\n        closeMoreOptions() {\n            this.set('moreOptionsOpen', false);\n        }\n    }\n});\n","import Component from '@ember/component';\nimport { computed } from '@ember/object';\n\nexport default Component.extend({\n    /**\n     * @attribute\n     * flag if we should show queue-toggle\n     * passed from command-bar template\n     * */\n    canSee: false,\n\n    /**\n     * @attribute\n     * flag if the user is on queue\n     * processed in command-bar\n     * */\n    isOnQueue: false,\n\n    /**\n     * @attribute\n     * flag if the queue toggle is disabled\n     * processed in command-bar\n     * */\n    disableQueue: null,\n\n    /**\n     * @attribute\n     * Flag to tell if this is a button on the command bar (true)\n     * or a list item in the menu (false)\n     * both share the same logic this is just to toggle the display\n     * passed from command-bar template\n     * */\n    isButton: true as boolean,\n\n    /**\n     * @attribute\n     * aria-label for queue - here because its reused\n     * */\n    ariaLabel: 'navBar.onQueueToggle.queueAria',\n\n    /**\n     * @computed\n     * detached queue label - here because its reused\n     * */\n    queueLabel: computed('isOnQueue', function () {\n        if (this.get('isOnQueue')) {\n            return 'navBar.onQueueToggle.onQueue';\n        } else {\n            return 'navBar.onQueueToggle.offQueue';\n        }\n    }),\n\n    actions: {\n        toggleQueue() {\n            if (this.get('disableQueue')) return;\n            const toggle = this.element.querySelector('#command-bar-queue-toggle-more') as any;\n            if (toggle) {\n                // Call gux-toggle's internal toggle method via clicking its input wrapper\n                const inputDiv = toggle.shadowRoot?.querySelector('.gux-toggle-input') as HTMLElement;\n                if (inputDiv) {\n                    inputDiv.click();\n                }\n            }\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"YqtB2xQ3\",\"block\":\"[[[41,[33,1],[[[41,[33,2],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"global-queue\\\"],[14,1,\\\"command-bar-queue\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[14,0,\\\"queue-label\\\"],[12],[1,\\\"\\\\n                \\\"],[10,1],[12],[1,\\\"\\\\n\\\"],[1,\\\"                    \\\"],[1,[28,[35,3],[[33,4]],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"gux-toggle\\\"],[14,1,\\\"command-bar-queue-toggle\\\"],[15,\\\"checked\\\",[36,5]],[15,\\\"aria-label\\\",[28,[37,3],[[33,6]],null]],[15,\\\"disabled\\\",[36,7]],[12],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],[[[41,[33,2],[[[1,\\\"        \\\"],[10,\\\"gux-list-item\\\"],[15,\\\"onclick\\\",[28,[37,8],[[30,0],\\\"toggleQueue\\\"],null]],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"more-options more-options-line-item\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"queue-toggle-name\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,1],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,3],[[33,4]],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"queue-toggle\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-toggle\\\"],[14,1,\\\"command-bar-queue-toggle-more\\\"],[15,\\\"checked\\\",[36,5]],[15,\\\"aria-label\\\",[28,[37,3],[[33,6]],null]],[15,\\\"disabled\\\",[36,7]],[12],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]]],[],false,[\\\"if\\\",\\\"isButton\\\",\\\"canSee\\\",\\\"t\\\",\\\"queueLabel\\\",\\\"isOnQueue\\\",\\\"ariaLabel\\\",\\\"disableQueue\\\",\\\"action\\\"]]\",\"moduleName\":\"web-directory/components/command-bar/control-queue-toggle/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport Ember from 'ember';\nimport { inject } from '@ember/service';\nimport { doFocus } from 'web-directory/utils/focus-management';\nimport { computed } from '@ember/object';\n\n// Presence User Settings\nconst USER_SETTINGS_BUTTON_ID = 'user-settings-button';\nconst USER_SETTINGS_CONTAINER = '.command-user-settings';\n\nconst PRESENCE_MENU_ID = 'presence-button';\nconst CURRENT_PRESENCE_SELECTOR = '.presence-input.active';\n\n// Notification\nconst NOTIFICATIONS_ELEMENT = 'body > ul.messenger';\nconst NOTIFICATIONS_EMPTY_ELEMENT = 'body > ul.messenger-empty';\n\n// Main Stage\nconst MAIN_STAGE_ELEMENT = '#skip-link-main-content-target';\n\n// ACD and Non ACD\nconst ACD_CARD_CONTAINER_ELEMENT = '.acd-interaction-card-v2.is-selected .acd-interaction-card-v2-container';\nconst ACD_ALERTING_ELEMENT = '.acd-interaction-card-v2.is-alerting #skip-link-alerting-target';\nconst NON_ACD_ALERTING_ELEMENT = '.incoming-controls .answer-call';\nconst ACD_SELECTED_CARD_ELEMENT = '.acd-interaction-card-v2.is-selected';\nconst ACD_NEW_OUTBOUND_BUTTON_ELEMENT = 'button.new-outbound:first';\n\nexport default Component.extend({\n    classNames: ['skip-links'],\n\n    commandNav: inject('command-nav'),\n    phone: inject('phone'),\n\n    /**\n     * @attribute\n     * Check if we have interaction permissions\n     * (passed down from command-bar)\n     */\n    isInteractionsEnabled: false,\n\n    /**\n     * @attribute\n     * Check if we have chat permissions\n     * (passed down from command-bar)\n     */\n    isChatEnabled: false,\n\n    /**\n     * @attribute\n     * Check if we have call permissions\n     * (passed down from command-bar)\n     */\n    isCallsEnabled: false,\n\n    /**\n     * @computed\n     * Check for alerting card to determine if user currently has an alerting interaction\n     */\n    hasAlertingAcdInteraction: computed(function () {\n        return !!document.querySelector(ACD_ALERTING_ELEMENT);\n    }),\n\n    /**\n     * @computed\n     * Check for incoming non-acd to determine if user currently has an alerting interaction\n     */\n    hasAlertingNonAcdInteraction: computed('phone.incomingNonAcdConversations', function (): any {\n        return !!this.get('phone').get('incomingNonAcdConversations').length;\n    }),\n\n    hasNotifications: computed(function () {\n        return !document.querySelector(NOTIFICATIONS_EMPTY_ELEMENT);\n    }),\n\n    /**\n     * @function\n     * Focus on a target element using the focus management utility\n     */\n    doFocusMethod(focusTarget: string) {\n        doFocus(Ember, focusTarget);\n    },\n\n    /**\n     * @function\n     * Toggles Agent Panel open if it's not already\n     */\n    openAgentPanel() {\n        if (this.get('commandNav').get('expanded') && this.get('commandNav').get('currentPanel') === 'agent') {\n            return;\n        }\n        this.get('commandNav').selectPanel('agent', true);\n    },\n\n    /**\n     * @function\n     * Toggles Chat Panel open if it's not already\n     */\n    openChatPanel() {\n        if (this.get('commandNav').get('expanded') && this.get('commandNav').get('currentPanel') === 'chats') {\n            return;\n        }\n        this.get('commandNav').selectPanel('chats', true);\n    },\n\n    /**\n     * @function\n     * Toggles Voice Panel open if it's not already\n     */\n    openVoicePanel() {\n        if (this.get('commandNav').get('expanded') && this.get('commandNav').get('currentPanel') === 'voice') {\n            return;\n        }\n        this.get('commandNav').selectPanel('voice', true);\n    },\n\n    actions: {\n        /**\n         * @action\n         * Skip to alerting interaction\n         */\n        skipToAlerting() {\n            if (this.hasAlertingAcdInteraction) {\n                // User has an alerting acd interaction\n                this.openAgentPanel();\n                Ember.run.scheduleOnce('afterRender', this, () => {\n                    this.doFocusMethod(ACD_ALERTING_ELEMENT);\n                });\n            } else if (this.hasAlertingNonAcdInteraction) {\n                // User has a non-acd alerting interaction\n                this.openVoicePanel();\n                Ember.run.next(this, () => {\n                    let callsTab: HTMLElement | null = document.querySelector('.action-item.call a');\n                    if (!callsTab) return;\n                    callsTab.click(); // Open Calls Tab\n                    this.doFocusMethod(NON_ACD_ALERTING_ELEMENT);\n                });\n            }\n        },\n\n        /**\n         * @action\n         * Skip to notifications container\n         */\n        skipToNotification() {\n            const notificationsContainer = document.querySelector(NOTIFICATIONS_ELEMENT);\n            if (this.hasNotifications && notificationsContainer) {\n                // Focus on outer container to allow user to reach all notifications\n                notificationsContainer.setAttribute('tabindex', '-1');\n                (notificationsContainer as HTMLElement).focus();\n            }\n        },\n\n        /**\n         * @action\n         * Skip to voice panel\n         */\n        skipToVoice() {\n            this.openVoicePanel();\n            Ember.run.next(this, () => {\n                this.get('commandNav').focusPanel('voice');\n            });\n        },\n\n        /**\n         * @action\n         * Skip to chat panel\n         */\n        skipToChats() {\n            this.openChatPanel();\n            Ember.run.next(this, () => {\n                this.get('commandNav').focusPanel('chats');\n            });\n        },\n\n        /**\n         * @action\n         * Skip to main stage content area\n         */\n        skipToMain() {\n            this.get('commandNav').selectPanel('panel-not-active');\n            this.doFocusMethod(MAIN_STAGE_ELEMENT);\n            // closes side panels\n        },\n\n        /**\n         * @action\n         * Skip to interactions content\n         */\n        skipToInteractions() {\n            this.openAgentPanel();\n            if (this.hasAlertingAcdInteraction) {\n                // User has alerting interaction\n                this.doFocusMethod(ACD_ALERTING_ELEMENT);\n            } else if (document.querySelector(ACD_SELECTED_CARD_ELEMENT)) {\n                // User has interactions\n                this.doFocusMethod(ACD_CARD_CONTAINER_ELEMENT);\n            } else {\n                // User has no interactions - direct to new interaction button\n                this.doFocusMethod(ACD_NEW_OUTBOUND_BUTTON_ELEMENT);\n            }\n        },\n\n        /**\n         * @action\n         * Skip to presence selector\n         */\n        skipToPresenceSelector() {\n            // Goal: Open User Settings -> Open Presence Menu -> Focus on active presence\n\n            // First open the user drop down\n            // If page is loaded at all this always exists\n            let userSettingsButton: HTMLElement | null = document.getElementById(USER_SETTINGS_BUTTON_ID);\n            if (!userSettingsButton) return;\n            userSettingsButton.click();\n\n            // Opening user settings has a delay\n            // so before we can click again we need to make sure items are on screen\n            const userSettingContainer = <Node>document.querySelector(USER_SETTINGS_CONTAINER);\n            const config = { attributes: true, childList: false, subtree: true };\n            const callback = (mutationList: any, _observer: any) => {\n                for (const mutation of mutationList) {\n                    if (mutation.type === 'attributes') {\n                        // Opening user presence menu\n                        if (document.getElementById(PRESENCE_MENU_ID)) {\n                            document.getElementById(PRESENCE_MENU_ID)?.click();\n                        }\n\n                        // Focusing on the active user presence\n                        if (document.querySelector(CURRENT_PRESENCE_SELECTOR)) {\n                            const activeSelector = <HTMLInputElement>document.querySelector(CURRENT_PRESENCE_SELECTOR);\n                            activeSelector.focus();\n                            if (activeSelector.matches(':focus')) observer.disconnect();\n                        }\n                    }\n                }\n            };\n            const observer = new MutationObserver(callback);\n            observer.observe(userSettingContainer, config);\n            Ember.run.later(\n                this,\n                () => {\n                    observer.disconnect();\n                },\n                500\n            );\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"kfpUcn6h\",\"block\":\"[[[10,\\\"gux-skip-navigation-list\\\"],[14,0,\\\"skip-navigation-list\\\"],[15,\\\"inert\\\",[36,0]],[12],[1,\\\"\\\\n\\\"],[41,[33,2],[[[1,\\\"        \\\"],[10,\\\"gux-skip-navigation-item\\\"],[12],[1,\\\"\\\\n            \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"skip-to-alerting\\\"],[4,[38,3],[[30,0],\\\"skipToAlerting\\\"],null],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,4],[\\\"components.navMenu.skipToAlerting\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[10,\\\"gux-skip-navigation-item\\\"],[12],[1,\\\"\\\\n        \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"skip-to-notification\\\"],[4,[38,3],[[30,0],\\\"skipToNotification\\\"],null],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,4],[\\\"components.navMenu.skipToNotifications\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,\\\"gux-skip-navigation-item\\\"],[12],[1,\\\"\\\\n        \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"skip-to-main\\\"],[4,[38,3],[[30,0],\\\"skipToMain\\\"],null],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,4],[\\\"components.navMenu.skipLink\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,\\\"gux-skip-navigation-item\\\"],[12],[1,\\\"\\\\n        \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"skip-to-presence-selector\\\"],[4,[38,3],[[30,0],\\\"skipToPresenceSelector\\\"],null],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,4],[\\\"components.navMenu.skipToPresenceSelector\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,5],[[[1,\\\"        \\\"],[10,\\\"gux-skip-navigation-item\\\"],[12],[1,\\\"\\\\n            \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"skip-to-collaborate\\\"],[4,[38,3],[[30,0],\\\"skipToVoice\\\"],null],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,4],[\\\"components.navMenu.skipToVoice\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,6],[[[1,\\\"        \\\"],[10,\\\"gux-skip-navigation-item\\\"],[12],[1,\\\"\\\\n            \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"skip-to-collaborate\\\"],[4,[38,3],[[30,0],\\\"skipToChats\\\"],null],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,4],[\\\"components.navMenu.skipToChats\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,7],[[[1,\\\"        \\\"],[10,\\\"gux-skip-navigation-item\\\"],[12],[1,\\\"\\\\n            \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"skip-to-interactions\\\"],[4,[38,3],[[30,0],\\\"skipToInteractions\\\"],null],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,4],[\\\"components.navMenu.skipToInteractions\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13]],[],false,[\\\"shroudOn\\\",\\\"if\\\",\\\"hasAlertingAcdInteraction\\\",\\\"action\\\",\\\"t\\\",\\\"isCallsEnabled\\\",\\\"isChatEnabled\\\",\\\"isInteractionsEnabled\\\"]]\",\"moduleName\":\"web-directory/components/command-bar/skip-links/template.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"HJ5++crv\",\"block\":\"[[[1,[28,[35,0],null,[[\\\"shroudOn\\\",\\\"isCallsEnabled\\\",\\\"isChatEnabled\\\",\\\"isInteractionsEnabled\\\"],[[33,1],[33,2],[33,3],[33,4]]]]],[1,\\\"\\\\n\\\\n\\\"],[1,[28,[35,5],null,[[\\\"navIsOpen\\\",\\\"narrowWidth\\\",\\\"shroudOn\\\"],[[33,6],[33,7],[33,1]]]]],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"search-controls\\\"],[15,\\\"inert\\\",[36,1]],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"global-search-bar\\\"],[12],[1,\\\"\\\\n\\\"],[41,[51,[33,9]],[[[1,\\\"            \\\"],[1,[28,[35,10],null,[[\\\"label\\\",\\\"navigateToSearchButton\\\",\\\"menuStructure\\\"],[[28,[37,11],[\\\"navBar.orgSearch\\\"],null],\\\"navigateToSearchButton\\\",[33,12]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"global-search-narrow-view\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,9],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"global-search-bar-with-overlay\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,10],null,[[\\\"label\\\",\\\"navigateToSearchButton\\\",\\\"menuStructure\\\"],[[28,[37,11],[\\\"navBar.orgSearch\\\"],null],\\\"navigateToSearchButton\\\",[33,12]]]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"global-search-overlay\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"global-search-button\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-button-slot\\\"],[12],[1,\\\"\\\\n                    \\\"],[11,\\\"button\\\"],[16,\\\"aria-label\\\",[28,[37,11],[\\\"components.navMenu.search\\\"],null]],[24,4,\\\"button\\\"],[4,[38,14],[[30,0],\\\"navigateToSearch\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"search\\\"],[15,\\\"screenreader-text\\\",[28,[37,11],[\\\"components.navMenu.search\\\"],null]],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"global-actions\\\"],[15,\\\"inert\\\",[36,1]],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"all-but-global-search\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,16],[[28,[37,16],[[33,17]],null]],null],null,[[[41,[28,[37,18],[[30,1],[30,1,[\\\"buttonData\\\",\\\"canSee\\\"]]],null],[[[1,\\\"                \\\"],[1,[28,[35,19],null,[[\\\"commandButton\\\",\\\"currentPanel\\\",\\\"actionTogglePanel\\\",\\\"isButton\\\",\\\"useNewPersistentCallFt\\\",\\\"bookmarkingEnabledFt\\\"],[[30,1,[\\\"buttonData\\\"]],[33,20,[\\\"currentPanel\\\"]],[28,[37,14],[[30,0],\\\"togglePanel\\\"],null],true,[33,21,[\\\"features\\\",\\\"ATLAS-1796_new-call-persistent-connection\\\"]],[33,21,[\\\"features\\\",\\\"ATLAS-2042_bookmarking\\\"]]]]]],[1,\\\"\\\\n\\\"]],[]],null]],[1]],null],[1,\\\"\\\\n\\\"],[1,\\\"        \\\"],[1,[28,[35,22],null,[[\\\"canSee\\\",\\\"isOnQueue\\\",\\\"disabled\\\",\\\"isButton\\\"],[[52,[33,23,[\\\"canGoOnQueue\\\"]],true,false],[33,24],[33,25],true]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,18],[[33,26],[33,26,[\\\"buttonData\\\",\\\"canSee\\\"]]],null],[[[1,\\\"            \\\"],[1,[28,[35,19],null,[[\\\"commandButton\\\",\\\"currentPanel\\\",\\\"actionTogglePanel\\\",\\\"isButton\\\"],[[33,26,[\\\"buttonData\\\"]],[33,20,[\\\"currentPanel\\\"]],[28,[37,14],[[30,0],\\\"togglePanel\\\"],null],true]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n        \\\\n        \\\"],[10,\\\"gux-button-slot\\\"],[14,1,\\\"more-options-popover-target\\\"],[14,\\\"accent\\\",\\\"secondary\\\"],[14,0,\\\"more-options-button\\\"],[12],[1,\\\"\\\\n            \\\"],[11,\\\"button\\\"],[24,\\\"aria-haspopup\\\",\\\"true\\\"],[16,\\\"aria-expanded\\\",[52,[33,27],\\\"true\\\",\\\"false\\\"]],[16,\\\"aria-label\\\",[28,[37,11],[\\\"common.more\\\"],null]],[24,4,\\\"button\\\"],[4,[38,14],[[30,0],\\\"toggleMoreOptions\\\"],null],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"more-popover-button-content\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,0],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,11],[\\\"common.more\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"more-popover-button-icon\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/chevrons-right-regular\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"more-options-popover-container\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-popover-list\\\"],[14,\\\"position\\\",\\\"bottom\\\"],[14,\\\"for\\\",\\\"more-options-popover-target\\\"],[15,\\\"is-open\\\",[36,27]],[15,\\\"close-on-click-outside\\\",true],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-list\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,16],[[28,[37,16],[[33,17]],null]],null],null,[[[41,[28,[37,18],[[30,2],[30,2,[\\\"buttonData\\\",\\\"canSee\\\"]],[28,[37,28],[[28,[37,29],[[30,2,[\\\"buttonData\\\",\\\"id\\\"]],\\\"command-bar-bookmark\\\"],null]],null]],null],[[[1,\\\"                            \\\"],[1,[28,[35,19],null,[[\\\"commandButton\\\",\\\"currentPanel\\\",\\\"actionTogglePanel\\\",\\\"isButton\\\"],[[30,2,[\\\"buttonData\\\"]],[33,20,[\\\"currentPanel\\\"]],[28,[37,14],[[30,0],\\\"togglePanel\\\"],null],false]]]],[1,\\\"\\\\n\\\"]],[]],null]],[2]],null],[1,\\\"\\\\n\\\"],[1,\\\"                    \\\"],[1,[28,[35,22],null,[[\\\"canSee\\\",\\\"isOnQueue\\\",\\\"disableQueue\\\",\\\"isButton\\\"],[[52,[33,23,[\\\"canGoOnQueue\\\"]],true,false],[33,24],[33,30],false]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,18],[[33,26],[33,26,[\\\"buttonData\\\",\\\"canSee\\\"]]],null],[[[1,\\\"                        \\\"],[1,[28,[35,19],null,[[\\\"commandButton\\\",\\\"currentPanel\\\",\\\"actionTogglePanel\\\",\\\"isButton\\\"],[[33,26,[\\\"buttonData\\\"]],[33,20,[\\\"currentPanel\\\"]],[28,[37,14],[[30,0],\\\"togglePanel\\\"],null],false]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[1,[34,31]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[\\\"commandButton\\\",\\\"commandButton\\\"],false,[\\\"command-bar/skip-links\\\",\\\"shroudOn\\\",\\\"isCallsEnabled\\\",\\\"isChatEnabled\\\",\\\"isInteractionsEnabled\\\",\\\"command-nav\\\",\\\"navIsOpen\\\",\\\"narrowWidth\\\",\\\"unless\\\",\\\"globalSearchOpen\\\",\\\"command-global-search\\\",\\\"t\\\",\\\"menuStructure\\\",\\\"if\\\",\\\"action\\\",\\\"each\\\",\\\"-track-array\\\",\\\"commandButtons\\\",\\\"and\\\",\\\"command-bar/command-button\\\",\\\"commandNav\\\",\\\"session\\\",\\\"command-bar/control-queue-toggle\\\",\\\"permissions\\\",\\\"isOnQueue\\\",\\\"disabled\\\",\\\"copilotButton\\\",\\\"moreOptionsOpen\\\",\\\"not\\\",\\\"eq\\\",\\\"disableQueue\\\",\\\"command-user-settings\\\"]]\",\"moduleName\":\"web-directory/components/command-bar/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { run } from '@ember/runloop';\nimport { inject } from '@ember/service';\nimport { getOwner } from '@ember/application';\nimport { Maybe } from 'web-directory/types';\n\nexport interface CommandBookmarkEntry {\n    rank: string;\n    hash: string;\n    title: string;\n}\n\nexport interface CommandBookmarks {\n    properties: Array<CommandBookmarkEntry>;\n}\n\n/**\n * @component command-bookmarks\n * Renders the bookmarks popover content\n */\nexport default Component.extend({\n    commandNav: inject('command-nav'),\n    application: inject('application'),\n    preferences: inject('preferences'),\n    notification: inject('notification'),\n    intl: inject('intl'),\n\n    /**\n     * @attribute\n     * dismiss the popover\n     */\n    closePopover: null as Maybe<() => void>,\n\n    /**\n     * Recently-viewed pages loaded from localStorage on each didInsertElement\n     * so the list is always fresh when the popover opens.\n     */\n    recentlyViewedPages: null as Maybe<CommandBookmarks>,\n\n    /**\n     * The current page URL in hash form (e.g. \"#/admin/people\"), derived from\n     * the router's currentURL.  Used to determine whether the current page is\n     * already bookmarked and as the URL when saving a new bookmark.\n     */\n    hashProperty: computed('commandNav._router.currentURL', function () {\n        return `#${this.get('commandNav._router.currentURL')}`;\n    }),\n\n    /**\n     * The current page title sourced from the application service, which\n     * resolves it from the known app list by matching the current URL.\n     * Used as the bookmark title when saving the current page.\n     */\n    bookmarkPageTitle: computed('application.currentPageTitle', function () {\n        return this.get('application.currentPageTitle');\n    }),\n\n    /**\n     * Tracks whether a drag-reorder operation is currently in progress.\n     */\n    _isDragging: false,\n\n    /**\n     * True once the pointer has moved enough after mousedown to be considered\n     * an intentional drag.  Prevents a plain click from triggering a reorder.\n     */\n    _hasMoved: false,\n\n    /**\n     * The clientX/Y coordinates recorded at mousedown.  Used to compute\n     * displacement so we can distinguish a click from a drag.\n     */\n    _startX: 0,\n    _startY: 0,\n\n    /**\n     * Reference to the DOM element currently being dragged during bookmark\n     * reordering.  Null when no drag is active.\n     */\n    _draggedEl: null as HTMLElement | null,\n\n    /**\n     * Reference to the editing list container DOM element.  Cached on drag\n     * start to avoid repeated querySelector calls during mousemove.\n     */\n    _listEl: null as HTMLElement | null,\n\n    /**\n     * Bound mousemove handler attached to document during a drag so it can\n     * be cleanly removed when the drag ends.\n     */\n    _boundMouseMove: null as ((e: MouseEvent) => void) | null,\n\n    /**\n     * Bound mouseup handler attached to document during a drag so it can be\n     * cleanly removed when the drag ends.\n     */\n    _boundMouseUp: null as ((e: MouseEvent) => void) | null,\n\n    /**\n     * Bound mousedown handler attached to the editing list container.\n     * Removed when edit mode is exited or the component is destroyed.\n     */\n    _boundMouseDown: null as ((e: MouseEvent) => void) | null,\n\n    /**\n     * Bound hashchange handler so it can be removed on destroy.\n     * Refreshes URL-dependent computed properties when the user navigates by\n     * typing directly into the browser address bar\n     */\n    _boundHashChangeHandler: null as (() => void) | null,\n\n    /**\n     * The index of the bookmark item currently being dragged.\n     * Reset to -1 when no drag is active.\n     */\n    draggedIndex: -1,\n\n    /**\n     * True when the recentlyViewedPages list contains at least one entry.\n     * Used in the template to conditionally render the recently-viewed section.\n     */\n    recentlyViewedExists: computed('recentlyViewedPages', function () {\n        const pages = this.get('recentlyViewedPages');\n        if (!pages) return false;\n        return pages.properties.length > 0;\n    }),\n\n    /**\n     * Controls whether the bookmark list is in edit mode (drag-to-reorder\n     * and delete buttons visible).  Toggled by the edit action.\n     */\n    editingBookmarks: false,\n\n    /**\n     * The message to be read by the live region after a keyboard reorder.\n     * Set by handleDragIconKeyDown; cleared on the next reorder so the same\n     * string can be re-announced when an item moves back to its prior position.\n     */\n    reorderAnnouncement: '' as string,\n\n    /**\n     * Controls whether the rename bookmark modal is open.\n     */\n    isRenameModalOpen: false,\n\n    /**\n     * The index of the bookmark entry currently being renamed, or -1 when no\n     * rename operation is in progress.  Index-based targeting avoids false\n     * multi-match when entry hashes are identical or undefined.\n     */\n    renameBookmarkTargetIndex: -1 as number,\n\n    /**\n     * The draft title value bound to the rename modal's input field.\n     */\n    renameBookmarkTitle: '' as string,\n\n    /**\n     * The full bookmark data loaded from the preferences service.\n     * Null until the async preferences load resolves on init.\n     */\n    existingBookmarksDetails: null as Maybe<CommandBookmarks>,\n\n    /**\n     * True while the initial getPreference call is in-flight.  Mutating\n     * actions (add, remove, reorder, rename) check this flag so they do not\n     * clobber the server-loaded state with stale local state.\n     */\n    _bookmarksLoading: true,\n\n    /**\n     * When true, shows an inline error alert informing the user they have\n     * reached the 15-bookmark limit.  Set by addBookmarkEntry; cleared by\n     * removeBookmarkEntry.\n     */\n    displayLimitReachedAlert: false,\n\n    displayLimitReachedWarning: computed('existingBookmarksDetails', function () {\n        const existing = this.get('existingBookmarksDetails') as CommandBookmarks | null;\n        const bookmarks: CommandBookmarks = existing ?? { properties: [] };\n        return bookmarks.properties.length == 15;\n    }),\n\n    /**\n     * Flat array of bookmark entries derived from existingBookmarksDetails,\n     * used by the template to render the saved-bookmarks list.\n     */\n    bookmarkedPages: computed('existingBookmarksDetails', function () {\n        const bookmarkDetails = this.get('existingBookmarksDetails');\n        if (!bookmarkDetails) return [];\n        return bookmarkDetails.properties;\n    }),\n\n    /**\n     * Set of bookmarked URLs for O(1) lookup when annotating the\n     * recently-viewed list with isBookmarked flags.\n     */\n    bookmarkedUrls: computed('existingBookmarksDetails', function () {\n        const bookmarkDetails = this.get('existingBookmarksDetails') as CommandBookmarks | null;\n        if (!bookmarkDetails) return new Set<string>();\n        return new Set(bookmarkDetails.properties.map(e => e.hash));\n    }),\n\n    /**\n     * True when the current page's URL is present in the saved bookmarks.\n     * Drives the bookmark/unbookmark button state in the template.\n     */\n    isCurrentPageBookmarked: computed('existingBookmarksDetails', 'hashProperty', function () {\n        const bookmarkDetails = this.get('existingBookmarksDetails') as CommandBookmarks | null;\n        if (!bookmarkDetails) return false;\n\n        // const bookmarksProperties = bookmarkDetails.properties;\n        const bookmarkedHashes = bookmarkDetails.properties.map((property: any) => {\n            return property.hash;\n        });\n        return bookmarkedHashes.includes(this.get('hashProperty'));\n    }),\n    /**\n     * Recently-viewed pages annotated with an isBookmarked flag so the\n     * template can show the correct bookmark icon state without an extra\n     * lookup.  Recomputes whenever either the recent pages or bookmark list\n     * changes.\n     */\n    recentlyViewedPagesList: computed('recentlyViewedPages', 'existingBookmarksDetails', function () {\n        const pages = this.get('recentlyViewedPages') as CommandBookmarks | null;\n        if (!pages) return [];\n        const bookmarkedUrls = this.get('bookmarkedUrls') as Set<string>;\n        return pages.properties.map(entry => ({\n            ...entry,\n            isBookmarked: bookmarkedUrls.has(entry.hash)\n        }));\n    }),\n\n    /**\n     * @function\n     * Reads the recentPages entry from localStorage and updates\n     * recentlyViewedPages.\n     */\n    refreshRecentPages() {\n        const recentPages = localStorage.getItem('recentPages');\n        if (recentPages) {\n            this.set('recentlyViewedPages', JSON.parse(recentPages));\n        } else {\n            this.set('recentlyViewedPages', null);\n        }\n    },\n\n    /**\n     * Bound click-capture handler on the editing list container.\n     * When the user activates any gux-context-menu, closes all other open\n     * context menus so only one is visible at a time.\n     */\n    _boundContextMenuClickCapture: null as ((e: Event) => void) | null,\n\n    /**\n     * @function\n     * Attaches mousedown listener to the editing list container to initiate\n     * drag-and-drop reordering, and a capturing click listener to enforce\n     * only-one-open-at-a-time for the gux-context-menu instances.\n     * Called after the editing list renders.\n     */\n    attachMouseListeners() {\n        const el = this.element as HTMLElement;\n        const list = el.querySelector('.editing-bookmarked-pages-list') as HTMLElement | null;\n        if (!list) return;\n        this._listEl = list;\n\n        this._boundMouseDown = (e: MouseEvent) => this.onMouseDown(e);\n        list.addEventListener('mousedown', this._boundMouseDown);\n\n        // Close all other context menus when any one is opened.\n        this._boundContextMenuClickCapture = (e: Event) => {\n            const clicked = (e.target as HTMLElement).closest('gux-context-menu');\n            if (!clicked) return;\n            list.querySelectorAll('gux-context-menu').forEach(menu => {\n                if (menu === clicked) return;\n                (menu as HTMLElement & { isOpen?: boolean }).isOpen = false;\n            });\n        };\n        list.addEventListener('click', this._boundContextMenuClickCapture, true);\n    },\n\n    /**\n     * @function\n     * Renames the bookmark entry at the given index with the provided newTitle,\n     * persists the updated list, and closes the rename modal.  Guards against\n     * running while the initial load is still in-flight.\n     */\n    renameBookmarkEntry(targetIndex: number, newTitle: string) {\n        if (this.get('_bookmarksLoading')) return;\n\n        const bookmarkDetails = this.get('existingBookmarksDetails') as CommandBookmarks | null;\n        if (!bookmarkDetails || !newTitle.trim()) return;\n        if (targetIndex < 0 || targetIndex >= bookmarkDetails.properties.length) return;\n\n        const updated: CommandBookmarks = {\n            properties: bookmarkDetails.properties.map((entry, i) =>\n                i === targetIndex ? { ...entry, title: newTitle.trim() } : entry\n            )\n        };\n\n        const previous = bookmarkDetails;\n        this.set('existingBookmarksDetails', updated);\n        this.set('isRenameModalOpen', false);\n        this.set('renameBookmarkTargetIndex', -1);\n        this.set('renameBookmarkTitle', '');\n        this.get('preferences')\n            .setPreference('commandNav.bookmarks', updated)\n            .catch(() => {\n                run(() => {\n                    if (this.isDestroyed || this.isDestroying) return;\n                    this.set('existingBookmarksDetails', previous);\n                    this.get('notification').error(\n                        this.get('intl').t('components.navMenu.bookmarks.renameErrorTitle'),\n                        this.get('intl').t('components.navMenu.bookmarks.renameError')\n                    );\n                });\n            });\n    },\n\n    /**\n     * @function\n     * Handles mousedown on a draggable bookmark item.  Ignores clicks on the\n     * delete button container and sets up the drag state and document-level\n     * mousemove/mouseup listeners.\n     */\n    onMouseDown(e: MouseEvent) {\n        const target = e.target as HTMLElement;\n        // Don't interfere with delete button clicks\n        if (target.closest('.delete-bookmark-button-container')) return;\n\n        const item = target.closest('.draggable-bookmarked-page') as HTMLElement | null;\n        if (!item) return;\n\n        e.preventDefault();\n        e.stopPropagation();\n\n        const index = parseInt(item.getAttribute('data-index') || '-1', 10);\n        if (index === -1) return;\n\n        this.set('draggedIndex', index);\n        this._isDragging = true;\n        this._hasMoved = false;\n        this._startX = e.clientX;\n        this._startY = e.clientY;\n        this._draggedEl = item;\n        item.classList.add('is-dragging');\n\n        this._boundMouseMove = (moveEvent: MouseEvent) => this.onMouseMove(moveEvent);\n        this._boundMouseUp = (upEvent: MouseEvent) => this.onMouseUp(upEvent);\n\n        document.addEventListener('mousemove', this._boundMouseMove);\n        document.addEventListener('mouseup', this._boundMouseUp);\n    },\n\n    /**\n     * @function\n     * Returns the list index that the cursor is currently hovering over,\n     * determined by comparing clientY against the midpoint of each item.\n     * Returns the last index when the cursor is below all items.\n     */\n    getDragTargetIndex(clientY: number): number {\n        if (!this._listEl) return -1;\n        const items = Array.from(this._listEl.querySelectorAll('.draggable-bookmarked-page')) as HTMLElement[];\n        for (let i = 0; i < items.length; i++) {\n            const rect = items[i].getBoundingClientRect();\n            if (clientY < rect.top + rect.height / 2) return i;\n        }\n        return items.length - 1;\n    },\n\n    /**\n     * @function\n     * Handles mousemove during a drag by applying a 'drag-over' class to the\n     * item at the current target index to give visual drop-position feedback.\n     */\n    onMouseMove(moveEvent: MouseEvent) {\n        if (!this._isDragging || !this._listEl) return;\n        moveEvent.preventDefault();\n\n        // Only consider it a real drag once the pointer has moved at least 5px\n        if (!this._hasMoved) {\n            const dx = moveEvent.clientX - this._startX;\n            const dy = moveEvent.clientY - this._startY;\n            if (Math.sqrt(dx * dx + dy * dy) < 5) return;\n            this._hasMoved = true;\n        }\n\n        const items = Array.from(this._listEl.querySelectorAll('.draggable-bookmarked-page')) as HTMLElement[];\n        const targetIndex = this.getDragTargetIndex(moveEvent.clientY);\n        const sourceIndex = this.get('draggedIndex');\n\n        items.forEach(el => el.classList.remove('drag-over'));\n        if (targetIndex !== sourceIndex && items[targetIndex]) {\n            items[targetIndex].classList.add('drag-over');\n        }\n    },\n\n    /**\n     * @function\n     * Handles mouseup to commit a drag-reorder if the item moved to a\n     * different index, then cleans up all drag state.\n     */\n    onMouseUp(upEvent: MouseEvent) {\n        if (!this._isDragging || !this._listEl) {\n            this._cleanupDrag();\n            return;\n        }\n\n        const targetIndex = this.getDragTargetIndex(upEvent.clientY);\n        const sourceIndex = this.get('draggedIndex');\n\n        if (this._hasMoved && targetIndex !== sourceIndex && sourceIndex !== -1) {\n            this.manageDraggedBookmarkOrder(sourceIndex, targetIndex);\n        }\n\n        this._cleanupDrag();\n    },\n\n    /**\n     * @function\n     * Moves the dragged item from sourceIndex to targetIndex in the bookmark\n     * list and delegates persistence to reorderBookmarks.\n     */\n    manageDraggedBookmarkOrder(sourceIndex: number, targetIndex: number) {\n        const bookmarkDetails = this.get('existingBookmarksDetails') as CommandBookmarks | null;\n        if (!bookmarkDetails) return;\n\n        const entries = [...bookmarkDetails.properties];\n        const [moved] = entries.splice(sourceIndex, 1);\n        entries.splice(targetIndex, 0, moved);\n\n        this.reorderBookmarks(entries);\n    },\n\n    /**\n     * @function\n     * Re-indexes the provided entries array (rank = array position), builds\n     * an updated CommandBookmarks object, persists it to the preferences\n     * service, and updates existingBookmarksDetails.  Guards against running\n     * while the initial load is still in-flight.\n     */\n    reorderBookmarks(entries: CommandBookmarkEntry[], errorKey = 'components.navMenu.bookmarks.saveError') {\n        if (this.get('_bookmarksLoading')) return;\n\n        const previous = this.get('existingBookmarksDetails') as CommandBookmarks | null;\n        const updated: CommandBookmarks = {\n            properties: entries.map((entry, i) => ({ ...entry, rank: i.toString() }))\n        };\n\n        this.set('existingBookmarksDetails', updated);\n        this.get('preferences')\n            .setPreference('commandNav.bookmarks', updated)\n            .catch(() => {\n                run(() => {\n                    if (this.isDestroyed || this.isDestroying) return;\n                    this.set('existingBookmarksDetails', previous);\n                    this.get('notification').error(\n                        this.get('intl').t(`${errorKey}Title`),\n                        this.get('intl').t(errorKey)\n                    );\n                });\n            });\n    },\n\n    /**\n     * @function\n     * Resets all drag state, removes 'is-dragging' and 'drag-over' CSS\n     * classes from list items, and detaches the document mousemove/mouseup\n     * listeners added during a drag.\n     */\n    _cleanupDrag() {\n        if (this._draggedEl) {\n            this._draggedEl.classList.remove('is-dragging');\n        }\n        if (this._listEl) {\n            this._listEl.querySelectorAll('.draggable-bookmarked-page').forEach(el => el.classList.remove('drag-over'));\n        }\n\n        this._isDragging = false;\n        this._hasMoved = false;\n        this._startX = 0;\n        this._startY = 0;\n        this._draggedEl = null;\n        this.set('draggedIndex', -1);\n\n        if (this._boundMouseMove) {\n            document.removeEventListener('mousemove', this._boundMouseMove);\n            this._boundMouseMove = null;\n        }\n        if (this._boundMouseUp) {\n            document.removeEventListener('mouseup', this._boundMouseUp);\n            this._boundMouseUp = null;\n        }\n    },\n\n    /**\n     * @function\n     * Removes the mousedown and context-menu click-capture listeners from the\n     * editing list container and runs _cleanupDrag to ensure all drag state\n     * and document listeners are cleared.  Called when exiting edit mode or\n     * on destroy.\n     */\n    _detachMouseListeners() {\n        if (this._listEl && this._boundMouseDown) {\n            this._listEl.removeEventListener('mousedown', this._boundMouseDown);\n        }\n        if (this._listEl && this._boundContextMenuClickCapture) {\n            this._listEl.removeEventListener('click', this._boundContextMenuClickCapture, true);\n        }\n        this._cleanupDrag();\n        this._listEl = null;\n        this._boundMouseDown = null;\n        this._boundContextMenuClickCapture = null;\n    },\n\n    /**\n     * @function\n     * Adds a new bookmark entry using the already-loaded in-memory state from\n     * existingBookmarksDetails.  Returns early if preferences are still loading\n     * to avoid overwriting the server state with an empty set.\n     *\n     * PURE-7322.5: Won't for user-facing duplicate warnings, but we still\n     * silently guard here to prevent data corruption if the button is clicked\n     * while state is stale.\n     */\n    addBookmarkEntry(hash: string, title: string) {\n        if (this.get('_bookmarksLoading')) return;\n\n        const existing = this.get('existingBookmarksDetails') as CommandBookmarks | null;\n        const bookmarks: CommandBookmarks = existing ?? { properties: [] };\n\n        const bookmarkedHashes = bookmarks.properties.map(e => e.hash);\n        const alreadyBookmarked = bookmarkedHashes.includes(hash);\n        if (alreadyBookmarked) return;\n\n        if (bookmarks.properties.length >= 15) {\n            this.set('displayLimitReachedAlert', true);\n            return;\n        }\n\n        const updated: CommandBookmarks = {\n            properties: [...bookmarks.properties, { rank: bookmarks.properties.length.toString(), hash, title }]\n        };\n\n        const previous = existing;\n        this.set('existingBookmarksDetails', updated);\n        this.get('preferences')\n            .setPreference('commandNav.bookmarks', updated)\n            .catch(() => {\n                run(() => {\n                    if (this.isDestroyed || this.isDestroying) return;\n                    this.set('existingBookmarksDetails', previous);\n                    this.get('notification').error(\n                        this.get('intl').t('components.navMenu.bookmarks.saveErrorTitle'),\n                        this.get('intl').t('components.navMenu.bookmarks.saveError')\n                    );\n                });\n            });\n    },\n\n    /**\n     * @function\n     * Removes the bookmark entry at the given index, re-indexes the remaining\n     * entries, and persists the result via reorderBookmarks.\n     * Also clears the limit-reached alert.  Guards against running while the\n     * initial load is still in-flight.\n     */\n    removeBookmarkEntry(index: number, errorKey = 'components.navMenu.bookmarks.deleteError') {\n        if (this.get('_bookmarksLoading')) return;\n\n        const bookmarkDetails = this.get('existingBookmarksDetails') as CommandBookmarks | null;\n        if (!bookmarkDetails) return;\n        if (index < 0 || index >= bookmarkDetails.properties.length) return;\n\n        const remaining = bookmarkDetails.properties.filter((_, i) => i !== index);\n        this.reorderBookmarks(remaining, errorKey);\n        this.set('displayLimitReachedAlert', false);\n        if (remaining.length === 0) {\n            this.set('editingBookmarks', false);\n            this._detachMouseListeners();\n        }\n    },\n\n    /**\n     * @function\n     * Invokes the closePopover closure action passed in by the parent to\n     * dismiss the popover, and returns keyboard focus to the trigger button.\n     */\n    closeBookmarks() {\n        const close = this.get('closePopover');\n        if (typeof close === 'function') close();\n        const trigger = this.element?.querySelector('#bookmark-button-wrapper') as HTMLElement;\n        if (trigger) {\n            trigger.focus();\n        }\n    },\n\n    /**\n     * @function\n     * Notifies Ember that `hashProperty` and `currentPageTitle` should\n     * recompute.  Called on `hashchange` so that typing a URL directly into\n     * the browser address bar (which skips the Ember router transition) still\n     * updates the bookmark/unbookmark button state.\n     */\n    _handleHashChange() {\n        if (this.isDestroyed || this.isDestroying) return;\n        this.notifyPropertyChange('hashProperty');\n        this.notifyPropertyChange('bookmarkPageTitle');\n    },\n\n    /**\n     * @function\n     * Closes the popover when a click is detected outside this component's\n     * root element.\n     */\n    _handleOutsideClick(event: MouseEvent) {\n        if (!this.get('closeBookmarks')) return;\n        if (this.element && !this.element.contains(event.target as Node)) {\n            this.closeBookmarks();\n        }\n    },\n\n    /**\n     * @function\n     * Closes the popover when the Escape key is pressed.\n     */\n    _handleEscapeKey(event: KeyboardEvent) {\n        if (event.key === 'Escape') {\n            this.closeBookmarks();\n        }\n    },\n\n    /**\n     * @function\n     * Handles ArrowUp / ArrowDown keypresses on a drag-icon-container to\n     * reorder bookmarks via keyboard.  Moves the item one slot in the pressed\n     * direction and restores focus to the grip handle of the moved item so the\n     * user can keep moving without re-focusing.\n     */\n    handleDragIconKeyDown(index: number, event: KeyboardEvent) {\n        if (event.key !== 'ArrowUp' && event.key !== 'ArrowDown') return;\n\n        event.preventDefault();\n        event.stopPropagation();\n\n        const bookmarkDetails = this.get('existingBookmarksDetails') as CommandBookmarks | null;\n        if (!bookmarkDetails) return;\n\n        const total = bookmarkDetails.properties.length;\n        const targetIndex = event.key === 'ArrowUp' ? index - 1 : index + 1;\n\n        if (targetIndex < 0 || targetIndex >= total) return;\n\n        const movedTitle = bookmarkDetails.properties[index].title;\n        this.manageDraggedBookmarkOrder(index, targetIndex);\n\n        // Announce the new position to screen readers via the live region.\n        // Clear first so the same string is re-announced if the item moves back.\n        this.set('reorderAnnouncement', '');\n        run.scheduleOnce('afterRender', this, function (this: any) {\n            this.set(\n                'reorderAnnouncement',\n                this.get('intl').t('components.navMenu.bookmarks.reorderBookmarkMoved', {\n                    title: movedTitle,\n                    position: targetIndex + 1,\n                    total\n                })\n            );\n        });\n\n        // Restore focus to the moved item's grip handle after Ember re-renders\n        run.scheduleOnce('afterRender', this, function (this: any) {\n            const el = this.element as HTMLElement | null;\n            // element is null when the component is not rendered (e.g. unit tests) or\n            // has been destroyed before this callback fires\n            if (!el) return;\n            const handle = el.querySelector(\n                `.drag-icon-container[data-drag-index=\"${targetIndex}\"]`\n            ) as HTMLElement | null;\n            if (handle) handle.focus();\n        });\n    },\n\n    /* @lifecycle\n     * Loads saved bookmarks from the preferences service.  Also binds event\n     * handler references for later removal. */\n    init() {\n        this._super(...arguments);\n        this.set('_bookmarksLoading', true);\n        this.get('preferences')\n            .getPreference('commandNav.bookmarks')\n            .then((bookmarks: CommandBookmarks | null) => {\n                if (this.isDestroyed || this.isDestroying) return;\n                if (bookmarks) {\n                    this.set('existingBookmarksDetails', bookmarks);\n                }\n            })\n            .catch((error: Error) => {\n                // Log the error but don't throw - we want the finally block to run\n                // and clear the loading flag even when preferences fail to load\n                if (!this.isDestroyed && !this.isDestroying) {\n                    console.warn('Failed to load bookmarks from preferences', error);\n                }\n            })\n            .finally(() => {\n                if (this.isDestroyed || this.isDestroying) return;\n                this.set('_bookmarksLoading', false);\n            });\n        this._handleOutsideClick = this._handleOutsideClick.bind(this);\n        this._handleEscapeKey = this._handleEscapeKey.bind(this);\n        this._handleHashChange = this._handleHashChange.bind(this);\n    },\n\n    /* @lifecycle\n     * Refreshes recently-viewed pages each time the popover opens so the list\n     * reflects any pages visited since the last open.  Also registers the\n     * Escape-key and hashchange handlers. */\n    didInsertElement() {\n        this._super(...arguments);\n        this.refreshRecentPages();\n        document.addEventListener('keydown', this._handleEscapeKey);\n        this._boundHashChangeHandler = this._handleHashChange as () => void;\n        window.addEventListener('hashchange', this._boundHashChangeHandler);\n    },\n\n    /* @lifecycle\n     * Removes event listeners to prevent memory leaks. */\n    willDestroyElement() {\n        this._super(...arguments);\n        this._detachMouseListeners();\n        document.removeEventListener('keydown', this._handleEscapeKey);\n        if (this._boundHashChangeHandler) {\n            window.removeEventListener('hashchange', this._boundHashChangeHandler);\n            this._boundHashChangeHandler = null;\n        }\n    },\n\n    actions: {\n        /**\n         * @action\n         * Bookmarks the current page if it is not already bookmarked, or\n         * removes it if it is.  Delegates to addBookmarkEntry /\n         * removeBookmarkEntry.\n         */\n        addRemoveBookmark() {\n            if (this.get('isCurrentPageBookmarked')) {\n                const bookmarkDetails = this.get('existingBookmarksDetails') as CommandBookmarks | null;\n                if (!bookmarkDetails) return;\n                const currentUrl = this.get('hashProperty');\n                const index = bookmarkDetails.properties.findIndex(e => e.hash === currentUrl);\n                if (index !== -1) this.removeBookmarkEntry(index);\n            } else {\n                this.addBookmarkEntry(this.get('hashProperty'), this.get('bookmarkPageTitle'));\n            }\n        },\n\n        /**\n         * @action\n         * Toggles the bookmark list between view mode and edit mode\n         * (drag-to-reorder + delete buttons).  Attaches mouse listeners when\n         * entering edit mode and detaches them when leaving.\n         */\n        editBookmarks() {\n            const nowEditing = !this.get('editingBookmarks');\n            this.set('editingBookmarks', nowEditing);\n            if (nowEditing) {\n                run.scheduleOnce('afterRender', this, 'attachMouseListeners');\n            } else {\n                this._detachMouseListeners();\n            }\n        },\n\n        /**\n         * @action\n         * Bookmarks a recently-viewed page that is not yet saved, or removes\n         * the bookmark for one that already is.  Passed the full entry object\n         * with an isBookmarked flag added by recentlyViewedPagesList.\n         */\n        bookmarkRecentPage(recentPage: CommandBookmarkEntry & { isBookmarked?: boolean }) {\n            if (recentPage.isBookmarked) {\n                const bookmarkDetails = this.get('existingBookmarksDetails') as CommandBookmarks | null;\n                if (!bookmarkDetails) return;\n                const index = bookmarkDetails.properties.findIndex(e => e.hash === recentPage.hash);\n                if (index !== -1) this.removeBookmarkEntry(index);\n            } else {\n                this.addBookmarkEntry(recentPage.hash, recentPage.title);\n            }\n        },\n\n        /**\n         * @action\n         * Renames a bookmark entry from the list.  Triggered by the Rename\n         * bookmark option in the More actions popover in edit mode.\n         * Opens the rename modal pre-populated with the current title.\n         */\n        renameBookmark(bookmarkedPage: CommandBookmarkEntry, index: number) {\n            this.set('renameBookmarkTargetIndex', index);\n            this.set('renameBookmarkTitle', bookmarkedPage.title);\n            this.set('isRenameModalOpen', true);\n        },\n\n        /**\n         * @action\n         * Confirms the rename operation from the modal, persisting the new title.\n         */\n        confirmRenameBookmark() {\n            const targetIndex = this.get('renameBookmarkTargetIndex') as number;\n            const newTitle = this.get('renameBookmarkTitle') as string;\n            if (targetIndex >= 0) {\n                this.renameBookmarkEntry(targetIndex, newTitle);\n            }\n        },\n\n        /**\n         * @action\n         * Cancels the rename operation and closes the modal without saving.\n         */\n        cancelRenameBookmark() {\n            this.set('isRenameModalOpen', false);\n            this.set('renameBookmarkTargetIndex', -1);\n            this.set('renameBookmarkTitle', '');\n        },\n\n        /**\n         * @action\n         * Deletes a bookmark entry from the list.  Triggered by the remove\n         * bookmark option in the More actions context menu in edit mode.\n         */\n        deleteBookmark(_bookmarkedPage: CommandBookmarkEntry, index: number) {\n            this.removeBookmarkEntry(index);\n        },\n\n        /**\n         * @action\n         * Navigates to the given hash URL via the Ember router and closes the\n         * popover.  Strips the leading \"#\" from the stored hash before passing\n         * to router.transitionTo, which expects a plain path.\n         */\n        navigateToBookmark(hash: string) {\n            const path = hash.startsWith('#') ? hash.slice(1) : hash;\n            const router = getOwner(this).lookup('router:main');\n            router.transitionTo(path);\n            const close = this.get('closePopover');\n            if (typeof close === 'function') close();\n        },\n\n        /**\n         * @action\n         * Keyboard reorder handler for the drag-icon-container.\n         * Delegates to handleDragIconKeyDown.\n         */\n        handleDragIconKeyDown(index: number, event: KeyboardEvent) {\n            this.handleDragIconKeyDown(index, event);\n        },\n\n        /**\n         * @action\n         * Submits the rename modal when Enter is pressed in the input field.\n         */\n        handleRenameInputKeyDown(event: KeyboardEvent) {\n            if (event.key !== 'Enter') return;\n            event.preventDefault();\n            const targetIndex = this.get('renameBookmarkTargetIndex') as number;\n            const newTitle = this.get('renameBookmarkTitle') as string;\n            if (targetIndex >= 0) {\n                this.renameBookmarkEntry(targetIndex, newTitle);\n            }\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"8jKlFUE3\",\"block\":\"[[[10,0],[14,\\\"role\\\",\\\"status\\\"],[14,\\\"aria-live\\\",\\\"polite\\\"],[14,\\\"aria-atomic\\\",\\\"true\\\"],[14,0,\\\"bookmark-reorder-announcement sr-only\\\"],[12],[1,[34,0]],[13],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"bookmark-popover-container\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"bookmark-popover-content\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"bookmarks-header\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,1],[\\\"components.navMenu.bookmarks.title\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"bookmark-page-button-container\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-button\\\"],[14,\\\"role\\\",\\\"button\\\"],[14,\\\"accent\\\",\\\"secondary\\\"],[14,0,\\\"bookmark-page-button\\\"],[15,\\\"onclick\\\",[28,[37,2],[[30,0],\\\"addRemoveBookmark\\\"],null]],[12],[1,\\\"\\\\n\\\"],[41,[33,4],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"global-action-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/bookmark-solid\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[10,1],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,1],[\\\"components.navMenu.bookmarks.removeBookmark\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"global-action-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/bookmark-regular\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[10,1],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,1],[\\\"components.navMenu.bookmarks.bookmarkPage\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,5],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"alert-container\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-inline-alert\\\"],[14,0,\\\"bookmark-alert\\\"],[14,\\\"accent\\\",\\\"error\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,0],[14,\\\"slot\\\",\\\"content\\\"],[12],[1,[28,[35,1],[\\\"components.navMenu.bookmarks.limitReachedError\\\"],null]],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[28,[37,6],[[28,[37,7],[[33,5]],null],[33,8]],null],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"alert-container\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-inline-alert\\\"],[14,0,\\\"bookmark-alert\\\"],[14,\\\"accent\\\",\\\"warning\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,0],[14,\\\"slot\\\",\\\"content\\\"],[12],[1,[28,[35,1],[\\\"components.navMenu.bookmarks.limitReachedWarning\\\"],null]],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,9,[\\\"length\\\"]],[[[1,\\\"            \\\"],[10,\\\"section\\\"],[14,0,\\\"bookmarked-pages-section\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"bookmarked-pages-border\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"bookmarked-pages-header\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,0],[14,0,\\\"bookmarked-pages-title\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,1],[\\\"components.navMenu.bookmarks.bookmarkedPages\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                        \\\"],[10,0],[14,0,\\\"edit-button-container\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,\\\"gux-button\\\"],[14,\\\"role\\\",\\\"button\\\"],[14,\\\"accent\\\",\\\"ghost\\\"],[15,0,[29,[\\\"edit-button \\\",[52,[33,10],\\\"edit-button--active\\\"]]]],[15,\\\"aria-label\\\",[28,[37,1],[\\\"components.navMenu.bookmarks.editBookmarks\\\"],null]],[15,\\\"aria-pressed\\\",[52,[33,10],\\\"true\\\",\\\"false\\\"]],[15,\\\"onclick\\\",[28,[37,2],[[30,0],\\\"editBookmarks\\\"],null]],[12],[1,\\\"\\\\n                                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/pen-regular\\\"],[15,\\\"screenreader-text\\\",[29,[[28,[37,1],[\\\"common.edit\\\"],null]]]],[12],[13],[1,\\\"\\\\n                                \\\"],[10,\\\"gux-tooltip\\\"],[14,0,\\\"edit-bookmarks-tooltip\\\"],[14,\\\"placement\\\",\\\"bottom\\\"],[12],[1,\\\"\\\\n                                    \\\"],[10,1],[12],[1,[28,[35,1],[\\\"common.edit\\\"],null]],[13],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"section\\\"],[14,0,\\\"bookmarked-pages-list-section\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"scroll-section\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,7],[[33,10]],null],[[[1,\\\"                        \\\"],[10,0],[14,0,\\\"bookmarked-pages-list\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,12],[[28,[37,12],[[33,9]],null]],null],null,[[[1,\\\"                                \\\"],[10,3],[14,0,\\\"bookmarked-page\\\"],[15,6,[29,[[30,1,[\\\"hash\\\"]]]]],[15,\\\"onclick\\\",[28,[37,2],[[30,0],\\\"navigateToBookmark\\\",[30,1,[\\\"hash\\\"]]],null]],[12],[1,\\\"\\\\n                                    \\\"],[10,\\\"gux-truncate\\\"],[12],[1,\\\"\\\\n                                        \\\"],[10,1],[12],[1,[30,1,[\\\"title\\\"]]],[13],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,0],[14,0,\\\"editing-bookmarked-pages-list\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,12],[[28,[37,12],[[33,9]],null]],null],null,[[[1,\\\"                                \\\"],[10,0],[14,0,\\\"draggable-bookmarked-page draggable\\\"],[15,\\\"data-index\\\",[29,[[30,3]]]],[12],[1,\\\"\\\\n                                    \\\"],[10,0],[14,0,\\\"drag-icon-container\\\"],[14,\\\"tabindex\\\",\\\"0\\\"],[14,\\\"role\\\",\\\"button\\\"],[15,\\\"data-drag-index\\\",[29,[[30,3]]]],[15,\\\"aria-label\\\",[28,[37,1],[\\\"components.navMenu.bookmarks.reorderBookmark\\\"],[[\\\"title\\\"],[[30,2,[\\\"title\\\"]]]]]],[15,\\\"onkeydown\\\",[28,[37,2],[[30,0],\\\"handleDragIconKeyDown\\\",[30,3]],null]],[12],[1,\\\"\\\\n                                        \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"drag-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/grip-vertical-solid\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n                                    \\\"],[10,\\\"gux-truncate\\\"],[14,0,\\\"bookmarked-page\\\"],[12],[1,\\\"\\\\n                                        \\\"],[10,1],[12],[1,[30,2,[\\\"title\\\"]]],[13],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n                                    \\\"],[10,0],[14,0,\\\"more-actions-bookmark-button-container\\\"],[12],[1,\\\"\\\\n                                        \\\"],[10,\\\"gux-context-menu\\\"],[14,0,\\\"more-actions-context-menu\\\"],[14,\\\"placement\\\",\\\"bottom-end\\\"],[15,\\\"screenreader-text\\\",[28,[37,1],[\\\"components.navMenu.bookmarks.moreActionsLabel\\\"],[[\\\"title\\\"],[[30,2,[\\\"title\\\"]]]]]],[12],[1,\\\"\\\\n                                            \\\"],[10,\\\"gux-list-item\\\"],[15,\\\"onClick\\\",[28,[37,2],[[30,0],\\\"renameBookmark\\\",[30,2],[30,3]],null]],[12],[1,[28,[35,1],[\\\"components.navMenu.bookmarks.renameBookmark\\\"],null]],[13],[1,\\\"\\\\n                                            \\\"],[10,\\\"gux-list-item\\\"],[15,\\\"onClick\\\",[28,[37,2],[[30,0],\\\"deleteBookmark\\\",[30,2],[30,3]],null]],[12],[1,[28,[35,1],[\\\"components.navMenu.bookmarks.removeBookmark\\\"],null]],[13],[1,\\\"\\\\n                                        \\\"],[13],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n\\\"]],[2,3]],null],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"bookmarks-empty\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"empty-text-container\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"no-bookmarks-text\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,1],[\\\"components.navMenu.bookmarks.noBookmarks\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"no-bookmarks-instructions\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,1],[\\\"components.navMenu.bookmarks.instructions\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[41,[33,13],[[[1,\\\"            \\\"],[10,\\\"section\\\"],[14,0,\\\"recently-viewed-section\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"recently-viewed-border\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"recently-viewed-header\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,0],[14,0,\\\"recently-viewed-title\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,1],[\\\"components.navMenu.bookmarks.recentlyViewed\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"recently-viewed-list\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,12],[[28,[37,12],[[33,14]],null]],null],null,[[[1,\\\"                            \\\"],[10,0],[14,0,\\\"recently-viewed-page\\\"],[12],[1,\\\"\\\\n                                \\\"],[10,3],[14,0,\\\"recently-viewed-page-name\\\"],[15,6,[29,[[30,4,[\\\"hash\\\"]]]]],[15,\\\"onclick\\\",[28,[37,2],[[30,0],\\\"navigateToBookmark\\\",[30,4,[\\\"hash\\\"]]],null]],[12],[1,\\\"\\\\n                                    \\\"],[10,\\\"gux-truncate\\\"],[14,0,\\\"recently-viewed-name\\\"],[12],[1,\\\"\\\\n                                        \\\"],[10,1],[12],[1,[30,4,[\\\"title\\\"]]],[13],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n                                \\\"],[10,0],[14,0,\\\"recently-viewed-button-container\\\"],[12],[1,\\\"\\\\n                                    \\\"],[10,\\\"gux-button\\\"],[15,1,[29,[[36,15],\\\"-bookmark-page-\\\",[30,5]]]],[14,\\\"role\\\",\\\"button\\\"],[14,\\\"accent\\\",\\\"inline\\\"],[14,0,\\\"bookmark-recent-page-button\\\"],[15,\\\"aria-label\\\",[52,[30,4,[\\\"isBookmarked\\\"]],[28,[37,1],[\\\"components.navMenu.bookmarks.removeBookmarkRecentPage\\\"],[[\\\"title\\\"],[[30,4,[\\\"title\\\"]]]]],[28,[37,1],[\\\"components.navMenu.bookmarks.bookmarkRecentPage\\\"],[[\\\"title\\\"],[[30,4,[\\\"title\\\"]]]]]]],[15,\\\"aria-pressed\\\",[52,[30,4,[\\\"isBookmarked\\\"]],\\\"true\\\",\\\"false\\\"]],[15,\\\"onclick\\\",[28,[37,2],[[30,0],\\\"bookmarkRecentPage\\\",[30,4]],null]],[12],[1,\\\"\\\\n                                        \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"bookmark-recent-page-icon\\\"],[15,\\\"icon-name\\\",[29,[[52,[30,4,[\\\"isBookmarked\\\"]],\\\"fa/bookmark-solid\\\",\\\"fa/bookmark-regular\\\"]]]],[15,\\\"screenreader-text\\\",[29,[[28,[37,1],[\\\"components.navMenu.bookmarks.bookmarkPage\\\"],null]]]],[12],[13],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n                                    \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,15],\\\"-bookmark-page-\\\",[30,5]]]],[14,0,\\\"bookmark-page-tooltip\\\"],[14,\\\"placement\\\",\\\"bottom\\\"],[12],[1,\\\"\\\\n                                        \\\"],[10,1],[12],[1,[52,[30,4,[\\\"isBookmarked\\\"]],[28,[37,1],[\\\"components.navMenu.bookmarks.removeBookmark\\\"],null],[28,[37,1],[\\\"components.navMenu.bookmarks.bookmarkPage\\\"],null]]],[13],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[4,5]],null],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,16],[[[6,[39,17],null,[[\\\"isOpen\\\",\\\"headerText\\\",\\\"confirmText\\\",\\\"cancelText\\\",\\\"confirm\\\",\\\"cancel\\\",\\\"size\\\"],[[33,16],[28,[37,1],[\\\"components.navMenu.bookmarks.renameBookmarkModalTitle\\\"],null],[28,[37,1],[\\\"components.navMenu.bookmarks.renameBookmarkSave\\\"],null],[28,[37,1],[\\\"common.cancel\\\"],null],[28,[37,2],[[30,0],\\\"confirmRenameBookmark\\\"],null],[28,[37,2],[[30,0],\\\"cancelRenameBookmark\\\"],null],\\\"small\\\"]],[[\\\"default\\\"],[[[[1,\\\"        \\\"],[10,0],[14,0,\\\"rename-bookmark-modal-content\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"rename-bookmark-input\\\"],[14,0,\\\"rename-bookmark-label\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,1],[\\\"components.navMenu.bookmarks.renameBookmarkInputLabel\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"gux-form-field-text-like\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"input\\\"],[14,1,\\\"rename-bookmark-input\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,2,[36,18]],[15,\\\"placeholder\\\",[28,[37,1],[\\\"components.navMenu.bookmarks.renameBookmarkPlaceholder\\\"],null]],[15,\\\"oninput\\\",[28,[37,2],[[30,0],[28,[37,19],[[33,18]],null]],[[\\\"value\\\"],[\\\"target.value\\\"]]]],[15,\\\"onkeydown\\\",[28,[37,2],[[30,0],\\\"handleRenameInputKeyDown\\\"],null]],[14,4,\\\"text\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]]],[]],null]],[\\\"bookmarkedPage\\\",\\\"bookmarkedPage\\\",\\\"index\\\",\\\"recentlyViewedPage\\\",\\\"index\\\"],false,[\\\"reorderAnnouncement\\\",\\\"t\\\",\\\"action\\\",\\\"if\\\",\\\"isCurrentPageBookmarked\\\",\\\"displayLimitReachedAlert\\\",\\\"and\\\",\\\"not\\\",\\\"displayLimitReachedWarning\\\",\\\"bookmarkedPages\\\",\\\"editingBookmarks\\\",\\\"each\\\",\\\"-track-array\\\",\\\"recentlyViewedExists\\\",\\\"recentlyViewedPagesList\\\",\\\"elementId\\\",\\\"isRenameModalOpen\\\",\\\"modal-gux\\\",\\\"renameBookmarkTitle\\\",\\\"mut\\\"]]\",\"moduleName\":\"web-directory/components/command-bookmarks/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { inject } from '@ember/service';\n\nexport default Component.extend({\n    classNames: ['command-chat-panel'],\n\n    session: inject('session'),\n    webrtc: inject('webrtc'),\n    permissions: inject('permissions')\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"TFdCdrTI\",\"block\":\"[[[1,[34,0]]],[],false,[\\\"chat-frame-router\\\"]]\",\"moduleName\":\"web-directory/components/command-chat-panel/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { inject } from '@ember/service';\n\nexport default Component.extend({\n    classNames: ['command-free-trial-support'],\n\n    application: inject('application'),\n    intl: inject('intl'),\n    session: inject('session'),\n\n    route: '/trial-support',\n\n    init() {\n        this._super(...arguments);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.setupFrameRouter();\n    },\n\n    setupFrameRouter(this: any) {\n        let appUrl = `${window.location.origin}/trial-support-ui/#/`;\n        if (window.location.hostname.indexOf('localhost') > -1) {\n            appUrl = 'http://localhost:5000/#/';\n        }\n\n        let frame = this.element.querySelector('frame-router');\n\n        if (!frame) {\n            return;\n        }\n\n        frame.setupFrames(\n            {\n                support: {\n                    url: appUrl,\n                    assignedRoute: this.get('route')\n                }\n            },\n            {\n                locale: this.get('intl.isoRegionalLocale'),\n                hostRootUrl: window.location.origin,\n                custom: {\n                    authToken: this.get('session.accessToken')\n                }\n            }\n        );\n    },\n\n    actions: {\n        closeTrialSupport() {\n            this.get('application').dismissTrialSupport();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"IJSVT5V+\",\"block\":\"[[[10,0],[14,0,\\\"command-trial-support-enabled\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"frame-router\\\"],[14,0,\\\"command-trial-router\\\"],[14,\\\"route\\\",\\\"trial-support\\\"],[12],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[]]\",\"moduleName\":\"web-directory/components/command-free-trial-support/template.hbs\",\"isStrictMode\":false});","import Ember from 'ember';\nimport Component from '@ember/component';\nimport { inject } from '@ember/service';\nimport _ from 'lodash';\nimport { task, timeout, didCancel } from 'ember-concurrency';\nimport { doFocus } from 'web-directory/utils/focus-management';\nimport { createMenuMap, MenuMapDefinition } from 'web-directory/utils/command-nav';\nimport { MenuDefinition } from '../command-nav/navMenu';\nimport { debounce } from '@ember/runloop';\nimport { BASE_PERSON } from 'web-directory/models/person';\nimport { allSettled } from 'rsvp';\nimport { Maybe } from 'web-directory/types';\n\nexport default Component.extend({\n    classNames: ['command-global-search'],\n    search: inject('search'),\n    intl: inject('intl'),\n    permissions: inject('permissions'),\n    store: inject('store'),\n    phoneIntegrations: inject('phoneIntegrations'),\n    integrationsPresenceSvc: inject('integrations-presence'),\n    chatFrame: inject('chatFrame'),\n    events: inject('events'),\n    session: inject('session'),\n\n    query: '',\n    empty: false,\n    directoryCount: 0,\n    dismissed: true,\n    submittingSearch: false,\n    noRecentsYet: false,\n    label: null,\n    tetherConstraints: {\n        pin: ['left', 'right']\n    },\n    pageSearchResultsAll: [] as MenuMapDefinition[],\n    pageSearchResults4: [] as MenuMapDefinition[],\n    moreThanFourResults: false,\n    viewAllPageResults: false,\n\n    menuStructure: [] as MenuDefinition[],\n\n    actions: {\n        clearInput: function () {\n            this.set('query', '');\n            (this.element.querySelector('input') as HTMLInputElement)?.focus();\n        },\n        transitionToEntityDetail: function (this: any, person: any) {\n            this.get('performSuggestSearchTask').cancelAll();\n            this.setProperties({\n                dismissed: true\n            });\n            (this.element.querySelector('input') as HTMLInputElement)?.blur();\n            this.bubbleAction({\n                action: 'transitionToEntityDetail',\n                actionContext: [person]\n            });\n        },\n        collapse() {\n            this.set('dismissed', true);\n        },\n        dismiss() {\n            this.set('dismissed', true);\n            this.set('query', '');\n            (this.element.querySelector('input') as HTMLInputElement)?.focus();\n        },\n        handleSearchInput(searchValue: any) {\n            this.set('query', searchValue);\n            this.set('viewAllPageResults', false);\n            this.get('suggestSearchTask').perform();\n            this.get('pagesSearchTask').perform();\n        },\n        togglePageResultsDisplay() {\n            this.toggleProperty('viewAllPageResults');\n            this.get('pagesSearchTask').perform();\n            this.get('suggestSearchTask').perform();\n        }\n    },\n\n    pageCountPlural: Ember.computed('pageSearchResultsAll', function () {\n        return this.pageSearchResultsAll.length !== 1;\n    }),\n\n    directoryCountPlural: Ember.computed('directoryCount', function () {\n        return this.directoryCount !== 1;\n    }),\n\n    handleResizeEvent() {\n        // Guard: the debounced resize event can fire after the component is destroyed\n        if (this.isDestroyed || this.isDestroying || !this.element) {\n            return;\n        }\n        this.set('dismissed', true);\n        this.sendAction('navigateToSearchButton', '');\n        this.get('performSuggestSearchTask').cancelAll();\n    },\n\n    pagesSearchTask: task(function* (this: any) {\n        type TempResult = { strength: number; menu: MenuMapDefinition };\n        // let searchResults: TempResult[] = [];\n        let titleMatches: TempResult[] = [];\n        let folderMatches: TempResult[] = [];\n        let keywordMatches: TempResult[] = [];\n        let query = this.get('query').toLowerCase();\n        const navMenuMap: MenuMapDefinition[] = this.get('navMenuMap');\n        navMenuMap.forEach(navMenuItem => {\n            const itemTitle = this.get('intl').t(navMenuItem.title).toLowerCase();\n            const itemKeywords = navMenuItem.keywords ? this.get('intl').t(navMenuItem.keywords).toLowerCase() : '';\n            const itemParent = navMenuItem.parentFolder\n                ? this.get('intl').t(navMenuItem.parentFolder).toLowerCase()\n                : '';\n            const itemTopParent = navMenuItem.topParentFolder\n                ? this.get('intl').t(navMenuItem.topParentFolder).toLowerCase()\n                : '';\n            if (itemTitle.includes(query)) {\n                let strength = itemTitle.length - query.length;\n                titleMatches.push({\n                    strength,\n                    menu: navMenuItem\n                });\n            } else if (itemParent.includes(query)) {\n                let strength = itemParent.length - query.length;\n                folderMatches.push({\n                    strength,\n                    menu: navMenuItem\n                });\n            } else if (itemTopParent.includes(query)) {\n                let strength = itemTopParent.length - query.length;\n                folderMatches.push({\n                    strength,\n                    menu: navMenuItem\n                });\n            } else if (itemKeywords.includes(query)) {\n                let strength = itemKeywords.length - query.length;\n                keywordMatches.push({\n                    strength,\n                    menu: navMenuItem\n                });\n            }\n        });\n\n        const sorter = (a: TempResult, b: TempResult) => {\n            return a.strength - b.strength;\n        };\n\n        let sortedTitles = titleMatches.sort(sorter).map(res => res.menu);\n        let sortedFolders = folderMatches.sort(sorter).map(res => res.menu);\n        let sortedKeywords = keywordMatches.sort(sorter).map(res => res.menu);\n\n        let sortedResults = [...sortedTitles, sortedFolders, sortedKeywords].flat();\n\n        if (sortedResults.length > 4) {\n            this.set('pageSearchResultsAll', sortedResults);\n            this.set('pageSearchResults4', sortedResults.slice(0, 4));\n            this.set('moreThanFourResults', true);\n        } else {\n            this.set('pageSearchResults4', sortedResults);\n            this.set('pageSearchResultsAll', sortedResults);\n            this.set('moreThanFourResults', false);\n        }\n        this.set('dismissed', false);\n    }),\n\n    suggestSearchTask: task(function* (this: any): any {\n        try {\n            let query = (this.get('query') || '').trim();\n            this.set('query', query);\n            if (this.get('submittingSearch')) {\n                return;\n            }\n            if (_.isEmpty(query) || query.length < 2) {\n                // Only dismiss if there are no page results to keep the dropdown open\n                if (!this.get('pageSearchResultsAll.length')) {\n                    this.set('dismissed', true);\n                }\n                // Clear stale directory results so the panel doesn't show old data\n                this.set('results', null);\n                this.set('empty', true);\n                this.set('directoryCount', 0);\n            } else {\n                yield timeout(250);\n                let results = yield this.get('performSuggestSearchTask').perform(query);\n                this.set('results', results);\n                this.set('dismissed', false);\n                this.set('empty', results ? results.length === 0 : true);\n                this.set('directoryCount', results ? results.length : 0);\n                // Since we can't view search results, immediately focus the first\n                // search result we get\n                if (!this.get('permissions.canViewDirectory')) {\n                    yield timeout(250);\n                    Ember.run.scheduleOnce('afterRender', this, this.focusResults);\n                }\n            }\n        } catch (err) {\n            // Re-throw task cancellations so ember-concurrency can handle them\n            // cleanly. Only log genuine errors.\n            if (didCancel(err)) {\n                throw err;\n            }\n            console.error('Search task failed.', err);\n        }\n    }).restartable(),\n    performSuggestSearchTask: task(function* (this: any, query): any {\n        let results = [];\n        try {\n            results = yield this.runSuggestQuery(query);\n            this.set('error', false);\n        } catch (e) {\n            this.set('error', true);\n            console.error('Failed to perform suggest search task', { error: e });\n        }\n        return results;\n    }).restartable(),\n    submitSearch: task(function* (this: any, evt) {\n        evt.preventDefault();\n        if (!this.get('permissions.canViewDirectory')) {\n            // NOTE it appears 'waitForProperty' was removed from \"ember-concurrency\"?\n            // yield waitForProperty(this, 'suggestSearchTask.isIdle');\n            if (this.get('results').length > 0) {\n                this.setProperties({\n                    dismissed: true\n                });\n                this.send('transitionToEntityDetail', this.get('results.firstObject'));\n            }\n            return;\n        }\n        this.set('submittingSearch', true);\n        this.get('suggestSearchTask').cancelAll();\n        this.get('performSuggestSearchTask').cancelAll();\n        let query = this.get('query');\n        this.setProperties({\n            dismissed: true\n        });\n        (this.element.querySelector('input') as HTMLInputElement)?.blur();\n        this.bubbleAction({\n            action: 'performSearch',\n            actionContext: [query]\n        });\n    }),\n    runSuggestQuery(this: any, query: any) {\n        let types = ['users', 'groups', 'locations'];\n        const data = {\n            pageNumber: 1,\n            pageSize: 4,\n            query: [\n                {\n                    type: 'QUERY_STRING',\n                    value: query\n                }\n            ],\n            sortBy: 'name',\n            sortOrder: 'ASC',\n            types,\n            returnFields: ['id', '_id', 'general', 'contactInfo']\n        };\n        return (\n            this.get('search')\n                .suggest(data)\n                //@ts-ignore\n                .then(({ results }) => {\n                    /**\n                     * Guard: if the component was destroyed while the XHR was\n                     * in-flight (e.g. task restarted), bail out before touching\n                     * the store or scheduling any renders. Without this, profile\n                     * fetches (batched findMany / integration findRecord) that\n                     * complete after teardown cause \"Cannot read properties of\n                     * null (reading 'nextSibling')\" errors from the viewport\n                     * mixin trying to insert destroyed components.\n                     */\n\n                    type SuggestHydrationModel = { get(key: string): unknown };\n\n                    if (this.isDestroyed || this.isDestroying) return [];\n\n                    const models = this.get('search').modelResults(results);\n                    const personFetchPromises: Promise<unknown>[] = [];\n                    const standardPersonIds: string[] = [];\n\n                    (models as SuggestHydrationModel[]).forEach(model => {\n                        if (model.get('type') !== 'person') return;\n\n                        const integrationPhone = model.get('integrationPhone') as Maybe<{\n                            value?: { integration?: string };\n                        }>;\n                        const integrationKey = integrationPhone?.value?.integration;\n                        if (integrationKey) {\n                            personFetchPromises.push(this._fetchPersonWithIntegrationPresence(model, integrationKey));\n                            return;\n                        }\n                        standardPersonIds.push(model.get('id') as string);\n                    });\n\n                    if (standardPersonIds.length > 0) {\n                        /**\n                         * One BASE_PERSON batch instead of per-model reload() (ATLAS-1908).\n                         * findMany hydrates suggest instances in-place — keep returning `models`.\n                         */\n                        personFetchPromises.push(\n                            this.get('store').findMany('person', [...new Set(standardPersonIds)], BASE_PERSON)\n                        );\n                    }\n\n                    if (personFetchPromises.length === 0) return models;\n                    return allSettled(personFetchPromises).then(settled => {\n                        settled.forEach(result => {\n                            if (result.state === 'rejected') {\n                                Ember.Logger.warn('Search: person profile presence fetch failed', {\n                                    error: result.reason\n                                });\n                            }\n                        });\n                        if (this.isDestroyed || this.isDestroying) return [];\n                        return models;\n                    });\n                })\n        );\n    },\n    /**\n     * Fetch person using integration presence source.\n     * Not async: return the store findRecord thenable directly so allSettled (and callers)\n     * see the same thenable shape as findMany and prevent empty directory dropdown.\n     * @param {models.Person} person person model to fetch\n     * @param {string} integrationKey uc-integration key\n     * @returns {Promise} person response\n     */\n    _fetchPersonWithIntegrationPresence(person: any, integrationKey: string) {\n        const integrationConfig = this.get('phoneIntegrations').getIntegration(integrationKey);\n        let options = {};\n        if (integrationConfig) {\n            options = {\n                adapterOptions: {\n                    integrationPresenceSource: integrationConfig.integrationPresenceSource\n                },\n                reload: true\n            };\n        }\n        const personId = person.get('id') as string;\n        return this.get('store').findRecord('person', personId, options);\n    },\n\n    loading: Ember.computed.reads('performSuggestSearchTask.isRunning'),\n    didRender() {\n        this._super(...arguments);\n        if (this.get('loading') && !this.get('dismissed')) {\n            Ember.run.scheduleOnce('afterRender', this, this._tetherPosition);\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n\n        this._onResizeBound = () => {\n            debounce(this, this.handleResizeEvent, 100);\n        };\n        window.addEventListener('resize', this._onResizeBound);\n\n        // if chat frame is clicked, we should trigger outside click logic\n        //@ts-ignore\n        this.get('chatFrame').on('collaborateChatFrameClicked', this, this.handleChatFrameClick);\n    },\n\n    navMenuMap: Ember.computed('menuStructure', function () {\n        return createMenuMap(this.get('menuStructure'));\n    }),\n\n    searchId: Ember.computed('elementId', function () {\n        return `${this.get('elementId')}-search`;\n    }),\n    isQuerySpecifiedWithResults: Ember.computed('query', 'empty', 'performSuggestSearchTask.isIdle', function () {\n        return this.get('query') && !this.get('empty') && this.get('performSuggestSearchTask.isIdle');\n    }),\n    _onInputFocusBound: null as any,\n    _onOutsideClickBound: null as any,\n    _onOutsideFocusBound: null as any,\n    _onResizeBound: null as any,\n\n    attachListeners: Ember.on('didInsertElement', function (this: any) {\n        this._onInputFocusBound = Ember.run.bind(this, this.onInputFocus);\n        this._onOutsideClickBound = Ember.run.bind(this, this.detectOutsideClick);\n        this._onOutsideFocusBound = Ember.run.bind(this, this.detectOutsideFocus);\n\n        const input = this.element.querySelector('input');\n        if (input) {\n            input.addEventListener('focus', this._onInputFocusBound);\n        }\n        window.addEventListener('click', this._onOutsideClickBound);\n        window.addEventListener('keyup', this._onOutsideFocusBound);\n    }),\n    removeListeners: Ember.on('willDestroyElement', function (this: any) {\n        const input = this.element.querySelector('input');\n        if (input) {\n            input.removeEventListener('focus', this._onInputFocusBound);\n        }\n        window.removeEventListener('click', this._onOutsideClickBound);\n        window.removeEventListener('keyup', this._onOutsideFocusBound);\n        window.removeEventListener('resize', this._onResizeBound);\n        this.get('chatFrame').off('collaborateChatFrameClicked', this, this.handleChatFrameClick);\n    }),\n    handleChatFrameClick(evt: any) {\n        this.detectOutsideClick(evt);\n    },\n    click(event: any) {\n        const target = event.target as HTMLElement;\n        const nameClicked = target.matches('.name');\n        const pageResultClicked = !!target.closest('.page-results');\n        const isChat = target.matches('.btn-chat') || !!target.closest('.btn-chat');\n        const isFavorite = target.matches('.btn-favorite') || !!target.closest('.btn-favorite');\n        const isDropdown = target.matches('.btn-dropdown') || !!target.closest('.btn-dropdown');\n        const entityContactClicked = (!!target.closest('.entity-contact') && !isFavorite && !isDropdown) || isChat;\n        if (entityContactClicked || nameClicked || pageResultClicked) {\n            this.set('dismissed', true);\n        }\n    },\n    onInputFocus(event: any) {\n        this.set('submittingSearch', false);\n        let query = this.get('query');\n        // Only dismiss on focus if there's genuinely nothing to show.\n        // Don't dismiss mid-typing — that causes flicker as the panel\n        // disappears and reappears while the search tasks run.\n        if ((_.isEmpty(query) || query.length < 2) && !this.get('pageSearchResultsAll').length) {\n            this.set('dismissed', true);\n        }\n        this.get('suggestSearchTask').perform();\n        // Select All on focus\n        const input = event.target as HTMLInputElement;\n        input.addEventListener(\n            'mouseup',\n            () => {\n                input.select();\n            },\n            { once: true }\n        );\n        input.select();\n    },\n    detectOutsideClick(event: any) {\n        const target = event.target as HTMLElement;\n        if (\n            !target.closest('.global-search-field') &&\n            !target.closest('.global-search-button') &&\n            !target.closest('.global-search-bar-with-overlay')\n        ) {\n            this.set('dismissed', true);\n            this.sendAction('navigateToSearchButton', '');\n            this.get('performSuggestSearchTask').cancelAll();\n        } else {\n            this.click(event); // run internal click logic\n        }\n    },\n    detectOutsideFocus(event: any) {\n        if (!(event.code === 'Tab' || event.code === 'Escape')) return;\n        const target = event.target as HTMLElement;\n        const input = this.element.querySelector('input');\n        if (target === input) return; // if we are in the input we should focus into search\n\n        if (\n            !target.closest('.global-search-field') &&\n            !target.closest('.global-search-button') &&\n            !target.closest('.global-search-bar-with-overlay')\n        ) {\n            this.set('dismissed', true);\n            this.sendAction('navigateToSearchButton', '');\n            this.get('performSuggestSearchTask').cancelAll();\n        }\n    },\n    _tetherPosition() {\n        //@ts-ignore\n        window.Tether.position();\n    },\n    focusResults() {\n        const input = this.element.querySelector('input') as HTMLInputElement;\n        if (!input) {\n            return;\n        }\n        // We only focus results if you aren't selecting content to edit\n        if (\n            input.selectionStart !== undefined &&\n            input.selectionEnd !== undefined &&\n            input.selectionEnd === input.selectionStart\n        ) {\n            doFocus(Ember, '.suggest-results .entity:first-child');\n        }\n    }\n});\n","import Ember from 'ember';\nimport { inject } from '@ember/service';\nimport { addPageAction } from 'web-directory/utils/newrelic';\nimport { MenuMapDefinition } from 'web-directory/utils/command-nav';\nimport { Maybe } from 'web-directory/types';\n\nexport default Ember.Component.extend({\n    classNames: ['page-results'],\n\n    commandNav: inject('command-nav'),\n\n    /**\n     * inherits the string value of the page result's title\n     */\n    parent: null,\n    _result: null as Maybe<MenuMapDefinition>,\n\n    actions: {\n        selectPage(targetRoute: string, e: MouseEvent) {\n            e.preventDefault();\n            addPageAction('searchNavigate', {\n                option: targetRoute\n            });\n\n            // if we're selecting the page result for Agent Workspace, don't navigate anywhere, just open the panel\n            if (this.get('_result')?.title === 'navBar.commandView.workspace.subMenu.agentWorkspace') {\n                this.get('commandNav').selectPanel('agent', true);\n            } else if (!!targetRoute) {\n                const router = Ember.getOwner(this).lookup('router:main');\n                if (this.get('_result')?.externalLink) {\n                    window.open(targetRoute, '_blank');\n                } else {\n                    router.transitionTo(targetRoute.substring(1));\n                }\n            }\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"Gl+NtMCI\",\"block\":\"[[[10,3],[14,0,\\\"page-result-link\\\"],[15,6,[36,0]],[15,\\\"target\\\",[52,[28,[37,2],[[33,3,[\\\"externalLink\\\"]],true],null],\\\"_blank\\\",\\\"\\\"]],[15,\\\"onclick\\\",[28,[37,4],[[30,0],\\\"selectPage\\\",[33,0]],null]],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"pages-result-item\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"pages-image-icon-container\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"file-text-icon-container\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"file-text-icon\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"file-text\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"page-text-content\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"page-path\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,5],[[[1,\\\"                    \\\"],[10,0],[12],[1,[28,[35,6],[[33,5]],null]],[1,\\\" > \\\"],[1,[28,[35,6],[[33,7]],null]],[1,\\\" > \\\"],[1,[28,[35,6],[[33,8]],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,0],[12],[1,[28,[35,6],[[33,7]],null]],[1,\\\" > \\\"],[1,[28,[35,6],[[33,8]],null]],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"page-title\\\"],[12],[1,[28,[35,6],[[33,8]],null]],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"pageLink\\\",\\\"if\\\",\\\"eq\\\",\\\"_result\\\",\\\"action\\\",\\\"topParent\\\",\\\"t\\\",\\\"parent\\\",\\\"pageTitle\\\"]]\",\"moduleName\":\"web-directory/components/command-global-search/page-result/template.hbs\",\"isStrictMode\":false});","// import Ember from 'ember';\nimport { eventToString } from 'web-directory/utils/keystroke';\nimport Component from '@ember/component';\n\nexport default Component.extend({\n    tabindex: 0,\n    classNames: ['entity'],\n    classNameBindings: ['entity.groupType:group-entity:person-entity'],\n    attributeBindings: ['tabindex'],\n    entity: null,\n    keyDown(this: any, event: any) {\n        const key = eventToString(event);\n        switch (key) {\n            case 'ENTER':\n                event.preventDefault();\n                this.bubbleAction({ action: 'collapse' });\n                this.bubbleAction({\n                    action: 'transitionToRoute',\n                    actionContext: [`/${this.get('entity.groupType') ? 'group' : 'person'}-v2/${this.get('entity.id')}`]\n                });\n                return;\n            case 'C':\n                event.preventDefault();\n                this.bubbleAction({ action: 'collapse' });\n                this.bubbleAction({\n                    action: 'openChatRoom',\n                    actionContext: [this.get('entity.jid')]\n                });\n                return;\n            case 'V':\n                event.preventDefault();\n                this.bubbleAction({ action: 'collapse' });\n                this.bubbleAction({\n                    action: 'openChatRoomWithVideo',\n                    actionContext: [this.get('entity.jid')]\n                });\n                return;\n            case 'DOWN_ARROW':\n                event.preventDefault();\n                this.$().next().trigger('focus');\n                return;\n            case 'UP_ARROW':\n                event.preventDefault();\n                this.$().prev().trigger('focus');\n                return;\n            case 'ESCAPE':\n                event.preventDefault();\n                if (this.dismiss) {\n                    this.dismiss();\n                }\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"g1gTYTZ6\",\"block\":\"[[[1,[28,[35,0],null,[[\\\"entity\\\"],[[33,1]]]]]],[],false,[\\\"entity-mini/default\\\",\\\"entity\\\"]]\",\"moduleName\":\"web-directory/components/command-global-search/search-result/template.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"IfqTuwom\",\"block\":\"[[[10,\\\"gux-form-beta\\\"],[14,0,\\\"global-search-field\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"global-search-field-container\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-form-field-search\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[14,0,\\\"sr-only\\\"],[14,\\\"for\\\",\\\"search-field\\\"],[12],[1,[34,0]],[13],[1,\\\"\\\\n            \\\"],[10,\\\"input\\\"],[14,1,\\\"search-field\\\"],[14,\\\"slot\\\",\\\"input\\\"],[14,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"oninput\\\",[28,[37,1],[[30,0],\\\"handleSearchInput\\\"],[[\\\"value\\\"],[\\\"target.value\\\"]]]],[15,\\\"placeholder\\\",[28,[37,2],[\\\"search.placeholderText\\\"],null]],[14,0,\\\"global-search-field\\\"],[14,\\\"autocomplete\\\",\\\"off\\\"],[14,4,\\\"search\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[15,0,[29,[\\\"command-global-search-results \\\",[52,[33,4],\\\"hidden\\\"]]]],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"results suggest-results\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"search-results-pages-header entity\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"pages-text-content\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"file-text-icon\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"file-text\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,1],[14,0,\\\"sr-only\\\"],[14,\\\"role\\\",\\\"alert\\\"],[14,\\\"aria-live\\\",\\\"polite\\\"],[12],[1,[28,[35,2],[[52,[33,5],\\\"components.navMenu.pageResults\\\",\\\"components.navMenu.pageResult\\\"]],[[\\\"count\\\"],[[33,6,[\\\"length\\\"]]]]]],[13],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"pages-text\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,6,[\\\"length\\\"]],[[[1,\\\"                            \\\"],[1,[28,[35,2],[\\\"search.pagesCount\\\"],[[\\\"count\\\"],[[33,6,[\\\"length\\\"]]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[1,[28,[35,2],[\\\"search.pagesCount\\\"],[[\\\"count\\\"],[\\\"0\\\"]]]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"hr\\\"],[12],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,7],[[33,8],[33,6,[\\\"length\\\"]]],null],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"show-all-pages\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-button\\\"],[14,\\\"accent\\\",\\\"inline\\\"],[15,\\\"onclick\\\",[28,[37,1],[[30,0],\\\"togglePageResultsDisplay\\\"],null]],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,9],[[33,10]],null],[[[1,\\\"                                \\\"],[1,[28,[35,2],[\\\"search.viewAllPages\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                \\\"],[1,[28,[35,2],[\\\"search.showLessPages\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,7],[[33,11,[\\\"length\\\"]],[28,[37,9],[[33,10]],null]],null],[[[42,[28,[37,13],[[28,[37,13],[[33,11]],null]],null],null,[[[1,\\\"                    \\\"],[1,[28,[35,14],null,[[\\\"_result\\\",\\\"pageTitle\\\",\\\"pageLink\\\",\\\"parent\\\",\\\"topParent\\\"],[[30,1],[30,1,[\\\"title\\\"]],[30,1,[\\\"link\\\"]],[30,1,[\\\"parentFolder\\\"]],[30,1,[\\\"topParentFolder\\\"]]]]]],[1,\\\"\\\\n\\\"]],[1]],null]],[]],[[[41,[28,[37,7],[[33,6,[\\\"length\\\"]],[33,10]],null],[[[42,[28,[37,13],[[28,[37,13],[[33,6]],null]],null],null,[[[1,\\\"                    \\\"],[1,[28,[35,14],null,[[\\\"_result\\\",\\\"pageTitle\\\",\\\"pageLink\\\",\\\"parent\\\",\\\"topParent\\\"],[[30,2],[30,2,[\\\"title\\\"]],[30,2,[\\\"link\\\"]],[30,2,[\\\"parentFolder\\\"]],[30,2,[\\\"topParentFolder\\\"]]]]]],[1,\\\"\\\\n\\\"]],[2]],null]],[]],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"pages no-results\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,2],[14,0,\\\"text-center\\\"],[14,\\\"role\\\",\\\"alert\\\"],[14,\\\"aria-live\\\",\\\"assertive\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,2],[\\\"search.noPageResultsLonger\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"]],[]]]],[]]],[1,\\\"            \\\"],[10,0],[14,0,\\\"search-results-directory-header entity\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"directory-text-content\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"user-circle-icon\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"user-circle\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"directory-text\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,2],[\\\"components.navMenu.directory\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"hr\\\"],[12],[13],[1,\\\"\\\\n\\\"],[41,[33,15,[\\\"canViewDirectory\\\"]],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"show-all-directory\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-link-beta\\\"],[14,\\\"size\\\",\\\"small\\\"],[15,\\\"onclick\\\",[28,[37,1],[[30,0],[28,[37,16],[[33,17]],null]],null]],[12],[1,\\\"\\\\n                            \\\"],[10,3],[14,6,\\\"#\\\"],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,2],[\\\"search.viewAllDirectory\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,18],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"has-results\\\"],[14,\\\"role\\\",\\\"alert\\\"],[14,\\\"aria-live\\\",\\\"polite\\\"],[15,\\\"aria-label\\\",[29,[[28,[37,2],[[52,[33,19],\\\"components.navMenu.directoryResults\\\",\\\"components.navMenu.directoryResult\\\"]],[[\\\"count\\\"],[[33,20]]]]]]],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,13],[[28,[37,13],[[33,18]],null]],null],null,[[[1,\\\"                        \\\"],[1,[28,[35,21],null,[[\\\"entity\\\",\\\"dismiss\\\"],[[30,3],[28,[37,1],[[30,0],\\\"dismiss\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[3]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"no-results\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,2],[14,0,\\\"text-center\\\"],[14,\\\"role\\\",\\\"alert\\\"],[14,\\\"aria-live\\\",\\\"assertive\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,2],[\\\"search.noDirectoryResultsLonger\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[\\\"searchResult\\\",\\\"searchResult\\\",\\\"entity\\\"],false,[\\\"label\\\",\\\"action\\\",\\\"t\\\",\\\"if\\\",\\\"dismissed\\\",\\\"pageCountPlural\\\",\\\"pageSearchResultsAll\\\",\\\"and\\\",\\\"moreThanFourResults\\\",\\\"not\\\",\\\"viewAllPageResults\\\",\\\"pageSearchResults4\\\",\\\"each\\\",\\\"-track-array\\\",\\\"command-global-search/page-result\\\",\\\"permissions\\\",\\\"perform\\\",\\\"submitSearch\\\",\\\"results\\\",\\\"directoryCountPlural\\\",\\\"directoryCount\\\",\\\"command-global-search/search-result\\\"]]\",\"moduleName\":\"web-directory/components/command-global-search/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed, observer } from '@ember/object';\nimport ComputedProperty from '@ember/object/computed';\nimport { inject } from '@ember/service';\nimport { RESET_NAV, TOGGLE_NAV_EVENT, TOGGLE_SUBNAV_EVENT } from 'web-directory/services/events';\nimport { getEvaluator } from 'boon-js';\nimport { MenuDefinition, NavMenu } from './navMenu';\nimport { evaluateProviderExpression } from 'web-directory/utils/navigation-provider-expression-evaluator';\nimport { Maybe } from 'web-directory/types';\nimport { run } from '@ember/runloop';\nimport { addPageAction } from 'web-directory/utils/newrelic';\nimport { getMatchingLinks, findBestMatchingLink } from 'web-directory/utils/command-nav';\n\nconst GENERAL_APP_FEATURE_CATEGORY = 'GENERAL';\n\nexport type AppItems = {\n    [key: string]: [AppItem];\n};\n\nexport type AppItem = {\n    className: string;\n    label: string;\n    route: {\n        name: string;\n        segment: string;\n    };\n};\n\n/**\n * Crude object copy since our old version of chromium\n * doesn't support `structuredClone`.\n */\nfunction duplicateObject<T>(obj: T): T {\n    return JSON.parse(JSON.stringify(obj));\n}\n\nexport default Component.extend({\n    classNames: ['command-nav'],\n    classNameBindings: ['subMenuOnly:submenu-only'],\n\n    events: inject('events'),\n    permissions: inject('permissions'),\n    session: inject('session'),\n    intl: inject('intl'),\n    apps: inject('apps'),\n    adminui: inject('adminui'),\n    frameService: inject('center-stage-frame'),\n    logger: inject('stash-logger'),\n    commandNav: inject('command-nav'),\n\n    /**\n     * @attribute\n     * Flag indicating if the main nav view is narrow.\n     */\n    narrowWidth: null as Maybe<boolean>,\n\n    /**\n     * @attribute\n     * Flag indicating navigation sidebar is open/closed.\n     */\n    navIsOpen: false,\n\n    /**\n     * @attribute\n     * Flag indicating navigation sidebar subnav is open/closed.\n     */\n    subNavIsOpen: false,\n\n    /**\n     * true/false if the user clicks the return button\n     * subMenuOnly needs to know if the subMenu should close\n     */\n    selectReturn: false,\n\n    /**\n     * AppItem definitions fetched on init\n     */\n    appMenuItemsByFeatureCategory: null as Maybe<AppItems>,\n\n    init() {\n        this._super(...arguments);\n        this._buildAppMenuItems();\n        this.get('events').on(RESET_NAV, this, this.returnMainHandler.bind(this));\n    },\n\n    willDestroyElement() {\n        this.get('events').off(RESET_NAV, this, this.returnMainHandler);\n        this._super(...arguments);\n    },\n\n    /**\n     * current URL from the router, in hash form\n     */\n    hashProperty: computed('commandNav._router.currentURL', function () {\n        return `#${this.get('commandNav._router.currentURL')}`;\n    }),\n\n    /**\n     * User-selected menu (drawer) that is currently active\n     * used by computed to identify when there is an \"in process\" selection\n     */\n    selectedMenu: null as Maybe<MenuDefinition>,\n\n    /**\n     * usually matches the active link except when the user\n     * is in the process of making a menu selection\n     */\n    selectedLink: computed('activeLink', 'selectedMenu', 'topMenuLinks', function (): Maybe<string> {\n        const activeLink = this.get('activeLink');\n        const topLevelLink = this.get('topMenuLinks');\n        if (this.get('selectedMenu') && topLevelLink.includes(activeLink)) {\n            return null;\n        } else {\n            return activeLink;\n        }\n    }),\n\n    activeLink: computed.readOnly('_activeLink') as ComputedProperty<string | null | undefined>,\n\n    /**\n     * contains the computed active page link based on hash\n     */\n    _activeLink: computed(\n        'navIsOpen',\n        'hashProperty',\n        'commandNav.currentPanel',\n        'commandNav.expanded',\n        'menuStructure',\n        'topMenuLinks',\n        function (): Maybe<string> {\n            const hashValue = this.get('hashProperty');\n            const availableMenuItems = this.get('menuStructure');\n            const agentPanelOpen = this.get('commandNav').get('currentPanel') === 'agent';\n\n            //check top level menu links\n            if (this.get('topMenuLinks').includes(hashValue) && !agentPanelOpen) {\n                return hashValue;\n            }\n\n            //check agent-ui panel\n            if (this.get('commandNav').get('expanded') && agentPanelOpen) {\n                const agentPanelActive = this.checkAgentPanel(availableMenuItems);\n                if (agentPanelActive) {\n                    return '#/agent-ui';\n                }\n            }\n            //check all other links\n            const matchingLinks: MenuDefinition[] = getMatchingLinks(availableMenuItems, hashValue);\n            if (matchingLinks.length == 1) {\n                return matchingLinks[0].link;\n            } else if (matchingLinks.length > 1) {\n                return findBestMatchingLink(matchingLinks, hashValue);\n            }\n            return null;\n        }\n    ),\n\n    /**\n     * menu (drawer) that is currently active\n     */\n    activeMenu: computed('activeLink', 'selectedMenu', 'menuStructure', 'selectReturn', 'topMenuLinks', function ():\n        | MenuDefinition\n        | null\n        | undefined {\n        if (this.get('selectReturn') && !this.get('selectedMenu')) {\n            return null;\n        }\n        if (this.get('selectedMenu')) {\n            return this.get('selectedMenu');\n        }\n        const availableMenuItems: MenuDefinition[] = this.get('menuStructure');\n        const activeLink = this.get('activeLink');\n        const agentPanelOpen = this.get('commandNav').get('currentPanel') === 'agent';\n        if ((this.get('topMenuLinks').includes(activeLink) || activeLink == null) && !agentPanelOpen) {\n            return null;\n        }\n        if (this.get('commandNav').get('expanded') && agentPanelOpen) {\n            const agentPanelActive: MenuDefinition | undefined | null = this.checkAgentPanel(availableMenuItems);\n            if (agentPanelActive) {\n                return agentPanelActive;\n            }\n            return null;\n        }\n        return this.getSelectedMenu(availableMenuItems, activeLink, null);\n    }),\n\n    checkAgentPanel(availableMenuItems: MenuDefinition[]) {\n        const menu = availableMenuItems.find((menuItem: MenuDefinition) => {\n            const subMenu = menuItem?.subMenu;\n            if (subMenu) {\n                return subMenu[0].link === '#/agent-ui';\n            }\n\n            return false;\n        });\n\n        return menu || null;\n    },\n\n    getSelectedMenu(availableMenuItems: MenuDefinition[], activeLink: string, selectedSubMenu: MenuDefinition | null) {\n        let selectedMenu = selectedSubMenu;\n        availableMenuItems.forEach((menuItem: MenuDefinition) => {\n            if (menuItem.subMenu) {\n                menuItem.subMenu.forEach(subMenuItem => {\n                    if (subMenuItem.link == activeLink) {\n                        selectedMenu = menuItem;\n                    } else if (subMenuItem.subMenu) {\n                        subMenuItem.subMenu.forEach(subSubMenuItem => {\n                            if (subSubMenuItem.link == activeLink) {\n                                selectedMenu = menuItem;\n                            }\n                        });\n                    }\n                });\n            }\n        });\n        return selectedMenu;\n    },\n\n    /**\n     * checks if only the subMenu should be showing on the navigation menu\n     */\n    subMenuOnly: computed('selectedLink', 'selectReturn', 'topMenuLinks', function () {\n        const topLevelLinks = this.get('topMenuLinks');\n        const selectedLink = this.get('selectedLink');\n        return !!(this.get('selectedLink') && !this.get('selectReturn') && !topLevelLinks.includes(selectedLink));\n    }),\n\n    /**\n     * Parses a MenuDefinition's hide expression into a boolean\n     * @returns\n     * @param expression\n     */\n    evaluateExpression(expression: string | undefined) {\n        if (!expression) return true;\n\n        try {\n            const session = this.get('session');\n            const permissions = this.get('permissions');\n            const shouldHideExp = evaluateProviderExpression(expression ?? 'bool:false', permissions, session);\n            const evaluator = getEvaluator(expression ?? 'bool:false');\n            return !evaluator(shouldHideExp);\n        } catch (err) {\n            this.get('logger').error('Menu: Attempted to evaluate unknown bool expression.', {\n                errorInfo: { expression }\n            });\n        }\n\n        // hide the item if the expression was present but\n        // wasn't parsable\n        return false;\n    },\n\n    /**\n     * Evaluate a given MenuDefinition for output to UI.\n     * @param menu MenuDefinition to evaluate\n     * @returns A new MenuDefinition filtered for access\n     */\n    evaluateMenu(menu: MenuDefinition[]) {\n        const _menu = duplicateObject(menu);\n\n        return _menu.reduce((acc, curr) => {\n            const shouldShow = this.evaluateExpression(curr.hide);\n\n            // if show expression is falsey\n            if (!shouldShow) return acc;\n\n            // if item has no submenu, add the entry\n            // to the output array.\n            if (!curr.subMenu) {\n                // if this is the Profile entry, update the link with specific URL\n                if (curr.title == 'navBar.commandView.profile') {\n                    const profileRoute = 'person-v2';\n                    curr.link = `#/${profileRoute}/${this.get('session').get('user').get('id')}`;\n                }\n                acc.push(curr);\n            }\n\n            // if item does have a submenu, evaluate it\n            const evaluatedSubMenu = !!curr.subMenu ? this.evaluateMenu(curr.subMenu) : [];\n\n            // if array is empty, ignore it\n            if (!evaluatedSubMenu.length) return acc;\n\n            // if array is not empty, create a copy with\n            // the modified subMenu and add it to menu\n            const tempMenuItem = Object.assign(duplicateObject(curr), { subMenu: evaluatedSubMenu });\n            acc.push(tempMenuItem);\n\n            return acc;\n        }, [] as MenuDefinition[]);\n    },\n\n    /**\n     * Translate the AppsItems object into a MenuDefinition\n     * @param appItems AppItems that were active for the user\n     * @returns A MenuDefinition for Apps\n     */\n    evaluateApps(appItems: AppItems): Maybe<MenuDefinition> {\n        const appMenuItemKeys = Object.keys(appItems);\n        const appsSubMenu: MenuDefinition[] = [];\n\n        appMenuItemKeys.forEach(itemKey => {\n            appItems[itemKey].forEach(appItem => {\n                appsSubMenu.push({\n                    title: appItem.label,\n                    link: '#/apps/' + appItem.route.segment\n                });\n            });\n        });\n\n        if (appsSubMenu.length > 0) {\n            return {\n                title: 'navBar.commandView.apps.title',\n                icon: 'toolbar-apps',\n                subMenu: appsSubMenu\n            } as MenuDefinition;\n        }\n\n        return null;\n    },\n\n    /**\n     * gets Toplevel Menu Item Links (no child, no parent)\n     */\n    topMenuLinks: computed<(string | undefined)[]>('menuStructure', function () {\n        const availableMenuItems: MenuDefinition[] = this.get('menuStructure');\n        return availableMenuItems.filter(item => !item.subMenu && item.link != null).map(item => item.link);\n    }),\n\n    /**\n     * Computes a filtered MenuDefinition with feature/permission changes.\n     */\n    menuStructure: computed<MenuDefinition[]>(\n        'session.{features,person}',\n        'permissions.{rolePermissions,donutPermissions,allowedOrgPermissions}',\n        'appsMenuStructure',\n        function () {\n            return [].concat(this.evaluateMenu(NavMenu), this.get('appsMenuStructure'));\n        }\n    ),\n\n    /**\n     * Computes the app menu definition entry\n     */\n    appsMenuStructure: computed<MenuDefinition>('appMenuItemsByFeatureCategory', function () {\n        const appItems: Maybe<AppItems> = this.get('appMenuItemsByFeatureCategory');\n        if (!appItems) return [];\n\n        return this.evaluateApps(appItems);\n    }),\n\n    /**\n     * Title of menu that is currently active.\n     */\n    selectedTitle: computed('activeMenu', function () {\n        return this.get('activeMenu') ? this.get('intl').t(this.get('activeMenu.title')) : '';\n    }),\n\n    _appsEnvChanged: observer('session.isAuthenticated', function (this: any) {\n        this._buildAppMenuItems();\n    }),\n\n    _buildAppMenuItems(this: any) {\n        // Only fetch when authenticated for orgId, etc\n        if (this.get('session.isAuthenticated')) {\n            run.once(this, function (this: any) {\n                this.get('apps.standaloneAppPool')\n                    .findAllApps()\n                    .then((standaloneApps: any) => {\n                        let appMenuItemsByCategory = {};\n\n                        if (standaloneApps && standaloneApps.length > 0) {\n                            standaloneApps\n                                .sort((menuItem1: any, menuItem2: any) => {\n                                    return menuItem1.get('name').localeCompare(menuItem2.get('name'));\n                                })\n                                .reduce((result: any, currApp: any) => {\n                                    let currCategory = currApp.get('featureCategory') || GENERAL_APP_FEATURE_CATEGORY;\n                                    let currAppEntry = {\n                                        className: `menu-app-${currApp.get('id')}`,\n                                        label: currApp.get('name'),\n                                        route: {\n                                            name: 'third-party.app-embed',\n                                            segment: currApp.get('id')\n                                        }\n                                    };\n\n                                    if (Object.prototype.hasOwnProperty.call(result, currCategory)) {\n                                        result[currCategory].push(currAppEntry);\n                                    } else {\n                                        result[currCategory] = [currAppEntry];\n                                    }\n\n                                    return result;\n                                }, appMenuItemsByCategory);\n\n                            // Publish the flat list of standalone app id/name pairs\n                            // to the command-nav service so other services (e.g. application)\n                            // can use them for page title resolution.\n                            this.get('commandNav').set(\n                                'standaloneApps',\n                                standaloneApps.map((app: any) => ({\n                                    id: app.get('id'),\n                                    name: app.get('name')\n                                }))\n                            );\n                        } else {\n                            this.get('commandNav').set('standaloneApps', []);\n                        }\n                        if (Object.keys(appMenuItemsByCategory).length > 0) {\n                            this.set('appMenuItemsByFeatureCategory', appMenuItemsByCategory);\n                        }\n                    })\n                    .catch((reason: any) => {\n                        this.Logger.error('Failed to fetch standalone apps for menu', reason);\n                        this.set('appMenuItemsByFeatureCategory', null);\n                    });\n            });\n        } else {\n            this.set('appMenuItemsByFeatureCategory', null);\n        }\n    },\n\n    returnMainHandler(previousMenuTitle?: string | null) {\n        const wasSubMenuOnly = this.get('subMenuOnly');\n\n        this.get('events').triggerEvent(TOGGLE_SUBNAV_EVENT, { open: false });\n        this.set('subNavIsOpen', false);\n        this.set('selectedMenu', null);\n\n        // When returning from subMenuOnly the main nav is closed,\n        // so the top-level menu buttons are not in the DOM.\n        // Open the nav first so they render, then move focus to the parent item.\n        if (wasSubMenuOnly) {\n            this.get('events').triggerEvent(TOGGLE_NAV_EVENT, { open: true });\n        }\n\n        if (previousMenuTitle) {\n            run.schedule('afterRender', this, function () {\n                const menuButton = document.getElementById(previousMenuTitle);\n                if (menuButton) {\n                    menuButton.focus();\n                }\n            });\n        }\n    },\n\n    manageViewWidth() {\n        if (this.get('narrowWidth')) {\n            this.get('events').triggerEvent(TOGGLE_NAV_EVENT, { open: false });\n        }\n    },\n\n    managePanel() {\n        const expanded = this.get('commandNav').get('expanded');\n        const currentPanel = this.get('commandNav').get('currentPanel');\n        if (expanded) {\n            if (currentPanel === 'agent') {\n                this.get('commandNav').selectPanel('panel-not-active');\n                this.get('commandNav').set('expanded', false);\n            } else if (currentPanel === 'chats') {\n                this.get('commandNav').set('expanded', false);\n            }\n        }\n    },\n\n    actions: {\n        /**\n         * @action\n         * Request to close the navigation drawer\n         */\n        closeNav() {\n            this.get('events').triggerEvent(TOGGLE_NAV_EVENT, { open: false });\n        },\n\n        /**\n         * @action\n         * Request to open/close the navigation drawer\n         */\n        toggleNav() {\n            this.set('selectedMenu', null);\n            //clears state of selectReturn for subMenuOnly computed\n            this.set('selectReturn', false);\n            this.get('events').triggerEvent(TOGGLE_NAV_EVENT, { open: !this.get('navIsOpen') });\n            if (this.get('navIsOpen') == true) {\n                this.get('events').triggerEvent(TOGGLE_SUBNAV_EVENT, { open: false });\n            } else if (\n                this.get('navIsOpen') == false &&\n                this.get('activeMenu') !== null &&\n                this.get('subMenuOnly') == false\n            ) {\n                this.get('events').triggerEvent(TOGGLE_SUBNAV_EVENT, { open: true });\n            }\n        },\n\n        /**\n         * @action\n         * Select a menu with the navigation drawer\n         * @param menu the MenuDefinition to select\n         * @param selectedMenu\n         */\n        selectMenu(menu: MenuDefinition, selectedMenu?: string) {\n            if (selectedMenu == 'selected') {\n                this.returnMainHandler();\n            } else {\n                this.get('events').triggerEvent(TOGGLE_SUBNAV_EVENT, { open: true });\n                this.set('selectedMenu', menu);\n                this.get('frameService').set('pageTitle', null);\n                this.get('adminui').set('currentPageCrumbs', null);\n            }\n        },\n\n        /**\n         * @action\n         * action that sets navigation state\n         * when selecting a navigation entry.\n         * @param menuItem the MenuDefinition to select\n         */\n        handleLinkAction(menuItem: MenuDefinition) {\n            addPageAction('menuNavigate', {\n                option: menuItem.link\n            });\n\n            this.get('events').triggerEvent(TOGGLE_SUBNAV_EVENT, { open: false });\n            this.get('frameService').set('pageTitle', null);\n            this.get('adminui').set('currentPageCrumbs', null);\n\n            //submenuOnly needs to know if the user clicks the return button\n            this.set('selectReturn', false);\n            this.set('selectedMenu', null);\n\n            // Hacky logic so that the Agent UI panel reacts\n            // like a routable view. The panel state supports\n            // split screen renders with other mainstage content.\n            if (menuItem.link === '#/agent-ui') {\n                this.get('commandNav').selectPanel('agent', true);\n                this.manageViewWidth();\n                return false;\n            }\n\n            this.managePanel();\n            this.manageViewWidth();\n\n            return true;\n        },\n\n        /**\n         * @action\n         * action that sets navigation state for activity\n         */\n        handleActivityLinkAction() {\n            addPageAction('menuNavigate', {\n                option: 'activity'\n            });\n\n            //submenuOnly needs to know if the user clicks the return button\n            this.set('selectReturn', false);\n\n            this.returnMainHandler();\n            this.managePanel();\n            this.manageViewWidth();\n\n            return true;\n        },\n\n        /**\n         * @action\n         * action that resets the state of the\n         * menu container to show the top-level nav\n         */\n        returnMain() {\n            // Capture the active menu title before selectReturn invalidates activeMenu\n            const activeMenu = this.get('activeMenu');\n            const previousMenuTitle = activeMenu ? activeMenu.title : null;\n\n            //submenuOnly needs to know if the user clicks the return button\n            this.set('selectReturn', true);\n            this.returnMainHandler(previousMenuTitle);\n        }\n    }\n});\n","// import { perm, ft, not, or, bool } from 'web-directory/utils/boolean-expressions';\nimport { and, ft, not, or, perm, role } from 'web-directory/utils/boolean-expressions';\n\nexport type MenuDefinition = {\n    title: string;\n    icon?: string;\n    customImageLocation?: string;\n    link?: string;\n    altLink?: string[];\n    subMenu?: MenuDefinition[];\n    hide?: string;\n    externalLink?: boolean;\n    keywords?: string;\n};\n\nexport const NavMenu: MenuDefinition[] = [\n    // -- Top Level Links --\n    // Profile\n    {\n        title: 'navBar.commandView.profile',\n        icon: 'user-circle',\n        link: '#/',\n        hide: or(\n            perm('ui:supervisorActivity:view'),\n            perm('ui:agentActivity:view'),\n            and(ft('WEM-1368_Queue-Performance-Widget'), perm('ui:supervisorQueueDetails:view'))\n        )\n    },\n    // Timeline\n    {\n        title: 'navBar.commandView.activity',\n        icon: 'graph-spark',\n        link: '#/timeline',\n        hide: or(\n            perm('ui:supervisorActivity:view'),\n            perm('ui:agentActivity:view'),\n            and(ft('WEM-1368_Queue-Performance-Widget'), perm('ui:supervisorQueueDetails:view'))\n        ),\n        keywords: 'navBar.pageKeywords.timeline'\n    },\n    // Agent Activity\n    {\n        title: 'navBar.commandView.activity',\n        icon: 'graph-spark',\n        link: '#/activity',\n        hide: not(\n            and(\n                not(ft('WEM-1476_Agent-Activity-Migration')),\n                or(perm('ui:supervisorActivity:view'), perm('ui:agentActivity:view'))\n            )\n        ),\n        keywords: 'navBar.pageKeywords.activity'\n    },\n    // Hub\n    {\n        title: 'navBar.commandView.goHome',\n        icon: 'fa/home-regular',\n        link: '#/home',\n        hide: not(\n            and(\n                ft('WEM-1476_Agent-Activity-Migration'),\n                or(\n                    perm('ui:supervisorActivity:view'),\n                    perm('ui:agentActivity:view'),\n                    and(ft('WEM-1368_Queue-Performance-Widget'), perm('ui:supervisorQueueDetails:view'))\n                )\n            )\n        ),\n        keywords: 'navBar.pageKeywords.activity'\n    },\n    // My Activity\n    {\n        title: 'navBar.commandView.myActivity.title',\n        icon: 'restricted/custom/pulse-user-solid',\n        hide: not(\n            and(\n                ft('WEM-1476_Agent-Activity-Migration'),\n                or(perm('ui:supervisorActivity:view'), perm('ui:agentActivity:view'))\n            )\n        ),\n        subMenu: [\n            // -- Schedule\n            {\n                title: 'navBar.commandView.myActivity.subMenu.schedule',\n                link: '#/activity/schedule',\n                hide: not(and(ft('WEM-1476_Agent-Activity-Migration'), perm('wfm:agentSchedule:view'))),\n                keywords: 'navBar.pageKeywords.activity'\n            },\n\n            // -- Scorecard\n            {\n                title: 'navBar.commandView.myActivity.subMenu.scorecard',\n                link: '#/activity/scorecard',\n                hide: not(and(ft('WEM-1476_Agent-Activity-Migration'), perm('gamification:scorecard:view'))),\n                keywords: 'navBar.pageKeywords.scorecard'\n            },\n\n            // -- Leaderboard\n            {\n                title: 'navBar.commandView.myActivity.subMenu.leaderboard',\n                link: '#/activity/leaderboard',\n                hide: not(and(ft('WEM-1476_Agent-Activity-Migration'), perm('gamification:leaderboard:view'))),\n                keywords: 'navBar.pageKeywords.leaderboard'\n            },\n\n            // -- Schedule Bid\n            {\n                title: 'navBar.commandView.myActivity.subMenu.scheduleBid',\n                link: '#/activity/workplan',\n                hide: not(\n                    and(\n                        ft('WEM-1476_Agent-Activity-Migration'),\n                        or(perm('wfm:agentWorkPlanBid:submit'), perm('wfm:agentScheduleBid:submit'))\n                    )\n                ),\n                keywords: 'navBar.pageKeywords.scheduleBids'\n            }\n        ]\n    },\n    // Workspace (Previously Customer Interactions)\n    {\n        title: 'navBar.commandView.workspace.title',\n        icon: 'fa/headset-solid',\n        subMenu: [\n            // -- Agent Workspace (Agent UI)\n            {\n                title: 'navBar.commandView.workspace.subMenu.agentWorkspace',\n                link: '#/agent-ui',\n                hide: not(perm('routing:agent:onqueue')),\n                keywords: 'navBar.pageKeywords.agentWorkspace'\n            },\n\n            // -- Task List (Workitems Legacy)\n            {\n                title: 'navBar.commandView.workspace.subMenu.taskListWorkitems',\n                link: '#/agent/task-management/workitems',\n                hide: not(\n                    and(\n                        perm('workitems:workitem:view'),\n                        perm('workitems:queryJob:view'),\n                        perm('workitems:queryJob:add'),\n                        perm('workitems:queryJobResults:view'),\n                        not(and(ft('PURE-7203_case_list_ui'), ft('PURE-7203_case_list')))\n                    )\n                ),\n                keywords: 'navBar.pageKeywords.workItems'\n            },\n\n            // -- Workitems\n            {\n                title: 'navBar.commandView.workspace.subMenu.workitems',\n                link: '#/agent/task-management/workitems',\n                hide: not(\n                    and(\n                        perm('workitems:workitem:view'),\n                        perm('workitems:queryJob:view'),\n                        perm('workitems:queryJob:add'),\n                        perm('workitems:queryJobResults:view'),\n                        ft('PURE-7203_case_list_ui'),\n                        ft('PURE-7203_case_list')\n                    )\n                ),\n                keywords: 'navBar.pageKeywords.workItems'\n            },\n\n            // -- Case List\n            {\n                title: 'navBar.commandView.workspace.subMenu.caseList',\n                link: '#/agent/task-management/cases',\n                hide: not(\n                    and(\n                        ft('PURE-7203_case_list_ui'),\n                        ft('PURE-7203_case_list'),\n                        perm('caseManagement:case:view'),\n                        perm('caseManagement:queryJob:add'),\n                        perm('caseManagement:queryJob:view'),\n                        perm('caseManagement:queryJobResults:view')\n                    )\n                ),\n                keywords: 'navBar.pageKeywords.caseList'\n            },\n\n            // -- Parked Conversations\n            {\n                title: 'navBar.commandView.workspace.subMenu.taskListConversations',\n                link: '#/agent/task-management/parked-conversations',\n                hide: not(or(perm('conversation:email:park'), perm('conversation:message:park'))),\n                keywords: 'navBar.pageKeywords.parkedConversations'\n            }\n        ]\n    },\n\n    // Performance Management (previously Supervisor)\n    {\n        title: 'navBar.commandView.performanceManagement.title',\n        icon: 'fa/trophy-regular',\n        customImageLocation: '#fa-trophy-regular',\n        subMenu: [\n            // -- Intraday Management (Monitoring)\n            {\n                title: 'navBar.commandView.performanceManagement.subMenu.intradayManagement',\n                link: '#/admin/wfm/intradayMonitoring',\n                hide: not(perm('wfm:intraday:view')),\n                keywords: 'navBar.pageKeywords.intradayMonitoring'\n            },\n\n            // -- Real-time Adherence\n            {\n                title: 'navBar.commandView.performanceManagement.subMenu.realTimeAdherence',\n                link: '#/admin/wfm/adherence/realtime',\n                hide: not(perm('wfm:realtimeAdherence:view')),\n                keywords: 'navBar.pageKeywords.realtimeAdherence'\n            },\n            // -- Adherence Adjustments\n            {\n                title: 'navBar.commandView.performanceManagement.subMenu.adherenceAdjustments',\n                link: '#/admin/wfm/adherence/adjustments',\n                hide: not(and(ft('WEM-893_Adherence_Adjustments'), perm('wfm:adherenceAdjustments:view'))),\n                keywords: 'navBar.pageKeywords.adherenceAdjustments'\n            },\n            // -- -- Historical Adherence\n            {\n                title: 'navBar.commandView.performanceManagement.subMenu.historicalAdherence',\n                link: '#/admin/wfm/adherence/historicalV2/historical-adherence',\n                hide: not(perm('wfm:historicalAdherence:view'))\n            },\n\n            // -- -- Historical Shrinkage\n            {\n                title: 'navBar.commandView.performanceManagement.subMenu.historicalShrinkage',\n                link: '#/admin/wfm/shrinkage/historical',\n                hide: not(perm('wfm:shrinkage:view'))\n            },\n\n            // -- Employee Engagement\n            {\n                title: 'navBar.commandView.performanceManagement.subMenu.employeeEngagement.title',\n                subMenu: [\n                    // -- -- Development and Feedback\n                    {\n                        title: 'navBar.commandView.performanceManagement.subMenu.employeeEngagement.subMenu.developmentAndFeedback',\n                        link: '#/admin/performance/modules',\n                        hide: not(perm('learning:module:edit')),\n                        keywords: 'navBar.pageKeywords.developmentAndFeedback'\n                    },\n                    // -- -- External Metric Definitions\n                    {\n                        title: 'navBar.commandView.performanceManagement.subMenu.employeeEngagement.subMenu.externalMetricDefinitions',\n                        link: '#/admin/performance/external-metric-definitions',\n                        hide: not(perm('employeePerformance:externalMetricDefinition:view')),\n                        keywords: 'navBar.pageKeywords.externalMetricsDefinitions'\n                    },\n\n                    // -- -- Gamification Settings\n                    {\n                        title: 'navBar.commandView.performanceManagement.subMenu.employeeEngagement.subMenu.gamificationSettings',\n                        link: '#/admin/performance/gamification-settings',\n                        hide: not(perm('gamification:profile:update')),\n                        keywords: 'navBar.pageKeywords.gamificationSettings'\n                    },\n\n                    // -- -- Gamification Profiles\n                    {\n                        title: 'navBar.commandView.performanceManagement.subMenu.employeeEngagement.subMenu.gamificationProfiles',\n                        link: '#/admin/performance/gamification-profiles',\n                        hide: not(perm('gamification:profile:view')),\n                        keywords: 'navBar.pageKeywords.gamificationProfiles'\n                    },\n\n                    // -- -- Gamification Contests\n                    {\n                        title: 'navBar.commandView.performanceManagement.subMenu.employeeEngagement.subMenu.gamificationContests',\n                        link: '#/admin/performance/gamification-contests',\n                        hide: and(not(perm('gamification:contest:viewAll')), not(perm('gamification:contest:view'))),\n                        keywords: 'navBar.pageKeywords.gamificationContests'\n                    },\n\n                    // -- -- Real-Time Supervision Configuration\n                    {\n                        title: 'navBar.commandView.performanceManagement.subMenu.employeeEngagement.subMenu.realTimeSupervision',\n                        link: '#/admin/performance/realtime-supervision',\n                        hide: not(and(ft('WEM-437_screen-monitoring'), perm('realtimeMonitor:settings:view'))),\n                        keywords: 'navBar.pageKeywords.realtimeSupervision'\n                    }\n                ]\n            },\n            // -- -- Decision Metrics\n            {\n                title: 'navBar.commandView.performanceManagement.subMenu.decisionMetrics',\n                link: '#/admin/performance/decisionMetrics',\n                hide: not(and(ft('WEM-1385_DecisionMetrics'), perm('wfm:decisionMetrics:view')))\n            },\n            // -- -- Scorecard Insights\n            {\n                title: 'navBar.commandView.performanceManagement.subMenu.scorecardInsights',\n                link: '#/activity/scorecard-insights',\n                hide: not(and(ft('WEM-1476_Agent-Activity-Migration'), perm('gamification:insights:viewAll'))),\n                keywords: 'navBar.pageKeywords.activity'\n            }\n        ]\n    },\n\n    // Contacts\n    {\n        title: 'navBar.commandView.contacts.title',\n        icon: 'fa/address-book-regular',\n        subMenu: [\n            // -- -- External Contacts and Organizations\n            {\n                title: 'navBar.commandView.contacts.subMenu.externalContactsAndOrgs',\n                link: '#/contactsAndOrganizations',\n                hide: not(\n                    or(perm('externalContacts:contact:view'), perm('externalContacts:externalOrganization:view'))\n                ),\n                keywords: 'navBar.pageKeywords.externalContactsOrganizations'\n            },\n\n            // -- -- Identity Resolution\n            {\n                title: 'navBar.commandView.contacts.subMenu.identityResolution',\n                link: '#/admin/identity-resolution',\n                hide: not(perm('admin'))\n            },\n\n            // -- -- Custom Fields\n            {\n                title: 'navBar.commandView.contacts.subMenu.customFields',\n                link: '#/admin/custom-fields-v2/contacts',\n                altLink: ['#/admin/custom-fields-v2/external-orgs'],\n                hide: not(or(perm('externalContacts:customFields:add'), perm('externalContacts:customFields:edit'))),\n                keywords: 'navBar.pageKeywords.customFields'\n            },\n\n            // -- -- External Sources\n            {\n                title: 'navBar.commandView.contacts.subMenu.externalSources',\n                link: '#/admin/external-sources',\n                hide: not(perm('externalContacts:externalSource:view')),\n                keywords: 'navBar.pageKeywords.externalSources'\n            }\n        ]\n    },\n\n    // Analytics\n    {\n        title: 'navBar.commandView.analytics.title',\n        icon: 'graph-line',\n        subMenu: [\n            // -- Analytics Workspace\n            {\n                title: 'navBar.commandView.analytics.subMenu.analyticsWorkspace',\n                link: '#/analytics',\n                keywords: 'navBar.pageKeywords.analyticsWorkspace'\n            },\n\n            // -- Analytics Explorer\n            {\n                title: 'navBar.commandView.analytics.subMenu.analyticsExplorer',\n                link: '#/analyticsexplorer',\n                hide: not(\n                    and(\n                        ft('PURE-7428_embedded-analytics'),\n                        or(perm('analyticsExplorer:dashboard:view'), perm('analyticsExplorer:dashboard:manage'))\n                    )\n                ),\n                keywords: 'navBar.pageKeywords.analyticsExplorer'\n            },\n\n            // -- -- Analytics Settings\n            {\n                title: 'navBar.commandView.analytics.subMenu.analyticsSettings',\n                link: '#/admin/contact-center/analytics/settings',\n                hide: not(perm('analytics:insightConfigurations:edit')),\n                keywords: 'navBar.pageKeywords.analyticsSettings'\n            },\n\n            // -- -- Anomaly Detection\n            {\n                title: 'navBar.commandView.analytics.subMenu.anomalyDetection',\n                link: '#/admin/anomaly-detection/anomalies',\n                altLink: ['#/admin/anomaly-detection/settings'],\n                hide: not(\n                    and(\n                        ft('WEM-1310_QueueAnomalyDetection'),\n                        perm('signals:queueAnomalySummary:view'),\n                        perm('signals:queueAnomalyQuery:view'),\n                        perm('signals:anomalyDetectionSettings:view'),\n                        perm('signals:anomalyDetectionMonitoredQueues:view')\n                    )\n                )\n            }\n        ]\n    },\n    // -- Journey Management\n    {\n        title: 'navBar.commandView.journeyManagement.title',\n        icon: 'fa/map-location-dot-regular',\n        link: `${window.location.origin}/journey-management`,\n        hide: not(perm('journey:views:view')),\n        externalLink: true,\n        keywords: 'navBar.pageKeywords.journeyManagement'\n    },\n\n    // Orchestration\n    {\n        title: 'navBar.commandView.orchestration.title',\n        icon: 'fa/route-regular',\n        customImageLocation: '#fa-route-regular',\n        subMenu: [\n            // -- Architect\n            {\n                title: 'navBar.commandView.orchestration.subMenu.architect',\n                icon: 'external-link',\n                link: `${window.location.origin}/architect`,\n                hide: not(perm('architect:ui:view')),\n                externalLink: true\n            },\n\n            // -- Flow Assets\n            {\n                title: 'navBar.commandView.orchestration.subMenu.orchestrationAssets.title',\n                subMenu: [\n                    // -- -- Data Tables\n                    {\n                        title: 'navBar.commandView.orchestration.subMenu.orchestrationAssets.subMenu.dataTables',\n                        link: '#/admin/routing/datatables',\n                        hide: not(\n                            or(\n                                perm('architect:datatable:add'),\n                                perm('architect:datatable:delete'),\n                                perm('architect:datatable:edit'),\n                                perm('architect:datatable:view')\n                            )\n                        )\n                    },\n\n                    // -- -- Flow Outcomes\n                    {\n                        title: 'navBar.commandView.orchestration.subMenu.orchestrationAssets.subMenu.flowOutcomes',\n                        link: '#/admin/routing/flowoutcomes',\n                        hide: not(\n                            or(\n                                perm('architect:flowOutcome:add'),\n                                perm('architect:flowOutcome:edit'),\n                                perm('architect:flowOutcome:view')\n                            )\n                        )\n                    },\n\n                    // -- -- Flow Milestones\n                    {\n                        title: 'navBar.commandView.orchestration.subMenu.orchestrationAssets.subMenu.flowMilestones',\n                        link: '#/admin/routing/flowmilestones',\n                        hide: not(\n                            or(\n                                perm('architect:flowMilestone:add'),\n                                perm('architect:flowMilestone:delete'),\n                                perm('architect:flowMilestone:edit'),\n                                perm('architect:flowMilestone:view')\n                            )\n                        )\n                    },\n                    // -- -- Conversation Schemas\n                    {\n                        title: 'frameNav.architect.conversationSchemas',\n                        link: '#/admin/conversation-schemas',\n                        hide: not(\n                            and(\n                                perm('conversation:customAttributes:view'),\n                                perm('conversation:customAttributes:schemaView'),\n                                ft('PURE-5564_CCA')\n                            )\n                        )\n                    }\n                ]\n            },\n\n            // -- AI Sudio\n            {\n                title: 'navBar.commandView.orchestration.subMenu.aiStudio.title',\n                subMenu: [\n                    // -- -- agentic virtual agents\n                    {\n                        title: 'navBar.commandView.orchestration.subMenu.aiStudio.subMenu.agenticVirtualAgents',\n                        link: '#/admin/ai-studio/agentic-virtual-agents',\n                        hide: not(and(perm('agentic:virtualAgent:view'), ft('AI-1365_agentic_virtual_agents')))\n                    },\n                    // -- -- guides\n                    {\n                        title: 'navBar.commandView.orchestration.subMenu.aiStudio.subMenu.guides',\n                        link: '#/admin/ai-studio/guides',\n                        hide: not(perm('aiStudio:guide:view'))\n                    },\n\n                    // -- -- summary workbench\n                    {\n                        title: 'navBar.commandView.orchestration.subMenu.aiStudio.subMenu.summaryWorkbench',\n                        link: '#/admin/ai-studio/summary-workbench',\n                        hide: not(perm('aiStudio:summaryConfig:view'))\n                    },\n\n                    // -- -- Agent Copilots\n                    {\n                        title: 'navBar.commandView.orchestration.subMenu.aiStudio.subMenu.agentCopilots',\n                        link: '#/admin/copilots',\n                        hide: not(perm('assistants:copilot:edit')),\n                        keywords: 'navBar.pageKeywords.agentCopilots'\n                    },\n\n                    // -- -- Copilot Configuration\n                    {\n                        title: 'navBar.commandView.orchestration.subMenu.aiStudio.subMenu.copilotConfiguration',\n                        link: '#/admin/ai-studio/copilot-configuration',\n                        hide: not(\n                            and(\n                                ft('AI-1390_Copilot_Configuration'),\n                                or(perm('audits:audit:view'), perm('copilot:settings:view'))\n                            )\n                        ),\n                        keywords: 'navBar.pageKeywords.copilotConfiguration'\n                    },\n\n                    // -- -- Refine Response\n                    {\n                        title: 'navBar.commandView.orchestration.subMenu.aiStudio.subMenu.refineResponse',\n                        link: '#/admin/ai-studio/refine-response',\n                        hide: not(and(perm('aiStudio:refinementConfig:view'), ft('AI-1402_email_refinement_with_ai')))\n                    }\n                ]\n            },\n\n            // -- Enrichments\n            {\n                title: 'navBar.commandView.orchestration.subMenu.enrichments.title',\n                subMenu: [\n                    // -- -- customer intents\n                    {\n                        title: 'navBar.commandView.orchestration.subMenu.enrichments.subMenu.customerIntents',\n                        link: '#/admin/intent-taxonomy-ui',\n                        hide: not(perm('externalContacts:customerIntentTaxonomy:edit'))\n                    },\n\n                    // -- -- customer segments\n                    {\n                        title: 'navBar.commandView.orchestration.subMenu.enrichments.subMenu.customerSegments',\n                        link: '#/admin/journey/segment',\n                        hide: not(perm('journey:segment:edit')),\n                        keywords: 'navBar.pageKeywords.customerSegments'\n                    },\n\n                    // -- -- Outcomes & Milestones\n                    {\n                        title: 'navBar.commandView.orchestration.subMenu.enrichments.subMenu.outcomesMilestones',\n                        link: '#/admin/outcomes-milestones',\n                        hide: not(\n                            and(perm('externalContacts:outcomesMilestones:view'), ft('PURE-6813_OutcomesMilestones'))\n                        ),\n                        keywords: 'navBar.pageKeywords.outcomesMilestones'\n                    }\n                ]\n            },\n\n            // -- External Event Ingestion\n            {\n                title: 'navBar.commandView.orchestration.subMenu.externalEventIngestion.title',\n                subMenu: [\n                    // -- -- Schemas\n                    {\n                        title: 'navBar.commandView.orchestration.subMenu.externalEventIngestion.subMenu.schemas',\n                        link: '#/admin/external-events/schemas',\n                        hide: not(and(ft('PURE-7071_external-events-ui'), perm('journey:externalEventsSchema:view')))\n                    },\n\n                    // -- -- Configurations\n                    {\n                        title: 'navBar.commandView.orchestration.subMenu.externalEventIngestion.subMenu.configurations',\n                        link: '#/admin/external-events/configurations',\n                        hide: not(\n                            and(ft('PURE-7071_external-events-ui'), perm('journey:externalEventsConfiguration:view'))\n                        )\n                    }\n                ]\n            },\n\n            // -- Predictive Engagement\n            {\n                title: 'navBar.commandView.orchestration.subMenu.predictiveEngagement.title',\n                subMenu: [\n                    // -- -- Live Now\n                    {\n                        title: 'navBar.commandView.orchestration.subMenu.predictiveEngagement.subMenu.liveNow',\n                        link: '#/admin/live-now',\n                        hide: not(perm('journey:recentsessions:view')),\n                        keywords: 'navBar.pageKeywords.liveNow'\n                    },\n\n                    // -- -- Action Maps\n                    {\n                        title: 'navBar.commandView.orchestration.subMenu.predictiveEngagement.subMenu.actionMaps',\n                        link: '#/admin/embed/engagement/action-map',\n                        hide: not(perm('journey:actionmap:edit')),\n                        keywords: 'navBar.pageKeywords.actionMaps'\n                    },\n\n                    // -- -- Action Library\n                    {\n                        title: 'navBar.commandView.orchestration.subMenu.predictiveEngagement.subMenu.actionLibrary',\n                        link: '#/admin/embed/library/action-template',\n                        hide: not(perm('journey:actiontemplate:edit')),\n                        keywords: 'navBar.pageKeywords.actionLibrary'\n                    },\n\n                    // -- -- Predictive Engagement Settings\n                    {\n                        title: 'navBar.commandView.orchestration.subMenu.predictiveEngagement.subMenu.predectiveEngagementSettings',\n                        link: '#/admin/embed/global-settings',\n                        hide: not(perm('journey:settings:edit')),\n                        keywords: 'navBar.pageKeywords.predictiveEngagementSettings'\n                    },\n\n                    // -- -- Visitor Activity Report\n                    {\n                        title: 'navBar.commandView.orchestration.subMenu.predictiveEngagement.subMenu.visitorActivityReport',\n                        link: '#/admin/embed/analytics/visitor-activity',\n                        hide: not(perm('analytics:journeyAggregate:view')),\n                        keywords: 'navBar.pageKeywords.visitorActivityReport'\n                    },\n\n                    // -- -- Action Map Report\n                    {\n                        title: 'navBar.commandView.orchestration.subMenu.predictiveEngagement.subMenu.actionMapReport',\n                        link: '#/admin/embed/analytics/action-map',\n                        hide: not(perm('analytics:journeyAggregate:view')),\n                        keywords: 'navBar.pageKeywords.actionMapReport'\n                    }\n                ]\n            },\n\n            // -- Routing\n            {\n                title: 'navBar.commandView.orchestration.subMenu.routing.title',\n                subMenu: [\n                    // -- -- Call Routing\n                    {\n                        title: 'navBar.commandView.orchestration.subMenu.routing.subMenu.callRouting',\n                        link: '#/admin/routing/ivrs',\n                        hide: not(perm('routing:callRoute:view')),\n                        keywords: 'navBar.pageKeywords.callRouting'\n                    },\n\n                    // -- -- Emergency Groups\n                    {\n                        title: 'navBar.commandView.orchestration.subMenu.routing.subMenu.emergencyGroups',\n                        link: '#/admin/routing/emergency-groups',\n                        hide: not(perm('routing:emergencyGroup:view')),\n                        keywords: 'navBar.pageKeywords.emergencyGroups'\n                    },\n\n                    // -- -- Message Routing\n                    {\n                        title: 'navBar.commandView.orchestration.subMenu.routing.subMenu.messageRouting',\n                        link: '#/admin/routing/sms',\n                        hide: not(perm('routing:message:manage')),\n                        keywords: 'navBar.pageKeywords.messageRouting'\n                    },\n\n                    // -- -- Operating Schedules\n                    {\n                        title: 'navBar.commandView.orchestration.subMenu.routing.subMenu.operatingSchedules',\n                        link: '#/admin/routing/scheduling/schedules',\n                        hide: not(perm('routing:schedule:view')),\n                        keywords: 'navBar.pageKeywords.operatingSchedules'\n                    },\n\n                    // -- -- Operating Schedule Groups\n                    {\n                        title: 'navBar.commandView.orchestration.subMenu.routing.subMenu.operatingScheduleGroups',\n                        link: '#/admin/routing/scheduling/schedule-groups',\n                        hide: not(perm('routing:scheduleGroup:view')),\n                        keywords: 'navBar.pageKeywords.operatingScheduleGroups'\n                    },\n\n                    // -- -- Revenue KPIs\n                    {\n                        title: 'navBar.commandView.orchestration.subMenu.routing.subMenu.revenueKpis',\n                        link: '#/admin/predictive-routing/revenue-kpis',\n                        hide: not(\n                            and(\n                                or(\n                                    perm('routing:keyPerformanceIndicator:add'),\n                                    perm('routing:keyPerformanceIndicator:edit')\n                                ),\n                                ft('gpr.AP-8265.showCustomKpiLink'),\n                                ft('AI-1435_CustomRevenueKpis')\n                            )\n                        )\n                    }\n                ]\n            },\n\n            // -- Rule-based Decisions\n            {\n                title: 'navBar.commandView.orchestration.subMenu.ruleBasedDecisions.title',\n                subMenu: [\n                    // -- -- Rules Schemas\n                    {\n                        title: 'navBar.commandView.orchestration.subMenu.ruleBasedDecisions.subMenu.rulesSchemas',\n                        link: '#/admin/rules-schemas',\n                        hide: not(perm('businessrules:businessRulesSchema:view'))\n                    },\n\n                    // -- -- Decision Tables\n                    {\n                        title: 'navBar.commandView.orchestration.subMenu.ruleBasedDecisions.subMenu.decisionTables',\n                        link: '#/admin/decision-tables',\n                        hide: not(perm('businessrules:decisionTable:view'))\n                    }\n                ]\n            },\n\n            // -- Work Automation\n            {\n                title: 'navBar.commandView.orchestration.subMenu.workAutomation.title',\n                subMenu: [\n                    // -- -- Workbins\n                    {\n                        title: 'navBar.commandView.orchestration.subMenu.workAutomation.subMenu.workbins',\n                        link: '#/admin/workbins',\n                        hide: not(perm('workitems:workbin:view')),\n                        keywords: 'navBar.pageKeywords.workbins'\n                    },\n\n                    // -- -- Custom Attributes\n                    {\n                        title: 'navBar.commandView.orchestration.subMenu.workAutomation.subMenu.customAttributes',\n                        link: '#/admin/custom-attributes',\n                        hide: not(perm('workitems:workitemSchema:view')),\n                        keywords: 'navBar.pageKeywords.customAttributes'\n                    },\n\n                    // -- -- Worktypes\n                    {\n                        title: 'navBar.commandView.orchestration.subMenu.workAutomation.subMenu.worktypes',\n                        link: '#/admin/worktypes',\n                        hide: not(perm('workitems:worktype:view')),\n                        keywords: 'navBar.pageKeywords.worktypes'\n                    },\n\n                    // -- -- Caseplans\n                    {\n                        title: 'navBar.commandView.orchestration.subMenu.workAutomation.subMenu.caseplans',\n                        link: '#/admin/caseplans',\n                        hide: not(\n                            and(\n                                ft('PURE-7138_caseplan_builder'),\n                                ft('PURE-6320_case_management'),\n                                perm('caseManagement:caseplan:view')\n                            )\n                        ),\n                        keywords: 'navBar.pageKeywords.caseplans'\n                    }\n                ]\n            },\n\n            // -- -- Triggers\n            {\n                title: 'navBar.commandView.orchestration.subMenu.triggers.title',\n                link: '#/admin/triggers',\n                hide: not(\n                    or(\n                        perm('processautomation:trigger:view'),\n                        perm('processautomation:trigger:add'),\n                        perm('processautomation:trigger:edit'),\n                        perm('processautomation:trigger:delete'),\n                        perm('processautomation:trigger:test')\n                    )\n                )\n            }\n        ]\n    },\n\n    // Digital and Telephony (previously Channels)\n    {\n        title: 'navBar.commandView.digitalAndTelephony.title',\n        icon: 'fa/laptop-mobile-regular',\n        customImageLocation: '#fa-laptop-mobile-regular',\n        subMenu: [\n            // -- Message\n            {\n                title: 'navBar.commandView.digitalAndTelephony.subMenu.message.title',\n                subMenu: [\n                    // -- -- Messenger Configurations\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.message.subMenu.messengerConfigurations',\n                        link: '#/admin/messenger/configurations',\n                        hide: not(or(perm('webDeployments:configuration:view'))),\n                        keywords: 'navBar.pageKeywords.messengerConfigurations'\n                    },\n\n                    // -- -- Messenger Deployments\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.message.subMenu.messengerDeployments',\n                        link: '#/admin/messenger/deployments',\n                        hide: not(or(perm('webDeployments:deployment:view'))),\n                        keywords: 'navBar.pageKeywords.messengerDeployments'\n                    },\n\n                    // -- -- Platform Configurations\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.message.subMenu.platformConfigurations',\n                        link: '#/admin/messaging/platform-configs',\n                        hide: not(\n                            or(\n                                perm('messaging:integration:add'),\n                                perm('messaging:integration:edit'),\n                                perm('messaging:integration:delete'),\n                                perm('messaging:integration:view'),\n                                perm('messaging:facebookIntegration:view'),\n                                perm('messaging:lineIntegration:view'),\n                                perm('messaging:twitterIntegration:view'),\n                                perm('messaging:whatsAppIntegration:view')\n                            )\n                        ),\n                        keywords: 'navBar.pageKeywords.platformConfigurations'\n                    },\n\n                    // -- -- Platform Integrations\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.message.subMenu.platformIntegrations',\n                        link: '#/admin/messaging/platforms',\n                        hide: not(\n                            or(\n                                perm('messaging:integration:add'),\n                                perm('messaging:integration:edit'),\n                                perm('messaging:integration:delete'),\n                                perm('messaging:integration:view'),\n                                perm('messaging:facebookIntegration:view'),\n                                perm('messaging:lineIntegration:view'),\n                                perm('messaging:twitterIntegration:view'),\n                                perm('messaging:whatsAppIntegration:view')\n                            )\n                        ),\n                        keywords: 'navBar.pageKeywords.messagingPlatforms'\n                    },\n\n                    // -- -- Supported Content Profiles\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.message.subMenu.supportedContentProfiles',\n                        link: '#/admin/messaging/supported-content-profiles',\n                        hide: not(perm('messaging:supportedContent:view')),\n                        keywords: 'navBar.pageKeywords.supportedContentProfiles'\n                    },\n\n                    // -- -- SMS Number Infentory\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.message.subMenu.smsNumberInventory',\n                        link: '#/admin/messaging/sms-numbers',\n                        hide: not(\n                            or(\n                                perm('sms:phoneNumber:read'),\n                                perm('sms:phoneNumber:create'),\n                                perm('sms:phoneNumber:add'),\n                                perm('sms:phoneNumber:delete'),\n                                perm('sms:phoneNumber:view'),\n                                perm('sms:phoneNumber:add'),\n                                perm('sms:phoneNumber:edit'),\n                                perm('sms:phoneNumber:delete')\n                            )\n                        ),\n                        keywords: 'navBar.pageKeywords.smsNumberInventory'\n                    },\n\n                    // -- -- Threading Timeline\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.message.subMenu.threadingTimeline',\n                        link: '#/admin/messaging/threading-timeline',\n                        hide: not(\n                            or(perm('conversation:threadingTimeline:view'), perm('conversation:threadingTimeline:edit'))\n                        )\n                    }\n                ]\n            },\n\n            // -- Outbound\n            {\n                title: 'navBar.commandView.digitalAndTelephony.subMenu.outbound.title',\n                subMenu: [\n                    // -- -- Campaign Management\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.outbound.subMenu.campaignManagement',\n                        link: '#/admin/outbound/admin/campaignManagement',\n                        hide: not(\n                            or(\n                                perm('outbound:campaign:view'),\n                                perm('outbound:emailCampaign:view'),\n                                perm('outbound:messagingCampaign:view'),\n                                perm('outbound:whatsAppCampaign:view')\n                            )\n                        ),\n                        keywords: 'navBar.pageKeywords.campaignManagement'\n                    },\n\n                    // -- -- Call Analysis Responses\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.outbound.subMenu.callAnalysisResponses',\n                        link: '#/admin/outbound/admin/callResponses',\n                        hide: not(perm('outbound:responseSet:view')),\n                        keywords: 'navBar.pageKeywords.callResponses'\n                    },\n\n                    // -- -- Contactable Time Sets\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.outbound.subMenu.contactableTimeSets',\n                        link: '#/admin/outbound/admin/timeSets',\n                        hide: not(perm('outbound:callableTimeSet:view')),\n                        keywords: 'navBar.pageKeywords.timeSets'\n                    },\n\n                    // -- -- Event Viewer\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.outbound.subMenu.eventViewer',\n                        link: '#/admin/outbound/admin/eventViewer',\n                        hide: not(perm('outbound:eventLog:view')),\n                        keywords: 'navBar.pageKeywords.eventViewer'\n                    },\n\n                    // -- -- List Management\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.outbound.subMenu.listManagement',\n                        link: '#/admin/outbound/admin/lists',\n                        hide: not(perm('outbound:contactList:view')),\n                        keywords: 'navBar.pageKeywords.contactLists'\n                    },\n\n                    // -- -- Rule Management\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.outbound.subMenu.ruleManagement',\n                        link: '#/admin/outbound/admin/ruleManagement',\n                        hide: not(perm('outbound:ruleSet:view')),\n                        keywords: 'navBar.pageKeywords.callRuleSets'\n                    },\n\n                    // -- -- Outbound Settings\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.outbound.subMenu.outboundSettings',\n                        link: '#/admin/outbound/admin/outboundSettings',\n                        hide: not(perm('outbound:settings:view')),\n                        keywords: 'navBar.pageKeywords.outboundSettings'\n                    },\n\n                    // -- -- Outbound Campaigns\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.outbound.subMenu.outboundCampaigns',\n                        link: '#/admin/outbound/dashboards/outboundCampaigns',\n                        hide: not(perm('outbound:campaign:view')),\n                        keywords: 'navBar.pageKeywords.campaignsDashboard'\n                    },\n                    // -- -- Wrap-up Code Mappings\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.outbound.subMenu.wrapupCodesMappings',\n                        link: '#/admin/outbound/admin/wrapupMappings',\n                        hide: not(perm('outbound:wrapUpCodeMapping:view')),\n                        keywords: 'navBar.pageKeywords.wrapupMappings'\n                    }\n                ]\n            },\n\n            // -- Social\n            {\n                title: 'navBar.commandView.digitalAndTelephony.subMenu.social.title',\n                subMenu: [\n                    // -- -- Social Listening\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.social.subMenu.socialListening',\n                        link: '#/admin/topics',\n                        hide: not(perm('socialmedia:topic:edit'))\n                    },\n\n                    // -- -- Social Escalation Rules\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.social.subMenu.socialEscalationRules',\n                        link: '#/admin/escalation-rules',\n                        hide: not(perm('socialmedia:escalationRules:view'))\n                    }\n                ]\n            },\n\n            // -- Telephony\n            {\n                title: 'navBar.commandView.digitalAndTelephony.subMenu.telephony.title',\n                subMenu: [\n                    // -- -- Topology\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.telephony.subMenu.topology',\n                        link: '#/admin/telephony/topology',\n                        hide: not(perm('telephony:plugin:all')),\n                        keywords: 'navBar.pageKeywords.topology'\n                    },\n\n                    // -- -- Metrics\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.telephony.subMenu.metrics',\n                        link: '#/admin/telephony/metrics',\n                        hide: not(perm('telephony:plugin:all')),\n                        keywords: 'navBar.pageKeywords.metrics'\n                    },\n\n                    // -- -- Trunks\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.telephony.subMenu.trunks',\n                        link: '#/admin/telephony/trunks',\n                        hide: not(perm('telephony:plugin:all')),\n                        keywords: 'navBar.pageKeywords.trunks'\n                    },\n\n                    // -- -- Sites\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.telephony.subMenu.sites',\n                        link: '#/admin/telephony/sites',\n                        hide: not(perm('telephony:plugin:all')),\n                        keywords: 'navBar.pageKeywords.sites'\n                    },\n\n                    // -- -- Premises Edges\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.telephony.subMenu.premisesEdges',\n                        link: '#/admin/telephony/edges',\n                        hide: not(perm('telephony:plugin:all')),\n                        keywords: 'navBar.pageKeywords.edges'\n                    },\n\n                    // -- -- Edge Groups\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.telephony.subMenu.edgeGroups',\n                        link: '#/admin/telephony/edge-groups',\n                        hide: not(perm('telephony:plugin:all')),\n                        keywords: 'navBar.pageKeywords.edgeGroups'\n                    },\n\n                    // -- -- Cloud Media\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.telephony.subMenu.cloudMedia',\n                        link: '#/admin/telephony/cloud-media',\n                        hide: not(perm('telephonyUI:cloudMedia:view'))\n                    },\n\n                    // -- -- Extensions\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.telephony.subMenu.extensions',\n                        link: '#/admin/telephony/extensions',\n                        hide: not(perm('telephony:extensionPool:view')),\n                        keywords: 'navBar.pageKeywords.extensions'\n                    },\n\n                    // -- -- DID Numbers\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.telephony.subMenu.didNumbers',\n                        link: '#/admin/telephony/did',\n                        hide: or(ft('PURE-3796_DIDGroups'), not(perm('telephony:plugin:all'))),\n                        keywords: 'navBar.pageKeywords.didNumbers'\n                    },\n\n                    // -- -- Direct Inward Dialing\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.telephony.subMenu.directInwardDialing',\n                        link: '#/admin/telephony/did',\n                        hide: not(and(ft('PURE-3796_DIDGroups'), perm('telephony:didGroup:view'))),\n                        keywords: 'navBar.pageKeywords.directInwardDialing'\n                    },\n\n                    // -- -- Phone Management\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.telephony.subMenu.phoneManagement',\n                        link: '#/admin/telephony/phone-management',\n                        hide: not(perm('telephony:plugin:all')),\n                        keywords: 'navBar.pageKeywords.phoneManagement'\n                    },\n\n                    //-- -- Number Management\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.telephony.subMenu.numberManagement',\n                        link: '#/admin/telecom/numbers',\n                        hide: not(or(perm('purecloudvoice:number:view'), perm('purecloudvoiceinternal:number:view'))),\n                        keywords: 'navBar.pageKeywords.numberManagement'\n                    },\n\n                    //-- -- Number Redirection\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.telephony.subMenu.numberRedirection',\n                        link: '#/admin/telecom/number-redirection',\n                        hide: not(\n                            and(\n                                or(perm('telephony:organizationLink:view'), perm('telephony:numberRouting:view')),\n                                ft('PURE-5788_GCV_Disaster_Recovery')\n                            )\n                        ),\n                        keywords: 'navBar.pageKeywords.numberRedirection'\n                    },\n\n                    //-- -- Prefix Blocking\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.telephony.subMenu.prefixBlocking',\n                        link: '#/admin/telecom/prefix-blocking',\n                        hide: not(and(perm('telephony:prefix:view'), ft('PURE-7224_Prefix'))),\n                        keywords: 'navBar.pageKeywords.prefixBlocking'\n                    },\n\n                    // -- -- Certificate Authorities\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.telephony.subMenu.certificateAuthorities',\n                        link: '#/admin/telephony/certificate-authorities',\n                        hide: not(perm('telephony:plugin:all')),\n                        keywords: 'navBar.pageKeywords.certificateAuthorities'\n                    },\n\n                    // -- -- Caller ID Groups\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.telephony.subMenu.callerIdGroups',\n                        link: '#/admin/telephony/caller-id-groups',\n                        hide: not(and(perm('telephony:callerIdGroup:view'), ft('PURE-3963_caller_id_groups'))),\n                        keywords: 'navBar.pageKeywords.callerIdGroups'\n                    },\n\n                    // -- -- Global Telephony Settings\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.telephony.subMenu.globalTelephonySettings',\n                        link: '#/admin/telephony/settings',\n                        hide: not(\n                            or(\n                                perm('telephony:plugin:all'),\n                                perm('telephony:alertablePresences:view'),\n                                perm('telephony:settings:view')\n                            )\n                        ),\n                        keywords: 'navBar.pageKeywords.globalTelephonySettings'\n                    }\n                ]\n            },\n\n            // -- Orchestration Assets\n            {\n                title: 'navBar.commandView.digitalAndTelephony.subMenu.interactionAssets.title',\n                subMenu: [\n                    // -- -- Assistants\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.interactionAssets.subMenu.assistants',\n                        link: '#/admin/assistants/list',\n                        hide: not(\n                            or(\n                                perm('assistants:assistant:add'),\n                                perm('assistants:assistant:edit'),\n                                perm('assistants:assistant:delete')\n                            )\n                        ),\n                        keywords: 'navBar.pageKeywords.assistants'\n                    },\n\n                    // -- -- Utilization\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.interactionAssets.subMenu.utilization',\n                        link: '#/admin/contact-center/utilization',\n                        hide: not(or(perm('routing:utilization:manage'), perm('routing:utilization:view'))),\n                        keywords: 'navBar.pageKeywords.utilization'\n                    },\n\n                    // -- -- Wrap-up Codes\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.interactionAssets.subMenu.wrapupCodes',\n                        link: '#/admin/admin/organization/_wrapupCodesV2',\n                        hide: not(perm('routing:wrapupCode:view')),\n                        keywords: 'navBar.pageKeywords.wrapupCodes'\n                    },\n\n                    // -- -- Custom KPIs\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.interactionAssets.subMenu.customKpis',\n                        link: '#/admin/predictive-routing/custom-kpis',\n                        hide: not(\n                            and(\n                                or(\n                                    perm('routing:keyPerformanceIndicator:add'),\n                                    perm('routing:keyPerformanceIndicator:edit')\n                                ),\n                                ft('gpr.AP-8265.showCustomKpiLink'),\n                                not(ft('AI-1435_CustomRevenueKpis'))\n                            )\n                        )\n                    },\n\n                    // -- -- Canned Responses\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.interactionAssets.subMenu.cannedResponses',\n                        link: '#/admin/responseManagement/responses',\n                        altLink: ['#/admin/responseManagement/libraries'],\n                        hide: not(\n                            or(\n                                perm('responses:library:edit'),\n                                perm('responses:library:view'),\n                                perm('responses:response:edit'),\n                                perm('responses:response:view')\n                            )\n                        ),\n                        keywords: 'navBar.pageKeywords.cannedResponses'\n                    },\n\n                    // -- -- Response Assets\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.interactionAssets.subMenu.responseAssets',\n                        link: '#/admin/responseManagement/assets',\n                        hide: not(perm('responseAssets:asset:view')),\n                        keywords: 'navBar.pageKeywords.responseAssets'\n                    },\n\n                    // -- -- Panel Manager\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.interactionAssets.subMenu.panelManager',\n                        link: '#/admin/contact-center/panel-settings',\n                        hide: not(perm('agentUI:defaultPanels:edit')),\n                        keywords: 'navBar.pageKeywords.panelSettings'\n                    },\n\n                    // -- -- Scripts\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.interactionAssets.subMenu.scripts',\n                        link: '#/admin/scripts',\n                        hide: not(\n                            or(\n                                perm('scripter:script:view'),\n                                perm('scripter:script:add'),\n                                perm('scripter:script:edit'),\n                                perm('scripter:script:delete'),\n                                perm('scripter:script:search')\n                            )\n                        ),\n                        keywords: 'navBar.pageKeywords.scripts'\n                    },\n\n                    // -- -- Script Templates\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.interactionAssets.subMenu.scriptTemplates',\n                        link: '#/admin/scriptTemplates',\n                        hide: not(perm('scripter:script:edit')),\n                        keywords: 'navBar.pageKeywords.scriptTemplates'\n                    },\n\n                    // -- -- Widgets\n                    {\n                        title: 'navBar.commandView.digitalAndTelephony.subMenu.interactionAssets.subMenu.widgets',\n                        link: '#/admin/integrations/widgets',\n                        hide: not(\n                            or(\n                                perm('webchat:deployment:read'),\n                                perm('webchat:deployment:create'),\n                                perm('webchat:deployment:update'),\n                                perm('widgets:deployment:read'),\n                                perm('widgets:deployment:create'),\n                                perm('widgets:deployment:view'),\n                                perm('widgets:deployment:update')\n                            )\n                        ),\n                        keywords: 'navBar.pageKeywords.widgets'\n                    }\n                ]\n            },\n\n            // -- Email\n            {\n                title: 'navBar.commandView.digitalAndTelephony.subMenu.email',\n                link: '#/admin/organization/email/domains',\n                hide: not(perm('routing:email:manage')),\n                keywords: 'navBar.pageKeywords.email'\n            }\n        ]\n    },\n\n    // Conversation Intelligence\n    {\n        title: 'navBar.commandView.conversationIntelligence.title',\n        icon: 'fa/lightbulb-message-regular',\n        customImageLocation: '#fa-lightbulb-message-regular',\n\n        subMenu: [\n            // -- Recording and Policies\n            {\n                title: 'navBar.commandView.conversationIntelligence.subMenu.recordingAndPolicies.title',\n                subMenu: [\n                    // -- -- Encryption Keys\n                    {\n                        title: 'navBar.commandView.conversationIntelligence.subMenu.recordingAndPolicies.subMenu.encryptionKeys',\n                        link: '#/admin/quality/encryptionKeys',\n                        hide: not(or(perm('recording:encryptionKey:view'), perm('conversation:encryptionKey:view')))\n                    },\n\n                    // -- --Policies\n                    {\n                        title: 'navBar.commandView.conversationIntelligence.subMenu.recordingAndPolicies.subMenu.policies',\n                        link: '#/admin/quality/policies/mediaRetention',\n                        hide: not(\n                            or(\n                                perm('recording:retentionPolicy:view'),\n                                perm('recording:crossPlatformRetentionPolicy:view')\n                            )\n                        )\n                    },\n\n                    // -- -- Recording Management\n                    {\n                        title: 'navBar.commandView.conversationIntelligence.subMenu.recordingAndPolicies.subMenu.recordingManagement',\n                        link: '#/admin/quality/recordingManagement',\n                        hide: not(\n                            or(\n                                perm('recording:orphanRecording:view'),\n                                perm('recording:screenRecording:view'),\n                                perm('recording:screenRecording:stop'),\n                                perm('recording:settings:editScreenRecordings'),\n                                perm('recording:settings:editRegionalStorage'),\n                                perm('recording:settings:editUrlExpiration')\n                            )\n                        )\n                    }\n                ]\n            },\n\n            // Quality Evaluations\n            {\n                title: 'navBar.commandView.conversationIntelligence.subMenu.qualityManagement.title',\n                subMenu: [\n                    // -- Evaluation forms\n                    {\n                        title: 'navBar.commandView.conversationIntelligence.subMenu.qualityManagement.subMenu.evaluationForms',\n                        link: '#/admin/quality/evaluationForms',\n                        hide: not(\n                            or(\n                                perm('quality:evaluationForm:add'),\n                                perm('quality:evaluationForm:edit'),\n                                perm('quality:evaluationForm:delete')\n                            )\n                        )\n                    },\n\n                    // -- Customer Surveys\n                    {\n                        title: 'navBar.commandView.conversationIntelligence.subMenu.qualityManagement.subMenu.customerSurveys',\n                        link: '#/admin/quality/surveyForms',\n                        hide: not(\n                            and(\n                                or(\n                                    perm('quality:surveyForm:add'),\n                                    perm('quality:surveyForm:edit'),\n                                    perm('quality:surveyForm:delete')\n                                )\n                            )\n                        )\n                    },\n\n                    // -- Agent Checklists\n                    {\n                        title: 'navBar.commandView.conversationIntelligence.subMenu.qualityManagement.subMenu.agentChecklist',\n                        link: '#/quality/admin/agent-checklists-ui',\n                        hide: not(perm('assistants:agentchecklist:view'))\n                    },\n\n                    // -- Evaluators\n                    {\n                        title: 'navBar.commandView.conversationIntelligence.subMenu.qualityManagement.subMenu.evaluators',\n                        link: '#/admin/quality/evaluators',\n                        hide: not(perm('quality:evaluation:add'))\n                    },\n\n                    // -- Agent Evaluations\n                    {\n                        title: 'navBar.commandView.conversationIntelligence.subMenu.qualityManagement.subMenu.agentEvaluations',\n                        link: '#/admin/quality/agentEvaluations',\n                        hide: not(or(role('qualityAdmin'), perm('quality:evaluation:add')))\n                    },\n\n                    // -- Calibration evaluations\n                    {\n                        title: 'navBar.commandView.conversationIntelligence.subMenu.qualityManagement.subMenu.calibrationEvaluations',\n                        link: '#/admin/quality/calibrations',\n                        hide: not(or(role('qualityAdmin'), perm('quality:calibration:view')))\n                    }\n                ]\n            },\n\n            // Speech and text analytics\n            {\n                title: 'navBar.commandView.conversationIntelligence.subMenu.speechAndTextAnalytics.title',\n                subMenu: [\n                    // -- Speech and text configuration\n                    {\n                        title: 'navBar.commandView.conversationIntelligence.subMenu.speechAndTextAnalytics.subMenu.speechAndTextConfig',\n                        link: '#/quality/admin/speech-and-text-analytics',\n                        hide: not(\n                            or(perm('speechAndTextAnalytics:program:view'), perm('routing:transcriptionSettings:view'))\n                        ),\n                        keywords: 'navBar.pageKeywords.speechAndText'\n                    },\n\n                    // -- dictionary management\n                    {\n                        title: 'navBar.commandView.conversationIntelligence.subMenu.speechAndTextAnalytics.subMenu.dictionarymanagement',\n                        link: '#/quality/admin/dictionary-management',\n                        hide: not(perm('speechAndTextAnalytics:dictionaryterm:view'))\n                    },\n\n                    // -- topics\n                    {\n                        title: 'navBar.commandView.conversationIntelligence.subMenu.speechAndTextAnalytics.subMenu.topics',\n                        link: '#/topics-definitions/topics',\n                        hide: not(perm('speechAndTextAnalytics:topic:view')),\n                        altLink: ['#/topics-definitions/topicItem']\n                    },\n\n                    // -- topic miner\n                    {\n                        title: 'navBar.commandView.conversationIntelligence.subMenu.speechAndTextAnalytics.subMenu.topicMiner',\n                        link: '#/quality/admin/topic-miner',\n                        hide: not(perm('languageUnderstanding:miner:view'))\n                    },\n\n                    // -- programs\n                    {\n                        title: 'navBar.commandView.conversationIntelligence.subMenu.speechAndTextAnalytics.subMenu.programs',\n                        link: '#/programs-definitions/programs',\n                        altLink: ['#/programs-definitions/programItem'],\n                        hide: not(perm('speechAndTextAnalytics:program:view'))\n                    },\n\n                    // -- interaction categories\n                    {\n                        title: 'navBar.commandView.conversationIntelligence.subMenu.speechAndTextAnalytics.subMenu.interactionCategories',\n                        link: '#/quality/admin/sta-category-definitions/categories',\n                        altLink: ['#/quality/admin/sta-category-definitions/categoryItem'],\n                        hide: not(perm('speechAndTextAnalytics:category:view'))\n                    },\n\n                    // -- Interaction Reprocessing\n                    {\n                        title: 'navBar.commandView.conversationIntelligence.subMenu.speechAndTextAnalytics.subMenu.interactionReprocessing',\n                        link: '#/quality/admin/reprocess-interactions',\n                        hide: not(\n                            and(\n                                ft('WEM-885_ReprocessInteractionsUI'),\n                                ft('WEM-1083_staReprocessInteractions'),\n                                perm('speechAndTextAnalytics:reprocessInteractions:view')\n                            )\n                        )\n                    },\n\n                    // -- sentiment feedback\n                    {\n                        title: 'navBar.commandView.conversationIntelligence.subMenu.speechAndTextAnalytics.subMenu.sentimentFeedback',\n                        link: '#/quality/admin/sentiment-feedback',\n                        hide: not(perm('speechAndTextAnalytics:feedback:view'))\n                    }\n                ]\n            }\n        ]\n    },\n\n    // Workforce Management\n    {\n        title: 'navBar.commandView.wfm.title',\n        icon: 'fa/calendar-circle-user-regular',\n        customImageLocation: '#fa-calendar-circle-user-regular',\n        subMenu: [\n            // -- Workforce Management Configuration\n            {\n                title: 'navBar.commandView.wfm.subMenu.wfmConfig.title',\n                subMenu: [\n                    // -- -- Business Units\n                    {\n                        title: 'navBar.commandView.wfm.subMenu.wfmConfig.subMenu.businessUnits',\n                        link: '#/admin/wfm/businessUnits',\n                        hide: not(perm('wfm:businessUnit:view'))\n                    },\n\n                    // -- -- Management Units\n                    {\n                        title: 'navBar.commandView.wfm.subMenu.wfmConfig.subMenu.managementUnits',\n                        link: '#/admin/wfm/managementUnits',\n                        hide: not(or(perm('wfm:managementUnit:view'), perm('wfm:managementUnit:administer')))\n                    },\n\n                    // -- -- Service Goal Templates\n                    {\n                        title: 'navBar.commandView.wfm.subMenu.wfmConfig.subMenu.serviceGoalTemplates',\n                        link: '#/admin/wfm/serviceGoalTemplates',\n                        hide: not(perm('wfm:serviceGoalTemplate:view'))\n                    },\n\n                    // -- -- Planning Groups\n                    {\n                        title: 'navBar.commandView.wfm.subMenu.wfmConfig.subMenu.planningGroups',\n                        link: '#/admin/wfm/planningGroups',\n                        hide: not(perm('wfm:planningGroup:view'))\n                    },\n\n                    // -- -- Staffing Groups\n                    {\n                        title: 'navBar.commandView.wfm.subMenu.wfmConfig.subMenu.staffingGroups',\n                        link: '#/admin/wfm/staffingGroups',\n                        hide: not(perm('wfm:staffingGroup:view'))\n                    },\n\n                    // -- -- Agents\n                    {\n                        title: 'navBar.commandView.wfm.subMenu.wfmConfig.subMenu.agents',\n                        link: '#/admin/wfm/agents',\n                        hide: not(or(perm('wfm:agent:view'), perm('wfm:agent:administer')))\n                    },\n\n                    // -- -- Activity Codes\n                    {\n                        title: 'navBar.commandView.wfm.subMenu.wfmConfig.subMenu.activityCodes',\n                        link: '#/admin/wfm/activityCodes',\n                        hide: not(or(perm('wfm:activityCode:view'), perm('wfm:activityCode:administer')))\n                    }\n                ]\n            },\n            // -- Scheduling\n            {\n                title: 'navBar.commandView.wfm.subMenu.scheduling.title',\n                subMenu: [\n                    // -- -- Schedules\n                    {\n                        title: 'navBar.commandView.wfm.subMenu.scheduling.subMenu.schedules',\n                        link: '#/admin/wfm/schedules',\n                        hide: not(\n                            or(\n                                perm('wfm:schedule:view'),\n                                perm('wfm:schedule:administer'),\n                                perm('wfm:publishedSchedule:view')\n                            )\n                        )\n                    },\n\n                    // -- -- Activity Plans\n                    {\n                        title: 'navBar.commandView.wfm.subMenu.scheduling.subMenu.activityPlans',\n                        link: '#/admin/wfm/activityplans',\n                        hide: not(perm('wfm:activityPlan:view'))\n                    },\n\n                    // -- -- Shift Trades\n                    {\n                        title: 'navBar.commandView.wfm.subMenu.scheduling.subMenu.shiftTrades',\n                        link: '#/admin/wfm/shiftTrades',\n                        hide: not(perm('wfm:shiftTradeRequest:view'))\n                    },\n\n                    // -- -- Opportunities\n                    {\n                        title: 'navBar.commandView.wfm.subMenu.scheduling.subMenu.opportunities',\n                        link: '#/admin/wfm/opportunities',\n                        hide: not(perm('wfm:opportunitiesQuery:view'))\n                    },\n\n                    // -- -- Time-off Limits\n                    {\n                        title: 'navBar.commandView.wfm.subMenu.scheduling.subMenu.timeOffLimits',\n                        link: '#/admin/wfm/timeOffLimits',\n                        altLink: ['#/admin/wfm/time-off/limits'],\n                        hide: not(perm('wfm:timeOffLimit:view'))\n                    },\n\n                    // -- -- Time-off Plans\n                    {\n                        title: 'navBar.commandView.wfm.subMenu.scheduling.subMenu.timeOffPlans',\n                        link: '#/admin/wfm/timeOffPlans',\n                        altLink: ['#/admin/wfm/time-off/plans'],\n                        hide: not(perm('wfm:timeOffPlan:view'))\n                    },\n\n                    // -- -- Time-off Requests (legacy)\n                    {\n                        title: 'navBar.commandView.wfm.subMenu.scheduling.subMenu.timeOffRequests',\n                        link: '#/admin/wfm/timeOffRequests',\n                        hide: not(\n                            and(\n                                or(perm('wfm:timeOffRequest:view'), perm('wfm:timeOffRequest:administer')),\n                                not(ft('WEM-1384_SequentialTORApproval'))\n                            )\n                        )\n                    },\n\n                    // -- -- Time-off Requests\n                    {\n                        title: 'navBar.commandView.wfm.subMenu.scheduling.subMenu.timeOffRequests',\n                        link: '#/admin/wfm/time-off/requests',\n                        altLink: ['#/admin/wfm/timeOffRequests'],\n                        hide: not(\n                            and(\n                                or(perm('wfm:timeOffRequest:view'), perm('wfm:timeOffRequest:administer')),\n                                ft('WEM-1384_SequentialTORApproval')\n                            )\n                        )\n                    }\n                ]\n            },\n\n            // -- Forecasting\n            {\n                title: 'navBar.commandView.wfm.subMenu.forecasting.title',\n                subMenu: [\n                    // -- -- Main Forecast\n                    {\n                        title: 'navBar.commandView.wfm.subMenu.forecasting.subMenu.mainForecast',\n                        link: '#/admin/wfm/main-forecast',\n                        hide: not(perm('wfm:mainForecast:view'))\n                    },\n\n                    // -- -- legacy Forecasts\n                    {\n                        title: 'navBar.commandView.wfm.subMenu.forecasting.subMenu.forecasts',\n                        link: '#/admin/wfm/forecasts',\n                        hide: not(\n                            and(\n                                or(perm('wfm:shortTermForecast:view'), perm('wfm:shortTermForecast:administer')),\n                                not(ft('WEM-1539_forecast_list'))\n                            )\n                        )\n                    },\n\n                    // -- -- Forecasts\n                    {\n                        title: 'navBar.commandView.wfm.subMenu.forecasting.subMenu.forecasts',\n                        link: '#/admin/wfm/forecasting/forecasts',\n                        altLink: ['#/admin/wfm/forecasts'],\n                        hide: not(and(perm('wfm:shortTermForecast:view'), ft('WEM-1539_forecast_list')))\n                    },\n\n                    // -- -- Historical Data Import\n                    {\n                        title: 'navBar.commandView.wfm.subMenu.forecasting.subMenu.historicalDataImport',\n                        link: '#/admin/wfm/historicalImportV2',\n                        hide: not(perm('wfm:historicalData:upload'))\n                    }\n                ]\n            },\n            // -- Capacity Planning\n            {\n                title: 'navBar.commandView.wfm.subMenu.capacityPlanning.title',\n                subMenu: [\n                    // -- -- Staffing Requirements\n                    {\n                        title: 'navBar.commandView.wfm.subMenu.capacityPlanning.subMenu.staffingRequirements',\n                        link: '#/admin/wfm/capacity-planning/staffing-requirements',\n                        hide: not(perm('wfm:longTermStaffing:view'))\n                    },\n\n                    // -- -- Capactiy Plans\n                    {\n                        title: 'navBar.commandView.wfm.subMenu.capacityPlanning.subMenu.capacityPlans',\n                        link: '#/admin/wfm/capacity-planning/capacity-plans',\n                        hide: not(perm('wfm:capacityPlan:view'))\n                    },\n\n                    // -- -- Decisions Data Download\n                    {\n                        title: 'navBar.commandView.wfm.subMenu.capacityPlanning.subMenu.decisionsDataDownload',\n                        link: '#/admin/wfm/decisionsDataDownload',\n                        hide: not(and(perm('wfp:decisionsDataDownload:download'), ft('wfpDecisionsDataDownloadDecomp')))\n                    }\n                ]\n            },\n\n            // -- Work Plan Configurations\n            {\n                title: 'navBar.commandView.wfm.subMenu.workPlanConfig.title',\n                subMenu: [\n                    // -- -- Work Plans\n                    {\n                        title: 'navBar.commandView.wfm.subMenu.workPlanConfig.subMenu.workPlans',\n                        link: '#/admin/wfm/workPlans',\n                        hide: not(or(perm('wfm:workPlan:view'), perm('wfm:workPlan:administer'))),\n                        keywords: 'navBar.pageKeywords.workPlans'\n                    },\n\n                    // -- -- Work Plan Rotations\n                    {\n                        title: 'navBar.commandView.wfm.subMenu.workPlanConfig.subMenu.workPlanRotations',\n                        link: '#/admin/wfm/workPlanRotations',\n                        hide: not(perm('wfm:workPlanRotation:view'))\n                    },\n\n                    // -- -- Work Plan Assignments\n                    {\n                        title: 'navBar.commandView.wfm.subMenu.workPlanConfig.subMenu.workPlanAssignments',\n                        link: '#/admin/wfm/workPlanV2/assignments',\n                        hide: not(or(perm('wfm:workPlan:view'), perm('wfm:workPlan:administer')))\n                    },\n\n                    // -- -- Schedule Bids\n                    {\n                        title: 'navBar.commandView.wfm.subMenu.workPlanConfig.subMenu.scheduleBids',\n                        link: '#/admin/wfm/workPlanV2/bids',\n                        hide: not(\n                            or(\n                                perm('wfm:workPlanBid:view'),\n                                perm('wfm:workPlanBid:administer'),\n                                perm('wfm:scheduleBid:view'),\n                                perm('wfm:scheduleBid:administer')\n                            )\n                        )\n                    }\n                ]\n            }\n        ]\n    },\n\n    // Knowledge\n    {\n        title: 'navBar.commandView.knowledge.title',\n        icon: 'fa/book-regular',\n        subMenu: [\n            // -- Articles\n            // View in EUSC region\n            {\n                title: 'navBar.commandView.knowledge.subMenu.articles',\n                link: '#/admin/knowledge/knowledgeBases/articles',\n                hide: or(\n                    not(perm('knowledge:knowledgebase:view')),\n                    ft('DX.GKC-5121.CX2DX-migration-force-cx'),\n                    not(ft('GKC-26947_disable-knowledge-v3-for-EUSC'))\n                ),\n                keywords: 'navBar.pageKeywords.articles'\n            },\n\n            // -- Knowledge Content\n            // View out of EUSC region\n            {\n                title: 'navBar.commandView.knowledge.subMenu.knowledgeContent',\n                hide: or(ft('GKC-26947_disable-knowledge-v3-for-EUSC')),\n                subMenu: [\n                    // -- -- Articles in Content\n                    {\n                        title: 'navBar.commandView.knowledge.subMenu.articles',\n                        link: '#/admin/knowledge/knowledgeBases/articles',\n                        hide: or(not(perm('knowledge:knowledgebase:view')), ft('DX.GKC-5121.CX2DX-migration-force-cx')),\n                        keywords: 'navBar.pageKeywords.articles'\n                    },\n                    // -- -- Fabric Content\n                    {\n                        title: 'navBar.commandView.knowledge.subMenu.fabricContent',\n                        link: '#/admin/knowledge/knowledgeConfiguration/content',\n                        hide: or(\n                            not(perm('knowledge:sourceFileList:view')),\n                            ft('DX.GKC-5121.CX2DX-migration-force-cx'),\n                            not(ft('AI-1469_source-file-listing'))\n                        ),\n                        keywords: 'navBar.pageKeywords.fabricContent'\n                    }\n                ]\n            },\n\n            // -- Categories and Labels\n            {\n                title: 'navBar.commandView.knowledge.subMenu.categoriesAndLabels',\n                link: '#/admin/knowledge/knowledgeBases/categories',\n                hide: or(not(perm('knowledge:knowledgebase:view')), ft('DX.GKC-5121.CX2DX-migration-force-cx')),\n                keywords: 'navBar.pageKeywords.categoriesAndLabels'\n            },\n\n            // -- Sources\n            {\n                title: 'navBar.commandView.knowledge.subMenu.sources',\n                link: '#/admin/knowledge/knowledgeBases/sources',\n                hide: or(not(perm('knowledge:knowledgebase:view')), ft('DX.GKC-5121.CX2DX-migration-force-cx')),\n                keywords: 'navBar.pageKeywords.sources'\n            },\n\n            // -- Activity\n            {\n                title: 'navBar.commandView.knowledge.subMenu.activity',\n                link: '#/admin/knowledge/knowledgeBases/activity',\n                hide: or(not(perm('knowledge:knowledgebase:view')), ft('DX.GKC-5121.CX2DX-migration-force-cx'))\n            },\n\n            // -- Knowledge Configuration\n            {\n                title: 'navBar.commandView.knowledge.subMenu.configuration',\n                link: '#/admin/knowledge/knowledgeConfiguration/configurations',\n                hide: or(\n                    not(perm('knowledge:knowledgeSetting:view')),\n                    ft('DX.GKC-5121.CX2DX-migration-force-cx'),\n                    ft('GKC-26947_disable-knowledge-v3-for-EUSC')\n                ),\n                keywords: 'navBar.pageKeywords.knowledgeConfiguration'\n            },\n\n            // -- Optimizer\n            {\n                title: 'navBar.commandView.knowledge.subMenu.optimizer',\n                link: '#/admin/knowledge/optimizer',\n                hide: or(not(perm('knowledge:knowledgebase:view')), ft('DX.GKC-5121.CX2DX-migration-force-cx')),\n                keywords: 'navBar.pageKeywords.optimizer'\n            }\n        ]\n    },\n\n    // User Management (previously People and Permissions)\n    {\n        title: 'navBar.commandView.userManagement.title',\n        icon: 'fa/users-regular',\n        subMenu: [\n            // -- Users\n            {\n                title: 'navBar.commandView.userManagement.subMenu.users',\n                link: '#/admin/directory/peopleV3',\n                altLink: ['#/admin/directory/peopleV2'],\n                hide: not(\n                    and(\n                        or(\n                            perm('admin'),\n                            perm('person_administration'),\n                            perm('user_administration'),\n                            perm('user_manager'),\n                            perm('routing:skill:assign'),\n                            perm('authorization:grant:view'),\n                            perm('authorization:grant:edit'),\n                            perm('authorization:grant:delete'),\n                            perm('authorization:grant:add'),\n                            perm('authorization:role:view'),\n                            perm('authorization:role:edit'),\n                            perm('authorization:role:delete'),\n                            perm('authorization:role:add'),\n                            perm('directory:user:edit')\n                        ),\n                        not(ft('PAUI-80.PeopleUiDecomposition'))\n                    )\n                ),\n                keywords: 'navBar.pageKeywords.users'\n            },\n\n            // -- Decompositioned People UI\n            {\n                title: 'navBar.commandView.userManagement.subMenu.users',\n                link: '#/admin/users',\n                hide: not(\n                    and(\n                        or(\n                            perm('admin'),\n                            perm('person_administration'),\n                            perm('user_administration'),\n                            perm('user_manager'),\n                            perm('routing:skill:assign'),\n                            perm('authorization:grant:view'),\n                            perm('authorization:grant:edit'),\n                            perm('authorization:grant:delete'),\n                            perm('authorization:grant:add'),\n                            perm('authorization:role:view'),\n                            perm('authorization:role:edit'),\n                            perm('authorization:role:delete'),\n                            perm('authorization:role:add'),\n                            perm('directory:user:edit')\n                        ),\n                        ft('PAUI-80.PeopleUiDecomposition')\n                    )\n                ),\n                keywords: 'navBar.pageKeywords.users'\n            },\n\n            // -- Roles and Permissions\n            {\n                title: 'navBar.commandView.userManagement.subMenu.rolesAndPermissions',\n                link: '#/admin/people-permissions/roles',\n                hide: not(perm('authorization:role:view'))\n            },\n\n            // -- -- Queues\n            {\n                title: 'navBar.commandView.userManagement.subMenu.queues',\n                link: '#/admin/admin/organization/_queuesV2',\n                altLink: ['#/admin/organization/queues'],\n                hide: not(\n                    or(perm('routing:queue:edit'), perm('routing:queue:readonly'), perm('routing:queueMember:manage'))\n                ),\n                keywords: 'navBar.pageKeywords.queues'\n            },\n\n            // -- Access Policies\n            {\n                title: 'navBar.commandView.userManagement.subMenu.accessPolicies',\n                link: '#/admin/people-permissions/policies',\n                hide: not(perm('authorization:policy:view'))\n            },\n\n            // -- ACD Skills and Languages\n            {\n                title: 'navBar.commandView.userManagement.subMenu.acdSkills',\n                link: '#/admin/directory/acdSkills',\n                hide: not(or(perm('routing:skill:manage'), perm('routing:skill:view'))),\n                keywords: 'navBar.pageKeywords.acdSkillsLanguages'\n            },\n\n            // -- Authorized Organizations\n            {\n                title: 'navBar.commandView.userManagement.subMenu.authorizedOrgs',\n                link: '#/admin/people-permissions/authorized-orgs',\n                hide: not(\n                    and(\n                        ft('iam-admin-ui.authorized-orgs'),\n                        or(perm('authorization:orgTrustee:view'), perm('authorization:orgTrustor:view'))\n                    )\n                ),\n                keywords: 'navBar.pageKeywords.authOrgs'\n            },\n            {\n                title: 'navBar.commandView.userManagement.subMenu.authorizedOrgs',\n                link: '#/admin/auth-orgs',\n                hide: not(\n                    and(\n                        not(ft('iam-admin-ui.authorized-orgs')),\n                        or(perm('authorization:orgTrustee:view'), perm('authorization:orgTrustor:view'))\n                    )\n                ),\n                keywords: 'navBar.pageKeywords.authOrgs'\n            },\n\n            // -- Divisions\n            {\n                title: 'navBar.commandView.userManagement.subMenu.divisions',\n                link: '#/admin/people-permissions/divisions',\n                hide: not(perm('authorization:division:view'))\n            },\n\n            // -- Division Assignments? (TODO)\n            // TODO: hiding until route is identified\n            // Does not exist in admin/menu.yml\n\n            // -- Groups\n            {\n                title: 'navBar.commandView.userManagement.subMenu.groups',\n                link: '#/admin/groups',\n                altLink: ['#/admin/groupprofile'],\n                hide: not(\n                    or(\n                        perm('admin'),\n                        perm('group_administration'),\n                        and(\n                            perm('directory:group:view'),\n                            perm('directory:group:add'),\n                            perm('directory:group:edit'),\n                            perm('directory:group:delete')\n                        )\n                    )\n                ),\n                keywords: 'navBar.pageKeywords.groups'\n            },\n\n            // -- Locations\n            {\n                title: 'navBar.commandView.userManagement.subMenu.locations',\n                link: '#/admin/directory/locations',\n                hide: not(\n                    or(\n                        perm('admin'),\n                        perm('location_administration'),\n                        and(\n                            perm('directory:location:add'),\n                            perm('directory:location:edit'),\n                            perm('directory:location:delete')\n                        )\n                    )\n                ),\n                keywords: 'navBar.pageKeywords.locations'\n            },\n\n            // -- Profile Fields\n            {\n                title: 'navBar.commandView.userManagement.subMenu.profileFields',\n                link: '#/admin/directory/fields',\n                hide: not(or(perm('admin'), perm('field_administration')))\n            },\n\n            // -- User Directory\n            {\n                title: 'navBar.commandView.userManagement.subMenu.userDirectory',\n                link: '#/search-v2',\n                hide: not(perm('ui:myOrganization:view'))\n            },\n\n            // -- Work Teams\n            {\n                title: 'navBar.commandView.userManagement.subMenu.workTeams',\n                link: '#/admin/teams',\n                hide: not(perm('groups:team:view'))\n            },\n\n            // -- Users Rules\n            {\n                title: 'navBar.commandView.userManagement.subMenu.usersRules',\n                link: '#/admin/user-rules',\n                hide: not(perm('users:rules:view'))\n            }\n        ]\n    },\n\n    // IT and Integrations\n    {\n        title: 'navBar.commandView.itAndIntegrations.title',\n        icon: 'fa/screwdriver-wrench-regular',\n        customImageLocation: '#fa-screwdriver-wrench-regular',\n        subMenu: [\n            // -- API Usage\n            {\n                title: 'navBar.commandView.itAndIntegrations.subMenu.apiUsage',\n                link: '#/admin/platformusage/api',\n                hide: not(perm('oauth:client:view')),\n                keywords: 'navBar.pageKeywords.platformUsage'\n            },\n\n            // -- Audit Viewer\n            {\n                title: 'navBar.commandView.itAndIntegrations.subMenu.auditViewer',\n                link: '#/admin/troubleshooting/auditviewer',\n                hide: not(perm('audits:audit:view')),\n                keywords: 'navBar.pageKeywords.auditViewer'\n            },\n\n            // -- Authorized Applications\n            {\n                title: 'navBar.commandView.itAndIntegrations.subMenu.authorizedApplications',\n                link: '#/admin/access-management/authorized-apps',\n                hide: not(perm('oauth:client:authorize'))\n            },\n\n            // -- Clients\n            {\n                title: 'navBar.commandView.itAndIntegrations.subMenu.clients',\n                link: '#/partners/ui/clients',\n                hide: not(perm('affiliateOrganization:clients:view'))\n            },\n\n            // -- Disconnect Interactions\n            {\n                title: 'navBar.commandView.itAndIntegrations.subMenu.disconnectInteractions',\n                link: '#/admin/routing/disconnectInteractions',\n                hide: not(perm('conversation:communication:disconnect'))\n            },\n\n            // -- Documents\n            {\n                title: 'navBar.commandView.itAndIntegrations.subMenu.documents',\n                link: '#/admin/contentManagement/admin/workspaces',\n                hide: not(perm('content_management_admin'))\n            },\n\n            // -- Integrations\n            {\n                title: 'navBar.commandView.itAndIntegrations.subMenu.integrations',\n                link: '#/admin/integrations/apps',\n                hide: not(perm('integrations:integration:view'))\n            },\n\n            // -- Data Actions\n            {\n                title: 'navBar.commandView.itAndIntegrations.subMenu.dataActions',\n                link: '#/admin/integrations/actions',\n                hide: not(and(perm('integrations:action:view'), perm('integrations:integration:view')))\n            },\n\n            // -- Log Capture\n            {\n                title: 'navBar.commandView.itAndIntegrations.subMenu.logCapture',\n                link: '#/admin/troubleshooting/logcapture',\n                hide: not(\n                    or(\n                        perm('troubleshooting:logCapture:add'),\n                        perm('troubleshooting:logCapture:delete'),\n                        perm('troubleshooting:logCapture:edit'),\n                        perm('troubleshooting:logCapture:view')\n                    )\n                )\n            },\n\n            // -- OAuth\n            {\n                title: 'navBar.commandView.itAndIntegrations.subMenu.oAuth',\n                link: '#/admin/access-management/oauth-clients',\n                hide: not(perm('oauth:client:view')),\n                keywords: 'navBar.pageKeywords.oAuth'\n            },\n\n            // -- Operational Console\n            {\n                title: 'navBar.commandView.itAndIntegrations.subMenu.operationalConsole',\n                link: '#/admin/troubleshooting/operational-console',\n                hide: not(or(perm('usage:events:view'), perm('usage:eventsquery:view'))),\n                keywords: 'navBar.pageKeywords.operationalConsole'\n            },\n\n            // -- Single Sign-on\n            {\n                title: 'navBar.commandView.itAndIntegrations.subMenu.singleSignon',\n                link: '#/admin/identity/providers',\n                hide: not(perm('sso:provider:view')),\n                keywords: 'navBar.pageKeywords.sso'\n            },\n\n            // -- AudioHook Monitors Configuration\n            {\n                title: 'navBar.commandView.itAndIntegrations.subMenu.audioHookMonitors',\n                link: '#/admin/integrations/audiohook/monitors',\n                hide: or(not(ft('PURE-5110_AudioHook-Monitor-Config')), not(perm('integration:audioHookMonitor:view'))),\n                keywords: 'navBar.pageKeywords.audioHookMonitors'\n            }\n        ]\n    },\n\n    // Account\n    {\n        title: 'navBar.commandView.account.title',\n        icon: 'fa/building-user-regular',\n        customImageLocation: '#fa-building-user-regular',\n        subMenu: [\n            // -- Digital Data Filtering Rules\n            {\n                title: 'navBar.commandView.account.subMenu.digitalDataFiltering',\n                link: '#/admin/dataprivacy/maskingrules',\n                hide: not(\n                    or(\n                        perm('billing:subscription:read'),\n                        perm('billing:subscription:view'),\n                        perm('billing:subscription:create'),\n                        perm('billing:subscription:add'),\n                        perm('billing:subscription:edit')\n                    )\n                )\n            },\n\n            // -- Subscription\n            {\n                title: 'navBar.commandView.account.subMenu.subscription',\n                link: '#/admin/billing/summary',\n                hide: not(\n                    or(\n                        perm('billing:subscription:read'),\n                        perm('billing:subscription:view'),\n                        perm('billing:subscription:create'),\n                        perm('billing:subscription:add'),\n                        perm('billing:subscription:edit')\n                    )\n                )\n            },\n\n            // -- Organization Settings\n            {\n                title: 'navBar.commandView.account.subMenu.organizationSettings',\n                link: '#/admin/organization',\n                hide: not(or(perm('integrations:integration:*'), perm('telephony:plugin:all')))\n            },\n\n            // -- Usage\n            {\n                title: 'navBar.commandView.account.subMenu.usage',\n                link: '#/admin/usage',\n                hide: not(and(perm('billing:usage:view'), ft('PURE-6828_refinery_launch')))\n            },\n\n            // -- Multi-Org Management\n            {\n                title: 'navBar.commandView.account.subMenu.multiOrgManagement',\n                hide: not(\n                    or(\n                        and(\n                            ft('PURE-6270_failover_conductor'),\n                            or(perm('multiOrg:pairing:view'), perm('adminNotice:failoverNotice:add'))\n                        ),\n                        and(\n                            ft('PURE-6225_mrmo_replication'),\n                            or(perm('multiOrg:pairing:view'), perm('multiOrg:replication:view'))\n                        )\n                    )\n                ),\n                subMenu: [\n                    // -- Multi-Org Overview\n                    {\n                        title: 'navBar.commandView.account.subMenu.multiOrgOverview',\n                        link: '#/admin/multi-org-management',\n                        hide: not(\n                            or(\n                                and(\n                                    ft('PURE-6270_failover_conductor'),\n                                    or(perm('multiOrg:pairing:view'), perm('adminNotice:failoverNotice:add'))\n                                ),\n                                and(\n                                    ft('PURE-6225_mrmo_replication'),\n                                    or(perm('multiOrg:pairing:view'), perm('multiOrg:replication:view'))\n                                )\n                            )\n                        )\n                    },\n                    // -- Organization Pairing\n                    {\n                        title: 'navBar.commandView.account.subMenu.orgPairing',\n                        link: '#/admin/multi-org-management/org-pairing',\n                        hide: not(\n                            and(\n                                or(ft('PURE-6270_failover_conductor'), ft('PURE-6225_mrmo_replication')),\n                                perm('multiOrg:pairing:view')\n                            )\n                        )\n                    },\n                    // -- Replication\n                    {\n                        title: 'navBar.commandView.account.subMenu.replication',\n                        link: '#/admin/multi-org-management/replication',\n                        hide: not(and(ft('PURE-6225_mrmo_replication'), perm('multiOrg:replication:view')))\n                    },\n                    // -- User Switching\n                    {\n                        title: 'navBar.commandView.account.subMenu.userSwitchingConfiguration',\n                        link: '#/admin/multi-org-management/user-switching',\n                        hide: not(and(ft('PURE-6270_failover_conductor'), perm('adminNotice:failoverNotice:add')))\n                    }\n                ]\n            },\n\n            // -- Genesys AppFoundry\n            {\n                title: 'navBar.commandView.account.subMenu.appFoundry',\n                link: 'https://appfoundry.genesys.com/',\n                icon: 'external-link',\n                hide: not(\n                    or(\n                        perm('billing:subscription:read'),\n                        perm('billing:subscription:view'),\n                        perm('billing:subscription:create'),\n                        perm('billing:subscription:add'),\n                        perm('billing:subscription:edit')\n                    )\n                ),\n                externalLink: true\n            }\n        ]\n    }\n];\n\nexport function exportNavConfiguration() {\n    return JSON.stringify(NavMenu);\n}\n\n// @ts-ignore\nif (!window.Genesys) window.Genesys = [];\n// @ts-ignore\nwindow.Genesys['exportNavConfiguration'] = exportNavConfiguration;\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"hPHoQ4Dh\",\"block\":\"[[[10,0],[15,0,[29,[\\\"logo-group \\\",[52,[33,1],\\\"submenu-only\\\"]]]],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"logo\\\"],[12],[1,\\\"\\\\n        \\\"],[10,3],[14,6,\\\"#/\\\"],[14,0,\\\"logo-image\\\"],[15,\\\"aria-label\\\",[28,[37,2],[\\\"navBar.commandView.goHome\\\"],null]],[12],[1,\\\"\\\\n            \\\"],[10,\\\"img\\\"],[14,0,\\\"icon-logo-genesys\\\"],[14,\\\"src\\\",\\\"assets/images/adaptive-g-orange.png\\\"],[15,\\\"alt\\\",[28,[37,2],[\\\"navBar.commandView.goHome\\\"],null]],[12],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"placement\\\",\\\"bottom\\\"],[14,0,\\\"home-button-tooltip\\\"],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,2],[\\\"navBar.commandView.goHome\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,\\\"gux-button-slot\\\"],[14,0,\\\"main-menu-toggle\\\"],[14,\\\"accent\\\",\\\"tertiary\\\"],[12],[1,\\\"\\\\n        \\\"],[11,\\\"button\\\"],[24,1,\\\"navigation-menu\\\"],[16,\\\"aria-expanded\\\",[52,[33,3],\\\"true\\\",\\\"false\\\"]],[16,\\\"aria-label\\\",[28,[37,2],[\\\"navBar.navigationMenu\\\"],null]],[24,4,\\\"button\\\"],[4,[38,4],[[30,0],\\\"toggleNav\\\"],null],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"close\\\"],[15,\\\"screenreader-text\\\",[28,[37,2],[\\\"navBar.commandView.closeNav\\\"],null]],[14,\\\"size\\\",\\\"inherit\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"menu\\\"],[15,\\\"screenreader-text\\\",[28,[37,2],[\\\"navBar.commandView.openNav\\\"],null]],[14,\\\"size\\\",\\\"inherit\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[10,\\\"gux-truncate\\\"],[14,0,\\\"main-menu-toggle-menu-text\\\"],[12],[1,\\\"\\\\n                \\\"],[10,1],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,2],[\\\"navBar.appLinks\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,3],[[[1,\\\"        \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"placement\\\",\\\"bottom\\\"],[14,0,\\\"close-button-tooltip\\\"],[14,\\\"for\\\",\\\"navigation-menu\\\"],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,2],[\\\"navBar.appLinksClose\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"placement\\\",\\\"bottom\\\"],[14,0,\\\"main-menu-toggle-menu-tooltip\\\"],[14,\\\"for\\\",\\\"navigation-menu\\\"],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,2],[\\\"navBar.appLinks\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[13],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"nav-container\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"nav\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"ul\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,6],[[28,[37,6],[[33,7]],null]],null],null,[[[41,[33,3],[[[41,[30,1,[\\\"subMenu\\\"]],[[[1,\\\"                        \\\"],[10,\\\"li\\\"],[14,0,\\\"menu-item-container\\\"],[15,\\\"aria-hidden\\\",[29,[[52,[33,1],\\\"true\\\"]]]],[15,\\\"inert\\\",[36,1]],[12],[1,\\\"\\\\n                            \\\"],[10,\\\"gux-button-slot\\\"],[14,\\\"accent\\\",\\\"ghost\\\"],[14,0,\\\"nav-item\\\"],[12],[1,\\\"\\\\n                                \\\"],[10,\\\"button\\\"],[15,0,[29,[[52,[28,[37,8],[[33,9,[\\\"title\\\"]],[30,1,[\\\"title\\\"]]],null],\\\"selected\\\"]]]],[15,\\\"onclick\\\",[28,[37,4],[[30,0],\\\"selectMenu\\\",[30,1],[52,[28,[37,8],[[33,9,[\\\"title\\\"]],[30,1,[\\\"title\\\"]]],null],\\\"selected\\\"]],null]],[15,\\\"aria-expanded\\\",[52,[28,[37,8],[[33,9,[\\\"title\\\"]],[30,1,[\\\"title\\\"]]],null],\\\"true\\\",\\\"false\\\"]],[15,1,[30,1,[\\\"title\\\"]]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                                    \\\"],[10,1],[14,0,\\\"title-items\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,1,[\\\"customImageLocation\\\"]],[[[1,\\\"                                            \\\"],[10,\\\"svg\\\"],[14,0,\\\"custom-icon\\\"],[14,\\\"role\\\",\\\"presentation\\\"],[12],[1,\\\"\\\\n                                                \\\"],[10,\\\"use\\\"],[15,\\\"xlink:href\\\",[29,[[30,1,[\\\"customImageLocation\\\"]]]],\\\"http://www.w3.org/1999/xlink\\\"],[12],[13],[1,\\\"\\\\n                                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                            \\\"],[10,\\\"gux-icon\\\"],[15,\\\"icon-name\\\",[30,1,[\\\"icon\\\"]]],[14,\\\"decorative\\\",\\\"true\\\"],[14,\\\"size\\\",\\\"inherit\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                                        \\\"],[10,0],[14,0,\\\"link-title\\\"],[12],[1,\\\"\\\\n                                            \\\"],[10,\\\"gux-truncate\\\"],[12],[1,\\\"\\\\n                                                \\\"],[1,[28,[35,2],[[30,1,[\\\"title\\\"]]],null]],[1,\\\"\\\\n                                            \\\"],[13],[1,\\\"\\\\n                                        \\\"],[13],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,8],[[33,9,[\\\"title\\\"]],[30,1,[\\\"title\\\"]]],null],[[[1,\\\"                                        \\\"],[10,1],[14,0,\\\"action-icons\\\"],[12],[1,\\\"\\\\n                                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"custom/chevron-right-small-regular\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[14,\\\"size\\\",\\\"inherit\\\"],[12],[13],[1,\\\"\\\\n                                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[30,1,[\\\"externalLink\\\"]],[[[1,\\\"                                        \\\"],[10,1],[14,0,\\\"action-icons-hovers\\\"],[12],[1,\\\"\\\\n                                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"external-link\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[14,\\\"size\\\",\\\"inherit\\\"],[12],[13],[1,\\\"\\\\n                                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                        \\\"],[10,1],[14,0,\\\"action-icons-hovers\\\"],[12],[1,\\\"\\\\n                                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"custom/chevron-right-small-regular\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[14,\\\"size\\\",\\\"inherit\\\"],[12],[13],[1,\\\"\\\\n                                        \\\"],[13],[1,\\\"\\\\n                                    \\\"]],[]]]],[]]],[1,\\\"                                \\\"],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,\\\"li\\\"],[14,0,\\\"menu-item-container link-title-container\\\"],[15,\\\"aria-hidden\\\",[29,[[52,[33,1],\\\"true\\\"]]]],[15,\\\"inert\\\",[36,1]],[12],[1,\\\"\\\\n                            \\\"],[10,3],[15,0,[29,[\\\"nav-item nav-link \\\",[52,[28,[37,8],[[33,10],[30,1,[\\\"link\\\"]]],null],\\\"selected\\\"]]]],[15,6,[30,1,[\\\"link\\\"]]],[15,\\\"onclick\\\",[28,[37,4],[[30,0],\\\"handleLinkAction\\\",[30,1]],null]],[15,\\\"target\\\",[52,[28,[37,8],[[30,1,[\\\"externalLink\\\"]],true],null],\\\"_blank\\\",\\\"\\\"]],[15,\\\"aria-current\\\",[29,[[52,[28,[37,8],[[33,10],[30,1,[\\\"link\\\"]]],null],\\\"page\\\",\\\"false\\\"]]]],[15,1,[30,1,[\\\"title\\\"]]],[12],[1,\\\"\\\\n                                \\\"],[10,0],[14,0,\\\"link-title title-items\\\"],[12],[1,\\\"\\\\n                                    \\\"],[10,\\\"gux-icon\\\"],[15,\\\"icon-name\\\",[30,1,[\\\"icon\\\"]]],[14,\\\"decorative\\\",\\\"true\\\"],[14,\\\"size\\\",\\\"inherit\\\"],[12],[13],[1,\\\"\\\\n                                    \\\"],[10,\\\"gux-truncate\\\"],[12],[1,\\\"\\\\n                                        \\\"],[1,[28,[35,2],[[30,1,[\\\"title\\\"]]],null]],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,8],[[33,9,[\\\"title\\\"]],[30,1,[\\\"title\\\"]]],null],[[[1,\\\"                                    \\\"],[10,1],[14,0,\\\"action-icons\\\"],[12],[1,\\\"\\\\n                                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"custom/chevron-right-small-regular\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[14,\\\"size\\\",\\\"inherit\\\"],[12],[13],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[30,1,[\\\"externalLink\\\"]],[[[1,\\\"                                    \\\"],[10,1],[14,0,\\\"action-icons-hovers\\\"],[12],[1,\\\"\\\\n                                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"external-link\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[14,\\\"size\\\",\\\"inherit\\\"],[12],[13],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n                                \\\"]],[]],null]],[]]],[1,\\\"                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[]],null],[1,\\\"\\\\n                \\\"],[10,\\\"li\\\"],[15,0,[29,[\\\"submenu-bar \\\",[52,[28,[37,8],[[33,9,[\\\"title\\\"]],[30,1,[\\\"title\\\"]]],null],\\\"submenu-open\\\"]]]],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,11],[[33,3],[28,[37,8],[[33,9,[\\\"title\\\"]],[30,1,[\\\"title\\\"]]],null]],null],[[[1,\\\"                        \\\"],[10,\\\"ul\\\"],[14,0,\\\"submenu-scroll-container\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,\\\"li\\\"],[15,0,[29,[\\\"submenu-specifics \\\",[52,[33,1],\\\"\\\",\\\"hide-menu\\\"]]]],[12],[1,\\\"\\\\n\\\\n                                \\\"],[10,0],[14,0,\\\"nav-item submenu-title\\\"],[12],[1,[34,12]],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,1],[[[1,\\\"                                    \\\"],[10,0],[14,0,\\\"submenu-return-container\\\"],[12],[1,\\\"\\\\n                                        \\\"],[10,\\\"gux-button-slot\\\"],[14,\\\"accent\\\",\\\"primary\\\"],[14,0,\\\"nav-item submenu-return\\\"],[12],[1,\\\"\\\\n                                            \\\"],[10,\\\"button\\\"],[15,\\\"onclick\\\",[28,[37,4],[[30,0],\\\"returnMain\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                                                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"arrow-left\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[14,\\\"size\\\",\\\"inherit\\\"],[12],[13],[1,\\\"\\\\n                                                \\\"],[10,0],[12],[1,\\\"\\\\n                                                    \\\"],[1,[28,[35,2],[\\\"navBar.commandView.subMenuReturn\\\"],null]],[1,\\\"\\\\n                                                \\\"],[13],[1,\\\"\\\\n                                            \\\"],[13],[1,\\\"\\\\n                                        \\\"],[13],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                            \\\"],[13],[1,\\\"\\\\n\\\"],[42,[28,[37,6],[[28,[37,6],[[33,9,[\\\"subMenu\\\"]]],null]],null],null,[[[41,[30,2,[\\\"subMenu\\\"]],[[[1,\\\"                                    \\\"],[10,\\\"li\\\"],[14,0,\\\"menu-item-container\\\"],[12],[1,\\\"\\\\n                                        \\\"],[1,[28,[35,13],null,[[\\\"menu\\\",\\\"activeLink\\\",\\\"narrowWidth\\\",\\\"selectReturn\\\"],[[30,2],[33,14],[33,15],[33,16]]]]],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                    \\\"],[10,\\\"li\\\"],[14,0,\\\"menu-item-container sublink-title-container\\\"],[12],[1,\\\"\\\\n                                        \\\"],[10,3],[15,0,[29,[\\\"nav-item nav-link \\\",[52,[28,[37,8],[[33,10],[30,2,[\\\"link\\\"]]],null],\\\"selected\\\"]]]],[15,6,[30,2,[\\\"link\\\"]]],[15,\\\"onclick\\\",[28,[37,4],[[30,0],\\\"handleLinkAction\\\",[30,2]],null]],[15,\\\"target\\\",[52,[28,[37,8],[[30,2,[\\\"icon\\\"]],\\\"external-link\\\"],null],\\\"_blank\\\",\\\"\\\"]],[15,\\\"aria-current\\\",[29,[[52,[28,[37,8],[[33,10],[30,2,[\\\"link\\\"]]],null],\\\"page\\\",\\\"false\\\"]]]],[15,1,[30,2,[\\\"title\\\"]]],[12],[1,\\\"\\\\n                                            \\\"],[10,0],[14,0,\\\"sublink-title\\\"],[12],[1,\\\"\\\\n                                                \\\"],[10,\\\"gux-truncate\\\"],[12],[1,\\\"\\\\n                                                    \\\"],[1,[28,[35,2],[[30,2,[\\\"title\\\"]]],null]],[1,\\\"\\\\n                                                \\\"],[13],[1,\\\"\\\\n                                            \\\"],[13],[1,\\\"\\\\n\\\"],[41,[30,2,[\\\"externalLink\\\"]],[[[1,\\\"                                                \\\"],[10,1],[14,0,\\\"action-icons-hovers\\\"],[12],[1,\\\"\\\\n                                                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"external-link\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[14,\\\"size\\\",\\\"inherit\\\"],[12],[13],[1,\\\"\\\\n                                                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                                        \\\"],[13],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[2]],null],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[\\\"topMenuItem\\\",\\\"subMenuItem\\\"],false,[\\\"if\\\",\\\"subMenuOnly\\\",\\\"t\\\",\\\"navIsOpen\\\",\\\"action\\\",\\\"each\\\",\\\"-track-array\\\",\\\"menuStructure\\\",\\\"eq\\\",\\\"activeMenu\\\",\\\"selectedLink\\\",\\\"and\\\",\\\"selectedTitle\\\",\\\"command-subnav\\\",\\\"activeLink\\\",\\\"narrowWidth\\\",\\\"selectReturn\\\"]]\",\"moduleName\":\"web-directory/components/command-nav/template.hbs\",\"isStrictMode\":false});","import Ember from 'ember';\nimport Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport OpenWindowHandler from 'web-directory/services/apps-api-handlers/open-window-handler';\nimport { Maybe } from 'web-directory/types';\n\nconst { getOwner } = Ember;\nexport const APP_SIDEBAR_PANEL_NAME_PREFIX = 'account-switcher-';\n\nexport default Component.extend({\n    classNames: ['command-panel-account-switcher'],\n\n    shownAppId: null as Maybe<string>,\n\n    widgetHandlers: computed(function () {\n        const handlers = [];\n\n        // ownerInjection() must be merged into the first argument in Ember 3.28\n        handlers.push(\n            OpenWindowHandler.create(\n                Object.assign(\n                    { isActiveApp: (id: string) => id === this.get('activeWidgetAppId') },\n                    getOwner(this).ownerInjection()\n                )\n            )\n        );\n        return handlers;\n    }),\n\n    actions: {}\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"zdgjBiMq\",\"block\":\"[[[1,[34,0]]],[],false,[\\\"account-switcher-frame-router\\\"]]\",\"moduleName\":\"web-directory/components/command-panel-account-switcher/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { inject } from '@ember/service';\n\nexport default Component.extend({\n    classNames: ['agent-ui-wrapper', 'active'] as const,\n\n    application: inject('application'),\n\n    session: inject('session'),\n\n    interaction: inject('interaction'),\n    acdworkitem: inject('acdworkitem'),\n\n    streaming: inject('streaming'),\n    emergencyLocation: inject('emergency-location'),\n\n    // todo, follow up about pinning PEF\n    panelsOverrideObject: null\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"HmWxkOna\",\"block\":\"[[[41,[33,1,[\\\"useModes\\\"]],[[[1,\\\"    \\\"],[1,[34,2]],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,1,[\\\"useMultipanel\\\"]],[[[1,\\\"    \\\"],[1,[28,[35,3],null,[[\\\"active\\\",\\\"isPopout\\\",\\\"onQueue\\\",\\\"selectedInteraction\\\",\\\"requestedInteraction\\\",\\\"activeInteractions\\\",\\\"activeWorkitems\\\",\\\"panelsOverrideObject\\\",\\\"emergencyLocationData\\\",\\\"emergencyLocationOn\\\",\\\"streamingConnected\\\"],[true,[33,4,[\\\"isPopout\\\"]],[33,1,[\\\"person\\\",\\\"isOnQueue\\\"]],[33,5,[\\\"selectedInteraction\\\"]],[33,5,[\\\"requestedInteraction\\\"]],[33,5,[\\\"activeInteractions\\\"]],[33,6,[\\\"activeWorkitems\\\"]],[33,7],[33,8,[\\\"emergencyLocationData\\\"]],[33,1,[\\\"features\\\",\\\"emergencyLocation\\\"]],[33,9,[\\\"connectedV2\\\"]]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"    \\\"],[1,[28,[35,10],null,[[\\\"active\\\",\\\"isPopout\\\",\\\"onQueue\\\",\\\"selectedInteraction\\\",\\\"requestedInteraction\\\",\\\"activeInteractions\\\",\\\"activeWorkitems\\\",\\\"panelsOverrideObject\\\",\\\"emergencyLocationData\\\",\\\"emergencyLocationOn\\\",\\\"streamingConnected\\\"],[true,[33,4,[\\\"isPopout\\\"]],[33,1,[\\\"person\\\",\\\"isOnQueue\\\"]],[33,5,[\\\"selectedInteraction\\\"]],[33,5,[\\\"requestedInteraction\\\"]],[33,5,[\\\"activeInteractions\\\"]],[33,6,[\\\"activeWorkitems\\\"]],[33,7],[33,8,[\\\"emergencyLocationData\\\"]],[33,1,[\\\"features\\\",\\\"emergencyLocation\\\"]],[33,9,[\\\"connectedV2\\\"]]]]]],[1,\\\"\\\\n\\\"]],[]]]],[]]]],[],false,[\\\"if\\\",\\\"session\\\",\\\"mode-manager\\\",\\\"acd-interactions-panel-v2\\\",\\\"application\\\",\\\"interaction\\\",\\\"acdworkitem\\\",\\\"panelsOverrideObject\\\",\\\"emergencyLocation\\\",\\\"streaming\\\",\\\"acd-interactions-panel\\\"]]\",\"moduleName\":\"web-directory/components/command-panel-agent/template.hbs\",\"isStrictMode\":false});","import Ember from 'ember';\nimport Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { inject } from '@ember/service';\nimport OpenWindowHandler from 'web-directory/services/apps-api-handlers/open-window-handler';\nimport { Maybe } from 'web-directory/types';\nimport { POOL_STATES } from 'web-directory/models/app-pool';\n\nconst { getOwner } = Ember;\nexport const APP_SIDEBAR_PANEL_NAME_PREFIX = 'apps-';\n\nexport default Component.extend({\n    classNames: ['command-panel-apps'],\n\n    apps: inject('apps'),\n\n    shownAppId: null as Maybe<string>,\n\n    activeWidgetAppId: Ember.computed('apps.widgetAppPool.currState', function () {\n        let result = null;\n\n        let currPoolState = this.get('apps.widgetAppPool.currState');\n        if (currPoolState && currPoolState.name === POOL_STATES.SHOWING_APP) {\n            result = currPoolState.details.appId;\n        }\n\n        return result;\n    }),\n\n    widgetHandlers: computed(function () {\n        const handlers = [];\n\n        // ownerInjection() must be merged into the first argument in Ember 3.28\n        handlers.push(\n            OpenWindowHandler.create(\n                Object.assign(\n                    { isActiveApp: (id: string) => id === this.get('activeWidgetAppId') },\n                    getOwner(this).ownerInjection()\n                )\n            )\n        );\n        return handlers;\n    }),\n\n    actions: {\n        onWidgetAppSelectionChange(widgetAppId: string) {\n            this.set('shownAppId', widgetAppId);\n        },\n\n        onWidgetAppInstanceApiCall(apiCall: any) {\n            this.get('apps').handleAppApiCall(apiCall, this.get('widgetHandlers'));\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"R8cs/iRl\",\"block\":\"[[[1,[28,[35,0],null,[[\\\"appPool\\\",\\\"initialAutoSelect\\\",\\\"initialSelectedAppId\\\",\\\"appSelectionChanged\\\",\\\"onAppInstanceApiCall\\\"],[[33,1,[\\\"widgetAppPool\\\"]],true,[33,2],[28,[37,3],[[30,0],\\\"onWidgetAppSelectionChange\\\"],null],[28,[37,3],[[30,0],\\\"onWidgetAppInstanceApiCall\\\"],null]]]]]],[],false,[\\\"apps-sidebar-panel\\\",\\\"apps\\\",\\\"shownAppId\\\",\\\"action\\\"]]\",\"moduleName\":\"web-directory/components/command-panel-apps/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { inject } from '@ember/service';\nimport {\n    AppPool,\n    GcAppContext,\n    IframeAppDef,\n    AppLogger,\n    AppLogDetails,\n    TraceLoggerLevel,\n    AppDef,\n    TelemetryAgent,\n    MessageHandlerChain,\n    buildChainFailureLogDetails\n} from '@genesys/apps-v2-host';\nimport { AppViewStackHostLayoutController } from '@genesys/apps-v2-host-layout';\nimport appUtils from 'web-directory/utils/apps';\nimport { addPageAction } from 'web-directory/utils/newrelic';\nimport { assertNever } from 'web-directory/utils/types';\nimport { MonitoringMessageHandler } from 'web-directory/services/apps-v2-api-handlers/monitoring-message-handler';\nimport { HawkMessageHandler } from 'web-directory/services/apps-v2-api-handlers/hawk-message-handler';\nimport { OpenWindowHandler } from 'web-directory/services/apps-v2-api-handlers/open-window-handler';\nimport { ModalMessageHandler } from 'web-directory/services/apps-v2-api-handlers/modal-message-handler';\nimport { ToastMessageHandler } from 'web-directory/services/apps-v2-api-handlers/toast-handler';\nimport {\n    buildFindInstanceState,\n    buildFindWorkerInstance,\n    buildGuardedSendMessageByInstanceId\n} from 'web-directory/services/apps-v2-api-handlers/apps-v2-sdk-handler';\n\nconst LOCALHOST_URL = 'https://localhost:4446/';\nconst LOCAL_PROXY_URL = 'https://localhost:4300/__goose/';\n\nexport default Component.extend({\n    classNames: ['command-panel-copilot-framework'],\n\n    application: inject('application'),\n    intl: inject('intl'),\n    session: inject('session'),\n    logger: inject('stash-logger'),\n    streaming: inject('streaming'),\n    alerting: inject('alerting'),\n    notification: inject('notification'),\n\n    appPool: null as AppPool | null,\n    layoutController: null as AppViewStackHostLayoutController | null,\n\n    gadgetTargetOrigin: computed<string>('application.runtime', function () {\n        const runtimeEnv = this.get('application.runtime');\n        if (runtimeEnv.local) {\n            return `https://apps.${runtimeEnv.publicDomainName}`;\n        }\n        return window.location.origin;\n    }),\n\n    init() {\n        this._super(...arguments);\n\n        const appDef = this.getAppDef();\n\n        const logToStashLogger = this.get('logToStashLogger').bind(this);\n        const logger: AppLogger = {\n            info: (msg, details) => {\n                logToStashLogger('info', msg, details);\n            },\n            debug: (msg, details) => {\n                logToStashLogger('debug', msg, details);\n            },\n            warn: (msg, details) => {\n                logToStashLogger('warn', msg, details);\n            },\n            error: (msg, details) => {\n                logToStashLogger('error', msg, details);\n            }\n        };\n\n        const appPool = new AppPool(\n            {\n                copilotFramework: [appDef]\n            },\n            {\n                maxPoolSize: 1,\n                poolId: 'copilotFrameworkAppPool',\n                hostAppName: 'web-directory',\n                hostAppVersion: this.get('application').get('semver') || 'unknown',\n                allowedSandboxValues: [\n                    'allow-downloads',\n                    'allow-forms',\n                    'allow-modals',\n                    'allow-same-origin',\n                    'allow-scripts'\n                ],\n                allowedPermissionsPolicyValues: ['clipboard-write'],\n                logger,\n                getBootstrapData: appDef => this.getBootstrapData(appDef),\n                telemetryAgent: this.getTelemetryAgent(),\n                defaultTimeouts: {\n                    bootstrapReadyTimeoutMillis: 15000,\n                    bootstrapTimeoutMillis: 15000,\n                    loadTimeoutMillis: 15000,\n                    stopTimeoutMillis: 15000\n                }\n            }\n        );\n\n        this.set('appPool', appPool);\n\n        // Reduced message handler chain for copilot framework app\n        const findInstanceState = buildFindInstanceState(appPool);\n        const findWorkerInstance = buildFindWorkerInstance(appPool);\n        const guardedSendMessageByInstanceId = buildGuardedSendMessageByInstanceId(\n            appPool.sendMessageByInstanceId.bind(appPool),\n            findInstanceState,\n            findWorkerInstance\n        );\n        const messageHandlerChain = new MessageHandlerChain(\n            [\n                {\n                    handlerId: 'hawkMessageHandler',\n                    handler: new HawkMessageHandler({\n                        logger: this.get('logger'),\n                        sendMessageByInstanceId: guardedSendMessageByInstanceId,\n                        streamingService: this.get('streaming'),\n                        findInstanceState,\n                        findWorkerInstance\n                    })\n                },\n                {\n                    handlerId: 'modalMessageHandler',\n                    handler: new ModalMessageHandler({\n                        alerting: this.get('alerting'),\n                        findInstanceState,\n                        findWorkerInstance,\n                        sendMessageByInstanceId: guardedSendMessageByInstanceId\n                    })\n                },\n                {\n                    handlerId: 'monitoringMessageHandler',\n                    handler: new MonitoringMessageHandler({\n                        logger: this.get('logger'),\n                        addTelemetryEvent: addPageAction,\n                        findInstanceState,\n                        findWorkerInstance\n                    })\n                },\n                {\n                    handlerId: 'toastMessageHandler',\n                    handler: new ToastMessageHandler({\n                        logger: this.get('logger'),\n                        sendMessageByInstanceId: guardedSendMessageByInstanceId,\n                        notificationService: this.get('notification')\n                    })\n                },\n                {\n                    handlerId: 'openWindowHandler',\n                    handler: new OpenWindowHandler({ findInstanceState, findWorkerInstance })\n                }\n            ],\n            this.get('logger')\n        );\n\n        appPool.addMessageListener(async messageEnvelope => {\n            const chainResult = await messageHandlerChain.handleMessage(messageEnvelope);\n            if (chainResult.type === 'failure') {\n                this.get('logger').warn(\n                    'A chain error occurred while handling an Appsv2 message.',\n                    buildChainFailureLogDetails(chainResult, messageEnvelope)\n                );\n            }\n            return chainResult;\n        });\n\n        const controller = new AppViewStackHostLayoutController('copilotFramework', appPool, {\n            getLayoutTemplate: _groupId => {\n                return {\n                    visibleAppDefId: appDef.id,\n                    items: [\n                        {\n                            appDefId: appDef.id,\n                            active: true\n                        }\n                    ]\n                };\n            }\n        });\n\n        this.set('layoutController', controller);\n    },\n\n    didInsertElement() {\n        this.get('layoutController')?.updateState({\n            groupIds: ['copilotFramework'],\n            activeGroupId: 'copilotFramework'\n        });\n    },\n\n    getAppUrl() {\n        const gooseVersion = new URLSearchParams(window?.location?.search).get('gooseVersion');\n        const gadgetOrigin = this.get('gadgetTargetOrigin');\n        const local = gooseVersion === 'local';\n        const localProxy = gooseVersion === 'localProxy';\n\n        const url = gooseVersion\n            ? localProxy\n                ? LOCAL_PROXY_URL\n                : local\n                ? LOCALHOST_URL\n                : `${gadgetOrigin}/copilot-framework/${gooseVersion}`\n            : `${gadgetOrigin}/copilot-framework`;\n\n        return url;\n    },\n\n    getAppDef(): IframeAppDef {\n        return {\n            id: 'goose',\n            displayName: this.get('intl').t('copilotFramework.displayName'),\n            type: 'iframe',\n            src: new URL(this.getAppUrl()),\n            sandbox: ['allow-downloads', 'allow-forms', 'allow-scripts', 'allow-same-origin', 'allow-modals'],\n            startBehavior: 'lazy',\n            trustedDataPassing: true,\n            lifecycleConfig: {\n                bootstrap: true,\n                focus: true,\n                blur: true,\n                stop: true\n            },\n            allow: ['clipboard-write'],\n            icon: {\n                type: 'sparkV3SvgSprite',\n                classNames: ['restricted/custom/sparkles-solid']\n            }\n        };\n    },\n\n    logToStashLogger(level: TraceLoggerLevel, message: string, appLogDetails?: AppLogDetails) {\n        const logMessage = appUtils.buildCopilotFrameworkLogMsg(message);\n        const details = appUtils.buildStashLoggerDetails(appLogDetails?.getLogs());\n\n        switch (level) {\n            case 'info':\n                this.get('logger').info(logMessage, details);\n                break;\n            case 'debug':\n                this.get('logger').debug(logMessage, details);\n                break;\n            case 'warn':\n                this.get('logger').warn(logMessage, details);\n                break;\n            case 'error':\n                this.get('logger').error(logMessage, details);\n                break;\n            default:\n                assertNever(level);\n        }\n    },\n\n    getBootstrapData(appDef: AppDef): GcAppContext | {} {\n        if (appDef.type === 'iframe' && !appDef.trustedDataPassing) {\n            return {};\n        }\n\n        const { application, intl, session } = this.getProperties(['application', 'intl', 'session']);\n        const basicContext: GcAppContext = {\n            type: 'gcApp',\n            langTag: intl.get('isoLocale') || 'en-us',\n            accessToken: session.get('accessToken') || '',\n            userId: session.get('user').id || '',\n            envName: application.get('runtime').name\n        };\n\n        return basicContext;\n    },\n\n    getTelemetryAgent(): TelemetryAgent {\n        return {\n            addTelemetryEvent: (name: string, attributes?: null | Record<string, unknown>) => {\n                addPageAction(name, {\n                    ...attributes,\n                    gcAppName: 'copilotFramework'\n                });\n            }\n        };\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n\n        this.get('layoutController')?.updateState({\n            groupIds: [],\n            activeGroupId: null\n        });\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"vqjdULgv\",\"block\":\"[[[1,[28,[35,0],null,[[\\\"name\\\",\\\"isVisible\\\"],[\\\"copilotFramework\\\",true]]]]],[],false,[\\\"app-view-stack\\\"]]\",\"moduleName\":\"web-directory/components/command-panel-copilot-framework/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { inject } from '@ember/service';\nimport { GENESYS_HELP_DOMAIN } from 'web-directory/services/help';\n\nexport default Component.extend({\n    classNames: ['command-panel-help'],\n\n    help: inject('help'),\n    intl: inject('intl'),\n\n    embedConfig: computed('contextualHelpUrl', 'contextualHelpAnchor', function () {\n        return {\n            id: 'help-panel-embed',\n            url: this.get('contextualHelpAnchor')\n                ? `${this.get('contextualHelpUrl')}?theme=simplified${this.get('contextualHelpAnchor')}`\n                : `${this.get('contextualHelpUrl')}?theme=simplified`,\n            title: 'components.embeddedAppTitles.help',\n            sandbox: ['allow-same-origin', 'allow-scripts', 'allow-popups', 'allow-forms'],\n            permissionsPolicy: ['clipboard-write']\n        };\n    }),\n\n    releaseEmbedConfig: computed(function () {\n        return {\n            id: 'help-panel-embed',\n            url: `https://${GENESYS_HELP_DOMAIN}/release-notes-home/release-notes/?theme=simplified`,\n            sandbox: ['allow-same-origin', 'allow-scripts', 'allow-popups', 'allow-forms'],\n            permissionsPolicy: ['clipboard-write']\n        };\n    }),\n\n    /**\n     * Embed config for the About Accessibility page.\n     * Dynamically resolves the user's locale for the redirect URL.\n     */\n    accessibilityEmbedConfig: computed('intl.isoLocale', function () {\n        const locale = this.get('intl.isoLocale') || 'en-us';\n        return {\n            id: 'help-panel-accessibility-embed',\n            url: `https://${GENESYS_HELP_DOMAIN}/redirect/${locale}/admin/accessibility?theme=simplified`,\n            title: 'navBar.commandView.panelTitles.accessibility',\n            sandbox: ['allow-same-origin', 'allow-scripts', 'allow-popups', 'allow-forms'],\n            permissionsPolicy: ['clipboard-write']\n        };\n    }),\n\n    helpDomain: computed(function () {\n        return GENESYS_HELP_DOMAIN;\n    }),\n\n    contextualHelpUrl: computed.reads('help.contextualHelpUrl'),\n    contextualHelpAnchor: computed.readOnly('help.contextualHelpAnchor')\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"c9tD3ziU\",\"block\":\"[[[41,[28,[37,1],[[33,2],\\\"help-current-page\\\"],null],[[[1,\\\"    \\\"],[1,[28,[35,3],null,[[\\\"appConfig\\\"],[[33,4]]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,1],[[33,2],\\\"help-release-notes\\\"],null],[[[1,\\\"    \\\"],[1,[28,[35,3],null,[[\\\"appConfig\\\"],[[33,5]]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,1],[[33,2],\\\"help-resources\\\"],null],[[[1,\\\"    \\\"],[10,0],[15,0,[29,[\\\"tab-pane \\\",[52,[33,6],\\\"active\\\"]]]],[14,\\\"role\\\",\\\"tabpanel\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"ul\\\"],[14,0,\\\"list-help-links\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"li\\\"],[14,0,\\\"resource-center\\\"],[12],[1,\\\"\\\\n                \\\"],[10,3],[15,6,[29,[\\\"https://\\\",[36,7],\\\"/\\\"]]],[14,\\\"target\\\",\\\"pc-resource-center\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,1],[14,0,\\\"link-text\\\"],[12],[1,[28,[35,8],[\\\"help.resourceCenter\\\"],null]],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,\\\"li\\\"],[14,0,\\\"community\\\"],[12],[1,\\\"\\\\n                \\\"],[10,3],[14,6,\\\"https://community.genesys.com\\\"],[14,\\\"target\\\",\\\"pc-community\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,1],[14,0,\\\"link-text\\\"],[12],[1,[28,[35,8],[\\\"help.community\\\"],null]],[13],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"help-block\\\"],[12],[1,[28,[35,8],[\\\"help.communityDescription\\\"],null]],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,\\\"li\\\"],[14,0,\\\"training\\\"],[12],[1,\\\"\\\\n                \\\"],[10,3],[14,6,\\\"https://beyond.genesys.com/explore/genesys-cloud-cx-elearning\\\"],[14,\\\"target\\\",\\\"pc-training\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,1],[14,0,\\\"link-text\\\"],[12],[1,[28,[35,8],[\\\"help.training\\\"],null]],[13],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"help-block\\\"],[12],[1,[28,[35,8],[\\\"help.trainingDescription\\\"],null]],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,\\\"li\\\"],[14,0,\\\"knowledge-network\\\"],[12],[1,\\\"\\\\n                \\\"],[10,3],[14,6,\\\"https://orchestrators.genesys.com/\\\"],[14,\\\"target\\\",\\\"pc-knowledge-network\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,1],[14,0,\\\"link-text\\\"],[12],[1,[28,[35,8],[\\\"help.knowledgeNetwork\\\"],null]],[13],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"help-block\\\"],[12],[1,[28,[35,8],[\\\"help.knowledgeNetworkDescription\\\"],null]],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,\\\"li\\\"],[14,0,\\\"contact-support\\\"],[12],[1,\\\"\\\\n                \\\"],[8,[39,9],null,[[\\\"@route\\\"],[\\\"feedback\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n                    \\\"],[10,1],[14,0,\\\"link-text\\\"],[12],[1,[28,[35,8],[\\\"help.contact\\\"],null]],[13],[1,\\\"\\\\n                \\\"]],[]]]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,10],[[[1,\\\"                \\\"],[10,\\\"li\\\"],[14,0,\\\"download-desktop-app\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,3],[15,6,[36,10]],[14,\\\"target\\\",\\\"pc-download\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,1],[14,0,\\\"text\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,8],[\\\"help.downloadDesktopApplication\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n            \\\"],[10,\\\"li\\\"],[14,0,\\\"privacy-policy\\\"],[12],[1,\\\"\\\\n                \\\"],[10,3],[15,6,[29,[\\\"https://\\\",[36,7],\\\"/blog/article/purecloud-privacy-policy\\\"]]],[14,\\\"target\\\",\\\"pc-privacy-policy\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,1],[14,0,\\\"link-text\\\"],[12],[1,[28,[35,8],[\\\"help.privacyPolicy\\\"],null]],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,\\\"li\\\"],[14,0,\\\"release-notes\\\"],[12],[1,\\\"\\\\n                \\\"],[10,3],[15,6,[29,[\\\"https://\\\",[36,7],\\\"/release-notes/\\\"]]],[14,\\\"target\\\",\\\"pc-resource-center\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,1],[14,0,\\\"text\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,8],[\\\"help.releaseNotes\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,\\\"li\\\"],[14,0,\\\"about-link\\\"],[12],[1,\\\"\\\\n                \\\"],[8,[39,9],null,[[\\\"@route\\\"],[\\\"about\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n                    \\\"],[10,1],[14,0,\\\"link-text\\\"],[12],[1,[28,[35,8],[\\\"help.about\\\"],null]],[13],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"help-block\\\"],[12],[1,[28,[35,8],[\\\"help.aboutDescription\\\"],null]],[13],[1,\\\"\\\\n                \\\"]],[]]]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,1],[[33,2],\\\"help-search\\\"],null],[[[1,\\\"    \\\"],[1,[28,[35,11],null,[[\\\"embedResults\\\"],[true]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,1],[[33,2],\\\"help-logcapture\\\"],null],[[[1,\\\"    \\\"],[1,[34,12]],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,1],[[33,2],\\\"help-accessibility\\\"],null],[[[1,\\\"    \\\"],[1,[28,[35,3],null,[[\\\"appConfig\\\"],[[33,13]]]]],[1,\\\"\\\\n\\\"]],[]],null]],[]]]],[]]]],[]]]],[]]]],[]]],[1,\\\"\\\\n\\\"]],[],false,[\\\"if\\\",\\\"eq\\\",\\\"currentDrawerId\\\",\\\"app-embed\\\",\\\"embedConfig\\\",\\\"releaseEmbedConfig\\\",\\\"moreHelpTab\\\",\\\"helpDomain\\\",\\\"t\\\",\\\"link-to\\\",\\\"desktopAppUrl\\\",\\\"resource-center-search-v2\\\",\\\"log-capture-help\\\",\\\"accessibilityEmbedConfig\\\"]]\",\"moduleName\":\"web-directory/components/command-panel-help/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { inject } from '@ember/service';\nimport { run } from '@ember/runloop';\nimport {\n    AppPool,\n    GcAppContext,\n    IframeAppDef,\n    AppLogger,\n    AppLogDetails,\n    TraceLoggerLevel,\n    AppDef,\n    TelemetryAgent,\n    MessageHandlerChain,\n    buildChainFailureLogDetails\n} from '@genesys/apps-v2-host';\nimport { AppViewStackHostLayoutController } from '@genesys/apps-v2-host-layout';\nimport appUtils from 'web-directory/utils/apps';\nimport { addPageAction } from 'web-directory/utils/newrelic';\nimport { assertNever } from 'web-directory/utils/types';\nimport { MonitoringMessageHandler } from 'web-directory/services/apps-v2-api-handlers/monitoring-message-handler';\nimport { HawkMessageHandler } from 'web-directory/services/apps-v2-api-handlers/hawk-message-handler';\nimport { ToastMessageHandler } from 'web-directory/services/apps-v2-api-handlers/toast-handler';\nimport {\n    buildFindInstanceState,\n    buildFindWorkerInstance\n} from 'web-directory/services/apps-v2-api-handlers/apps-v2-sdk-handler';\n\nconst LOCALHOST_ORIGIN = 'https://localhost:4446';\n\nexport default Component.extend({\n    classNames: ['command-panel-notifications'],\n\n    application: inject('application'),\n    intl: inject('intl'),\n    session: inject('session'),\n    logger: inject('stash-logger'),\n    streaming: inject('streaming'),\n    alerting: inject('alerting'),\n    notification: inject('notification'),\n    commandNav: inject('command-nav'),\n\n    appPool: null as AppPool | null,\n    layoutController: null as AppViewStackHostLayoutController | null,\n\n    gadgetTargetOrigin: computed<string>('application.runtime', function () {\n        const runtimeEnv = this.get('application.runtime');\n        if (runtimeEnv.local) {\n            return `https://apps.${runtimeEnv.publicDomainName}`;\n        }\n        return window.location.origin;\n    }),\n\n    init() {\n        this._super(...arguments);\n\n        const appDef = this.getAppDef();\n\n        const logToStashLogger = this.get('logToStashLogger').bind(this);\n        const logger: AppLogger = {\n            info: (msg, details) => {\n                logToStashLogger('info', msg, details);\n            },\n            debug: (msg, details) => {\n                logToStashLogger('debug', msg, details);\n            },\n            warn: (msg, details) => {\n                logToStashLogger('warn', msg, details);\n            },\n            error: (msg, details) => {\n                logToStashLogger('error', msg, details);\n            }\n        };\n\n        const appPool = new AppPool(\n            {\n                notifications: [appDef]\n            },\n            {\n                maxPoolSize: 1,\n                poolId: 'notificationsAppPool',\n                hostAppName: 'web-directory',\n                hostAppVersion: this.get('application').get('semver') || 'unknown',\n                allowedSandboxValues: [\n                    'allow-downloads',\n                    'allow-forms',\n                    'allow-modals',\n                    'allow-same-origin',\n                    'allow-scripts',\n                    'allow-popups'\n                ],\n                logger,\n                getBootstrapData: appDef => this.getBootstrapData(appDef),\n                telemetryAgent: this.getTelemetryAgent(),\n                defaultTimeouts: {\n                    bootstrapReadyTimeoutMillis: 15000,\n                    bootstrapTimeoutMillis: 15000,\n                    loadTimeoutMillis: 15000,\n                    stopTimeoutMillis: 15000\n                }\n            }\n        );\n\n        this.set('appPool', appPool);\n\n        // Listen to attention count changes and update command-nav service\n        appPool.addPoolStateChangeListener(({ detail: { poolState } }) => {\n            run.next(this, () => {\n                if (this.get('isDestroying') || this.get('isDestroyed')) {\n                    return;\n                }\n                let attentionCount = 0;\n                Object.values(poolState).forEach(({ appDefs }) => {\n                    for (const { appDef, attentionCount: count } of appDefs) {\n                        if (appDef.id === 'notifications') {\n                            attentionCount = count || 0;\n                        }\n                    }\n                });\n                this.get('commandNav').set('notificationsAttentionCount', attentionCount);\n            });\n        });\n\n        const findInstanceState = buildFindInstanceState(appPool);\n        const findWorkerInstance = buildFindWorkerInstance(appPool);\n        const messageHandlerChain = new MessageHandlerChain(\n            [\n                {\n                    handlerId: 'hawkMessageHandler',\n                    handler: new HawkMessageHandler({\n                        logger: this.get('logger'),\n                        sendMessageByInstanceId: appPool.sendMessageByInstanceId.bind(appPool),\n                        streamingService: this.get('streaming'),\n                        findInstanceState,\n                        findWorkerInstance\n                    })\n                },\n                {\n                    handlerId: 'monitoringMessageHandler',\n                    handler: new MonitoringMessageHandler({\n                        logger: this.get('logger'),\n                        addTelemetryEvent: addPageAction,\n                        findInstanceState,\n                        findWorkerInstance\n                    })\n                },\n                {\n                    handlerId: 'toastMessageHandler',\n                    handler: new ToastMessageHandler({\n                        logger: this.get('logger'),\n                        sendMessageByInstanceId: appPool.sendMessageByInstanceId.bind(appPool),\n                        notificationService: this.get('notification')\n                    })\n                }\n            ],\n            this.get('logger')\n        );\n\n        appPool.addMessageListener(async messageEnvelope => {\n            try {\n                const chainResult = await messageHandlerChain.handleMessage(messageEnvelope);\n                if (chainResult.type === 'failure') {\n                    this.get('logger').warn(\n                        'A chain error occurred while handling an Appsv2 message.',\n                        buildChainFailureLogDetails(chainResult, messageEnvelope)\n                    );\n                }\n                return chainResult;\n            } catch (error) {\n                // Handle any errors from message handling\n                this.get('logger').error('Error handling Appsv2 message', { error });\n                return { type: 'failure' as const, error };\n            }\n        });\n\n        const controller = new AppViewStackHostLayoutController('notifications', appPool, {\n            getLayoutTemplate: _groupId => {\n                return {\n                    visibleAppDefId: appDef.id,\n                    items: [\n                        {\n                            appDefId: appDef.id,\n                            active: true\n                        }\n                    ]\n                };\n            }\n        });\n\n        this.set('layoutController', controller);\n    },\n\n    didInsertElement() {\n        this.get('layoutController')?.updateState({\n            groupIds: ['notifications'],\n            activeGroupId: 'notifications'\n        });\n    },\n\n    getAppUrl() {\n        const inboxUiVersion = new URLSearchParams(window?.location?.search).get('inboxUiVersion');\n        const gadgetOrigin = this.get('gadgetTargetOrigin');\n        const local = inboxUiVersion === 'local';\n\n        const url = inboxUiVersion\n            ? local\n                ? LOCALHOST_ORIGIN\n                : `${gadgetOrigin}/inbox-ui/${inboxUiVersion}`\n            : `${gadgetOrigin}/inbox-ui`;\n\n        return url;\n    },\n\n    getAppDef(): IframeAppDef {\n        return {\n            id: 'notifications',\n            displayName: this.get('intl').t('navBar.commandView.panelTitles.notifications'),\n            type: 'iframe',\n            src: new URL(this.getAppUrl()),\n            sandbox: [\n                'allow-downloads',\n                'allow-forms',\n                'allow-scripts',\n                'allow-same-origin',\n                'allow-modals',\n                'allow-popups'\n            ],\n            startBehavior: 'eager',\n            trustedDataPassing: true,\n            lifecycleConfig: {\n                bootstrap: true,\n                focus: true,\n                blur: true,\n                stop: true\n            },\n            icon: {\n                type: 'sparkV3SvgSprite',\n                classNames: ['bell']\n            }\n        };\n    },\n\n    logToStashLogger(level: TraceLoggerLevel, message: string, appLogDetails?: AppLogDetails) {\n        const logMessage = `[notifications] ${message}`;\n        const details = appUtils.buildStashLoggerDetails(appLogDetails?.getLogs());\n\n        switch (level) {\n            case 'info':\n                this.get('logger').info(logMessage, details);\n                break;\n            case 'debug':\n                this.get('logger').debug(logMessage, details);\n                break;\n            case 'warn':\n                this.get('logger').warn(logMessage, details);\n                break;\n            case 'error':\n                this.get('logger').error(logMessage, details);\n                break;\n            default:\n                assertNever(level);\n        }\n    },\n\n    getBootstrapData(appDef: AppDef): GcAppContext | {} {\n        if (appDef.type === 'iframe' && !appDef.trustedDataPassing) {\n            return {};\n        }\n\n        const { application, intl, session } = this.getProperties(['application', 'intl', 'session']);\n        const basicContext: GcAppContext = {\n            type: 'gcApp',\n            langTag: intl.get('isoLocale') || 'en-us',\n            accessToken: session.get('accessToken') || '',\n            userId: session.get('user').id || '',\n            envName: application.get('runtime').name\n        };\n\n        return basicContext;\n    },\n\n    getTelemetryAgent(): TelemetryAgent {\n        return {\n            addTelemetryEvent: (name: string, attributes?: null | Record<string, unknown>) => {\n                addPageAction(name, {\n                    ...attributes,\n                    gcAppName: 'notifications'\n                });\n            }\n        };\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n\n        this.get('layoutController')?.updateState({\n            groupIds: [],\n            activeGroupId: null\n        });\n\n        // Clean up the app pool. AppPool (from @genesys/apps-v2-host) exposes cleanup() as its\n        // teardown API; it has no dispose(). The previous dispose() call threw a TypeError that the\n        // catch below swallowed, so the pool was never torn down.\n        const appPool = this.get('appPool');\n        if (appPool) {\n            try {\n                appPool.cleanup();\n            } catch (e) {\n                console.warn('Failed to clean up notifications app pool', e);\n            }\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"oBabke5d\",\"block\":\"[[[1,[28,[35,0],null,[[\\\"name\\\",\\\"isVisible\\\"],[\\\"notifications\\\",true]]]],[1,\\\"\\\\n\\\\n\\\"]],[],false,[\\\"app-view-stack\\\"]]\",\"moduleName\":\"web-directory/components/command-panel-notifications/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { inject } from '@ember/service';\nimport { computed } from '@ember/object';\nimport { Panel, PanelDefinitions } from './panel-definition';\n\nconst DEFAULT_PANEL = 'panel-not-active';\nconst FT_COPILOT_FRAMEWORK = 'AI-1223_copilot-framework';\n\nexport default Component.extend({\n    classNames: ['command-panel'],\n    classNameBindings: ['panelIsNotActive::active', 'panelFullWidth:expanded', 'currentPanel', 'currentDrawerId'],\n\n    events: inject('events'),\n    commandNav: inject('command-nav'),\n    phone: inject('phone'),\n    chat: inject('chat'),\n    interaction: inject('interaction'),\n    acdworkitem: inject('acdworkitem'),\n    permissions: inject('permissions'),\n    session: inject('session'),\n\n    currentPanel: computed.reads('commandNav.currentPanel'),\n    currentDrawerId: computed.reads('commandNav.currentDrawer'),\n    panelFullWidth: computed.or('commandNav.expanded', 'narrowWidth'),\n\n    panelDefinitions: PanelDefinitions,\n\n    panelIsNotActive: computed.equal('currentPanel', DEFAULT_PANEL),\n\n    activeCall: computed.readOnly('phone.activeCall'),\n\n    acdCountLegacy: computed('interaction.acdCount', 'acdworkitem.activeWorkitems', function () {\n        const acdCount = this.get('interaction.acdCount') || 0;\n        const workitemCount = this.get('acdworkitem.activeWorkitems.length') || 0;\n        return acdCount + workitemCount > 0;\n    }),\n\n    /**\n     * @todo PURE-7222: figure out a better way to determine the acd count\n     */\n    acdCount: computed('session.useModes', 'acdCountLegacy', function () {\n        if (this.get('session.useModes')) {\n            console.warn('PURE-7222 [command-panel]: acdCount not currently supported.');\n\n            return 0;\n        }\n        return this.get('acdCountLegacy');\n    }),\n\n    voiceEnabled: computed.reads('phone.enabled'),\n\n    chatsEnabled: computed.readOnly('chat.enabled'),\n\n    copilotFrameworkEnabled: computed.and(\n        `session.features.${FT_COPILOT_FRAMEWORK}`,\n        'permissions.canViewCopilotFrameworkMessage'\n    ),\n\n    notificationsEnabled: computed('session.features.PURE-6632_inbox-ui', function () {\n        return this.get('session.features.PURE-6632_inbox-ui');\n    }),\n\n    inboxLegacyEnabled: computed('session.features.PURE-6632_inbox-ui', function () {\n        return !this.get('session.features.PURE-6632_inbox-ui');\n    }),\n\n    filteredPanelDefinitions: computed(\n        'voiceEnabled',\n        'chatsEnabled',\n        'copilotFrameworkEnabled',\n        'notificationsEnabled',\n        'inboxLegacyEnabled',\n        function () {\n            return PanelDefinitions.reduce((acc, curr) => {\n                if (!curr.perms || this.get(curr.perms)) acc.push(curr);\n                return acc;\n            }, [] as Panel[]);\n        }\n    ),\n\n    actions: {\n        closePanel() {\n            this.get('commandNav').selectPanel(DEFAULT_PANEL);\n        },\n        expandPanel() {\n            this.get('commandNav').expandPanel(DEFAULT_PANEL);\n        }\n    }\n});\n","export type Panel = {\n    id: PanelId;\n    name: string;\n    icon?: string;\n    persistent?: boolean;\n    drawers?: Drawer[];\n    defaultDrawerId?: string;\n    layout?: string;\n    expandable?: boolean;\n    perms?: string;\n    hideHeader?: boolean;\n};\n\nexport type Drawer = {\n    id: string;\n    name: string;\n    layout: string;\n    persistent?: boolean;\n    className?: string;\n    perms?: string;\n};\n\nexport type PanelId =\n    | 'panel-not-active'\n    | 'help'\n    | 'apps'\n    | 'inbox'\n    | 'notifications'\n    | 'trial'\n    | 'agent'\n    | 'voice'\n    | 'chats'\n    | 'account-switcher'\n    | 'copilot-framework';\n\nexport const PanelDefinitions: Panel[] = [\n    {\n        id: 'copilot-framework',\n        name: 'navBar.commandView.panelTitles.copilotFramework',\n        icon: 'restricted/custom/sparkles-solid',\n        layout: 'command-panel-copilot-framework',\n        perms: 'copilotFrameworkEnabled',\n        persistent: true,\n        hideHeader: true\n    },\n    {\n        id: 'help',\n        name: 'navBar.commandView.panelTitles.help',\n        icon: 'help',\n        defaultDrawerId: 'help-current-page',\n        drawers: [\n            {\n                id: 'help-current-page',\n                name: 'navBar.commandView.panelTitles.currentPage',\n                layout: 'command-panel-help'\n            },\n            {\n                id: 'help-release-notes',\n                name: 'navBar.commandView.panelTitles.releaseNotes',\n                layout: 'command-panel-help'\n            },\n            {\n                id: 'help-resources',\n                name: 'navBar.commandView.panelTitles.resources',\n                layout: 'command-panel-help'\n            },\n            {\n                id: 'help-search',\n                name: 'navBar.commandView.panelTitles.search',\n                layout: 'command-panel-help'\n            },\n            {\n                id: 'help-logcapture',\n                name: 'navBar.commandView.panelTitles.logcapture',\n                layout: 'command-panel-help',\n                perms: 'canAddLogCaptureOnDemand'\n            },\n            {\n                id: 'help-accessibility',\n                name: 'navBar.commandView.panelTitles.accessibility',\n                layout: 'command-panel-help',\n                perms: 'ATLAS-2158_help-accessibility-tab'\n            }\n        ]\n    },\n    {\n        id: 'voice',\n        name: 'navBar.commandView.panelTitles.calls',\n        layout: 'call-controls',\n        icon: 'fa/phone-regular',\n        perms: 'voiceEnabled'\n    },\n    {\n        id: 'chats',\n        name: 'navBar.commandView.panelTitles.chat',\n        layout: 'command-chat-panel',\n        icon: 'fa/message-regular',\n        persistent: true,\n        expandable: true,\n        perms: 'chatsEnabled'\n    },\n    {\n        id: 'inbox',\n        name: 'navBar.commandView.panelTitles.inbox',\n        icon: 'inbox',\n        layout: 'inbox-panel-v2',\n        perms: 'inboxLegacyEnabled'\n    },\n    {\n        id: 'notifications',\n        name: 'navBar.commandView.panelTitles.notifications',\n        icon: 'bell',\n        layout: 'command-panel-notifications',\n        persistent: true,\n        perms: 'notificationsEnabled'\n    },\n    {\n        id: 'apps',\n        name: 'navBar.commandView.panelTitles.apps',\n        icon: 'toolbar-apps',\n        layout: 'command-panel-apps',\n        persistent: true\n    },\n    {\n        id: 'trial',\n        name: 'navBar.commandView.panelTitles.trialSupportCenter',\n        layout: 'command-free-trial-support'\n    },\n    {\n        id: 'agent',\n        icon: 'agent',\n        name: 'Agent Workspace',\n        layout: 'command-panel-agent',\n        persistent: true,\n        expandable: true\n    },\n    {\n        id: 'account-switcher',\n        icon: 'fa/building-regular',\n        name: 'Account List',\n        layout: 'command-panel-account-switcher',\n        persistent: false,\n        expandable: false\n    }\n];\n","import Component from '@ember/component';\nimport { inject } from '@ember/service';\nimport { PanelId } from '../panel-definition';\nimport { computed } from '@ember/object';\n\nexport type PanelDefinition = {\n    id: string;\n    name: string;\n    icon: string;\n    activeDrawerId?: string;\n    drawers?: PanelDrawer[];\n    layout?: string; // change to component\n};\n\nexport type PanelDrawer = {\n    id: string;\n    name: string;\n    perms?: string;\n};\n\nexport default Component.extend({\n    classNames: ['command-panel-nav'],\n\n    commandNav: inject('command-nav'),\n    permissions: inject('permissions'),\n    session: inject('session'),\n\n    visibleDrawers: computed(\n        'definition.drawers.[]',\n        'permissions.canAddLogCaptureOnDemand',\n        'session.features.ATLAS-2158_help-accessibility-tab',\n        function () {\n            const drawers = this.get('definition.drawers') || [];\n            return drawers.filter((drawer: PanelDrawer) => {\n                if (!drawer.perms) {\n                    return true;\n                }\n                return this.get(`permissions.${drawer.perms}`) || this.get(`session.features.${drawer.perms}`);\n            });\n        }\n    ),\n\n    definition: null as PanelDefinition | null,\n\n    actions: {\n        selectDrawer(panelId: PanelId, drawerId: string) {\n            this.get('commandNav').selectDrawer(panelId, drawerId);\n            return false;\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"oVk5CuM/\",\"block\":\"[[[10,\\\"nav\\\"],[14,0,\\\"panel-navigation-nav\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"ul\\\"],[14,0,\\\"panel-navigation-drawer\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,1],[[28,[37,1],[[33,2]],null]],null],null,[[[1,\\\"            \\\"],[10,\\\"li\\\"],[15,\\\"data-drawer-tab-id\\\",[29,[\\\"drawer-\\\",[30,1,[\\\"id\\\"]]]]],[15,0,[29,[[52,[28,[37,4],[[30,1,[\\\"id\\\"]],[33,5]],null],\\\"active\\\"]]]],[12],[1,\\\"\\\\n                \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"drawer\\\"],[4,[38,6],[[30,0],\\\"selectDrawer\\\",[33,7,[\\\"id\\\"]],[30,1,[\\\"id\\\"]]],null],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,8],[[30,1,[\\\"name\\\"]]],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[42,[28,[37,1],[[28,[37,1],[[33,7,[\\\"drawers\\\"]]],null]],null],null,[[[41,[28,[37,9],[[30,2,[\\\"layout\\\"]],[28,[37,10],[[28,[37,4],[[30,2,[\\\"id\\\"]],[33,5]],null],[30,2,[\\\"persistent\\\"]]],null]],null],[[[1,\\\"        \\\"],[10,\\\"section\\\"],[15,0,[29,[\\\"panel-content \\\",[30,2,[\\\"id\\\"]],\\\" \\\",[52,[28,[37,4],[[30,2,[\\\"id\\\"]],[33,5]],null],\\\"active\\\",\\\"hidden\\\"],\\\" \\\",[52,[30,2,[\\\"className\\\"]],[30,2,[\\\"className\\\"]]]]]],[12],[1,\\\"\\\\n            \\\"],[46,[30,2,[\\\"layout\\\"]],null,[[\\\"definition\\\",\\\"currentDrawerId\\\"],[[33,7],[33,5]]],null],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[2]],null]],[\\\"drawer\\\",\\\"drawer\\\"],false,[\\\"each\\\",\\\"-track-array\\\",\\\"visibleDrawers\\\",\\\"if\\\",\\\"eq\\\",\\\"currentDrawerId\\\",\\\"action\\\",\\\"definition\\\",\\\"t\\\",\\\"and\\\",\\\"or\\\",\\\"component\\\"]]\",\"moduleName\":\"web-directory/components/command-panel/panel-navigation/template.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"ZQiYpvF2\",\"block\":\"[[[42,[28,[37,1],[[28,[37,1],[[33,2]],null]],null],null,[[[41,[28,[37,4],[[28,[37,5],[[33,6],[30,1,[\\\"id\\\"]]],null],[30,1,[\\\"persistent\\\"]]],null],[[[1,\\\"        \\\"],[10,0],[15,0,[29,[\\\"command-panel-wrapper \\\",[52,[28,[37,5],[[33,6],[30,1,[\\\"id\\\"]]],null],\\\"active\\\",\\\"hidden\\\"]]]],[15,\\\"aria-hidden\\\",[29,[[52,[28,[37,5],[[33,6],[30,1,[\\\"id\\\"]]],null],false,true]]]],[12],[1,\\\"\\\\n            \\\"],[10,1],[15,1,[29,[[30,1,[\\\"id\\\"]],\\\"-jump-to-command-panel\\\"]]],[14,\\\"tabindex\\\",\\\"-1\\\"],[12],[13],[1,\\\"\\\\n\\\"],[41,[51,[30,1,[\\\"hideHeader\\\"]]],[[[1,\\\"                \\\"],[10,\\\"hgroup\\\"],[12],[1,\\\"\\\\n\\\"],[41,[51,[28,[37,4],[[28,[37,5],[[33,6],\\\"trial\\\"],null],[28,[37,5],[[33,6],\\\"agent\\\"],null]],null]],[[[1,\\\"                        \\\"],[10,\\\"h2\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,\\\"gux-icon\\\"],[15,\\\"icon-name\\\",[30,1,[\\\"icon\\\"]]],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                            \\\"],[1,[28,[35,8],[[30,1,[\\\"name\\\"]]],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n                    \\\"],[10,0],[15,0,[29,[\\\"panel-control-wrapper \\\",[52,[28,[37,5],[[33,9,[\\\"expanded\\\"]],true],null],\\\"expanded\\\"],\\\" \\\",[52,[28,[37,10],[[28,[37,5],[[30,1,[\\\"id\\\"]],\\\"agent\\\"],null],[28,[37,5],[[33,11],true],null]],null],\\\"active-acd\\\"]]]],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-button-slot\\\"],[14,0,\\\"close-panel\\\"],[14,\\\"accent\\\",\\\"ghost\\\"],[12],[1,\\\"\\\\n                            \\\"],[11,\\\"button\\\"],[16,1,[29,[\\\"panel-\\\",[30,1,[\\\"id\\\"]],\\\"-close-button\\\"]]],[16,\\\"aria-label\\\",[28,[37,8],[\\\"navBar.commandView.closePanel\\\"],null]],[24,4,\\\"button\\\"],[4,[38,12],[[30,0],\\\"closePanel\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"close\\\"],[15,\\\"screenreader-text\\\",[28,[37,8],[\\\"navBar.commandView.closePanel\\\"],null]],[12],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"placement\\\",\\\"bottom\\\"],[15,\\\"for\\\",[29,[\\\"panel-\\\",[30,1,[\\\"id\\\"]],\\\"-close-button\\\"]]],[12],[1,\\\"\\\\n                            \\\"],[10,1],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,8],[\\\"common.close\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,10],[[30,1,[\\\"expandable\\\"]],[28,[37,13],[[33,14]],null]],null],[[[1,\\\"                            \\\"],[10,\\\"gux-button-slot\\\"],[14,\\\"icon-only\\\",\\\"\\\"],[14,0,\\\"expand-panel\\\"],[14,\\\"accent\\\",\\\"ghost\\\"],[12],[1,\\\"\\\\n                                \\\"],[11,\\\"button\\\"],[16,1,[29,[\\\"panel-\\\",[30,1,[\\\"id\\\"]],\\\"-expand-button\\\"]]],[16,\\\"aria-label\\\",[29,[[28,[37,8],[[52,[33,9,[\\\"expanded\\\"]],\\\"common.collapse\\\",\\\"common.expand\\\"]],null],\\\" \\\",[28,[37,8],[[30,1,[\\\"name\\\"]]],null]]]],[24,4,\\\"button\\\"],[4,[38,12],[[30,0],\\\"expandPanel\\\"],null],[12],[1,\\\"\\\\n\\\"],[41,[33,9,[\\\"expanded\\\"]],[[[1,\\\"                                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/arrow-down-left-and-arrow-up-right-to-center-regular\\\"],[15,\\\"screenreader-text\\\",[29,[[28,[37,8],[\\\"common.collapse\\\"],null],\\\" \\\",[28,[37,8],[[30,1,[\\\"name\\\"]]],null]]]],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/arrow-up-right-and-arrow-down-left-from-center-regular\\\"],[15,\\\"screenreader-text\\\",[29,[[28,[37,8],[\\\"common.expand\\\"],null],\\\" \\\",[28,[37,8],[[30,1,[\\\"name\\\"]]],null]]]],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                                \\\"],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                            \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"placement\\\",\\\"bottom\\\"],[15,\\\"for\\\",[29,[\\\"panel-\\\",[30,1,[\\\"id\\\"]],\\\"-expand-button\\\"]]],[12],[1,\\\"\\\\n                                \\\"],[10,1],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,\\\"\\\\n                                    \\\"],[1,[28,[35,8],[[52,[33,9,[\\\"expanded\\\"]],\\\"common.collapse\\\",\\\"common.expand\\\"]],null]],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[30,1,[\\\"drawers\\\"]],[[[1,\\\"                \\\"],[1,[28,[35,15],null,[[\\\"definition\\\",\\\"currentDrawerId\\\"],[[30,1],[33,16]]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[30,1,[\\\"layout\\\"]],[[[1,\\\"                    \\\"],[10,\\\"section\\\"],[15,0,[29,[\\\"panel-content \\\",[52,[28,[37,5],[[30,1,[\\\"id\\\"]],\\\"voice\\\"],null],\\\"call-controls\\\"]]]],[12],[1,\\\"\\\\n                        \\\"],[46,[30,1,[\\\"layout\\\"]],null,[[\\\"definition\\\",\\\"activeCall\\\"],[[30,1],[33,18]]],null],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[1]],null]],[\\\"panel\\\"],false,[\\\"each\\\",\\\"-track-array\\\",\\\"filteredPanelDefinitions\\\",\\\"if\\\",\\\"or\\\",\\\"eq\\\",\\\"currentPanel\\\",\\\"unless\\\",\\\"t\\\",\\\"commandNav\\\",\\\"and\\\",\\\"acdCount\\\",\\\"action\\\",\\\"not\\\",\\\"narrowWidth\\\",\\\"command-panel/panel-navigation\\\",\\\"currentDrawerId\\\",\\\"component\\\",\\\"activeCall\\\"]]\",\"moduleName\":\"web-directory/components/command-panel/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport type { Maybe } from 'web-directory/types';\nimport type { MenuDefinition } from '../command-nav/navMenu';\nimport { inject } from '@ember/service';\nimport { TOGGLE_SUBNAV_EVENT, TOGGLE_NAV_EVENT } from 'web-directory/services/events';\nimport { addPageAction } from 'web-directory/utils/newrelic';\n\nexport default Component.extend({\n    classNames: ['command-subnav', 'nav-item'],\n    classNameBindings: ['subMenuOpen:open:closed'],\n\n    events: inject('events'),\n    frameService: inject('center-stage-frame'),\n    commandNav: inject('command-nav'),\n    adminui: inject('adminui'),\n\n    /**\n     * @attribute\n     * Flag indcating if the main nav view is narrow.\n     */\n    narrowWidth: null as Maybe<boolean>,\n\n    /**\n     * @attribute\n     * Menu definition of the child menu.\n     */\n    menu: null as Maybe<MenuDefinition>,\n\n    /**\n     * @attribute\n     * true/false indicating if submenu accordion is expanded\n     */\n    subMenuOpen: false,\n\n    /**\n     * @attribute\n     * string from parent marking last active menu link\n     */\n    activeLink: null as Maybe<string>,\n\n    selectReturn: false as boolean,\n\n    init() {\n        this._super(...arguments);\n        const selectedMenu = this.get('menu');\n        selectedMenu!.subMenu!.forEach(subMenuItem => {\n            if (subMenuItem.link == this.get('activeLink')) {\n                this.toggleProperty('subMenuOpen');\n            }\n        });\n    },\n\n    actions: {\n        /**\n         * @action\n         * Open/close the sub menu accordion.\n         */\n        toggleSubMenu() {\n            this.toggleProperty('subMenuOpen');\n        },\n\n        /**\n         * @action\n         * action that sets navigation state in parent component\n         * when selecting a navigation entry.\n         * @param menuItem the MenuDefinition to select\n         */\n        handleLinkAction(menuItem: MenuDefinition) {\n            if (menuItem.link) {\n                addPageAction('menuNavigate', {\n                    option: menuItem.link\n                });\n\n                const expanded = this.get('commandNav').get('expanded');\n                const currentPanel = this.get('commandNav').get('currentPanel');\n                if (expanded) {\n                    if (currentPanel === 'agent') {\n                        this.get('commandNav').selectPanel('panel-not-active');\n                    } else if (currentPanel === 'chats') {\n                        this.get('commandNav').set('expanded', false);\n                    }\n                }\n            }\n            this.set('selectReturn', false);\n            this.get('events').triggerEvent(TOGGLE_SUBNAV_EVENT, { open: false });\n            this.get('frameService').set('pageTitle', null);\n            this.get('adminui').set('currentPageCrumbs', null);\n            if (this.get('narrowWidth')) {\n                this.get('events').triggerEvent(TOGGLE_NAV_EVENT, { open: false });\n            }\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"ApwmjWsf\",\"block\":\"[[[10,0],[14,0,\\\"sub-menu-button-container\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"gux-button-slot\\\"],[14,\\\"accent\\\",\\\"ghost\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"button\\\"],[14,0,\\\"\\\"],[15,\\\"aria-controls\\\",[33,0,[\\\"id\\\"]]],[15,\\\"onclick\\\",[28,[37,1],[[30,0],\\\"toggleSubMenu\\\"],null]],[15,\\\"aria-expanded\\\",[52,[33,3],\\\"true\\\",\\\"false\\\"]],[15,1,[33,0,[\\\"title\\\"]]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"sub-menu-button-content\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"sub-menu-button-title\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-truncate\\\"],[12],[1,[28,[35,4],[[33,0,[\\\"title\\\"]]],null]],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"sub-menu-button-icon\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"subnav-toggle-icon\\\"],[15,\\\"icon-name\\\",[52,[33,3],\\\"custom/chevron-up-small-regular\\\",\\\"custom/chevron-down-small-regular\\\"]],[14,\\\"decorative\\\",\\\"true\\\"],[14,\\\"size\\\",\\\"inherit\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,\\\"ul\\\"],[15,0,[29,[[52,[33,3],\\\"\\\",\\\"hidden\\\"]]]],[12],[1,\\\"\\\\n\\\"],[41,[33,3],[[[42,[28,[37,6],[[28,[37,6],[[33,0,[\\\"subMenu\\\"]]],null]],null],null,[[[1,\\\"            \\\"],[10,\\\"li\\\"],[14,0,\\\"sub-menu-item-container\\\"],[12],[1,\\\"\\\\n                \\\"],[10,3],[15,0,[29,[\\\"nav-item nav-link \\\",[52,[28,[37,7],[[33,8],[30,1,[\\\"link\\\"]]],null],\\\"selected\\\"]]]],[15,\\\"aria-current\\\",[29,[[52,[28,[37,7],[[33,8],[30,1,[\\\"link\\\"]]],null],\\\"page\\\",\\\"false\\\"]]]],[15,1,[30,1,[\\\"title\\\"]]],[15,6,[30,1,[\\\"link\\\"]]],[15,\\\"onclick\\\",[28,[37,1],[[30,0],\\\"handleLinkAction\\\",[30,1]],null]],[12],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"sublink-title\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-truncate\\\"],[12],[1,\\\" \\\"],[1,[28,[35,4],[[30,1,[\\\"title\\\"]]],null]],[1,\\\" \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null]],[]],null],[13]],[\\\"subItem\\\"],false,[\\\"menu\\\",\\\"action\\\",\\\"if\\\",\\\"subMenuOpen\\\",\\\"t\\\",\\\"each\\\",\\\"-track-array\\\",\\\"eq\\\",\\\"activeLink\\\"]]\",\"moduleName\":\"web-directory/components/command-subnav/template.hbs\",\"isStrictMode\":false});","import { getOwner } from '@ember/application';\nimport Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { run } from '@ember/runloop';\nimport { inject } from '@ember/service';\nimport {\n    PresenceType,\n    isDefaultPresence,\n    isPurecloudSource,\n    sortByOrder,\n    sortSecondaryStatuses,\n    StandardPresenceList,\n    DisplayPresence\n} from 'web-directory/utils/presence-utils';\n\n/**\n * @function\n * Safely strips HTML tags from a string using DOM parsing.\n * Used to sanitize API error messages before displaying them in notifications.\n */\nconst stripHtml = (str: string) => {\n    const doc = new DOMParser().parseFromString(str, 'text/html');\n    return doc.body.textContent || '';\n};\n\nexport default Component.extend({\n    classNames: ['command-user-settings'],\n    // ==================================================================\n    // Services\n    // ==================================================================\n    session: inject('session'),\n    presence: inject('presence'),\n    phone: inject('phone'),\n    presenceSubscription: inject('presenceSubscription'),\n    settings: inject('settings'),\n    webrtc: inject('webrtc'),\n    webrtcSdkService: inject('webrtc-sdk'),\n    intl: inject('intl'),\n    notification: inject('notification'),\n    clock: inject('clock'), // Used by out-of-office-menu for time validation\n    emergencyLocation: inject('emergency-location'),\n    geolocation: inject(),\n    streaming: inject('streaming'),\n    chat: inject('chat'),\n    permissions: inject('permissions'),\n    commandNav: inject('command-nav'),\n    application: inject('application'),\n\n    /**\n     * @attribute\n     * As standardize list for presences\n     * controls order, display, and labels\n     * from presence-utils\n     */\n    standardPresenceList: StandardPresenceList as Array<PresenceType>,\n\n    /**\n     * @attribute\n     * Indicator of user settings open status\n     */\n    userSettingsOpen: false,\n\n    /**\n     * @attribute\n     * Stores the last successfully saved status for rollback on error\n     */\n    savedStatus: '',\n\n    /**\n     * @computed\n     * User's station obj\n     */\n    person: computed.readOnly('session.person'),\n\n    /**\n     * @computed\n     * User's name\n     */\n    personName: computed.readOnly('person.name'),\n\n    /**\n     * @computed\n     * User's id\n     */\n    personId: computed.readOnly('person.id'),\n\n    /**\n     * @computed\n     * User's outOfOffice object\n     */\n    outOfOffice: computed('person.activities.outOfOffice', function () {\n        const person = this.get('person');\n        if (!person) return {};\n        return person.get('activities.outOfOffice') || {};\n    }),\n\n    /**\n     * @computed\n     * User's future set out of office date\n     */\n    scheduledOutOfOffice: computed('outOfOffice', function () {\n        const ooo = this.get('outOfOffice');\n        if (!ooo || ooo.active) return false;\n        return !!ooo.startDate;\n    }),\n\n    /**\n     * @computed\n     * User's organization name\n     */\n    orgName: computed(\n        'session.org.name',\n        'session.user.isTrustee',\n        'session.publicApiUser.organization.name',\n        function (): string | undefined {\n            const session = this.get('session');\n            if (session?.get('user.isTrustee')) {\n                return session.get('publicApiUser.organization.name');\n            }\n            return session?.get('org.name');\n        }\n    ),\n\n    /**\n     * @computed\n     * User's profile image url\n     */\n    avatarImageUrl: computed.readOnly('person.profilePicture.x96'),\n\n    /**\n     * @computed\n     * Whether E911 emergency location feature is enabled for the org\n     */\n    isE911Enabled: computed.readOnly('session.features.emergencyLocation'),\n\n    /**\n     * @computed\n     * Whether the app is running in media helper mode\n     */\n    isMediaHelperMode: computed.readOnly('application.mediaHelperMode'),\n\n    /**\n     * @computed\n     * User's station obj\n     */\n    station: computed.readOnly('phone.station'),\n\n    /**\n     * @computed\n     * User's station name\n     */\n    stationName: computed.readOnly('phone.station.name'),\n\n    /* ***** For Presence ***** */\n\n    isRequestingOffQueueEnabled: computed.readOnly('session.features.PURE-5013_enableRequestingOffQueue'),\n\n    /**\n     * @computed\n     * User's current presence\n     */\n    currentPresenceDisplay: computed(\n        'session.presenceMap',\n        'person',\n        'person.activityPresence',\n        'isRequestingOffQueueEnabled',\n        'person.futurePresence',\n        'person.primaryPresence.presenceDefinition',\n        function (): DisplayPresence | undefined {\n            const person = this.get('person');\n            const activityPresence = person?.get('activityPresence')?.toLowerCase();\n\n            // Special activity states (on_queue, out_of_office) are not tied to a presence definition,\n            // so handle them separately with hardcoded labels\n            let requestedPresenceId, requestedPrimaryKey;\n            const isRequestingOffQueueEnabled = this.get('isRequestingOffQueueEnabled');\n            const futurePresenceDefinition = person?.get('futurePresence');\n            const isRequestingOffQueue = isRequestingOffQueueEnabled && futurePresenceDefinition;\n            if (isRequestingOffQueue) {\n                requestedPresenceId = futurePresenceDefinition.id;\n                requestedPrimaryKey = futurePresenceDefinition.systemPresence?.toLowerCase();\n            }\n            if (activityPresence === 'on_queue' && !isRequestingOffQueue) {\n                return {\n                    id: null,\n                    primaryKey: activityPresence,\n                    secondaryKey: '',\n                    label: 'chat.presence.onQueue'\n                };\n            } else if (activityPresence === 'out_of_office') {\n                return {\n                    id: null,\n                    primaryKey: activityPresence,\n                    secondaryKey: '',\n                    label: 'chat.presence.outOfOffice.title'\n                };\n            }\n\n            // Resolve the user's current presence definition from the org-level presence map\n            let definition = isRequestingOffQueue\n                ? futurePresenceDefinition\n                : person?.get('primaryPresence.presenceDefinition');\n            if (!definition) {\n                return undefined;\n            }\n            const presenceMap = this.get('session.presenceMap');\n            const currentPresence = presenceMap?.find((p: { id: any }) => p.id === definition.id);\n            if (!currentPresence) {\n                return undefined;\n            }\n            const presenceChoices = this.get('presenceChoices');\n\n            // Try to match against a top-level (primary) presence\n            const foundPresence: PresenceType = presenceChoices.find(\n                (el: PresenceType) => currentPresence.id === el.id\n            );\n            if (foundPresence) {\n                if (isRequestingOffQueue) {\n                    return {\n                        id: null,\n                        primaryKey: activityPresence,\n                        secondaryKey: '',\n                        label: foundPresence.label,\n                        requestedPresenceId,\n                        requestedPrimaryKey\n                    };\n                }\n                return {\n                    id: foundPresence.id,\n                    primaryKey: currentPresence.systemPresence?.toLowerCase(),\n                    secondaryKey: '',\n                    label: foundPresence.label\n                };\n            }\n\n            // No primary match — search through secondary (sub) presences nested under each primary\n            for (const element of presenceChoices) {\n                if (element.secondaryPresences) {\n                    const foundSubPresence = element.secondaryPresences.find(\n                        (el: PresenceType) => currentPresence.id === el.id\n                    );\n                    if (foundSubPresence) {\n                        if (isRequestingOffQueue) {\n                            return {\n                                id: null,\n                                primaryKey: activityPresence,\n                                secondaryKey: '',\n                                label: foundSubPresence.label,\n                                requestedPresenceId,\n                                requestedPrimaryKey\n                            };\n                        }\n                        return {\n                            id: foundSubPresence.id,\n                            primaryKey: element.key?.toLowerCase(),\n                            secondaryKey: currentPresence.systemPresence?.toLowerCase(),\n                            label: foundSubPresence.label\n                        };\n                    }\n                }\n            }\n\n            // No match found in primary or secondary presences —\n            // Handle system-only presences (e.g. idle) that aren't user-selectable\n            const systemPresence = currentPresence.systemPresence?.toLowerCase();\n            if (systemPresence === 'idle') {\n                return {\n                    id: currentPresence.id,\n                    primaryKey: 'away',\n                    secondaryKey: '',\n                    label: 'chat.presence.away'\n                };\n            }\n\n            return undefined;\n        }\n    ),\n\n    /**\n     * @computed\n     * Aria label for current user presence read as 'User Name' + 'Current Presence'\n     */\n    presenceAriaLabel: computed.readOnly('person.presenceLabel'),\n\n    /**\n     * @computed\n     * Last modified time stamp from presence\n     */\n    presenceLastModified: computed.readOnly('person.primaryPresence.modifiedDate'),\n\n    /**\n     * @computed\n     * All the presence available to the current user\n     */\n    presenceChoices: computed(\n        'presence.primaryPresences.[]',\n        'presence.secondaryPresences',\n        'canGoOnQueue',\n        'isRequestingOffQueueEnabled',\n        'person.futurePresence.{id}',\n        function (): Array<PresenceType> {\n            const primaryPresences = this.get('presence.primaryPresences');\n            const standardPresenceList = this.get('standardPresenceList');\n            const intl = this.get('intl');\n\n            // Build a lookup map from the standard presence list for fast matching by key\n            const standardMap = new Map<string, PresenceType>(\n                standardPresenceList.map((p: PresenceType) => [p.key, p])\n            );\n\n            // Allow on_queue presence to be displayed if the user has queue permissions\n            const onQueuePresence = standardMap.get('on_queue');\n            if (onQueuePresence && this.get('canGoOnQueue')) {\n                standardMap.set('on_queue', { ...onQueuePresence, display: true });\n            }\n\n            const futurePresenceDefinition = this.get('isRequestingOffQueueEnabled')\n                ? this.get('person.futurePresence')\n                : undefined;\n            // Convert Ember presence models into plain objects, including sorted secondary presences\n            const presenceChoicesRaw = primaryPresences.map((presence: any) => {\n                const result = presence.getProperties('id', 'key', 'label');\n                if (futurePresenceDefinition) {\n                    if (result.key === futurePresenceDefinition.systemPresence?.toLowerCase()) {\n                        // primary match\n                        result.label = intl.t('chat.presence.requestingChange', { presence: result.label });\n                    }\n                }\n                if (result.key === 'on_queue') {\n                    // we don't want to look at on queue secondary statuses\n                    return result;\n                }\n                const secondaryPresences = sortSecondaryStatuses(presence.get('secondaryPresences'));\n                if (secondaryPresences.length !== 0) {\n                    result.secondaryPresences = secondaryPresences.map((secondary: any) => {\n                        const secondaryResult = secondary.getProperties('id', 'label', 'key');\n                        if (futurePresenceDefinition) {\n                            if (secondaryResult.id === futurePresenceDefinition.id) {\n                                // secondary match\n                                secondaryResult.label = intl.t('chat.presence.requestingChange', {\n                                    presence: secondaryResult.label\n                                });\n                            }\n                        }\n                        return secondaryResult;\n                    });\n                }\n                return result;\n            });\n\n            // Keep only presences that exist in the standard list and are marked for display,\n            // then merge in the standard ordering\n            const presenceChoicesCombined = presenceChoicesRaw\n                .filter((presence: any) => {\n                    const standard = standardMap.get(presence.key);\n                    return standard && standard.display !== false;\n                })\n                .map((presence: any) => {\n                    return {\n                        id: presence.id,\n                        key: presence.key,\n                        label: presence.label,\n                        order: standardMap.get(presence.key)!.order,\n                        secondaryPresences: presence.secondaryPresences\n                    } as PresenceType;\n                });\n\n            // Out of office is a synthetic presence not returned by the API — add it manually\n            const outOfOfficePresence = standardMap.get('out_of_office');\n            if (outOfOfficePresence) {\n                presenceChoicesCombined.push({\n                    id: outOfOfficePresence.id,\n                    key: outOfOfficePresence.key,\n                    label: intl.t(outOfOfficePresence.label),\n                    order: outOfOfficePresence.order\n                } as PresenceType);\n            }\n\n            return presenceChoicesCombined.sort((a: PresenceType, b: PresenceType) => sortByOrder(a, b));\n        }\n    ),\n\n    /**\n     * @computed\n     * Collection of information used for presenceLabel component\n     */\n    presenceLabelData: computed(\n        'person.{activityPresenceClass,presenceLabel,showConversationSummaryIndicator}',\n        'person.activityValues.{calls,chats,emails}',\n        function () {\n            const person = this.get('person');\n            return {\n                wrap: false,\n                showStatus: false,\n                showActivity: true,\n                totalCalls: person?.get('activityValues.calls'),\n                totalChats: person?.get('activityValues.chats'),\n                totalEmails: person?.get('activityValues.emails'),\n                isShowingActivitySummary: person?.get('showConversationSummaryIndicator')\n            };\n        }\n    ),\n\n    /**\n     * @computed\n     * User specified status\n     */\n    status: computed('person.chatStatus', {\n        get() {\n            return this.get('person.chatStatus');\n        },\n        set(_key, value) {\n            return value;\n        }\n    }),\n\n    /**\n     * @computed\n     * Value for if the user's source is purecloud\n     */\n    isPurecloudSource: computed('session.user.presence.source', function () {\n        return isPurecloudSource(this.get('session.user.presence.source'));\n    }),\n\n    /**\n     * @computed\n     * Value for if the user's source is default\n     */\n    isDefaultSource: computed('person.primaryPresence.source', function () {\n        let source = this.get('person.primaryPresence.source');\n        if (!source) {\n            return true;\n        }\n        return isDefaultPresence(source.toLowerCase());\n    }),\n\n    /**\n     * @computed\n     * Value for if the user is trustee\n     */\n    isTrustee: computed.or('session.user.isTrustee', 'session.hasTrusteeAccess'),\n\n    /**\n     * @computed\n     * Permission set for user status (What's on your mind field)\n     */\n    isStatusEnabled: computed.or('isPurecloudSource', 'person.chatStatus'),\n\n    /**\n     * @computed\n     * Permission set for user's presence selector\n     */\n    isPresenceSelectorEnabled: computed('isDefaultSource', 'isTrustee', function () {\n        return this.get('isDefaultSource') && !this.get('isTrustee');\n    }),\n\n    /**\n     * @computed\n     * Permission set for phone and forward calls\n     */\n    isPhoneEnabled: computed.readOnly('phone.enabled'),\n\n    /**\n     * @computed\n     * Permission set for call forwarding (conversation:callForwarding:edit)\n     */\n    isCallForwardingEnabled: computed.readOnly('permissions.canCallForward'),\n\n    /**\n     * @computed\n     * Whether the user's calls are currently being forwarded\n     */\n    isCallsForwarded: computed.readOnly('phone.callForwardingActive'),\n\n    /**\n     * @computed\n     * Permission set for allowing user to go on queue\n     */\n    canGoOnQueue: computed.readOnly('permissions.canGoOnQueue'),\n\n    /**\n     * @computed\n     * Permission set for activate queues\n     */\n    isActivateQueueEnabled: computed('permissions.canActivateQueues', 'canGoOnQueue', 'isTrustee', function () {\n        return this.get('permissions.canActivateQueues') && this.get('canGoOnQueue') && !this.get('isTrustee');\n    }),\n\n    /**\n     * @computed\n     * Permission set for my files\n     */\n    isMyFilesEnabled: computed.readOnly('person.isContentUser'),\n\n    /**\n     * @computed\n     * Whether the Security menu option is visible,\n     */\n    isSecurityEnabled: computed('session.features.IAM-4157_new_security_page', 'isTrustee', function () {\n        return !!this.get('session.features.IAM-4157_new_security_page') && !this.get('isTrustee');\n    }),\n\n    /**\n     * @computed\n     * Checks if the side panel is in the narrow overlap state\n     */\n    ifNarrowPanel: computed.readOnly('commandNav.narrowWidth'),\n\n    // ==================================================================\n    // Lifecycle\n    // ==================================================================\n\n    /* @lifecycle */\n    init() {\n        this._super(...arguments);\n        const person = this.get('person');\n        // reload to make sure we have the latest activity in case of subscription error\n        if (person) person.reload();\n        if (this.get('status')) this.set('savedStatus', this.get('status'));\n\n        this._handleOutsideClick = this._handleOutsideClick.bind(this);\n        this._handleEscapeKey = this._handleEscapeKey.bind(this);\n        this._handleTabOut = this._handleTabOut.bind(this);\n    },\n\n    /* @lifecycle */\n    didInsertElement() {\n        this._super(...arguments);\n        document.addEventListener('click', this._handleOutsideClick, true);\n        document.addEventListener('keydown', this._handleEscapeKey);\n        document.addEventListener('keydown', this._handleTabOut);\n    },\n\n    /* @lifecycle */\n    willDestroyElement() {\n        this._super(...arguments);\n        document.removeEventListener('click', this._handleOutsideClick, true);\n        document.removeEventListener('keydown', this._handleEscapeKey);\n        document.removeEventListener('keydown', this._handleTabOut);\n    },\n\n    // ==================================================================\n    // Functions\n    // ==================================================================\n\n    /**\n     * @function\n     * Closes the user settings pop over and returns focus to the trigger button\n     */\n    closeUserSettings() {\n        this.set('userSettingsOpen', false);\n        const trigger = this.element?.querySelector('#user-settings-button') as HTMLElement;\n        if (trigger) {\n            trigger.focus();\n        }\n    },\n\n    /**\n     * @function\n     * Handles clicks outside the popover to close it\n     */\n    _handleOutsideClick(event: MouseEvent) {\n        if (!this.get('userSettingsOpen')) return;\n        if (this.element && !this.element.contains(event.target as Node)) {\n            this.closeUserSettings();\n        }\n    },\n\n    /**\n     * @function\n     * Handles Escape key to close the popover\n     */\n    _handleEscapeKey(event: KeyboardEvent) {\n        if (event.key === 'Escape' && this.get('userSettingsOpen')) {\n            this.closeUserSettings();\n        }\n    },\n\n    /**\n     * @function\n     * Moves focus to the first focusable element inside the popover\n     */\n    _focusFirstElement() {\n        run.scheduleOnce('afterRender', this, function () {\n            if (this.isDestroying || this.isDestroyed) return;\n            const popover = this.element?.querySelector('.user-settings-popover') as HTMLElement;\n            if (!popover) return;\n            const firstFocusable = popover.querySelector(\n                'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\n            ) as HTMLElement;\n            if (firstFocusable) {\n                firstFocusable.focus();\n            }\n        });\n    },\n\n    /**\n     * @function\n     * Closes the popover when Tab is pressed on the last focusable element\n     * or Shift+Tab on the first focusable element inside the popover.\n     */\n    _handleTabOut(event: KeyboardEvent) {\n        if (event.key !== 'Tab' || !this.get('userSettingsOpen')) return;\n\n        const popover = this.element?.querySelector('.user-settings-popover') as HTMLElement;\n        if (!popover) return;\n\n        const focusableSelector =\n            'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n        const focusableElements = popover.querySelectorAll(focusableSelector);\n        if (focusableElements.length === 0) return;\n\n        const firstFocusable = focusableElements[0] as HTMLElement;\n        const lastFocusable = focusableElements[focusableElements.length - 1] as HTMLElement;\n        const active = document.activeElement;\n\n        if (!event.shiftKey && active === lastFocusable) {\n            this.set('userSettingsOpen', false);\n        } else if (event.shiftKey && active === firstFocusable) {\n            this.set('userSettingsOpen', false);\n        }\n    },\n\n    /**\n     * @function\n     * Displays an error notification when a status update fails\n     */\n    showUpdateError(message: any) {\n        const title = this.get('intl').t('chat.statusError');\n        this.get('notification').error(title, message, { hideAfter: 5 });\n    },\n\n    /**\n     * @function\n     * Closes nav side panel\n     */\n    closeSidePanel() {\n        this.get('commandNav').set('expanded', false);\n    },\n\n    /**\n     * @function\n     * Checks if the side panel is in a narrow state (overlap) and closes panel if it is\n     */\n    checkForNarrowSidePanel() {\n        if (this.get('ifNarrowPanel')) this.closeSidePanel();\n    },\n\n    /* ***** For Station Picker ***** */\n\n    // ==================================================================\n    // Actions\n    // ==================================================================\n\n    actions: {\n        /**\n         * @action\n         * Updates the user's chat status via streaming service, rolls back on failure\n         */\n        changeStatus(status: string) {\n            this.get('streaming')\n                .setStatus(status, this.get('person'))\n                .then(() => {\n                    if (this.isDestroying || this.isDestroyed) return;\n                    this.set('savedStatus', status);\n                    this.set('status', status);\n                })\n                .catch((response: any) => {\n                    if (this.isDestroying || this.isDestroyed) return;\n                    this.showUpdateError(stripHtml(response.message || ''));\n                    this.set('status', this.get('savedStatus'));\n                });\n        },\n\n        /**\n         * @action\n         * Toggle for opening and closing User Settings Pop Out\n         */\n        toggleUserSettings() {\n            this.toggleProperty('userSettingsOpen');\n            if (this.get('userSettingsOpen')) {\n                this._focusFirstElement();\n            }\n        },\n\n        /**\n         * @action\n         * Log's User Out\n         */\n        logout() {\n            this.set('userSettingsOpen', false);\n            const webrtc = this.get('webrtc');\n            const webrtcSdkService = this.get('webrtcSdkService');\n            const session = this.get('session');\n            const intl = this.get('intl');\n            const confirmMessage = intl.safestring('purecloud.promptForRefreshActiveCall').toString();\n\n            const hasLegacySessions = webrtc.get('activeSessions')?.length;\n            const hasActiveSoftphone = webrtcSdkService.get('hasActiveSoftphoneSession');\n            const needsConfirmation = hasLegacySessions || webrtcSdkService.get('hasActiveSoftphoneConversation');\n\n            if (hasLegacySessions || hasActiveSoftphone) {\n                if (!needsConfirmation || window.confirm(confirmMessage)) {\n                    if (hasLegacySessions) {\n                        webrtc.leaveRtcSessions();\n                    } else {\n                        webrtcSdkService.endAllSoftphoneSessions();\n                    }\n                    session.logout();\n                }\n            } else {\n                session.logout();\n            }\n        },\n\n        /**\n         * @action\n         * Opens Preference Modal\n         */\n        openPreferences() {\n            this.get('settings').open();\n            this.closeUserSettings();\n        },\n\n        /**\n         * @action\n         * Opens Activate Queues\n         */\n        goToActivateQueues(evt: MouseEvent | KeyboardEvent) {\n            const router = getOwner(this).lookup('router:main');\n            router.transitionTo(`/queues/activate/me`);\n            this.checkForNarrowSidePanel();\n            this.closeUserSettings();\n            evt.preventDefault();\n            return false;\n        },\n\n        /**\n         * @action\n         * Opens Files\n         */\n        goToFiles(evt: MouseEvent | KeyboardEvent) {\n            const router = getOwner(this).lookup('router:main');\n            router.transitionTo(`/content-management/dashboard`);\n            this.checkForNarrowSidePanel();\n            this.closeUserSettings();\n            evt.preventDefault();\n        },\n\n        /**\n         * @action\n         * Opens Station settings\n         */\n        goToStation(evt: MouseEvent | KeyboardEvent) {\n            this.closeUserSettings();\n            const commandNav = this.get('commandNav');\n\n            if (!(commandNav.get('expanded') && commandNav.get('currentPanel') === 'voice')) {\n                commandNav.selectPanel('voice');\n            }\n            run.scheduleOnce('afterRender', this, () => {\n                commandNav.set('callControlsTab', 'followMeSettings');\n                // requestAnimationFrame is intentional here — web components in the tab\n                // need a paint frame to finish their shadow DOM render before focus works.\n                requestAnimationFrame(() => {\n                    const anchor = document.querySelector('.change-phone-settings') as HTMLElement;\n                    if (anchor) anchor.focus();\n                });\n            });\n            evt.preventDefault();\n        },\n\n        /**\n         * @action\n         * Opens Call Forwarding settings\n         */\n        goToCallForwarding(evt: MouseEvent | KeyboardEvent) {\n            this.closeUserSettings();\n            const commandNav = this.get('commandNav');\n            // switch tab to force clearPanels, which resets showStationPicker\n            commandNav.set('callControlsTab', 'callHistory');\n            commandNav.selectPanel('voice');\n            run.scheduleOnce('afterRender', this, function () {\n                commandNav.set('callControlsTab', 'followMeSettings');\n                // requestAnimationFrame is intentional here — the <gux-toggle> web component\n                // needs a paint frame to finish its shadow DOM render before delegatesFocus works.\n                requestAnimationFrame(() => {\n                    const toggle = document.querySelector('.follow-toggle') as HTMLElement;\n                    if (toggle) toggle.focus();\n                });\n            });\n            evt.preventDefault();\n        },\n\n        /**\n         * @action\n         * Opens User's Profile\n         */\n        goToProfile(evt: MouseEvent | KeyboardEvent) {\n            const router = getOwner(this).lookup('router:main');\n            router.transitionTo(`/person-v2/${this.get('personId')}`);\n            this.checkForNarrowSidePanel();\n            this.closeUserSettings();\n            evt.preventDefault();\n        },\n\n        /**\n         * @action\n         * Opens User's Profile\n         */\n        goToProfileE911(evt: MouseEvent | KeyboardEvent) {\n            const router = getOwner(this).lookup('router:main');\n            router.transitionTo(`/person-v2/${this.get('personId')}?editEmergencyLocation=true`);\n            this.checkForNarrowSidePanel();\n            this.closeUserSettings();\n            evt.preventDefault();\n        },\n\n        /**\n         * @action\n         * Sends change for presence section (sent up from presence-selector-menu)\n         */\n        changePresence(presence: PresenceType) {\n            const person = this.get('person');\n            let currentModifiedDate = person?.get('primaryPresence')?.modifiedDate;\n            const sendingPresence = {\n                id: presence.id\n            };\n            this.get('presenceSubscription')\n                .changePresence(sendingPresence)\n                .catch(() => {\n                    if (this.isDestroying || this.isDestroyed) return;\n                    person?.set('primaryPresence.modifiedDate', currentModifiedDate);\n                });\n        },\n\n        /**\n         * @action\n         * Sends change for set out of office (sent up from out-of-office-menu)\n         */\n        sendOutOfOffice(\n            startDate: string | null,\n            endDate: string | null,\n            isIndefinite: boolean,\n            newOutOfOffice = false\n        ) {\n            this.get('presenceSubscription').setOutOfOffice(startDate, endDate, isIndefinite, newOutOfOffice);\n        },\n\n        /**\n         * @action\n         * Opens Security settings\n         */\n        goToSecurity(evt: MouseEvent | KeyboardEvent) {\n            const router = getOwner(this).lookup('router:main');\n            router.transitionTo('/security');\n            this.closeUserSettings();\n            evt.preventDefault();\n        }\n    }\n});\n","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { run } from '@ember/runloop';\nimport { warnClosureAction } from 'web-directory/utils/acd';\nimport { duplicateObject } from 'web-directory/utils/duplicate-object';\nimport { DisplayPresence, PresenceType } from 'web-directory/utils/presence-utils';\nimport { OutOfOffice } from 'web-directory/utils/out-of-office-types';\n\ntype MenuOption = {\n    id: string;\n    title: string;\n    nonTranslatedTitle?: boolean;\n    titleAria?: string;\n    iconName?: string;\n    subLabel?: string;\n    action: string;\n    canSee: boolean;\n    hasSubMenu: boolean;\n};\n\nconst menuOptions: Array<MenuOption> = [\n    {\n        id: 'station',\n        title: 'stationName', // this is the variable for station name not a translation\n        nonTranslatedTitle: false, // station can either be 'stationName' or a translation string error\n        titleAria: 'userSettings.menus.selectPhone.titleAria',\n        iconName: 'phone',\n        action: 'actionGoToStation',\n        canSee: false,\n        hasSubMenu: false\n    },\n    {\n        id: 'callForwarding',\n        title: 'userSettings.menus.forwardCalls.title',\n        titleAria: 'userSettings.menus.forwardCalls.titleAria',\n        action: 'actionGoToCallForwarding',\n        canSee: false,\n        hasSubMenu: false\n    },\n    {\n        id: 'queueActivation',\n        title: 'userSettings.menus.queueActivation.title',\n        titleAria: 'userSettings.menus.queueActivation.titleAria',\n        action: 'actionGoToActivateQueues',\n        canSee: false,\n        hasSubMenu: false\n    },\n    {\n        id: 'outOfOffice',\n        title: 'userSettings.menus.outOfOffice.title',\n        titleAria: 'userSettings.menus.outOfOffice.titleAria',\n        action: 'toggleOutOfOffice',\n        canSee: false,\n        hasSubMenu: true\n    },\n    {\n        id: 'myDetails',\n        title: 'userSettings.menus.myDetails.title',\n        action: 'toggleMyDetails',\n        canSee: true,\n        hasSubMenu: true\n    },\n    {\n        id: 'myFile',\n        title: 'userSettings.menus.myFiles.title',\n        titleAria: 'userSettings.menus.myFiles.titleAria',\n        action: 'actionGoToFiles',\n        canSee: false,\n        hasSubMenu: false\n    },\n    {\n        id: 'security',\n        title: 'userSettings.menus.security.title',\n        titleAria: 'userSettings.menus.security.titleAria',\n        action: 'actionGoToSecurity',\n        canSee: false,\n        hasSubMenu: false\n    }\n];\n\nexport default Component.extend({\n    classNames: ['menu-options'],\n\n    /**\n     * @attribute\n     * User's station obj\n     * from session.person\n     */\n    person: null as any,\n\n    /**\n     * @attribute\n     * User's out of office obj\n     * from session.person.id.activities.outOfOffice\n     */\n    outOfOffice: null as OutOfOffice | null,\n\n    /**\n     * @attribute\n     * Array of menu item information for display\n     */\n    menuOptionsArray: menuOptions,\n\n    /**\n     * @attribute\n     * User's station name\n     * from phone.station.name\n     */\n    stationName: null,\n\n    /**\n     * @attribute\n     * User's current presence formatted for display\n     * (processed in command-user-settings)\n     */\n    currentPresenceDisplay: null as DisplayPresence | null,\n\n    /**\n     * @attribute\n     * Timestamp of the last presence modification\n     */\n    presenceLastModified: null,\n\n    /**\n     * @attribute\n     * All the presence available to the current user\n     * (processed in command-user-settings)\n     */\n    presenceChoices: null as Array<PresenceType> | null,\n\n    /**\n     * @computed\n     * Whether an inline warning exists for the user's emergency location\n     */\n    hasELocationInlineWarning: computed.notEmpty('eLocationInlineWarning'),\n\n    /**\n     * @computed\n     * Whether the user is eligible for E911 services\n     */\n    isEligibleForE911: computed.readOnly('emergencyLocation.isEligibleForE911'),\n\n    /**\n     * @computed\n     * Checks if the user's emergency location address is missing required fields\n     */\n    eLocationIsEmpty: computed('eLocation.address.{street1,street2,city,zipcode,country}', function (this: any) {\n        if (!this.get('eLocation.address')) {\n            return true;\n        }\n        return (\n            !this.get('eLocation.address.street1') ||\n            !this.get('eLocation.address.city') ||\n            !this.get('eLocation.address.zipcode') ||\n            !this.get('eLocation.address.country')\n        );\n    }),\n\n    /**\n     * @computed\n     * Whether an E911 warning should be shown (missing location, ineligible, or inline warning)\n     */\n    e911Warning: computed('hasELocationInlineWarning', 'isEligibleForE911', 'eLocationIsEmpty', function (this: any) {\n        return !!(\n            this.get('hasELocationInlineWarning') ||\n            !this.get('isEligibleForE911') ||\n            this.get('eLocationIsEmpty')\n        );\n    }),\n\n    /**\n     * @attributes\n     * Indicators of each of the permissions\n     */\n    isPhoneEnabled: false,\n    isCallForwardingEnabled: false,\n    isActivateQueueEnabled: false,\n    isPresenceSelectorEnabled: false,\n    isMyFilesEnabled: false,\n    isSecurityEnabled: false,\n\n    /**\n     * @attribute\n     * Whether E911 emergency location feature is enabled for the org\n     * Passed down from command-user-settings\n     */\n    isE911Enabled: false,\n\n    /**\n     * @attribute\n     * Whether the app is running in media helper mode\n     * Passed down from command-user-settings\n     */\n    isMediaHelperMode: false,\n\n    /**\n     * @attributes\n     * Indicators of each of the menus\n     */\n    isOpenPresenceMenu: false,\n    isOpenOutOfOfficeMenu: false,\n    isOpenMyDetailsMenu: false,\n\n    /**\n     * @attribute\n     * Tracks which sub-menu was last opened so focus can be restored\n     * to the correct menuitem when returning to the main menu.\n     */\n    _lastOpenedSubMenu: null as string | null,\n\n    // ==================================================================\n    // Computed\n    // ==================================================================\n\n    // Indicator for if any of the menus are open used to hide main menu\n    isOpenMenu: computed('isOpenPresenceMenu', 'isOpenOutOfOfficeMenu', 'isOpenMyDetailsMenu', function (this: any) {\n        return !!(\n            this.get('isOpenPresenceMenu') ||\n            this.get('isOpenOutOfOfficeMenu') ||\n            this.get('isOpenMyDetailsMenu')\n        );\n    }),\n\n    /**\n     * @attribute\n     * Whether the user's calls are currently being forwarded\n     * Passed down from command-user-settings via phone.callForwardingActive\n     */\n    isCallsForwarded: false,\n\n    /**\n     * @attribute\n     * Array of menu item information for display edited for permissions (canSee)\n     */\n    menuOptions: computed(\n        'isPresenceSelectorEnabled',\n        'isPhoneEnabled',\n        'isCallForwardingEnabled',\n        'isActivateQueueEnabled',\n        'isMyFilesEnabled',\n        'isCallsForwarded',\n        'isMediaHelperMode',\n        'stationName',\n        'e911Warning',\n        function (this: any) {\n            const _menuOptionsArray = duplicateObject(this.get('menuOptionsArray'));\n\n            const station = _menuOptionsArray.find((element: MenuOption) => element.id === 'station');\n\n            if (station) {\n                station.canSee = !!this.get('isPhoneEnabled');\n                if (this.get('stationName')) {\n                    station.nonTranslatedTitle = true;\n                    station.title = this.get('stationName'); // use actual station name instead of translation key\n                    station.iconName = 'phone';\n                } else {\n                    station.nonTranslatedTitle = false;\n                    station.title = 'userSettings.menus.selectPhone.altTitle'; // no phone title\n                    station.iconName = 'legacy/phone-disable';\n                }\n                if (this.get('isMediaHelperMode')) {\n                    station.subLabel = 'purecloud.station.mediaHelperMode';\n                }\n            }\n\n            const callForwarding = _menuOptionsArray.find((element: MenuOption) => element.id === 'callForwarding');\n            if (callForwarding) {\n                // isCallForwardingEnabled covers both conversation:callForwarding:edit and phoneEnabled\n                callForwarding.canSee = !!this.get('isCallForwardingEnabled');\n                callForwarding.subLabel = this.get('isCallsForwarded')\n                    ? 'userSettings.menus.forwardCalls.subLabelActive'\n                    : undefined;\n            }\n            const queueActivation = _menuOptionsArray.find((element: MenuOption) => element.id === 'queueActivation');\n            if (queueActivation) queueActivation.canSee = !!this.get('isActivateQueueEnabled');\n\n            const outOfOffice = _menuOptionsArray.find((element: MenuOption) => element.id === 'outOfOffice');\n            if (outOfOffice) outOfOffice.canSee = !!this.get('isPresenceSelectorEnabled');\n\n            const details = _menuOptionsArray.find((element: MenuOption) => element.id === 'myDetails');\n            if (details && this.get('e911Warning') && this.get('isE911Enabled'))\n                details.subLabel = 'userSettings.menus.myDetails.emergencyLocation.subLabelWarning'; // show e911 warning sub-label\n\n            const myFile = _menuOptionsArray.find((element: MenuOption) => element.id === 'myFile');\n            if (myFile) myFile.canSee = !!this.get('isMyFilesEnabled');\n\n            const security = _menuOptionsArray.find((element: MenuOption) => element.id === 'security');\n            if (security) security.canSee = !!this.get('isSecurityEnabled');\n\n            return _menuOptionsArray;\n        }\n    ),\n\n    // ==================================================================\n    // Lifecycle\n    // ==================================================================\n\n    /* @lifecycle */\n    init() {\n        this._super(...arguments);\n\n        // reload to make sure we have the latest activity in case of subscription error\n        if (this.get('person')) {\n            this.get('person').reload();\n        }\n    },\n\n    /* @lifecycle */\n    didInsertElement() {\n        this._super(...arguments);\n        this.addObserver('isOpenMenu', this, this._onMenuToggle);\n    },\n\n    /* @lifecycle */\n    willDestroyElement() {\n        this._super(...arguments);\n        this.removeObserver('isOpenMenu', this, this._onMenuToggle);\n    },\n\n    // ==================================================================\n    // Functions\n    // ==================================================================\n\n    /**\n     * @function\n     * Manages focus when transitioning between the main menu and a sub-menu.\n     * On open: moves screen reader focus into the sub-menu header.\n     * On close: restores focus to the menuitem that originally opened the sub-menu.\n     */\n    _onMenuToggle() {\n        run.scheduleOnce('afterRender', this, function () {\n            if (this.isDestroying || this.isDestroyed) return;\n\n            if (this.get('isOpenMenu')) {\n                this._focusOpenedSubMenu();\n            } else {\n                this._focusLastOpenedMenuItem();\n            }\n        });\n    },\n\n    /**\n     * @function\n     * Focuses the appropriate element inside the newly opened sub-menu\n     * so screen readers announce the menu context change.\n     * For presence: focuses the checked (or first) radio input.\n     * For other sub-menus: focuses the close button in the header.\n     */\n    _focusOpenedSubMenu() {\n        if (this.get('_lastOpenedSubMenu') === 'presence') {\n            requestAnimationFrame(() => {\n                if (this.isDestroying || this.isDestroyed) return;\n                const checked = this.element?.querySelector('input[type=\"radio\"]:checked') as HTMLElement;\n                const first = this.element?.querySelector('input[type=\"radio\"]') as HTMLElement;\n                const target = checked || first;\n                if (target) {\n                    target.blur();\n                    target.focus();\n                }\n            });\n            return;\n        }\n\n        const target = this.element?.querySelector('[data-testid=\"open-header-close-button\"]') as HTMLElement;\n        if (target) {\n            target.focus();\n        }\n    },\n\n    /**\n     * @function\n     * Focuses the menuitem that originally opened the sub-menu.\n     */\n    _focusLastOpenedMenuItem() {\n        const subMenu = this.get('_lastOpenedSubMenu');\n        if (!subMenu) return;\n\n        const selectorMap: Record<string, string> = {\n            presence: '#presence-button',\n            outOfOffice: '[data-testid=\"user-settings-menu-row-outOfOffice\"]',\n            myDetails: '[data-testid=\"user-settings-menu-row-myDetails\"]'\n        };\n\n        const selector = selectorMap[subMenu];\n        if (selector) {\n            const target = this.element?.querySelector(selector) as HTMLElement;\n            if (target) target.focus();\n        }\n\n        this.set('_lastOpenedSubMenu', null);\n    },\n\n    /**\n     * Universal Close Menu\n     */\n    closeMenus() {\n        this.setProperties({\n            isOpenPresenceMenu: false,\n            isOpenOutOfOfficeMenu: false,\n            isOpenMyDetailsMenu: false\n        });\n    },\n\n    /**\n     * Toggle of Presence Menu\n     * When true displays presence-selector-menu component in the menu section\n     */\n    togglePresenceMenu() {\n        this.set('_lastOpenedSubMenu', 'presence');\n        this.toggleProperty('isOpenPresenceMenu');\n    },\n\n    /**\n     * Toggle of Out of Office Menu\n     * When true displays details-menu component in the menu section\n     */\n    toggleOutOfOffice() {\n        this.set('_lastOpenedSubMenu', 'outOfOffice');\n        this.toggleProperty('isOpenOutOfOfficeMenu');\n    },\n\n    /**\n     * Toggle of Details Menu\n     * When true displays details-menu component in the menu section\n     */\n    toggleMyDetails() {\n        this.set('_lastOpenedSubMenu', 'myDetails');\n        this.toggleProperty('isOpenMyDetailsMenu');\n    },\n\n    // ==================================================================\n    // Actions\n    // ==================================================================\n\n    /**\n     * @action\n     * routes user and the closes user settings menu\n     * Closure action passed from command-user-settings\n     */\n    actionGoToActivateQueues: (evt: MouseEvent | KeyboardEvent) => {\n        warnClosureAction('actionGoToActivateQueues', evt);\n    },\n\n    /**\n     * @action\n     * Sets User Presence\n     * Closure action passed from command-user-settings\n     */\n    actionChangePresence: (presence: PresenceType) => {\n        warnClosureAction('actionChangePresence', presence);\n    },\n\n    /**\n     * @action\n     * routes user and the closes user settings menu\n     * Closure action passed from command-user-settings\n     */\n    actionGoToFiles: (evt: MouseEvent | KeyboardEvent) => {\n        warnClosureAction('actionGoToFiles', evt);\n    },\n\n    /**\n     * @action\n     * routes user and the closes user settings menu\n     * Closure action passed from command-user-settings\n     */\n    actionGoToStation: (evt: MouseEvent | KeyboardEvent) => {\n        warnClosureAction('actionGoToStation', evt);\n    },\n\n    /**\n     * @action\n     * routes user and the closes user settings menu\n     * Closure action passed from command-user-settings\n     */\n    actionGoToCallForwarding: (evt: MouseEvent | KeyboardEvent) => {\n        warnClosureAction('actionGoToCallForwarding', evt);\n    },\n\n    /**\n     * @action\n     * Sends change for set out of office (sent up from out-of-office-menu)\n     * Closure action passed from command-user-settings\n     */\n    actionSendOutOfOffice: () => {\n        warnClosureAction('actionSendOutOfOffice', null);\n    },\n\n    /**\n     * @action\n     * routes user and the closes user settings menu\n     * Closure action passed from command-user-settings\n     */\n    actionGoToSecurity: (evt: MouseEvent | KeyboardEvent) => {\n        warnClosureAction('actionGoToSecurity', evt);\n    },\n\n    actions: {\n        closeMenuAction() {\n            this.closeMenus();\n        },\n\n        changePresenceWrapper(presence: PresenceType) {\n            const changePresenceAction = this.get('actionChangePresence');\n            changePresenceAction(presence);\n            this.closeMenus();\n        },\n\n        /**\n         * @action\n         * Generic closure action capture from child components\n         * used to redirect to correct function\n         * @param optionAction\n         * @param evt\n         */\n        userMenuAction(optionAction: string, evt?: MouseEvent | KeyboardEvent) {\n            switch (optionAction) {\n                case 'togglePresenceMenu':\n                    this.togglePresenceMenu();\n                    break;\n                case 'actionGoToStation':\n                    if (evt) {\n                        this.actionGoToStation(evt);\n                    }\n                    break;\n                case 'actionGoToCallForwarding':\n                    if (evt) {\n                        this.actionGoToCallForwarding(evt);\n                    }\n                    break;\n                case 'actionGoToActivateQueues':\n                    if (evt) {\n                        this.actionGoToActivateQueues(evt);\n                    }\n                    break;\n                case 'toggleOutOfOffice':\n                    this.toggleOutOfOffice();\n                    break;\n                case 'toggleMyDetails':\n                    this.toggleMyDetails();\n                    break;\n                case 'actionGoToFiles':\n                    if (evt) {\n                        this.actionGoToFiles(evt);\n                    }\n                    break;\n                case 'actionGoToSecurity':\n                    if (evt) {\n                        this.actionGoToSecurity(evt);\n                    }\n                    break;\n            }\n        }\n    }\n});\n","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport displayRelativeGeolocation from 'web-directory/utils/display-geolocation';\nimport { warnClosureAction } from 'web-directory/utils/acd';\nexport default Component.extend({\n    classNames: ['details-menu', 'menu-container'],\n    /**\n     * @service\n     * geolocation service\n     * injected at command-user-settings\n     */\n    geolocation: null as any,\n\n    /**\n     * @service\n     * emergencyLocation service\n     * injected at command-user-settings\n     */\n    emergencyLocation: null as any,\n\n    /**\n     * @attribute\n     * User's station object\n     * from session.person\n     */\n    person: null as any,\n\n    /**\n     * @attribute\n     * Whether E911 emergency location feature is enabled for the org\n     * Passed down from command-user-settings\n     */\n    isE911Enabled: false,\n\n    // ==================================================================\n    // Computed\n    // ==================================================================\n\n    /**\n     * @computed\n     * user has geolocation enabled\n     */\n    isGeolocationEnabled: computed.readOnly('geolocation.isEnabled'),\n\n    /**\n     * @computed\n     * user has geolocation available\n     */\n    hasGeolocation: computed.readOnly('person.hasGeolocation'),\n\n    /**\n     * @computed\n     * A combo of the users location for display purposes\n     */\n    selfLocation: computed('person.geolocation.{city,region,country}', function () {\n        if (!this.get('person')) {\n            return {\n                city: '',\n                region: '',\n                country: ''\n            };\n        }\n        return {\n            city: this.get('person.geolocation.city'),\n            region: this.get('person.geolocation.region'),\n            country: this.get('person.geolocation.country')\n        };\n    }),\n\n    /**\n     * @computed\n     * user's geolocation\n     */\n    location: computed('person.geolocation', function () {\n        const person = this.get('person');\n        return displayRelativeGeolocation(person, this.get('selfLocation'));\n    }),\n\n    /**\n     * @computed\n     * Checks if user can have an emergency location\n     */\n    isEligibleForE911: computed.readOnly('emergencyLocation.isEligibleForE911'),\n\n    /**\n     * @computed\n     * Users emergency location\n     */\n    eLocation: computed.readOnly('emergencyLocation.eLocation'),\n\n    /**\n     * @computed\n     * readOnly emergency location error for display purposes\n     */\n    eLocationInlineWarning: computed.readOnly('emergencyLocation.eLocationInlineWarning'),\n\n    /**\n     * @computed\n     * check for emergency location error for display purposes\n     */\n    hasELocationInlineWarning: computed.notEmpty('eLocationInlineWarning'),\n\n    /**\n     * @computed\n     * checks if users emergency location exists\n     */\n    eLocationIsEmpty: computed('eLocation.address.{street1,street2,city,zipcode,country}', function () {\n        if (!this.get('eLocation.address')) {\n            return true;\n        }\n        return (\n            !this.get('eLocation.address.street1') ||\n            !this.get('eLocation.address.city') ||\n            !this.get('eLocation.address.zipcode') ||\n            !this.get('eLocation.address.country')\n        );\n    }),\n\n    /**\n     * @computeds\n     * user's address information\n     */\n    street1ReadOnly: computed.readOnly('eLocation.address.street1'),\n    street2ReadOnly: computed.readOnly('eLocation.address.street2'),\n    cityReadOnly: computed.readOnly('eLocation.address.city'),\n    stateReadOnly: computed.readOnly('eLocation.address.state'),\n    zipcodeReadOnly: computed.readOnly('eLocation.address.zipcode'),\n    countryReadOnly: computed.readOnly('eLocation.address.country'),\n\n    // ==================================================================\n    // Actions\n    // ==================================================================\n\n    /**\n     * @action\n     * Links user to their profile\n     * Closure action passed from command-user-settings\n     */\n    actionGoToProfileE911: (evt: MouseEvent | KeyboardEvent) => {\n        warnClosureAction('actionGoToProfileE911', evt);\n    },\n\n    actions: {\n        actionGoToProfileE911(evt: MouseEvent | KeyboardEvent) {\n            this.actionGoToProfileE911(evt);\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"8WoebXCk\",\"block\":\"[[[1,[28,[35,0],null,[[\\\"title\\\",\\\"closeMenuAction\\\"],[[33,1],[33,2]]]]],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"settings-scroll-with-header\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"ul\\\"],[14,0,\\\"details-list\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,4,[\\\"title\\\"]],[[[1,\\\"            \\\"],[10,\\\"li\\\"],[14,0,\\\"menu-row\\\"],[12],[1,\\\"\\\\n                \\\"],[10,1],[14,0,\\\"menu-row-text-label\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,1],[14,0,\\\"menu-row-icon\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"user\\\"],[15,\\\"screenreader-text\\\",[28,[37,5],[\\\"userSettings.menus.myDetails.detailsLabels.title\\\"],null]],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-truncate\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,1],[14,\\\"data-testid\\\",\\\"details-person-title\\\"],[12],[1,[33,4,[\\\"title\\\"]]],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,4,[\\\"department\\\"]],[[[1,\\\"            \\\"],[10,\\\"li\\\"],[14,0,\\\"menu-row\\\"],[12],[1,\\\"\\\\n                \\\"],[10,1],[14,0,\\\"menu-row-text-label\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,1],[14,0,\\\"menu-row-icon\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"user-group\\\"],[15,\\\"screenreader-text\\\",[28,[37,5],[\\\"userSettings.menus.myDetails.detailsLabels.department\\\"],null]],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-truncate\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,1],[14,\\\"data-testid\\\",\\\"details-person-department\\\"],[12],[1,[33,4,[\\\"department\\\"]]],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,6],[[[1,\\\"            \\\"],[10,\\\"li\\\"],[14,0,\\\"menu-row\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"menu-row-text-label-multi-line\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,1],[14,0,\\\"menu-row-icon\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"pin-location\\\"],[15,\\\"screenreader-text\\\",[28,[37,5],[\\\"userSettings.menus.myDetails.detailsLabels.location\\\"],null]],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\\n                    \\\"],[10,0],[14,\\\"data-testid\\\",\\\"details-location\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,7],[[[1,\\\"                            \\\"],[10,1],[14,0,\\\"main-text\\\"],[14,\\\"data-testid\\\",\\\"details-person-location\\\"],[12],[1,[34,8]],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[10,1],[14,0,\\\"main-text\\\"],[14,\\\"data-testid\\\",\\\"details-person-no-location\\\"],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,5],[\\\"userSettings.menus.myDetails.location.noLocation\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                            \\\"],[10,0],[14,0,\\\"sub-text\\\"],[14,\\\"data-testid\\\",\\\"details-person-no-location-additional\\\"],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,5],[\\\"userSettings.menus.myDetails.location.noLocationAdditional\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n        \\\"],[10,\\\"li\\\"],[14,0,\\\"menu-row\\\"],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"menu-row-text-label\\\"],[12],[1,\\\"\\\\n                \\\"],[10,1],[14,0,\\\"menu-row-icon\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"clock\\\"],[15,\\\"screenreader-text\\\",[28,[37,5],[\\\"userSettings.menus.myDetails.detailsLabels.lastLongIn\\\"],null]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-truncate\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,1],[14,\\\"data-testid\\\",\\\"details-person-last-login\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,5],[\\\"userSettings.menus.myDetails.lastLogin\\\"],[[\\\"date\\\"],[[33,9]]]]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,10],[[[1,\\\"            \\\"],[10,\\\"li\\\"],[14,0,\\\"menu-row\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"menu-row-text-label-multi-line\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,1],[14,0,\\\"menu-row-icon\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"alert-warning-octogon\\\"],[15,\\\"screenreader-text\\\",[28,[37,5],[\\\"userSettings.menus.myDetails.detailsLabels.emergencyLocation\\\"],null]],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,0],[14,\\\"data-testid\\\",\\\"details-e911\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                        \\\"],[10,0],[14,0,\\\"main-text-bold\\\"],[14,\\\"data-testid\\\",\\\"details-e911-title\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,5],[\\\"userSettings.menus.myDetails.emergencyLocation.emergencyAddressForNumber\\\"],[[\\\"number\\\"],[[33,11,[\\\"primaryVoice\\\",\\\"display\\\"]]]]]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,12],[[[1,\\\"                            \\\"],[10,0],[14,\\\"data-testid\\\",\\\"details-e911-warning\\\"],[14,0,\\\"mimic-inline-alert\\\"],[12],[1,\\\"\\\\n                                \\\"],[1,[34,13]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,14],[[33,15]],null],[[[1,\\\"                            \\\"],[10,1],[14,\\\"data-testid\\\",\\\"details-e911-not-eligible\\\"],[14,0,\\\"mimic-inline-alert\\\"],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,5],[\\\"userSettings.menus.myDetails.emergencyLocation.notEligible\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,16],[[[1,\\\"                            \\\"],[10,1],[14,\\\"data-testid\\\",\\\"details-e911-empty\\\"],[14,0,\\\"mimic-inline-alert\\\"],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,5],[\\\"userSettings.menus.myDetails.emergencyLocation.emptyAddress\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[10,0],[14,\\\"role\\\",\\\"group\\\"],[15,\\\"aria-label\\\",[29,[[28,[37,5],[\\\"userSettings.menus.myDetails.emergencyLocation.emergencyAddressForNumber\\\"],[[\\\"number\\\"],[[33,11,[\\\"primaryVoice\\\",\\\"display\\\"]]]]]]]],[12],[1,\\\"\\\\n                                \\\"],[10,0],[14,0,\\\"emergency-address-data street1\\\"],[12],[1,\\\"\\\\n                                    \\\"],[1,[34,17]],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n                                \\\"],[10,0],[14,0,\\\"emergency-address-data street2\\\"],[12],[1,\\\"\\\\n                                    \\\"],[1,[34,18]],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n                                \\\"],[10,0],[14,0,\\\"emergency-address-data city-state-zip\\\"],[12],[1,\\\"\\\\n                                    \\\"],[1,[34,19]],[1,\\\"\\\\n                                    \\\"],[1,[34,20]],[1,\\\"\\\\n                                    \\\"],[1,[34,21]],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n                                \\\"],[10,0],[14,0,\\\"emergency-address-data country\\\"],[12],[1,\\\"\\\\n                                    \\\"],[1,[34,22]],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"]],[]]]],[]]]],[]]],[1,\\\"\\\\n\\\"],[1,\\\"                        \\\"],[10,0],[14,0,\\\"sub-text\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,5],[\\\"userSettings.menus.myDetails.emergencyLocation.reminder\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"],[1,\\\"                        \\\"],[10,0],[14,0,\\\"menu-row-link\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,3],[14,6,\\\"#\\\"],[14,\\\"data-testid\\\",\\\"emergency-location-link\\\"],[15,\\\"onclick\\\",[28,[37,23],[[30,0],\\\"actionGoToProfileE911\\\"],null]],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,5],[\\\"userSettings.menus.myDetails.emergencyLocation.update\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"command-user-settings/menu-options/open-menu-header\\\",\\\"title\\\",\\\"closeMenuAction\\\",\\\"if\\\",\\\"person\\\",\\\"t\\\",\\\"isGeolocationEnabled\\\",\\\"hasGeolocation\\\",\\\"location\\\",\\\"lastLoginDateFormatted\\\",\\\"isE911Enabled\\\",\\\"emergencyLocation\\\",\\\"hasELocationInlineWarning\\\",\\\"eLocationInlineWarning\\\",\\\"not\\\",\\\"isEligibleForE911\\\",\\\"eLocationIsEmpty\\\",\\\"street1ReadOnly\\\",\\\"street2ReadOnly\\\",\\\"cityReadOnly\\\",\\\"stateReadOnly\\\",\\\"zipcodeReadOnly\\\",\\\"countryReadOnly\\\",\\\"action\\\"]]\",\"moduleName\":\"web-directory/components/command-user-settings/menu-options/details-menu/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { DisplayPresence } from 'web-directory/utils/presence-utils';\nexport default Component.extend({\n    classNames: ['user-menu-option-presence'],\n    attributeBindings: ['role'],\n    role: 'none',\n\n    /**\n     * @attribute\n     * User's current presence formatted for display\n     * (processed in command-user-settings)\n     */\n    currentPresenceDisplay: null as DisplayPresence | null,\n\n    /**\n     * @attribute\n     * Last modified time stamp from presence\n     */\n    presenceLastModified: null,\n\n    /**\n     * @computed\n     * Normalized presence type for icon and class mapping\n     * Groups similar presences (e.g. break, meal, training → away)\n     */\n    presenceType: computed('currentPresenceDisplay', function () {\n        const presenceKey = this.get('currentPresenceDisplay.primaryKey')?.toLowerCase();\n\n        const awayTypes = new Set(['away', 'break', 'meal', 'training']);\n        const busyTypes = new Set(['busy', 'meeting']);\n\n        if (awayTypes.has(presenceKey)) return 'away';\n        if (busyTypes.has(presenceKey)) return 'busy';\n\n        return presenceKey; // Returns as-is for available, on_queue, offline, out_of_office\n    }),\n\n    isRequestingPresenceOffQueue: computed(\n        'currentPresenceDisplay.{requestedPresenceId,requestedPrimaryKey}',\n        function () {\n            const { requestedPresenceId, requestedPrimaryKey } = this.get('currentPresenceDisplay');\n            // user is requesting this status meaning they're currently on queue\n            return requestedPresenceId && requestedPrimaryKey;\n        }\n    ),\n\n    /**\n     * @computed\n     * Gux icon name for the current presence type\n     */\n    presenceIcon: computed('presenceType', function (): string {\n        switch (this.get('presenceType')) {\n            case 'available':\n                return 'fa/circle-check-solid';\n            case 'busy':\n                return 'ban-outline';\n            case 'away':\n                return 'fa/clock-regular';\n            case 'on_queue':\n                return 'fa/headset-solid';\n            case 'out_of_office':\n                return 'fa/subtract-circle-regular';\n            default:\n                return 'fa/circle-xmark-regular';\n        }\n    }),\n\n    /**\n     * @computed\n     * CSS class for the current presence type\n     */\n    presenceClass: computed('presenceType', function (): string {\n        switch (this.get('presenceType')) {\n            case 'available':\n                return 'presence-available';\n            case 'busy':\n                return 'presence-busy';\n            case 'away':\n                return 'presence-away';\n            case 'on_queue':\n                return 'presence-on-queue';\n            case 'out_of_office':\n                return 'presence-out-of-office';\n            default:\n                return 'presence-offline';\n        }\n    }),\n\n    /**\n     * @computed\n     * Whether the icon needs a wrapping span (for types that use a colored background circle)\n     */\n    presenceIconWrapped: computed('presenceType', function (): boolean {\n        const wrapped = new Set(['busy', 'away', 'on_queue']);\n        return wrapped.has(this.get('presenceType'));\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"kZ6Jp+7J\",\"block\":\"[[[10,\\\"button\\\"],[14,0,\\\"menu-row menu-top-level-row \\\"],[15,\\\"onclick\\\",[28,[37,0],[[30,0],[33,1]],null]],[14,\\\"data-testid\\\",\\\"user-settings-presence-button\\\"],[14,1,\\\"presence-button\\\"],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n    \\\"],[10,1],[14,0,\\\"menu-row-text-label\\\"],[12],[1,\\\"\\\\n        \\\"],[10,1],[14,0,\\\"menu-row-icon\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,3],[[[1,\\\"                \\\"],[10,1],[15,0,[29,[\\\"menu-row-icon-presence \\\",[36,4],\\\" \\\",[33,5,[\\\"primaryKey\\\"]]]]],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[15,\\\"icon-name\\\",[36,6]],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[15,\\\"icon-name\\\",[36,6]],[15,0,[36,4]],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,1],[14,0,\\\"two-layer-text-centering\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-truncate\\\"],[12],[1,\\\"\\\\n                \\\"],[10,1],[14,0,\\\"presence-label\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,7],[[[1,\\\"                        \\\"],[1,[33,5,[\\\"label\\\"]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[1,[28,[35,8],[[33,5,[\\\"label\\\"]]],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,9],[[[1,\\\"                \\\"],[10,1],[14,0,\\\"menu-row-text-sub-label\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,1],[14,0,\\\"sr-only\\\"],[12],[1,\\\" \\\"],[1,[28,[35,8],[\\\"userSettings.menus.selectStatus.durationAria\\\"],null]],[1,\\\" \\\"],[13],[1,\\\"\\\\n\\\\n                    \\\"],[1,[28,[35,10],null,[[\\\"startTime\\\",\\\"formatType\\\"],[[33,9],\\\"separated\\\"]]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[10,1],[14,0,\\\"sr-only\\\"],[12],[1,\\\" \\\"],[1,[28,[35,8],[\\\"userSettings.menus.selectStatus.ariaTitle\\\"],null]],[1,\\\" \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,\\\"gux-icon\\\"],[15,0,[29,[[52,[33,9],\\\"account-for-two-layer-text-centering\\\"]]]],[14,\\\"icon-name\\\",\\\"chevron-right\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"action\\\",\\\"userMenuAction\\\",\\\"if\\\",\\\"presenceIconWrapped\\\",\\\"presenceClass\\\",\\\"currentPresenceDisplay\\\",\\\"presenceIcon\\\",\\\"isRequestingPresenceOffQueue\\\",\\\"t\\\",\\\"presenceLastModified\\\",\\\"duration-format\\\"]]\",\"moduleName\":\"web-directory/components/command-user-settings/menu-options/menu-option-presence/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { warnClosureAction } from 'web-directory/utils/acd-ts';\nimport { formatDateForDisplay } from 'web-directory/utils/date-time';\nimport { OutOfOffice } from 'web-directory/utils/out-of-office-types';\nexport default Component.extend({\n    classNames: ['user-menu-option'],\n    attributeBindings: ['role'],\n    role: 'none',\n\n    intl: service('intl') as any,\n\n    /**\n     * @attribute\n     * Menu's id for internal use\n     * from MenuOption model in menu-options\n     */\n    optionId: '',\n\n    /**\n     * @attribute\n     * Menu's display title (translation string)\n     * from MenuOption model in menu-options\n     */\n    title: '',\n\n    /**\n     * @attribute\n     * Whether the title should be displayed as-is (not translated)\n     * from MenuOption model in menu-options\n     */\n    nonTranslatedTitle: false,\n\n    /**\n     * @attribute\n     * Menu's sub-label text (translation string, optional)\n     * from MenuOption model in menu-options\n     */\n    subLabel: '',\n\n    /**\n     * @attribute\n     * Menu's accessible title if it has one (translation string)\n     * from MenuOption model in menu-options\n     */\n    titleAria: '',\n\n    /**\n     * @attribute\n     * Menu's gux icon (optional)\n     * from MenuOption model in menu-options\n     */\n    iconName: '',\n\n    /**\n     * @attribute\n     * Menu's closure action\n     * (processed in menu-options)\n     */\n    optionAction: '',\n\n    /**\n     * @attribute\n     * Indicator menu has sub menu\n     * (for icon display purposes)\n     * from MenuOption model in menu-options\n     */\n    hasSubMenu: false,\n\n    /**\n     * @attribute\n     * Users out of office obj from session.person.id activities.outOfOffice\n     */\n    outOfOffice: null as OutOfOffice | null,\n\n    /**\n     * @attribute\n     * Flag for if user has an out of office scheduled for the future\n     */\n    scheduledOutOfOffice: false,\n\n    /**\n     * @computed\n     * Whether the no-phone styling should be applied to the station icon\n     */\n    noPhoneStationStyling: computed('optionId', 'nonTranslatedTitle', function () {\n        return this.get('optionId') === 'station' && !this.get('nonTranslatedTitle');\n    }),\n\n    /**\n     * @computed\n     * Flag for if scheduled ooo should be shown\n     */\n    showOOOScheduled: computed('scheduledOutOfOffice', 'optionId', function () {\n        if (this.get('optionId') !== 'outOfOffice') return false;\n        return !!this.get('scheduledOutOfOffice');\n    }),\n\n    /**\n     * @computed\n     * Out of office schedule start time\n     */\n    startTime: computed('outOfOffice', 'scheduledOutOfOffice', function () {\n        if (this.get('outOfOffice') && this.get('scheduledOutOfOffice')) {\n            return this.get('outOfOffice').startDate;\n        }\n        return '';\n    }),\n\n    /**\n     * @computed\n     * Full accessible label for the menu option, including titleAria, subLabel, and OOO scheduled date\n     */\n    fullAriaLabel: computed(\n        'titleAria',\n        'title',\n        'nonTranslatedTitle',\n        'subLabel',\n        'showOOOScheduled',\n        'startTime',\n        function () {\n            const intl = this.get('intl');\n            const titleAria = this.get('titleAria');\n            const title = this.get('title');\n            const nonTranslatedTitle = this.get('nonTranslatedTitle');\n\n            let label = titleAria ? intl.t(titleAria) : nonTranslatedTitle ? title : intl.t(title);\n\n            if (this.get('showOOOScheduled') && this.get('startTime')) {\n                const scheduledForText = intl.t('userSettings.menus.outOfOffice.scheduledFor');\n                const formattedDate = formatDateForDisplay(this.get('startTime') as string, 'short');\n                label = `${label} ${scheduledForText} ${formattedDate}`;\n            }\n\n            const subLabel = this.get('subLabel');\n            if (subLabel) {\n                label = `${label} ${intl.t(subLabel)}`;\n            }\n\n            return label;\n        }\n    ),\n\n    // ==================================================================\n    // Actions\n    // ==================================================================\n\n    /**\n     * @action\n     *\n     * Closure action passed up to menu-options\n     * generic\n     */\n    userMenuAction: (options: { optionAction: string; evt?: MouseEvent | KeyboardEvent }) => {\n        warnClosureAction('userMenuAction', options);\n    },\n\n    actions: {\n        userMenuAction(evt: MouseEvent | KeyboardEvent) {\n            if (!this.get('optionAction')) return;\n            if (this.get('hasSubMenu')) {\n                const options = {\n                    optionAction: this.get('optionAction')\n                };\n                this.userMenuAction(options);\n            } else {\n                const options = {\n                    optionAction: this.get('optionAction'),\n                    evt: evt\n                };\n                this.userMenuAction(options);\n            }\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"+HBXczYH\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[10,\\\"button\\\"],[15,\\\"data-testid\\\",[29,[\\\"user-settings-menu-row-\\\",[36,2]]]],[14,0,\\\"menu-row menu-top-level-row\\\"],[15,\\\"aria-label\\\",[36,3]],[15,\\\"onclick\\\",[28,[37,4],[[30,0],[33,5]],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n        \\\"],[10,1],[14,0,\\\"menu-row-text-label\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,6],[[[1,\\\"                \\\"],[10,1],[14,0,\\\"menu-row-icon\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[15,\\\"icon-name\\\",[36,6]],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[10,1],[14,0,\\\"two-layer-text-centering\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-truncate\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,1],[14,\\\"data-testid\\\",\\\"user-settings-menu-row-title\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,7],[[33,8]],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,9],[[[1,\\\"                    \\\"],[10,\\\"gux-truncate\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,1],[14,0,\\\"menu-row-text-sub-label\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,1],[14,0,\\\"out-of-office-scheduled-text\\\"],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,7],[\\\"userSettings.menus.outOfOffice.scheduledFor\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                            \\\"],[10,\\\"gux-date-time-beta\\\"],[15,\\\"datetime\\\",[29,[[36,10]]]],[14,\\\"format\\\",\\\"short\\\"],[12],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,11],[[[1,\\\"                    \\\"],[10,\\\"gux-truncate\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,1],[14,0,\\\"menu-row-text-sub-label\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,7],[[33,11]],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,1],[[[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[15,0,[29,[[52,[28,[37,12],[[33,9],[33,11]],null],\\\"account-for-two-layer-text-centering\\\"]]]],[14,\\\"icon-name\\\",\\\"chevron-right\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"    \\\"],[10,3],[14,6,\\\"#\\\"],[15,\\\"data-testid\\\",[29,[\\\"user-settings-menu-row-\\\",[36,2]]]],[14,0,\\\"menu-row menu-top-level-row\\\"],[15,\\\"aria-label\\\",[36,3]],[15,\\\"onclick\\\",[28,[37,4],[[30,0],[33,5]],null]],[12],[1,\\\"\\\\n        \\\"],[10,1],[14,0,\\\"menu-row-text-label\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,6],[[[1,\\\"                \\\"],[10,1],[14,0,\\\"menu-row-icon\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[15,0,[29,[[52,[33,13],\\\"no-phone\\\",\\\"\\\"]]]],[15,\\\"icon-name\\\",[36,6]],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[10,1],[14,0,\\\"two-layer-text-centering\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-truncate\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,1],[14,\\\"data-testid\\\",\\\"user-settings-menu-row-title\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,14],[[[1,\\\"                            \\\"],[1,[34,8]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[10,1],[15,0,[29,[[52,[33,13],\\\"no-phone\\\",\\\"\\\"]]]],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,7],[[33,8]],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,11],[[[1,\\\"                    \\\"],[10,\\\"gux-truncate\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,1],[14,0,\\\"menu-row-text-sub-label\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,7],[[33,11]],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"gux-icon\\\"],[15,0,[29,[\\\"link-hover-icon \\\",[52,[33,11],\\\"account-for-two-layer-text-centering\\\"]]]],[14,\\\"icon-name\\\",\\\"external-link\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[],false,[\\\"if\\\",\\\"hasSubMenu\\\",\\\"optionId\\\",\\\"fullAriaLabel\\\",\\\"action\\\",\\\"userMenuAction\\\",\\\"iconName\\\",\\\"t\\\",\\\"title\\\",\\\"showOOOScheduled\\\",\\\"startTime\\\",\\\"subLabel\\\",\\\"or\\\",\\\"noPhoneStationStyling\\\",\\\"nonTranslatedTitle\\\"]]\",\"moduleName\":\"web-directory/components/command-user-settings/menu-options/menu-option/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { warnClosureAction } from 'web-directory/utils/acd-ts';\nexport default Component.extend({\n    classNames: ['user-open-menu-header'],\n\n    /**\n     * @attribute\n     * Menu's display title (translation string)\n     * from parent component\n     */\n    title: '',\n\n    // ==================================================================\n    // Actions\n    // ==================================================================\n\n    /**\n     * @action\n     * Closes to main menu\n     * Closure action passed from menu-options\n     */\n    closeMenuAction: () => {\n        warnClosureAction('closeMenuAction');\n    },\n\n    actions: {\n        closeMenuAction() {\n            this.closeMenuAction();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"okLIL4zw\",\"block\":\"[[[10,0],[14,0,\\\"menu-row menu-header\\\"],[14,\\\"data-testid\\\",\\\"open-menu-header\\\"],[12],[1,\\\"\\\\n    \\\"],[10,1],[14,0,\\\"menu-row-text-label\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-truncate\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,0],[[33,1]],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,\\\"button\\\"],[14,0,\\\"menu-close\\\"],[14,\\\"data-testid\\\",\\\"open-header-close-button\\\"],[15,\\\"aria-label\\\",[29,[[28,[37,0],[\\\"userSettings.menus.close.menuName\\\"],[[\\\"menuName\\\"],[[28,[37,0],[[33,1]],null]]]]]]],[15,\\\"onclick\\\",[28,[37,2],[[30,0],[33,3]],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/circle-xmark-regular\\\"],[15,\\\"screenreader-text\\\",[29,[[28,[37,0],[\\\"userSettings.menus.close.menuName\\\"],[[\\\"menuName\\\"],[[28,[37,0],[[33,1]],null]]]]]]],[12],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"t\\\",\\\"title\\\",\\\"action\\\",\\\"closeMenuAction\\\"]]\",\"moduleName\":\"web-directory/components/command-user-settings/menu-options/open-menu-header/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { warnClosureAction } from 'web-directory/utils/acd';\n\nexport default Component.extend({\n    classNames: ['user-open-menu-sub-header'],\n\n    /**\n     * @attribute\n     * Menu's display title (translation string)\n     * from parent component\n     */\n    title: '',\n\n    // ==================================================================\n    // Actions\n    // ==================================================================\n    /**\n     * @action\n     * Closes sub menu and returns to menu item option menu\n     * Closure action passed from parent\n     */\n    closeSubMenuAction: () => {\n        warnClosureAction('closeSubMenu', null);\n    },\n\n    /**\n     * @action\n     * Closes sub menu and returns to home menu (all the way up)\n     * Closure action passed from parent\n     */\n    closeMenuAction: () => {\n        warnClosureAction('closeMenuAction', null);\n    },\n\n    actions: {\n        closeSubMenuAction() {\n            this.closeSubMenuAction();\n        },\n\n        closeMenuAction() {\n            this.closeMenuAction();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"sEcP8nKj\",\"block\":\"[[[10,0],[14,0,\\\"menu-row menu-header\\\"],[14,\\\"data-testid\\\",\\\"sub-header\\\"],[12],[1,\\\"\\\\n    \\\"],[10,1],[14,0,\\\"menu-row-text-label sub-menu-label\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"button\\\"],[14,0,\\\"sub-menu-back\\\"],[15,\\\"onclick\\\",[28,[37,0],[[30,0],[33,1]],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"menu-row-icon\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/chevrons-left-regular\\\"],[15,\\\"screenreader-text\\\",[29,[[28,[37,2],[\\\"common.back\\\"],null]]]],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"gux-truncate\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,2],[[33,3]],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,\\\"button\\\"],[14,0,\\\"menu-close\\\"],[14,\\\"data-testid\\\",\\\"sub-header-close\\\"],[15,\\\"aria-label\\\",[29,[[28,[37,2],[\\\"userSettings.menus.close.menu\\\"],null]]]],[15,\\\"onclick\\\",[28,[37,0],[[30,0],[33,4]],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/circle-xmark-regular\\\"],[15,\\\"screenreader-text\\\",[29,[[28,[37,2],[\\\"userSettings.menus.close.menu\\\"],null]]]],[12],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"action\\\",\\\"closeSubMenuAction\\\",\\\"t\\\",\\\"title\\\",\\\"closeMenuAction\\\"]]\",\"moduleName\":\"web-directory/components/command-user-settings/menu-options/open-menu-sub-header/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { inject } from '@ember/service';\nimport { warnClosureAction } from 'web-directory/utils/acd';\nimport { OutOfOffice } from 'web-directory/utils/out-of-office-types';\ntype ClearStatus = 'custom' | 'never';\n\n// takes 01 or 1 and returns 01\nfunction padZero(num: number): string {\n    return num.toString().padStart(2, '0');\n}\n\n// takes HH:mm returns just HH\nfunction splitHours(string: string): number {\n    return parseInt(string.substring(0, 2), 10);\n}\n\n// takes HH:mm returns just mm\nfunction splitMinutes(string: string): number {\n    return parseInt(string.substring(3, 5), 10);\n}\n\nconst EndOfTime = '9999-12-31T00:00:00.000Z';\n\nexport default Component.extend({\n    classNames: ['out-of-office-menu', 'menu-container'],\n\n    clock: inject('clock'),\n\n    /**\n     * @attribute\n     * Indicator for if user had out of office configuration open\n     */\n    showOutOfOffice: false,\n\n    /**\n     * @attribute\n     * Clear status gux drop down value\n     * never indicates no end date/time for out of office\n     * custom indicates user must fill out end date/time for out of office\n     */\n    clearStatusValue: 'never' as ClearStatus,\n\n    /**\n     * @attribute\n     * Indicator for if user has selected they want an end date\n     */\n    showCustomEndDate: false,\n\n    /**\n     * @attribute\n     * Iso string of user's out of office start date\n     * used directly with gux element\n     */\n    startDate: null as null | string,\n\n    /**\n     * @attribute\n     * HH:mm formatted string of user's out of office start time\n     */\n    startTime: null as null | string, // format HH:mm\n\n    /**\n     * @attribute\n     * Iso string of user's out of office end date\n     * used directly with gux element\n     */\n    endDate: null as null | string,\n\n    /**\n     * @attribute\n     * HH:mm formatted string of user's out of office end time\n     */\n    endTime: null as null | string, // format HH:mm\n\n    /**\n     * @attribute\n     * Users out of office obj from session.person.id activities.outOfOffice\n     */\n    outOfOffice: null as OutOfOffice | null,\n\n    /**\n     * @attribute\n     * Flag for if user has an out of office scheduled for the future (inactive with a startDate)\n     */\n    scheduledOutOfOffice: false,\n\n    /**\n     * @computed\n     * Flag for save to be disabled if there is a form error\n     */\n    disableSave: computed.or('endBeforeCurrentError', 'endBeforeStartError'),\n\n    /**\n     * @computed\n     * A combination of the start date and start time in iso string format\n     */\n    startDateTime: computed('startDate', 'startTime', function (): string | null {\n        const startDate = this.get('startDate'); // iso string\n        const startTime = this.get('startTime'); // format HH:mm\n        if (!startDate) return null;\n        let startDateTimeJS = new Date(startDate);\n        if (startTime) {\n            startDateTimeJS.setHours(splitHours(startTime));\n            startDateTimeJS.setMinutes(splitMinutes(startTime));\n        }\n        return startDateTimeJS.toISOString();\n    }),\n\n    /**\n     * @computed\n     * A combination of the end date and end time in iso string format\n     */\n    endDateTime: computed('endDate', 'endTime', 'showCustomEndDate', function (): string | null {\n        if (this.get('showCustomEndDate')) {\n            const endDate = this.get('endDate'); // iso string\n            const endTime = this.get('endTime'); // format HH:mm\n            if (!endDate) return null;\n            let endDateTimeJS = new Date(endDate);\n            if (endTime) {\n                endDateTimeJS.setHours(splitHours(endTime));\n                endDateTimeJS.setMinutes(splitMinutes(endTime));\n            }\n            return endDateTimeJS.toISOString();\n        } else {\n            return EndOfTime;\n        }\n    }),\n\n    /**\n     * @computed\n     * Flag for if the user's selected end date is before the selected start date, impossible duration\n     */\n    endBeforeStartError: computed('startDateTime', 'endDateTime', 'showCustomEndDate', function (): boolean {\n        if (!this.get('showCustomEndDate')) {\n            return false;\n        }\n        const start = this.get('startDateTime');\n        const end = this.get('endDateTime');\n        if (!start || !end) {\n            return true;\n        }\n        return new Date(start) > new Date(end);\n    }),\n\n    /**\n     * @computed\n     * Flag for if the user's selected end date is before now, impossible duration\n     */\n    endBeforeCurrentError: computed('endDateTime', 'showCustomEndDate', 'clock.minute', function (): boolean {\n        // Consume clock.minute to establish Glimmer autotracking (Ember 3.28 compatibility)\n        this.get('clock.minute');\n        if (!this.get('showCustomEndDate')) {\n            return false;\n        }\n\n        const end = this.get('endDateTime');\n        if (end) {\n            return new Date() > new Date(end);\n        } else {\n            return false;\n        }\n    }),\n\n    // ==================================================================\n    // Lifecycle\n    // ==================================================================\n    /**\n     * @lifecycle\n     * Sets default clear status and initializes out of office state on render\n     */\n    didInsertElement(): void {\n        this._super(...arguments);\n        // set after load for slow gux element\n        this.set('clearStatusValue', 'never'); // preset Status, for no out of office case\n        this.setUpOutOfOffice(); // set element if status is already out of office\n    },\n\n    // ==================================================================\n    // Functions\n    // ==================================================================\n\n    /**\n     * @function\n     * Initialization of information\n     * If their user already out of office, initialize with that information\n     * otherwise set some defaults\n     */\n    setUpOutOfOffice(): void {\n        const outOfOffice = this.get('outOfOffice');\n        if (!outOfOffice || (!outOfOffice.active && !this.get('scheduledOutOfOffice'))) {\n            // pre-set start date and time to now like the gux element does\n            const startDate = new Date().toISOString();\n            this.setProperties({\n                startDate: startDate,\n                startTime: this.formatTime(startDate)\n            });\n            return;\n        }\n\n        this.setProperties({\n            showOutOfOffice: outOfOffice.active || !!this.get('scheduledOutOfOffice'),\n            startDate: outOfOffice.startDate ?? null,\n            startTime: outOfOffice.startDate ? this.formatTime(outOfOffice.startDate) : null\n        });\n\n        if (outOfOffice.indefinite) {\n            this.setProperties({\n                endDate: EndOfTime,\n                endTime: this.formatTime(EndOfTime),\n                clearStatusValue: 'never' // setting gux element - hiding end date and time\n            });\n        } else {\n            this.setProperties({\n                endDate: outOfOffice.endDate ?? null,\n                endTime: outOfOffice.endDate ? this.formatTime(outOfOffice.endDate) : null,\n                clearStatusValue: 'custom', // setting the gux element - opening the end date and time\n                showCustomEndDate: true\n            });\n        }\n    },\n\n    /**\n     * @function\n     * Formatter from Iso string to HH:mm formatted time\n     */\n    formatTime(dateISO: string): string {\n        // HH:mm\n        const dateJS = new Date(dateISO);\n        const hours = padZero(dateJS.getHours());\n        const minutes = padZero(dateJS.getMinutes());\n        return `${hours}:${minutes}`; // HH:mm\n    },\n\n    // ==================================================================\n    // Actions\n    // ==================================================================\n\n    /**\n     * @action\n     * Sends out of office setting information\n     * Closure action passed from command-user-settings\n     */\n    actionSendOutOfOffice: (\n        startDate: string | null,\n        endDate: string | null,\n        isIndefinite: boolean,\n        newOutOfOffice = false\n    ) => {\n        warnClosureAction('actionSendOutOfOffice', { startDate, endDate, isIndefinite, newOutOfOffice });\n    },\n\n    /**\n     * @action\n     * Closes sub menu and returns to home menu (all the way up)\n     * Closure action passed from parent\n     */\n    closeMenuAction: () => {\n        warnClosureAction('closeMenuAction', null);\n    },\n\n    /**\n     * @function\n     * Parses a YYYY-MM-DD date string from gux date picker into a local Date\n     */\n    parseGuxDate(dateDetail: string): Date {\n        const [year, month, day] = dateDetail.split('-').map(Number);\n        return new Date(year, month - 1, day); // month is 0-indexed\n    },\n\n    actions: {\n        /**\n         * @action\n         * Toggles flag for is the user should see out of office configuration\n         * when toggling off and out of office should be set to inactive\n         */\n        toggleOutOfOffice(event?: Event): void {\n            if (event instanceof KeyboardEvent && event.type === 'keydown' && event.key !== ' ') {\n                return;\n            }\n            this.set('showOutOfOffice', !this.get('showOutOfOffice'));\n            if (!this.get('showOutOfOffice')) {\n                this.actionSendOutOfOffice(null, null, false, false); // no longer out of office\n            }\n        },\n\n        /**\n         * @action\n         * Handles gux date pickers changes\n         * Date picker gives in YYYY-MM-DD format\n         */\n        selectStartDate(date: any): void {\n            this.set('startDate', this.parseGuxDate(date.detail).toISOString());\n        },\n\n        /**\n         * @action\n         * Handles gux date pickers changes\n         * Date picker gives in YYYY-MM-DD format\n         */\n        selectEndDate(date: any): void {\n            this.set('endDate', this.parseGuxDate(date.detail).toISOString());\n        },\n\n        /**\n         * @action\n         * Handles gux time pickers changes\n         * Time picker gives in HH:mm format\n         */\n        selectStartTime(event: any): void {\n            const isValidValue = !!event && !!event.target && !!event.target.value;\n            if (!isValidValue) return;\n            this.set('startTime', event?.target?.value); // Gux element returns HH:mm already\n        },\n\n        /**\n         * @action\n         * Handles gux time pickers changes\n         * Time picker gives in HH:mm format\n         */\n        selectEndTime(event: any): void {\n            const isValidValue = !!event && !!event.target && !!event.target.value;\n            if (!isValidValue) return;\n            this.set('endTime', event?.target?.value); // Gux element returns HH:mm already\n        },\n\n        /**\n         * @action\n         * Handles gux drop down for out of office clear status\n         * custom mean end dates should be show\n         * when toggling custom for the first time initialization might be needed\n         * never mean end dates should be hidden\n         */\n        changeClearStatus(event: InputEvent): void {\n            if (event && event.target) {\n                const target = event.target as HTMLInputElement;\n                const value = target?.value?.toLowerCase() as ClearStatus;\n                if (value === 'custom') {\n                    this.set('showCustomEndDate', true);\n                    if (!this.get('endDate') || this.get('endDate') === EndOfTime) {\n                        // end time had not been initialized yet, set to now + 1 day\n                        let endDate = new Date();\n                        endDate.setDate(endDate.getDate() + 1);\n                        const endDateString = endDate.toISOString();\n                        this.setProperties({\n                            endDate: endDateString,\n                            endTime: this.formatTime(endDateString)\n                        });\n                    }\n                } else if (value === 'never') this.set('showCustomEndDate', false);\n            }\n        },\n\n        /**\n         * @action\n         * Handles out of office form save\n         */\n        actionSendOutOfOffice(): void {\n            const startDateTime = this.get('startDateTime'); // iso string\n            const endDateTime = this.get('endDateTime'); // iso string\n            const isIndefinite = !this.get('showCustomEndDate');\n            if (!startDateTime) return;\n            if (isIndefinite) {\n                this.actionSendOutOfOffice(startDateTime, EndOfTime, true, false);\n                this.closeMenuAction();\n            } else {\n                this.actionSendOutOfOffice(startDateTime, endDateTime, false, false);\n                this.closeMenuAction();\n            }\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"x78cVSJ1\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[1,[28,[35,2],null,[[\\\"title\\\",\\\"closeMenuAction\\\"],[[33,1],[33,3]]]]],[1,\\\"\\\\n\\\"]],[]],null],[10,0],[14,0,\\\"settings-scroll-with-header\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"menu-row\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"user-settings-ooo-toggle\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-truncate\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,4],[\\\"userSettings.menus.outOfOffice.statusLabel\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"gux-toggle\\\"],[14,1,\\\"user-settings-ooo-toggle\\\"],[15,\\\"onkeydown\\\",[28,[37,5],[[30,0],\\\"toggleOutOfOffice\\\"],null]],[15,\\\"onclick\\\",[28,[37,5],[[30,0],\\\"toggleOutOfOffice\\\"],null]],[15,\\\"checked\\\",[36,6]],[15,\\\"aria-label\\\",[29,[[28,[37,4],[\\\"userSettings.menus.outOfOffice.statusLabel\\\"],null]]]],[12],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[15,0,[29,[\\\"ooo-form-content \\\",[52,[51,[33,6]],\\\"hide\\\"]]]],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"menu-row\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"date-picker\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-datepicker\\\"],[14,\\\"label-position\\\",\\\"above\\\"],[15,\\\"label\\\",[29,[[28,[37,4],[\\\"userSettings.menus.outOfOffice.startDate\\\"],null]]]],[14,0,\\\"ooo-start-date\\\"],[15,2,[36,8]],[15,\\\"onInput\\\",[28,[37,5],[[30,0],\\\"selectStartDate\\\"],null]],[14,\\\"data-testid\\\",\\\"ooo-start-date\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,0],[14,0,\\\"time-picker\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"form\\\"],[15,\\\"onchange\\\",[28,[37,5],[[30,0],\\\"selectStartTime\\\"],null]],[15,\\\"oninput\\\",[28,[37,5],[[30,0],\\\"selectStartTime\\\"],null]],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-form-field-time-picker\\\"],[14,\\\"label-position\\\",\\\"above\\\"],[14,\\\"data-testid\\\",\\\"ooo-start-time\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,4],[\\\"userSettings.menus.outOfOffice.startTime\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-time-picker\\\"],[15,2,[36,9]],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[14,0,\\\"menu-row\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-form-field-dropdown\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"label\\\"],[14,0,\\\"gux-label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,4],[\\\"userSettings.menus.outOfOffice.clearStatus\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-dropdown\\\"],[15,2,[36,10]],[15,\\\"onchange\\\",[28,[37,5],[[30,0],\\\"changeClearStatus\\\"],null]],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-listbox\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-option\\\"],[14,2,\\\"never\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,4],[\\\"userSettings.menus.outOfOffice.never\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-option\\\"],[14,2,\\\"custom\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,4],[\\\"userSettings.menus.outOfOffice.custom\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[15,0,[29,[\\\"menu-row \\\",[52,[33,11],\\\"\\\",\\\"hide\\\"]]]],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"date-picker\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-datepicker\\\"],[14,\\\"label-position\\\",\\\"above\\\"],[15,\\\"label\\\",[29,[[28,[37,4],[\\\"userSettings.menus.outOfOffice.endDate\\\"],null]]]],[14,0,\\\"ooo-end-date\\\"],[15,2,[36,12]],[15,\\\"onInput\\\",[28,[37,5],[[30,0],\\\"selectEndDate\\\"],null]],[14,\\\"data-testid\\\",\\\"ooo-end-date\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,0],[14,0,\\\"time-picker\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"form\\\"],[15,\\\"onchange\\\",[28,[37,5],[[30,0],\\\"selectEndTime\\\"],null]],[15,\\\"oninput\\\",[28,[37,5],[[30,0],\\\"selectEndTime\\\"],null]],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-form-field-time-picker\\\"],[14,\\\"label-position\\\",\\\"above\\\"],[14,\\\"data-testid\\\",\\\"ooo-end-time\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,4],[\\\"userSettings.menus.outOfOffice.endTime\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-time-picker\\\"],[15,2,[36,13]],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,14],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"menu-row-item-error\\\"],[14,\\\"role\\\",\\\"alert\\\"],[14,\\\"aria-live\\\",\\\"assertive\\\"],[14,\\\"aria-atomic\\\",\\\"true\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[1,[28,[35,4],[\\\"userSettings.menus.outOfOffice.endBeforeStartError\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,15],[[33,16],[28,[37,17],[[33,14]],null]],null],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"menu-row-item-error\\\"],[14,\\\"role\\\",\\\"alert\\\"],[14,\\\"aria-live\\\",\\\"assertive\\\"],[14,\\\"aria-atomic\\\",\\\"true\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[1,[28,[35,4],[\\\"userSettings.menus.outOfOffice.endBeforeCurrentError\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"menu-row\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-button\\\"],[14,\\\"accent\\\",\\\"tertiary\\\"],[14,\\\"data-testid\\\",\\\"ooo-save-button\\\"],[15,\\\"disabled\\\",[36,18]],[15,\\\"onclick\\\",[28,[37,5],[[30,0],\\\"actionSendOutOfOffice\\\"],null]],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,4],[\\\"common.save\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"if\\\",\\\"title\\\",\\\"command-user-settings/menu-options/open-menu-header\\\",\\\"closeMenuAction\\\",\\\"t\\\",\\\"action\\\",\\\"showOutOfOffice\\\",\\\"unless\\\",\\\"startDate\\\",\\\"startTime\\\",\\\"clearStatusValue\\\",\\\"showCustomEndDate\\\",\\\"endDate\\\",\\\"endTime\\\",\\\"endBeforeStartError\\\",\\\"and\\\",\\\"endBeforeCurrentError\\\",\\\"not\\\",\\\"disableSave\\\"]]\",\"moduleName\":\"web-directory/components/command-user-settings/menu-options/out-of-office-menu/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { run } from '@ember/runloop';\nimport { DisplayPresence, PresenceType } from 'web-directory/utils/presence-utils';\n\nexport default Component.extend({\n    classNames: ['presence-selector-menu', 'menu-container'],\n    /**\n     * @attribute\n     * User's current presence formatted for display\n     * (processed in command-user-settings)\n     */\n    currentPresenceDisplay: null as DisplayPresence | null,\n\n    /**\n     * @attribute\n     * All the presence available to the current user\n     * (processed in command-user-settings)\n     */\n    presenceChoices: null as Array<PresenceType> | null,\n\n    /**\n     * @attribute\n     * All the sub presence available for the selected presence.\n     * Initialized to [] in init() to avoid shared state across instances.\n     */\n    subMenuChoices: [] as unknown as Array<PresenceType>,\n\n    init() {\n        this._super(...arguments);\n        this.set('subMenuChoices', []);\n    },\n\n    /**\n     * @attribute\n     * Flag to show out of office form\n     */\n    showOutOfOffice: false,\n\n    /**\n     * @attribute\n     * Presence title for the selected submenu - for display submenu header\n     */\n    subTitle: '',\n\n    // ==================================================================\n    // Lifecycle\n    // ==================================================================\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.set('subMenuChoices', []);\n        this.set('showOutOfOffice', false);\n        this.set('subTitle', '');\n    },\n\n    // ==================================================================\n    // Functions\n    // ==================================================================\n\n    /**\n     * @function\n     * Moves focus to the first (or checked) radio in the sub-menu after render.\n     * Uses run.scheduleOnce('afterRender') to wait for child components to fully insert their inputs.\n     */\n    _focusSubMenuRadio() {\n        run.scheduleOnce('afterRender', this, function () {\n            if (this.isDestroying || this.isDestroyed) return;\n            requestAnimationFrame(() => {\n                const checked = this.element?.querySelector('input[type=\"radio\"]:checked') as HTMLElement;\n                const first = this.element?.querySelector('input[type=\"radio\"]') as HTMLElement;\n                const target = checked || first;\n                if (target) {\n                    // this is to fix odd behavor of the check and first being the same causing not to focus\n                    target.blur();\n                    target.focus();\n                }\n            });\n        });\n    },\n\n    // ==================================================================\n    // Actions\n    // ==================================================================\n\n    actions: {\n        /**\n         * @action\n         * Sets relevant information for secondary presences sub menu display\n         */\n        openSubmenu(presence: PresenceType) {\n            this.set('subTitle', presence.label);\n            if (presence.key === 'out_of_office') {\n                this.set('showOutOfOffice', true);\n            } else {\n                this.set('subMenuChoices', presence.secondaryPresences as Array<PresenceType>);\n            }\n            this._focusSubMenuRadio();\n        },\n\n        /**\n         * @action\n         * Handles close action for sub menus\n         */\n        closeSubMenu() {\n            this.set('subMenuChoices', []);\n            this.set('showOutOfOffice', false);\n            this._focusSubMenuRadio();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"bhzlb63d\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[1,[28,[35,2],null,[[\\\"title\\\",\\\"closeSubMenuAction\\\",\\\"closeMenuAction\\\"],[[33,3],[28,[37,4],[[30,0],\\\"closeSubMenu\\\"],null],[33,5]]]]],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"settings-scroll-with-header\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"form\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-form-field-radio-group-beta\\\"],[15,\\\"aria-label\\\",[29,[[28,[37,6],[\\\"userSettings.menus.selectStatus.selectYourSubStatusFor\\\"],[[\\\"parentStatus\\\"],[[28,[37,6],[[33,7]],null]]]]]]],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,9],[[28,[37,9],[[33,1]],null]],null],null,[[[1,\\\"                    \\\"],[1,[28,[35,10],null,[[\\\"name\\\",\\\"presenceOption\\\",\\\"currentPresenceDisplay\\\",\\\"actionChangePresence\\\"],[\\\"sub-presence-selector\\\",[30,1],[33,11],[33,12]]]]],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,13],[[[1,\\\"    \\\"],[1,[28,[35,2],null,[[\\\"title\\\",\\\"closeSubMenuAction\\\",\\\"closeMenuAction\\\"],[[33,3],[28,[37,4],[[30,0],\\\"closeSubMenu\\\"],null],[33,5]]]]],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"settings-scroll-with-header\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,14],null,[[\\\"outOfOffice\\\",\\\"scheduledOutOfOffice\\\",\\\"actionSendOutOfOffice\\\",\\\"closeMenuAction\\\"],[[33,15],[33,16],[33,17],[33,5]]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"    \\\"],[1,[28,[35,18],null,[[\\\"title\\\",\\\"closeMenuAction\\\"],[[33,7],[33,5]]]]],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"settings-scroll-with-header\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"form\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-form-field-radio-group-beta\\\"],[15,\\\"aria-label\\\",[29,[[28,[37,6],[\\\"userSettings.menus.selectStatus.selectYourStatus\\\"],null]]]],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,9],[[28,[37,9],[[33,19]],null]],null],null,[[[1,\\\"                    \\\"],[1,[28,[35,10],null,[[\\\"name\\\",\\\"presenceOption\\\",\\\"currentPresenceDisplay\\\",\\\"actionChangePresence\\\",\\\"actionOpenSubmenu\\\",\\\"outOfOffice\\\",\\\"scheduledOutOfOffice\\\"],[\\\"presence-selector\\\",[30,2],[33,11],[33,12],[28,[37,4],[[30,0],\\\"openSubmenu\\\"],null],[33,15],[33,16]]]]],[1,\\\"\\\\n\\\"]],[2]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[]]]],[\\\"presenceOption\\\",\\\"presenceOption\\\"],false,[\\\"if\\\",\\\"subMenuChoices\\\",\\\"command-user-settings/menu-options/open-menu-sub-header\\\",\\\"subTitle\\\",\\\"action\\\",\\\"closeMenuAction\\\",\\\"t\\\",\\\"title\\\",\\\"each\\\",\\\"-track-array\\\",\\\"command-user-settings/menu-options/presence-selector-menu/user-presence-input\\\",\\\"currentPresenceDisplay\\\",\\\"actionChangePresence\\\",\\\"showOutOfOffice\\\",\\\"command-user-settings/menu-options/out-of-office-menu\\\",\\\"outOfOffice\\\",\\\"scheduledOutOfOffice\\\",\\\"actionSendOutOfOffice\\\",\\\"command-user-settings/menu-options/open-menu-header\\\",\\\"presenceChoices\\\"]]\",\"moduleName\":\"web-directory/components/command-user-settings/menu-options/presence-selector-menu/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { DisplayPresence, PresenceType } from 'web-directory/utils/presence-utils';\nimport { warnClosureAction } from 'web-directory/utils/acd';\nimport { OutOfOffice } from 'web-directory/utils/out-of-office-types';\n\nexport default Component.extend({\n    classNames: ['user-presence-input'],\n\n    /**\n     * @attribute\n     * The presence option we are displaying in this component\n     * (passed from menu presence selector)\n     */\n    presenceOption: null as PresenceType | null,\n\n    /**\n     * @attribute\n     * User's current presence formatted for display\n     * (processed in command-user-settings)\n     */\n    currentPresenceDisplay: null as DisplayPresence | null,\n\n    name: null as 'presence-selector' | 'sub-presence-selector' | null,\n\n    _presenceKeydownHandler: null as null | ((event: Event) => void),\n    _presenceClickHandler: null as null | ((event: Event) => void),\n    _mousedownHandler: null as null | (() => void),\n\n    /**\n     * @attribute\n     * Tracks whether a mousedown recently occurred, used to distinguish\n     * real mouse clicks from arrow-key-triggered synthetic clicks on radios\n     */\n    _mouseIsDown: false,\n\n    // ==================================================================\n    // Computed\n    // ==================================================================\n\n    /**\n     * @computed\n     * flag for if the presence has a submenu (display purposes)\n     */\n    hasSubMenu: computed('presenceOption.secondaryPresences', function () {\n        return !!this.get('presenceOption.secondaryPresences');\n    }),\n\n    /**\n     * @computed\n     * flag for if the out-of-office special case\n     */\n    isOutOfOffice: computed('presenceOption.key', function () {\n        return this.get('presenceOption.key') === 'out_of_office';\n    }),\n\n    /**\n     * @attribute\n     * Users out of office obj from session.person.id activities.outOfOffice\n     */\n    outOfOffice: null as OutOfOffice | null,\n\n    /**\n     * @attribute\n     * Flag for if user has an out of office scheduled for the future\n     */\n    scheduledOutOfOffice: false,\n\n    /**\n     * @attribute\n     * Flag for if scheduled ooo should be shown\n     */\n    showOOOScheduled: computed('scheduledOutOfOffice', 'isOutOfOffice', function () {\n        if (!this.get('isOutOfOffice')) return false;\n        return !!this.get('scheduledOutOfOffice');\n    }),\n\n    /**\n     * @attribute\n     * Out of office schedule start time\n     */\n    startTime: computed('outOfOffice', 'scheduledOutOfOffice', function () {\n        if (this.get('outOfOffice') && this.get('scheduledOutOfOffice')) {\n            return this.get('outOfOffice').startDate;\n        }\n        return '';\n    }),\n\n    isRequestingOffQueue: computed.and(\n        'currentPresenceDisplay.requestedPresenceId',\n        'currentPresenceDisplay.requestedPrimaryKey'\n    ),\n\n    /**\n     * @computed\n     * checked value of the presence check box\n     */\n    checked: computed('presenceOption', 'currentPresenceDisplay', 'isRequestingOffQueue', function () {\n        const isSubPresence = this.get('name') === 'sub-presence-selector';\n        const { requestedPresenceId, requestedPrimaryKey } = this.get('currentPresenceDisplay');\n        // user is requesting this status meaning they're currently on queue\n        if (requestedPresenceId && requestedPrimaryKey) {\n            if (isSubPresence) {\n                return this.get('presenceOption.id') === requestedPresenceId;\n            }\n            return this.get('presenceOption.key')?.toLowerCase() === requestedPrimaryKey?.toLowerCase();\n        }\n\n        const isExactMatch = this.get('presenceOption.id') === this.get('currentPresenceDisplay.id');\n\n        if (isSubPresence) return isExactMatch;\n\n        const isParentOfActive =\n            this.get('presenceOption.key')?.toLowerCase() ===\n            this.get('currentPresenceDisplay.primaryKey')?.toLowerCase();\n\n        return isExactMatch || isParentOfActive;\n    }),\n\n    // ==================================================================\n    // Lifecycle\n    // ==================================================================\n\n    /* @lifecycle */\n    didInsertElement() {\n        this._super(...arguments);\n        let radioButton = this.element.querySelector('input');\n        if (radioButton) {\n            const keydownHandler = (event: Event) => {\n                if (event instanceof KeyboardEvent && event.key === ' ') {\n                    // Space only - radio button standard\n                    this.presenceRadioSelection();\n                }\n            };\n\n            // Track mousedown on the whole component so we know when a click is mouse-initiated.\n            // Complicated because the difference between radio button and sub menu select\n            const mousedownHandler = () => {\n                this.set('_mouseIsDown', true);\n            };\n\n            const clickHandler = () => {\n                if (this.get('_mouseIsDown')) {\n                    this.set('_mouseIsDown', false);\n                    this.presenceRadioSelection();\n                }\n            };\n\n            this.set('_presenceKeydownHandler', keydownHandler);\n            this.set('_presenceClickHandler', clickHandler);\n            this.set('_mousedownHandler', mousedownHandler);\n\n            radioButton.addEventListener('keydown', keydownHandler);\n            radioButton.addEventListener('click', clickHandler);\n            this.element.addEventListener('mousedown', mousedownHandler);\n        }\n    },\n\n    /* @lifecycle */\n    willDestroyElement() {\n        this._super(...arguments);\n        let radioButton = this.element.querySelector('input');\n        const keydownHandler = this.get('_presenceKeydownHandler');\n        const clickHandler = this.get('_presenceClickHandler');\n        const mousedownHandler = this.get('_mousedownHandler');\n        if (radioButton) {\n            if (keydownHandler) {\n                radioButton.removeEventListener('keydown', keydownHandler);\n            }\n            if (clickHandler) {\n                radioButton.removeEventListener('click', clickHandler);\n            }\n        }\n        if (mousedownHandler) {\n            this.element?.removeEventListener('mousedown', mousedownHandler);\n        }\n        this.set('_presenceKeydownHandler', null);\n        this.set('_presenceClickHandler', null);\n        this.set('_mousedownHandler', null);\n    },\n\n    // ==================================================================\n    // Functions\n    // ==================================================================\n\n    /**\n     * @function\n     * Handles radio button selection\n     * Either selects the presences and sends action to change user presence\n     * or opens sub menu for further selection\n     */\n    presenceRadioSelection() {\n        let selectedPresenceOption = this.get('presenceOption') as PresenceType;\n        if (!selectedPresenceOption) return;\n        if (this.get('hasSubMenu') || this.get('isOutOfOffice')) {\n            this.actionOpenSubmenu(selectedPresenceOption);\n        } else {\n            this.actionChangePresence(selectedPresenceOption);\n        }\n    },\n\n    // ==================================================================\n    // Actions\n    // ==================================================================\n\n    /**\n     * @action\n     * Sets User Presence\n     * Closure action passed from command-user-settings\n     */\n    actionChangePresence: (presence: PresenceType) => {\n        warnClosureAction('actionChangePresence', presence);\n    },\n\n    /**\n     * @action\n     * Opens sub presence menu\n     * Closure action passed from presence-selector-menu\n     */\n    actionOpenSubmenu: (presence: PresenceType) => {\n        warnClosureAction('actionOpenSubmenu', presence);\n    },\n\n    actions: {\n        actionOpenSubmenu(presence: PresenceType) {\n            this.actionOpenSubmenu(presence);\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"lxeJWShE\",\"block\":\"[[[10,\\\"gux-form-field-radio\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"input\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,1,[29,[[36,0],\\\"-presence-radio\\\"]]],[15,0,[29,[\\\"presence-input \\\",[52,[33,2],\\\"active\\\"]]]],[15,3,[36,3]],[15,2,[33,4,[\\\"label\\\"]]],[15,\\\"checked\\\",[36,2]],[14,4,\\\"radio\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[15,\\\"for\\\",[29,[[36,0],\\\"-presence-radio\\\"]]],[12],[1,\\\"\\\\n        \\\"],[10,1],[14,0,\\\"menu-row-text-label\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"            \\\"],[10,\\\"gux-truncate\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,5],[[33,4,[\\\"label\\\"]]],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,6],[[[1,\\\"                \\\"],[10,\\\"gux-truncate\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,1],[14,0,\\\"menu-row-text-sub-label\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,1],[14,0,\\\"out-of-office-scheduled-text\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,5],[\\\"userSettings.menus.outOfOffice.scheduledFor\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-date-time-beta\\\"],[15,\\\"datetime\\\",[29,[[36,7]]]],[14,\\\"format\\\",\\\"short\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,8],[[33,9],[33,10]],null],[[[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"chevron-right\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"elementId\\\",\\\"if\\\",\\\"checked\\\",\\\"name\\\",\\\"presenceOption\\\",\\\"t\\\",\\\"showOOOScheduled\\\",\\\"startTime\\\",\\\"or\\\",\\\"hasSubMenu\\\",\\\"isOutOfOffice\\\"]]\",\"moduleName\":\"web-directory/components/command-user-settings/menu-options/presence-selector-menu/user-presence-input/template.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"HZdd75I9\",\"block\":\"[[[1,\\\"\\\\n\\\"],[41,[28,[37,1],[[33,2]],null],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"settings-scroll\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,3],[[[1,\\\"            \\\"],[1,[28,[35,4],null,[[\\\"userMenuAction\\\",\\\"currentPresenceDisplay\\\",\\\"presenceLastModified\\\"],[[28,[37,5],[[30,0],\\\"userMenuAction\\\",\\\"togglePresenceMenu\\\"],null],[33,6],[33,7]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[42,[28,[37,9],[[28,[37,9],[[33,10]],null]],null],null,[[[41,[30,1,[\\\"canSee\\\"]],[[[1,\\\"                \\\"],[1,[28,[35,11],null,[[\\\"optionId\\\",\\\"title\\\",\\\"titleAria\\\",\\\"nonTranslatedTitle\\\",\\\"subLabel\\\",\\\"iconName\\\",\\\"outOfOffice\\\",\\\"scheduledOutOfOffice\\\",\\\"userMenuAction\\\",\\\"hasSubMenu\\\"],[[30,1,[\\\"id\\\"]],[30,1,[\\\"title\\\"]],[30,1,[\\\"titleAria\\\"]],[30,1,[\\\"nonTranslatedTitle\\\"]],[30,1,[\\\"subLabel\\\"]],[30,1,[\\\"iconName\\\"]],[33,12],[33,13],[28,[37,5],[[30,0],\\\"userMenuAction\\\",[30,1,[\\\"action\\\"]]],null],[30,1,[\\\"hasSubMenu\\\"]]]]]],[1,\\\"\\\\n\\\"]],[]],null]],[1]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[1,\\\"\\\\n\\\"],[41,[33,14],[[[1,\\\"    \\\"],[1,[28,[35,15],null,[[\\\"title\\\",\\\"closeMenuAction\\\",\\\"currentPresenceDisplay\\\",\\\"presenceChoices\\\",\\\"actionChangePresence\\\",\\\"outOfOffice\\\",\\\"scheduledOutOfOffice\\\",\\\"actionSendOutOfOffice\\\"],[\\\"userSettings.menus.selectStatus.title\\\",[28,[37,5],[[30,0],\\\"closeMenuAction\\\"],null],[33,6],[33,16],[28,[37,5],[[30,0],\\\"changePresenceWrapper\\\"],null],[33,12],[33,13],[33,17]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,18],[[[1,\\\"    \\\"],[1,[28,[35,19],null,[[\\\"title\\\",\\\"outOfOffice\\\",\\\"scheduledOutOfOffice\\\",\\\"closeMenuAction\\\",\\\"actionSendOutOfOffice\\\"],[\\\"userSettings.menus.outOfOffice.title\\\",[33,12],[33,13],[28,[37,5],[[30,0],\\\"closeMenuAction\\\"],null],[33,17]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,20],[[[1,\\\"    \\\"],[1,[28,[35,21],null,[[\\\"title\\\",\\\"closeMenuAction\\\",\\\"person\\\",\\\"lastLoginDateFormatted\\\",\\\"emergencyLocation\\\",\\\"geolocation\\\",\\\"isE911Enabled\\\",\\\"actionGoToProfileE911\\\"],[\\\"userSettings.menus.myDetails.title\\\",[28,[37,5],[[30,0],\\\"closeMenuAction\\\"],null],[33,22],[33,23],[33,24],[33,25],[33,26],[33,27]]]]],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"menuOption\\\"],false,[\\\"if\\\",\\\"not\\\",\\\"isOpenMenu\\\",\\\"isPresenceSelectorEnabled\\\",\\\"command-user-settings/menu-options/menu-option-presence\\\",\\\"action\\\",\\\"currentPresenceDisplay\\\",\\\"presenceLastModified\\\",\\\"each\\\",\\\"-track-array\\\",\\\"menuOptions\\\",\\\"command-user-settings/menu-options/menu-option\\\",\\\"outOfOffice\\\",\\\"scheduledOutOfOffice\\\",\\\"isOpenPresenceMenu\\\",\\\"command-user-settings/menu-options/presence-selector-menu\\\",\\\"presenceChoices\\\",\\\"actionSendOutOfOffice\\\",\\\"isOpenOutOfOfficeMenu\\\",\\\"command-user-settings/menu-options/out-of-office-menu\\\",\\\"isOpenMyDetailsMenu\\\",\\\"command-user-settings/menu-options/details-menu\\\",\\\"person\\\",\\\"lastLoginDateFormatted\\\",\\\"emergencyLocation\\\",\\\"geolocation\\\",\\\"isE911Enabled\\\",\\\"actionGoToProfileE911\\\"]]\",\"moduleName\":\"web-directory/components/command-user-settings/menu-options/template.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"rV6/PFlX\",\"block\":\"[[[1,[28,[35,0],null,[[\\\"presenceKey\\\",\\\"presenceAriaLabel\\\",\\\"personName\\\",\\\"avatarImageUrl\\\",\\\"userSettingsOpen\\\",\\\"actionToggleUserSettings\\\"],[[33,1,[\\\"primaryKey\\\"]],[33,2],[33,3],[33,4],[33,5],[28,[37,6],[[30,0],\\\"toggleUserSettings\\\"],null]]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[33,5],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"user-settings-popover\\\"],[14,\\\"role\\\",\\\"dialog\\\"],[15,\\\"aria-label\\\",[28,[37,8],[\\\"userSettings.userSettingsAria\\\"],null]],[14,\\\"data-testid\\\",\\\"user-settings-popover-container\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"section\\\"],[14,0,\\\"info-card\\\"],[15,\\\"aria-label\\\",[28,[37,8],[\\\"userSettings.headerAria\\\"],null]],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,9],null,[[\\\"presenceKey\\\",\\\"presenceAriaLabel\\\",\\\"personName\\\",\\\"avatarImageUrl\\\",\\\"orgName\\\",\\\"isStatusEnabled\\\",\\\"presenceLabelData\\\",\\\"intl\\\",\\\"status\\\",\\\"actionGoToProfile\\\",\\\"actionChangeStatus\\\"],[[33,1,[\\\"primaryKey\\\"]],[33,2],[33,3],[33,4],[33,10],[33,11],[33,12],[33,13],[33,14],[28,[37,6],[[30,0],\\\"goToProfile\\\"],null],[28,[37,6],[[30,0],\\\"changeStatus\\\"],null]]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"],[1,\\\"        \\\"],[10,\\\"section\\\"],[14,0,\\\"settings-container\\\"],[15,\\\"aria-label\\\",[28,[37,8],[\\\"userSettings.mainAria\\\"],null]],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,15],null,[[\\\"stationName\\\",\\\"currentPresenceDisplay\\\",\\\"presenceLastModified\\\",\\\"presenceChoices\\\",\\\"person\\\",\\\"outOfOffice\\\",\\\"scheduledOutOfOffice\\\",\\\"lastLoginDateFormatted\\\",\\\"emergencyLocationData\\\",\\\"emergencyLocation\\\",\\\"geolocation\\\",\\\"isCallsForwarded\\\",\\\"isPhoneEnabled\\\",\\\"isCallForwardingEnabled\\\",\\\"isActivateQueueEnabled\\\",\\\"isPresenceSelectorEnabled\\\",\\\"isMyFilesEnabled\\\",\\\"isSecurityEnabled\\\",\\\"isE911Enabled\\\",\\\"isMediaHelperMode\\\",\\\"clock\\\",\\\"actionGoToProfileE911\\\",\\\"actionGoToActivateQueues\\\",\\\"actionGoToFiles\\\",\\\"actionGoToStation\\\",\\\"actionGoToCallForwarding\\\",\\\"actionChangePresence\\\",\\\"actionSendOutOfOffice\\\",\\\"actionGoToSecurity\\\"],[[33,16],[33,1],[33,17],[33,18],[33,19],[33,20],[33,21],[33,22,[\\\"lastLoginDateFormatted\\\"]],[33,22,[\\\"features\\\",\\\"emergencyLocationData\\\"]],[33,23],[33,24],[33,25],[33,26],[33,27],[33,28],[33,29],[33,30],[33,31],[33,32],[33,33],[33,34],[28,[37,6],[[30,0],\\\"goToProfileE911\\\"],null],[28,[37,6],[[30,0],\\\"goToActivateQueues\\\"],null],[28,[37,6],[[30,0],\\\"goToFiles\\\"],null],[28,[37,6],[[30,0],\\\"goToStation\\\"],null],[28,[37,6],[[30,0],\\\"goToCallForwarding\\\"],null],[28,[37,6],[[30,0],\\\"changePresence\\\"],null],[28,[37,6],[[30,0],\\\"sendOutOfOffice\\\"],null],[28,[37,6],[[30,0],\\\"goToSecurity\\\"],null]]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"section\\\"],[14,0,\\\"user-settings-footer\\\"],[15,\\\"aria-label\\\",[28,[37,8],[\\\"userSettings.footerAria\\\"],null]],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-button-slot\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"button\\\"],[14,\\\"data-testid\\\",\\\"user-setting-preferences-button\\\"],[15,\\\"onclick\\\",[28,[37,6],[[30,0],\\\"openPreferences\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"settings\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[1,[28,[35,8],[\\\"userSettings.preferences\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"gux-button-slot\\\"],[14,\\\"accent\\\",\\\"primary\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"button\\\"],[14,\\\"data-testid\\\",\\\"user-setting-logout-button\\\"],[14,0,\\\"primary\\\"],[15,\\\"onclick\\\",[28,[37,6],[[30,0],\\\"logout\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"logout\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[1,[28,[35,8],[\\\"userSettings.logout\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[],false,[\\\"command-user-settings/user-settings-button\\\",\\\"currentPresenceDisplay\\\",\\\"presenceAriaLabel\\\",\\\"personName\\\",\\\"avatarImageUrl\\\",\\\"userSettingsOpen\\\",\\\"action\\\",\\\"if\\\",\\\"t\\\",\\\"command-user-settings/user-information\\\",\\\"orgName\\\",\\\"isStatusEnabled\\\",\\\"presenceLabelData\\\",\\\"intl\\\",\\\"status\\\",\\\"command-user-settings/menu-options\\\",\\\"stationName\\\",\\\"presenceLastModified\\\",\\\"presenceChoices\\\",\\\"person\\\",\\\"outOfOffice\\\",\\\"scheduledOutOfOffice\\\",\\\"session\\\",\\\"emergencyLocation\\\",\\\"geolocation\\\",\\\"isCallsForwarded\\\",\\\"isPhoneEnabled\\\",\\\"isCallForwardingEnabled\\\",\\\"isActivateQueueEnabled\\\",\\\"isPresenceSelectorEnabled\\\",\\\"isMyFilesEnabled\\\",\\\"isSecurityEnabled\\\",\\\"isE911Enabled\\\",\\\"isMediaHelperMode\\\",\\\"clock\\\"]]\",\"moduleName\":\"web-directory/components/command-user-settings/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { debounce } from '@ember/runloop';\nimport { warnClosureAction } from 'web-directory/utils/acd';\nimport { formatPresenceKeyForGux } from 'web-directory/utils/presence-utils';\nconst MAX_STATUS_LENGTH = 50;\nconst STATUS_DEBOUNCE_MS = 500;\n\nexport default Component.extend({\n    classNames: ['user-information'],\n\n    /**\n     * @attribute\n     * intl service\n     * from command-user-settings\n     */\n    intl: null,\n\n    /**\n     * @attribute\n     * User's current presence key\n     * from session.person.activityPresence\n     */\n    presenceKey: 'offline',\n\n    /**\n     * @attribute\n     * ('Username' + 'Current Presence')\n     * from session.person.presenceLabel\n     */\n    presenceAriaLabel: '',\n\n    /**\n     * @attribute\n     * User's name\n     * from session.person.name\n     */\n    personName: '',\n\n    /**\n     * @attribute\n     * User's profile image\n     * from session.person.profilePicture\n     * (processed in command-user-settings)\n     */\n    avatarImageUrl: '',\n\n    /**\n     * @attribute\n     * User's organization name\n     * from session.org or session. User (trustee)\n     */\n    orgName: '',\n\n    /**\n     * @attribute\n     * Presence label information for the external presenceLabel component\n     * from session.person.activityValues ++\n     * (processed in command-user-settings)\n     */\n    presenceLabelData: null,\n\n    /**\n     * @attribute\n     * The max length a user status is allowed to be\n     */\n    maxLength: MAX_STATUS_LENGTH,\n\n    /**\n     * @attribute\n     * User's initial status\n     */\n    status: null as string | null,\n\n    /**\n     * @attribute\n     * User's status locally edited to keep from back tracking on api update\n     */\n    localStatus: null as string | null,\n\n    /**\n     * @attribute\n     * Permissions for user status field processed in command-user-settings\n     */\n    isStatusEnabled: false,\n\n    /**\n     * @attribute\n     * Tracks whether the viewport is at the small breakpoint (max-height: 650px)\n     * Used to conditionally render only one avatar/heading variant at a time\n     */\n    isSmallViewport: false,\n\n    /**\n     * @attribute\n     * Stores the matchMedia query list for cleanup\n     */\n    _mediaQuery: null as MediaQueryList | null,\n\n    /**\n     * @attribute\n     * Bound handler for media query changes\n     */\n    _mediaHandler: null as ((e: MediaQueryListEvent) => void) | null,\n\n    noPresenceData: computed('presenceLabelData', function () {\n        const data = this.get('presenceLabelData');\n        if (!data) return true;\n        const { totalCalls, totalChats, totalEmails } = data;\n        return !totalCalls && !totalChats && !totalEmails;\n    }),\n\n    presenceCallsTranslation: computed('presenceLabelData', function () {\n        if (!this.get('presenceLabelData')) return '';\n        const count = this.get('presenceLabelData').totalCalls;\n        if (!count) return '';\n        const translationKey =\n            this.get('presenceLabelData').totalCalls === 1\n                ? `purecloud.conversationSummary.call.singular`\n                : `purecloud.conversationSummary.call.plural`;\n        return this.get('intl').t(translationKey, { count });\n    }),\n\n    presenceMessagingTranslation: computed('presenceLabelData', function () {\n        if (!this.get('presenceLabelData')) return '';\n        const count = this.get('presenceLabelData').totalChats;\n        if (!count) return '';\n        const translationKey =\n            this.get('presenceLabelData').totalChats === 1\n                ? `purecloud.conversationSummary.messaging.singular`\n                : `purecloud.conversationSummary.messaging.plural`;\n        return this.get('intl').t(translationKey, { count });\n    }),\n\n    presenceEmailsTranslation: computed('presenceLabelData', function () {\n        if (!this.get('presenceLabelData')) return '';\n        const count = this.get('presenceLabelData').totalEmails;\n        if (!count) return '';\n        const translationKey =\n            this.get('presenceLabelData').totalEmails === 1\n                ? `purecloud.conversationSummary.email.singular`\n                : `purecloud.conversationSummary.email.plural`;\n        return this.get('intl').t(translationKey, { count });\n    }),\n\n    /**\n     * @computed\n     * Pass through to make sure the gux element gets what it expects\n     */\n    presenceKeyModified: computed('presenceKey', function (): string | undefined {\n        return formatPresenceKeyForGux(this.get('presenceKey'));\n    }),\n\n    // ==================================================================\n    // Lifecycle\n    // ==================================================================\n\n    /* @lifecycle */\n    init() {\n        this._super(...arguments);\n\n        // save the status an only edit a local copy to keep user from seeing the debounce\n        if (this.get('status')) {\n            this.set('localStatus', this.get('status'));\n        }\n\n        // Track viewport size to conditionally render only one h1\n        const mq = window.matchMedia('(max-height: 650px)');\n        this.set('isSmallViewport', mq.matches);\n        const handler = (e: MediaQueryListEvent) => {\n            if (!this.isDestroying && !this.isDestroyed) {\n                this.set('isSmallViewport', e.matches);\n            }\n        };\n        this.set('_mediaQuery', mq);\n        this.set('_mediaHandler', handler);\n        mq.addEventListener('change', handler);\n    },\n\n    /* @lifecycle */\n    willDestroyElement() {\n        this._super(...arguments);\n        const mq = this.get('_mediaQuery');\n        const handler = this.get('_mediaHandler');\n        if (mq && handler) {\n            mq.removeEventListener('change', handler);\n        }\n    },\n\n    /**\n     * @function\n     * Debounced so the API is not hit on every keystroke.\n     */\n    _debouncedChangeStatus(localStatus: string): void {\n        if (this.isDestroying || this.isDestroyed) return;\n        this.actionChangeStatus(localStatus);\n    },\n\n    actionChangeStatus: (localStatus: string) => {\n        warnClosureAction('actionChangeStatus', localStatus);\n    },\n\n    actionGoToProfile: (evt: MouseEvent | KeyboardEvent) => {\n        warnClosureAction('actionGoToProfile', evt);\n    },\n\n    actions: {\n        actionChangeStatus(localStatus: string) {\n            this.set('localStatus', localStatus);\n            debounce(this, this._debouncedChangeStatus, localStatus, STATUS_DEBOUNCE_MS);\n        },\n\n        actionGoToProfile(evt: MouseEvent | KeyboardEvent) {\n            this.actionGoToProfile(evt);\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"rJQDs06m\",\"block\":\"[[[41,[51,[33,1]],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"avatar-header avatar-large\\\"],[12],[1,\\\"\\\\n        \\\"],[10,3],[14,0,\\\"user-avatar\\\"],[14,6,\\\"#\\\"],[15,\\\"aria-label\\\",[29,[[28,[37,2],[\\\"userSettings.viewProfile\\\"],null]]]],[15,\\\"onclick\\\",[28,[37,3],[[30,0],\\\"actionGoToProfile\\\"],null]],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-avatar-beta\\\"],[14,\\\"slot\\\",\\\"avatar\\\"],[15,3,[36,4]],[15,\\\"presence\\\",[36,5]],[15,\\\"label\\\",[36,6]],[14,\\\"accent\\\",\\\"0\\\"],[15,\\\"badge\\\",[52,[33,8],\\\"true\\\",\\\"false\\\"]],[15,\\\"ring\\\",[52,[33,8],\\\"true\\\",\\\"false\\\"]],[12],[1,\\\"\\\\n\\\\n\\\"],[41,[33,9],[[[1,\\\"                    \\\"],[10,\\\"img\\\"],[14,\\\"slot\\\",\\\"image\\\"],[15,\\\"src\\\",[36,9]],[15,\\\"alt\\\",[36,4]],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"slot\\\",\\\"image\\\"],[14,\\\"icon-name\\\",\\\"fa/user-solid\\\"],[15,\\\"screenreader-text\\\",[36,4]],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"h2\\\"],[14,0,\\\"user-name\\\"],[14,\\\"data-testid\\\",\\\"userNameLarge\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-truncate\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[34,4]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,1],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"avatar-header avatar-small\\\"],[12],[1,\\\"\\\\n        \\\"],[10,3],[14,0,\\\"user-avatar\\\"],[14,6,\\\"#\\\"],[15,\\\"aria-label\\\",[29,[[28,[37,2],[\\\"userSettings.viewProfile\\\"],null]]]],[15,\\\"onclick\\\",[28,[37,3],[[30,0],\\\"actionGoToProfile\\\"],null]],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-avatar-beta\\\"],[14,\\\"slot\\\",\\\"avatar\\\"],[15,3,[36,4]],[15,\\\"presence\\\",[36,5]],[15,\\\"label\\\",[36,6]],[14,\\\"accent\\\",\\\"0\\\"],[15,\\\"badge\\\",[52,[33,8],\\\"true\\\",\\\"false\\\"]],[15,\\\"ring\\\",[52,[33,8],\\\"true\\\",\\\"false\\\"]],[14,\\\"size\\\",\\\"small\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,9],[[[1,\\\"                    \\\"],[10,\\\"img\\\"],[14,\\\"slot\\\",\\\"image\\\"],[15,\\\"src\\\",[36,9]],[15,\\\"alt\\\",[36,4]],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"slot\\\",\\\"image\\\"],[14,\\\"icon-name\\\",\\\"fa/user-solid\\\"],[15,\\\"screenreader-text\\\",[36,4]],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"h2\\\"],[14,0,\\\"user-name\\\"],[14,\\\"data-testid\\\",\\\"userNameSmall\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-truncate\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[34,4]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[10,0],[14,0,\\\"user-sub-info\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[15,0,[29,[\\\"organization \\\",[52,[33,10],\\\"no-presence-data\\\"]]]],[14,1,\\\"current-organization\\\"],[12],[1,\\\"\\\\n        \\\"],[10,1],[14,0,\\\"org-name\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/building-regular\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[10,\\\"gux-truncate\\\"],[12],[1,\\\"\\\\n                \\\"],[10,1],[14,\\\"data-testid\\\",\\\"orgName\\\"],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,[34,11]],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"sr-only\\\"],[12],[1,\\\" \\\"],[1,[28,[35,2],[\\\"userSettings.myOrgAria\\\"],null]],[1,\\\": \\\"],[1,[34,11]],[1,\\\" \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[15,0,[29,[\\\"presence-data-slot \\\",[52,[33,10],\\\"no-presence-data\\\"]]]],[12],[1,\\\"\\\\n        \\\"],[10,\\\"presence-label\\\"],[15,\\\"presenceLabelData\\\",[36,12]],[14,1,\\\"presence-label\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,13],[[33,14],[33,15],[33,16]],null],[[[1,\\\"        \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"placement\\\",\\\"bottom\\\"],[14,\\\"for\\\",\\\"presence-label\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[34,14]],[1,\\\"\\\\n            \\\"],[1,[34,15]],[1,\\\"\\\\n            \\\"],[1,[34,16]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13],[1,\\\"\\\\n\\\"],[41,[33,17],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"status-container\\\"],[14,\\\"data-testid\\\",\\\"user-settings-status\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-form-field-text-like\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"input\\\"],[14,1,\\\"status\\\"],[14,\\\"slot\\\",\\\"input\\\"],[14,3,\\\"Status\\\"],[15,2,[36,18]],[14,\\\"autocomplete\\\",\\\"off\\\"],[15,\\\"maxlength\\\",[36,19]],[15,\\\"placeholder\\\",[29,[[28,[37,2],[\\\"userSettings.status.placeholder\\\"],null]]]],[15,\\\"oninput\\\",[28,[37,3],[[30,0],\\\"actionChangeStatus\\\"],[[\\\"value\\\"],[\\\"target.value\\\"]]]],[14,4,\\\"text\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[14,0,\\\"sr-only\\\"],[14,\\\"for\\\",\\\"status\\\"],[14,\\\"slot\\\",\\\"label\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,2],[\\\"userSettings.status.label\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[],false,[\\\"unless\\\",\\\"isSmallViewport\\\",\\\"t\\\",\\\"action\\\",\\\"personName\\\",\\\"presenceKeyModified\\\",\\\"presenceAriaLabel\\\",\\\"if\\\",\\\"presenceKey\\\",\\\"avatarImageUrl\\\",\\\"noPresenceData\\\",\\\"orgName\\\",\\\"presenceLabelData\\\",\\\"or\\\",\\\"presenceCallsTranslation\\\",\\\"presenceMessagingTranslation\\\",\\\"presenceEmailsTranslation\\\",\\\"isStatusEnabled\\\",\\\"localStatus\\\",\\\"maxLength\\\"]]\",\"moduleName\":\"web-directory/components/command-user-settings/user-information/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { warnClosureAction } from 'web-directory/utils/acd-ts';\nimport { formatPresenceKeyForGux } from 'web-directory/utils/presence-utils';\nexport default Component.extend({\n    classNames: ['command-user-settings-button'],\n\n    /**\n     * @attribute\n     * User's current presence key\n     * from session.person.activityPresence\n     * (processed in command-user-settings)\n     */\n    presenceKey: 'offline',\n\n    /**\n     * @attribute\n     * ('User Name' + 'Current Presence')\n     * from session.person.presenceLabel\n     * (processed in command-user-settings)\n     */\n    presenceAriaLabel: '',\n\n    /**\n     * @attribute\n     * User's name\n     * from session.person.name\n     * (processed in command-user-settings)\n     */\n    personName: '',\n\n    /**\n     * @attribute\n     * User's profile image\n     * from session.person.profilePicture\n     * (processed in command-user-settings)\n     */\n    avatarImageUrl: '',\n\n    /**\n     * @attribute\n     * Flag for if user-settings is open\n     * (processed in command-user-settings)\n     */\n    userSettingsOpen: false,\n\n    /**\n     * @computed\n     * Pass through to make sure the gux element gets what it expects\n     */\n    presenceKeyModified: computed('presenceKey', function (): string | undefined {\n        return formatPresenceKeyForGux(this.get('presenceKey'));\n    }),\n\n    // ==================================================================\n    // Actions\n    // ==================================================================\n\n    /**\n     * @action\n     * Open/Closes the user settings pop over\n     * Closure action passed from command-user-settings\n     */\n    actionToggleUserSettings: () => {\n        warnClosureAction('actionToggleUserSettings');\n    },\n\n    actions: {\n        toggleUserSettings() {\n            this.actionToggleUserSettings();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"pqpoNezV\",\"block\":\"[[[10,\\\"button\\\"],[14,1,\\\"user-settings-button\\\"],[14,0,\\\"user-setting-toggle-button\\\"],[15,\\\"aria-label\\\",[29,[[28,[37,0],[\\\"userSettings.userSettingsAria\\\"],null],\\\", \\\",[36,1],\\\", \\\",[36,2]]]],[14,\\\"aria-haspopup\\\",\\\"dialog\\\"],[15,\\\"aria-expanded\\\",[29,[[52,[33,4],\\\"true\\\",\\\"false\\\"]]]],[15,\\\"onclick\\\",[28,[37,5],[[30,0],\\\"toggleUserSettings\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"gux-avatar-beta\\\"],[15,3,[36,1]],[15,\\\"presence\\\",[36,6]],[15,\\\"label\\\",[36,2]],[14,\\\"accent\\\",\\\"0\\\"],[15,\\\"badge\\\",[52,[33,7],\\\"true\\\",\\\"false\\\"]],[15,\\\"ring\\\",[52,[33,7],\\\"true\\\",\\\"false\\\"]],[14,\\\"size\\\",\\\"small\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,8],[[[1,\\\"            \\\"],[10,\\\"img\\\"],[14,\\\"slot\\\",\\\"image\\\"],[15,\\\"src\\\",[36,8]],[15,\\\"alt\\\",[36,1]],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"slot\\\",\\\"image\\\"],[14,\\\"icon-name\\\",\\\"fa/user-solid\\\"],[15,\\\"screenreader-text\\\",[36,1]],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"t\\\",\\\"personName\\\",\\\"presenceAriaLabel\\\",\\\"if\\\",\\\"userSettingsOpen\\\",\\\"action\\\",\\\"presenceKeyModified\\\",\\\"presenceKey\\\",\\\"avatarImageUrl\\\"]]\",\"moduleName\":\"web-directory/components/command-user-settings/user-settings-button/template.hbs\",\"isStrictMode\":false});","import { computed, observer } from '@ember/object';\nimport { run } from '@ember/runloop';\nimport { getOwner } from '@ember/application';\nimport { inject } from '@ember/service';\nimport Component from '@ember/component';\nimport OpenWindowHandler from 'web-directory/services/apps-api-handlers/open-window-handler';\nimport { TOGGLE_NAV_EVENT, TOGGLE_SUBNAV_EVENT, RESET_NAV } from 'web-directory/services/events';\nimport { POOL_STATES } from 'web-directory/models/app-pool';\nimport { Maybe } from 'web-directory/types';\nimport { addPageAction } from 'web-directory/utils/newrelic';\nimport { GENESYS_HELP_DOMAIN } from 'web-directory/services/help';\nimport { openVoltPopout } from 'web-directory/utils/volt-popout';\nimport { TRANSITION_EVENT } from 'web-directory/router';\nimport { CommandBookmarkEntry } from 'web-directory/components/command-bookmarks/component';\n\nconst RECENT_PAGES_KEY = 'recentPages';\nconst RECENT_PAGES_LIMIT = 3;\n\nfunction recordRecentPage(hash: string, title: string) {\n    let pages: { properties: CommandBookmarkEntry[] } = { properties: [] };\n    try {\n        const stored = localStorage.getItem(RECENT_PAGES_KEY);\n        if (stored) pages = JSON.parse(stored);\n    } catch (_) {\n        /* ignore parse errors */\n    }\n\n    // Remove duplicate if same hash already exists\n    const hashesToRemove = [hash];\n    const filtered = pages.properties.filter(e => !hashesToRemove.includes(e.hash));\n\n    // Prepend new entry and enforce limit\n    const trimmed = [{ rank: '0', hash, title }, ...filtered].slice(0, RECENT_PAGES_LIMIT);\n\n    // Re-index ranks\n    const reindexed = trimmed.map((entry, i) => ({ ...entry, rank: i.toString() }));\n\n    localStorage.setItem(RECENT_PAGES_KEY, JSON.stringify({ properties: reindexed }));\n}\n\nexport default Component.extend({\n    classNameBindings: [\n        ':command-view',\n        ':orgspan-app',\n        'session.authInProgress:authenticating:',\n        'session.isAuthenticated:authenticated:unauthenticated',\n        'session.hasAppAccess:authorized:unauthorized',\n        'session.useNewNav:nav-system-v2:',\n        'application.errorState:application-error',\n        'session.logoutInProgress:logging-out:',\n        'application.currentRouteClass',\n        'application.adminUIContext:adminui-context:directory-context',\n        'application.isPopout:is-popout',\n        'showNavbarAlert:has-incoming-conversation',\n        'webrtcSdkService.videoInvitations.length:has-incoming-conversation',\n        'webrtc.incomingInvitations.length:has-incoming-conversation',\n        'phone.onCall:on-call',\n        'bannerActive:banner-active'\n    ],\n\n    acdworkitem: inject('acdworkitem'),\n    application: inject('application'),\n    apps: inject('apps'),\n    router: inject('router'),\n    events: inject('events'),\n    frameService: inject('center-stage-frame'),\n    interaction: inject('interaction'),\n    permissions: inject('permissions'),\n    phone: inject('phone'),\n    session: inject('session'),\n    settings: inject('settings'),\n    sidebar: inject('sidebar'),\n    streaming: inject('streaming'),\n    webrtc: inject('webrtc'),\n    webrtcSdkService: inject('webrtc-sdk'),\n    trial: inject('trial'),\n    intl: inject('intl'),\n    logger: inject('stash-logger'),\n    commandNav: inject('command-nav'),\n    engage: inject('engage'),\n    fax: inject('fax'),\n    pigeon: inject('pigeon'),\n    ring: inject('ring'),\n\n    /**\n     * @attribute\n     * Flag indcating if the main nav view is narrow.\n     */\n    narrowWidth: null as Maybe<boolean>,\n\n    /**\n     * Boolean flag indicating if the nav panel is open\n     */\n    navV2IsOpen: false,\n\n    /**\n     * Boolean flag indicating if the sub nav panel is open\n     */\n    subNavIsOpen: false,\n\n    /**\n     * todo: this is seems broken\n     * Boolean flag indicating if the audit footer is open\n     */\n    auditDrawerOpen: false,\n\n    mobileModalClasses: 'mobile',\n    adminModalSrc: null as Maybe<string>,\n\n    panelIsOpen: computed('commandNav.currentPanel', function () {\n        return this.get('commandNav').get('currentPanel') !== 'panel-not-active';\n    }),\n\n    showLoader: computed.readOnly('application.showLoader'),\n\n    showAdminAuditFooter: computed.and('application.isAdminRoute', 'permissions.canViewAudits'),\n\n    trialSupport: computed.reads('application.showTrialSupport'),\n\n    panelFullWidthAndOpen: computed('commandNav.expanded', 'narrowWidth', 'panelIsOpen', function () {\n        return !!(this.get('panelIsOpen') && (this.get('commandNav.expanded') || this.get('narrowWidth')));\n    }),\n\n    shroudOn: computed('subNavIsOpen', 'narrowWidth', 'navV2IsOpen', function () {\n        return !!(this.get('subNavIsOpen') || (this.get('narrowWidth') && this.get('navV2IsOpen')));\n    }),\n\n    showAdminModal: false, // I don't think this is ever toggled on in new nav\n    showPreferencesModal: computed.reads('settings.isOpen'),\n    showAgentWorkspaceRedirectModal: computed.readOnly('phone.showAgentWorkspaceRedirectModal'),\n    userPreferenceHideWorkspaceRedirectModal: computed.readOnly('phone.userPreferenceHideWorkspaceRedirectModal'),\n    showMobileAppOffer: computed.and('session.isAuthenticated', 'application.offerMobileApp'),\n    // Feature toggle to enable ring timeouts from qms | ACE-2879 | PURE-3878\n    ftAcdRingTimeout: computed('session.features', function () {\n        return this.get('session.features')['assignment.audioAlertDuration'];\n    }).readOnly(),\n\n    widgetAppPool: computed.readOnly('apps.widgetAppPool'),\n\n    currentRouteClass: computed<string>('application.currentRouteName', function () {\n        const name = this.get('application.currentRouteName');\n        if (!name) return '';\n        return name.replace(/[\\.\\/]+/g, '-');\n    }),\n\n    alertingConversationLegacy: computed(\n        'interaction.alertingInteractions.firstObject',\n        'phone.incomingNonAcdConversations.firstObject',\n        'acdworkitem.alertingWorkitems.firstObject',\n        function () {\n            return (\n                this.get('interaction.alertingInteractions.firstObject') ||\n                this.get('phone.incomingNonAcdConversations.firstObject') ||\n                this.get('acdworkitem.alertingWorkitems.firstObject')\n            );\n        }\n    ),\n\n    /**\n     * In Modes, ACD alerting is handled by the mode-manager. UC call alerting still\n     * relies on the alerting-manager toast (e.g. the \"Answering will place your current\n     * call on HOLD\" warning). Return only the UC alerting conversation for Modes, and\n     * the full legacy set otherwise.\n     */\n    alertingConversation: computed(\n        'session.useModes',\n        'alertingConversationLegacy',\n        'phone.incomingNonAcdConversations.firstObject',\n        function () {\n            if (this.get('session.useModes')) {\n                return this.get('phone.incomingNonAcdConversations.firstObject') || null;\n            }\n            return this.get('alertingConversationLegacy');\n        }\n    ),\n\n    bannerActive: computed('session.user.{isTrustee,isCloned}', 'trial.inActiveFreeTrial', function () {\n        return (\n            this.get('session.user.isTrustee') ||\n            this.get('session.user.isCloned') ||\n            this.get('trial.inActiveFreeTrial')\n        );\n    }),\n\n    showAppChrome: computed(\n        'session.isAuthenticated',\n        'session.hasAppAccess',\n        'application.{errorState,adminUIContext}',\n        function () {\n            return (\n                this.get('session.isAuthenticated') &&\n                this.get('session.hasAppAccess') &&\n                !this.get('application.errorState') &&\n                !this.get('application.adminUIContext')\n            );\n        }\n    ),\n\n    activeStandaloneAppId: computed<string | null>('apps.standaloneAppPool.currState', function () {\n        const currPoolState = this.get('apps.standaloneAppPool.currState');\n        if (currPoolState && currPoolState.name === POOL_STATES.SHOWING_APP) {\n            return currPoolState.details.appId;\n        }\n        return null;\n    }),\n\n    standaloneHandlers: computed<any[]>(function () {\n        // ownerInjection() must be merged into the first argument in Ember 3.28\n        return [\n            OpenWindowHandler.create(\n                Object.assign(\n                    { isActiveApp: (id: string) => id === this.get('activeStandaloneAppId') },\n                    getOwner(this).ownerInjection()\n                )\n            )\n        ];\n    }),\n\n    freeTrialStatusText: computed<string>('trial.{inActiveFreeTrial,freeTrialDaysRemaining}', function () {\n        if (!this.get('trial.inActiveFreeTrial')) return '';\n        const remaining = this.get('trial').freeTrialDaysRemaining;\n        return this.get('intl').t('freeTrial.trialStatus', { number: remaining });\n    }),\n\n    isAgentView: computed<boolean>('currentRouteClass', function () {\n        return this.get('commandNav.currentPanel') == 'agent';\n    }),\n\n    setBannerClass: observer('bannerActive', function (this: any) {\n        this._setBannerClass();\n    }),\n\n    _setBannerClass() {\n        const hasBannerClass = window.document.body.classList.contains('banner-active');\n\n        if (this.get('bannerActive') && !hasBannerClass) {\n            // add banner class to body if it doesn't exist and should\n            window.document.body.classList.add('banner-active');\n        } else if (!this.get('bannerActive') && hasBannerClass) {\n            //remove banner class from body if it exists and shouldn't\n            window.document.body.classList.remove('banner-active');\n        }\n    },\n\n    handleNavToggle(evt: any) {\n        if (evt) this.set('navV2IsOpen', !!evt.open);\n    },\n\n    handleSubNavToggle(evt: any) {\n        if (evt) this.set('subNavIsOpen', !!evt.open);\n    },\n\n    handleResizeEvent() {\n        // Guard: the throttled resize event can fire after the component is destroyed\n        if (this.isDestroyed || this.isDestroying || !this.element) {\n            return;\n        }\n        const navMain = this.element.querySelector('.command-layout') as HTMLElement;\n        const pageViewWidth = navMain ? navMain.offsetWidth : window.innerWidth;\n        if (pageViewWidth! < 768 && this.get('navV2IsOpen') && !this.get('panelIsOpen')) {\n            this.get('events').triggerEvent(TOGGLE_NAV_EVENT, { open: false });\n            this.get('events').triggerEvent(TOGGLE_SUBNAV_EVENT, { open: false });\n        }\n        if (\n            this.get('navV2IsOpen') &&\n            this.get('panelIsOpen') &&\n            ((pageViewWidth! < 1300 && this.get('commandNav').get('currentPanel') !== 'agent') ||\n                (pageViewWidth! < 1700 && this.get('commandNav').get('currentPanel') == 'agent'))\n        ) {\n            this.get('events').triggerEvent(TOGGLE_NAV_EVENT, { open: false });\n            this.get('events').triggerEvent(TOGGLE_SUBNAV_EVENT, { open: false });\n        }\n        this.setPageSize(pageViewWidth);\n    },\n\n    setPageSize(pageViewWidth: any) {\n        if (pageViewWidth! < 768 || (pageViewWidth! < 1368 && this.get('panelIsOpen') && !this.get('navV2IsOpen'))) {\n            this.set('narrowWidth', true);\n            this.get('commandNav').set('narrowWidth', true);\n        } else {\n            this.set('narrowWidth', false);\n            this.get('commandNav').set('narrowWidth', false);\n        }\n    },\n\n    /**\n     * Matches the current page title\n     * Sourced from the application service which checks the URL against the known app list.\n     */\n    bookmarkPageTitle: computed('application.currentPageTitle', function () {\n        return this.get('application.currentPageTitle');\n    }),\n\n    /**\n     * Records the current page (URL + title) to the recentPages localStorage entry.\n     */\n    _recordCurrentPage() {\n        if (this.get('isDestroyed') || this.get('isDestroying')) return;\n\n        // An instance that was created but never destroyed keeps its hashchange and\n        // router-transition listeners for the life of the page, so this can run long after the\n        // owning container is gone — the component is still alive, which is why the check above\n        // does not catch it. `bookmarkPageTitle` reads `application.currentPageTitle`, and that\n        // dotted path resolves the `application` injection lazily: on a torn-down owner the\n        // resolution throws `Can not call .lookup after the owner has been destroyed` from inside a\n        // backburner autorun, which escapes as an unhandled rejection rather than a normal error.\n        // An orphaned component has no current page worth recording.\n        // Cast: getOwner is typed as returning an opaque owner, but every owner is an EmberObject\n        // and so carries these two flags.\n        const owner = getOwner(this) as Maybe<{ isDestroying?: boolean; isDestroyed?: boolean }>;\n        if (!owner || owner.isDestroying || owner.isDestroyed) return;\n\n        const commandNav = this.get('commandNav') as any;\n        const url = `#${commandNav._router?.currentURL || window.location.hash.slice(1)}`;\n        const title = this.get('bookmarkPageTitle');\n        recordRecentPage(url, title);\n    },\n\n    /**\n     * @lifecycle\n     * Sets up component state on initialization.\n     */\n    /**\n     * Bound resize handler stored for proper removeEventListener teardown\n     */\n    _resizeHandler: null as Maybe<() => void>,\n\n    /**\n     * Bound click handler stored for proper removeEventListener teardown\n     */\n    _clickHandler: null as Maybe<(e: MouseEvent) => void>,\n\n    /**\n     * Bound hashchange handler stored for proper removeEventListener teardown\n     */\n    _hashChangeHandler: null as Maybe<() => void>,\n\n    /**\n     * Bound router transition handler stored for router.off() teardown\n     */\n    _transitionHandler: null as Maybe<() => void>,\n\n    /**\n     * Reference to the router used for transition listener teardown\n     */\n    _router: null as Maybe<any>,\n\n    init() {\n        this._super(...arguments);\n        this.get('events').on(TOGGLE_NAV_EVENT, this, this.handleNavToggle);\n        this.get('events').on(TOGGLE_SUBNAV_EVENT, this, this.handleSubNavToggle);\n\n        const resizeHandler = () => {\n            run.throttle(this, this.handleResizeEvent, 100, false);\n        };\n        this.set('_resizeHandler', resizeHandler);\n        window.addEventListener('resize', resizeHandler);\n\n        const clickHandler = ({ target }: MouseEvent) => {\n            if ((target as HTMLElement).classList.contains('background-shroud')) {\n                this.get('events').triggerEvent(RESET_NAV, {});\n            }\n        };\n        this.set('_clickHandler', clickHandler);\n        window.addEventListener('click', clickHandler);\n\n        // Track page visits for recently viewed pages\n        try {\n            const commandNav = this.get('commandNav') as any;\n            const router = commandNav._router;\n            if (router) {\n                const transitionHandler = () => {\n                    run.scheduleOnce('afterRender', this, this._recordCurrentPage);\n                };\n                this.set('_router', router);\n                this.set('_transitionHandler', transitionHandler);\n                router.on(TRANSITION_EVENT, transitionHandler);\n            }\n        } catch (_) {\n            /* ignore */\n        }\n\n        const hashChangeHandler = () => {\n            run.scheduleOnce('afterRender', this, this._recordCurrentPage);\n        };\n        this.set('_hashChangeHandler', hashChangeHandler);\n        window.addEventListener('hashchange', hashChangeHandler);\n\n        const pageViewWidth = window.innerWidth;\n        this.setPageSize(pageViewWidth);\n\n        //Add unique top-level classes for command view\n        window.document.body.classList.add('command');\n        this._setBannerClass();\n\n        // register new navigation load with NR\n        addPageAction('loadNewNav');\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        const pageViewWidth = window.innerWidth;\n        this.setPageSize(pageViewWidth);\n    },\n\n    /*\n     * Teardown is deliberately on willDestroy rather than willDestroyElement.\n     *\n     * All of these listeners are registered in init(), which always runs. willDestroyElement only\n     * runs for a component that was inserted into the DOM and later removed, so an instance that is\n     * created without being rendered — which is what every unit test that calls\n     * factoryFor('component:command-view').create() does — used to keep four window listeners and a\n     * router listener for the life of the page. Those orphaned listeners then fired against a\n     * component whose owner had been torn down. willDestroy runs on every destroy path, rendered or\n     * not, which makes the pair symmetric with init().\n     *\n     * Safe to read the injected services here: `events` and `commandNav` were both resolved during\n     * init(), so these are cached reads and not container lookups.\n     */\n    willDestroy() {\n        this.get('events').off(TOGGLE_NAV_EVENT, this, this.handleNavToggle);\n        this.get('events').off(TOGGLE_SUBNAV_EVENT, this, this.handleSubNavToggle);\n\n        const resizeHandler = this.get('_resizeHandler');\n        if (resizeHandler) {\n            window.removeEventListener('resize', resizeHandler);\n        }\n\n        const clickHandler = this.get('_clickHandler');\n        if (clickHandler) {\n            window.removeEventListener('click', clickHandler);\n        }\n\n        const hashChangeHandler = this.get('_hashChangeHandler');\n        if (hashChangeHandler) {\n            window.removeEventListener('hashchange', hashChangeHandler);\n        }\n\n        // `_router` is reached through commandNav's private `_router`, which init() already treats as\n        // untrusted (its registration sits in a try/catch). Now that teardown runs on every destroy\n        // rather than only on element removal, it has to tolerate the same shapes init() does.\n        const router = this.get('_router');\n        const transitionHandler = this.get('_transitionHandler');\n        if (router && transitionHandler && typeof router.off === 'function') {\n            router.off(TRANSITION_EVENT, transitionHandler);\n        }\n\n        this._super(...arguments);\n    },\n\n    actions: {\n        updateUserPreferenceHideWorkspaceRedirectModal() {\n            this.get('phone').toggleUserPreferenceHideWorkspaceRedirectModal();\n        },\n        answerAcdInteraction() {\n            /**\n             * @todo PURE-7222: figure out a better way to answer the acd interaction\n             */\n            if (this.get('session').get('useModes')) {\n                console.warn('PURE-7222 [command-view]: answerAcdInteraction is currently not supported.');\n                return;\n            }\n            this.get('interaction').answerInteraction();\n        },\n        openAcdInteraction() {\n            /**\n             * @todo PURE-7222: figure out a better way to open the acd interaction\n             */\n            if (this.get('session').get('useModes')) {\n                console.warn('PURE-7222 [command-view]: openAcdInteraction is currently not supported.');\n                return;\n            }\n            this.get('interaction').openAcdInteraction();\n        },\n        sendToVoicemail(conversation: any) {\n            this.get('phone').sendToVoicemail(conversation);\n        },\n        answerUcCall(conversation: any) {\n            this.get('phone').answer(conversation);\n        },\n        /**\n         * Answer a video invitation from webrtc-sdk by opening Volt in a popout window\n         */\n        answerVideoInvitation(this: any, invitation: any) {\n            const roomJid = invitation.get('roomJid') || invitation.get('originalRoomJid');\n            const isHosted = this.get('application.hostedContext')?.isHosted?.() || false;\n\n            // Remove the invitation from the list\n            this.get('webrtcSdkService').removeVideoInvitation(invitation);\n            this.get('ring').stopRingtone();\n\n            // Open Volt in a popout window\n            if (roomJid) {\n                openVoltPopout(roomJid, { hosted: isHosted });\n            }\n        },\n        /**\n         * Decline a video invitation from webrtc-sdk\n         */\n        declineVideoInvitation(this: any, invitation: any) {\n            // Decline via SDK (this also removes from the list)\n            this.get('webrtcSdkService').declineVideoInvitation(invitation);\n            this.get('ring').stopRingtone();\n        },\n        answerWorkitemInteraction() {\n            /**\n             * @todo PURE-7222: figure out a better way to answer the workitem interaction\n             */\n            if (this.get('session').get('useModes')) {\n                console.warn('PURE-7222 [command-view]: answerWorkitemInteraction is currently not supported.');\n                return;\n            }\n\n            const acdworkitem = this.get('acdworkitem');\n            const alertingWorkitem = acdworkitem.get('alertingWorkitems.firstObject');\n            if (alertingWorkitem) {\n                this.get('acdworkitem')\n                    .answer(alertingWorkitem)\n                    .then(() => {\n                        this.get('interaction').openAcdInteraction();\n                        this.get('acdworkitem').handleWorkitemAnsweredEvent(alertingWorkitem);\n                    })\n                    .catch((error: any) =>\n                        this.get('logger').error('Failed to answer workitem interaction.', { error })\n                    );\n            }\n        },\n\n        onStandaloneAppInstanceApiCall(apiCall: any) {\n            this.get('apps').handleAppApiCall(apiCall, this.get('standaloneHandlers'));\n        },\n        closeAgentWorkspaceRedirectModal() {\n            this.get('phone').closeAgentWorkspaceRedirectModal();\n        },\n        confirmRedirectToAgentWorkspace() {\n            this.get('phone').confirmRedirectToAgentWorkspace();\n        },\n        // Replacement for (route-action 'transitionToRoute') — transitionToRoute as a\n        // route action is deprecated in Ember 3.x; use the router service directly.\n        transitionToRoute(route: string, ...models: any[]) {\n            this.get('router').transitionTo(route, ...models.filter(m => m !== null && m !== undefined));\n        },\n        safeClosePreferencesModal() {\n            this.get('settings').close();\n        },\n        onDisplayTrialSupport() {\n            if (!this.get('trial').get('showTrialSupportCenter')) {\n                return;\n            }\n            this.get('commandNav').selectPanel('trial');\n        },\n        onGiveFeedback() {\n            window.open('https://genesyscx.az1.qualtrics.com/jfe/form/SV_1NOejj4FsXLIJBI', '_blank');\n        },\n        onBetaSupport() {\n            window.open(`https://${GENESYS_HELP_DOMAIN}/articles/explore-the-genesys-cloud-interface/`, '_blank');\n        },\n        logout() {\n            const session = this.get('session');\n            const homeOrg = session.get('user').get('isCloned')\n                ? session.get('user').get('token.clonedUser.organization.id')\n                : session.get('user').get('token.homeOrganization.id');\n            const loggedIntoHomeOrg = !!session.get('org') && !!homeOrg ? homeOrg === session.get('org').id : false;\n            if (homeOrg && !loggedIntoHomeOrg) {\n                this.get('session').proxyLogin(homeOrg, '#/partners/clients');\n            } else {\n                this.get('session').logout();\n            }\n        },\n        engageNavigate(data: any, options = {}) {\n            this.get('engage').handleNavigation(data, options);\n        },\n\n        engageRedirect(data: any) {\n            this.get('engage').handleRedirect(data);\n        },\n\n        engageRegisterNavEntries(data: any) {\n            this.get('engage').registerNavEntries(data);\n        },\n\n        engageDocumentFax(data: any) {\n            if (this.get('phone').get('enabled')) {\n                this.get('commandNav').selectPanel('voice');\n                this.get('commandNav').set('callControlsTab', 'fax');\n                this.get('fax').set('documentData', data);\n            }\n        },\n\n        engageHelpURL(data: any) {\n            this.get('engage').setHelpURL(data);\n        },\n\n        engageInteract() {\n            // noop, not used by CM\n        },\n\n        engagePhoneSelection() {\n            // noop, not used by CM\n        },\n\n        engageSetBreadcrumb() {\n            // noop, not used by new Nav\n        },\n\n        closeMobileModal() {\n            this.get('application').set('offerMobileApp', false);\n        },\n\n        showAdminModal(src: string) {\n            this.set('showAdminModal', true);\n            this.set('adminModalSrc', src);\n        },\n\n        closeAdminModal() {\n            this.set('showAdminModal', false);\n        },\n\n        closeWebrtcDebugModal() {\n            this.get('webrtc').set('showDebugModal', false);\n        },\n\n        async endCallsAndInvalidateSession() {\n            let webrtc = this.get('webrtc');\n            webrtc.get('conversations').forEach(function (conversation: any) {\n                webrtc.endConversation({ jid: conversation.get('jid') });\n            });\n            await this.get('webrtcSdkService').endAllSoftphoneSessions();\n            const session = this.get('session');\n            run.later(session, session.invalidate, 500);\n        },\n\n        immediatelyResubscribe() {\n            // trigger subscribe request\n            this.get('pigeon')._registerTopics();\n            this.get('session').set('shouldWarnNoLongerSubscribed', false);\n        },\n\n        closePermissionsModal(requestAdditionalPermissions = false) {\n            const webrtSdk = this.get('webrtcSdkService');\n            webrtSdk.set('showPermissionsModal', false);\n            if (requestAdditionalPermissions && typeof webrtSdk.requestAdditionalPermissions === 'function') {\n                webrtSdk.requestAdditionalPermissions();\n            }\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"5Wxh4A6z\",\"block\":\"[[[41,[33,1,[\\\"adminUIContext\\\"]],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"admin-context-wrapper\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"section\\\"],[14,0,\\\"center-stage\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"application-scroll\\\"],[12],[1,\\\"\\\\n                \\\"],[19,\\\"nav-system-v2/mainstage\\\",[]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"    \\\"],[10,0],[15,0,[29,[\\\"nav-v2-main \\\",[52,[33,3],\\\"nav-open\\\"],\\\" \\\",[52,[33,4],\\\"side-panel-open\\\"]]]],[12],[1,\\\"\\\\n\\\"],[1,\\\"        \\\"],[10,1],[15,\\\"inert\\\",[36,5]],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,6],[[33,7,[\\\"user\\\",\\\"isTrustee\\\"]],[33,7,[\\\"user\\\",\\\"isCloned\\\"]]],null],[[[1,\\\"                \\\"],[1,[28,[35,8],null,[[\\\"bannerText\\\",\\\"theme\\\",\\\"primaryButtonText\\\",\\\"primaryButtonAction\\\"],[[28,[37,9],[\\\"navBar.commandView.homeOrgBanner\\\"],[[\\\"homeOrg\\\"],[[28,[37,6],[[33,7,[\\\"trusteeOrg\\\",\\\"name\\\"]],\\\"\\\"],null]]]],\\\"trustee\\\",[28,[37,9],[\\\"components.navOrgSwitcher.homeOrg\\\"],null],[28,[37,10],[[30,0],\\\"logout\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,11,[\\\"inActiveFreeTrial\\\"]],[[[1,\\\"                \\\"],[1,[28,[35,8],null,[[\\\"bannerText\\\",\\\"badgeText\\\",\\\"badgeColor\\\",\\\"theme\\\",\\\"primaryButtonText\\\",\\\"primaryButtonIcon\\\",\\\"primaryButtonAction\\\"],[[28,[37,9],[\\\"freeTrial.trialVersion\\\"],null],[33,12],\\\"blue\\\",\\\"trial\\\",[52,[33,11,[\\\"showTrialSupportCenter\\\"]],[28,[37,9],[\\\"freeTrial.support\\\"],null],\\\"\\\"],[52,[33,11,[\\\"showTrialSupportCenter\\\"]],\\\"customer-journey\\\",\\\"\\\"],[28,[37,10],[[30,0],\\\"onDisplayTrialSupport\\\"],null]]]]],[1,\\\"\\\\n            \\\"]],[]],null]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,5],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"background-shroud\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[1,\\\"        \\\"],[1,[28,[35,13],null,[[\\\"navIsOpen\\\",\\\"subNavIsOpen\\\",\\\"widgetAppPool\\\",\\\"narrowWidth\\\",\\\"shroudOn\\\"],[[33,3],[33,14],[33,15],[33,16],[33,5]]]]],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[14,0,\\\"command-layout\\\"],[15,\\\"inert\\\",[36,5]],[12],[1,\\\"\\\\n\\\"],[1,\\\"            \\\"],[10,\\\"main\\\"],[15,0,[29,[\\\"center-stage\\\\n                    \\\",[52,[33,4],\\\"side-panel-open\\\"],\\\"\\\\n                    \\\",[52,[33,17,[\\\"expanded\\\"]],\\\"expanded\\\"],\\\"\\\\n                    \\\",[33,17,[\\\"currentPanel\\\"]]]]],[12],[1,\\\"\\\\n                \\\"],[10,1],[15,\\\"inert\\\",[36,18]],[12],[1,\\\"\\\\n                    \\\"],[10,1],[14,1,\\\"skip-link-main-content-target\\\"],[14,\\\"tabindex\\\",\\\"-1\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[19,\\\"nav-system-v2/mainstage\\\",[]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,19,[\\\"enabled\\\"]],[[[1,\\\"                    \\\"],[1,[34,20]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n                \\\"],[19,\\\"nav-system-v2/modals\\\",[]],[1,\\\"\\\\n\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[1,\\\"            \\\"],[10,\\\"aside\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,21],null,[[\\\"narrowWidth\\\"],[[33,16]]]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[42,[28,[37,23],[[28,[37,23],[[33,24,[\\\"softphoneConversations\\\"]]],null]],null],null,[[[41,[30,1,[\\\"conversationId\\\"]],[[[1,\\\"            \\\"],[1,[28,[35,25],null,[[\\\"conversation\\\"],[[30,1]]]]],[1,\\\"\\\\n\\\"]],[]],null]],[1]],null],[1,\\\"\\\\n\\\"],[41,[33,26],[[[1,\\\"        \\\"],[1,[34,27]],[1,\\\"\\\\n\\\"]],[]],null]],[]]],[1,\\\"\\\\n\\\"],[1,[28,[35,28],null,[[\\\"ftAcdRingTimeout\\\",\\\"ftAcdAlerting\\\",\\\"alertingConversation\\\",\\\"isOnConnectedAcdCall\\\",\\\"phoneDisabled\\\",\\\"webrtcShowingVideo\\\",\\\"webrtcPhoneService\\\",\\\"phoneDisabledMessage\\\",\\\"isOnConnectedCall\\\",\\\"hostedContext\\\",\\\"browserHidden\\\",\\\"isScreenRecordingPopout\\\",\\\"publicApiUser\\\",\\\"notificationOutputDeviceId\\\",\\\"isInteractionViewOpen\\\",\\\"actionAnswerInteraction\\\",\\\"actionOpenAcdInteraction\\\",\\\"actionToVoicemail\\\",\\\"actionAnswer\\\",\\\"actionAnswerWorkitemInteraction\\\"],[[33,29],[33,7,[\\\"features\\\",\\\"acdAlerting\\\"]],[33,30],[33,19,[\\\"isOnConnectedAcdCall\\\"]],[33,19,[\\\"phoneDisabled\\\"]],[33,24,[\\\"activeRoom\\\",\\\"showingVideo\\\"]],[33,31,[\\\"station\\\",\\\"isWebrtc\\\"]],[33,19,[\\\"phoneDisabledMessage\\\"]],[33,19,[\\\"isOnConnectedCall\\\"]],[33,1,[\\\"hostedContext\\\"]],[33,1,[\\\"browserHidden\\\"]],[33,1,[\\\"isScreenRecordingPopout\\\"]],[33,7,[\\\"publicApiUser\\\"]],[33,24,[\\\"notificationOutputDeviceId\\\"]],[33,32],[28,[37,10],[[30,0],\\\"answerAcdInteraction\\\"],null],[28,[37,10],[[30,0],\\\"openAcdInteraction\\\"],null],[28,[37,10],[[30,0],\\\"sendToVoicemail\\\"],null],[28,[37,10],[[30,0],\\\"answerUcCall\\\"],null],[28,[37,10],[[30,0],\\\"answerWorkitemInteraction\\\"],null]]]]],[1,\\\"\\\\n\\\\n\\\"],[10,1],[15,\\\"inert\\\",[36,5]],[12],[1,\\\"\\\\n\\\"],[1,\\\"    \\\"],[1,[34,33]],[1,\\\"\\\\n\\\\n\\\"],[1,\\\"    \\\"],[1,[34,34]],[1,\\\"\\\\n\\\\n\\\"],[1,\\\"    \\\"],[1,[34,35]],[1,\\\"\\\\n\\\"],[13]],[\\\"conversation\\\"],true,[\\\"if\\\",\\\"application\\\",\\\"partial\\\",\\\"navV2IsOpen\\\",\\\"panelIsOpen\\\",\\\"shroudOn\\\",\\\"or\\\",\\\"session\\\",\\\"command-banner\\\",\\\"t\\\",\\\"action\\\",\\\"trial\\\",\\\"freeTrialStatusText\\\",\\\"command-bar\\\",\\\"subNavIsOpen\\\",\\\"widgetAppPool\\\",\\\"narrowWidth\\\",\\\"commandNav\\\",\\\"panelFullWidthAndOpen\\\",\\\"phone\\\",\\\"floating-calls\\\",\\\"command-panel\\\",\\\"each\\\",\\\"-track-array\\\",\\\"webrtc\\\",\\\"webrtc-softphone-audio\\\",\\\"trialSupport\\\",\\\"command-free-trial-support\\\",\\\"alerting-manager\\\",\\\"ftAcdRingTimeout\\\",\\\"alertingConversation\\\",\\\"phoneService\\\",\\\"isAgentView\\\",\\\"alerting-container\\\",\\\"global-modal\\\",\\\"global-side-panel\\\"]]\",\"moduleName\":\"web-directory/components/command-view/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\n\ntype BadgeAccent = 'info' | 'success' | 'warning' | 'error';\n\nexport default Component.extend({\n    classNames: ['common-badge'] as const,\n    classNameBindings: ['accent', 'bold'] as const,\n\n    /**\n     * @attribute\n     * the accent styling that the badge should be rendered in\n     */\n    accent: 'info' as BadgeAccent,\n\n    /**\n     * @attribute\n     * `true` if the badge should utilize the bold, more vibrant, color palette\n     */\n    bold: false\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"i2cRXhbk\",\"block\":\"[[[10,2],[14,0,\\\"common-badge__text\\\"],[12],[1,\\\"\\\\n    \\\"],[18,1,null],[1,\\\"\\\\n\\\"],[13]],[\\\"&default\\\"],false,[\\\"yield\\\"]]\",\"moduleName\":\"web-directory/components/common-badge/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport { equal } from '@ember/object/computed';\nimport { later } from '@ember/runloop';\nimport { computed } from '@ember/object';\nimport Component from '@ember/component';\nimport _ from 'lodash';\n\nexport default Component.extend({\n    classNames: ['consult-transfer'],\n\n    phone: service('phone'),\n    session: service('session'),\n\n    conversation: null,\n    speaker: null,\n    transferring: false,\n\n    actions: {\n        changeSpeaker(destination) {\n            if (!this.canUpdateConsult) {\n                return;\n            }\n            this.phone\n                .changeSpeakerForConsult(destination)\n                .then(() => {\n                    console.log('changed active speaker for consult', {\n                        destination\n                    });\n                    this.set('speaker', destination.toLowerCase());\n                })\n                .catch(error => {\n                    console.error('failed to change active speaker for consult', {\n                        error\n                    });\n                });\n        },\n\n        cancelConsult() {\n            if (!this.canUpdateConsult) {\n                return;\n            }\n            this.phone\n                .endConsult()\n                .then(() => {\n                    this.notifyPropertyChange('conversation.onConsult');\n                })\n                .catch(error => {\n                    console.error('error cancelling consult', {\n                        error\n                    });\n                });\n        },\n\n        finishConsult() {\n            if (!this.canUpdateConsult) {\n                return;\n            }\n            this.set('transferring', true);\n            this.phone._endCall(this.get('phone.activeCall')).then(() => {\n                later(() => {\n                    if (!this.isDestroyed && !this.isDestroying) {\n                        this.set('transferring', false);\n                        this.notifyPropertyChange('conversation.onConsult');\n                    }\n                }, 2000);\n            });\n        }\n    },\n\n    consultParty: computed('conversation.otherParties.[]', function () {\n        const parties = this.get('conversation.callParties') || [];\n        return parties.find(party => {\n            if (party.attributes && party.attributes.consultInitiator === 'true') {\n                return true;\n            }\n            return party.id === party.consultParticipantId;\n        });\n    }),\n\n    otherParty: computed('consultParty', function () {\n        const consultParty = this.consultParty;\n        const parties = this.get('conversation.otherParties.[]') || [];\n        if (!consultParty) {\n            return null;\n        }\n        return parties.find(party => party.id !== consultParty.id);\n    }),\n\n    isSpeakerConsultParty: computed('speaker', 'consultParty.calls', function () {\n        if (this.speaker) {\n            return this.speaker === 'object';\n        }\n        const call = _.head(this.get('consultParty.calls'));\n        return call && !call.confined;\n    }),\n\n    bothSpeaking: computed('speaker', 'consultParty.calls', 'otherParty.calls', function () {\n        if (this.speaker) {\n            return this.speaker === 'both';\n        }\n        const consultParty = _.head(this.get('consultParty.calls'));\n        const otherParty = _.head(this.get('otherParty.calls'));\n        return consultParty && otherParty && !consultParty.confined && !otherParty.confined;\n    }),\n\n    canUpdateConsult: equal('conversation.myself.attributes.consultInitiator', 'true')\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"iS77VN50\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[10,0],[15,0,[29,[\\\"consult-heading \\\",[52,[33,2],\\\"transferring\\\"],\\\" \\\",[52,[33,3,[\\\"isDisconnected\\\"]],\\\"hungup\\\"]]]],[12],[1,\\\"\\\\n\\\"],[41,[33,3,[\\\"onCall\\\"]],[[[1,\\\"            \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-purecloud\\\"],[24,4,\\\"button\\\"],[4,[38,4],[[30,0],\\\"finishConsult\\\"],null],[12],[1,\\\"\\\\n\\\"],[41,[33,2],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[1,[28,[35,5],[\\\"purecloud.transfer.default\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"consult-participants\\\"],[12],[1,\\\"\\\\n    \\\"],[11,0],[16,0,[29,[\\\"consult-party\\\\n            \\\",[52,[33,1],\\\"clickable\\\"],\\\"\\\\n            \\\",[52,[33,6],\\\"speaker\\\"],\\\"\\\\n            \\\",[52,[33,7],\\\"speaker\\\"],\\\"\\\\n            \\\"]]],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[4,[38,4],[[30,0],\\\"changeSpeaker\\\",\\\"OBJECT\\\"],null],[12],[1,\\\"\\\\n\\\\n        \\\"],[1,[28,[35,8],null,[[\\\"participant\\\",\\\"showPresence\\\"],[[33,9],true]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[11,0],[16,0,[29,[\\\"other-party\\\\n            \\\",[52,[33,1],\\\"clickable\\\"],\\\"\\\\n            \\\",[52,[51,[33,6]],\\\"speaker\\\"],\\\"\\\\n            \\\",[52,[33,7],\\\"speaker\\\"],\\\"\\\\n            \\\"]]],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[4,[38,4],[[30,0],\\\"changeSpeaker\\\",\\\"DESTINATION\\\"],null],[12],[1,\\\"\\\\n\\\\n        \\\"],[1,[28,[35,8],null,[[\\\"participant\\\",\\\"showPresence\\\"],[[33,11],true]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,1],[[[1,\\\"        \\\"],[11,0],[24,0,\\\"end-consult clickable\\\"],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[28,[37,5],[\\\"purecloud.acdInteraction.endCall\\\"],null]],[4,[38,4],[[30,0],\\\"cancelConsult\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/close-x\\\"],[15,\\\"screenreader-text\\\",[28,[37,5],[\\\"purecloud.acdInteraction.endCall\\\"],null]],[12],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[11,0],[16,0,[29,[\\\"speak-all clickable \\\",[52,[33,7],\\\"both\\\"]]]],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[4,[38,4],[[30,0],\\\"changeSpeaker\\\",\\\"BOTH\\\"],null],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/phone\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[10,1],[12],[1,[28,[35,5],[\\\"common.all\\\"],null]],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13]],[],false,[\\\"if\\\",\\\"canUpdateConsult\\\",\\\"transferring\\\",\\\"conversation\\\",\\\"action\\\",\\\"t\\\",\\\"isSpeakerConsultParty\\\",\\\"bothSpeaking\\\",\\\"call-participant\\\",\\\"consultParty\\\",\\\"unless\\\",\\\"otherParty\\\"]]\",\"moduleName\":\"web-directory/components/consult-transfer/template.hbs\",\"isStrictMode\":false});","import { readOnly, reads, map, filterBy, bool, or, not } from '@ember/object/computed';\nimport Component from '@ember/component';\nimport { computed, get, observer } from '@ember/object';\nimport ObjectProxy from '@ember/object/proxy';\nimport { debounce } from '@ember/runloop';\nimport { inject } from '@ember/service';\nimport { task, timeout } from 'ember-concurrency';\nimport LoggerMixin from '../../mixins/logger';\nimport { GENESYS_SEARCH_TAB } from '../../services/phone-integrations';\n\nexport default Component.extend(LoggerMixin, {\n    classNameBindings: [':conversation-controls', 'small:small:large'],\n\n    phone: inject('phone'),\n    addressformat: inject('addressformat'),\n    session: inject('session'),\n    phoneIntegrations: inject(), // contain all integrations\n    integrationsPresence: inject('integrations-presence'),\n    interaction: inject('interaction'),\n    permissions: inject('permissions'),\n    notification: inject('notification'),\n    intl: inject('intl'),\n    communication: inject('communication'),\n    /**\n     * The current authenticated user from the session service\n     */\n    authUser: readOnly('session.publicApiUser'),\n\n    /**\n     * The participant to transfer the conversation to\n     */\n    transferToParticipant: null,\n\n    /**\n     * The current search value of the transfer to participant workflow.\n     */\n    transferInputValue: null,\n\n    canTransferToVoicemail: readOnly('permissions.canViewDirectTransferToVoicemail'),\n\n    conversation: null,\n    toggleTransfer: null,\n    small: false,\n    showDropdown: false,\n    transferNumber: null,\n    transferPerson: null,\n    isSecurePauseLoading: false,\n\n    conversationsArray: reads('phone.eligibleCallsToMerge'),\n    conferenceEnabled: computed('phone.conferenceEnabled', 'isCoaching', 'isMonitoring', function () {\n        if (this.isCoaching || this.isMonitoring) {\n            return false;\n        }\n\n        return this.get('phone.conferenceEnabled');\n    }),\n\n    proxiedModel: map('conversationsArray', function (model) {\n        return ObjectProxy.create({\n            content: model,\n            checked: false\n        });\n    }),\n    proxiedCheckedItems: filterBy('proxiedModel', 'checked', true),\n    eligibleCallsToMerge: computed('conversationsArray.[]', function () {\n        return this.get('conversationsArray.length') > 0;\n    }),\n    isConnected: reads('conversation.isConnected'),\n    isMonitoring: bool('phone.activeCall.myselfIsMonitor'),\n    isCoaching: bool('phone.activeCall.myselfIsCoach'),\n    showTransfer: false,\n    showConversationControlsMenu: true,\n    showDialpad: false,\n    showMergeMenu: false,\n    showAddParticipants: false,\n    showDTMFDialpadDropdown: false,\n    shouldShowDTMFDialpadButton: computed('isHeld', 'dialpadShouldSendDtmf', function () {\n        return !this.isHeld && this.dialpadShouldSendDtmf;\n    }),\n    holdButtonDisabled: computed('conversation.isConnected', function () {\n        return !this.get('conversation.isConnected');\n    }),\n\n    isHeld: readOnly('conversation.isHeld'),\n\n    canBlindTransfer: readOnly('permissions.canBlindTransfer'),\n    canBlindTransferAgent: readOnly('permissions.canBlindTransferAgent'),\n    canBlindTransferQueue: readOnly('permissions.canBlindTransferQueue'),\n    canBlindTransferExternal: readOnly('permissions.canBlindTransferExternal'),\n    canConsultTransfer: readOnly('permissions.canConsultTransfer'),\n    canConsultTransferAgent: readOnly('permissions.canConsultTransferAgent'),\n    canConsultTransferQueue: readOnly('permissions.canConsultTransferQueue'),\n    canConsultTransferExternal: readOnly('permissions.canConsultTransferExternal'),\n\n    /**\n     * User needs at least one of the following permissions to be able to transfer\n     */\n    canTransfer: or(\n        'canBlindTransfer',\n        'canBlindTransferAgent',\n        'canBlindTransferQueue',\n        'canBlindTransferExternal',\n        'canConsultTransfer',\n        'canConsultTransferAgent',\n        'canConsultTransferQueue',\n        'canConsultTransferExternal'\n    ),\n    excludeFilters: computed(\n        'permissions.{canBlindTransferExternal,canBlindTransferAgent,canBlindTransferQueue,canConsultTransferAgent,canConsultTransferQueue,canConsultTransferExternal}',\n        function () {\n            const filtersToExclude = [];\n            const shouldExcludeQueues = !this.canBlindTransferQueue && !this.canConsultTransferQueue;\n            const shouldExcludeAgents = !this.canBlindTransferAgent && !this.canConsultTransferAgent;\n            const shouldExcludeExternals = !this.canBlindTransferExternal && !this.canConsultTransferExternal;\n\n            if (shouldExcludeAgents) {\n                filtersToExclude.push('user');\n            }\n\n            if (shouldExcludeQueues) {\n                filtersToExclude.push('queue');\n            }\n\n            if (shouldExcludeExternals) {\n                filtersToExclude.push('external');\n            }\n\n            return filtersToExclude;\n        }\n    ),\n\n    canBlindTransferSelectedParticipant: computed(\n        'transferToParticipant',\n        'permissions.{canBlindTransfer,canBlindTransferAgent,canBlindTransferExternal,canBlindTransferQueue}',\n        function () {\n            const participant = this.transferToParticipant;\n            if (!participant) {\n                return false;\n            }\n            const canBlindTransfer = this.canBlindTransfer;\n            const canBlindTransferAgent = this.canBlindTransferAgent;\n            const canBlindTransferExternal = this.canBlindTransferExternal;\n            const canBlindTransferQueue = this.canBlindTransferQueue;\n            switch (get(participant, 'entity.type')) {\n                case 'external':\n                    return canBlindTransferExternal;\n                case 'queue':\n                    return canBlindTransferQueue;\n                default:\n                    return canBlindTransfer || canBlindTransferAgent;\n            }\n        }\n    ),\n    canConsultTransferSelectedParticipant: computed(\n        'transferToParticipant',\n        'permissions.{canConsultTransfer,canConsultTransferAgent,canConsultTransferExternal,canConsultTransferQueue}',\n        function () {\n            const participant = this.transferToParticipant;\n            if (!participant) {\n                return false;\n            }\n            const canConsultTransfer = this.canConsultTransfer;\n            const canConsultTransferAgent = this.canConsultTransferAgent;\n            const canConsultTransferExternal = this.canConsultTransferExternal;\n            const canConsultTransferQueue = this.canConsultTransferQueue;\n            switch (get(participant, 'entity.type')) {\n                case 'external':\n                    return canConsultTransferExternal;\n                case 'queue':\n                    return canConsultTransferQueue;\n                default:\n                    return canConsultTransfer || canConsultTransferAgent;\n            }\n        }\n    ),\n\n    onMultipleCalls: readOnly('phone.onMultipleCalls'),\n\n    activeIntegrationTab: GENESYS_SEARCH_TAB,\n\n    /**\n     * @deprecated\n     *\n     * Ember observers should not be used.\n     */\n    resetConversationsMenu: observer('showDropdown', function () {\n        if (this.showDropdown === false) {\n            this.clearOtherPanels();\n            this.set('showConversationControlsMenu', true);\n        }\n    }),\n\n    isRecording: readOnly('conversation.isRecording'),\n\n    haveTransferValue: or('transferToParticipant', 'transferInputValue'),\n\n    isFlagged: bool('conversation.myself.flaggedReason'),\n\n    canSecurePause: computed(\n        'phone.activeCall.isConnected',\n        'permissions.canSecurePause',\n        'isMonitoring',\n        'isCoaching',\n        'isRecording',\n        'conversation.securePause',\n        'conversation.recordingState',\n        function () {\n            const aRecordingIsActive = this.get('conversation.recordingState') !== 'none';\n            const isCallConnected = this.get('phone.activeCall.isConnected');\n            const hasSecurePausePermission = this.get('permissions.canSecurePause');\n            const isNotInMonitoringOrCoaching = !(this.get('isMonitoring') || this.get('isCoaching'));\n            return aRecordingIsActive && isCallConnected && hasSecurePausePermission && isNotInMonitoringOrCoaching;\n        }\n    ),\n\n    canRecord: computed('conversation.recordingState', 'phone.canRecord', function () {\n        const canRecord = this.get('phone.canRecord');\n        const isPaused = this.get('conversation.recordingState') === 'paused';\n        return canRecord && !isPaused;\n    }),\n\n    isSecurePauseEnd: not('conversation.securePause'),\n\n    /**\n     * `true` if the conversation.participants array is non-empty\n     */\n    conversationHasActiveParticipants: bool('conversation.participants.[].length'),\n\n    clearOtherPanels() {\n        this.set('showTransfer', false);\n        this.set('showConversationControlsMenu', false);\n        this.set('showDialpad', false);\n        this.set('showMergeMenu', false);\n        this.set('showDtmfDialpad', false);\n        this.set('showAddParticipants', false);\n    },\n\n    toggleSecurePauseTask: task(function* () {\n        yield timeout(1000); // 1 second throttle\n\n        const isSecurePauseEnd = this.isSecurePauseEnd;\n        const securePauseLoadingState = isSecurePauseEnd ? 'starting' : 'ending';\n        const conversation = this.conversation;\n\n        if (!conversation) return;\n\n        this.set('conversation.type', 'call');\n        this.set('isSecurePauseLoading', true);\n\n        try {\n            if (isSecurePauseEnd) {\n                yield this.communication.pause(conversation);\n            } else {\n                yield this.communication.unpause(conversation);\n            }\n        } catch (error) {\n            const conversationParticipantIds = conversation.participants.map(p => p.id);\n            this.logger.error(\n                `Conversation Controls - There was an error ${securePauseLoadingState} the secure pause interaction`,\n                {\n                    remoteData: {\n                        error,\n                        pausing: !isSecurePauseEnd,\n                        recordingState: conversation.recordingState,\n                        conversationId: conversation.id,\n                        conversationType: conversation.type,\n                        participants: conversationParticipantIds\n                    }\n                }\n            );\n            this._displayError('purecloud.securePause.error');\n        } finally {\n            this.set('isSecurePauseLoading', false);\n        }\n    }).restartable(),\n\n    flagInteraction: task(function* (conversation) {\n        yield timeout(250);\n        if (conversation) {\n            yield this.phoneService.flagActiveInteraction('flag', conversation).catch(() => {});\n        }\n    }).restartable(),\n\n    unflagInteraction: task(function* (conversation) {\n        yield timeout(250);\n        if (conversation) {\n            yield this.phoneService.flagActiveInteraction('unflag', conversation).catch(() => {});\n        }\n    }).restartable(),\n\n    /**\n     * Invoked when a new participant has been selected (or removed) and formats it\n     * for the transfer\n     *\n     * @param target the new value to set the participant property to\n     */\n    _onTransferDataSelected(target) {\n        let participant = null;\n        if (target) {\n            const id = get(target, 'id');\n            const phoneNumber = get(target, 'phoneNumber') || get(target, 'bestPhoneNumber');\n\n            if (id) {\n                const type = get(target, 'type');\n                participant = {\n                    entity: type === 'external' ? { type } : target,\n                    externalOrganization: get(target, 'externalOrganization'),\n                    id: get(target, 'id'),\n                    name: get(target, 'name') || phoneNumber,\n                    type\n                };\n\n                if (type === 'external') {\n                    const rawPhoneType = get(target, 'getRawPhoneType');\n                    if (typeof rawPhoneType === 'function') {\n                        const phoneType = rawPhoneType.call(target);\n\n                        //function to format key: 'workPhone' => 'WorkPhone'\n                        const formatKey = function (key) {\n                            if (!key) return '';\n                            return key.charAt(0).toUpperCase() + key.slice(1);\n                        };\n\n                        if (phoneType && get(participant, 'id')) {\n                            participant['contactId'] = get(participant, 'id');\n                            participant['phoneType'] = formatKey(phoneType);\n                        }\n                    } else {\n                        this.logger.error('<component/conversation-controls>: getRawPhoneType not found');\n                        if (get(participant, 'id')) {\n                            participant['contactId'] = get(participant, 'id');\n                            participant['phoneType'] = 'CellPhone'; //Default fallback in error case\n                        }\n                    }\n                }\n            } else {\n                participant = {\n                    name: phoneNumber,\n                    value: phoneNumber || id\n                };\n            }\n        }\n        this.set('transferToParticipant', participant);\n    },\n\n    _onVoiceMailTransferSelected(selectedUser) {\n        if (!this.canTransferToVoicemail) {\n            return;\n        }\n        const participantToTransfer = this.get('conversation.participants').find(\n            p => p.userId === this.get('session.person.id')\n        );\n        try {\n            this.phone.transferToVoicemail(\n                selectedUser.get('id'),\n                participantToTransfer.id,\n                this.get('conversation.id')\n            );\n        } catch (error) {\n            const title = this.intl.t('purecloud.acdInteraction.voicemail.errors.error');\n            const message = this.intl.t('purecloud.acdInteraction.voicemail.errors.failedTransfer');\n            this.notification.error(title, message);\n        }\n    },\n\n    _displayApiError(error, fallbackMessageKey) {\n        const code = get(error, 'responseJSON.code');\n        const errorKey = code && `error.${code}`;\n        const messageKey = errorKey && this.intl.exists(errorKey) ? errorKey : fallbackMessageKey;\n        const message = this.intl.t(messageKey).toString();\n        const title = this.intl.t('notification.titles.callError');\n        this.notification.error(title, message, {});\n    },\n\n    actions: {\n        /**\n         * Invoked when the user selects a participant to transfer to within the transferring\n         * workflow of a conversation.\n         */\n        onTransferDataSelected(participant) {\n            this._onTransferDataSelected(participant);\n        },\n\n        onVoiceMailTransferSelected(participant) {\n            this._onVoiceMailTransferSelected(participant);\n        },\n\n        setCheckStateOnRow(item) {\n            debounce(\n                this,\n                function () {\n                    item.toggleProperty('checked');\n                },\n                200\n            );\n        },\n        cancel() {\n            this.clearOtherPanels();\n            this.set('showConversationControlsMenu', true);\n        },\n        changeState(state) {\n            this.phone[state](this.conversation);\n        },\n        addParticipant() {\n            this.sendAction('addParticipant');\n        },\n        merge() {\n            const numberOfCalls = this.get('phone.activeConversations.length');\n            if (numberOfCalls === 2) {\n                this.phone.mergeCalls(this.get('phone.activeConversations'));\n                this.set('showDropdown', false);\n            } else if (numberOfCalls > 2) {\n                this.clearOtherPanels();\n                this.set('showMergeMenu', true);\n            }\n        },\n        mergeCalls() {\n            const callsToMerge = [];\n\n            (this.proxiedCheckedItems || []).forEach(call => callsToMerge.push(call.content));\n            callsToMerge.push(this.get('phone.activeCall'));\n\n            this.phone.mergeCalls(callsToMerge);\n            this.set('showDropdown', false);\n        },\n        transfer() {\n            this.clearOtherPanels();\n            this.set('showTransfer', true);\n        },\n        record() {\n            this.sendAction('record');\n        },\n        onToggleSecurePause() {\n            this.toggleSecurePauseTask.perform();\n        },\n        cancelTransfer() {\n            this.set('showDropdown', false);\n            this.set('transferToParticipant', null);\n\n            this.setProperties({\n                transferNumber: null,\n                transferPerson: null\n            });\n        },\n        openDtmfDialPad() {\n            this.clearOtherPanels();\n            this.set('showDtmfDialpad', true);\n        },\n        showDialpad() {\n            this.clearOtherPanels();\n            this.set('showDialpad', true);\n        },\n        showAddParticipants() {\n            this.clearOtherPanels();\n            this.set('showAddParticipants', true);\n        },\n        onCloseDropdown() {\n            this.set('showDropdown', false);\n        },\n\n        /**\n         * Invoked when the user has selected to initiate a transfer of either the `blind` or `consult` type\n         *\n         * @param {'blind' | 'consult'} type what kind of transfer that is occurring\n         */\n        async performTransfer(type) {\n            let promise = undefined;\n            let isIntegrationTransfer = undefined;\n            let integrationKey = undefined;\n\n            let participant = this.transferToParticipant;\n            if (!participant) {\n                return;\n            }\n\n            const havePerson = participant && get(participant, 'entity.type') === 'person';\n            if (havePerson) {\n                const gcPerson = participant.entity;\n                if (this.integrationsPresence._isGCOffline(gcPerson)) {\n                    integrationKey = gcPerson.get('integrationPhone.value.integration');\n                    if (!!integrationKey) {\n                        try {\n                            const integrationTarget = await this.phoneIntegrations.getIntegrationTransferTarget(\n                                participant.entity,\n                                integrationKey\n                            );\n                            if (integrationTarget) {\n                                participant = {\n                                    value: integrationTarget\n                                };\n                                isIntegrationTransfer = true;\n                            }\n                        } catch (err) {\n                            this.logger.warn(\n                                'PBX Transfer: attempted to fetch integration target, but failed. Falling back to participant data.',\n                                {\n                                    err\n                                }\n                            );\n                        }\n                    }\n                }\n            }\n\n            if (type === 'consult') {\n                promise = this.phone.consultTransfer(participant);\n            } else if (type === 'blind') {\n                promise = this.phone.blindTransfer(participant);\n            }\n            const metric = `collaborate-${type === 'consult' ? 'consult' : 'blind'}-transfer`;\n\n            promise\n                .then(() => {\n                    this.set('showDropdown', false);\n                    if (isIntegrationTransfer) {\n                        this.phoneIntegrations.sendNewRelicAction(metric, 'success', integrationKey);\n                    }\n                })\n                .catch(error => {\n                    this.logger.error('Failed to perform transfer', error);\n                    this._displayApiError(error, 'notification.purecloud.transferError');\n                    if (isIntegrationTransfer) {\n                        this.phoneIntegrations.sendNewRelicAction(metric, 'error', integrationKey);\n                    }\n                });\n        },\n        flag() {\n            const conversation = this.conversation;\n            this.flagInteraction.perform(conversation);\n        },\n\n        unflag() {\n            const conversation = this.conversation;\n            this.unflagInteraction.perform(conversation);\n        }\n    }\n}).reopenClass({\n    positionalParams: ['conversation', 'dialpadShouldSendDtmf']\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"ThowCkbK\",\"block\":\"[[[10,0],[14,0,\\\"btn-group\\\"],[12],[1,\\\"\\\\n\\\"],[41,[51,[33,1]],[[[1,\\\"        \\\"],[11,\\\"button\\\"],[16,0,[29,[\\\"btn btn-purecloud btn-mute call-control \\\",[52,[33,3,[\\\"isMuted\\\"]],\\\"active-state\\\"]]]],[16,\\\"aria-label\\\",[52,[33,3,[\\\"isMuted\\\"]],[28,[37,4],[\\\"purecloud.acdInteraction.unmute\\\"],null],[28,[37,4],[\\\"purecloud.acdInteraction.mute\\\"],null]]],[24,4,\\\"button\\\"],[4,[38,5],[[30,0],\\\"changeState\\\",\\\"mute\\\"],null],[12],[1,\\\"\\\\n\\\"],[41,[33,3,[\\\"isMuted\\\"]],[[[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"microphone-disable\\\"],[15,\\\"screenreader-text\\\",[28,[37,4],[\\\"purecloud.acdInteraction.unmute\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"microphone\\\"],[15,\\\"screenreader-text\\\",[28,[37,4],[\\\"purecloud.acdInteraction.mute\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[1,\\\"    \\\"],[11,\\\"button\\\"],[16,0,[29,[\\\"btn btn-purecloud btn-hold call-control \\\",[52,[33,6],\\\"active-state\\\"]]]],[16,\\\"disabled\\\",[36,7]],[16,\\\"aria-label\\\",[52,[33,6],[28,[37,4],[\\\"purecloud.acdInteraction.unhold\\\"],null],[28,[37,4],[\\\"purecloud.acdInteraction.hold\\\"],null]]],[24,4,\\\"button\\\"],[4,[38,5],[[30,0],\\\"changeState\\\",\\\"hold\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"control-pause\\\"],[15,\\\"screenreader-text\\\",[52,[33,6],[28,[37,4],[\\\"purecloud.acdInteraction.unhold\\\"],null],[28,[37,4],[\\\"purecloud.acdInteraction.hold\\\"],null]]],[12],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[51,[33,8]],[[[41,[33,9],[[[6,[39,10],null,[[\\\"showDropdown\\\",\\\"optionalClassNameBindings\\\",\\\"dropdownInfo\\\"],[[33,11],\\\"btn-group call-control\\\",\\\"conversation-controls show dtmf dialpad\\\"]],[[\\\"default\\\"],[[[[1,\\\"                \\\"],[10,\\\"button\\\"],[15,0,[29,[\\\"btn btn-purecloud btn-dialpad call-control menu-selector \\\",[52,[33,6],\\\"disabled\\\"]]]],[15,\\\"aria-label\\\",[28,[37,4],[\\\"purecloud.acdInteraction.dialPad\\\"],null]],[15,\\\"aria-expanded\\\",[52,[28,[37,12],[[33,11],[28,[37,13],[[33,6]],null]],null],\\\"true\\\",\\\"false\\\"]],[15,1,[29,[[36,14],\\\"-dtmf-dialpad\\\"]]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"phone-dialpad\\\"],[15,\\\"screenreader-text\\\",[28,[37,4],[\\\"purecloud.acdInteraction.dialPad\\\"],null]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,14],\\\"-dtmf-dialpad\\\"]]],[14,\\\"placement\\\",\\\"bottom\\\"],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,4],[\\\"purecloud.acdInteraction.dialPad\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,12],[[33,11],[28,[37,13],[[33,6]],null]],null],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"dialpad-dtmf-dropdown communicate\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,15],null,[[\\\"addingParticipants\\\",\\\"showTitle\\\",\\\"showCallInput\\\",\\\"showDialpad\\\",\\\"sendDtmf\\\"],[false,false,false,[33,11],true]]]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]]]]],[]],null]],[]],null],[1,\\\"\\\\n\\\"],[41,[51,[33,8]],[[[41,[51,[33,3,[\\\"onConsult\\\"]]],[[[6,[39,10],null,[[\\\"showDropdown\\\",\\\"optionalClassNameBindings\\\",\\\"dropdownInfo\\\"],[[33,16],\\\"btn-group call-control\\\",\\\"conversation-controls conversation not consult\\\"]],[[\\\"default\\\"],[[[[1,\\\"                \\\"],[10,\\\"button\\\"],[14,0,\\\"btn btn-purecloud menu-selector conversation-control-dropdown call-control\\\"],[15,\\\"aria-label\\\",[28,[37,4],[\\\"common.more\\\"],null]],[15,\\\"aria-expanded\\\",[29,[[36,16]]]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"arrow-solid-down\\\"],[15,\\\"screenreader-text\\\",[28,[37,4],[\\\"common.more\\\"],null]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\\n                \\\"],[10,\\\"ul\\\"],[15,0,[29,[\\\"menu dropdown-menu \\\",[52,[33,16],\\\"show-dropdown\\\"]]]],[12],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"arrow\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[10,0],[15,0,[29,[\\\"controls-menu \\\",[52,[51,[33,17]],\\\"hide\\\"]]]],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,12],[[33,18,[\\\"dtmf\\\"]],[28,[37,13],[[33,9]],null]],null],[[[1,\\\"                            \\\"],[10,\\\"li\\\"],[14,0,\\\"show-dtmf-dialpad\\\"],[12],[1,\\\"\\\\n                                \\\"],[11,3],[24,6,\\\"#\\\"],[4,[38,5],[[30,0],\\\"openDtmfDialPad\\\"],null],[12],[1,[28,[35,4],[\\\"purecloud.openDialpad\\\"],null]],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,19],[[[1,\\\"                            \\\"],[10,\\\"li\\\"],[14,0,\\\"record\\\"],[12],[1,\\\"\\\\n                                \\\"],[11,3],[24,6,\\\"#\\\"],[4,[38,5],[[30,0],\\\"record\\\"],null],[12],[1,\\\"\\\\n\\\"],[41,[33,20],[[[1,\\\"                                        \\\"],[1,[28,[35,4],[\\\"purecloud.recording.stopRecording\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                        \\\"],[1,[28,[35,4],[\\\"purecloud.recording.startRecording\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                                \\\"],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,21],[[[1,\\\"                            \\\"],[10,\\\"li\\\"],[14,0,\\\"secure-pause\\\"],[12],[1,\\\"\\\\n                                \\\"],[11,3],[24,6,\\\"#\\\"],[4,[38,5],[[30,0],\\\"onToggleSecurePause\\\"],null],[12],[1,\\\"\\\\n\\\"],[41,[33,22],[[[1,\\\"                                        \\\"],[1,[28,[35,4],[[52,[33,23],\\\"purecloud.securePause.startingSecurePause\\\",\\\"purecloud.securePause.endingSecurePause\\\"]],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                        \\\"],[1,[28,[35,4],[[52,[33,23],\\\"purecloud.securePause.startSecurePause\\\",\\\"purecloud.securePause.endSecurePause\\\"]],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                                \\\"],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,24],[[[1,\\\"                            \\\"],[10,\\\"li\\\"],[14,0,\\\"add-participant\\\"],[12],[1,\\\"\\\\n                                \\\"],[11,3],[24,6,\\\"#\\\"],[4,[38,5],[[30,0],\\\"showAddParticipants\\\"],null],[12],[1,[28,[35,4],[\\\"purecloud.addParticipant\\\"],null]],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,25],[[[41,[51,[28,[37,26],[[33,3,[\\\"onConference\\\"]],[33,1],[33,27]],null]],[[[41,[51,[33,3,[\\\"onConsult\\\"]]],[[[1,\\\"                                    \\\"],[10,\\\"li\\\"],[14,0,\\\"transfer\\\"],[12],[1,\\\"\\\\n                                        \\\"],[11,3],[24,6,\\\"#\\\"],[4,[38,5],[[30,0],\\\"transfer\\\"],null],[12],[1,[28,[35,4],[\\\"purecloud.transfer.default\\\"],null]],[13],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,12],[[33,24],[33,28],[33,29]],null],[[[1,\\\"                            \\\"],[10,\\\"li\\\"],[14,0,\\\"merge\\\"],[12],[1,\\\"\\\\n                                \\\"],[11,3],[24,6,\\\"#\\\"],[4,[38,5],[[30,0],\\\"merge\\\"],null],[12],[1,[28,[35,4],[\\\"purecloud.merge\\\"],null]],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n                        \\\"],[10,\\\"li\\\"],[14,0,\\\"flag-action\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,26],[[33,30,[\\\"isRunning\\\"]],[33,31,[\\\"isRunning\\\"]]],null],[[[1,\\\"                                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                                \\\"],[1,[28,[35,4],[\\\"purecloud.voiceQualityIssue\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,32],[[[1,\\\"                                    \\\"],[11,3],[24,6,\\\"#\\\"],[4,[38,5],[[30,0],\\\"unflag\\\"],null],[12],[1,\\\"\\\\n                                        \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"unflag-icon\\\"],[14,\\\"icon-name\\\",\\\"flag\\\"],[15,\\\"title\\\",[28,[37,4],[\\\"purecloud.unflagInteraction\\\"],null]],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                                        \\\"],[1,[28,[35,4],[\\\"purecloud.voiceQualityIssue\\\"],null]],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                    \\\"],[11,3],[24,6,\\\"#\\\"],[4,[38,5],[[30,0],\\\"flag\\\"],null],[12],[1,\\\"\\\\n                                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"flag\\\"],[14,0,\\\"flag-icon\\\"],[15,\\\"title\\\",[28,[37,4],[\\\"purecloud.flagInteraction\\\"],null]],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                                        \\\"],[1,[28,[35,4],[\\\"purecloud.voiceQualityIssue\\\"],null]],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[]]],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,0],[15,0,[29,[\\\"dialpad dialpad-dropdown dtmf \\\",[52,[51,[33,33]],\\\"hide\\\"]]]],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,15],null,[[\\\"addingParticipants\\\",\\\"showCallInput\\\",\\\"showDialpad\\\",\\\"sendDtmf\\\"],[false,false,[33,33],true]]]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\\n                    \\\"],[10,0],[15,0,[29,[\\\"merge-menu \\\",[52,[51,[33,34]],\\\"hide\\\"]]]],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,36],[[28,[37,36],[[33,37]],null]],null],null,[[[1,\\\"                            \\\"],[11,0],[24,0,\\\"merge-conversation\\\"],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[4,[38,5],[[30,0],\\\"setCheckStateOnRow\\\",[30,1]],null],[12],[1,\\\"\\\\n\\\\n                                \\\"],[10,\\\"input\\\"],[14,0,\\\"merge-conversation-checkbox\\\"],[15,1,[30,1,[\\\"id\\\"]]],[15,\\\"checked\\\",[30,1,[\\\"checked\\\"]]],[14,4,\\\"checkbox\\\"],[12],[13],[1,\\\"\\\\n\\\\n                                \\\"],[10,\\\"label\\\"],[14,0,\\\"merge-conversation-label\\\"],[15,\\\"for\\\",[30,1,[\\\"id\\\"]]],[12],[1,\\\"\\\\n\\\"],[41,[30,1,[\\\"onConference\\\"]],[[[1,\\\"                                        \\\"],[1,[28,[35,4],[\\\"purecloud.conference\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[41,[30,1,[\\\"otherPartyModel\\\"]],[[[1,\\\"                                            \\\"],[1,[30,1,[\\\"otherPartyModel\\\",\\\"name\\\"]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                            \\\"],[1,[28,[35,38],[[30,1,[\\\"otherPartyNumber\\\"]]],null]],[1,\\\"\\\\n\\\"]],[]]]],[]]],[1,\\\"                                \\\"],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"\\\\n                        \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-purecloud btn-merge-calls\\\"],[24,4,\\\"button\\\"],[4,[38,5],[[30,0],\\\"mergeCalls\\\"],null],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,4],[\\\"purecloud.merge\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\\n                        \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link btn-cancel\\\"],[24,4,\\\"button\\\"],[4,[38,5],[[30,0],\\\"cancel\\\"],null],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,4],[\\\"common.close\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\\n                    \\\"],[10,0],[15,0,[29,[\\\"dialpad dialpad-dropdown add-participants \\\",[52,[51,[33,39]],\\\"hide\\\"]]]],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,15],null,[[\\\"addingParticipants\\\",\\\"showDialpad\\\",\\\"actionClose\\\",\\\"bypassPermissions\\\"],[true,true,[28,[37,5],[[30,0],\\\"onCloseDropdown\\\"],null],true]]]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\\n                    \\\"],[10,0],[15,0,[29,[\\\"call-search \\\",[52,[51,[33,40]],\\\"hide\\\"]]]],[12],[1,\\\"\\\\n\\\"],[1,\\\"                        \\\"],[10,0],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,41],null,[[\\\"autofocus\\\",\\\"authUser\\\",\\\"interactionType\\\",\\\"value\\\",\\\"searchValue\\\",\\\"placeholder\\\",\\\"clearTranslation\\\",\\\"targetSelected\\\",\\\"showDirectTransferToVoicemailDropdown\\\",\\\"conversationHasActiveParticipants\\\",\\\"excludeFilters\\\",\\\"transferToVoicemailClick\\\"],[true,[33,42],\\\"call\\\",[33,43],[33,44],[28,[37,4],[\\\"purecloud.searchEntryNameOrQueueSentenceCase\\\"],null],[28,[37,4],[\\\"purecloud.clearEntryNameOrQueueSentenceCase\\\"],null],[28,[37,5],[[30,0],\\\"onTransferDataSelected\\\"],null],[33,45],[33,46],[33,47],[28,[37,5],[[30,0],\\\"onVoiceMailTransferSelected\\\"],null]]]]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,48],[[[1,\\\"                            \\\"],[10,0],[14,0,\\\"btn-group\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,49],[[[1,\\\"                                    \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-purecloud btn-blind-transfer\\\"],[16,\\\"disabled\\\",[28,[37,13],[[33,43]],null]],[16,\\\"data-t\\\",[29,[[28,[37,4],[\\\"purecloud.transfer.blind\\\"],null],\\\"-btn\\\"]]],[16,\\\"aria-label\\\",[28,[37,4],[\\\"purecloud.transfer.blind\\\"],null]],[24,4,\\\"button\\\"],[4,[38,5],[[30,0],\\\"performTransfer\\\",\\\"blind\\\",[33,50,[\\\"key\\\"]]],null],[12],[1,\\\"\\\\n                                        \\\"],[1,[28,[35,4],[\\\"purecloud.transfer.blind\\\"],null]],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,51],[[[1,\\\"                                    \\\"],[11,\\\"button\\\"],[16,\\\"disabled\\\",[28,[37,13],[[33,43]],null]],[24,0,\\\"btn btn-purecloud btn-consult-transfer\\\"],[16,\\\"data-t\\\",[29,[[28,[37,4],[\\\"purecloud.transfer.consult\\\"],null],\\\"-btn\\\"]]],[16,\\\"aria-label\\\",[28,[37,4],[\\\"purecloud.transfer.consult\\\"],null]],[24,4,\\\"button\\\"],[4,[38,5],[[30,0],\\\"performTransfer\\\",\\\"consult\\\",[33,50,[\\\"key\\\"]]],null],[12],[1,\\\"\\\\n                                        \\\"],[1,[28,[35,4],[\\\"purecloud.transfer.consult\\\"],null]],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                        \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"btn btn-link btn-cancel-transfer\\\"],[4,[38,5],[[30,0],\\\"cancelTransfer\\\"],null],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,4],[\\\"common.cancel\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]]],[]],null]],[]],null],[1,\\\"\\\\n\\\"],[1,\\\"    \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-purecloud btn-hangup call-control\\\"],[16,\\\"aria-label\\\",[28,[37,4],[\\\"purecloud.acdInteraction.endCall\\\"],null]],[24,4,\\\"button\\\"],[4,[38,5],[[30,0],\\\"changeState\\\",\\\"endCall\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/phone-hangup\\\"],[15,\\\"screenreader-text\\\",[28,[37,4],[\\\"purecloud.acdInteraction.endCall\\\"],null]],[12],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[\\\"conversation\\\"],false,[\\\"unless\\\",\\\"isMonitoring\\\",\\\"if\\\",\\\"conversation\\\",\\\"t\\\",\\\"action\\\",\\\"isHeld\\\",\\\"holdButtonDisabled\\\",\\\"small\\\",\\\"dialpadShouldSendDtmf\\\",\\\"drop-down\\\",\\\"showDTMFDialpadDropdown\\\",\\\"and\\\",\\\"not\\\",\\\"elementId\\\",\\\"dial-pad\\\",\\\"showDropdown\\\",\\\"showConversationControlsMenu\\\",\\\"phone\\\",\\\"canRecord\\\",\\\"isRecording\\\",\\\"canSecurePause\\\",\\\"isSecurePauseLoading\\\",\\\"isSecurePauseEnd\\\",\\\"conferenceEnabled\\\",\\\"canTransfer\\\",\\\"or\\\",\\\"isCoaching\\\",\\\"eligibleCallsToMerge\\\",\\\"isConnected\\\",\\\"flagInteraction\\\",\\\"unflagInteraction\\\",\\\"isFlagged\\\",\\\"showDtmfDialpad\\\",\\\"showMergeMenu\\\",\\\"each\\\",\\\"-track-array\\\",\\\"proxiedModel\\\",\\\"await\\\",\\\"showAddParticipants\\\",\\\"showTransfer\\\",\\\"single-select-target-dropdown\\\",\\\"authUser\\\",\\\"transferToParticipant\\\",\\\"transferInputValue\\\",\\\"canTransferToVoicemail\\\",\\\"conversationHasActiveParticipants\\\",\\\"excludeFilters\\\",\\\"haveTransferValue\\\",\\\"canBlindTransferSelectedParticipant\\\",\\\"activeIntegrationTab\\\",\\\"canConsultTransferSelectedParticipant\\\"]]\",\"moduleName\":\"web-directory/components/conversation-controls/template.hbs\",\"isStrictMode\":false});","// For CEF:\n// _HostedContextFunctions functions:\n// - register(initData)\n// - showNotification(messageData)\n// - setUnreadMessageCount(count)\n// - doTerminateNow()\n\nimport { setOwner } from '@ember/application';\nimport { deprecate } from '@ember/debug';\nimport Component from '@ember/component';\nimport { get } from '@ember/object';\nimport { cancel, later, run } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport { isHTMLSafe } from '@ember/template';\nimport BrowserUtils from 'web-directory/utils/browser';\nimport { emojifyMarkdown, emojifyString } from 'web-directory/utils/emoji';\nimport { isAcdJid } from 'web-directory/utils/jid-helpers';\nimport debounce from 'lodash/debounce';\nimport Notify from 'notifyjs';\nimport { Promise } from 'rsvp';\nimport { markdownToHtml } from 'web-directory/utils/markdown';\n// import Messenger from 'web-directory/utils/messenger';\nimport layout from './template';\n\nconst Messenger = window.Messenger;\nexport const LocalMessenger = new Messenger({\n    extraClasses: 'messenger-fixed messenger-on-top messenger-on-right',\n    theme: 'ice'\n});\n\nconst ANNOUNCEMENT_DELAY = 100;\n\nfunction createAnnouncerRegion(role) {\n    const region = document.createElement('div');\n    region.classList.add('sr-only', 'desktop-notification-announcer', `desktop-notification-announcer-${role}`);\n    region.setAttribute('role', role);\n    region.setAttribute('aria-atomic', 'true');\n    document.body.appendChild(region);\n    return region;\n}\n\n/**\n * Screen readers stay silent when a live region is given text it is already\n * holding, which silences every toast after the first when the same message is\n * shown again. Each politeness level therefore owns a pair of regions that are\n * written to in turn, so a repeated message always lands in a region the screen\n * reader last observed as empty.\n */\nfunction createToastAnnouncer(role) {\n    return {\n        regions: [createAnnouncerRegion(role), createAnnouncerRegion(role)],\n        nextRegionIndex: 0,\n        pendingTimer: null\n    };\n}\n\nconst toastStatusAnnouncer = createToastAnnouncer('status');\nconst toastAlertAnnouncer = createToastAnnouncer('alert');\n\nfunction clearAnnouncer(announcer) {\n    cancel(announcer.pendingTimer);\n    announcer.pendingTimer = null;\n    announcer.regions.forEach(region => {\n        region.textContent = '';\n    });\n}\n\nexport function resetToastAnnouncers() {\n    [toastStatusAnnouncer, toastAlertAnnouncer].forEach(announcer => {\n        clearAnnouncer(announcer);\n        announcer.nextRegionIndex = 0;\n    });\n}\n\nfunction announceToast(type, message) {\n    if (!message) {\n        return;\n    }\n\n    const announcer = type === 'error' ? toastAlertAnnouncer : toastStatusAnnouncer;\n\n    // A queued announcement would otherwise be overwritten before assistive\n    // technology reads it, so drop it in favour of the newer message.\n    clearAnnouncer(announcer);\n\n    const region = announcer.regions[announcer.nextRegionIndex];\n    announcer.nextRegionIndex = (announcer.nextRegionIndex + 1) % announcer.regions.length;\n\n    // Let the emptied region settle so the write is observed as a distinct update.\n    announcer.pendingTimer = later(() => {\n        announcer.pendingTimer = null;\n        region.textContent = message;\n    }, ANNOUNCEMENT_DELAY);\n}\n\nconst PERMANENT_NOTIFICATION_TYPES = ['error', 'not-responding-message', 'select-phone-message'];\n\nlet DesktopNotificationComponent;\nDesktopNotificationComponent = Component.extend({\n    layout,\n\n    intl: service('intl'),\n    sound: service(),\n    preferences: service(),\n\n    needsServices: ['chat'],\n    title: ' ',\n    message: '',\n    rawMessage: '',\n    icon: '',\n    tag: '',\n    type: 'info',\n    hideAfter: 5,\n    volume: 1,\n    shouldShowPopup: true,\n    shouldPlaySound: true,\n    showCloseButton: true,\n    fallbackToInBrowser: true,\n    forceBrowserNotification: false,\n    showNotificationEverywhere: false,\n    markdownToHtml: true,\n\n    meta: {},\n    clickHandler: null,\n    notificationOutputDeviceId: null,\n\n    target: null,\n    permission: null,\n    messageStyle: null, // space delimited classes applied at li level\n\n    isPopout: false,\n    // For desktop: `notifyShow`, `notifyClose`, `notifyClick`, `notifyError`\n    // For in-browser: handled by target's `actions` property\n    actionHandlers: {},\n\n    hide() {\n        const notification = this.notification;\n\n        if (notification) {\n            notification.hide();\n            later(() => {\n                const el = this.get('notification.el');\n                if (el) {\n                    el.remove();\n                }\n                this.destroy();\n            });\n        }\n    },\n\n    showNotification: function () {\n        const preferences = this.get('preferences');\n        const hasActionHandlers = Object.keys(this.get('actionHandlers')).length > 0;\n\n        if (this.get('shouldShowPopup') && !this.get('isPopout')) {\n            if (this.get('showNotificationEverywhere')) {\n                if (this.get('canShowNativeChatNotification')) {\n                    this.showBrowserNotification();\n                    return this.showNativeChatNotification();\n                }\n\n                if (!Notify.needsPermission) {\n                    this.showDesktopNotification();\n                }\n\n                this.showBrowserNotification();\n            } else {\n                if (this.canShowNativeChatNotification) {\n                    let cmd = {\n                        cmd: 'getPreferences',\n                        prefs: ['notification_showToast', 'notification_bounceDockIcon', 'notification_flashTaskbar']\n                    };\n                    return new Promise(function (resolve, reject) {\n                        try {\n                            var sCmd = JSON.stringify(cmd);\n                            window.cefQuery({\n                                request: sCmd,\n                                persistent: false,\n                                onSuccess(response) {\n                                    try {\n                                        var obj = JSON.parse(response);\n                                        resolve(obj);\n                                    } catch (e) {\n                                        resolve({});\n                                    }\n                                },\n                                onFailure(response) {\n                                    reject(response);\n                                }\n                            });\n                        } catch (e) {\n                            console.error('DESKTOP-NOTIFICATION: Error requesting desktop promise', {\n                                error: e\n                            });\n                            reject();\n                        }\n                    }).then((notifications = {}) => {\n                        const showToast = !!get(notifications, 'notification_showToast');\n                        const bounceDock = !!get(notifications, 'notification_bounceDockIcon');\n                        const flashTaskbar = !!get(notifications, 'notification_flashTaskbar');\n                        const shouldNotify = showToast || bounceDock || flashTaskbar;\n\n                        const showDesktopNotification =\n                            shouldNotify && !this.forceBrowserNotification && !hasActionHandlers;\n\n                        if (showDesktopNotification) {\n                            this.showNativeChatNotification();\n                        }\n\n                        if (!showToast || hasActionHandlers || this.forceBrowserNotification) {\n                            this.showBrowserNotification();\n                        }\n                    });\n                } else if (\n                    !Notify.needsPermission &&\n                    preferences.get('notifications.global.notify') &&\n                    !hasActionHandlers &&\n                    !this.forceBrowserNotification\n                ) {\n                    this.showDesktopNotification();\n                } else if (this.fallbackToInBrowser && !this.isMobile) {\n                    this.showBrowserNotification();\n                }\n            }\n        }\n\n        if (this.get('shouldPlaySound')) {\n            this.playSound();\n        }\n    },\n\n    _getShouldPlaySound: function () {\n        return this.shouldPlaySound;\n    },\n\n    escapeEntities: function (message) {\n        if (typeof message !== 'string') {\n            return '';\n        }\n        return message\n            .replace(/(<([^>]+)>)/gi, '')\n            .replace(/&quot;/g, '\"')\n            .replace(/&#39;/g, \"'\")\n            .replace(/&lt;/g, '<')\n            .replace(/&gt;/g, '>')\n            .replace(/&amp;/g, '&');\n    },\n\n    // Handles system notifications from the Genesys Cloud Desktop app\n    showNativeChatNotification: function () {\n        window._HostedContextFunctions.showNativeNotification({\n            title: this.escapeEntities(this.title),\n            message: this.escapeEntities(this.message),\n            icon: this.icon,\n            tag: this.tag,\n            type: this.type,\n            hideAfter: this.hideAfter,\n            mute: !this._getShouldPlaySound(),\n            onclick: this.notificationClickHandler(),\n            meta: this.meta\n        });\n    },\n\n    // Handles system notifications from a browser (e.g. Chrome) with desktop notifs enabled\n    showDesktopNotification: function () {\n        let options = {\n            body: this.escapeEntities(this.message),\n            icon: this.icon,\n            tag: this.tag,\n            timeout: this.shouldHide() ? this.hideAfter : void 0,\n            notifyClick: this.notificationClickHandler()\n        };\n\n        options = Object.assign({}, options, this.actionHandlers);\n\n        let title = this.escapeEntities(this.title) || '';\n        let notification = new Notify(title, options);\n        notification.show();\n    },\n\n    shouldHide: function () {\n        // Timeout behavior is built into Safari on Mac with notification center,\n        // providing a hideafter will remove the notification from notification center which is undesirable.\n        return !BrowserUtils.isSafari && this.hideAfter;\n    },\n\n    setupBrowserNotificationMessage: function (message) {\n        let title = (this.title || '').trim();\n        let emojifiedMessage = emojifyString(message);\n\n        if (this.markdownToHtml) {\n            emojifiedMessage = emojifyMarkdown(markdownToHtml(message));\n        }\n\n        let reg = new RegExp(/(?!<code>)<a href/gi);\n        emojifiedMessage = emojifiedMessage.replace(reg, '<a target=\"_blank\" href');\n\n        message = `<span class=\"notification-text\">${emojifiedMessage}</span>`;\n\n        if (title) {\n            message = `<h6>${title}</h6>${message}`;\n        }\n\n        return message;\n    },\n\n    updateBrowserNotification: function (newMessage) {\n        let message = this.setupBrowserNotificationMessage(newMessage);\n        this.notification.update({ message: message });\n    },\n\n    // Handles notifications from a browser that are displayed inside the tab (NOT system wide)\n    showBrowserNotification: function () {\n        const message = this.setupBrowserNotificationMessage(this.rawMessage || this.message);\n        const type = this.type;\n        const tag = this.tag;\n\n        let hideAfter = this.hideAfter;\n\n        if (PERMANENT_NOTIFICATION_TYPES.includes(type)) {\n            hideAfter = false;\n        } else if (this.get('preferences.test.longNotifications')) {\n            hideAfter = 20;\n        }\n\n        const options = {\n            message,\n            type: this.type,\n            showCloseButton: this.showCloseButton,\n            hideAfter,\n            actions: this.getBrowserActions(),\n            id: tag || void 0,\n            events: {\n                click: this.notificationClickHandler(),\n                'click .messenger-close': e => {\n                    // Don't trigger the notificationClickHandler when the close button is clicked\n                    e.stopPropagation();\n                },\n                'click .notification-text .read-more': e => {\n                    e.stopPropagation();\n                },\n                'click .notification-text .read-less': e => {\n                    e.stopPropagation();\n                }\n            }\n        };\n\n        const notification = LocalMessenger.post(options);\n        this.set('notification', notification);\n\n        this.addListClasses();\n        this.addToastAccessibility();\n    },\n\n    notificationClickHandler: function () {\n        let roomJid = this.tag;\n        let target = this.target;\n\n        let isAcd = isAcdJid(roomJid);\n\n        if (this.clickHandler) {\n            return event => {\n                window.focus();\n                this.clickHandler(event);\n            };\n        }\n\n        // TODO: Handle clicks for things not chat.  Temporary fix until a click handler is passed in.\n        if (this.soundId !== 'chat') {\n            return () => {\n                window.focus();\n            };\n        }\n\n        return event => {\n            run(() => {\n                window.focus();\n\n                if (event.target && event.target.matches('button.messenger-close')) {\n                    return;\n                }\n\n                if (this.services.chat.get('connected')) {\n                    if (!isAcd) {\n                        this.services.chat.openRoom(roomJid);\n                    }\n                    this.triggerAction({\n                        action: 'openPanel',\n                        actionContext: isAcd ? ['acdInteractions'] : ['conversations'],\n                        target: target\n                    });\n                }\n            });\n        };\n    },\n\n    playSound: debounce(\n        function () {\n            run(() => {\n                const soundId = this.soundId;\n                const volume = this.volume;\n                const deviceId = this.notificationOutputDeviceId;\n\n                if (soundId) {\n                    this.sound.playSound(soundId, volume, deviceId);\n                }\n            });\n        },\n        500,\n        {\n            leading: true,\n            trailing: false\n        }\n    ),\n\n    getBrowserActions: function () {\n        let actions = {};\n        let target = this.target;\n        if (this.actionHandlers) {\n            for (const [key, value] of Object.entries(this.actionHandlers)) {\n                let label;\n                if (value && typeof value === 'object' && value.label && value.action) {\n                    label = value.label;\n                } else {\n                    label = value;\n                }\n\n                actions[key] = {\n                    label: label,\n                    action: () => {\n                        if (value.action) {\n                            value.action(this);\n                        } else if (target.send) {\n                            target.send(key, this);\n                        } else if (typeof target[key] === 'function') {\n                            target[key](this);\n                        }\n                    }\n                };\n            }\n        }\n\n        return actions;\n    },\n\n    addListClasses() {\n        const classesToAdd = this.messageStyle;\n        const el = this.get('notification.el');\n        if (classesToAdd && el) {\n            classesToAdd.split(' ').forEach(cls => {\n                if (cls) el.classList.add(cls);\n            });\n        }\n    },\n\n    addToastAccessibility() {\n        const el = this.get('notification.el');\n        if (!el) return;\n\n        const anchorEls = el.querySelectorAll('a');\n        anchorEls.forEach(anchor => {\n            if (!anchor.hasAttribute('href')) {\n                anchor.setAttribute('href', '#');\n            }\n        });\n\n        const closeText = this.intl.t('notification.close');\n        const closeBtn = el.querySelector('.messenger-close');\n        if (closeBtn) {\n            closeBtn.setAttribute('aria-label', closeText);\n        }\n\n        const messageEl = el.querySelector('.messenger-message');\n        if (messageEl) {\n            const notificationTextEl = messageEl.querySelector('.notification-text');\n            const title = String(this.title || '').trim();\n            const announcement = [title, notificationTextEl ? notificationTextEl.textContent.trim() : '']\n                .filter(Boolean)\n                .join(' ');\n            announceToast(this.type, announcement);\n        }\n    }\n});\n\nDesktopNotificationComponent.reopenClass({\n    show: function (options, owner, showDeprecation = true) {\n        if (showDeprecation) {\n            deprecate(\n                `Direct access to DesktopNotificationComponent is deprecated. Please use the notification service methods.`,\n                false,\n                {\n                    id: 'directory-core.deprecate-notification-component',\n                    until: '5.0.0',\n                    url: 'https://bitbucket.org/inindca/web-directory/src/develop/DEPRECATIONS.md#markdown-header-notifications-as-component-instead-of-service'\n                }\n            );\n        }\n\n        // Legacy component support for tests -_-\n        if (!owner.hasRegistration('component:desktop-notification')) {\n            owner.register('component:desktop-notification', DesktopNotificationComponent);\n        }\n\n        if (options) {\n            if (isHTMLSafe(options.message)) {\n                options.message = options.message.toString();\n            }\n\n            if (isHTMLSafe(options.title)) {\n                options.title = options.title.toString();\n            }\n        }\n\n        setOwner(options, owner);\n        const notification = owner.lookup('component:desktop-notification');\n        notification.setProperties(options);\n        notification.showNotification();\n        return notification;\n    }\n});\n\nexport default DesktopNotificationComponent;\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"r1jekcrB\",\"block\":\"[[],[],false,[]]\",\"moduleName\":\"web-directory/components/desktop-notification/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport { reads } from '@ember/object/computed';\nimport Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport RSVP from 'rsvp';\nimport AutoSaveDevicesMixin from 'web-directory/mixins/webrtc-service/auto-save-devices';\nimport LocalMedia from 'localmedia';\n\nexport default Component.extend(AutoSaveDevicesMixin, {\n    classNames: ['device-select-preview'],\n\n    previewMedia: null,\n    loading: true,\n    showTroubleshooter: false,\n    fallBackToScreenShareStream: true,\n    errorMessage: null,\n\n    intl: service(),\n    session: service(),\n    webrtc: service(),\n    preferences: service(),\n    application: service(),\n    alerting: service(),\n\n    init() {\n        this._super(...arguments);\n\n        this.webrtc.on('defaultDeviceChange', this, this._handleDeviceChange);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this._handleDeviceChange();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.webrtc.off('defaultDeviceChange', this, this._handleDeviceChange);\n        this._cleanupPreview();\n        this._cleanupLocalMedia();\n    },\n\n    _cleanupPreview() {\n        const media = this.previewMedia;\n        if (media) {\n            media.stop();\n            this.set('previewMedia', null);\n        }\n    },\n\n    _cleanupLocalMedia() {\n        if (this.localMedia) {\n            this.localMedia.stop();\n        }\n    },\n\n    isHosted: reads('application.hostedContext.isHostedProp'),\n\n    mediaOptions: computed('selectedMicrophone', 'selectedCamera', 'screenStream', function () {\n        const options = this.webrtc.getMediaOptions({\n            camera: this.selectedCamera,\n            microphone: this.selectedMicrophone\n        });\n\n        options.screenStream = this.screenStream;\n        return options;\n    }),\n\n    _handleDeviceChange() {\n        this.set('errorMessage', null);\n        this.webrtc\n            .createMedia({ requestVideo: false })\n            .then(media => {\n                this.set('loading', false);\n                this._cleanupPreview(true);\n                this.set('previewMedia', media);\n\n                if (\n                    media &&\n                    media.localStreams &&\n                    media.localStreams.length === 1 &&\n                    media.localStreams[0].getVideoTracks().length\n                ) {\n                    this.webrtc.attachMediaStream(media.localStreams[0], this.$('.preview-video')[0], {\n                        muted: true,\n                        mirror: true\n                    });\n                }\n\n                this.set('audioStream', media.localStreams[0]);\n            })\n            .catch(err => {\n                if (err.name === 'NotAllowedError') {\n                    this.set('errorMessage', this.intl.t('purecloud.webrtcMediaNotAllowedError'));\n                } else {\n                    this.set('errorMessage', this.intl.t('purecloud.webrtcMediaGeneralError'));\n                }\n            });\n    },\n\n    getScreenShareStream() {\n        return new RSVP.Promise((resolve, reject) => {\n            const media = new LocalMedia();\n            this.set('localMedia', media);\n\n            const requestedTime = window.performance.now();\n            media.startScreenShare((err, stream) => {\n                if (err) {\n                    return this.webrtc\n                        .handleScreenShareError(err, requestedTime)\n                        .then(this.getScreenShareStream)\n                        .then(resolve, reject);\n                } else {\n                    return resolve(stream);\n                }\n            });\n        });\n    },\n\n    async showScreenShareConfirmation() {\n        const alerting = this.alerting;\n        const intl = this.intl;\n        const content = intl.safestring('ewc.troubleshootWithScreenStream').toString();\n        const positiveLabel = intl.safestring('ewc.continueWithScreenStream').toString();\n        const negativeLabel = intl.safestring('ewc.continueWithoutScreenStream').toString();\n        const clearSettingsModal = {\n            content: content,\n            size: 'small',\n            buttons: {\n                positive: {\n                    id: 'confirm',\n                    label: positiveLabel\n                },\n                negative: {\n                    id: 'cancel',\n                    label: negativeLabel\n                }\n            }\n        };\n        const modalReturn = await alerting.pushModal(clearSettingsModal);\n        if (modalReturn.buttonId === 'confirm') {\n            this.send('shareScreen');\n        } else if (modalReturn.buttonId === 'cancel') {\n            this.send('dontShareScreen');\n        }\n    },\n\n    actions: {\n        shareScreen() {\n            this.getScreenShareStream()\n                .then(stream => this.set('screenStream', stream))\n                .finally(() => this.set('showTroubleshooter', true));\n        },\n        dontShareScreen() {\n            this.set('showTroubleshooter', true);\n        },\n        done() {\n            this._cleanupLocalMedia();\n        },\n\n        tryTroubleshoot() {\n            if (this.showTroubleshooter) {\n                this.set('showTroubleshooter', false);\n                this._cleanupLocalMedia();\n                this._handleDeviceChange();\n            } else {\n                this._cleanupPreview();\n\n                if (this.fallBackToScreenShareStream) {\n                    // try to get the screen stream before loading the troubleshooter, but if it fails continue anyway\n                    this.showScreenShareConfirmation();\n                } else {\n                    this.set('showTroubleshooter', true);\n                }\n            }\n        },\n\n        openSoundPreferences() {\n            this.get('webrtc.settings').openSoundPreference();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"7xOzfQLn\",\"block\":\"[[[41,[51,[33,1]],[[[41,[28,[37,3],[[33,4]],null],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"profiles-label\\\"],[12],[1,[28,[35,5],[\\\"purecloud.acdInteraction.mediaControls\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"preview-container\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,4],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"preview-error\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[34,4]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,6],[[[1,\\\"            \\\"],[10,1],[14,0,\\\"loading-indicator\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"]],[]],null]],[]]],[1,\\\"\\\\n\\\"],[41,[51,[33,4]],[[[1,\\\"            \\\"],[1,[28,[35,7],null,[[\\\"audioStream\\\"],[[33,8]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[51,[33,4]],[[[41,[51,[33,9,[\\\"features\\\",\\\"defaultQueuesEnabled\\\"]]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"profiles-label\\\"],[12],[1,[28,[35,5],[\\\"purecloud.acdInteraction.mediaControls\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[1,[28,[35,10],null,[[\\\"video\\\",\\\"troubleshoot\\\"],[false,[28,[37,11],[[30,0],\\\"tryTroubleshoot\\\"],null]]]]],[1,\\\"\\\\n        \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link volume-link\\\"],[24,4,\\\"button\\\"],[4,[38,11],[[30,0],\\\"openSoundPreferences\\\"],null],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,5],[\\\"webrtcDevices.deviceVolumes\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null]],[],false,[\\\"unless\\\",\\\"showTroubleshooter\\\",\\\"if\\\",\\\"not\\\",\\\"errorMessage\\\",\\\"t\\\",\\\"loading\\\",\\\"audio-visualizer\\\",\\\"audioStream\\\",\\\"session\\\",\\\"profile-selection-v2\\\",\\\"action\\\"]]\",\"moduleName\":\"web-directory/components/device-selection-with-preview/template.hbs\",\"isStrictMode\":false});","import { once, run } from '@ember/runloop';\nimport { alias } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { on } from '@ember/object/evented';\nimport Component from '@ember/component';\nimport { observer, computed } from '@ember/object';\nimport _ from 'lodash';\n\nconst LETTER_MAPPINGS = ['+', null, 'ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQRS', 'TUV', 'WXYZ'];\n\nconst DTMF_VOLUME_PERCENTAGE = 0.5;\n\nexport default Component.extend({\n    tagName: 'button',\n    classNames: ['dialpad-number'],\n    classNameBindings: ['hasLetters::no-letters', 'isNumber::no-number', 'isPressed:pressed'],\n\n    sound: service(),\n    phone: service(),\n    session: service(),\n\n    callVolume: alias('phone.callVolume'),\n    number: null,\n    soundId: 'softphone',\n    isPressed: false,\n\n    attachSoundEvents: on('didInsertElement', function () {\n        this.$().on('click', () => {\n            this._triggerSound();\n        });\n    }),\n\n    removeSoundEvents: on('willDestroyElement', function () {\n        this.$().off();\n    }),\n\n    letters: computed('number', function () {\n        return LETTER_MAPPINGS[this.number];\n    }),\n\n    hasLetters: computed('letters', function () {\n        return !_.isEmpty(this.letters);\n    }),\n\n    isNumber: computed('number', function () {\n        const number = parseInt(this.number, 10);\n        return !isNaN(number);\n    }),\n\n    class: computed('number', function () {\n        switch (this.number) {\n            case '*':\n                return 'asterisk';\n            case '#':\n                return 'pound';\n            default:\n                return `digit digit-${this.number}`;\n        }\n    }),\n\n    pressedObserver: observer('isPressed', function () {\n        // PCUCC-89\n        if (this.isPressed) {\n            once(this, function () {\n                this._triggerSound();\n            });\n        }\n    }),\n\n    _triggerSound() {\n        run(() => {\n            const soundId = this.soundId;\n            const decimalVolume = (this.callVolume * DTMF_VOLUME_PERCENTAGE) / 100;\n            this.sound.playSound(soundId, decimalVolume);\n        });\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"mAupFoQf\",\"block\":\"[[[10,1],[14,0,\\\"flex flex-col\\\"],[12],[1,\\\"\\\\n    \\\"],[10,1],[15,0,[29,[\\\"number \\\",[36,0]]]],[12],[1,\\\"\\\\n        \\\"],[1,[34,1]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,1],[14,0,\\\"letters\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,3],[[[1,\\\"            \\\"],[1,[34,3]],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,4],[[[1,\\\"                 \\\\n\\\"]],[]],null]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"class\\\",\\\"number\\\",\\\"if\\\",\\\"letters\\\",\\\"isNumber\\\"]]\",\"moduleName\":\"web-directory/components/dial-pad-number/template.hbs\",\"isStrictMode\":false});","import { map, readOnly } from '@ember/object/computed';\nimport { A } from '@ember/array';\nimport Component from '@ember/component';\nimport EmberObject, { computed, get, observer, set } from '@ember/object';\nimport { on } from '@ember/object/evented';\nimport { cancel, debounce, later, once, throttle } from '@ember/runloop';\nimport { inject } from '@ember/service';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport isEmpty from 'lodash/isEmpty';\nimport { warnClosureAction } from 'web-directory/utils/acd';\nimport { doFocus } from 'web-directory/utils/focus-management';\n\nconst DIALPAD_NUMBERS = [1, 2, 3, 4, 5, 6, 7, 8, 9, '*', 0, '#'];\nconst DTMF_DELAY_MS = 500;\n\nfunction mapDialPadNumbers(numbers) {\n    return numbers.map(num => ({\n        val: num,\n        pressed: false\n    }));\n}\n\n/**\n * provide a letter and return a number\n * used for key input to get dtmf number\n */\nconst LETTER_TO_DIALPAD_NUMBER = {\n    a: 2,\n    b: 2,\n    c: 2,\n    d: 3,\n    e: 3,\n    f: 3,\n    g: 4,\n    h: 4,\n    i: 4,\n    j: 5,\n    k: 5,\n    l: 5,\n    m: 6,\n    n: 6,\n    o: 6,\n    p: 7,\n    q: 7,\n    r: 7,\n    s: 7,\n    t: 8,\n    u: 8,\n    v: 8,\n    w: 9,\n    x: 9,\n    y: 9,\n    z: 9,\n    '+': 0\n};\n\nexport default Component.extend(LoggerMixin, {\n    layoutName: 'purecloud/panels/dialpad',\n    classNames: ['dialpad'],\n\n    phone: inject('phone'),\n    intl: inject('intl'),\n    session: inject('session'),\n    permissions: inject('permissions'),\n    interaction: inject('interaction'),\n    sidebar: inject('sidebar'),\n    commandNav: inject('command-nav'),\n    queueService: inject('queue'),\n    webrtc: inject('webrtc'),\n    addressformat: inject('addressformat'),\n\n    /**\n     * passed down from the parent component where dial-pad is rendered\n     */\n    enableRequireQueueDialpadLogic: false,\n\n    /**\n     * @attribute\n     *\n     * `true` if the call input should be visible\n     */\n    showCallInput: true,\n\n    /**\n     * @attribute\n     *\n     * `true` if you want to autofocus call input\n     */\n    autoFocusCallInput: false,\n\n    /**\n     * @attribute\n     */\n    sendDtmf: false,\n\n    /**\n     * @attribute\n     */\n    showDialpadToggle: false,\n\n    /**\n     * @attribute\n     */\n    showTitle: false,\n\n    /**\n     * @attribute\n     */\n    disableCallOnBehalfOfQueue: false,\n\n    /**\n     * @attribute\n     */\n    addingParticipants: false,\n\n    /**\n     * @attribute\n     */\n    isAcdDTMF: false,\n\n    /**\n     * @attribute\n     *\n     * The currently selected queue to create the conversation with\n     */\n    queue: null,\n\n    /**\n     * @attribute\n     *\n     * `true` to show the dialpad in the DOM\n     */\n    showDialpad: false,\n\n    /**\n     * @attribute\n     *\n     * array of participants to use for creating the conversation with\n     */\n    participants: A([]),\n\n    /**\n     * @attribute\n     */\n    showStationPicker: false,\n\n    /**\n     * @attribute\n     *\n     * `true` if the user can make a call in the dialpad component. This will render\n     * the phone button that invokes the `makeCall` logic.\n     */\n    showMakeCallButton: true,\n\n    /**\n     * @attribute\n     *\n     * `true` if the target dropdown logic should be supressed and the dropdown be hidden.\n     * This should be used if the user has been tasked with added a recipient, but shouldn't\n     * use the systems internal data to create the recipient, but rather just leveraging the input\n     */\n    hideTargetDropdown: false,\n\n    /**\n     *\n     * `true` if the permissions should be bypassed for the current user\n     */\n    bypassPermissions: false,\n\n    /**\n     * Array of all recipients mapped for the multi select component to easily consume it for\n     * quick display\n     */\n    participantTags: map('participants', function (participant) {\n        return {\n            value: participant.value,\n            text: participant.name,\n            data: { id: participant.id }\n        };\n    }),\n\n    /**\n     * Array of available filters to showcase in the queue target selector component.\n     * We only want to showcase queue options.\n     */\n    queueFilter: ['queue'],\n\n    value: null,\n\n    isKeydownReset: true,\n\n    queuedDTMF: null,\n\n    dtmfTimer: null,\n\n    numbers: mapDialPadNumbers(DIALPAD_NUMBERS),\n\n    /**\n     * the current value being searched in the search input\n     */\n    searchValue: '',\n\n    /**\n     * The current authenticated user from the session service\n     */\n    authUser: readOnly('session.publicApiUser'),\n\n    /**\n     * @permission\n     */\n    canViewQueues: readOnly('permissions.canViewQueue'),\n\n    allEmergencyNumbers: computed.readOnly('phone.allEmergencyNumbers'),\n\n    // when PURE-5487_require_queue is enabled, if user does not have permission to make communicate call, then they shouldn't be able to look up GC users in the Communicate dialpad (for both 1-on-1 and conference calls)\n    includeFilters: computed(\n        'session.features.PURE-5487_require_queue',\n        'permissions.allowOutboundUserCall',\n        'permissions.allowOutboundExternalCall',\n        'enableRequireQueueDialpadLogic',\n        function () {\n            const enableRequireQueueDialpadLogic = this.get('enableRequireQueueDialpadLogic');\n            // when PURE-5487_require_queue is disbaled, user can lookup all users types\n            if (!this.get('session.features.PURE-5487_require_queue') || !enableRequireQueueDialpadLogic) return [];\n            if (!this.get('permissions.allowOutboundUserCall') && this.get('permissions.allowOutboundExternalCall')) {\n                // Users can lookup only external users\n                return ['external'];\n            } else if (\n                this.get('permissions.allowOutboundUserCall') &&\n                !this.get('permissions.allowOutboundExternalCall')\n            ) {\n                // Users can lookup only GC users & queues\n                return ['user', 'queue'];\n            }\n            // when PURE-5487_require_queue is enabled and any other permission combination, user can lookup all users types\n            return [];\n        }\n    ),\n\n    // returns true if the the array of participants has a emergency number\n    isEmergencyNumber: computed('participants.[]', 'allEmergencyNumbers', function () {\n        const participants = this.get('participants') || [];\n        const allEmergencyNumbers = this.get('allEmergencyNumbers') || [];\n        return participants.any(participant => allEmergencyNumbers.includes(participant.value));\n    }),\n\n    allowOnlyEmergencyNumbers: computed(\n        'permissions.allowOutboundExternalCall',\n        'permissions.allowOutboundUserCall',\n        'session.features.PURE-5487_require_queue',\n        'enableRequireQueueDialpadLogic',\n        function () {\n            const requireQueue = this.get('session.features.PURE-5487_require_queue');\n            const enableRequireQueueDialpadLogic = this.get('enableRequireQueueDialpadLogic');\n            if (!requireQueue || !enableRequireQueueDialpadLogic) return false;\n            return !this.get('permissions.allowOutboundExternalCall') && !this.get('permissions.allowOutboundUserCall');\n        }\n    ),\n\n    telephonyDisabledForNonEmegergencyCall: computed(\n        'participants.[]',\n        'session.features.PURE-5487_require_queue',\n        'isConferenceCall',\n        'enableRequireQueueDialpadLogic',\n        function () {\n            // if dialpad is not rendered from call-controls we don't want any of this logic to run even if  PURE-5487_require_queue is enabled\n            const enableRequireQueueDialpadLogic = this.get('enableRequireQueueDialpadLogic');\n            const requireQueueFT = this.get('session.features.PURE-5487_require_queue');\n            const isConferenceCall = this.get('isConferenceCall');\n            const participants = this.get('participants') || [];\n            if (!requireQueueFT || isConferenceCall || participants.length == 0 || !enableRequireQueueDialpadLogic)\n                return false;\n\n            const allowOnlyEmergencyNumbers = this.get('allowOnlyEmergencyNumbers');\n            const isEmergencyNumber = this.get('isEmergencyNumber');\n            // When user does not have permission to make a outbound communicate call or a outbound external call, allow only emergency calls to emergency from dialpad\n            if (allowOnlyEmergencyNumbers) return !isEmergencyNumber;\n\n            return false;\n        }\n    ),\n\n    participant: computed(function () {\n        return EmberObject.create({\n            value: null,\n            entity: null\n        });\n    }),\n\n    multipleQueueParticipants: computed('participants.@each', function () {\n        const participants = this.participants || [];\n        return participants.filter(p => get(p, 'entity.type') === 'queue').length > 1;\n    }),\n\n    phoneDisabled: computed('phone.{phoneDisabled,station.webRtcRequireMediaHelper}', function () {\n        return this.get('phone.phoneDisabled') && !this.get('phone.station.webRtcRequireMediaHelper');\n    }),\n\n    isConferenceCall: computed('participants.[]', function () {\n        return this.get('participants.length') > 1 && !this.addingParticipants;\n    }),\n\n    // when PURE-5487_require_queue is enabled and it is a conference call\n    disableConferenceCall: computed(\n        'isConferenceCall',\n        'allowOnlyEmergencyNumbers',\n        'session.features.PURE-5487_require_queue',\n        'permissions.allowOutboundExternalCall',\n        'permissions.allowOutboundUserCall',\n        'participants.[]',\n        'enableRequireQueueDialpadLogic',\n        function () {\n            const isConferenceCall = this.get('isConferenceCall');\n            const enableRequireQueueDialpadLogic = this.get('enableRequireQueueDialpadLogic');\n            if (\n                !this.get('session.features.PURE-5487_require_queue') ||\n                !isConferenceCall ||\n                !enableRequireQueueDialpadLogic\n            )\n                return false;\n\n            // When user does not have permission to make a outbound communicate call or a outbound external call, disbale conference calls\n            if (this.get('allowOnlyEmergencyNumbers')) return isConferenceCall;\n\n            if (!this.get('permissions.allowOutboundExternalCall') && this.get('permissions.allowOutboundUserCall')) {\n                const conferenceParticipants = this.get('participants');\n                // When user does not have permission to make outbound external call, conference calls to numbers/extensions NOT associated with a GC users or queue should be disabled\n                for (const participant of conferenceParticipants) {\n                    const isPerson =\n                        participant &&\n                        participant.entity &&\n                        participant.entity.get &&\n                        (participant.entity.get('type') === 'person' || participant.entity.get('type') === 'queue');\n                    if (isPerson === undefined || !isPerson) return true;\n                }\n                return false;\n            }\n\n            // When user does not permission to make outbound communicate calls, they should not be able to lookup GC users in communicate dialpad - handled by computed property includeFilters\n        }\n    ),\n\n    selfInParticipantList: computed('participants.[]', function () {\n        const selfId = this.get('session.person.id');\n        const participants = this.participants || [];\n        return participants.filter(p => p.id === selfId).length;\n    }),\n\n    enableCallOnBehalfOfQueue: computed(\n        'permissions.canGoOnQueue',\n        'sidebar.showAcdInteractions',\n        'isAcdDTMF',\n        'disableCallOnBehalfOfQueue',\n        'session.useNewNav',\n        'commandNav.agentPanelIsActive',\n        function () {\n            if (this.disableCallOnBehalfOfQueue) {\n                return false;\n            }\n\n            const agentPanelActive = this.get('session.useNewNav')\n                ? this.get('commandNav.agentPanelIsActive')\n                : this.get('sidebar.showAcdInteractions');\n\n            return this.get('permissions.canGoOnQueue') && agentPanelActive && !this.isAcdDTMF;\n        }\n    ),\n\n    displayNumberWarning: computed('participants.[]', 'searchValue', function () {\n        const participants = this.participants || [];\n        const searchValue = this.searchValue;\n        return (\n            (searchValue && !this.addressformat.isValidNumber(searchValue, null, true)) ||\n            participants.some(\n                participant =>\n                    // we only check if the participant does not have an entity, meaning its a raw number/input\n                    !participant.entity && !this.addressformat.isValidNumber(participant.value, null, true)\n            )\n        );\n    }),\n\n    // enabled phone button only when the searchValue has a emergency number, otherwise it stays disabled unless user has selected a GC or external user, and unless user presses enter after directly typing in a number\n    enablePhoneOnSearchValue: computed(\n        'searchValue',\n        'allEmergencyNumbers',\n        'enableRequireQueueDialpadLogic',\n        'allowOnlyEmergencyNumbers',\n        'participants.[]',\n        'permissions.allowOutboundExternalCall',\n        'permissions.allowOutboundUserCall',\n        function () {\n            const enableRequireQueueDialpadLogic = this.get('enableRequireQueueDialpadLogic');\n            // if dialpad is not rendered from call-controls we don't keep the phone button enabled and let the other computed properties decide whether it will be disabled\n            if (!enableRequireQueueDialpadLogic) return true;\n            const allowOutboundExternalCall = this.get('permissions.allowOutboundExternalCall');\n            const allowOutboundUserCall = this.get('permissions.allowOutboundUserCall');\n            const allowOnlyEmergencyNumbers = this.get('allowOnlyEmergencyNumbers');\n            const allEmergencyNumbers = this.get('allEmergencyNumbers') || [];\n            const searchValue = this.get('searchValue');\n            const participants = this.get('participants') || [];\n            const isEmergencyNumber = allEmergencyNumbers.includes(searchValue);\n\n            if (allowOutboundExternalCall && allowOutboundUserCall) {\n                return true;\n            } else if (!allowOutboundExternalCall && allowOutboundUserCall) {\n                return isEmergencyNumber ? participants.length == 0 : false;\n            } else if (allowOutboundExternalCall && !allowOutboundUserCall) {\n                return true;\n            } else if (allowOnlyEmergencyNumbers) {\n                return isEmergencyNumber && participants.length == 0;\n            }\n        }\n    ),\n\n    disablePhoneButton: computed(\n        'phoneDisabled',\n        'phone.webrtcPhoneWithIssues',\n        'searchValue',\n        'participants.@each',\n        'queue',\n        'multipleQueueParticipants',\n        'selfInParticipantList',\n        'enableCallOnBehalfOfQueue',\n        'enablePhoneOnSearchValue',\n        'telephonyDisabledForNonEmegergencyCall',\n        function () {\n            const phoneDisabled = this.phoneDisabled || this.get('phone.webrtcPhoneWithIssues');\n            const multipleQueueParticipants = this.multipleQueueParticipants;\n\n            const noParticipants = !!this.searchValue ? false : this.get('participants.length') === 0;\n            const selfInParticipantList = this.selfInParticipantList;\n\n            const queueInUse = this.get('enableCallOnBehalfOfQueue');\n            const emptyQueueField = queueInUse && !this.get('queue');\n            const telephonyDisabledForNonEmegergencyCall = this.get('telephonyDisabledForNonEmegergencyCall');\n            const disablePhoneOnSearchValue =\n                this.get('session.features.PURE-5487_require_queue') &&\n                this.get('searchValue') &&\n                !this.get('enablePhoneOnSearchValue');\n\n            return !!(\n                phoneDisabled ||\n                noParticipants ||\n                multipleQueueParticipants ||\n                selfInParticipantList ||\n                emptyQueueField ||\n                telephonyDisabledForNonEmegergencyCall ||\n                disablePhoneOnSearchValue\n            );\n        }\n    ),\n\n    shrinkDialpad: computed('sendDtmf', 'addingParticipants', function () {\n        return !this.sendDtmf && !this.addingParticipants;\n    }),\n\n    /**\n     * @deprecated ember observers should not be used\n     *\n     * Focus the dialpad so we can listen to keydown events [PCUCC-89]\n     */\n    focusDialpad: on(\n        'init',\n        observer('showDialpad', 'sendDtmf', function () {\n            if (this.showDialpad && this.sendDtmf) {\n                once(this, function () {\n                    const dialpadNumbersContainer = this.$('.dialpad-numbers-container');\n                    if (dialpadNumbersContainer) {\n                        // schedule two paint ticks ahead\n                        requestAnimationFrame(() => {\n                            requestAnimationFrame(() => {\n                                dialpadNumbersContainer.focus();\n                            });\n                        });\n                    }\n                });\n            }\n        })\n    ),\n\n    init() {\n        this._super(...arguments);\n        this.set('queuedDTMF', []);\n        // Per-instance so handles are never shared across components via the prototype.\n        this._keypressResetTimers = [];\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        if (this.enableCallOnBehalfOfQueue) {\n            this.initQueue();\n        }\n\n        const requireQueueFT = this.get('session.features.PURE-5487_require_queue');\n        if (!requireQueueFT) return;\n        // when PURE-5487_require_queue is enabled, and user is redirected to the agent workspace because a queue is required, this value is populated in the number field.\n        // after pre-populating the number field, reset the value pendingCallNumber store in phone service to null\n        const pendingNumber = this.get('phone.pendingCallNumber');\n        if (pendingNumber) {\n            this.participantSelected(pendingNumber);\n            this.get('phone').setPendingCallNumber(null);\n        }\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.participants.clear();\n    },\n\n    // Timer cleanup lives here rather than in willDestroyElement: that hook only runs for components\n    // that were rendered, so a unit test creating this component via factoryFor().create() would\n    // never reach it and these timers would survive the test.\n    willDestroy() {\n        // Cancel every timer before anything that could throw, and clear the handles by direct\n        // assignment rather than this.set() — Ember rejects set() on an object that is already\n        // tearing down, and a throw part-way through this hook would abandon the cancels below it.\n        //\n        // Handles are compared with `typeof === 'number'`, not truthiness. Backburner allocates timer\n        // ids from a counter that starts at 0, so the first timer scheduled in a page gets id 0 and a\n        // truthy check silently skips cancelling it.\n        if (typeof this.dtmfTimer === 'number') {\n            cancel(this.dtmfTimer);\n            this.dtmfTimer = null;\n        }\n        // _determineMakeCall throttles the call-placing methods for 2s. Uncancelled, the trailing\n        // invocation fires after teardown and dials against a destroyed component.\n        if (typeof this._makeCallTimer === 'number') {\n            cancel(this._makeCallTimer);\n            this._makeCallTimer = null;\n        }\n        // Visual key-press resets from handleKeydown — one per keypress.\n        (this._keypressResetTimers || []).forEach(timer => cancel(timer));\n        this._keypressResetTimers = [];\n\n        this._super(...arguments);\n    },\n\n    /**\n     * Initializes and sets the default queue into the corresponding input\n     */\n    initQueue() {\n        // this check was performed inside of the call-onbehalf component, so with the new work we need to set it here instead.\n        if (!this.queue) {\n            this.queueService\n                .getDefaultQueue('call')\n                .then(queue => {\n                    this.set('queue', queue);\n                })\n                .catch(error => {\n                    this.logger.error('There was an issue getting the default queue', error);\n                });\n        }\n    },\n\n    /**\n     * Invoked when a new participant has been selected (or removed) and formats it\n     * for the creation call request.\n     *\n     * @param target the new value to set the participant property to\n     */\n    participantSelected(target) {\n        const id = get(target, 'id');\n        const phoneNumber = get(target, 'phoneNumber') || get(target, 'bestPhoneNumber');\n\n        if (id) {\n            const type = get(target, 'type');\n            this.participants.pushObject({\n                entity: type === 'external' ? { type: 'externalcontacts/contact' } : target,\n                externalOrganization: get(target, 'externalOrganization'),\n                id: get(target, 'id'),\n                name: get(target, 'name') || phoneNumber,\n                value: phoneNumber || id\n            });\n        } else {\n            this.participants.pushObject({\n                name: phoneNumber,\n                value: phoneNumber\n            });\n        }\n\n        this.actionValueChange(this.participants);\n    },\n\n    dialDtmfNumber(number) {\n        let conversationId = undefined;\n        let participantId = undefined;\n        const validState =\n            this.get('session.features.acdDialpadDialing') || this.get('session.useMultipanel')\n                ? this.get('interaction.selectedInteraction.isConnected') ||\n                  this.get('interaction.selectedInteraction.isDialing')\n                : this.get('interaction.selectedInteraction.isConnected');\n        if (\n            this.get('phone.isInteractionViewOpen') &&\n            this.get('interaction.selectedInteraction.isCall') &&\n            validState\n        ) {\n            conversationId = this.get('interaction.selectedInteraction.id');\n            participantId = this.get('interaction.selectedInteraction.participantForCurrentUser.id');\n        } else if (this.get('phone.activeCall')) {\n            conversationId = this.get('phone.activeCall.id');\n            participantId = this.get('phone.activeCall.myself.id');\n        }\n        this.queuedDTMF.push(number);\n        // Needed for functional tests to inform when the dial should occur\n        this.logger.info('sendingDtmfTones', { conversationId, participantId, number });\n        this.set('dtmfTimer', debounce(this, this._dialDtmfNumber, conversationId, participantId, DTMF_DELAY_MS));\n    },\n\n    resetKeydown() {\n        this.set('isKeydownReset', true);\n    },\n\n    /**\n     * Handle keydown events when dialpad is open\n     * PCUCC-89\n     */\n    handleKeydown(event) {\n        if (!this.isKeydownReset || !this.sendDtmf) {\n            return;\n        }\n\n        if (event.type === 'keydown') {\n            // prevent holding key\n            // unless it's the shift key\n            if (!event.shiftKey) {\n                this.set('isKeydownReset', false);\n            }\n            // translate the keydown to a digit\n            let key = parseInt(event.key, 10);\n            if (isNaN(key)) {\n                // key may be '*' or '#' or '+'\n                key = event.key.toLowerCase();\n            }\n\n            let number = this.numbers.find(num => num.val === key);\n\n            // check if key exists\n            if (number !== undefined) {\n                set(number, 'pressed', true);\n\n                // call the action to handle DTMF\n                this.send('onAddNumber', key);\n            } else if (LETTER_TO_DIALPAD_NUMBER[key] !== undefined) {\n                number = this.numbers.find(num => num.val === LETTER_TO_DIALPAD_NUMBER[key]);\n\n                if (number !== undefined) {\n                    set(number, 'pressed', true);\n\n                    // call the action to handle DTMF\n                    this.send('onAddNumber', LETTER_TO_DIALPAD_NUMBER[key]);\n                }\n            } else if (event.code !== undefined && event.code.toLowerCase() === 'escape') {\n                // close dialpad if user presses escape key\n                this.send('onToggleDialpad');\n            }\n\n            // remove pressed. Each keypress schedules its own reset, so the handles are collected\n            // rather than overwritten — a single handle would leave every earlier keypress's timer\n            // uncancelled. This only clears a visual key-press state, so dropping it on teardown is\n            // safe.\n            this._keypressResetTimers.push(\n                later(() => {\n                    if (number !== undefined) {\n                        set(number, 'pressed', false);\n                    }\n                }, DTMF_DELAY_MS)\n            );\n        }\n    },\n\n    _dialDtmfNumber(currentCallId, participantId) {\n        const numbers = this.queuedDTMF.join('');\n        this.set('queuedDTMF', []);\n        if (numbers) {\n            this.phone.dialDtmfNumber(currentCallId, participantId, numbers);\n        }\n    },\n\n    _bulkAddParticipants(participants) {\n        const phone = this.phone;\n        return phone\n            .bulkAddParticipants(participants)\n            .then(() => {\n                this._reset();\n            })\n            .catch(error => {\n                this.logger.error('Could not join participants into conference call.', error);\n                this._showCallError('purecloud.error.dialpad.participants');\n            });\n    },\n\n    _determineMakeCall() {\n        if (this.disablePhoneButton) {\n            return;\n        }\n\n        this.logger.debug('DIALPAD:', this.addingParticipants);\n\n        const queue = this.queue;\n        if (this.addingParticipants) {\n            let participants = this.participants || [];\n            const number = (this.value || '').trim();\n\n            if (participants !== null && participants.length === 0 && !isEmpty(number)) {\n                participants = [\n                    {\n                        entity: null,\n                        value: number\n                    }\n                ];\n            }\n\n            const search = this.searchValue;\n            if (participants != null && search) {\n                const formatted = this.addressformat.formatAddress(search);\n                participants.push({\n                    entity: null,\n                    value: formatted ? formatted : search\n                });\n            }\n\n            this._makeCallTimer = throttle(this, this._bulkAddParticipants, participants, 2000);\n        } else if (this.get('participants.length') >= 2) {\n            const participants = this.participants;\n            this._makeCallTimer = throttle(this, this._makeConferenceCall, participants, queue, 2000);\n        } else if (this.get('participants.length') <= 1) {\n            let number = this.searchValue;\n            const party = this.get('participants.firstObject');\n            let contactId;\n            if (party) {\n                const { entity, id } = party;\n                const entityExists = entity;\n                const entityNotContact = entityExists && entity.type !== 'externalcontacts/contact';\n                number = entityExists && entityNotContact ? party.entity : party.value;\n                contactId = entityExists && !entityNotContact ? id : undefined;\n            }\n            const isValidNumber = number && (typeof number !== 'string' || number.trim().length);\n            if (!isValidNumber) {\n                return;\n            }\n            this._makeCallTimer = throttle(this, this._makeCall, number, queue, contactId, 2000);\n\n            const focusTarget = '#interactions-heading';\n            doFocus(this, focusTarget);\n        }\n    },\n\n    _makeConferenceCall(participants, queue) {\n        const phone = this.phone;\n        return phone\n            .makeConferenceCall(participants, queue)\n            .then(() => {\n                this._reset();\n                if (this.enableCallOnBehalfOfQueue) {\n                    this.queueService.setDefaultQueue(queue, 'call');\n                }\n            })\n            .catch(error => {\n                this.logger.error('Could not make call.', error);\n                this._showCallError('purecloud.error.dialpad.call');\n            });\n    },\n\n    _makeCall(number, queue, externalContactId) {\n        const phone = this.phone;\n        return phone\n            .makeCall(number, null, queue, externalContactId)\n            .then(() => {\n                this._reset();\n                if (this.enableCallOnBehalfOfQueue) {\n                    this.queueService.setDefaultQueue(queue, 'call');\n                }\n            })\n            .catch(error => {\n                this.logger.error('Could not make call to #{number}.', error);\n                this._showCallError('purecloud.error.dialpad.call', error);\n            });\n    },\n\n    /**\n     * Resets the user driven properties on this component back to their initial state\n     */\n    _reset() {\n        this.participants.clear();\n        this.actionValueChange(this.participants);\n        this.set('searchValue', '');\n        this.set('queue', null);\n        this.actionClose();\n    },\n\n    _showCallError(key) {\n        const message = this.intl.safestring(key).toString();\n        this.phone.showFeedbackErrorNotification(message);\n    },\n\n    /**\n     * @action\n     * @optional\n     *\n     * Invoked when the value of the input has changed. Defaults to no-op.\n     * Adding lint ignore since this action is optional, we don't want to warn the console\n     * when it fired. It's treated as a no-op in this case.\n     *\n     * @param { any[] } _value the value to invoke through the action\n     */\n    // eslint-disable-next-line no-unused-vars\n    actionValueChange: _value => {},\n\n    /**\n     * @action\n     *\n     * closure action called when the dialpad component intends to close itself\n     */\n    actionClose: () => warnClosureAction('actionClose'),\n\n    /**\n     * @action\n     */\n    openStationPicker: () => warnClosureAction('openStationPicker'),\n\n    actions: {\n        /**\n         * Invoked when a queue has been selected by the user\n         *\n         * @param {object} queue the selected queue\n         */\n        onQueueSelected(queue) {\n            this.set('queue', queue);\n        },\n\n        /**\n         * Invoked when a participant has been selected\n         *\n         * @param participant the selected participant\n         */\n        onParticipantSelected(participant) {\n            this.participantSelected(participant);\n        },\n\n        /**\n         * Invoked when a participant has been removed\n         *\n         * @param participant the participant to remove\n         */\n        onParticipantRemoved(participant) {\n            // An ember array is needed here for change detection to work properly\n            const participants = A(this.participants || []);\n            const index = participants.findIndex(r => r.value === participant.value);\n            if (index >= 0) {\n                this.participants.removeAt(index, 1);\n                this.actionValueChange(this.participants);\n            }\n        },\n\n        /**\n         * Removes the corresponding participant record based on the index provided\n         *\n         * @param {number} index the index of the participant to remove\n         */\n        onParticipantRemoveByIndex(index) {\n            this.participants.removeAt(index, 1);\n        },\n\n        /**\n         * Invoked when the user has submitted the form and is ready to create the interaction.\n         * Intended to be used for when the user pressed the enter key while in an empty search bar\n         */\n        onSubmit() {\n            this._determineMakeCall();\n        },\n\n        onHandleKeydown(event) {\n            this.handleKeydown(event);\n        },\n\n        onResetKeydown() {\n            this.resetKeydown();\n        },\n\n        onToggleDialpad() {\n            this.toggleProperty('showDialpad');\n        },\n\n        onAddNumber(number) {\n            if (!this.get('phone.phoneDisabled')) {\n                if (this.get('phone.dtmf') && this.sendDtmf) {\n                    this.dialDtmfNumber(number);\n                }\n\n                let searchValue = this.searchValue;\n                searchValue += `${number}`;\n                this.set('searchValue', searchValue);\n            }\n        },\n\n        onMakeCall() {\n            this._determineMakeCall();\n        },\n\n        openStationPicker() {\n            this.openStationPicker();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"EON7CJod\",\"block\":\"[[[10,0],[15,0,[29,[\\\"panel-content\\\\n        \\\",[52,[28,[37,1],[[28,[37,2],[[33,3],[33,4],[33,5,[\\\"showAcdInteractions\\\"]],[33,6]],null]],null],\\\"hide\\\"]]]],[12],[1,\\\"\\\\n\\\"],[41,[33,3],[[[1,\\\"        \\\"],[10,\\\"h4\\\"],[14,0,\\\"dialpad-title\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,7],[\\\"purecloud.makeACall\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,4],[[[1,\\\"        \\\"],[19,\\\"partials/no-station-notification\\\",[]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,9],[[33,5,[\\\"showAcdInteractions\\\"]],[28,[37,1],[[33,10]],null]],null],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"dialpad-requirements-text\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,7],[\\\"purecloud.acdInteraction.calls.fieldRequirements\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,6],[[[1,\\\"        \\\"],[1,[28,[35,11],null,[[\\\"autofocus\\\",\\\"interactionType\\\",\\\"authUser\\\",\\\"disableInputEnter\\\",\\\"includeFilters\\\",\\\"placeholder\\\",\\\"clearTranslation\\\",\\\"targetSelected\\\",\\\"value\\\",\\\"myQueuesOnly\\\",\\\"supplementalClasses\\\"],[true,\\\"call\\\",[33,12],true,[33,13],[28,[37,7],[\\\"purecloud.onBehalfOfQueue\\\"],null],[28,[37,7],[\\\"purecloud.clearBehalfOfQueue\\\"],null],[28,[37,14],[[30,0],\\\"onQueueSelected\\\"],null],[33,15],true,\\\"call-queue-selection\\\"]]]],[1,\\\"\\\\n\\\"]],[]],null],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,16],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"input call-input-names outbound-dropdown\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,17],null,[[\\\"autofocus\\\",\\\"interactionType\\\",\\\"authUser\\\",\\\"value\\\",\\\"includeFilters\\\",\\\"label\\\",\\\"searchValue\\\",\\\"targetSelected\\\",\\\"targetRemoved\\\",\\\"placeholder\\\",\\\"submit\\\",\\\"inputClasses\\\",\\\"bypassPermissions\\\",\\\"hideTargetDropdown\\\"],[[33,18],\\\"call\\\",[33,12],[33,19],[33,20],\\\"searchInput.callSearchLabel\\\",[28,[37,21],[[33,22]],null],[28,[37,14],[[30,0],\\\"onParticipantSelected\\\"],null],[28,[37,14],[[30,0],\\\"onParticipantRemoveByIndex\\\"],null],[28,[37,7],[\\\"searchInput.callSearch\\\"],null],[28,[37,14],[[30,0],\\\"onSubmit\\\"],null],\\\"phone-number-input\\\",[33,23],[33,24]]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[33,25],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"dialpad-has-invalid-entry\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"alert-info\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[10,2],[14,0,\\\"formatting-message\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,7],[\\\"purecloud.acdInteraction.errors.invalidNumbers\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,24],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"allow-emergency-calls-warning\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/triangle-exclamation-solid\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[14,\\\"size\\\",\\\"medium\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[10,2],[14,0,\\\"formatting-message\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,7],[\\\"purecloud.allowEmergencyNumbersOnly\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,26],[[[1,\\\"    \\\"],[10,0],[15,0,[29,[\\\"dialpad-numbers-container \\\",[52,[33,27],\\\"responsive-dial-pad\\\"]]]],[14,\\\"tabindex\\\",\\\"-1\\\"],[15,\\\"onkeydown\\\",[28,[37,14],[[30,0],\\\"onHandleKeydown\\\"],[[\\\"on\\\"],[\\\"keydown\\\"]]]],[15,\\\"onkeyup\\\",[28,[37,14],[[30,0],\\\"onResetKeydown\\\"],[[\\\"on\\\"],[\\\"keyup\\\"]]]],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,29],[[28,[37,29],[[33,30]],null]],null],null,[[[1,\\\"            \\\"],[10,1],[14,0,\\\"dial-pad-item\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,31],null,[[\\\"number\\\",\\\"isPressed\\\",\\\"click\\\"],[[30,1,[\\\"val\\\"]],[30,1,[\\\"pressed\\\"]],[28,[37,14],[[30,0],\\\"onAddNumber\\\",[30,1,[\\\"val\\\"]]],null]]]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,16],[[[41,[33,32,[\\\"webrtcPhoneWithIssues\\\"]],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"error-message\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,7],[[33,33,[\\\"webrtcAudioCallIssueKey\\\"]]],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,34],[[[1,\\\"        \\\"],[10,\\\"button\\\"],[15,\\\"onclick\\\",[28,[37,14],[[30,0],\\\"onMakeCall\\\"],null]],[15,\\\"aria-disabled\\\",[52,[28,[37,2],[[33,35],[33,36]],null],\\\"true\\\",\\\"false\\\"]],[15,\\\"aria-label\\\",[29,[[28,[37,7],[\\\"purecloud.startNewCall\\\"],null]]]],[15,0,[29,[\\\"dialpad-number make-call \\\",[52,[33,37],\\\"conference\\\"],\\\" \\\",[52,[28,[37,2],[[33,35],[33,36]],null],\\\"disabled\\\"]]]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"            \\\"],[10,1],[14,0,\\\"flex\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"phone\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[10,1],[15,0,[29,[\\\"start-conference \\\",[52,[33,37],\\\"visible\\\",\\\"hidden\\\"]]]],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,7],[\\\"purecloud.startConference\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,38],[[[1,\\\"    \\\"],[10,\\\"em\\\"],[14,0,\\\"dialpad-error\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,7],[\\\"purecloud.tooManyQueues\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,39],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"dialpad-action-container\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"button\\\"],[14,0,\\\"btn btn-link btn-sm dialpad-toggle\\\"],[15,\\\"onclick\\\",[28,[37,14],[[30,0],\\\"onToggleDialpad\\\"],null]],[15,\\\"aria-label\\\",[28,[37,7],[[52,[33,26],\\\"purecloud.closeDialpad\\\",\\\"purecloud.openDialpad\\\"]],null]],[15,\\\"aria-expanded\\\",[29,[[52,[33,26],\\\"true\\\",\\\"false\\\"]]]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,7],[[52,[33,26],\\\"purecloud.closeDialpad\\\",\\\"purecloud.openDialpad\\\"]],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"number\\\"],true,[\\\"if\\\",\\\"not\\\",\\\"or\\\",\\\"showTitle\\\",\\\"showStationPicker\\\",\\\"sidebarService\\\",\\\"enableCallOnBehalfOfQueue\\\",\\\"t\\\",\\\"partial\\\",\\\"and\\\",\\\"isAcdDTMF\\\",\\\"single-select-target-dropdown\\\",\\\"authUser\\\",\\\"queueFilter\\\",\\\"action\\\",\\\"queue\\\",\\\"showCallInput\\\",\\\"multi-select-target-dropdown\\\",\\\"autofocusCallInput\\\",\\\"participantTags\\\",\\\"includeFilters\\\",\\\"mut\\\",\\\"searchValue\\\",\\\"bypassPermissions\\\",\\\"allowOnlyEmergencyNumbers\\\",\\\"displayNumberWarning\\\",\\\"showDialpad\\\",\\\"shrinkDialpad\\\",\\\"each\\\",\\\"-track-array\\\",\\\"numbers\\\",\\\"dial-pad-number\\\",\\\"phone\\\",\\\"webrtc\\\",\\\"showMakeCallButton\\\",\\\"disablePhoneButton\\\",\\\"disableConferenceCall\\\",\\\"isConferenceCall\\\",\\\"multipleQueueParticipants\\\",\\\"showDialpadToggle\\\"]]\",\"moduleName\":\"web-directory/components/dial-pad/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\n\nexport default Component.extend({\n    classNames: ['draggable-dropzone', 'clear'],\n    classNameBindings: ['dragClass'],\n    dragClass: 'deactivated',\n    data: null,\n\n    dragLeave(event) {\n        event.preventDefault();\n        this.set('dragClass', 'deactivated');\n    },\n\n    dragOver(event) {\n        event.preventDefault();\n        this.set('dragClass', 'activated');\n    },\n\n    drop(event) {\n        this.set('dragClass', 'deactivated');\n        this.sendAction('dropped', event);\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"SEZIerWu\",\"block\":\"[[[18,1,null]],[\\\"&default\\\"],false,[\\\"yield\\\"]]\",\"moduleName\":\"web-directory/components/drag-drop-container/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport { computed } from '@ember/object';\nimport Component from '@ember/component';\n\nexport default Component.extend({\n    classNames: ['draggable-item'],\n    attributeBindings: ['draggable', 'ariaLabel'],\n    ariaLabel: computed(function () {\n        return this.intl.safestring('components.inbox.actions.selectCall');\n    }),\n    draggable: 'true',\n    dataType: 'text',\n\n    data: null,\n\n    intl: service(),\n\n    dragStart(event) {\n        event.dataTransfer.setData(this.dataType, this.data);\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"1xd+vi8h\",\"block\":\"[[[18,1,null]],[\\\"&default\\\"],false,[\\\"yield\\\"]]\",\"moduleName\":\"web-directory/components/drag-drop-item/template.hbs\",\"isStrictMode\":false});","/* eslint no-console: 0 */\n/* eslint no-unused-vars: 0 */\n\nimport Component from '@ember/component';\nimport { computed, observer } from '@ember/object';\nimport { run } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport isEmpty from 'lodash/isEmpty';\nimport layout from './template';\n\n/**\n * Component usage:\n * When using this component, you should use a class: `menu-selector` on the element that the user clicks to display the dropdown.\n * Doing this will toggle the dropdown property and also attach a listener to the document to handle hiding the dropdown when clicking off the dropdown.\n * Please user a dropdownInfo property with a description for debugging purposes\n * {{#drop-down showDropdown=someProp dropdownInfo='template-name short description'}}\n *   <button class=\"menu-selector>click</button>\n *   <div {{if showDropdown 'show'}}\">\n *     // drop-down content\n *   </div>\n * {{/drop-down}}\n */\n\nexport default Component.extend({\n    iframeState: service('iframe-state'),\n\n    classNames: ['drop-down-component'],\n    classNameBindings: ['optionalClasses'],\n    layout,\n\n    showDropdown: false,\n    otherParent: null,\n    dropdownInfo: null,\n    _verboseLogging: false, // set to true to enable verbose logging for all dropdowns\n\n    init() {\n        this._super(...arguments);\n        this._verbose('init: initialize component');\n\n        if (this.showDropdown) {\n            this._verbose('init: if showDropdown then attachWindowListener');\n            this.attachWindowListener();\n        }\n\n        this.iframeState.setupFocusListener();\n        this.onExternalIframeFocus(); // Initialize observer\n    },\n\n    willDestroyElement() {\n        this._verbose('willDestroyElement');\n        this.removeWindowListener();\n        const menuSelector = this.element.querySelector('.menu-selector');\n        if (menuSelector && this._menuSelectorClickHandler) {\n            this._verbose('remove menu-selctor listener');\n            menuSelector.removeEventListener('click', this._menuSelectorClickHandler);\n        }\n    },\n\n    didInsertElement() {\n        const hasInfo = !isEmpty(this.dropdownInfo);\n        if (!hasInfo) {\n            console.warn(`no dropdownInfo attached on ${this.element}`);\n        }\n        this._verbose('didInsertElement: attach menu-selector listener');\n        // Attach an event to this drop-down's .menu-selector\n        const menuSelector = this.element.querySelector('.menu-selector');\n        if (menuSelector) {\n            this._menuSelectorClickHandler = event => {\n                run(() => {\n                    this._verbose('menu-selector click event');\n                    this.toggleProperty('showDropdown');\n                    this.broadcastDropdownChange();\n                    this.attachWindowListener();\n                    // why preventDefault?\n                    event.preventDefault();\n                });\n            };\n            menuSelector.addEventListener('click', this._menuSelectorClickHandler);\n        }\n    },\n\n    optionalClasses: computed(function () {\n        const bindings = this.optionalClassNameBindings;\n        if (bindings) {\n            return bindings;\n        }\n    }),\n\n    /**\n     * Bind an event to document to close the dropdown when user clicks outside\n     */\n    attachWindowListener() {\n        this._verbose('attach window listener');\n        this._windowClickHandler = event => {\n            run(() => {\n                if (this.isDestroyed || this.isDestroying) {\n                    return;\n                }\n                this._verbose('window click event');\n                const target = event.target;\n                const targetIsInDom = document.contains(target);\n                const targetChildOfDropdown = !!target.closest(`#${this.elementId}`);\n\n                let targetChildOfOther = false;\n                if (this.otherParent) {\n                    targetChildOfOther = !!target.closest(this.otherParent);\n                }\n\n                if (!targetChildOfDropdown && !targetChildOfOther && targetIsInDom) {\n                    this.close();\n                }\n            });\n        };\n        document.addEventListener('click', this._windowClickHandler);\n    },\n\n    /**\n     * Unbind listener attached in attackWindowListener\n     */\n    removeWindowListener() {\n        this._verbose('remove window listener');\n        if (this._windowClickHandler) {\n            document.removeEventListener('click', this._windowClickHandler);\n            this._windowClickHandler = null;\n        }\n    },\n\n    onExternalIframeFocus: observer('iframeState.focused', function () {\n        if (this.showDropdown && this.attachOutsideClick && this.get('iframeState.focused')) {\n            this.close();\n        }\n    }),\n\n    close() {\n        this._verbose('close');\n        this.set('showDropdown', false);\n        this.removeWindowListener();\n        this.broadcastDropdownChange();\n    },\n\n    broadcastDropdownChange() {\n        if (typeof this.onDropdownChange === 'function') {\n            this.onDropdownChange(this.showDropdown);\n        }\n    },\n\n    /**\n     * To help with debugging. Turn on _verboseLogging to log all the stuff.\n     */\n    _verbose(msg) {\n        if (this._verboseLogging) {\n            const log = this.dropdownInfo\n                ? `${msg} %c${this.elementId} %c${this.dropdownInfo}`\n                : `${msg} %c${this.elementId}`;\n            console.log(log, 'font-weight: bold', 'color: green');\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"RdJk6MKK\",\"block\":\"[[[18,1,null],[1,\\\"\\\\n\\\"]],[\\\"&default\\\"],false,[\\\"yield\\\"]]\",\"moduleName\":\"web-directory/components/drop-down/template.hbs\",\"isStrictMode\":false});","import { run } from '@ember/runloop';\nimport $ from 'jquery';\nimport Component from '@ember/component';\n\nexport default Component.extend({\n    classNames: ['dropdown-menu-view'],\n\n    showMenu: false,\n\n    actions: {\n        toggleMenu() {\n            this.toggleProperty('showMenu');\n        },\n        handleKeyDown(e) {\n            if (e.code === 'Escape' || e.code === 'Enter') {\n                this.set('showMenu', false);\n            }\n        }\n    },\n\n    didInsertElement() {\n        const id = this.elementId;\n        $(window).on(`click.${id}`, event => {\n            run(() => {\n                const target = $(event.target);\n                const parents = target.parents('.dropdown-menu-view');\n                const targetOutside = !parents.length || id !== parents.attr('id');\n                const targetInput = target.parent('.input').length;\n                const listItem = target.prop('tagName') === 'LI';\n                if (targetOutside || targetInput || listItem) {\n                    this.set('showMenu', false);\n                }\n            });\n        });\n    },\n\n    willDestroyElement() {\n        $(window).off(`.${this.elementId}`);\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"1FnAMjNY\",\"block\":\"[[[11,\\\"button\\\"],[24,0,\\\"btn btn-purecloud\\\"],[16,\\\"onkeydown\\\",[28,[37,0],[[30,0],\\\"handleKeyDown\\\"],null]],[24,4,\\\"button\\\"],[4,[38,0],[[30,0],[28,[37,0],[[30,0],\\\"toggleMenu\\\"],null]],null],[12],[1,\\\"\\\\n    \\\"],[10,0],[12],[1,[34,1]],[13],[1,\\\"\\\\n    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"arrow-solid-down\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,\\\"ul\\\"],[15,0,[29,[\\\"dropdown-menu list-unstyled \\\",[52,[33,3],\\\"show\\\"]]]],[15,\\\"onkeydown\\\",[28,[37,0],[[30,0],\\\"handleKeyDown\\\"],null]],[12],[1,\\\"\\\\n    \\\"],[18,1,null],[1,\\\"\\\\n\\\"],[13]],[\\\"&default\\\"],false,[\\\"action\\\",\\\"title\\\",\\\"if\\\",\\\"showMenu\\\",\\\"yield\\\"]]\",\"moduleName\":\"web-directory/components/dropdown-menu/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { inject } from '@ember/service';\nimport layout from './template';\n\nfunction padZero(num: number): string {\n    return num < 10 ? `0${num}` : `${num}`;\n}\n\ntype FormatType = 'digital' | 'separated';\n\n/** Represents the subset of a moment duration object we rely on. */\ninterface MomentDuration {\n    asMilliseconds(): number;\n}\n\n/** Acceptable value types for startTime / endTime attributes. */\ntype TimeValue = string | number | Date | null;\n\n/**\n * Checks if a value is a moment object by duck-typing.\n * Avoids importing moment directly.\n */\nfunction isMoment(value: unknown): boolean {\n    return (\n        value != null &&\n        typeof value === 'object' &&\n        typeof (value as any).toISOString === 'function' &&\n        typeof (value as any).valueOf === 'function' &&\n        (value as any)._isAMomentObject === true\n    );\n}\n\n/**\n * Converts a time value (string, number, Date, or moment object) to epoch milliseconds.\n * Returns null if the value is nullish or unparseable.\n */\nfunction toTimestampMs(value: TimeValue | { valueOf(): number; _isAMomentObject: true }): number | null {\n    if (value == null) {\n        return null;\n    }\n    if (isMoment(value)) {\n        return (value as any).valueOf();\n    }\n    if (typeof value === 'number') {\n        return value;\n    }\n    // string or Date\n    const ms = new Date(value as string | Date).getTime();\n    return isNaN(ms) ? null : ms;\n}\n\nexport default Component.extend({\n    layout,\n    tagName: 'span',\n    classNames: ['duration-format'],\n\n    clock: inject('clock'),\n\n    init() {\n        this._super(...arguments);\n    },\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n    },\n\n    /**\n     * @attribute\n     * Passed in start time — accepts a UTC string, timestamp number, Date, or moment object.\n     * optional\n     */\n    startTime: null as TimeValue,\n\n    /**\n     * @attribute\n     * Passed in end time — accepts a UTC string, timestamp number, Date, or moment object.\n     * optional\n     */\n    endTime: null as TimeValue,\n\n    /**\n     * @attribute\n     * Passed in duration in milliseconds.\n     * Also accepts a moment duration object (has .asMilliseconds()).\n     * optional\n     */\n    durationInMs: null as number | MomentDuration | null,\n\n    /**\n     * @attribute\n     * Format options\n     * digital: \"00:00:00\"\n     * separated: 1h 20m 3s\n     */\n    formatType: 'digital' as FormatType,\n\n    /**\n     * @computed\n     * Tick if we don't have both set start and ends (a hard duration)\n     */\n    tick: computed('startTime', 'endTime', function () {\n        const startTime = this.get('startTime');\n        const endTime = this.get('endTime');\n        if (startTime && !endTime) {\n            return true;\n        } else if (!startTime && endTime) {\n            return true;\n        }\n        return false;\n    }),\n\n    /**\n     * @computed\n     * Duration when ticking\n     */\n    tickingDuration: computed('startTime', 'endTime', 'durationInMs', 'clock.second', function () {\n        // Access clock.second to establish dependency tracking in Ember 3.28\n        // @ts-ignore - Variable intentionally unused to trigger dependency tracking\n        const _clockSecond = this.get('clock.second');\n        return this._formatDuration();\n    }),\n\n    /**\n     * @computed\n     * Duration when start and end are set and not ticking is needed\n     */\n    staticDuration: computed('startTime', 'endTime', 'durationInMs', function () {\n        return this._formatDuration();\n    }),\n\n    /**\n     * @computed\n     * Converting given start time to epoch milliseconds.\n     * Handles strings, numbers, Dates, and moment objects.\n     */\n    startTimeNumber: computed('startTime', function () {\n        return toTimestampMs(this.get('startTime'));\n    }),\n\n    /**\n     * @computed\n     * Converting given end time to epoch milliseconds.\n     * Handles strings, numbers, Dates, and moment objects.\n     */\n    endTimeNumber: computed('endTime', function () {\n        return toTimestampMs(this.get('endTime'));\n    }),\n\n    /**\n     * @function\n     * Formats duration for display\n     */\n    _formatDuration() {\n        const startTime = this.get('startTimeNumber');\n        const endTime = this.get('endTimeNumber');\n\n        let durationInMs;\n        if (startTime && endTime) {\n            durationInMs = endTime - startTime;\n        } else if (startTime) {\n            let newEnd = Date.now();\n            durationInMs = newEnd - startTime;\n        } else if (endTime) {\n            let newStart = Date.now();\n            durationInMs = endTime - newStart;\n        } else {\n            const rawDuration = this.get('durationInMs');\n            // Support moment duration objects that have .asMilliseconds()\n            if (\n                rawDuration != null &&\n                typeof rawDuration === 'object' &&\n                typeof rawDuration.asMilliseconds === 'function'\n            ) {\n                durationInMs = rawDuration.asMilliseconds();\n            } else {\n                durationInMs = rawDuration;\n            }\n        }\n        // Clamp to 0: if duration is null, undefined, negative, or 0 we display \"0:00\" (digital) or \"\" (separated).\n        const clampedMs: number = typeof durationInMs === 'number' && durationInMs > 0 ? durationInMs : 0;\n        let duration = this.separateTimeDuration(clampedMs);\n        if (this.formatType === 'separated') {\n            let hours = duration.hours;\n            let minutes = duration.minutes;\n            let seconds = duration.seconds;\n            let finalDurationString = '';\n\n            // construct the display output, skipping 0's\n            if (hours) {\n                finalDurationString = finalDurationString + `${hours.toString()}h `;\n            }\n            if (minutes) {\n                finalDurationString = finalDurationString + `${minutes.toString()}m `;\n            }\n            if (seconds) {\n                finalDurationString = finalDurationString + `${seconds.toString()}s`;\n            }\n            return finalDurationString; // separated format: 1h 20m 3s\n        } else {\n            // default to digital\n            let hours = '';\n            let minutes = '';\n\n            if (duration.hours) {\n                hours = `${duration.hours}:`;\n                minutes = duration.minutes ? `${padZero(duration.minutes)}:` : '00:';\n            } else {\n                hours = '';\n                minutes = duration.minutes ? `${duration.minutes}:` : '0:';\n            }\n            const seconds = duration.seconds ? `${padZero(duration.seconds)}` : '00';\n\n            return `${hours}${minutes}${seconds}`; // digital format: \"0:00\" or \"1:05:30\"\n        }\n    },\n\n    /**\n     * @function\n     * Takes a millisecond duration and spits back data structure of hours, minutes, and seconds\n     */\n    separateTimeDuration(durationInMs: number) {\n        const seconds = Math.floor((durationInMs / 1000) % 60);\n        const minutes = Math.floor((durationInMs / 1000 / 60) % 60);\n        const hours = Math.floor(durationInMs / (1000 * 60 * 60));\n\n        return {\n            hours,\n            minutes,\n            seconds\n        };\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"r2ZranEh\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[1,[34,2]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"    \\\"],[1,[34,3]],[1,\\\" \\\\n\\\"]],[]]]],[],false,[\\\"if\\\",\\\"tick\\\",\\\"tickingDuration\\\",\\\"staticDuration\\\"]]\",\"moduleName\":\"web-directory/components/duration-format/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { later, next } from '@ember/runloop';\nimport { inject } from '@ember/service';\nimport { Maybe } from 'web-directory/types';\nimport { ElementState, ElementStateKey, PopoverAction, PopoverOpenMethod, Position } from './dynamic-popover.type';\n\nconst DynamicPopoverWrapper = 'dynamic-popover-wrapper';\n\n/**\n * Note: I wanted to make this a root level component called `popover` but\n * due to already existing/conflicting components being imported from somewhere or a possible\n * native HTMLElement already existing I was not able to do so.\n *\n * @example\n * This dynamic-popover component should be the child of the component you want to initiate this popover.\n *\n * <button ...>\n *  {{#dynamic-popover}}\n *      ...\n *  {{/dynamic-popover}}\n * </button>\n *\n * The popover will create a trigger onto the parent element so when clicked this popover will open up.\n *\n * Any data you want to be injected into the popover, add to the inside of the component when you reference it in the template.\n *\n * <button ...>\n *  {{#dynamic-popover}}\n *      <div class='my-cool-popover'>\n *          ...\n *      </div>\n *  {{/dynamic-popover}}\n * </button>\n *\n * This component takes the innerHTML and creates the popover with the exact same HTML from within this trigger element.\n *\n * By default, popovers will only close if the user either clicks outside of the popover, or if the user clicks the trigger\n * element again to toggle the visibility. If you need to have an html element invoke a close for the popover, you can simply\n * add `popover-action='close'` to the element.\n *\n * <button popover-action='close' ...>\n *  Close the popover\n * </button>\n *\n * If an element is not able to be detected based on the built in `element.contains(node)` function, you can add the `prevent`\n * popover action to stop the propogation of the event in the DOM tree. Otherwise, the popover should only close when the user\n * either clicks the trigger again, or clicks outside of the dropdown.\n *\n * <button popover-action='prevent' ...>\n *  Close the popover\n * </button>\n */\nexport default Component.extend({\n    /**\n     * List of class names to apply to the component when it renders\n     */\n    classNames: ['dynamic-popover-trigger'] as const,\n\n    logger: inject('stashLogger'),\n\n    /**\n     * @attribute\n     *\n     * The tab index of the component. Defaults to 0 to allow for tabbing on the elements\n     * that trigger popovers. This tab index will be applied to the parent node of this trigger element.\n     * It will only set the tabindex of the parent node if the parent node is set to -1.\n     */\n    tabindex: 0,\n\n    /**\n     * @attribute\n     *\n     * The preferred position that the popover will try to render in. If the preferred position\n     * is not available due to screen size, it will try to flip to the opposite position to keep\n     * the optimal user experience.\n     */\n    position: 'bottom' as Position,\n\n    /**\n     * @attribute\n     *\n     * `true` if the popover should be destroyed after the `destroyTimeoutDuration` has elapsed.\n     * defaulting to `true` so we can keep cleaning up the DOM from too many popovers that won't be used again.\n     * This should be `false` if you have a component that has an internal state that needs to persist between\n     * component active states.\n     */\n    destroyIdlePopover: true,\n\n    /**\n     * @attribute\n     *\n     * The duration to wait for the popover element to be destroyed if it has been marked as hidden. This is configurable\n     * but defaults to 5 seconds.\n     */\n    destroyTimeoutDuration: 5000, // 5 seconds\n\n    /**\n     * @attribute\n     *\n     * Determines how the popover will open it's content.\n     * defaults to `click`.\n     */\n    openMethod: 'click' as PopoverOpenMethod,\n\n    /**\n     * @attribute\n     *\n     * Adds the string provided to the popover created in it's class property. This is to allow custom styling directly on the\n     * popover element itself from stylesheets.\n     */\n    popoverClass: null as string | null,\n\n    /**\n     * The reference to the element that this component is the child of.\n     * The parent will be responsible for this components triggers and when the popover is created\n     */\n    parentRef: null as Maybe<HTMLElement>,\n\n    /**\n     * The reference to the element that is created for the popover. The popover gets created when\n     * the trigger event occurs. It will be destroyed after the `destroyTimeoutDuration` has passed\n     * or if this component has been destroyed for whatever reason.\n     */\n    popoverRef: null as Maybe<HTMLDivElement>,\n\n    /**\n     * Array of different element states that this component is responsible for handling.\n     */\n    elementStates: new Map<ElementStateKey, ElementState>(),\n\n    /**\n     * `true` if the button has been clicked, and is active and enabled\n     */\n    active: false,\n\n    /**\n     * Reference to the currently active timeout that is responsible for the destruction of the popover element.\n     */\n    destroyTimeout: null as Maybe<NodeJS.Timeout>,\n\n    /**\n     * controller used to abort event listeners when the component is destroyed or for any other\n     * possible reason.\n     */\n    controller: new AbortController(),\n\n    /**\n     * a separate abort controller just for the handling of clicking outside the main element\n     */\n    clickController: new AbortController(),\n\n    /**\n     * Quick reference to the created wrapper element to be updated and extracted easily\n     */\n    wrapperRef: null as HTMLDivElement | null,\n\n    init() {\n        this._super(...arguments);\n        this.set(\n            'elementStates',\n            new Map<ElementStateKey, { hovering: boolean; focusing: boolean; element: HTMLElement }>()\n        );\n\n        this.set('controller', new AbortController());\n        this.set('clickController', new AbortController());\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        const element = this.get('element');\n        if (element && element.parentElement) {\n            this.set('parentRef', element.parentElement);\n\n            if (element.parentElement.tabIndex === -1) {\n                element.parentElement.tabIndex = this.get('tabindex');\n            }\n\n            element.parentElement.ariaExpanded = this.isOpen().toString();\n            this.initializeEvents(element.parentElement, 'trigger');\n        } else {\n            this.get('logger').warn(\n                'There was an issue applying a dynamic popover trigger. Element parent could not be determined.',\n                {\n                    remoteData: {\n                        elementId: this.get('elementId'),\n                        className: element ? element.className : undefined\n                    }\n                }\n            );\n        }\n\n        this.actionSetReference(this);\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n\n        this.get('controller').abort();\n        this.get('clickController').abort();\n        this.get('elementStates').delete('trigger');\n        this.destroyPopover();\n    },\n\n    /**\n     * @action\n     * @optional\n     *\n     * Sets the reference of this component to a parent element for later use outside of this component\n     */\n    actionSetReference: (_ref: any) => {},\n\n    /**\n     * @public\n     *\n     * Use to close the popover from outside of this component. To be used in tandem with the `actionSetReference`\n     * closure action in order to get the components reference.\n     */\n    close() {\n        if (this.get('active')) {\n            this.determinePopoverState(false);\n        }\n    },\n\n    /**\n     * @public\n     *\n     * Use the open the popover from outside of this component. To be used in tandem with the `actionSetReference`\n     * closure action in order to get the components reference.\n     */\n    open() {\n        if (!this.get('active')) {\n            this.determinePopoverState(true);\n        }\n    },\n\n    /**\n     * Creates the popover element, appends it to the components document body and applies the needed\n     * data to it for styling and content purposes.\n     */\n    createPopover() {\n        const popover = document.createElement('div');\n        this.set('popoverRef', popover);\n\n        // Prevents host from closing when user clicks within the popover\n        popover.addEventListener('mousedown', event => {\n            event.stopPropagation();\n            event.preventDefault();\n        });\n\n        this.applyPopoverClasses(this.get('position'));\n        this.determinePopoverState();\n        this.setupPopoverEvents(popover);\n\n        document.body.appendChild(popover);\n        this.initializeEvents(popover, 'popover', {\n            clickEvents: false,\n            focusEvents: true,\n            hoverEvents: true,\n            keyboardEvents: false\n        });\n\n        if (this.get('element')) {\n            this.determinePopoverContent(popover);\n        }\n    },\n\n    setupPopoverEvents(popover: HTMLDivElement) {\n        const parent = this.get('parentRef');\n        const { signal } = this.get('controller');\n\n        // Resets the position of the popover if the user is scrolling the container\n        window.addEventListener(\n            'scroll',\n            () => {\n                if (parent && popover && this.isOpen()) {\n                    this.setPopoverPosition(parent);\n                }\n            },\n            { signal, capture: true }\n        );\n\n        // Resets the position of the popover if the user is resizing the container\n        window.addEventListener(\n            'resize',\n            () => {\n                if (parent && popover && this.isOpen()) {\n                    this.setPopoverPosition(parent);\n                }\n            },\n            { signal, capture: true }\n        );\n\n        // this is to ensure that when a user tabs out of the popover, the focus goes back to\n        // the parent. But only if the popover is still open. If the user clicks outside of the\n        // popover we do not want the trigger to remain focused.\n        popover.addEventListener(\n            'blur',\n            () => {\n                later(\n                    this,\n                    () => {\n                        if (!this.isDestroyed) {\n                            if (!popover.contains(document.activeElement) && this.get('active')) {\n                                if (parent) {\n                                    parent.focus();\n                                }\n                            }\n                        }\n                    },\n                    100\n                );\n            },\n            { signal, capture: true }\n        );\n\n        popover.addEventListener(\n            'click',\n            (event: MouseEvent) => {\n                const target = event.target as HTMLElement;\n                const parent = target.parentElement;\n\n                const action = (target?.getAttribute('popover-action') ??\n                    parent?.getAttribute('popover-action')) as PopoverAction;\n\n                if (target && ((popover.contains(target) && action !== 'close') || action === 'prevent')) {\n                    event.stopPropagation();\n                } else if (parent && ((popover.contains(parent) && action !== 'close') || action === 'prevent')) {\n                    event.stopPropagation();\n                }\n            },\n            { signal }\n        );\n\n        popover.addEventListener(\n            'keydown',\n            event => {\n                next(this, () => {\n                    if (!this.isDestroyed) {\n                        if (event.key === 'Escape') {\n                            event.stopPropagation();\n                            this.determinePopoverState(false);\n                            if (parent) {\n                                event.preventDefault();\n                                parent.focus();\n                            }\n                        }\n                    }\n                });\n            },\n            { signal, capture: true }\n        );\n    },\n\n    /**\n     * Listeners to determine if the user has clicked outside of the element being\n     * passed through. If the element has been clicked outside of, then the popover\n     * will close.\n     */\n    setupOutsideClick() {\n        const popover = this.get('popoverRef');\n        const parent = this.get('parentRef');\n        if (popover && parent) {\n            this.set('clickController', new AbortController());\n            const { signal } = this.get('clickController');\n            document.addEventListener('click', this.hideOnClick.bind(this), { signal });\n        }\n    },\n\n    /**\n     * Detects if the popover should be hidden based on the event emitted\n     *\n     * @param event the event emitted from the native mouse event\n     */\n    hideOnClick(event: MouseEvent) {\n        const parent = this.get('parentRef');\n        const popover = this.get('popoverRef');\n\n        // the user can click on the parent element or on the popover without initiating the \"click off dismiss\"\n        if (parent && popover) {\n            const target = event.target as HTMLElement;\n            // Not all elements have an id, but this is the optimal way to figure out descendants\n            const targetId = target.id ? `#${target.id}` : null;\n\n            if ((target.getAttribute('popover-action') as PopoverAction) === 'close') {\n                // if the target contains the close attribute for the popover\n                this.determinePopoverState(false);\n            } else if ((parent.getAttribute('popover-action') as PopoverAction) === 'close') {\n                // if the parent contains the close attribute for the popover\n                this.determinePopoverState(false);\n            } else if (\n                targetId &&\n                parent.id !== target.id &&\n                !parent.querySelector(targetId) &&\n                !popover.querySelector(targetId)\n            ) {\n                // if the target is able to be queried from within the parent and popover\n                this.determinePopoverState(false);\n            } else if (!parent.contains(target) && !popover.contains(target)) {\n                // if the target contains the close attribute for the popover\n                this.determinePopoverState(false);\n            }\n        }\n    },\n\n    /**\n     * Determines what the HTML content of the popover should be based on the state of the trigger\n     *\n     * @param popover reference to the popover element that has been created\n     * @param element the trigger element that has the needed HTML residing inside of it\n     */\n    determinePopoverContent(popover: HTMLDivElement) {\n        this.resetPopoverContent();\n\n        // only add content if the popover doesn't already have content\n        if (this.get('active') || this.get('openMethod') === 'hover') {\n            next(this, () => {\n                if (!this.isDestroyed && !this.isDestroying) {\n                    const { children } = this.get('element');\n                    if (children.length) {\n                        const { childNodes } = children[0] as HTMLElement;\n                        if (childNodes.length) {\n                            const wrapper = this.createWrapper(Array.from(childNodes));\n                            popover.append(wrapper);\n                        }\n                    }\n                }\n            });\n        }\n    },\n\n    /**\n     * Resets the popover contents back to the initial state when it was created without any children elements\n     */\n    resetPopoverContent() {\n        const popover = this.get('popoverRef');\n        if (popover) {\n            const wrapper = this.get('wrapperRef');\n            if (wrapper && wrapper.children.length) {\n                // return the elements back to their original location so we don't lose them\n                // if the user opens this popover again in the future\n                const { children } = this.get('element');\n                if (children.length) {\n                    const spanWrapper = children[0] as HTMLElement;\n                    spanWrapper.append(...Array.from(wrapper.childNodes));\n                }\n            }\n\n            popover.childNodes.forEach(n => {\n                n.remove();\n            });\n        }\n    },\n\n    /**\n     * Creates a new div component and returns it. Intended to quickly create the  wrapper for\n     * the popover content. If the wrapper already exists it will just return that instead of\n     * creating a new one.\n     *\n     * @returns newly created wrapper div element\n     */\n    createWrapper(nodes: Node[]) {\n        let wrapper = this.get('wrapperRef');\n        if (wrapper) {\n            wrapper.append(...nodes);\n            return wrapper;\n        }\n\n        wrapper = document.createElement('div');\n        wrapper.className = DynamicPopoverWrapper;\n        wrapper.append(...nodes);\n        this.set('wrapperRef', wrapper);\n        return wrapper;\n    },\n\n    /**\n     * Applies the necessary classes (and attrs) to the created popover based on the requested position and type of\n     * the component.\n     *\n     * @param position The position to apply to the popover. The position can be different than the class level property\n     * if the client's viewport would not allow a good experience for the set position.\n     */\n    applyPopoverClasses(position: Position) {\n        const popover = this.get('popoverRef');\n        if (popover) {\n            popover.className = this.get('popoverClass') || '';\n            popover.classList.add('dynamic-popover');\n            popover.classList.add(position);\n        }\n    },\n\n    /**\n     * Resets the destroyTimeout property. This should be called every time the popover has been\n     * set to inactive to avoid too many elements being rendered that are not being used anymore\n     */\n    setDestroyTimeout() {\n        const timeout = this.get('destroyTimeout');\n        if (timeout) {\n            clearTimeout(timeout);\n        }\n\n        this.set(\n            'destroyTimeout',\n            setTimeout(() => {\n                this.destroyPopover();\n            }, this.get('destroyTimeoutDuration'))\n        );\n    },\n\n    /**\n     * Invoked when the popover should be destroyed. Either on component destroy, or after the\n     * timeout occurs.\n     */\n    destroyPopover() {\n        if (!this.get('isDestroyed')) {\n            this.get('elementStates').delete('popover');\n            const popover = this.get('popoverRef');\n            if (popover) {\n                // we want to reset the contents to move the children back to their original location\n                this.resetPopoverContent();\n                popover.remove();\n            }\n\n            this.set('popoverRef', null);\n            this.get('clickController').abort();\n\n            const timeout = this.get('destroyTimeout');\n            if (timeout) {\n                clearTimeout(timeout);\n                this.set('destroyTimeout', null);\n            }\n        }\n    },\n\n    /**\n     * Sets up the events onto the provided element. The trigger event depends on if there is popover content to display\n     *\n     * @param element the element to add the listeners to. This is likely the parent element if found.\n     * @param key the key that the events should be bound to for easily access\n     * @param options additional options to further define how/what events are being intialized\n     */\n    initializeEvents(\n        element: HTMLElement,\n        key: ElementStateKey,\n        options: {\n            clickEvents: boolean;\n            hoverEvents: boolean;\n            focusEvents: boolean;\n            keyboardEvents: boolean;\n        } = { clickEvents: true, hoverEvents: true, focusEvents: true, keyboardEvents: true }\n    ) {\n        const { signal } = this.get('controller');\n        const { clickEvents, hoverEvents, focusEvents, keyboardEvents } = options;\n        const currentValue = this.get('elementStates').get(key);\n\n        // if there is a current value we should take those values over the default, but make sure\n        // the element reference is the same no matter what.\n        this.get('elementStates').set(key, { hovering: false, focusing: false, ...currentValue, element });\n\n        if (clickEvents) {\n            element.addEventListener(\n                'click',\n                (event: MouseEvent) => {\n                    // we want the popover to automatically close if the user clicked on something that is out of\n                    // the context of the popover itself.\n                    const popover = this.get('popoverRef');\n                    if (popover && this.get('active') && !popover.contains(event.target as Node)) {\n                        this.determinePopoverState(false);\n                    } else {\n                        // the popover should only be active if there is content to inject into it\n                        this.determinePopoverState(!this.get('active'));\n                    }\n                },\n                { signal }\n            );\n        }\n\n        if (this.get('openMethod') === 'hover') {\n            if (hoverEvents) {\n                element.addEventListener('mouseenter', this.setElementState.bind(this, key, { hovering: true }, true), {\n                    signal\n                });\n                element.addEventListener('focus', this.setElementState.bind(this, key, { focusing: true }, true), {\n                    signal\n                });\n            }\n\n            if (focusEvents) {\n                element.addEventListener('blur', this.setElementState.bind(this, key, { focusing: false }, true), {\n                    signal\n                });\n                element.addEventListener(\n                    'mouseleave',\n                    this.setElementState.bind(this, key, { hovering: false }, true),\n                    { signal }\n                );\n            }\n        }\n\n        if (keyboardEvents) {\n            const pressed = new Set<string>();\n            element.addEventListener('keyup', event => pressed.delete(event.key));\n            element.addEventListener(\n                'keydown',\n                event => {\n                    if (this.get('active') && event.key === 'Tab') {\n                        const popover = this.get('popoverRef');\n                        if (popover) {\n                            const tabbableElements = $(popover).find(':tabbable');\n                            if (tabbableElements.length) {\n                                event.preventDefault();\n                                event.stopPropagation();\n                                tabbableElements[0].focus();\n                            }\n                        }\n                    }\n                },\n                { signal }\n            );\n        }\n    },\n\n    /**\n     * Updates the element state of the key provided to the value given and then checks the popover state after the changes\n     *\n     * @param key the elementState key to set the value of\n     * @param change the change to set the elementState to\n     * @param setActive `true` if the popover state should be enabled, `false` if disabled, `undefined` if auto checked\n     */\n    setElementState(key: ElementStateKey, change: Partial<ElementState>, checkState?: boolean) {\n        const value = this.get('elementStates').get(key);\n        if (value) {\n            this.get('elementStates').set(key, { ...value, ...change });\n        }\n\n        if (checkState) {\n            this.determinePopoverState();\n        }\n    },\n\n    /**\n     * `true` if the popover component is open and visible, `false` if it should be hidden.\n     * The state is determined based on if the popover content is active, or if the openMethod is set to `hover`.\n     */\n    isOpen() {\n        if (this.get('active')) {\n            return true;\n        } else if (this.get('openMethod') === 'hover') {\n            const states = Array.from(this.get('elementStates').values());\n            return states.some(s => s.focusing) || states.some(s => s.hovering);\n        }\n        return false;\n    },\n\n    /**\n     * Sets the popover visibility based on the value provided. It will create the popover if a popover does not currently\n     * exist for this component or has been destroyed already. This will also initiate the destroyTimeout sequence and\n     * invokes the setting of the popovers position.\n     *\n     * @param active `true` if the popover should be visible, `false` if it should be hidden. `undefined` if the value shouldn't be\n     * updated, but rather the state is just \"checked\" to update other data. Defaults to `undefined`.\n     */\n    async determinePopoverState(active?: boolean) {\n        if (!this.get('popoverRef')) {\n            this.createPopover();\n        }\n\n        const popover = this.get('popoverRef');\n        if (popover && this.get('element') && active !== undefined && active !== this.get('active')) {\n            this.set('active', active);\n\n            if (active) {\n                this.setupOutsideClick();\n            } else {\n                this.setElementState('popover', { focusing: false, hovering: false });\n                this.get('clickController').abort();\n            }\n\n            this.determinePopoverContent(popover);\n        }\n\n        const enabled = this.isOpen();\n        // reset the destroy timeout every time it's set inactive\n        if (this.get('destroyIdlePopover')) {\n            if (!enabled) {\n                this.setDestroyTimeout();\n            } else {\n                const timeout = this.get('destroyTimeout');\n                if (timeout) {\n                    clearTimeout(timeout);\n                    this.set('destroyTimeout', null);\n                }\n            }\n        }\n\n        if (popover) {\n            popover.style.display = enabled ? 'block' : 'none';\n        }\n\n        const parent = this.get('parentRef');\n        if (parent) {\n            this.setPopoverPosition(parent);\n            parent.ariaExpanded = enabled.toString();\n        }\n    },\n\n    /**\n     * Invoked when the popover's position should be recalculated. This is likely to occur when the popover is either created\n     * or reenabled based on the trigging events. The popover classes could also be redefined from this logic due to the position\n     * of the popover needing to change if the current viewport size would not deliver an optimal experience.\n     *\n     * @param target the target to base the popover's position on. This is likely the parent of the popover.\n     */\n    setPopoverPosition(target: HTMLElement) {\n        const popoverRef = this.get('popoverRef');\n        if (popoverRef) {\n            let position = this.get('position');\n\n            const targetBox = target.getBoundingClientRect();\n            const arrowSize = Number(getComputedStyle(popoverRef).getPropertyValue('--arrow-size').replace('px', ''));\n\n            const popoverBox = popoverRef.getBoundingClientRect();\n            const height = popoverBox.height + arrowSize;\n\n            // if the popover would be rendered partially offscreen lets force the other way. works both for top and bottom.\n            // Note: no edge case implemented if the popover were to be obscured by both top and bottom position\n            if (position === 'bottom' && targetBox.bottom + height > document.body.clientHeight) {\n                position = 'top';\n            }\n\n            // If statement is disconnected because if neither position works perfectly we force it to the bottom position.\n            if (position === 'top' && height > targetBox.top) {\n                position = 'bottom';\n            }\n\n            this.applyPopoverClasses(position);\n            switch (position) {\n                case 'top':\n                    popoverRef.style.top = `${targetBox.top}px`;\n                    popoverRef.style.left = `${targetBox.left + targetBox.width / 2}px`;\n                    break;\n                case 'bottom':\n                default:\n                    popoverRef.style.top = `${targetBox.top + targetBox.height}px`;\n                    popoverRef.style.left = `${targetBox.left + targetBox.width / 2}px`;\n            }\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"R47nLe8L\",\"block\":\"[[[41,[28,[37,1],[[33,2],[28,[37,3],[[33,4],\\\"hover\\\"],null]],null],[[[1,\\\"    \\\"],[10,1],[14,0,\\\"dynamic-popover-content-wrapper\\\"],[12],[1,\\\"\\\\n        \\\"],[18,1,null],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"&default\\\"],false,[\\\"if\\\",\\\"or\\\",\\\"active\\\",\\\"eq\\\",\\\"openMethod\\\",\\\"yield\\\"]]\",\"moduleName\":\"web-directory/components/dynamic-popover/template.hbs\",\"isStrictMode\":false});","import { run, debounce } from '@ember/runloop';\nimport { copy } from '@ember/object/internals';\nimport { isEmpty } from '@ember/utils';\nimport { inject as service } from '@ember/service';\nimport Evented from '@ember/object/evented';\nimport { computed, set, get } from '@ember/object';\nimport Component from '@ember/component';\nimport _ from 'lodash';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport { getIfNavLinkMatches } from './helpers';\nimport { getEvaluator } from 'boon-js';\n\nexport default Component.extend(LoggerMixin, Evented, {\n    classNames: ['admin-v2'],\n\n    adminNav: service(),\n    adminui: service(),\n    intl: service(),\n    engage: service(),\n    session: service(),\n    sidebar: service(),\n    frameService: service('center-stage-frame'),\n    permissions: service(),\n    modal: service(),\n    pageTitle: service('bookmark-page-title'),\n\n    name: 'admin',\n    path: null,\n    currentRoute: null,\n    currentPageCrumbs: null,\n\n    isHome: computed('breadcrumbs', function () {\n        // Flag for showing the expand/collapse toggle in the breadcrumb bar\n        return _.find(this.get('breadcrumbs.crumbs') || [], { key: 'ADMIN_HOME' });\n    }),\n    breadcrumbs: computed('location', 'adminui.menuJSON', 'currentPageCrumbs', 'session.useNewNav', function () {\n        let breadcrumbs = this.adminui.getMenuBreadcrumbs(this.location);\n        const currentPageCrumbs = this.currentPageCrumbs;\n\n        if (currentPageCrumbs) {\n            set(breadcrumbs, 'crumbs', _.union(breadcrumbs.crumbs, currentPageCrumbs));\n        } else if (!isEmpty(breadcrumbs) && !isEmpty(breadcrumbs.crumbs)) {\n            // always remove link from last breadcrumb\n            const lastBreadcrumb = _.last(breadcrumbs.crumbs);\n            if (Object.prototype.hasOwnProperty.call(lastBreadcrumb, 'hash')) {\n                set(lastBreadcrumb, 'hash', false);\n            }\n        }\n\n        if (breadcrumbs && this.get('session.useNewNav')) {\n            const crumbs = get(breadcrumbs, 'crumbs');\n            if (crumbs.length > 1) {\n                set(breadcrumbs, 'crumbs', crumbs.slice(1));\n            }\n        }\n\n        return breadcrumbs;\n    }),\n\n    showFreeTrialBanner: computed('session.freeTrial', function () {\n        return (\n            this.get('session.freeTrial') &&\n            this.get('session.freeTrial.startTimestamp') &&\n            !this.get('session.freeTrial.endTimestamp')\n        );\n    }),\n\n    freeTrialDaysRemaining: computed('session.freeTrial', function () {\n        if (this.showFreeTrialBanner) {\n            return String(this.get('session.freeTrial.daysRemaining'));\n        } else {\n            return '0';\n        }\n    }),\n\n    navStructure: computed(\n        'session.isAuthenticated',\n        'adminui.adminEntries',\n        'adminNav.fullNav',\n        'session.features',\n        function () {\n            let adminNav;\n            // Make deep copies in order to not manulate the object for anyone else\n            if (this.get('session.isAuthenticated')) {\n                adminNav = copy(this.get('adminNav.fullNav'), true);\n            } else {\n                adminNav = copy(this.get('adminui.adminEntries'), true);\n            }\n            // Add direct links for entries that match a center stage item and the toggle (if set) is turned on\n            const isItemFoundInFrameService = route => {\n                const frameService = this.frameService;\n                const routeFeatureToggle = frameService.toggleForPath(route);\n                const stopOldAdmin =\n                    routeFeatureToggle && routeFeatureToggle.useRedirctFromOldAdmin\n                        ? routeFeatureToggle.useRedirctFromOldAdmin\n                        : false;\n                const routeToggleOn =\n                    routeFeatureToggle === null\n                        ? true\n                        : getEvaluator(routeFeatureToggle.key)(this.get('session.features'));\n                return !!((routeToggleOn && frameService.baseRouteForPath(route)) || stopOldAdmin);\n            };\n            adminNav = updateKnownCenterStageClientLinks(adminNav, isItemFoundInFrameService);\n            return adminNav;\n        }\n    ),\n\n    location: computed('path', 'adminui.adminPath', function () {\n        const queryPath = this.path;\n        const adminPath = this.get('adminui.adminPath');\n        if (!adminPath && queryPath) {\n            return 'directory/people';\n        } else {\n            return adminPath;\n        }\n    }),\n\n    src: computed('location', 'navStructure', function () {\n        const location = this.location;\n        const navStructure = this.navStructure;\n        let current = null;\n        if (!navStructure.length) {\n            return;\n        }\n        _.forOwn(navStructure, heading => {\n            _.forOwn(heading.subLinks, item => {\n                current = getIfNavLinkMatches(location, item) || current;\n            });\n        });\n\n        var src = null;\n\n        if (current) {\n            if (current.emberRoute) {\n                this.sendAction('gotoRoute', current.emberRoute);\n                return;\n            }\n            if (typeof current.basePath === 'undefined') {\n                current.basePath = 'admin';\n            }\n            if (!current.subRoute) {\n                current.subRoute = location;\n            }\n            src = `/${current.basePath}`;\n            src += `/#/${location}`;\n            if (current.basePath === 'admin') {\n                src += '?context=directory&showMenu=false';\n            }\n            const queryPath = this.path;\n            if (queryPath) {\n                src += `&modal=${queryPath}`;\n            }\n\n            let queryParams = window.location.hash.match(/\\?.*/);\n\n            // Add locale as queryparam for altocloud\n            if (_.includes(src, '/journey/admin') || _.includes(src, '/journey-micro/')) {\n                const locale = this.get('intl.isoLocale');\n                const localParam = `locale=${encodeURIComponent(locale)}`;\n\n                if (!queryParams) {\n                    queryParams = ['?' + localParam];\n                } else if (!_.includes(queryParams[0], localParam)) {\n                    queryParams[0] += '&' + localParam;\n                }\n            }\n\n            if (queryParams !== null && queryParams[0].length) {\n                const existingParams = src.match(/\\?.*/);\n                if (existingParams !== null && existingParams[0].length) {\n                    queryParams[0] = queryParams[0].replace('?', '&');\n                }\n\n                src += queryParams[0];\n            }\n        } else {\n            if (window.location.href.match(/onboarding/)) {\n                _.forOwn(navStructure, heading => {\n                    _.forOwn(heading.subLinks, item => {\n                        if (item.href.match(/onboarding/)) {\n                            current = item;\n                            return false;\n                        }\n                    });\n                });\n\n                let p = window.location.href.replace(/.*onboarding/, '');\n                src = '/onboarding/#' + p;\n            } else {\n                // No item match in menu.json or onboarding, src it to admin-v1 and let it handle routing\n                return '/admin/#/' + location + '?context=directory&showMenu=false';\n            }\n        }\n\n        this.set('currentRoute', current);\n        return src;\n    }),\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.startMessageListener();\n        this.engage.on('navTreeUpdate', this, this.sendNavTree);\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.stopMessageListener();\n        // Must mirror the on() registration in didInsertElement (event, target, method). Calling\n        // off with only the event name funnels into Ember's removeListener with an undefined\n        // target/method and throws \"You must pass at least an object, event name, and method or\n        // target and method/method name to removeListener\" during admin (breadcrumb) teardown. The\n        // 1-arg form also never actually removed the listener, leaking a handler bound to a\n        // destroyed component.\n        this.engage.off('navTreeUpdate', this, this.sendNavTree);\n    },\n\n    handleNavigationMessage(data) {\n        data.data.hash = data.data.hash.replace(/^#/, '');\n        let currentRoute = this.currentRoute;\n        let hash = '#/admin';\n        if (currentRoute && currentRoute.routePrefix) {\n            hash += currentRoute.routePrefix;\n        }\n        hash += `${data.data.hash}`;\n        window.location.hash = hash;\n\n        const title = _.get(data.data, 'title');\n        if (title) {\n            document.title = title;\n            this.get('adminui').set('currentPageTitle', title);\n            this.get('pageTitle').set('adminPageTitle', title);\n        }\n\n        if (!_.get(data, 'data.skip')) {\n            this.set('currentPageCrumbs', null); // clear page crumbs if there's a route change\n        }\n    },\n\n    handleMessageEvent(event) {\n        run(() => {\n            try {\n                if (!event || !event.originalEvent) {\n                    return;\n                }\n\n                const { source, data } = event.originalEvent;\n\n                if (!source) {\n                    return;\n                }\n\n                if (source.name !== this.name) {\n                    return;\n                }\n\n                if (!source.document || !source.document.location) {\n                    return;\n                }\n\n                const { location } = source.document;\n                if (location.host !== window.location.host) {\n                    return;\n                }\n\n                if (!data) {\n                    return;\n                }\n\n                switch (data.type) {\n                    case 'content:route:changed': {\n                        debounce(this, this.handleNavigationMessage, data, 250);\n                        break;\n                    }\n                    case 'content:adminui:breadcrumbs:changed': {\n                        if (!_.isEmpty(data.data)) {\n                            _.each(data.data, crumb => {\n                                if (\n                                    Object.prototype.hasOwnProperty.call(crumb, 'hash') &&\n                                    crumb.hash &&\n                                    !crumb.hash.match(/^#\\/admin/)\n                                ) {\n                                    set(crumb, 'hash', crumb.hash.replace(/^#/, '#/admin')); // replace admin-ui route with web-directory admin route prefix\n                                }\n                            });\n                            this.adminui.set('currentPageCrumbs', data.data);\n                            this.set('currentPageCrumbs', data.data);\n                        }\n                        break;\n                    }\n                    case 'toast': {\n                        this.adminui.toast(data.data);\n                        break;\n                    }\n                    case 'modalRequest': {\n                        if (data.data) {\n                            this.modal.showModal(\n                                data.data,\n                                this.sendModalData.bind(this),\n                                this.sendModalDismiss.bind(this)\n                            );\n                        }\n                        break;\n                    }\n                    case 'request:engageNavTree': {\n                        this.sendNavTree();\n                        break;\n                    }\n                }\n            } catch (error) {\n                if (error && error.name === 'SecurityError') {\n                    return;\n                }\n                console.error('Error handling frame message:', { error });\n            }\n        });\n    },\n\n    startMessageListener() {\n        this._messageHandler = event => this.handleMessageEvent({ originalEvent: event });\n        window.addEventListener('message', this._messageHandler);\n    },\n\n    stopMessageListener() {\n        if (this._messageHandler) {\n            window.removeEventListener('message', this._messageHandler);\n        }\n    },\n\n    sendMessage: function (type, data) {\n        var iframe = this.element.querySelector('iframe');\n        var message = {\n            type: type,\n            data: data\n        };\n        this.logger.debug('Sending message type', type, data);\n        iframe.contentWindow.postMessage(message, window.location);\n    },\n\n    sendNavTree: function () {\n        var navTree = this.engage.navTree;\n        this.sendMessage('directory:engageNavTree:changed', navTree);\n    },\n\n    sendModalData(data) {\n        this.sendMessage('modalData', data);\n    },\n\n    sendModalDismiss(data) {\n        this.sendMessage('modalDismiss', data);\n    }\n});\n\nconst updateKnownCenterStageClientLinks = (navMenu = [], findInCenterStage) => {\n    navMenu.forEach(nav => {\n        if (nav.subLinks) {\n            nav.subLinks = updateKnownCenterStageClientLinks(nav.subLinks, findInCenterStage);\n        }\n        const route = '/admin/' + nav.href;\n        if (findInCenterStage(route)) {\n            // Make the nav menu not use link-to and instead supply the full url.\n            // This way we can be routed correctly to the center-stage-router and not the admin one\n            nav.direct = true;\n            nav.href = new URL('#' + route, window.location).toString();\n        }\n    });\n    return navMenu;\n};\n","/**\n * Returns the navLink object if it matches part of the location string.  Otherwise will return null.\n * Some match logic overrides or mutations may be are performed in the process.\n *\n * @param {string} location\n * @param {NavLink} navLink\n * @returns {?NavLink} matching navLink or null\n */\nexport function getIfNavLinkMatches(location, navLink) {\n    let output = null;\n\n    // special case added for responseManagement since there are subroutes in responseManagement that are not reflected in the\n    // navigation submenu list\n    const navPath = navLink.href.split('#/admin/').pop();\n    if (location.startsWith(navPath) || isResponseManagementSublink(location, navLink)) {\n        output = Object.assign({}, navLink);\n\n        if (isQueueDetails(location)) {\n            // Special case for queue's detail.  Queue list was moved to admin-v3 but the queue details page remains in v1.\n            delete output.basePath;\n        }\n    }\n\n    return output;\n}\n\n/**\n * @param {string} location\n * @param {NavLink} item\n * @returns {boolean}\n */\nfunction isResponseManagementSublink(location, item) {\n    const RESPONSE_MANAGEMENT = 'responseManagement';\n    return location.indexOf(RESPONSE_MANAGEMENT) > -1 && item.href.indexOf(RESPONSE_MANAGEMENT) > -1;\n}\n\n/**\n * @param {string} location\n * @returns {boolean}\n */\nfunction isQueueDetails(location) {\n    const QUEUE_DETAILS = /_queuesV2\\/\\w+/i;\n\n    return location.match(QUEUE_DETAILS);\n}\n\n/**\n * @typedef {object} NavLink\n * @property {string} href\n * @property {?string} basePath\n * @property {?string} subRoute\n */\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"agyj8pKz\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"free-trial\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,2],[\\\"admin.free_trial.banner\\\"],[[\\\"freeTrialDaysRemaining\\\"],[[33,3]]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,4,[\\\"crumbs\\\"]],[[[1,\\\"    \\\"],[1,[28,[35,5],null,[[\\\"breadcrumbs\\\",\\\"home\\\"],[[33,4,[\\\"crumbs\\\"]],[33,4,[\\\"home\\\"]]]]]],[1,\\\"\\\\n\\\"]],[]],null],[10,0],[14,0,\\\"admin-outlet\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"iframe\\\"],[15,\\\"title\\\",[29,[[36,6]]]],[15,3,[29,[[36,6]]]],[14,\\\"seamless\\\",\\\"seamless\\\"],[15,\\\"src\\\",[29,[[36,7]]]],[14,\\\"role\\\",\\\"presentation\\\"],[12],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"if\\\",\\\"showFreeTrialBanner\\\",\\\"t\\\",\\\"freeTrialDaysRemaining\\\",\\\"breadcrumbs\\\",\\\"breadcrumb-bar\\\",\\\"name\\\",\\\"src\\\"]]\",\"moduleName\":\"web-directory/components/embedded-admin/template.hbs\",\"isStrictMode\":false});","import { observer } from '@ember/object';\nimport { bind } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport Component from '@ember/component';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport MessageNotificationsMixin from 'web-directory/mixins/chat-service/message-notifications';\nimport EmbeddedMessageEventHandlerMixin from 'web-directory/mixins/embedded-message-event-handler';\nimport { task, timeout } from 'ember-concurrency';\nimport { isTesting } from 'web-directory/utils/testing';\n\nexport default Component.extend(LoggerMixin, MessageNotificationsMixin, EmbeddedMessageEventHandlerMixin, {\n    ajax: service(),\n    phoneService: service('phone'),\n    sidebar: service(),\n    interaction: service(),\n    engage: service(),\n    application: service(),\n    analytics: service(),\n    session: service(),\n    permissions: service(),\n    webrtc: service(),\n\n    attributeBindings: ['appUrl:src', 'title', 'role'],\n    classNames: ['embedded-app'],\n    location: '',\n    tagName: 'iframe',\n    role: 'presentation',\n\n    frameTimeout: isTesting ? 2000 : 40000,\n    hasAttemptedToLoad: false,\n    hasAttemptedToReload: false,\n    beginInitTime: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.webrtc.on(\n            'audioDeviceChange',\n            bind(this, device => {\n                this.nofityNewOutputDevice(device);\n            })\n        );\n    },\n\n    actions: {\n        goOnQueue: function () {\n            this.sendMessage('publish', {\n                topic: 'not.responding.notification.click',\n                data: { goOnQueue: true }\n            });\n        },\n\n        goOffQueue: function () {\n            this.sendMessage('publish', {\n                topic: 'not.responding.notification.click',\n                data: { goOnQueue: false }\n            });\n        }\n    },\n\n    //These handlers are used by the EmbeddedMessageEventHandlerMixin, when the message type matches the key\n    messageHandlers: {\n        alerting(data) {\n            this.sendAction('alerting', data);\n        },\n        back() {\n            window.history.back();\n        },\n        breadcrumb(data) {\n            this.sendAction('setBreadcrumb', data);\n        },\n        call(data) {\n            this.phoneService.makeCall(data.number);\n        },\n        documentfax(data) {\n            this.sendAction('documentFax', JSON.parse(data));\n        },\n        initialized() {\n            this._loadTimeoutTask.cancelAll();\n            const bootstrapTime = Date.now() - this.get('beginInitTime');\n            this.logger.info('Embedded app initialized', {\n                embeddedFrame: this.get('id'),\n                bootstrapTime\n            });\n            this.handleRouteChange();\n        },\n        interaction(data) {\n            this.sendAction('interact', data);\n        },\n        invalidatesession() {\n            const checkUri = this.application.pcV2Uri('api/v2/tokens/me');\n            // Check if the session is actually invalid\n            this.ajax.request(checkUri, { method: 'HEAD' }).catch(() => {\n                // The request failed, the session is invalid\n                this.session.invalidate();\n            });\n        },\n        log(data) {\n            this.logger[data.level || 'info'](data.msg);\n        },\n        navigation(data, options = {}) {\n            if (data === '#interactions') {\n                this.sendAction('interact', data);\n                return;\n            }\n            this.sendAction('navigation', data, options);\n        },\n        phone() {\n            this.sendAction('phone');\n        },\n        redirect(data) {\n            this.sendAction('redirect', data);\n        },\n        showinteractiondetails(data) {\n            this.engage.handleNavigation(`#admin/interactions/${data.conversationId}`);\n        },\n        toast(data) {\n            if (data.publishOnUserInteraction) {\n                data.clickHandler = () => {\n                    this.sendMessage('publish', data.publishOnUserInteraction);\n                };\n            }\n            this.handleToast(data);\n        },\n        registernav(data) {\n            this.sendAction('registerNavEntries', data);\n        },\n        helpurl(data) {\n            this.sendAction('helpURL', data);\n        }\n    },\n\n    handleRouteChange: observer('location', function () {\n        this.logger.debug('Handling route change', location);\n        this.element.contentWindow.location.replace(this.location);\n    }),\n\n    handleToast: function (toast) {\n        this.sendEngageNotification(toast);\n    },\n\n    sendMessage: function (type, data) {\n        var iframe = this.element;\n        var message = {\n            type: type,\n            data: data\n        };\n        this.logger.debug('Sending message type', type, data);\n        iframe.contentWindow.postMessage(message, window.location);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.set('beginInitTime', Date.now());\n\n        if (!this.hasAttemptedToLoad) {\n            this._loadTimeoutTask.perform();\n            this.set('hasAttemptedToLoad', true);\n        }\n    },\n\n    _loadTimeoutTask: task(function* () {\n        yield timeout(this.frameTimeout);\n        try {\n            this.element.contentWindow.location.reload();\n            this.set('hasAttemptedToReload', true);\n        } catch (err) {\n            if (!(this.location.indexOf('localhost') > -1)) {\n                this.logger.error('Error when trying to reload an embedded frame.', { err });\n            }\n        }\n    }),\n\n    nofityNewOutputDevice(device) {\n        this.sendMessage('publish', {\n            topic: 'audio.device.changed',\n            data: { device }\n        });\n    }\n});\n","import { reads, notEmpty } from '@ember/object/computed';\nimport { getOwner } from '@ember/application';\nimport { A } from '@ember/array';\nimport { inject as service } from '@ember/service';\nimport Component from '@ember/component';\nimport { computed, get } from '@ember/object';\nimport { task, waitForQueue } from 'ember-concurrency';\nimport cloneDeep from 'lodash/cloneDeep';\n\nconst COUNTRY_OPTIONS = [\n    {\n        displayName: 'emergencyLocation.country.usa',\n        value: 'US'\n    },\n    {\n        displayName: 'emergencyLocation.country.canada',\n        value: 'CA'\n    }\n];\n\nexport default Component.extend({\n    classNames: ['emergency-location'],\n    classNameBindings: ['saving:saving-emergency-location'],\n    intl: service(),\n\n    editingElocation: false,\n    eLocation: reads('emergencyLocationData.eLocation'),\n    showTitle: false,\n    showResetButton: false,\n    showTitleIcons: true,\n    showTitleInEditMode: true,\n    personId: null,\n    primaryVoice: reads('emergencyLocationData.primaryVoice'),\n    saving: false,\n    countryOptions: A([]),\n\n    street1: reads('updatedAddress.street1'),\n    street2: reads('updatedAddress.street2'),\n    city: reads('updatedAddress.city'),\n    state: reads('updatedAddress.state'),\n    zipcode: reads('updatedAddress.zipcode'),\n    country: computed('updatedAddress.country', 'countryOptions.[]', function () {\n        return this.get('updatedAddress.country') || '';\n    }),\n\n    street1ReadOnly: reads('eLocation.address.street1'),\n    street2ReadOnly: reads('eLocation.address.street2'),\n    cityReadOnly: reads('eLocation.address.city'),\n    stateReadOnly: reads('eLocation.address.state'),\n    zipcodeReadOnly: reads('eLocation.address.zipcode'),\n    countryReadOnly: reads('eLocation.address.country'),\n\n    isAddressEmpty(address) {\n        if (!address) {\n            return true;\n        }\n        return (\n            !get(address, 'street1') || !get(address, 'city') || !get(address, 'zipcode') || !get(address, 'country')\n        );\n    },\n\n    isEmpty: computed('eLocation.address.{street1,street2,city,zipcode,country}', function () {\n        return this.isAddressEmpty(this.get('eLocation.address'));\n    }),\n\n    showNumberInTitle: notEmpty('primaryVoice.number'),\n\n    // updatedAddess is used to bind to input values while in edit mode\n    // it is initialized with either eLocationAddress or previewAddress\n    // and is updated by user typed in values while in edit mode.\n    // This is the object that is used when saving the address to the endpoint\n    // This should not be passed down by parent component\n    updatedAddress: {\n        street1: '',\n        street2: '',\n        city: '',\n        state: '',\n        zipcode: '',\n        country: ''\n    },\n\n    // previewAddress contains the address that is passed down by the parent component\n    // This address is copied over to the updatedAddress to be seen in the address form.\n    previewAddress: {\n        street1: '',\n        street2: '',\n        city: '',\n        state: '',\n        zipcode: '',\n        country: ''\n    },\n\n    previewAddressIsEligible: true,\n    previewAddressError: '',\n\n    toolTipArrowId: computed('elementId', function () {\n        return `arrow-id-${this.elementId}`;\n    }),\n\n    toolTipHelpId: computed('elementId', function () {\n        return `help-id-${this.elementId}`;\n    }),\n\n    toolTipAlertInfoId: computed('elementId', function () {\n        return `alert-info-id-${this.elementId}`;\n    }),\n\n    isEligibleForE911: reads('emergencyLocationData.isEligibleForE911'),\n    eLocationInlineWarning: reads('emergencyLocationData.eLocationInlineWarning'),\n\n    hasELocationInlineWarning: notEmpty('eLocationInlineWarning'),\n\n    actions: {\n        goToProfile() {\n            const router = getOwner(this).lookup('router:main');\n            router.transitionTo(`/person-v2/${this.personId}?editEmergencyLocation=true`);\n            return false;\n        },\n        setField(field, event) {\n            if (!event || !event.target || !event.target.value) return;\n            this.set(`updatedAddress.${field}`, event.target.value);\n\n            if (this.updateElocationOnChange) {\n                this.updateElocationOnChange(this.updatedAddress);\n            }\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n        const countryTranslated = COUNTRY_OPTIONS.map(entry => {\n            return {\n                value: entry.value,\n                displayName: this.intl.safestring(entry.displayName).toString()\n            };\n        });\n        this.set('countryOptions', countryTranslated);\n    },\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n        this.setUpdatedAddress.perform();\n    },\n\n    setUpdatedAddress: task(function* () {\n        yield waitForQueue('actions');\n        if (this.eLocation && this.editingElocation && !this.saving) {\n            const eLocationCopy = cloneDeep(this.previewAddress);\n            this.set('updatedAddress', eLocationCopy);\n            if (this.updateElocationOnChange) {\n                this.updateElocationOnChange(cloneDeep(this.updatedAddress));\n            }\n        }\n    }).restartable()\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"96EBNLcd\",\"block\":\"[[[10,0],[15,0,[29,[\\\"edit-mode \\\",[52,[51,[33,1]],\\\"hidden\\\"]]]],[12],[1,\\\"\\\\n\\\"],[41,[33,3],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"title-section-edit\\\"],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"emergency-address-title\\\"],[12],[1,[28,[35,4],[\\\"emergencyLocation.title\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[10,1],[15,1,[29,[[36,5]]]],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"alert-info-edit\\\"],[14,\\\"icon-name\\\",\\\"alert-info\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[36,5]],[12],[1,[28,[35,4],[\\\"emergencyLocation.alertInfo\\\"],null]],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,6],[[[1,\\\"        \\\"],[10,\\\"gux-form-field-text-like\\\"],[14,\\\"label-position\\\",\\\"above\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"input\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,1,[29,[[36,7],\\\"-street1\\\"]]],[14,3,\\\"street1\\\"],[14,0,\\\"address-street1\\\"],[15,2,[36,8]],[15,\\\"placeholder\\\",[28,[37,4],[\\\"emergencyLocation.addressSection.address1Placeholder\\\"],null]],[15,\\\"onchange\\\",[28,[37,9],[[30,0],\\\"setField\\\",\\\"street1\\\"],null]],[14,4,\\\"text\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[15,\\\"for\\\",[29,[[36,7],\\\"-street1\\\"]]],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,4],[\\\"emergencyLocation.addressLabels.address1Label\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"gux-form-field-text-like\\\"],[14,\\\"label-position\\\",\\\"above\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"input\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,1,[29,[[36,7],\\\"-street2\\\"]]],[14,3,\\\"street2\\\"],[14,0,\\\"address-street2\\\"],[15,2,[36,10]],[15,\\\"placeholder\\\",[28,[37,4],[\\\"emergencyLocation.addressSection.address2Placeholder\\\"],null]],[15,\\\"onchange\\\",[28,[37,9],[[30,0],\\\"setField\\\",\\\"street2\\\"],null]],[14,4,\\\"text\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[15,\\\"for\\\",[29,[[36,7],\\\"-street2\\\"]]],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,4],[\\\"emergencyLocation.addressLabels.address2Label\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"gux-form-field-text-like\\\"],[14,\\\"label-position\\\",\\\"above\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"input\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,1,[29,[[36,7],\\\"-address-city\\\"]]],[14,3,\\\"city\\\"],[14,0,\\\"address-city\\\"],[15,2,[36,11]],[15,\\\"placeholder\\\",[28,[37,4],[\\\"emergencyLocation.addressSection.cityPlaceholder\\\"],null]],[15,\\\"onchange\\\",[28,[37,9],[[30,0],\\\"setField\\\",\\\"city\\\"],null]],[14,4,\\\"text\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[15,\\\"for\\\",[29,[[36,7],\\\"-address-city\\\"]]],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,4],[\\\"emergencyLocation.addressLabels.cityLabel\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"gux-form-field-text-like\\\"],[14,\\\"label-position\\\",\\\"above\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"input\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,1,[29,[[36,7],\\\"-address-state\\\"]]],[14,3,\\\"state\\\"],[14,0,\\\"address-state\\\"],[15,2,[36,12]],[15,\\\"placeholder\\\",[28,[37,4],[\\\"emergencyLocation.addressSection.statePlaceholder\\\"],null]],[15,\\\"onchange\\\",[28,[37,9],[[30,0],\\\"setField\\\",\\\"state\\\"],null]],[14,4,\\\"text\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[15,\\\"for\\\",[29,[[36,7],\\\"-address-state\\\"]]],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,4],[\\\"emergencyLocation.addressLabels.stateLabel\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"gux-form-field-text-like\\\"],[14,\\\"label-position\\\",\\\"above\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"input\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,1,[29,[[36,7],\\\"-address-zipcode\\\"]]],[14,3,\\\"zipcode\\\"],[14,0,\\\"address-zipcode\\\"],[15,2,[36,13]],[15,\\\"placeholder\\\",[28,[37,4],[\\\"emergencyLocation.addressSection.zipPlaceholder\\\"],null]],[15,\\\"onchange\\\",[28,[37,9],[[30,0],\\\"setField\\\",\\\"zipcode\\\"],null]],[14,4,\\\"text\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[15,\\\"for\\\",[29,[[36,7],\\\"-address-zipcode\\\"]]],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,4],[\\\"emergencyLocation.addressLabels.zipLabel\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"gux-form-field-dropdown\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-dropdown\\\"],[15,\\\"onchange\\\",[28,[37,9],[[30,0],\\\"setField\\\",\\\"country\\\"],null]],[15,1,[29,[[36,7],\\\"-country\\\"]]],[14,3,\\\"country\\\"],[14,0,\\\"address-country\\\"],[15,2,[36,14]],[15,\\\"placeholder\\\",[29,[[28,[37,4],[\\\"emergencyLocation.addressSection.countryPlaceholder\\\"],null]]]],[14,\\\"filterable\\\",\\\"true\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-listbox\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,16],[[28,[37,16],[[33,17]],null]],null],null,[[[1,\\\"                        \\\"],[10,\\\"gux-option\\\"],[15,2,[30,1,[\\\"value\\\"]]],[12],[1,[30,1,[\\\"displayName\\\"]]],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[15,\\\"for\\\",[29,[[36,7],\\\"-country\\\"]]],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,4],[\\\"emergencyLocation.addressLabels.countryLabel\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"empty-location\\\"],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"warning-for-not-eligible-number\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[1,[34,18]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[15,0,[29,[\\\"non-edit-mode \\\",[52,[33,1],\\\"hidden\\\"]]]],[12],[1,\\\"\\\\n\\\"],[41,[33,19],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"title-section\\\"],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"emergency-address-title\\\"],[12],[1,[28,[35,4],[\\\"emergencyLocation.title\\\"],null]],[13],[1,\\\"\\\\n\\\"],[41,[33,20],[[[1,\\\"                \\\"],[10,1],[15,1,[29,[[36,21]]]],[14,0,\\\"edit-emergency-location-icon\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,3],[14,6,\\\"#\\\"],[15,\\\"onClick\\\",[28,[37,9],[[30,0],\\\"goToProfile\\\"],null]],[14,0,\\\"to-profile\\\"],[15,\\\"aria-label\\\",[28,[37,4],[\\\"emergencyLocation.title\\\"],null]],[12],[1,\\\"\\\\n                        \\\"],[10,1],[12],[1,\\\"\\\\n                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"edit\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[36,21]],[12],[1,[28,[35,4],[\\\"emergencyLocation.update\\\"],null]],[13],[1,\\\"\\\\n                \\\"],[10,1],[15,1,[29,[[36,22]]]],[14,\\\"tabindex\\\",\\\"0\\\"],[15,\\\"aria-label\\\",[28,[37,4],[\\\"emergencyLocation.help\\\"],null]],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"toolbar-help\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[36,22]],[12],[1,[28,[35,4],[\\\"emergencyLocation.help\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,23],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"title-for-number\\\"],[12],[1,[28,[35,4],[\\\"emergencyLocation.titleForNumber\\\"],[[\\\"number\\\"],[[33,24,[\\\"display\\\"]]]]]],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,25],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"empty-location\\\"],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"warning-for-general-elocation-error\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[1,[34,26]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,27],[[33,28]],null],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"empty-location\\\"],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"warning-for-not-eligible-number\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[1,[28,[35,4],[\\\"emergencyLocation.errors.e911NotEligible\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,29],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"empty-location\\\"],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"warning-for-empty-address\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[1,[28,[35,4],[\\\"emergencyLocation.emptyAddress\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"emergency-address-field street1\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[34,30]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"emergency-address-field street2\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[34,31]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"emergency-address-field city-state-zip\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[34,32]],[1,\\\"\\\\n            \\\"],[1,[34,33]],[1,\\\"\\\\n            \\\"],[1,[34,34]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"emergency-address-field country\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[34,35]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"]],[]]]],[]]]],[]]],[13],[1,\\\"\\\\n\\\"],[41,[33,36],[[[1,\\\"    \\\"],[10,\\\"gux-button\\\"],[15,\\\"gux-title\\\",[29,[[28,[37,4],[\\\"emergencyLocation.buttonTitles.reset\\\"],null]]]],[14,\\\"accent\\\",\\\"tertiary\\\"],[15,\\\"onclick\\\",[28,[37,9],[[30,0],\\\"resetElocation\\\"],null]],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,4],[\\\"emergencyLocation.buttonTitles.reset\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"country\\\"],false,[\\\"unless\\\",\\\"editingElocation\\\",\\\"if\\\",\\\"showTitleInEditMode\\\",\\\"t\\\",\\\"toolTipAlertInfoId\\\",\\\"previewAddressIsEligible\\\",\\\"elementId\\\",\\\"street1\\\",\\\"action\\\",\\\"street2\\\",\\\"city\\\",\\\"state\\\",\\\"zipcode\\\",\\\"country\\\",\\\"each\\\",\\\"-track-array\\\",\\\"countryOptions\\\",\\\"previewAddressError\\\",\\\"showTitle\\\",\\\"showTitleIcons\\\",\\\"toolTipArrowId\\\",\\\"toolTipHelpId\\\",\\\"showNumberInTitle\\\",\\\"primaryVoice\\\",\\\"hasELocationInlineWarning\\\",\\\"eLocationInlineWarning\\\",\\\"not\\\",\\\"isEligibleForE911\\\",\\\"isEmpty\\\",\\\"street1ReadOnly\\\",\\\"street2ReadOnly\\\",\\\"cityReadOnly\\\",\\\"stateReadOnly\\\",\\\"zipcodeReadOnly\\\",\\\"countryReadOnly\\\",\\\"showResetButton\\\"]]\",\"moduleName\":\"web-directory/components/emergency-location/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { run } from '@ember/runloop';\nimport layout from './template';\nimport { emojifyDomUnicode } from 'web-directory/utils/emoji';\n\nexport default Component.extend({\n    scheduleEmojiDom: null,\n    layout,\n\n    // When using the block form of this component updating the content will not\n    // rerender the component (didRender will not trigger a second time).\n    didRender() {\n        this._super(...arguments);\n        this.set('scheduleEmojiDom', run.scheduleOnce('afterRender', this, this._emojiDom));\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        const scheduleEmojiDom = this.scheduleEmojiDom;\n        if (scheduleEmojiDom) {\n            run.cancel(scheduleEmojiDom);\n        }\n    },\n\n    _emojiDom() {\n        const $this = this.$();\n        if (!$this) {\n            return;\n        }\n        const node = $this.get(0);\n        if (node) {\n            emojifyDomUnicode(node);\n        }\n        this.set('scheduleEmojiDom', null);\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"yPVsm/Xk\",\"block\":\"[[[41,[48,[30,1]],[[[1,\\\"    \\\"],[18,1,null],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"    \\\"],[2,[36,3]],[1,\\\"\\\\n\\\"]],[]]]],[\\\"&default\\\"],false,[\\\"if\\\",\\\"has-block\\\",\\\"yield\\\",\\\"content\\\"]]\",\"moduleName\":\"web-directory/components/emoji-dom/template.hbs\",\"isStrictMode\":false});","import { equal, notEmpty } from '@ember/object/computed';\nimport { computed } from '@ember/object';\nimport Component from '@ember/component';\nimport layout from './template';\nimport DS from 'ember-data';\nimport debounce from 'lodash/debounce';\nimport isEmpty from 'lodash/isEmpty';\n\nexport default Component.extend({\n    layout,\n    classNames: ['entity-contact-group'],\n    classNameBindings: ['compact'],\n    canViewChat: true,\n    canViewVideo: true,\n    entity: null,\n    videoTooltipTitle: '',\n    linkProfile: false,\n    compact: false,\n    phoneServiceEnabled: false,\n    phoneAvailable: false,\n    isOneToOneOfflineOrBusy: true,\n    isChatEnabled: false,\n    isWebrtcEnabled: false,\n    isVideoButtonEnabled: false,\n    onContact() {},\n    callEntity() {},\n\n    useMediaProviders: false,\n\n    actions: {\n        sendToProfile(entity) {\n            this.bubbleAction({\n                action: 'transitionToEntityDetail',\n                actionContext: [entity]\n            });\n        },\n\n        makeCall: debounce(function () {\n            if (!this.phoneAvailable) {\n                return;\n            }\n            if (this.isGroup) {\n                this.callEntity(this.get('entity.contactInfo.groupNumber.firstObject'));\n            } else {\n                this.callEntity(this.entity);\n            }\n\n            this.onContact();\n        }, 250),\n\n        startChat() {\n            const entity = this.entity;\n            this.bubbleAction({\n                action: 'openChatRoom',\n                actionContext: [entity.get('jid')]\n            });\n\n            this.onContact();\n        },\n\n        launchWebrtc() {\n            if (this.isOneToOneOfflineOrBusy || !this.isVideoButtonEnabled) {\n                return;\n            }\n\n            const entity = this.entity;\n            this.bubbleAction({\n                action: 'openChatRoomWithVideo',\n                actionContext: [entity.get('jid'), this.useMediaProviders]\n            });\n\n            this.onContact();\n        }\n    },\n\n    isPerson: equal('entity.type', 'person'),\n    isGroup: equal('entity.type', 'group'),\n\n    isSelf: computed('entity.id', 'self.id', function () {\n        return this.get('entity.id') === this.get('self.id');\n    }),\n\n    email: computed('entity.primaryContactInfo.email.firstObject.value.fieldId', 'isPerson', function () {\n        if (!this.isPerson) {\n            return;\n        }\n        let entity = this.entity;\n        if (entity instanceof DS.PromiseObject) {\n            entity = entity.get('content');\n        }\n        if (!entity) {\n            return;\n        }\n        let email = entity.getFieldValue('primaryContactInfo.email');\n        return email.value;\n    }),\n    phone: computed(\n        'entity.primaryContactInfo.voice.firstObject.value.fieldId',\n        'isPerson',\n        'entity.contactInfo.groupNumber.firstObject.value.fieldId',\n        'isGroup',\n        function () {\n            if (!this.isPerson && !this.isGroup) {\n                return;\n            }\n            let entity = this.entity;\n            if (entity instanceof DS.PromiseObject) {\n                entity = entity.get('content');\n            }\n            if (!entity) {\n                return;\n            }\n            let phone = entity.getFieldValue('primaryContactInfo.voice', true);\n            if (this.isGroup) {\n                phone = entity.getFieldValue('contactInfo.groupNumber', true);\n            }\n            if (phone && phone.value && phone.value.fieldPath) {\n                return entity.getFieldValue(phone.value.fieldPath);\n            }\n            return phone;\n        }\n    ),\n\n    mailto: computed('email', 'emailEnabled', function () {\n        if (this.emailEnabled) {\n            return `mailto:${this.email}`;\n        }\n        return '';\n    }),\n\n    tel: computed('phone', function () {\n        const phone = this.phone;\n        if (phone.rel) {\n            return `tel:${phone.rel.e164}`;\n        }\n    }),\n\n    emailEnabled: notEmpty('email'),\n\n    // Phone button enabled if a phone is available or the entity has a phone number to use for a tel: link\n    phoneEnabled: computed('phoneServiceEnabled', 'phoneAvailable', 'phone', function () {\n        return (this.phoneServiceEnabled && this.phoneAvailable) || !isEmpty(this.phone);\n    }),\n\n    showPhone: computed('phoneServiceEnabled', 'phone', 'isGroup', function () {\n        if (!this.phoneServiceEnabled) {\n            return false;\n        }\n        if (this.isGroup) {\n            return !isEmpty(this.phone);\n        } else {\n            return true;\n        }\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"Lj8KCJmF\",\"block\":\"[[[41,[28,[37,1],[[33,2],[28,[37,3],[[33,4]],null]],null],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"contact-container\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[15,0,[29,[\\\"contact phone \\\",[52,[51,[33,6]],\\\"disabled\\\"]]]],[12],[1,\\\"\\\\n\\\"],[41,[33,7],[[[1,\\\"                \\\"],[11,3],[16,1,[29,[[36,8],\\\"-phone\\\"]]],[16,\\\"aria-label\\\",[29,[[28,[37,9],[\\\"purecloud-components.makeCallSr\\\"],[[\\\"name\\\"],[[33,10,[\\\"name\\\"]]]]]]]],[24,0,\\\"icon\\\"],[24,6,\\\"#\\\"],[4,[38,11],[[30,0],\\\"makeCall\\\"],null],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/phone\\\"],[15,\\\"screenreader-text\\\",[28,[37,9],[\\\"purecloud-components.makeCallSr\\\"],[[\\\"name\\\"],[[33,10,[\\\"name\\\"]]]]]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,8],\\\"-phone\\\"]]],[15,\\\"placement\\\",[52,[33,12],\\\"top\\\",\\\"bottom\\\"]],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,9],[\\\"purecloud-components.makeCall\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                \\\"],[10,3],[14,0,\\\"icon\\\"],[15,6,[29,[[36,13]]]],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/phone\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,14],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"contact-container\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[15,0,[29,[\\\"contact email \\\",[52,[51,[33,15]],\\\"disabled\\\"]]]],[12],[1,\\\"\\\\n            \\\"],[10,3],[15,1,[29,[[36,8],\\\"-email\\\"]]],[15,\\\"aria-label\\\",[28,[37,9],[\\\"purecloud-components.emailSr\\\"],[[\\\"name\\\"],[[33,10,[\\\"name\\\"]]]]]],[14,0,\\\"icon\\\"],[15,6,[29,[[36,16]]]],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/envelope\\\"],[15,\\\"screenreader-text\\\",[28,[37,9],[\\\"purecloud-components.emailSr\\\"],[[\\\"name\\\"],[[33,10,[\\\"name\\\"]]]]]],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,8],\\\"-email\\\"]]],[15,\\\"placement\\\",[52,[33,12],\\\"top\\\",\\\"bottom\\\"]],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,9],[\\\"purecloud-components.email\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,1],[[33,17],[33,18],[28,[37,3],[[33,4]],null]],null],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"contact-container\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"contact chat\\\"],[12],[1,\\\"\\\\n            \\\"],[11,3],[16,1,[29,[[36,8],\\\"-chat\\\"]]],[16,\\\"aria-label\\\",[29,[[28,[37,9],[\\\"purecloud-components.chatContact\\\"],[[\\\"name\\\"],[[33,10,[\\\"name\\\"]]]]]]]],[24,0,\\\"icon\\\"],[24,6,\\\"#\\\"],[4,[38,11],[[30,0],\\\"startChat\\\"],null],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/chat\\\"],[15,\\\"screenreader-text\\\",[28,[37,9],[\\\"purecloud-components.chatContact\\\"],[[\\\"name\\\"],[[33,10,[\\\"name\\\"]]]]]],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,8],\\\"-chat\\\"]]],[15,\\\"placement\\\",[52,[33,12],\\\"top\\\",\\\"bottom\\\"]],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,9],[\\\"purecloud-components.chat\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,14],[[[41,[28,[37,1],[[33,19],[33,20],[28,[37,3],[[33,4]],null]],null],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"contact-container\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[15,0,[29,[\\\"contact webrtc \\\",[52,[33,21],\\\"enabled\\\",\\\"disabled\\\"]]]],[12],[1,\\\"\\\\n                \\\"],[11,3],[16,1,[29,[[36,8],\\\"-video\\\"]]],[16,\\\"aria-label\\\",[29,[[28,[37,9],[\\\"purecloud-components.openVideoCallSr\\\"],[[\\\"tooltip\\\",\\\"name\\\"],[[33,22],[33,10,[\\\"name\\\"]]]]]]]],[24,0,\\\"icon\\\"],[24,6,\\\"#\\\"],[4,[38,11],[[30,0],\\\"launchWebrtc\\\"],null],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/video\\\"],[15,\\\"screenreader-text\\\",[28,[37,9],[\\\"purecloud-components.openVideoCallSr\\\"],[[\\\"tooltip\\\",\\\"name\\\"],[[33,22],[33,10,[\\\"name\\\"]]]]]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,8],\\\"-video\\\"]]],[15,\\\"placement\\\",[52,[33,12],\\\"top\\\",\\\"bottom\\\"]],[12],[1,\\\"\\\\n                    \\\"],[1,[34,22]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,23],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"contact-container\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"contact profile\\\"],[12],[1,\\\"\\\\n            \\\"],[11,3],[16,1,[29,[[36,8],\\\"-profile\\\"]]],[24,6,\\\"#\\\"],[24,0,\\\"icon\\\"],[4,[38,11],[[30,0],\\\"sendToProfile\\\",[33,10]],null],[12],[1,\\\"\\\\n                \\\"],[10,1],[14,0,\\\"sr-only\\\"],[12],[1,[28,[35,9],[\\\"purecloud-components.goToProfileSr\\\"],[[\\\"name\\\"],[[33,10,[\\\"name\\\"]]]]]],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/pc-user\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,8],\\\"-profile\\\"]]],[15,\\\"placement\\\",[52,[33,12],\\\"top\\\",\\\"bottom\\\"]],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,9],[\\\"purecloud-components.goToProfile\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[48,[30,1]],[[[1,\\\"    \\\"],[18,1,[[33,8]]],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"&default\\\"],false,[\\\"if\\\",\\\"and\\\",\\\"showPhone\\\",\\\"not\\\",\\\"isSelf\\\",\\\"unless\\\",\\\"phoneEnabled\\\",\\\"phoneServiceEnabled\\\",\\\"elementId\\\",\\\"t\\\",\\\"entity\\\",\\\"action\\\",\\\"useMediaProviders\\\",\\\"tel\\\",\\\"isPerson\\\",\\\"emailEnabled\\\",\\\"mailto\\\",\\\"canViewChat\\\",\\\"isChatEnabled\\\",\\\"canViewVideo\\\",\\\"isWebrtcEnabled\\\",\\\"isVideoButtonEnabled\\\",\\\"videoTooltipTitle\\\",\\\"linkProfile\\\",\\\"has-block\\\",\\\"yield\\\"]]\",\"moduleName\":\"web-directory/components/entity-contact-group/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport _ from 'lodash';\nimport FlagMixin from '../../mixins/flag';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport PersonModel from '../../models/person';\nimport EntityContact from '../entity-contact/component';\n\nexport default EntityContact.extend(FlagMixin, LoggerMixin, {\n    classNames: ['entity-contact'],\n    session: service(),\n    sidebar: service(),\n    commandNav: service('command-nav'),\n    phoneService: service('phone'),\n\n    layoutName: 'components/entity-contact',\n\n    makingCall: false,\n    queue: null,\n    phoneNumber: null,\n    call: null,\n\n    actions: {\n        makeCall: function () {\n            if (!this.makingCall) {\n                const person = this.get('otherParty.content') || this.person;\n\n                const queue = this.get('queue.content');\n                const phoneNumber = this.phoneNumber;\n\n                let callPromise;\n                this.set('makingCall', true);\n\n                if (this.get('call.isAcdCall')) {\n                    if (person instanceof PersonModel) {\n                        callPromise = this.phoneService.makeCall(person, null, queue);\n                    } else if (this.person && _.isEmpty(phoneNumber)) {\n                        this.set('makingCall', false);\n                        this._super();\n                        return;\n                    } else {\n                        callPromise = this.phoneService.makeCall(phoneNumber, null, queue);\n                    }\n                } else {\n                    callPromise = this.phoneService.makeCall(queue, null, false);\n                }\n\n                callPromise\n                    .then(() => {\n                        if (this.get('call.isAcdCall') && !_.isEmpty(queue)) {\n                            if (this.get('session.useNewNav')) {\n                                this.commandNav.selectPanel('agent');\n                            } else {\n                                if (this.get('sidebar.communicationPanel') !== 'acdInteractions') {\n                                    this.sidebar.togglePanel('acdInteractions');\n                                }\n                            }\n                        }\n                    })\n                    .finally(() => {\n                        this.set('makingCall', false);\n                    });\n            }\n        },\n\n        flagInteraction(action) {\n            this.flagInteractionAction(action);\n        }\n    }\n});\n","import { resolve } from 'rsvp';\nimport { on } from '@ember/object/evented';\nimport { readOnly, or, equal } from '@ember/object/computed';\nimport { computed, observer, get } from '@ember/object';\nimport { scheduleOnce, bind, once } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport Component from '@ember/component';\nimport _ from 'lodash';\nimport DS from 'ember-data';\n\nimport PromiseLoadingMixin from '../../mixins/promise-loading';\nimport FlagMixin from '../../mixins/flag';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nvar EntityContactComponent = Component.extend(PromiseLoadingMixin, FlagMixin, LoggerMixin, {\n    classNames: ['entity-contact'],\n\n    session: service(),\n    permissions: service(),\n    favorites: service(),\n    notification: service(),\n    addressformat: service(),\n    intl: service(),\n    phone: service(),\n\n    showPhone: false,\n    showChat: false,\n    showEmail: false,\n    showFavorite: false,\n    makingCall: false,\n    shouldTether: false,\n    contact: null,\n    phoneNumber: null,\n    email: null,\n    callId: null,\n    call: null,\n\n    shouldDisplayDropdown: true,\n    showDropdown: false,\n    callConnecting: false,\n    flaggingSupportEnabled: false,\n    isRedial: false,\n\n    tether: null,\n\n    actions: {\n        toggleFavorite: function () {\n            this.person.then(person => {\n                this.favorites.toggleFavorite(person);\n            });\n        },\n\n        toggleDropdown: function () {\n            this.toggleProperty('showDropdown');\n\n            if (this.showDropdown) {\n                let tether = this.tether;\n                if (this.shouldTether && !_.isEmpty(tether)) {\n                    scheduleOnce('afterRender', tether, tether.position);\n                }\n            }\n        },\n\n        makeCall: function (address) {\n            if (!this.get('permissions.phoneEnabled')) {\n                return;\n            }\n            if (!this.makingCall && !this.showPhoneSpinner) {\n                this.set('showDropdown', false);\n                this.set('makingCall', true);\n                this.set('callConnecting', true);\n\n                this.person\n                    .then(person => {\n                        if (address) {\n                            // Prefer action supplied phone number entry to makeCall.\n                            // User has clicked dropdown and selected a specific number.\n                            return this.phone.makeCall(address, person);\n                        } else if (!_.isEmpty(person) && !(this.isExternalContact || this.isGroup)) {\n                            // Or call person by their guid\n                            // Calling a person back at their preferred number.\n                            return this.phone.makeCall(person);\n                        } else {\n                            // Otherwise call person by specified phone number to the component.\n                            // (call-history-entry, active-call-entry components)\n                            const externalContactId = this.get('externalContactId');\n                            return this.get('phone').makeCall(this.get('phoneNumber'), person, null, externalContactId);\n                        }\n                    })\n                    .then(call => {\n                        if (!this.isDestroyed && !this.isDestroying) {\n                            this.set('callId', call.id);\n                        }\n                    })\n                    .catch(() => {\n                        if (!this.isDestroyed && !this.isDestroying) {\n                            this.set('callConnecting', false);\n                        }\n                    })\n                    .finally(() => {\n                        if (!this.isDestroyed && !this.isDestroying) {\n                            this.set('makingCall', false);\n                        }\n                    });\n            }\n        },\n\n        recordRecentContact: function (type, value) {\n            if (type === 'email') {\n                window.top.location = 'mailto:' + value.data.value;\n            } else if (type === 'voice' && !this.get('phone.enabled')) {\n                return;\n            }\n        },\n\n        sendToProfile: function () {\n            this.person.then(person => {\n                if (this.isDestroyed || this.isDestroying) {\n                    return;\n                }\n                this.bubbleAction({\n                    action: 'transitionToEntityDetail',\n                    actionContext: [person]\n                });\n\n                this.set('showDropdown', false);\n            });\n        },\n\n        flagInteraction(action) {\n            this.flagInteractionAction(action);\n        }\n    },\n\n    externalContact: computed('call.externalParticipants.lastObject.externalContact', function () {\n        const externalContact = this.get('call.externalParticipants.firstObject.externalContact');\n\n        if (typeof externalContact === 'object' && typeof externalContact.type === 'string') {\n            // Only use externalContact if it is a Curated type\n            return externalContact.type === 'Curated' ? externalContact : undefined;\n        }\n\n        return undefined;\n    }),\n\n    externalContactId: readOnly('externalContact.id'),\n\n    entityData: computed('contact.{id,name,isFavorite,type}', function () {\n        return {\n            id: this.get('contact.id'),\n            name: this.get('contact.name'),\n            isFavorite: this.get('contact.isFavorite'),\n            type: this.get('contact.type')\n        };\n    }),\n\n    callOrRedialLabel: computed('isRedial', 'phoneNumberDetails', function () {\n        const isRedial = this.isRedial;\n        const contact = this.phoneNumberDetails || '';\n        return isRedial\n            ? this.intl.t('components.callHistory.redial', { contact })\n            : this.intl.t('components.callHistory.call', { contact });\n    }),\n\n    isEntityFavoriteDecompEnabled: readOnly('session.features.epcDecompEntityFavorite'),\n\n    callConnected: observer('phone.activeCall', function () {\n        const activeCall = this.get('phone.activeCall');\n\n        if (activeCall) {\n            const activeCallId = get(activeCall, 'id');\n            const componentCallIsActiveCall = activeCallId === this.callId;\n            if (componentCallIsActiveCall) {\n                this.set('callConnecting', false);\n            }\n        }\n    }),\n\n    showPhoneSpinner: computed('makingCall', 'callConnecting', function () {\n        return this.makingCall || this.callConnecting;\n    }),\n\n    disablePhoneButton: or('showPhoneSpinner', 'phone.webrtcPhoneWithIssues'),\n\n    phoneNumberDetails: computed('phoneNumber', 'person.name', function () {\n        if (this.get('person.name')) {\n            return this.get('person.name');\n        }\n        return this.addressformat.formatAddressForDisplay(this.phoneNumber);\n    }),\n\n    phoneServiceEnabled: computed('phone.{enabled,phoneDisabled,noStationSelected}', function () {\n        return this.get('phone.enabled') && !this.get('phone.noStationSelected') && !this.get('phone.phoneDisabled');\n    }),\n\n    phoneEnabled: computed('showPhone', 'isExternalContact', 'phoneNumber', 'phone.phoneDisabled', function () {\n        if (this.get('phone.phoneDisabled') || this.personIsDeleted) {\n            return false;\n        }\n        return this.showPhone || ((this.isExternalContact || this.isGroup) && !!this.phoneNumber);\n    }),\n\n    chatEnabled: computed('showChat', 'isExternalContact', 'permissions.canViewBusinessChat', function () {\n        return this.get('permissions.canViewBusinessChat') && this.showChat && !this.isExternalContact;\n    }),\n\n    emailEnabled: computed('showEmail', 'isExternalContact', 'email', function () {\n        return this.showEmail || (this.isExternalContact && !!this.email);\n    }),\n\n    favoriteEnabled: computed('showFavorite', 'isExternalContact', 'favorites.enabled', function () {\n        return this.showFavorite && !this.isExternalContact && this.get('favorites.enabled');\n    }),\n\n    isExternal: computed('contact.participantType', function () {\n        if (this.get('contact.type') === 'person' || this.isExternalContact) {\n            return false;\n        }\n        return (\n            !this.get('contact.purpose') ||\n            this.get('contact.purpose').toLowerCase() === 'external' ||\n            _.isEmpty(this.get('contact.userId'))\n        );\n    }),\n\n    isExternalContact: computed('contact.type', function () {\n        return this.get('contact.type') === 'externalContact';\n    }),\n\n    isGroup: computed('contact.type', function () {\n        return this.get('contact.type') === 'group';\n    }),\n\n    setExternalContactInfo: on('didInsertElement', function () {\n        if (this.isExternalContact) {\n            var phone = this.get('contact.contactInfo.phone');\n            if (phone) {\n                this.set('phoneNumber', `tel:${phone[0].rel.e164}`);\n            }\n\n            var email = this.get('contact.contactInfo.email');\n            if (email) {\n                this.set('email', `mailto:${email[0].value}`);\n            }\n        }\n    }),\n\n    setupGroupPhoneNumber: on('didInsertElement', function () {\n        if (this.isGroup) {\n            scheduleOnce('afterRender', this, this.setGroupNumber);\n        }\n    }),\n\n    enableFavoriteEvent: on('didInsertElement', function () {\n        this._onFavoriteEvent = () => {\n            this.person.then(person => {\n                this.favorites.toggleFavorite(person);\n            });\n        };\n        this.element.addEventListener('favoriteEvent', this._onFavoriteEvent);\n    }),\n\n    person: computed('contact.{userId,type,id,name}', function () {\n        var type = this.get('contact.type');\n        var id = this.get('contact.id');\n        var userId = this.get('contact.userId');\n        const name = this.get('contact.name');\n        if (type && id && name) {\n            return DS.PromiseObject.create({\n                promise: resolve(this.contact)\n            });\n        } else if (userId) {\n            // This fall through will not be needed after public api v3 -- this looks up a user by GUID\n            return this.store.find('person', userId);\n        }\n        return resolve({});\n    }),\n\n    personIsDeleted: equal('person.state', 'deleted'),\n\n    hideChat: computed('contact.{id,userId}', 'session.person.id', function () {\n        let id = this.get('contact.id') || this.get('contact.userId');\n        return id === this.get('session.person.id');\n    }),\n\n    jid: computed('person.jid', 'contact.jid', function () {\n        if (this.get('contact.type') === 'group') {\n            return this.get('contact.jid');\n        }\n\n        return this.get('person.jid');\n    }),\n\n    phones: computed('person', 'isExternalContact', function () {\n        if (this.isExternalContact) {\n            return this.get('contact.contactInfo.phone');\n        } else {\n            var promise = this.person.then(person => {\n                return this.getContactFieldValuesByType(person, 'voice');\n            });\n            return DS.PromiseArray.create({\n                promise: promise\n            });\n        }\n    }),\n\n    emails: computed('person', 'isExternalContact', function () {\n        if (this.isExternalContact) {\n            return this.get('contact.contactInfo.email');\n        } else {\n            var promise = this.person.then(person => {\n                this.getContactFieldValuesByType(person, 'email');\n            });\n            return DS.PromiseArray.create({\n                promise: promise\n            });\n        }\n    }),\n\n    displayDropdown: computed('shouldDisplayDropdown', 'phones', 'emails', 'isExternalContact', function () {\n        var hasEmail = !_.isEmpty(this.emails);\n        var hasPhone = !_.isEmpty(this.phones);\n        var canDisplay = this.shouldDisplayDropdown;\n        var isContact = this.isExternalContact;\n\n        return canDisplay && (!isContact || hasEmail || hasPhone);\n    }),\n\n    callTitle: computed(function () {\n        return this.intl.t('tooltip.contactIcon.phone').toString();\n    }),\n\n    attachListeners: on('didInsertElement', function () {\n        this._onWindowClick = bind(this, this.detectOutsideClick);\n        window.addEventListener('click', this._onWindowClick);\n    }),\n\n    setupTether: on('didInsertElement', function () {\n        if (!this.shouldTether) {\n            return;\n        }\n        scheduleOnce('afterRender', this, function () {\n            let tether = new window.Tether({\n                element: this.element.querySelector('.dropdown-menu'),\n                target: this.element.querySelector('.show-more'),\n                attachment: 'top right',\n                targetAttachment: 'bottom right',\n                constraints: [\n                    {\n                        to: 'scrollParent',\n                        attachment: 'together',\n                        pin: true\n                    }\n                ]\n            });\n\n            this.set('tether', tether);\n        });\n    }),\n\n    removeTether() {\n        let tether = this.tether;\n        if (tether) {\n            tether.destroy();\n            if (tether.element) {\n                tether.element.remove();\n            }\n        }\n    },\n\n    removeListeners() {\n        if (this._onWindowClick) {\n            window.removeEventListener('click', this._onWindowClick);\n        }\n    },\n\n    willDestroyElement() {\n        this.removeListeners();\n        this.removeTether();\n        if (this._onFavoriteEvent) {\n            this.element.removeEventListener('favoriteEvent', this._onFavoriteEvent);\n        }\n\n        this._super(...arguments);\n    },\n\n    detectOutsideClick: function (event) {\n        var id = this.elementId;\n        var target = event.target;\n\n        if (this.isDestroyed || this.isDestroying) {\n            return;\n        }\n\n        if (id && !target.closest('#' + id)) {\n            once(this, this.set, 'showDropdown', false);\n        }\n    },\n\n    getContactFieldValuesByType: function (person, type) {\n        if (!person.getContactFieldValuesByType) {\n            return [];\n        }\n        var items = person.getContactFieldValuesByType(type).map(function (item) {\n            return { data: item };\n        });\n        var primary = person.getFieldValue(`primaryContactInfo.${type}`, true);\n        if (!_.isEmpty(primary)) {\n            var primaryItem = _.find(items, function (item) {\n                return get(item.data, '_id') === get(primary, 'value.fieldId');\n            });\n            if (primaryItem) {\n                primaryItem.primary = true;\n            }\n        }\n        return _.sortBy(items, function (item) {\n            return item.primary;\n        });\n    },\n\n    notifyError: function (key) {\n        this.notification.show({\n            target: this.get('phone.applicationController'),\n            tag: 'callHistory',\n            message: this.intl.t(key),\n            type: 'error',\n            hideAfter: false,\n            actionHandlers: {\n                reportError: this.intl.t('components.navMenu.feedback.contactSupport').toString()\n            }\n        });\n    },\n\n    setGroupNumber() {\n        const data = this.contact.getFieldValue('contactInfo.groupNumber');\n        if (!_.isEmpty(data)) {\n            const number = this.addressformat.format(data);\n            this.set('phoneNumber', `tel:${number}`);\n        }\n    }\n});\n\nexport default EntityContactComponent;\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"3Z3Iz7wS\",\"block\":\"[[[10,0],[14,0,\\\"btn-group\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,1],[[[41,[33,2],[[[1,\\\"            \\\"],[11,\\\"button\\\"],[16,\\\"aria-label\\\",[36,3]],[16,0,[29,[\\\"btn btn-link btn-phone make-call \\\",[52,[51,[33,1]],\\\"hide\\\"]]]],[16,\\\"disabled\\\",[36,5]],[16,\\\"title\\\",[36,6]],[24,4,\\\"button\\\"],[4,[38,7],[[30,0],\\\"makeCall\\\"],null],[12],[1,\\\"\\\\n\\\\n\\\"],[41,[33,8],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"phone\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null],[41,[33,9],[[[1,\\\"        \\\"],[11,\\\"button\\\"],[16,\\\"aria-label\\\",[28,[37,10],[\\\"components.inbox.actions.openChat\\\"],null]],[16,0,[29,[\\\"btn btn-link btn-chat \\\",[52,[51,[33,9]],\\\"hide\\\"]]]],[24,4,\\\"button\\\"],[4,[38,7],[[30,0],[28,[37,11],[\\\"openChatRoom\\\",[33,12]],null]],null],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"deprecated/toolbar-chat\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,13],[[[1,\\\"        \\\"],[10,3],[15,0,[29,[\\\"icon btn btn-link btn-email \\\",[52,[51,[33,13]],\\\"hide\\\"]]]],[15,6,[36,14]],[15,\\\"aria-label\\\",[28,[37,10],[\\\"tooltip.contactIcon.email\\\"],null]],[12],[1,\\\"\\\\n\\\"],[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"message-email\\\"],[15,\\\"screenreader-text\\\",[28,[37,10],[\\\"tooltip.contactIcon.email\\\"],null]],[12],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,15],[[[1,\\\"        \\\"],[10,\\\"entity-favorite\\\"],[15,\\\"entityFavoriteData\\\",[36,16]],[12],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[51,[28,[37,17],[[33,18],[28,[37,19],[[33,20]],null]],null]],[[[41,[33,21],[[[1,\\\"            \\\"],[11,\\\"button\\\"],[16,\\\"aria-expanded\\\",[29,[[52,[33,22],\\\"true\\\",\\\"false\\\"]]]],[16,\\\"aria-label\\\",[28,[37,10],[\\\"common.more\\\"],null]],[16,0,[29,[\\\"btn btn-link btn-dropdown show-more \\\",[52,[28,[37,17],[[33,18],[28,[37,19],[[33,20]],null]],null],\\\"hide\\\"]]]],[24,4,\\\"button\\\"],[4,[38,7],[[30,0],\\\"toggleDropdown\\\"],null],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"menu-kebab-horizontal\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null],[1,\\\"\\\\n\\\"],[41,[51,[28,[37,17],[[33,18],[28,[37,19],[[33,20]],null]],null]],[[[1,\\\"        \\\"],[10,\\\"ul\\\"],[15,0,[29,[\\\"dropdown-menu \\\",[52,[33,22],\\\"show\\\"],\\\" \\\",[52,[33,23],\\\"entity-contact-dropdown-menu\\\"]]]],[12],[1,\\\"\\\\n\\\"],[41,[33,24],[[[1,\\\"                \\\"],[10,\\\"li\\\"],[14,0,\\\"list-header\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"phone\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[1,[28,[35,10],[\\\"purecloud.phone\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[51,[33,25]],[[[42,[28,[37,27],[[28,[37,27],[[33,24]],null]],null],\\\"@index\\\",[[[1,\\\"                    \\\"],[10,\\\"li\\\"],[15,0,[29,[\\\"entry\\\\n                            \\\",[52,[30,1,[\\\"primary\\\"]],\\\"primary\\\"],\\\"\\\\n                            \\\",[52,[28,[37,19],[[33,28,[\\\"phoneEnabled\\\"]]],null],\\\"disable-call\\\"]]]],[12],[1,\\\"\\\\n                        \\\"],[11,1],[24,0,\\\"number\\\"],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[4,[38,7],[[30,0],\\\"recordRecentContact\\\",\\\"voice\\\",[30,1]],null],[12],[1,\\\"\\\\n\\\"],[41,[33,2],[[[1,\\\"                                \\\"],[11,3],[24,6,\\\"#\\\"],[16,\\\"title\\\",[36,29]],[4,[38,7],[[30,0],\\\"makeCall\\\",[30,1,[\\\"data\\\"]]],null],[12],[1,\\\"\\\\n                                    \\\"],[1,[30,1,[\\\"data\\\",\\\"value\\\",\\\"number\\\"]]],[1,\\\"\\\\n\\\"],[41,[30,1,[\\\"data\\\",\\\"value\\\",\\\"extension\\\"]],[[[1,\\\"                                        \\\"],[10,1],[12],[1,[28,[35,10],[\\\"entity.fieldTypes.phone.extension\\\"],null]],[13],[1,\\\"\\\\n                                        \\\"],[10,1],[14,0,\\\"extension\\\"],[12],[1,[30,1,[\\\"data\\\",\\\"value\\\",\\\"extension\\\"]]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                \\\"],[1,[28,[35,30],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\"],[[30,1,[\\\"data\\\",\\\"value\\\",\\\"number\\\"]],\\\"tel\\\",[30,1,[\\\"data\\\",\\\"rel\\\",\\\"e164\\\"]]]]]],[1,\\\"\\\\n\\\"],[41,[30,1,[\\\"data\\\",\\\"value\\\",\\\"extension\\\"]],[[[1,\\\"                                    \\\"],[10,1],[12],[1,[28,[35,10],[\\\"entity.fieldTypes.phone.extension\\\"],null]],[13],[1,\\\"\\\\n                                    \\\"],[10,1],[14,0,\\\"extension\\\"],[12],[1,[30,1,[\\\"data\\\",\\\"value\\\",\\\"extension\\\"]]],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null]],[]],[[[42,[28,[37,27],[[28,[37,27],[[33,24]],null]],null],\\\"@index\\\",[[[1,\\\"                    \\\"],[10,\\\"li\\\"],[15,0,[29,[\\\"entry \\\",[52,[30,2,[\\\"primary\\\"]],\\\"primary\\\"]]]],[12],[1,\\\"\\\\n\\\"],[41,[33,2],[[[1,\\\"                            \\\"],[11,1],[24,0,\\\"number\\\"],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[4,[38,7],[[30,0],\\\"recordRecentContact\\\",\\\"voice\\\",[30,2]],null],[12],[1,\\\"\\\\n                                \\\"],[11,3],[24,6,\\\"#\\\"],[16,\\\"title\\\",[36,29]],[4,[38,7],[[30,0],\\\"makeCall\\\",[30,2]],null],[12],[1,\\\"\\\\n                                    \\\"],[1,[30,2,[\\\"value\\\",\\\"number\\\"]]],[1,\\\"\\\\n\\\\n\\\"],[41,[30,2,[\\\"value\\\",\\\"extension\\\"]],[[[1,\\\"                                        \\\"],[10,1],[12],[1,[28,[35,10],[\\\"entity.fieldTypes.phone.extension\\\"],null]],[13],[1,\\\"\\\\n                                        \\\"],[10,1],[14,0,\\\"extension\\\"],[12],[1,[30,2,[\\\"value\\\",\\\"extension\\\"]]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                                \\\"],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[10,1],[14,0,\\\"number\\\"],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,30],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\"],[[30,2,[\\\"value\\\",\\\"number\\\"]],\\\"tel\\\",[30,2,[\\\"rel\\\",\\\"e164\\\"]]]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[30,2,[\\\"value\\\",\\\"extension\\\"]],[[[1,\\\"                                    \\\"],[10,1],[12],[1,[28,[35,10],[\\\"entity.fieldTypes.phone.extension\\\"],null]],[13],[1,\\\"\\\\n                                    \\\"],[10,1],[14,0,\\\"extension\\\"],[12],[1,[30,2,[\\\"value\\\",\\\"extension\\\"]]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n\\\"]],[2]],null]],[]]],[1,\\\"\\\\n\\\"],[41,[33,31],[[[1,\\\"                \\\"],[10,\\\"li\\\"],[14,0,\\\"list-header\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"message-email\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[1,[28,[35,10],[\\\"purecloud.email\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[51,[33,25]],[[[42,[28,[37,27],[[28,[37,27],[[33,31]],null]],null],\\\"@index\\\",[[[1,\\\"                    \\\"],[11,\\\"li\\\"],[16,0,[29,[\\\"entry email \\\",[52,[30,3,[\\\"primary\\\"]],\\\"primary\\\"]]]],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[4,[38,7],[[30,0],\\\"recordRecentContact\\\",\\\"email\\\",[30,3]],null],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,30],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\"],[[30,3,[\\\"data\\\",\\\"value\\\"]],\\\"mailto\\\",[30,3,[\\\"data\\\",\\\"value\\\"]]]]]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[3]],null]],[]],[[[42,[28,[37,27],[[28,[37,27],[[33,31]],null]],null],\\\"@index\\\",[[[1,\\\"                    \\\"],[10,\\\"li\\\"],[14,0,\\\"entry email primary\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,30],null,[[\\\"label\\\",\\\"protocol\\\",\\\"value\\\"],[[30,4,[\\\"value\\\"]],\\\"mailto\\\",[30,4,[\\\"value\\\"]]]]]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[4]],null]],[]]],[1,\\\"\\\\n\\\"],[41,[28,[37,17],[[28,[37,19],[[33,25]],null],[28,[37,32],[[33,9],[33,33,[\\\"id\\\"]]],null]],null],[[[1,\\\"                \\\"],[10,\\\"li\\\"],[14,0,\\\"action-buttons\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,9],[[[1,\\\"                        \\\"],[11,\\\"button\\\"],[16,\\\"aria-label\\\",[28,[37,10],[\\\"components.inbox.actions.openChat\\\"],null]],[16,0,[29,[\\\"btn btn-default action-button \\\",[52,[33,34],\\\"hidden\\\"]]]],[24,4,\\\"button\\\"],[4,[38,7],[[30,0],[28,[37,11],[\\\"openChatRoom\\\",[33,12]],null]],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                            \\\"],[10,1],[14,0,\\\"flex\\\"],[12],[1,\\\"\\\\n                                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"deprecated/toolbar-chat\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                                \\\"],[1,[28,[35,10],[\\\"purecloud.chat\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,33,[\\\"id\\\"]],[[[41,[33,35],[[[1,\\\"                            \\\"],[10,0],[14,0,\\\"profile-deleted\\\"],[12],[1,[28,[35,10],[\\\"person.deleted\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-default action-button\\\"],[24,4,\\\"button\\\"],[4,[38,7],[[30,0],\\\"sendToProfile\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                                \\\"],[10,1],[14,0,\\\"flex\\\"],[12],[1,\\\"\\\\n                                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"user\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                                    \\\"],[1,[28,[35,10],[\\\"person.profile\\\"],null]],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,20],[[[1,\\\"                \\\"],[10,\\\"li\\\"],[14,0,\\\"flag-actions\\\"],[12],[1,\\\"\\\\n                    \\\"],[11,1],[24,0,\\\"flag-action\\\"],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[4,[38,7],[[30,0],\\\"flagInteraction\\\",[52,[33,36],\\\"unflag\\\",\\\"flag\\\"]],null],[12],[1,\\\"\\\\n\\\"],[41,[33,37],[[[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,36],[[[1,\\\"                                \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"unflag-icon\\\"],[14,\\\"icon-name\\\",\\\"flag\\\"],[15,\\\"title\\\",[28,[37,10],[\\\"purecloud.flagInteraction\\\"],null]],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"flag-icon\\\"],[14,\\\"icon-name\\\",\\\"flag\\\"],[15,\\\"title\\\",[28,[37,10],[\\\"purecloud.flagInteraction\\\"],null]],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]]],[]]],[1,\\\"                        \\\"],[1,[28,[35,10],[\\\"purecloud.voiceQualityIssue\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13]],[\\\"phone\\\",\\\"phone\\\",\\\"email\\\",\\\"email\\\"],false,[\\\"if\\\",\\\"phoneEnabled\\\",\\\"phoneServiceEnabled\\\",\\\"callOrRedialLabel\\\",\\\"unless\\\",\\\"disablePhoneButton\\\",\\\"phoneNumberForDisplay\\\",\\\"action\\\",\\\"showPhoneSpinner\\\",\\\"chatEnabled\\\",\\\"t\\\",\\\"route-action\\\",\\\"jid\\\",\\\"emailEnabled\\\",\\\"email\\\",\\\"favoriteEnabled\\\",\\\"entityData\\\",\\\"and\\\",\\\"isExternal\\\",\\\"not\\\",\\\"flaggingSupportEnabled\\\",\\\"displayDropdown\\\",\\\"showDropdown\\\",\\\"shouldTether\\\",\\\"phones\\\",\\\"isExternalContact\\\",\\\"each\\\",\\\"-track-array\\\",\\\"permissions\\\",\\\"callTitle\\\",\\\"anchor-tag\\\",\\\"emails\\\",\\\"or\\\",\\\"person\\\",\\\"hideChat\\\",\\\"personIsDeleted\\\",\\\"didFlag\\\",\\\"flagOperationInProcess\\\"]]\",\"moduleName\":\"web-directory/components/entity-contact/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { not, or, reads } from '@ember/object/computed';\nimport { bind, cancel, later, once, run, scheduleOnce } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport { isEmpty } from '@ember/utils';\nimport Popper from 'popper.js';\nimport layout from './template';\n\nconst placeholderImages = {\n    isInitialized: false,\n    person: '',\n    group: '',\n    location: '',\n    floor: ''\n};\n\nfunction placeholderImage(entity) {\n    if (!placeholderImages.isInitialized) {\n        var baseUri = this.applicationUrlPrefix + 'assets/images/svg/';\n\n        placeholderImages.person = baseUri + 'person.svg';\n        placeholderImages.group = baseUri + 'group.svg';\n        placeholderImages.location = baseUri + 'location.svg';\n        placeholderImages.floor = baseUri + 'floor.svg';\n        placeholderImages.queue = baseUri + 'queue.svg';\n\n        placeholderImages.isInitialized = true;\n    }\n    var type;\n    if (entity && entity.get && typeof entity.get === 'function') {\n        type = entity.get('type');\n\n        if (!type) {\n            type = 'person';\n        }\n    } else {\n        type = 'person';\n    }\n\n    return placeholderImages[type];\n}\n\nlet isNameLatin = /^[\\w\\s'\"-,.]+$/i;\n\nexport default Component.extend({\n    layout,\n    classNames: ['entity-mini-card-container'],\n    classNameBindings: [\n        'chatPresenceClass',\n        'microCard',\n        'showPresenceAndIsUser:chat-presence',\n        'isPlaceholderImageAndUseInitials:show-initials'\n    ],\n\n    feature: service(),\n    permissions: service(),\n    presenceSubscription: service(),\n\n    entity: null,\n    user: null,\n    size: 200,\n    self: null,\n    hoverParent: null,\n    type: 'profile',\n    applicationUrlPrefix: '',\n    isPlaceholderImage: true,\n    useInitialsPlaceholder: false,\n    enableMiniCard: false,\n    microCard: false,\n    showMiniCard: false,\n    isChatEnabled: false,\n    phoneServiceEnabled: false,\n    phoneAvailable: false,\n    isOneToOneOfflineOrBusy: true,\n    isGeolocationEnabled: false,\n    videoTooltipTitle: '',\n    imageLoadError: false,\n    isHoveringCard: false,\n    isHoveringImage: false,\n    hoverTimer: null,\n    isFirstHover: true,\n    canViewChat: true,\n    canViewVideo: true,\n\n    // Extensions for third-party UCC affordances\n    useMediaProviders: false,\n    haveMediaProviders: false,\n    mediaProviderComponent: null,\n    useIntegrationBadges: false,\n    integrationBadgesComponent: null,\n\n    tetherConstraints: [\n        {\n            to: 'scrollParent',\n            attachment: 'together',\n            pin: ['left', 'right']\n        }\n    ],\n    hovercardOffset: '0px 0px',\n    callEntity() {},\n\n    actions: {\n        sendToProfile(entity) {\n            this.bubbleAction({\n                action: 'transitionToEntityDetail',\n                actionContext: [entity]\n            });\n        },\n        triggerShowMiniCard() {\n            once(this, this._displayHoverCard);\n            return false;\n        },\n        mouseEnterCard() {\n            this.set('isHoveringCard', true);\n            this.onHoverChanged();\n        },\n        mouseLeaveCard() {\n            this.set('isHoveringCard', false);\n            this.onHoverChanged();\n        },\n        onContact() {\n            run.next(() => {\n                if (!this.isDestroyed && !this.isDestroying) {\n                    this.set('showMiniCard', false);\n                }\n            });\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this._attachListeners();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        // Cancel any pending hover timer so its callback never fires on a destroyed component\n        cancel(this.hoverTimer);\n        this._removeListeners();\n    },\n\n    isHovering: or('isHoveringCard', 'isHoveringImage'),\n    isOnline: not('entity.isOffline'),\n\n    chatPresence: reads('entity.activityPresence'),\n    chatPresenceClass: reads('entity.activityPresenceClass'),\n\n    /**\n     * @computed\n     * Data object for the <presence-label> web component\n     */\n    presenceLabelData: computed(\n        'entity.{presenceLabel,chatStatus,showConversationSummaryIndicator}',\n        'entity.activityValues.{calls,chats,emails}',\n        'isChatEnabled',\n        function () {\n            const entity = this.get('entity');\n            if (!entity) {\n                return undefined;\n            }\n            return {\n                presenceLabel: entity.get('presenceLabel'),\n                eChatStatus: entity.get('chatStatus'),\n                wrap: true,\n                showStatus: false,\n                showActivity: true,\n                isChatEnabled: this.get('isChatEnabled'),\n                totalCalls: entity.get('activityValues.calls'),\n                totalChats: entity.get('activityValues.chats'),\n                totalEmails: entity.get('activityValues.emails'),\n                isShowingActivitySummary: entity.get('showConversationSummaryIndicator')\n            };\n        }\n    ),\n\n    tetherSelector: computed('elementId', function () {\n        return `#${this.elementId}`;\n    }),\n\n    tetherElementId: computed('elementId', function () {\n        return `entity-mini-card-${this.elementId}`;\n    }),\n\n    uniqueId: computed('elementId', function () {\n        return `${this.elementId}-entity-mini-card`;\n    }),\n\n    entityType: computed('entity.type', function () {\n        return `entity-${this.get('entity.type')}`;\n    }),\n\n    cardImageUrl: computed(\n        'entity',\n        'entity.isLoaded',\n        'entity.profilePicture',\n        'entity.profilePictureSizes',\n        function () {\n            if (this.type === 'profile') {\n                return this.getProfilePicture(75);\n            } else {\n                return '';\n            }\n        }\n    ),\n\n    name: computed('entity.name', function () {\n        return this.get('entity.name');\n    }),\n\n    nameInitials: computed('initialsPlaceholderSupported', 'entity.name', function () {\n        var name = $.trim(this.get('entity.name'));\n        if (this.initialsPlaceholderSupported && name) {\n            const commaIndex = name.indexOf(',') > -1;\n            const spaceIndex = name.indexOf(' ') > -1;\n            const leftInitial = name[0].toUpperCase();\n            const rightInitial = name.charAt(name.indexOf(' ') + 1).toUpperCase();\n\n            if (commaIndex) {\n                return rightInitial + leftInitial;\n            } else if (!spaceIndex) {\n                return leftInitial;\n            } else {\n                return leftInitial + rightInitial;\n            }\n        }\n        return null;\n    }),\n\n    initialsPlaceholderSupported: computed('entity.name', 'entity.type', function () {\n        const name = this.get('entity.name');\n        if (name) {\n            return isNameLatin.test(name) || this.get('entity.type') === 'externalContact';\n        }\n\n        return false;\n    }),\n\n    isPlaceholderImageAndUseInitials: computed(\n        'useInitialsPlaceholder',\n        'isPlaceholderImage',\n        'nameInitials',\n        function () {\n            return this.useInitialsPlaceholder && this.isPlaceholderImage && !!this.nameInitials;\n        }\n    ),\n\n    showPresenceAndIsUser: computed('showPresence', 'entity.type', function () {\n        return this.showPresence && this.get('entity.type') === 'person';\n    }),\n\n    entityIsGroup: computed('entity.type', function () {\n        return this.get('entity.type') === 'group';\n    }),\n\n    entityDeleted: computed('entity.state', function () {\n        const state = this.get('entity.state');\n        return state && state.toLowerCase() === 'deleted';\n    }),\n\n    isSelfEntity: computed('entity.id', 'self.id', function () {\n        return this.get('entity.id') === this.get('self.id');\n    }),\n\n    placeholderImage,\n\n    getProfilePicture(size) {\n        const profilePicture = this.get('entity.profilePicture');\n        const deviceSize = this.sizeForDevice(size);\n\n        if (!isEmpty(profilePicture)) {\n            scheduleOnce('afterRender', this, this.set, 'isPlaceholderImage', false);\n            const exactMatch = profilePicture[`x${deviceSize}`];\n\n            if (exactMatch) {\n                return exactMatch;\n            }\n        }\n\n        scheduleOnce('afterRender', this, this.set, 'isPlaceholderImage', true);\n        return this.placeholderImage(this.entity);\n    },\n\n    sizeForDevice(size) {\n        size = size || +this.size;\n\n        var profilePicture = this.get('entity.profilePicture');\n        var sizes = this.get('entity.profilePictureSizes');\n\n        if (profilePicture && sizes) {\n            // Note: window.devicePixelRatio changes based on which monitor the browser is on in a multi-monitor setup.\n            var ratio = window.devicePixelRatio > 0 ? window.devicePixelRatio : 1;\n            var deviceSize = size * ratio;\n            (sizes || []).forEach(s => {\n                if (s >= deviceSize) {\n                    size = s;\n                    return false;\n                }\n            });\n        }\n\n        return size;\n    },\n\n    mouseEnter() {\n        this.set('isHoveringImage', true);\n        this.onHoverChanged();\n    },\n\n    mouseLeave() {\n        this.set('isHoveringImage', false);\n        this.onHoverChanged();\n    },\n\n    _createPopper() {\n        const el = this.element;\n        if (!el) {\n            return;\n        }\n\n        const targetEl = el.querySelector('.mini-card-component-wrapper');\n        const cardEl = el.querySelector('.entity-mini-card');\n\n        this._popper = new Popper(targetEl, cardEl, {\n            placement: 'bottom',\n            modifiers: {\n                flip: {\n                    behavior: ['bottom', 'top', 'left']\n                },\n                offset: {\n                    offset: '40%p,10px'\n                },\n                arrow: {\n                    element: '.arrow'\n                },\n                preventOverflow: {\n                    padding: 1\n                }\n            }\n        });\n    },\n\n    _destroyPopper() {\n        if (!this._popper) {\n            return;\n        }\n        this._popper.destroy();\n        this._popper = null;\n    },\n\n    _displayHoverCard() {\n        if (!this.showMiniCard && this._state === 'inDOM' && this.enableMiniCard) {\n            this.set('showMiniCard', true);\n            scheduleOnce('afterRender', this, function () {\n                this._createPopper();\n\n                const image = new Image();\n                image.src = this.cardImageUrl;\n                image.onload = () => {\n                    if (!this.isDestroyed && !this.isDestroying) {\n                        this.set('imageLoadError', false);\n                        if (this._popper) {\n                            this._popper.scheduleUpdate();\n                        }\n                    }\n                };\n                image.onerror = () => {\n                    if (!this.isDestroyed && !this.isDestroying) {\n                        this.set('imageLoadError', true);\n                        if (this._popper) {\n                            this._popper.scheduleUpdate();\n                        }\n                    }\n                };\n            });\n        }\n    },\n\n    onHoverChanged() {\n        const hoverTimeout = 800;\n        const isHovering = this.isHovering;\n        let timer = this.hoverTimer;\n\n        cancel(timer);\n\n        if (isHovering) {\n            if (!this.enableMiniCard) {\n                return;\n            }\n\n            timer = later(() => {\n                this._displayHoverCard();\n            }, hoverTimeout);\n        } else {\n            timer = later(() => {\n                if (!this.isHovering && this._state === 'inDOM') {\n                    scheduleOnce('afterRender', this, () => {\n                        if (!this.isDestroyed && !this.isDestroying) {\n                            this.set('showMiniCard', false);\n                            this._destroyPopper();\n                        }\n                    });\n                }\n            }, hoverTimeout);\n        }\n\n        this.set('hoverTimer', timer);\n    },\n\n    _attachListeners() {\n        let id = this.uniqueId;\n\n        this._onWindowClick = bind(this, function (event) {\n            if (!event) {\n                return;\n            }\n            let target = event.target;\n\n            let clickedHoverCard = target.closest('#' + id) || target.closest('.entity-mini-card');\n            let checkHoverState = !clickedHoverCard;\n\n            if (checkHoverState) {\n                if (!this.isDestroyed && !this.isDestroying && this.showMiniCard) {\n                    this.set('showMiniCard', false);\n                    this._destroyPopper();\n                    event.preventDefault();\n                }\n            }\n        });\n        window.addEventListener('click', this._onWindowClick);\n    },\n\n    _removeListeners() {\n        if (this._onWindowClick) {\n            window.removeEventListener('click', this._onWindowClick);\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"oU3CWQD+\",\"block\":\"[[[11,0],[24,0,\\\"mini-card-component-wrapper\\\"],[4,[38,0],[[30,0],\\\"triggerShowMiniCard\\\"],null],[12],[1,\\\"\\\\n    \\\"],[18,2,null],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,3],[[33,4],[33,5]],null],[[[1,\\\"    \\\"],[11,0],[16,0,[29,[\\\"entity-mini-card visible\\\\n            \\\",[36,6],\\\"\\\\n            \\\",[52,[33,7],\\\"micro-card\\\"],\\\"\\\\n            \\\",[52,[33,8],\\\"image-load-error\\\"]]]],[4,[38,0],[[30,0],\\\"mouseEnterCard\\\"],[[\\\"on\\\"],[\\\"mouseEnter\\\"]]],[4,[38,0],[[30,0],\\\"mouseLeaveCard\\\"],[[\\\"on\\\"],[\\\"mouseLeave\\\"]]],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"arrow\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[10,0],[15,0,[29,[\\\"left-bar chat-presence \\\",[36,9]]]],[12],[1,\\\"\\\\n\\\"],[41,[33,10],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"image-link\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"name-initials-icon\\\"],[12],[1,[34,11]],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"img\\\"],[15,\\\"alt\\\",[36,12]],[15,\\\"aria-label\\\",[36,12]],[15,\\\"src\\\",[29,[[36,13]]]],[15,0,[29,[\\\"full-width-image \\\",[36,14]]]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"entity-hover-card-link-to-profile image-link\\\"],[4,[38,0],[[30,0],\\\"sendToProfile\\\",[33,15]],null],[12],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"name-initials-icon\\\"],[12],[1,[34,11]],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"img\\\"],[15,\\\"alt\\\",[36,12]],[15,\\\"aria-label\\\",[36,12]],[15,\\\"src\\\",[29,[[36,13]]]],[15,0,[29,[\\\"full-width-image \\\",[36,14]]]],[12],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,3],[[33,16],[33,17]],null],[[[1,\\\"                        \\\"],[46,[33,17],null,[[\\\"entity\\\"],[[33,15]]],null],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[41,[28,[37,19],[[33,20]],null],[[[1,\\\"                \\\"],[10,1],[15,0,[29,[\\\"presence-color \\\",[33,15,[\\\"activityPresenceClass\\\"]]]]],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"presence-label\\\"],[15,\\\"presenceLabelData\\\",[36,21]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[1,[28,[35,22],null,[[\\\"entity\\\",\\\"self\\\",\\\"isGeolocationEnabled\\\",\\\"class\\\"],[[33,15],[33,23],[33,24],\\\"entity-geolocation align-center\\\"]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"right-bar\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"h4\\\"],[14,0,\\\"name-header\\\"],[12],[1,[33,15,[\\\"name\\\"]]],[13],[1,\\\"\\\\n\\\"],[41,[33,15,[\\\"hasChatStatus\\\"]],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"presence-label-group\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"status-block\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/quote-left\\\"],[14,0,\\\"blockquote-start\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                        \\\"],[10,1],[14,0,\\\"status-text\\\"],[12],[2,[28,[37,25],[[33,15,[\\\"chatStatus\\\"]]],null]],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[10,0],[14,0,\\\"person-title\\\"],[12],[1,[33,15,[\\\"title\\\"]]],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"person-department\\\"],[12],[1,[33,15,[\\\"department\\\"]]],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,0],[14,0,\\\"info-actions\\\"],[12],[1,\\\"\\\\n\\\"],[41,[51,[33,27]],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"entity-contact\\\"],[12],[1,\\\"\\\\n\\\"],[6,[39,28],null,[[\\\"entity\\\",\\\"self\\\",\\\"linkProfile\\\",\\\"compact\\\",\\\"phoneServiceEnabled\\\",\\\"phoneAvailable\\\",\\\"isOneToOneOfflineOrBusy\\\",\\\"isChatEnabled\\\",\\\"isWebrtcEnabled\\\",\\\"isVideoButtonEnabled\\\",\\\"videoTooltipTitle\\\",\\\"onContact\\\",\\\"callEntity\\\",\\\"canViewChat\\\",\\\"canViewVideo\\\",\\\"useMediaProviders\\\"],[[33,15],[33,23],[28,[37,19],[[33,10]],null],true,[33,29],[33,30],[33,31],[33,32],[33,33],[33,34],[33,35],[28,[37,0],[[30,0],\\\"onContact\\\"],null],[28,[37,0],[[30,0],[33,36]],null],[33,37],[33,38],[33,39]]],[[\\\"default\\\"],[[[[41,[28,[37,3],[[33,40],[33,39],[33,41]],null],[[[1,\\\"                                \\\"],[46,[33,41],null,[[\\\"user\\\",\\\"attachTo\\\",\\\"attachClickHandler\\\"],[[33,15],[28,[37,42],[\\\"#\\\",[30,1],\\\" .contact.webrtc\\\"],null],true]],null],[1,\\\"\\\\n\\\"]],[]],null]],[1]]]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"entity-hover-card-link-to-profile\\\"],[4,[38,0],[[30,0],\\\"sendToProfile\\\",[33,15]],null],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/pc-user\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                        \\\"],[10,1],[14,0,\\\"menu-label\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,43],[\\\"purecloud-components.goToProfile\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"elementId\\\",\\\"&default\\\"],false,[\\\"action\\\",\\\"yield\\\",\\\"if\\\",\\\"and\\\",\\\"enableMiniCard\\\",\\\"showMiniCard\\\",\\\"tetherElementId\\\",\\\"microCard\\\",\\\"imageLoadError\\\",\\\"chatPresenceClass\\\",\\\"entityDeleted\\\",\\\"nameInitials\\\",\\\"name\\\",\\\"cardImageUrl\\\",\\\"entityType\\\",\\\"entity\\\",\\\"useIntegrationBadges\\\",\\\"integrationBadgesComponent\\\",\\\"component\\\",\\\"not\\\",\\\"entityIsGroup\\\",\\\"presenceLabelData\\\",\\\"entity-location\\\",\\\"self\\\",\\\"isGeolocationEnabled\\\",\\\"flair\\\",\\\"unless\\\",\\\"isSelfEntity\\\",\\\"entity-contact-group\\\",\\\"phoneServiceEnabled\\\",\\\"phoneAvailable\\\",\\\"isOneToOneOfflineOrBusy\\\",\\\"isChatEnabled\\\",\\\"isWebrtcEnabled\\\",\\\"isVideoButtonEnabled\\\",\\\"videoTooltipTitle\\\",\\\"callEntity\\\",\\\"canViewChat\\\",\\\"canViewVideo\\\",\\\"useMediaProviders\\\",\\\"user\\\",\\\"mediaProviderComponent\\\",\\\"concat\\\",\\\"t\\\"]]\",\"moduleName\":\"web-directory/components/entity-hover-card/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed, observer } from '@ember/object';\nimport { and, reads } from '@ember/object/computed';\nimport { cancel, later, once, run, scheduleOnce } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport { isEmpty } from '@ember/utils';\nimport layout from './template';\n\nconst placeholderImages = {\n    isInitialized: false,\n    person: '',\n    group: '',\n    location: '',\n    floor: ''\n};\n\nfunction placeholderImage(entity) {\n    if (!placeholderImages.isInitialized) {\n        var baseUri = this.applicationUrlPrefix + 'assets/images/svg/';\n\n        placeholderImages.person = baseUri + 'person.svg';\n        placeholderImages.group = baseUri + 'group.svg';\n        placeholderImages.location = baseUri + 'location.svg';\n        placeholderImages.floor = baseUri + 'floor.svg';\n        placeholderImages.queue = baseUri + 'queue.svg';\n\n        placeholderImages.isInitialized = true;\n    }\n    var type;\n    if (entity && entity.get && typeof entity.get === 'function') {\n        type = entity.get('type');\n\n        if (!type) {\n            type = 'person';\n        }\n    } else {\n        type = 'person';\n    }\n\n    return placeholderImages[type];\n}\n\nlet isNameLatin = /^[\\w\\s'\"-,.]+$/i;\n\nexport default Component.extend({\n    layout,\n    classNames: ['entity-image'],\n    classNameBindings: [\n        'chatPresenceClass',\n        'microCard',\n        'showPresenceAndIsUser:chat-presence',\n        'isPlaceholderImageAndUseInitials:show-initials',\n        'entityIsContact:external-contact'\n    ],\n\n    presenceSubscription: service(),\n\n    // parameters used by entity image\n    entity: null,\n    size: 200,\n    type: 'profile',\n    isLinkable: false,\n    applicationUrlPrefix: '',\n    subscribeToPresence: false,\n    showStatusQuote: false,\n    imageLoadError: false,\n    isPlaceholderImage: true,\n    showPresence: false,\n    canViewChat: true,\n    canViewVideo: true,\n    // parameters passed through to entity hover card\n    self: null,\n    useInitialsPlaceholder: false,\n    enableMiniCard: false,\n    isChatEnabled: false,\n    phoneServiceEnabled: false,\n    phoneAvailable: false,\n    isOneToOneOfflineOrBusy: true,\n    isGeolocationEnabled: false,\n    videoTooltipTitle: '',\n    isVideoButtonEnabled: false,\n    // entity image logic\n\n    init() {\n        this._super(...arguments);\n        once(this, this._managePresenceSubscription);\n    },\n\n    callEntity() {},\n\n    didInsertElement() {\n        this._super(...arguments);\n        const imgEl = this.element.querySelector(`#${this.uniqueId}`);\n        if (imgEl) {\n            this._onImgLoad = () => {\n                const func = this.componentUpdated;\n                if (func && typeof func === 'function') {\n                    run(() => this.componentUpdated());\n                }\n            };\n            imgEl.addEventListener('load', this._onImgLoad);\n        }\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this._removePresenceSubscription();\n        const imgEl = this.element.querySelector(`#${this.uniqueId}`);\n        if (imgEl && this._onImgLoad) {\n            imgEl.removeEventListener('load', this._onImgLoad);\n        }\n\n        if (this._animationRun) {\n            cancel(this._animationRun);\n        }\n    },\n\n    managePresenceSubscription: observer(\n        'isChatEnabled',\n        'entity.type',\n        'entity.jid',\n        'subscribeToPresence',\n        function () {\n            once(this, this._managePresenceSubscription);\n        }\n    ),\n\n    displayStatusQuote: and('showPresenceAndIsUser', 'showStatusQuote', 'entity.hasChatStatus'),\n    chatPresence: reads('entity.activityPresence'),\n    chatPresenceClass: reads('entity.activityPresenceClass'),\n\n    uniqueId: computed('elementId', function () {\n        return `${this.elementId}-entity-image`;\n    }),\n\n    entityType: computed('entity.type', function () {\n        return `entity-${this.get('entity.type')}`;\n    }),\n\n    imageUrl: computed('entity', 'entity.isLoaded', 'entity.profilePicture', 'entity.profilePictureSizes', function () {\n        if (this.type === 'profile') {\n            return this.getProfilePicture();\n        } else {\n            return '';\n        }\n    }),\n\n    name: computed('entity.name', function () {\n        return this.get('entity.name');\n    }),\n\n    nameInitials: computed('initialsPlaceholderSupported', 'entity.name', function () {\n        var name = $.trim(this.get('entity.name'));\n        if (this.initialsPlaceholderSupported && name) {\n            const commaIndex = name.indexOf(',') > -1;\n            const spaceIndex = name.indexOf(' ') > -1;\n            const leftInitial = name[0].toUpperCase();\n            const rightInitial = name.charAt(name.indexOf(' ') + 1).toUpperCase();\n\n            if (commaIndex) {\n                return rightInitial + leftInitial;\n            } else if (!spaceIndex) {\n                return leftInitial;\n            } else {\n                return leftInitial + rightInitial;\n            }\n        }\n        return null;\n    }),\n\n    initialsPlaceholderSupported: computed('entity.name', 'entity.type', function () {\n        const name = this.get('entity.name');\n        if (name) {\n            return isNameLatin.test(name) || this.get('entity.type') === 'externalContact';\n        }\n\n        return false;\n    }),\n\n    isPlaceholderImageAndUseInitials: computed(\n        'useInitialsPlaceholder',\n        'isPlaceholderImage',\n        'nameInitials',\n        function () {\n            return this.useInitialsPlaceholder && this.isPlaceholderImage && !!this.nameInitials;\n        }\n    ),\n\n    _animationRun: null,\n    _currentPresence: null,\n    isStatusAnimating: false,\n    animateOnPresenceChange: observer('chatPresence', function () {\n        const nextPresence = this.chatPresence;\n        const prevPresence = this._currentPresence;\n        this.set('_currentPresence', nextPresence);\n        if (nextPresence !== prevPresence) {\n            this.set('isStatusAnimating', true);\n            const animationPeriod = 1250;\n            if (this._animationRun) {\n                cancel(this._animationRun);\n            }\n            this.set(\n                '_animationRun',\n                later(() => {\n                    if (!this.isDestroying && !this.isDestroyed) {\n                        this.set('isStatusAnimating', false);\n                        this.set('_animationRun', null);\n                    }\n                }, animationPeriod)\n            );\n        }\n    }),\n\n    showPresenceAndIsUser: computed('showPresence', 'entity.type', function () {\n        return this.showPresence && this.get('entity.type') === 'person';\n    }),\n\n    entityIsContact: computed('entity.type', function () {\n        return this.get('entity.type') === 'externalContact';\n    }),\n\n    entityDeleted: computed('entity.state', function () {\n        const state = this.get('entity.state');\n        return state && state.toLowerCase() === 'deleted';\n    }),\n\n    placeholderImage,\n\n    getProfilePicture(size) {\n        const profilePicture = this.get('entity.profilePicture');\n        const deviceSize = this.sizeForDevice(size);\n\n        if (!isEmpty(profilePicture)) {\n            scheduleOnce('afterRender', this, this.modifyPlaceholderImage, false);\n            const exactMatch = profilePicture[`x${deviceSize}`];\n\n            if (exactMatch) {\n                return exactMatch;\n            }\n        }\n\n        scheduleOnce('afterRender', this, this.modifyPlaceholderImage, true);\n        return this.placeholderImage(this.entity);\n    },\n\n    modifyPlaceholderImage(value) {\n        if (this.isDestroyed || this.isDestroying) {\n            return;\n        }\n        this.set('isPlaceholderImage', value);\n    },\n\n    sizeForDevice(size) {\n        size = size || +this.size;\n\n        var profilePicture = this.get('entity.profilePicture');\n        var sizes = this.get('entity.profilePictureSizes');\n\n        if (profilePicture && sizes) {\n            // Note: window.devicePixelRatio changes based on which monitor the browser is on in a multi-monitor setup.\n            var ratio = window.devicePixelRatio > 0 ? window.devicePixelRatio : 1;\n            var deviceSize = size * ratio;\n            (sizes || []).forEach(s => {\n                if (s >= deviceSize) {\n                    size = s;\n                    return false;\n                }\n            });\n        }\n\n        return size;\n    },\n\n    _removePresenceSubscription() {\n        if (this.isChatEnabled && this.subscribeToPresence) {\n            this.presenceSubscription.autoSubscribe(null, this);\n        }\n    },\n\n    _managePresenceSubscription() {\n        if (\n            this.isChatEnabled &&\n            this.subscribeToPresence &&\n            this.get('entity.type') === 'person' &&\n            this.get('entity.jid')\n        ) {\n            this.presenceSubscription.autoSubscribe([this.entity], this);\n        }\n    },\n\n    actions: {\n        goToProfile(entity) {\n            this.bubbleAction({\n                action: 'transitionToEntityDetail',\n                actionContext: [entity]\n            });\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"p0oXqjQj\",\"block\":\"[[[6,[39,0],null,[[\\\"entity\\\",\\\"self\\\",\\\"hoverParent\\\",\\\"isChatEnabled\\\",\\\"phoneAvailable\\\",\\\"isWebrtcEnabled\\\",\\\"enableMiniCard\\\",\\\"isOneToOneOffline\\\",\\\"videoTooltipTitle\\\",\\\"phoneServiceEnabled\\\",\\\"isVideoButtonEnabled\\\",\\\"applicationUrlPrefix\\\",\\\"callEntity\\\",\\\"canViewChat\\\",\\\"canViewVideo\\\"],[[33,1],[33,2],[33,3],[33,4],[33,5],[33,6],[33,7],[33,8],[33,9],[33,10],[33,11],[33,12],[33,13],[33,14],[33,15]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[41,[33,17],[[[1,\\\"        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/quote-right\\\"],[15,0,[29,[\\\"status-quote \\\",[36,18]]]],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,19],[[[41,[33,7],[[[1,\\\"            \\\"],[10,3],[14,6,\\\"#\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"name-initials-icon\\\"],[12],[1,[34,20]],[13],[1,\\\"\\\\n                \\\"],[10,\\\"img\\\"],[15,1,[29,[[36,21]]]],[15,\\\"aria-label\\\",[36,22]],[15,\\\"alt\\\",[36,22]],[15,0,[29,[\\\"full-width-image \\\",[36,23]]]],[15,\\\"src\\\",[36,24]],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"entity-image-link-to-profile\\\"],[4,[38,25],[[30,0],\\\"goToProfile\\\",[33,1]],null],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"name-initials-icon\\\"],[12],[1,[34,20]],[13],[1,\\\"\\\\n                \\\"],[10,\\\"img\\\"],[15,1,[29,[[36,21]]]],[15,\\\"aria-label\\\",[36,22]],[15,\\\"alt\\\",[36,22]],[15,0,[29,[\\\"full-width-image \\\",[36,23]]]],[15,\\\"src\\\",[36,24]],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[]],[[[41,[33,26],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"external-contact-icon\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"top\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"center\\\"],[12],[1,[34,20]],[13],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"bottom\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"name-initials-icon\\\"],[12],[1,[34,20]],[13],[1,\\\"\\\\n\\\"]],[]]],[41,[33,27],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"animated-status\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"animated-radiate chat-presence-bg-color\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"animated-pulse chat-presence-bg-color\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[10,\\\"img\\\"],[15,1,[29,[[36,21]]]],[15,\\\"aria-label\\\",[36,22]],[15,\\\"alt\\\",[36,22]],[15,0,[29,[\\\"full-width-image \\\",[36,23]]]],[15,\\\"src\\\",[36,24]],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[10,\\\"img\\\"],[15,1,[29,[[36,21]]]],[15,\\\"aria-label\\\",[36,22]],[15,\\\"alt\\\",[36,22]],[15,0,[29,[\\\"full-width-image \\\",[36,23]]]],[15,\\\"src\\\",[36,24]],[12],[13],[1,\\\"\\\\n\\\"]],[]]]],[]]],[1,\\\"\\\\n\\\"],[41,[48,[30,1]],[[[1,\\\"        \\\"],[18,1,[[33,3]]],[1,\\\"\\\\n\\\"]],[]],null]],[]]]]]],[\\\"&default\\\"],false,[\\\"entity-hover-card\\\",\\\"entity\\\",\\\"self\\\",\\\"elementId\\\",\\\"isChatEnabled\\\",\\\"phoneAvailable\\\",\\\"isWebrtcEnabled\\\",\\\"enableMiniCard\\\",\\\"isOneToOneOffline\\\",\\\"videoTooltipTitle\\\",\\\"phoneServiceEnabled\\\",\\\"isVideoButtonEnabled\\\",\\\"applicationUrlPrefix\\\",\\\"callEntity\\\",\\\"canViewChat\\\",\\\"canViewVideo\\\",\\\"if\\\",\\\"displayStatusQuote\\\",\\\"chatPresence\\\",\\\"isLinkable\\\",\\\"nameInitials\\\",\\\"uniqueId\\\",\\\"name\\\",\\\"entityType\\\",\\\"imageUrl\\\",\\\"action\\\",\\\"entityIsContact\\\",\\\"isStatusAnimating\\\",\\\"has-block\\\",\\\"yield\\\"]]\",\"moduleName\":\"web-directory/components/entity-image/template.hbs\",\"isStrictMode\":false});","import { computed } from '@ember/object';\nimport Component from '@ember/component';\nimport layout from './template';\nimport displayRelativeGeolocation from 'web-directory/utils/display-geolocation';\n\nexport default Component.extend({\n    layout,\n\n    attributeBindings: ['hoverText:title'],\n    locationClass: '',\n    entity: function () {},\n    locationHoverText: '',\n    noLocationHoverText: '',\n    isGeolocationEnabled: false,\n    self: null,\n\n    hoverText: computed(\n        'locationHoverText',\n        'noLocationHoverText',\n        'isGeolocationEnabled',\n        'entity.hasGeolocation',\n        function () {\n            if (this.isGeolocationEnabled && this.get('entity.hasGeolocation')) {\n                return this.locationHoverText;\n            } else if (this.isGeolocationEnabled) {\n                return this.noLocationHoverText;\n            } else {\n                return '';\n            }\n        }\n    ),\n\n    location: computed('entity.geolocation', function () {\n        return displayRelativeGeolocation(this.entity, this.self);\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"c7scDaNw\",\"block\":\"[[[41,[28,[37,1],[[33,2,[\\\"hasGeolocation\\\"]],[33,3]],null],[[[1,\\\"    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/marker\\\"],[14,0,\\\"location-indicator\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[10,1],[15,0,[29,[[36,4],\\\" location-text\\\"]]],[12],[1,[34,5]],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,1],[[33,3],[33,6]],null],[[[1,\\\"    \\\"],[10,1],[15,0,[29,[[36,4],\\\" location-text\\\"]]],[12],[1,[34,6]],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]]],[],false,[\\\"if\\\",\\\"and\\\",\\\"entity\\\",\\\"isGeolocationEnabled\\\",\\\"locationClass\\\",\\\"location\\\",\\\"noLocationText\\\"]]\",\"moduleName\":\"web-directory/components/entity-location/template.hbs\",\"isStrictMode\":false});","import { dasherize } from '@ember/string';\nimport { computed, get } from '@ember/object';\nimport { readOnly, equal, reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport Component from '@ember/component';\n\nexport default Component.extend({\n    classNames: ['entity-mini'],\n    classNameBindings: ['entityTypeClass', 'isClickable:clickable'],\n\n    intl: service(),\n\n    entity: null,\n    showDepartment: true,\n    showPresence: true,\n    // fallback to `showPresence` when this is undefined\n    subscribeToPresence: undefined,\n\n    showFavorite: true,\n    showActions: true,\n    clickToProfile: true,\n    isSearchResult: false,\n\n    geolocation: service(),\n    isGeolocationEnabled: readOnly('geolocation.isEnabled'),\n    actions: {\n        sendToProfile: function () {\n            this.bubbleAction({\n                action: 'transitionToEntityDetail',\n                actionContext: [this.entity]\n            });\n        }\n    },\n\n    phoneTooltip: computed(function () {\n        return this.intl.safestring('tooltip.contactIcon.phone');\n    }),\n\n    entityTypeClass: computed('entity.type', function () {\n        if (!this.get('entity.type')) {\n            return 'empty-type';\n        }\n\n        return dasherize(this.get('entity.type'));\n    }),\n\n    entityIsPerson: equal('entity.type', 'person'),\n\n    entityIsQueue: equal('entity.type', 'queue'),\n\n    entityIsMe: computed('entity.id', 'session.person.id', function () {\n        return this.get('entity.id') === this.get('session.person.id');\n    }),\n\n    entityIsGroup: equal('entity.type', 'group'),\n\n    entityIsContact: equal('entity.type', 'externalContact'),\n\n    canContactEntity: computed('entityIsGroup', 'entityIsPerson', 'entityIsContact', function () {\n        return this.entityIsPerson || this.entityIsGroup || this.entityIsContact;\n    }),\n\n    useInitials: reads('entityIsContact'),\n\n    showOrganization: computed('entityIsContact', function () {\n        return this.entityIsContact && !!this.get('entity.organization');\n    }),\n\n    /**\n     * Navigates to the entity's profile using URL-based transitions\n     * to avoid IFC route name resolution issues with feature toggles.\n     */\n\n    isClickable: computed('entity._entity', 'entity.type', 'entity.id', function () {\n        const type = this.get('entity.type');\n        if (type === 'floor' || type === 'location' || type === 'externalContact') {\n            return false;\n        }\n        if (!this.get('entity.id')) {\n            return false;\n        }\n        const entity = this.get('entity._entity');\n        return entity !== 'locations' && this.clickToProfile;\n    }),\n\n    _subscribePresence: computed('showPresence', 'subscribeToPresence', function () {\n        const subscribe = this.subscribeToPresence;\n        if (subscribe === undefined) {\n            return this.showPresence;\n        }\n\n        return subscribe;\n    }),\n\n    click: function (event) {\n        if (!this.isClickable) {\n            return;\n        }\n        const target = event.target;\n        if (target.matches('i') || target.closest('.entity-contact')) {\n            // Defer to primary contact icon action\n            return;\n        }\n\n        if (this.isSearchResult) {\n            // When this is a search result, only allow the action elements for transitioning due to the extra realestate.\n            return false;\n        }\n\n        this.send('sendToProfile');\n    },\n    eLocation: computed('entity.geolocation.{city,region,country}', function () {\n        if (!this.entity) {\n            return {\n                city: '',\n                region: '',\n                country: ''\n            };\n        }\n        return {\n            city: get(this.entity, 'geolocation.city'),\n            region: get(this.entity, 'geolocation.region'),\n            country: get(this.entity, 'geolocation.country')\n        };\n    }),\n    selfLocation: computed('session.person.geolocation.{city,region,country}', function () {\n        if (!this.session || !this.session.person) {\n            return {\n                city: '',\n                region: '',\n                country: ''\n            };\n        }\n        return {\n            city: get(this.session.person, 'geolocation.city'),\n            region: get(this.session.person, 'geolocation.region'),\n            country: get(this.session.person, 'geolocation.country')\n        };\n    }),\n    entityLocationData: computed('eLocation', 'selfLocation', 'isGeolocationEnabled', function () {\n        return {\n            isGeolocationEnabled: this.isGeolocationEnabled,\n            eLocation: this.eLocation,\n            selfLocation: this.selfLocation\n        };\n    }),\n    presenceLabelData: computed(\n        'entity.{activityPresenceClass,presenceLabel,chatStatus,showConversationSummaryIndicator}',\n        'entity.activityValues.{calls,chats,emails}',\n        function () {\n            if (!this.entity) return;\n\n            return {\n                wrap: false,\n                showStatus: true,\n                showActivity: true,\n                eActivityPresenceClass: get(this.entity, 'activityPresenceClass'),\n                totalCalls: get(this.entity, 'activityValues.calls'),\n                totalChats: get(this.entity, 'activityValues.chats'),\n                totalEmails: get(this.entity, 'activityValues.emails'),\n                totalMessages: this.totalMessages,\n                totalSocialExpression: this.totalSocialExpression,\n                presenceLabel: get(this.entity, 'presenceLabel'),\n                eChatStatus: get(this.entity, 'chatStatus'),\n                isShowingActivitySummary: get(this.entity, 'showConversationSummaryIndicator')\n            };\n        }\n    )\n});\n","import { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { run } from '@ember/runloop';\nimport Component from '@ember/component';\nimport { isTesting } from 'web-directory/utils/testing';\nimport ViewportMixin from '../../../mixins/viewport';\n\nexport default Component.extend(ViewportMixin, {\n    classNameBindings: ['enteredViewport:in-viewport:outside-viewport', 'hasRequiredPermission::no-permission'],\n\n    session: service(),\n    chat: service(),\n    presenceSubscription: service(),\n\n    entity: null,\n    showDepartment: true,\n    showPresence: true,\n    showFavorite: true,\n    showActions: true,\n    clickToProfile: true,\n    isSearchResult: false,\n    requiredPermission: null,\n\n    hasRequiredPermission: computed('requiredPermission.[]', 'entity.extends.authorization.permissions', function () {\n        const requiredPermission = this.requiredPermission || [];\n        const perms = this.get('entity.expands.authorization.permissions') || [];\n        if (requiredPermission.length && perms.length) {\n            const agentHasOnQueue = perms.includes(`routing:agent:onqueue`);\n            const agentHasRequiredPermission = !!requiredPermission.find(permission => {\n                return perms.includes(permission);\n            });\n            return agentHasRequiredPermission || !agentHasOnQueue;\n        }\n        return true;\n    }),\n\n    didInsertElement() {\n        this._super(...arguments);\n        if (!isTesting) {\n            run.join(this, this._subscribeToPresence);\n        }\n    },\n\n    didEnterViewport() {\n        run(() => run.once(this, this._subscribeToPresence));\n        this._super(...arguments);\n    },\n\n    didExitViewport() {\n        // A run loop is needed here because the mixin invokes this\n        // function using request animation frame as opposed to Ember\n        // backburner.\n        run(() => run.once(this, this._unsubscribeFromPresence));\n        this._super(...arguments);\n    },\n\n    _subscribeToPresence() {\n        if (this.get('entity.type') === 'person' && this.get('entity.jid')) {\n            this.presenceSubscription.autoSubscribe([this.entity], this);\n        }\n    },\n\n    _unsubscribeFromPresence() {\n        this.presenceSubscription.autoSubscribe(null, this);\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"mVUhlHsC\",\"block\":\"[[[6,[39,0],null,[[\\\"entity\\\",\\\"showDepartment\\\",\\\"showPresence\\\",\\\"subscribeToPresence\\\",\\\"showActions\\\",\\\"clickToProfile\\\",\\\"isSearchResult\\\"],[[33,1],[33,2],[33,3],[33,4],[33,5],[33,6],[33,7]]],[[\\\"default\\\"],[[[[41,[28,[37,9],[[30,1],\\\"actions\\\"],null],[[[1,\\\"        \\\"],[1,[28,[35,10],null,[[\\\"contact\\\",\\\"showChat\\\",\\\"showFavorite\\\"],[[33,1],[33,11,[\\\"enabled\\\"]],[33,12]]]]],[1,\\\"\\\\n\\\"]],[]],null]],[1]]]]]],[\\\"section\\\"],false,[\\\"entity-mini\\\",\\\"entity\\\",\\\"showDepartment\\\",\\\"showPresence\\\",\\\"subscribeToPresence\\\",\\\"showActions\\\",\\\"clickToProfile\\\",\\\"isSearchResult\\\",\\\"if\\\",\\\"eq\\\",\\\"entity-contact\\\",\\\"chat\\\",\\\"showFavorite\\\"]]\",\"moduleName\":\"web-directory/components/entity-mini/default/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\n\nexport default Component.extend({\n    classNames: ['entity-details'],\n\n    // Child of entity-mini display only all attributes are inherited\n    entityIsPerson: false,\n    entityIsContact: false,\n    entityIsMe: false,\n    showDepartment: true,\n    showOrganization: false,\n    showPresence: false,\n    subscribeToPresence: false,\n    canContactEntity: false,\n    useInitials: false,\n    isClickable: false,\n    entity: null,\n    entityLocationData: null,\n\n    /**\n     * @computed\n     * Data object for the <presence-label> web component\n     */\n    presenceLabelData: computed(\n        'entity.{presenceLabel,chatStatus,showConversationSummaryIndicator}',\n        'entity.activityValues.{calls,chats,emails}',\n        function () {\n            const entity = this.get('entity');\n            if (!entity) {\n                return undefined;\n            }\n            return {\n                presenceLabel: entity.get('presenceLabel'),\n                eChatStatus: entity.get('chatStatus'),\n                wrap: false,\n                showStatus: true,\n                showActivity: true,\n                totalCalls: entity.get('activityValues.calls'),\n                totalChats: entity.get('activityValues.chats'),\n                totalEmails: entity.get('activityValues.emails'),\n                isShowingActivitySummary: entity.get('showConversationSummaryIndicator')\n            };\n        }\n    )\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"M2+5N1Tm\",\"block\":\"[[[10,0],[14,\\\"aria-hidden\\\",\\\"true\\\"],[15,0,[29,[\\\"image \\\",[52,[33,1],\\\"external-contact-image\\\"],\\\" \\\",[52,[51,[33,3]],\\\"not-clickable\\\"]]]],[12],[1,\\\"\\\\n\\\"],[6,[39,4],null,[[\\\"entity\\\",\\\"showPresence\\\",\\\"subscribeToPresence\\\",\\\"useInitialsPlaceholder\\\"],[[33,5],[33,6],[33,7],[33,8]]],[[\\\"default\\\"],[[[[1,\\\"        \\\"],[1,[28,[35,9],null,[[\\\"entity\\\"],[[33,5]]]]],[1,\\\"\\\\n\\\"]],[]]]]],[13],[1,\\\"\\\\n\\\"],[10,0],[15,0,[29,[\\\"information \\\",[52,[33,10],\\\"is-me\\\"],\\\" \\\",[52,[51,[33,11]],\\\"actions-hide\\\"]]]],[14,\\\"tabindex\\\",\\\"0\\\"],[12],[1,\\\"\\\\n    \\\"],[10,1],[14,0,\\\"name\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[33,5,[\\\"name\\\"]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[18,1,[\\\"details\\\"]],[1,\\\"\\\\n\\\"],[41,[33,13],[[[41,[33,14],[[[1,\\\"            \\\"],[10,1],[14,0,\\\"department\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[33,5,[\\\"department\\\"]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n        \\\"],[10,1],[14,0,\\\"title\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[33,5,[\\\"title\\\"]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,1],[[[41,[33,15],[[[1,\\\"            \\\"],[10,1],[14,0,\\\"organization\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[33,5,[\\\"organization\\\"]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[10,1],[14,0,\\\"description\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[33,5,[\\\"description\\\"]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[]],[[[41,[33,16],[[[1,\\\"        \\\"],[10,1],[15,0,[29,[\\\"group-type \\\",[33,5,[\\\"groupType\\\"]]]]],[12],[1,\\\"\\\\n            \\\"],[1,[33,5,[\\\"groupType\\\"]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"]],[]],null]],[]]]],[]]],[41,[33,5,[\\\"hasGeolocation\\\"]],[[[1,\\\"        \\\"],[10,1],[14,0,\\\"geolocation-container\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"entity-location\\\"],[15,\\\"entityLocationData\\\",[36,17]],[12],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,13],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"item\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"            \\\"],[10,1],[15,0,[29,[\\\"presence-color \\\",[33,5,[\\\"activityPresenceClass\\\"]]]]],[12],[1,\\\"\\\\n                \\\"],[10,\\\"presence-label\\\"],[15,\\\"presenceLabelData\\\",[36,18]],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13]],[\\\"&default\\\"],false,[\\\"if\\\",\\\"entityIsContact\\\",\\\"unless\\\",\\\"isClickable\\\",\\\"entity-image\\\",\\\"entity\\\",\\\"showPresence\\\",\\\"_subscribePresence\\\",\\\"useInitials\\\",\\\"integration-badges\\\",\\\"entityIsMe\\\",\\\"showActions\\\",\\\"yield\\\",\\\"entityIsPerson\\\",\\\"showDepartment\\\",\\\"showOrganization\\\",\\\"entityIsGroup\\\",\\\"entityLocationData\\\",\\\"presenceLabelData\\\"]]\",\"moduleName\":\"web-directory/components/entity-mini/entity-details/template.hbs\",\"isStrictMode\":false});","import { not, empty, gt } from '@ember/object/computed';\nimport { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@ember/component';\n\nexport default Component.extend({\n    classNames: ['external-contact'],\n\n    intl: service(),\n    session: service(),\n\n    externalContact: null,\n    showPhones: true,\n    showEmails: false,\n    showAcceptsSMS: true,\n    _getEmailTypes: function () {\n        return Object.keys(this.externalContact.toJSON()).filter(modelKey => {\n            return /.*Email$/.test(modelKey);\n        });\n    },\n\n    _getPhoneTypes: function () {\n        return Object.keys(this.externalContact.toJSON()).filter(modelKey => {\n            return /.*Phone$|whatsAppId/.test(modelKey);\n        });\n    },\n\n    dropdownTitle: computed('phones', function () {\n        return this.intl.t('purecloud.acdInteraction.relate.titles.selectPhone');\n    }),\n\n    externalContactHasNoEmailAddresses: not('externalContact.hasEmailAddresses'),\n\n    phones: computed(function () {\n        if (!this.showPhones) {\n            return [];\n        }\n        return this._getPhoneTypes().reduce((phones, phoneType) => {\n            if (this.get(`externalContact.${phoneType}.display`)) {\n                const canUseNonE164 = phoneType === 'otherPhone';\n                const phoneTypeTranslated = this.intl.t(`purecloud.acdInteraction.relate.phoneTypes.${phoneType}`);\n                const phoneTypeId = phoneType + '-' + this.get(`externalContact.${phoneType}.e164`); //This needs to be unique for tooltips to work.\n                return phones.concat({\n                    type: phoneTypeTranslated,\n                    phoneTypeId: phoneTypeId.replace(/\\s|\\+|#|\\./g, ''),\n                    number: this.get(`externalContact.${phoneType}.display`),\n                    e164: this.get(`externalContact.${phoneType}.e164`),\n                    acceptsSMS: this.get(`externalContact.${phoneType}.acceptsSMS`),\n                    canUseNonE164\n                });\n            } else if (this.get(`externalContact.${phoneType}.phoneNumber.display`)) {\n                const canUseNonE164 = phoneType === 'otherPhone';\n                const typeName = phoneType.replace(/Id/, '').toLowerCase();\n                const phoneTypeTranslated = this.intl.t(`purecloud.acdInteraction.relate.channelTypes.${typeName}`);\n                const phoneTypeId = phoneType + '-' + this.get(`externalContact.${phoneType}.phoneNumber.e164`); //This needs to be unique for tooltips to work.\n                return phones.concat({\n                    type: phoneTypeTranslated,\n                    phoneTypeId: phoneTypeId.replace(/\\s|\\+|#|\\./g, ''),\n                    number: this.get(`externalContact.${phoneType}.phoneNumber.display`),\n                    e164: this.get(`externalContact.${phoneType}.phoneNumber.e164`),\n                    acceptsSMS: this.get(`externalContact.${phoneType}.phoneNumber.acceptsSMS`),\n                    canUseNonE164\n                });\n            }\n            return phones;\n        }, []);\n    }),\n\n    externalContactHasNoPhoneNumbers: empty('phones'),\n\n    emails: computed(function () {\n        if (!this.showEmails) {\n            return [];\n        }\n        return this._getEmailTypes().reduce((email, emailType) => {\n            if (this.get(`externalContact.${emailType}`)) {\n                return email.concat({\n                    type: this.intl.t(`purecloud.acdInteraction.relate.emailTypes.${emailType}`),\n                    address: this.get(`externalContact.${emailType}`)\n                });\n            }\n            return email;\n        }, []);\n    }),\n\n    hasMultipleEmails: gt('emails.length', 1),\n\n    hasMultiplePhoneRecords: gt('phones.length', 1),\n\n    actions: {\n        selectEntityWithEmail(email, emailType, event) {\n            this.set('externalContact.email', email);\n            this.set('externalContact.emailType', emailType);\n            if (typeof this.onSelectEmail === 'function') {\n                this.onSelectEmail(email, emailType, event);\n            }\n        },\n\n        selectEntityWithPhone(phoneNumber, phoneType, event) {\n            this.set('externalContact.phoneNumber', phoneNumber);\n            this.set('externalContact.phoneType', phoneType);\n            if (typeof this.onSelectPhone === 'function') {\n                this.onSelectPhone(phoneNumber, phoneType, event);\n            }\n        },\n\n        onPreventClick(event) {\n            event.stopPropagation();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"bDAQ0Ibe\",\"block\":\"[[[10,0],[14,0,\\\"entity-mini external-contact\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"profileImage\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"defaultWrapper\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"initials\\\"],[12],[1,[33,0,[\\\"initials\\\"]]],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"right row\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"information contactWrapper\\\"],[12],[1,\\\"\\\\n            \\\"],[10,1],[15,\\\"onclick\\\",[28,[37,1],[[30,0],\\\"onPreventClick\\\"],null]],[12],[1,\\\"\\\\n                \\\"],[10,1],[14,0,\\\"external-contact-name-container\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"button\\\"],[14,0,\\\"sr-only\\\"],[14,4,\\\"button\\\"],[12],[1,[28,[35,2],[[33,0]],null]],[13],[1,\\\"\\\\n                    \\\"],[10,1],[14,0,\\\"external-contact-name\\\"],[12],[1,[28,[35,2],[[33,0]],null]],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,1],[14,0,\\\"viewDetails\\\"],[12],[1,\\\"\\\\n                    \\\"],[8,[39,3],null,[[\\\"@route\\\",\\\"@model\\\"],[\\\"relate.contacts-ui-redirect\\\",[33,0,[\\\"id\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n                        \\\"],[10,1],[15,\\\"aria-label\\\",[28,[37,4],[\\\"purecloud.viewExternalContactDetails\\\"],null]],[14,0,\\\"fa fa-arrow-up\\\"],[12],[13],[1,\\\"\\\\n                    \\\"]],[]]]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,0,[\\\"schema\\\",\\\"id\\\"]],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"schema-title\\\"],[12],[1,[28,[35,6],[[33,0,[\\\"schemaTitle\\\"]]],null]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[10,1],[14,0,\\\"organization\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,0,[\\\"externalOrganization\\\"]],[[[1,\\\"                    \\\"],[1,[28,[35,4],[\\\"purecloud.entity.relateExternalContactDetails.atOrg\\\"],null]],[1,\\\"\\\\n                    \\\"],[1,[33,0,[\\\"externalOrganization\\\",\\\"name\\\"]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"information phones phonesWrapper\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,7],[[33,8],[33,9]],null],[[[41,[33,10],[[[1,\\\"                        \\\"],[10,1],[14,0,\\\"noPhones\\\"],[12],[1,[28,[35,4],[\\\"purecloud.acdInteraction.relate.search.phoneNotProvided\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,0],[14,0,\\\"phonesExpanded\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,12],[[28,[37,12],[[33,8]],null]],null],null,[[[41,[28,[37,13],[[30,1,[\\\"e164\\\"]],[30,1,[\\\"canUseNonE164\\\"]]],null],[[[1,\\\"                                    \\\"],[10,0],[14,0,\\\"selectable\\\"],[15,\\\"onclick\\\",[28,[37,1],[[30,0],\\\"selectEntityWithPhone\\\",[28,[37,13],[[30,1,[\\\"e164\\\"]],[30,1,[\\\"number\\\"]]],null],[30,1,[\\\"type\\\"]]],null]],[14,\\\"tabindex\\\",\\\"0\\\"],[14,\\\"role\\\",\\\"button\\\"],[12],[1,\\\"\\\\n                                        \\\"],[10,0],[14,0,\\\"phoneType\\\"],[12],[1,[30,1,[\\\"type\\\"]]],[13],[1,\\\"\\\\n                                        \\\"],[10,0],[14,0,\\\"phone\\\"],[12],[1,\\\"\\\\n                                            \\\"],[10,1],[14,0,\\\"number-container\\\"],[12],[1,\\\"\\\\n                                                \\\"],[1,[30,1,[\\\"number\\\"]]],[1,\\\"\\\\n                                            \\\"],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,7],[[30,1,[\\\"acceptsSMS\\\"]],[33,14]],null],[[[1,\\\"                                                \\\"],[10,1],[14,0,\\\"icon-container\\\"],[12],[1,\\\"\\\\n                                                    \\\"],[10,\\\"gux-icon\\\"],[15,1,[29,[[28,[37,15],[\\\"list-phone-sms-\\\",[30,1,[\\\"phoneTypeId\\\"]]],null]]]],[14,0,\\\"svg-icon accept-sms\\\"],[14,\\\"icon-name\\\",\\\"device-cellphone\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                                                \\\"],[13],[1,\\\"\\\\n                                                \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[28,[37,15],[\\\"list-phone-sms-\\\",[30,1,[\\\"phoneTypeId\\\"]]],null]]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n                                                    \\\"],[1,[28,[35,4],[\\\"purecloud.acdInteraction.relate.acceptsSMS\\\"],null]],[1,\\\"\\\\n                                                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                                        \\\"],[13],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                    \\\"],[10,0],[14,0,\\\"phoneType\\\"],[12],[1,[30,1,[\\\"type\\\"]]],[13],[1,\\\"\\\\n                                    \\\"],[10,0],[12],[1,[30,1,[\\\"number\\\"]]],[13],[1,\\\"\\\\n\\\"]],[]]]],[1]],null],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[]],[[[41,[33,9],[[[1,\\\"                    \\\"],[10,1],[14,0,\\\"noPhones\\\"],[12],[1,[28,[35,4],[\\\"purecloud.acdInteraction.relate.search.phoneNotProvided\\\"],null]],[13],[1,\\\"\\\\n                \\\"]],[]],null]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"information emails emailsWrapper\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,16],[[[41,[33,17],[[[1,\\\"                        \\\"],[10,0],[14,0,\\\"emailsExpanded\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,12],[[28,[37,12],[[33,16]],null]],null],null,[[[1,\\\"                                \\\"],[10,0],[14,0,\\\"selectable\\\"],[15,\\\"onclick\\\",[28,[37,1],[[30,0],\\\"selectEntityWithEmail\\\",[30,2,[\\\"address\\\"]],[30,2,[\\\"type\\\"]]],null]],[14,\\\"tabindex\\\",\\\"0\\\"],[14,\\\"role\\\",\\\"button\\\"],[12],[1,\\\"\\\\n                                    \\\"],[10,1],[14,0,\\\"emailType\\\"],[12],[1,\\\"\\\\n                                        \\\"],[1,[30,2,[\\\"type\\\"]]],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n                                    \\\"],[10,1],[14,0,\\\"email ellipsis\\\"],[15,\\\"tooltip\\\",[29,[[30,2,[\\\"address\\\"]]]]],[14,\\\"tooltip-popup-delay\\\",\\\"500\\\"],[14,\\\"tooltip-placement\\\",\\\"bottom\\\"],[12],[1,\\\"\\\\n                                        \\\"],[1,[30,2,[\\\"address\\\"]]],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n\\\"]],[2]],null],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],[[[41,[33,17],[[[1,\\\"                    \\\"],[10,1],[14,0,\\\"noEmails\\\"],[12],[1,[28,[35,4],[\\\"purecloud.acdInteraction.relate.search.emailNotProvided\\\"],null]],[13],[1,\\\"\\\\n                \\\"]],[]],null]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[\\\"phone\\\",\\\"email\\\"],false,[\\\"externalContact\\\",\\\"action\\\",\\\"full-name\\\",\\\"link-to\\\",\\\"t\\\",\\\"if\\\",\\\"await\\\",\\\"and\\\",\\\"phones\\\",\\\"showPhones\\\",\\\"externalContactHasNoPhoneNumbers\\\",\\\"each\\\",\\\"-track-array\\\",\\\"or\\\",\\\"showAcceptsSMS\\\",\\\"concat\\\",\\\"emails\\\",\\\"showEmails\\\"]]\",\"moduleName\":\"web-directory/components/entity-mini/external-contact/template.hbs\",\"isStrictMode\":false});","import { hash } from 'rsvp';\nimport { bool } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport Component from '@ember/component';\nimport _ from 'lodash';\nimport { generateCurrentInterval } from '../../../utils/dates';\n\nexport default Component.extend({\n    classNames: ['entity-mini-queue'],\n    session: service(),\n    intl: service(),\n    engageanalytics: service(),\n    queueService: service('queue'),\n    permissions: service(),\n\n    makingCall: false,\n    isDetailsLoaded: false,\n    isDetailsLoading: false,\n\n    queue: null,\n    clickToProfile: false,\n    showActions: false,\n\n    canViewQueueDetails: bool('permissions.canViewQueueObservations'),\n\n    actions: {\n        getQueueData: function () {\n            const interval = generateCurrentInterval();\n            const id = this.get('queue.id');\n\n            // Ultimately, UX wants to show the following:\n            //   - Active agents\n            //   - Waiting customers by media type\n            //   - Longest wait time (AR-1102)\n            //   - Queue description  (CW-724 is the closest JIRA that mentions this, https://projects.invisionapp.com/share/545F0JYVS#/screens/124326256)\n\n            if (id) {\n                this.set('isDetailsLoading', true);\n                let promises = {\n                    joinedPromise: this.engageanalytics.getQueueObservations([id], interval, {\n                        metrics: ['oOnQueueUsers', 'oWaiting']\n                    }),\n                    waitTimePromise: this.queueService.getQueueEstimatedWaitTime(id, this.interactionType)\n                };\n\n                hash(promises)\n                    .then(hash => {\n                        const joinedData = hash.joinedPromise;\n                        const waitTimeResults = hash.waitTimePromise.results;\n                        const getMetricCount = function (array, metricName) {\n                            const metricData = _.find(array, { metric: metricName });\n                            return metricData.stats.count;\n                        };\n\n                        const getOnQueueCounts = function (array, routingStatus) {\n                            const getRoutingStatusCount = function (datum, routingStatus) {\n                                if (routingStatus) {\n                                    return datum.metric === 'oOnQueueUsers' && datum.qualifier === routingStatus;\n                                }\n                                return datum.metric === 'oOnQueueUsers';\n                            };\n                            return _.chain(array)\n                                .filter(_.partial(getRoutingStatusCount, _, routingStatus))\n                                .map(_.property('stats.count'))\n                                .filter(value => typeof value === 'number')\n                                .sum()\n                                .value();\n                        };\n\n                        const getWaitTime = function (array) {\n                            const bestTime = _.find(array, { formula: 'BEST' });\n                            if (bestTime) {\n                                return bestTime.estimatedWaitTimeSeconds;\n                            }\n                        };\n\n                        const joined = _.find(joinedData, function (element) {\n                            return element.group.queueId === id && element.group.mediaType === undefined;\n                        });\n                        const callData = _.find(joinedData, function (element) {\n                            return element.group.queueId === id && element.group.mediaType === 'voice';\n                        });\n\n                        const callbackData = _.find(joinedData, function (element) {\n                            return element.group.queueId === id && element.group.mediaType === 'callback';\n                        });\n\n                        const chatData = _.find(joinedData, function (element) {\n                            return element.group.queueId === id && element.group.mediaType === 'chat';\n                        });\n\n                        const emailData = _.find(joinedData, function (element) {\n                            return element.group.queueId === id && element.group.mediaType === 'email';\n                        });\n\n                        const messageData = _.find(joinedData, function (element) {\n                            return element.group.queueId === id && element.group.mediaType === 'message';\n                        });\n\n                        let onQueueCount = 0;\n                        let idleCount = 0;\n                        if (joined) {\n                            onQueueCount = getOnQueueCounts(joined.data);\n                            idleCount = getOnQueueCounts(joined.data, 'IDLE');\n                        }\n\n                        let callWaiting;\n                        if (callData) {\n                            callWaiting = getMetricCount(callData.data, 'oWaiting');\n                        }\n\n                        let callbackWaiting;\n                        if (callbackData) {\n                            callbackWaiting = getMetricCount(callbackData.data, 'oWaiting');\n                        }\n\n                        let chatWaiting;\n                        if (chatData) {\n                            chatWaiting = getMetricCount(chatData.data, 'oWaiting');\n                        }\n\n                        let emailWaiting;\n                        if (emailData) {\n                            emailWaiting = getMetricCount(emailData.data, 'oWaiting');\n                        }\n\n                        let messageWaiting;\n                        if (messageData) {\n                            messageWaiting = getMetricCount(messageData.data, 'oWaiting');\n                        }\n\n                        let queueData = {\n                            agentData: `${idleCount}/${onQueueCount}`,\n                            callCount: callWaiting,\n                            callbackCount: callbackWaiting,\n                            chatCount: chatWaiting,\n                            emailCount: emailWaiting,\n                            messageCount: messageWaiting\n                        };\n\n                        let waitStr;\n                        const bestWaitTime = getWaitTime(waitTimeResults);\n                        if (bestWaitTime !== undefined) {\n                            // show estimated wait time; bestWaitTime is in seconds\n                            const hr = Math.floor(bestWaitTime / 3600); // 3600 seconds per hour\n                            const min = Math.floor((bestWaitTime % 3600) / 60); // 60 seconds per minute\n                            const sec = bestWaitTime % 60;\n                            const intl = this.get('intl');\n                            if (hr) {\n                                // use hours, minutes, & seconds\n                                waitStr = intl.t('purecloud.analytics.statValue.hoursMinutesSeconds', {\n                                    seconds: sec.toString(),\n                                    minutes: min.toString(),\n                                    hours: hr.toString()\n                                });\n                            } else if (min) {\n                                // use minutes & seconds\n                                waitStr = intl.t('purecloud.analytics.statValue.minutesSeconds', {\n                                    seconds: sec.toString(),\n                                    minutes: min.toString()\n                                });\n                            } else {\n                                // use seconds\n                                waitStr = intl.t('purecloud.analytics.statValue.seconds', { seconds: sec.toString() });\n                            }\n                            queueData.waitTime = waitStr;\n                        }\n\n                        this.set('queue.queueDetails', queueData);\n                        this.set('isDetailsLoaded', true);\n                    })\n                    .finally(() => this.set('isDetailsLoading', false));\n            }\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"CBBur/B+\",\"block\":\"[[[6,[39,0],null,[[\\\"entity\\\",\\\"showActions\\\",\\\"clickToProfile\\\",\\\"showDepartment\\\",\\\"showPresence\\\",\\\"showFavorite\\\",\\\"isSearchResult\\\"],[[33,1],[33,2],[33,3],false,false,false,false]],[[\\\"default\\\"],[[[[41,[28,[37,5],[[28,[37,6],[[30,1],\\\"details\\\"],null],[33,7]],null],[[[41,[33,8],[[[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin loading-icon\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,9],[[[1,\\\"            \\\"],[10,1],[14,0,\\\"queue-analytics\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,10],[\\\"purecloud.entity.queueDetails.agents\\\"],[[\\\"ratio\\\"],[[33,1,[\\\"queueDetails\\\",\\\"agentData\\\"]]]]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"queue-analytics\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,10],[\\\"purecloud.entity.queueDetails.waitingCount\\\"],null]],[1,\\\"\\\\n\\\\n                \\\"],[10,1],[14,0,\\\"queue-metric\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[33,1,[\\\"queueDetails\\\",\\\"callCount\\\"]]],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"phone\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\\n                \\\"],[10,1],[14,0,\\\"queue-metric\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[33,1,[\\\"queueDetails\\\",\\\"callbackCount\\\"]]],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"phone-outbound\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\\n                \\\"],[10,1],[14,0,\\\"queue-metric\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[33,1,[\\\"queueDetails\\\",\\\"chatCount\\\"]]],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"roster-chat\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\\n                \\\"],[10,1],[14,0,\\\"queue-metric\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[33,1,[\\\"queueDetails\\\",\\\"emailCount\\\"]]],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"message-email\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\\n                \\\"],[10,1],[14,0,\\\"queue-metric\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[33,1,[\\\"queueDetails\\\",\\\"messageCount\\\"]]],[1,\\\"\\\\n                    \\\"],[1,[28,[35,11],null,[[\\\"subMessageType\\\"],[\\\"sms\\\"]]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,1,[\\\"queueDetails\\\",\\\"waitTime\\\"]],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"queue-analytics\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,10],[\\\"purecloud.entity.queueDetails.estimatedWait\\\"],[[\\\"wait\\\"],[[33,1,[\\\"queueDetails\\\",\\\"waitTime\\\"]]]]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],[[[1,\\\"            \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"get-queue-data\\\"],[4,[38,12],[[30,0],\\\"getQueueData\\\",[33,13]],[[\\\"bubbles\\\"],[false]]],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,10],[\\\"purecloud.entity.queueDetails.view\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"]],[]]]],[]]]],[]],[[[41,[28,[37,6],[[30,1],\\\"actions\\\"],null],[[[1,\\\"        \\\"],[1,[28,[35,14],null,[[\\\"queue\\\"],[[33,1]]]]],[1,\\\"\\\\n    \\\"]],[]],null]],[]]]],[1]]]]]],[\\\"section\\\"],false,[\\\"entity-mini\\\",\\\"queue\\\",\\\"showActions\\\",\\\"clickToProfile\\\",\\\"if\\\",\\\"and\\\",\\\"eq\\\",\\\"canViewQueueDetails\\\",\\\"isDetailsLoading\\\",\\\"isDetailsLoaded\\\",\\\"t\\\",\\\"acd-interactions-panel/interaction-messages-icon\\\",\\\"action\\\",\\\"entity\\\",\\\"entity-contact-queue\\\"]]\",\"moduleName\":\"web-directory/components/entity-mini/queue/template.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"9cBPZTUT\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[11,3],[24,0,\\\"entity-mini-link\\\"],[24,6,\\\"#\\\"],[4,[38,2],[[30,0],\\\"sendToProfile\\\"],null],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,3],null,[[\\\"entityIsPerson\\\",\\\"entityIsContact\\\",\\\"entityIsMe\\\",\\\"showDepartment\\\",\\\"showOrganization\\\",\\\"showPresence\\\",\\\"subscribeToPresence\\\",\\\"canContactEntity\\\",\\\"useInitials\\\",\\\"isClickable\\\",\\\"entity\\\",\\\"entityLocationData\\\"],[[33,4],[33,5],[33,6],[33,7],[33,8],[33,9],[33,10],[33,11],[33,12],[33,1],[33,13],[33,14]]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"    \\\"],[1,[28,[35,3],null,[[\\\"entityIsPerson\\\",\\\"entityIsContact\\\",\\\"entityIsMe\\\",\\\"showDepartment\\\",\\\"showOrganization\\\",\\\"showPresence\\\",\\\"subscribeToPresence\\\",\\\"canContactEntity\\\",\\\"useInitials\\\",\\\"isClickable\\\",\\\"entity\\\",\\\"entityLocationData\\\"],[[33,4],[33,5],[33,6],[33,7],[33,8],[33,9],[33,10],[33,11],[33,12],[33,1],[33,13],[33,14]]]]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"\\\\n\\\"],[41,[28,[37,15],[[33,16],[33,11]],null],[[[1,\\\"    \\\"],[10,0],[15,0,[29,[\\\"actions \\\",[52,[33,6],\\\"hide\\\"]]]],[14,\\\"tabindex\\\",\\\"0\\\"],[12],[1,\\\"\\\\n        \\\"],[18,1,[\\\"actions\\\"]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"&default\\\"],false,[\\\"if\\\",\\\"isClickable\\\",\\\"action\\\",\\\"entity-mini/entity-details\\\",\\\"entityIsPerson\\\",\\\"entityIsContact\\\",\\\"entityIsMe\\\",\\\"showDepartment\\\",\\\"showOrganization\\\",\\\"showPresence\\\",\\\"subscribeToPresence\\\",\\\"canContactEntity\\\",\\\"useInitials\\\",\\\"entity\\\",\\\"entityLocationData\\\",\\\"and\\\",\\\"showActions\\\",\\\"yield\\\"]]\",\"moduleName\":\"web-directory/components/entity-mini/template.hbs\",\"isStrictMode\":false});","/* globals moment */\nimport { inject as service } from '@ember/service';\n\nimport { empty, bool } from '@ember/object/computed';\nimport { observer, computed } from '@ember/object';\nimport Component from '@ember/component';\nimport { run, later } from '@ember/runloop';\nimport _ from 'lodash';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nconst MIN_WINDOW_WIDTH_FOR_SEARCH = 1100;\n\nexport default Component.extend(LoggerMixin, {\n    classNames: 'fax-panel',\n    application: service(),\n    fax: service(),\n    addressformat: service(),\n    intl: service(),\n    notification: service(),\n    session: service(),\n\n    addresses: [],\n    includeCoverSheet: true,\n    showFileTypeError: false,\n    showRequiredFaxNumberError: false,\n    notes: '',\n\n    faxParty: computed('participants.[]', function () {\n        return this.participants.get('firstObject');\n    }),\n\n    invalidFileTypeMessage: computed(function () {\n        return this.intl.t('purecloud.fax.error.invalidFileTypeWord');\n    }),\n\n    attachInstructions: computed(function () {\n        return this.intl.t('purecloud.fax.attachInstructionsWord');\n    }),\n\n    observeFaxDocumentData: observer('fax.documentData', function () {\n        let documentData = this.get('fax.documentData');\n        if (documentData && documentData.documentId) {\n            this.setFileInput(documentData);\n        }\n        this.set('fax.documentData', null);\n        later(() => {\n            if (!this.isDestroyed && !this.isDestroying) {\n                this.set('fax.isSelectingDocument', false);\n            }\n        }, 500);\n    }),\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.attachFileListeners();\n        // because toggle-switch calculates width, it doesn't work on hidden elements.\n        // so we have to override with our own width\n        const debounceTimerId = run.debounce(\n            this,\n            function () {\n                this.$('.toggle-switch-container').removeAttr('style');\n            },\n            500\n        );\n        this.set('debounceTimer', debounceTimerId);\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        const $hiddenFileInput = this.$('.hidden-file-input');\n        $hiddenFileInput.off();\n        this.$('.fax-number-input > input').off();\n        run.cancel(this.debounceTimer);\n    },\n\n    supportedTypes: [\n        'image/tiff',\n        'application/pdf',\n        'application/vnd.oasis.opendocument.text',\n        'application/msword',\n        'application/vnd.openxmlformats-officedocument.wordprocessingml.document'\n    ],\n\n    isSupportedType(type) {\n        return _.includes(this.supportedTypes, type);\n    },\n\n    attachFileListeners() {\n        const $hiddenFileInput = this.$('.hidden-file-input');\n        $hiddenFileInput.on('change', e => {\n            run(() => {\n                this.resetFiles();\n                let file = _.head(e.target.files); // only one file for now.\n                if (e.target.files.length > 0) {\n                    run.next(this, this.setFileInput, file);\n                    e.target.value = null; // set to null so we pick up the next change event\n                }\n            });\n        });\n        const $faxNumberInput = this.$('.fax-number-input > input');\n        $faxNumberInput.on('keyup', e => {\n            run(() => {\n                const isEmpty = e.target.value === '';\n                this.set('showRequiredFaxNumberError', isEmpty);\n            });\n        });\n        //this.observeFaxDocumentData();\n    },\n    numberIsEmpty: empty('fax.address'),\n    isFileAttached: bool('attachedFile'),\n    noFilesAttached: computed('attachedFile', function () {\n        // OMG a File object will return Empty even though it really holds data.\n        return _.isEmpty(this.get('attachedFile.name'));\n    }),\n\n    // Create the new FormData object and append the file.\n    setFileInput(file) {\n        if (file === undefined) {\n            this.logger.log('FAX undefined file set as file input');\n            return;\n        }\n        if (!this.isSupportedType(file.type)) {\n            this.set('showFileTypeError', true);\n            this.logger.log('FAX bad file type set as file input - ' + file.type);\n            return;\n        }\n        let faxForm = new FormData();\n        faxForm.append('name', file.name);\n        faxForm.append('file', file);\n\n        this.set('showFileTypeError', false);\n        this.set('faxForm', faxForm);\n        this.set('attachedFile', file);\n        this.set('documentId', file.documentId);\n        this.set('fileName', file.name);\n        this.set('contentType', file.type);\n        this.set('name', `fax - ${file.lastModifiedDate}`);\n    },\n\n    validateFax: function () {\n        let isValid = true;\n        const currentFileType = this.contentType;\n\n        this.set('showFileTypeError', false);\n        this.set('showRequiredFaxNumberError', false);\n\n        if (!this.isSupportedType(currentFileType)) {\n            this.set('showFileTypeError', true);\n            isValid = false;\n        }\n\n        if (this.numberIsEmpty) {\n            this.set('showRequiredFaxNumberError', true);\n            isValid = false;\n        }\n\n        return isValid;\n    },\n\n    dragOver(event) {\n        event.preventDefault();\n    },\n\n    // here we have to manually add the dropped file to the input.\n    drop(event) {\n        event.preventDefault();\n        const DOCUMENT_DATA = 'documentdata';\n        this.set('isDragging', false);\n        var file = event.dataTransfer.files[0];\n        if (!file && event.dataTransfer.types.indexOf(DOCUMENT_DATA) !== -1) {\n            let documentData = event.dataTransfer.getData(DOCUMENT_DATA);\n            file = JSON.parse(documentData);\n        }\n        this.resetFiles();\n        this.setFileInput(file);\n    },\n\n    dragEnter(event) {\n        event.preventDefault();\n        this.set('isDragging', true);\n    },\n\n    resetFiles() {\n        this.set('faxForm', null);\n        this.set('attachedFile', null);\n        this.set('documentId', null);\n        this.set('fileName', null);\n        this.set('contentType', null);\n        this.set('name', null);\n    },\n\n    resetFormState() {\n        this.set('addresses', []);\n        this.set('faxing', false);\n        this.set('includeCoverSheet', true);\n        this.set('notes', null);\n        this.set('fax.address', '');\n        this.set('showRequiredFaxNumberError', false);\n    },\n\n    actions: {\n        initiateFax() {\n            if (this.noStationSelected) {\n                const message = this.intl.t('purecloud.fax.error.stationRequiredToSendFax');\n                this.notification.error(null, message);\n                this.logger.log('FAX Fax attempted with no station selected');\n                return false;\n            }\n\n            if (this.validateFax()) {\n                this.set('faxing', true);\n                const faxAddress = this.get('fax.address');\n                const addresses = [this.addressformat.formatAddress(faxAddress)];\n\n                const documentId = this.documentId;\n                const fileName = this.fileName;\n                const faxForm = this.faxForm;\n                const notes = this.includeCoverSheet ? this.notes : null;\n                const documentName = `Fax - ${moment().format('L LTS')} ${fileName}`;\n\n                this.fax\n                    .makeFaxRequest(addresses, documentName, documentId, this.contentType, notes)\n                    .then(fax => {\n                        this.fax.updateActiveFaxes({\n                            id: fax.id,\n                            _faxAddress: addresses[0],\n                            _purpose: 'fax',\n                            fileName: documentName,\n                            documentId: documentId\n                        });\n                        if (documentId) {\n                            return fax;\n                        }\n\n                        return this.fax.makeUploadRequestWithHeaders(fax.uploadDestinationUri, faxForm, fax.headers);\n                    })\n                    .catch(e => {\n                        const title = this.intl.t('purecloud.fax.error.requestFailed');\n                        const message = e.responseJSON\n                            ? e.responseJSON.message\n                            : this.intl.t('purecloud.fax.error.unknown').toString();\n                        this.notification.error(title, message, { tag: 'call-error' });\n                        this.logger.error('FAX: Failed to fax - ', { message, error: e });\n                    })\n                    .finally(() => {\n                        this.resetFiles();\n                        this.resetFormState();\n                        this.fax.getActiveFaxes();\n                    });\n            }\n        },\n        handleFaxAddressInputChange(value) {\n            this.set('fax.address', value);\n            this.set('showRequiredFaxNumberError', this.numberIsEmpty);\n        },\n        toggleCoverSheet() {\n            this.toggleProperty('includeCoverSheet');\n        },\n        removeFile() {\n            this.resetFiles();\n        },\n        chooseDocument() {\n            this.set('fax.isSelectingDocument', true);\n            this.bubbleAction({\n                action: 'transitionToRoute',\n                actionContext: ['content-management', 'search/results?mode=fax']\n            });\n            if (this.$(window).innerWidth() < MIN_WINDOW_WIDTH_FOR_SEARCH) {\n                this.bubbleAction({\n                    action: 'closePanel'\n                });\n            }\n        },\n        chooseFile() {\n            // We are using the label to handle the click event and hiding the file input because it is hard to style.\n            // http://tympanus.net/codrops/2015/09/15/styling-customizing-file-inputs-smart-way/\n            // Then we have to trigger a click event on the input so that the user's file dialog will appear.\n            this.$('#choose-file').trigger('click');\n        },\n        openStationPicker() {\n            if (this.openStationPicker) {\n                this.openStationPicker();\n            }\n        }\n    }\n}).reopenClass({ positionalParams: ['noStationSelected'] });\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"Da2ar+M2\",\"block\":\"[[[10,0],[15,0,[29,[\\\"panel-content \\\",[52,[33,1],\\\"no-station-selected\\\"]]]],[12],[1,\\\"\\\\n\\\"],[41,[33,1],[[[1,\\\"        \\\"],[19,\\\"partials/no-station-notification\\\",[]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n    \\\"],[10,0],[15,0,[29,[\\\"form-group \\\",[52,[33,3],\\\"has-error\\\"]]]],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-form-field-text-like\\\"],[14,0,\\\"fax-number-input\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"input\\\"],[15,1,[29,[[28,[37,4],[[33,5],\\\"-fax-adress\\\"],null]]]],[14,\\\"slot\\\",\\\"input\\\"],[15,\\\"placeholder\\\",[29,[[28,[37,6],[\\\"purecloud.fax.enterNameOrNumber\\\"],null]]]],[15,2,[29,[[36,7]]]],[15,\\\"oninput\\\",[28,[37,8],[[30,0],\\\"handleFaxAddressInputChange\\\"],[[\\\"value\\\"],[\\\"target.value\\\"]]]],[14,\\\"required\\\",\\\"\\\"],[15,\\\"aria-invalid\\\",[52,[33,3],\\\"true\\\",\\\"false\\\"]],[14,4,\\\"text\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[15,\\\"for\\\",[29,[[28,[37,4],[[33,5],\\\"-fax-adress\\\"],null]]]],[14,\\\"slot\\\",\\\"label\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,6],[\\\"purecloud.fax.enterNameOrNumber\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,1],[14,1,\\\"send-fax-number-error\\\"],[15,\\\"slot\\\",[29,[[52,[33,3],\\\"error\\\"]]]],[14,\\\"aria-live\\\",\\\"polite\\\"],[14,\\\"role\\\",\\\"alert\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,3],[[[1,\\\"                    \\\"],[1,[28,[35,6],[\\\"purecloud.fax.error.faxNumberRequired\\\"],null]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"form-group inline include-cover-sheet\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"label\\\"],[14,1,\\\"send-fax-cover-sheet-input\\\"],[12],[1,[28,[35,6],[\\\"purecloud.fax.coverSheet\\\"],null]],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"control\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,9],null,[[\\\"check\\\",\\\"toggleRoomMute\\\",\\\"dataOn\\\",\\\"dataOff\\\",\\\"aria-labelledby\\\"],[[33,10],\\\"toggleCoverSheet\\\",\\\"toggle.yes\\\",\\\"toggle.no\\\",\\\"send-fax-cover-sheet-input\\\"]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[15,0,[29,[\\\"form-group cover-sheet \\\",[52,[33,10],\\\"show-cover-sheet\\\",\\\"hidden\\\"]]]],[12],[1,\\\"\\\\n        \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"send-fax-cover-page-notes\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,6],[\\\"purecloud.fax.coverPageNote\\\"],null]],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"optional\\\"],[12],[1,[28,[35,6],[\\\"purecloud.fax.coverPageOptional\\\"],null]],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[1,[28,[35,11],null,[[\\\"value\\\",\\\"class\\\",\\\"rows\\\",\\\"id\\\"],[[33,12],\\\"form-control\\\",5,\\\"send-fax-cover-page-notes\\\"]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"form-group attach-files\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"label\\\"],[12],[1,[28,[35,6],[\\\"purecloud.fax.attachDocument\\\"],null]],[10,1],[14,0,\\\"required\\\"],[12],[1,\\\"*\\\"],[13],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[15,0,[29,[\\\"attached-files \\\",[52,[33,13],\\\"hidden\\\"]]]],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"attachment\\\"],[14,\\\"icon-name\\\",\\\"attachment\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"file\\\"],[15,\\\"title\\\",[29,[[36,14]]]],[12],[1,[34,14]],[13],[1,\\\"\\\\n            \\\"],[11,\\\"button\\\"],[24,0,\\\"remove action-remove-documents\\\"],[16,\\\"aria-label\\\",[29,[[28,[37,6],[\\\"purecloud.fax.removeDocument\\\"],null]]]],[24,4,\\\"button\\\"],[4,[38,8],[[30,0],\\\"removeFile\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"close\\\"],[15,\\\"screenreader-text\\\",[28,[37,6],[\\\"purecloud.fax.removeDocument\\\"],null]],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[15,0,[29,[\\\"drag-drop-area\\\\n                \\\",[52,[33,15],\\\"drag-drop-area-error\\\"],\\\"\\\\n                \\\",[52,[33,16],\\\"is-dragging\\\"],\\\"\\\\n                \\\",[52,[33,17],\\\"hidden attached-files\\\"]]]],[14,\\\"role\\\",\\\"region\\\"],[14,\\\"aria-labelledby\\\",\\\"send-fax-attachment-instructions\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"fax-icon\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"file-text\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"attach-wording\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,1,\\\"send-fax-attachment-instructions\\\"],[14,0,\\\"wording\\\"],[12],[1,[34,18]],[13],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"or\\\"],[12],[1,\\\"- \\\"],[1,[28,[35,6],[\\\"purecloud.fax.or\\\"],null]],[1,\\\" -\\\"],[13],[1,\\\"\\\\n\\\\n                \\\"],[11,\\\"label\\\"],[24,\\\"for\\\",\\\"choose-file\\\"],[24,0,\\\"btn btn-link action-attach-documents\\\"],[4,[38,8],[[30,0],\\\"chooseFile\\\"],null],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,6],[\\\"purecloud.fax.browseFiles\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"input\\\"],[14,1,\\\"choose-file\\\"],[14,0,\\\"hidden-file-input\\\"],[15,3,[29,[[28,[37,6],[\\\"purecloud.fax.browseFiles\\\"],null]]]],[15,\\\"accept\\\",[29,[[36,19]]]],[14,4,\\\"file\\\"],[12],[13],[1,\\\"\\\\n\\\\n                \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link action-select-document\\\"],[24,4,\\\"button\\\"],[4,[38,8],[[30,0],\\\"chooseDocument\\\"],null],[12],[1,\\\"\\\\n                    \\\"],[10,1],[12],[1,[28,[35,6],[\\\"purecloud.fax.attachWorkspaceDocument\\\"],null]],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"error\\\"],[14,1,\\\"send-fax-file-error\\\"],[14,\\\"aria-live\\\",\\\"polite\\\"],[14,\\\"role\\\",\\\"alert\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,15],[[[1,\\\"                \\\"],[10,\\\"label\\\"],[12],[1,[34,20]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"submit-fax\\\"],[12],[1,\\\"\\\\n        \\\"],[11,\\\"button\\\"],[24,0,\\\"btn action-initiate-fax\\\"],[16,\\\"aria-label\\\",[28,[37,6],[\\\"purecloud.sendFaxTooltip\\\"],null]],[16,\\\"disabled\\\",[36,21]],[24,4,\\\"submit\\\"],[4,[38,8],[[30,0],\\\"initiateFax\\\"],null],[12],[1,\\\"\\\\n\\\"],[41,[33,21],[[[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[15,\\\"screenreader-text\\\",[28,[37,6],[\\\"purecloud.sendFaxTooltip\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fax\\\"],[15,\\\"screenreader-text\\\",[28,[37,6],[\\\"purecloud.sendFaxTooltip\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],true,[\\\"if\\\",\\\"noStationSelected\\\",\\\"partial\\\",\\\"showRequiredFaxNumberError\\\",\\\"concat\\\",\\\"elementId\\\",\\\"t\\\",\\\"faxAddress\\\",\\\"action\\\",\\\"toggle-switch\\\",\\\"includeCoverSheet\\\",\\\"textarea\\\",\\\"notes\\\",\\\"noFilesAttached\\\",\\\"fileName\\\",\\\"showFileTypeError\\\",\\\"isDragging\\\",\\\"isFileAttached\\\",\\\"attachInstructions\\\",\\\"supportedTypes\\\",\\\"invalidFileTypeMessage\\\",\\\"faxing\\\"]]\",\"moduleName\":\"web-directory/components/fax-panel/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport { or, reads } from '@ember/object/computed';\nimport { getOwner } from '@ember/application';\nimport { scheduleOnce } from '@ember/runloop';\nimport Component from '@ember/component';\nimport { computed, observer } from '@ember/object';\nimport moment from 'web-directory/utils/dates';\n\nexport default Component.extend({\n    classNames: ['feedback-section-v2'],\n\n    intl: service(),\n    application: service(),\n    phone: service(),\n    notification: service(),\n    session: service(),\n\n    subjectSearchString: null,\n    isSubmitting: false,\n    isDisabled: or('emptyFields', 'isSubmitting'),\n\n    init() {\n        this._super(...arguments);\n        this.set('natureType', this.get('natureTypes.0.data'));\n        this.set('requestPriority', this.get('requestPriorities.2.data'));\n        this.set('functionalityType', this.get('functionalityTypes.5.data'));\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        scheduleOnce('afterRender', this, this._addBehavior);\n    },\n\n    _addBehavior() {\n        return this.$('input.subject').trigger('focus');\n    },\n\n    distList: reads('session.publicApiUser.organization.supportURI'),\n\n    natureType: null,\n    natureTypes: computed(function () {\n        const intl = this.intl;\n        return [\n            {\n                text: intl.safestring('components.navMenu.feedback.natureTypes.problem'),\n                data: 'PROBLEM'\n            },\n            {\n                text: intl.safestring('components.navMenu.feedback.natureTypes.question'),\n                data: 'QUESTION'\n            },\n            {\n                text: intl.safestring('components.navMenu.feedback.natureTypes.enhancementRequest'),\n                data: 'ENHANCEMENT REQUEST'\n            }\n        ];\n    }),\n    requestPriority: null,\n    requestPriorities: computed(function () {\n        const intl = this.intl;\n        return [\n            {\n                text: intl.safestring('components.navMenu.feedback.requestPriorities.critical'),\n                data: 'CRITICAL'\n            },\n            {\n                text: intl.safestring('components.navMenu.feedback.requestPriorities.high'),\n                data: 'HIGH'\n            },\n            {\n                text: intl.safestring('components.navMenu.feedback.requestPriorities.medium'),\n                data: 'MEDIUM'\n            },\n            {\n                text: intl.safestring('components.navMenu.feedback.requestPriorities.low'),\n                data: 'LOW'\n            }\n        ];\n    }),\n    functionalityType: null,\n    functionalityTypes: computed(function () {\n        const intl = this.intl;\n        return [\n            {\n                text: intl.safestring('components.navMenu.feedback.functionalityTypes.admin'),\n                data: 'ADMIN'\n            },\n            {\n                text: intl.safestring('components.navMenu.feedback.functionalityTypes.documents'),\n                data: 'DOCUMENTS'\n            },\n            {\n                text: intl.safestring('components.navMenu.feedback.functionalityTypes.chat'),\n                data: 'CHAT'\n            },\n            {\n                text: intl.safestring('components.navMenu.feedback.functionalityTypes.telephony'),\n                data: 'TELEPHONY'\n            },\n            {\n                text: intl.safestring('components.navMenu.feedback.functionalityTypes.videoChat'),\n                data: 'VIDEO CHAT'\n            },\n            {\n                text: intl.safestring('components.navMenu.feedback.functionalityTypes.contactCenter'),\n                data: 'CONTACT CENTER'\n            },\n            {\n                text: intl.safestring('components.navMenu.feedback.functionalityTypes.login'),\n                data: 'LOGIN'\n            },\n            {\n                text: intl.safestring('components.navMenu.feedback.functionalityTypes.slowness'),\n                data: 'SLOWNESS'\n            },\n            {\n                text: intl.safestring('components.navMenu.feedback.functionalityTypes.other'),\n                data: 'OTHER'\n            }\n        ];\n    }),\n\n    subject: null,\n    requestDescription: null,\n    emptyFields: computed('subject', 'requestDescription', function () {\n        return !this.subject || !this.requestDescription;\n    }),\n\n    onLastConversationError: observer('phone.lastConversationError', function () {\n        if (this.get('phone.lastConversationError')) {\n            this.set('functionalityType', 'TELEPHONY');\n            this.set(\n                'requestDescription',\n                `\\n\\n----\\n${moment().format('MM/DD/YYYY HH:mm:ss')}\\n[${this.get(\n                    'phone.lastConversationError.errorInfo.code'\n                )}]: ${this.get('phone.lastConversationError.id')}\\n${this.get(\n                    'phone.lastConversationError.errorInfo.message'\n                )}`\n            );\n        }\n    }),\n\n    displayFeedbackForm: false,\n\n    clearInput() {\n        return this.setProperties({\n            subject: '',\n            requestDescription: ''\n        });\n    },\n\n    getRequest() {\n        let desktopOS, desktopVersion, isHosted;\n        isHosted = this.get('application.hostedContext.isHostedProp');\n        if (isHosted) {\n            desktopOS = this.get('application.hostedContext._operatingSystem');\n            desktopVersion = this.get('application.hostedContext._version');\n        }\n        return {\n            subject: this.subject,\n            topic: this.functionalityType,\n            description: this.requestDescription,\n            priority: this.requestPriority,\n            type: this.natureType,\n            data: {\n                userAgent: navigator.userAgent,\n                clientLocation: window.location.toString(),\n                clientTimestamp: moment().format(),\n                clientEmail: this.get('session.user.email'),\n                clientOrgName: this.get('application.orgName'),\n                clientLocale: this.get('intl.isoLocale'),\n                clientType: isHosted ? 'Desktop - ' + desktopOS + ' - ' + desktopVersion : 'Browser',\n                clientVersion: this.get('application.semver')\n            }\n        };\n    },\n\n    actions: {\n        submit() {\n            const intl = this.intl;\n            const desktopNotification = this.notification;\n            this.set('isSubmitting', true);\n            return this.application\n                .sendFeedback(this.getRequest())\n                .then(() => {\n                    this.clearInput();\n                    return desktopNotification.show(\n                        {\n                            title: intl.safestring('components.navMenu.feedback.successHeader').toString(),\n                            message: intl.safestring('components.navMenu.feedback.successTextV2').toString()\n                        },\n                        getOwner(this)\n                    );\n                })\n                .catch(() => {\n                    return desktopNotification.show(\n                        {\n                            type: 'error',\n                            title: intl.safestring('components.navMenu.feedback.errorHeader').toString(),\n                            message: intl.safestring('components.navMenu.feedback.errorText').toString()\n                        },\n                        getOwner(this)\n                    );\n                })\n                .finally(() => {\n                    this.set('isSubmitting', false);\n                });\n        },\n        cancel() {\n            this.set('displayFeedbackForm', false);\n        },\n        showContactForm() {\n            this.set('displayFeedbackForm', true);\n        },\n        updateNature(e) {\n            let value = e.target.value;\n            this.set('natureType', value);\n        },\n        updatePriorities(e) {\n            let value = e.target.value;\n            this.set('requestPriority', value);\n        },\n        updateFunctionality(e) {\n            let value = e.target.value;\n            this.set('functionalityType', value);\n        },\n        updateSubject(e) {\n            let value = e.target.value;\n            this.set('subject', value);\n        },\n        updateDetails(e) {\n            let value = e.target.value;\n            this.set('requestDescription', value);\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"5LWKPWCY\",\"block\":\"[[[10,0],[14,0,\\\"feedback-title-main\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"feedback-title\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"h3\\\"],[12],[1,[28,[35,0],[\\\"components.navMenu.feedback.contactSupport\\\"],null]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"feedback-pane-main\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,2],[[33,3,[\\\"isMobile\\\"]],[33,4]],null],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"feedback-pane\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"feedback-nature feedback-element\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-form-field-dropdown\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-dropdown\\\"],[15,1,[29,[[36,5],\\\"-feedback-nature\\\"]]],[15,2,[36,6]],[14,3,\\\"feedback-nature\\\"],[15,\\\"onchange\\\",[28,[37,7],[[30,0],\\\"updateNature\\\"],null]],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-listbox\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,9],[[28,[37,9],[[33,10]],null]],null],null,[[[1,\\\"                                \\\"],[10,\\\"gux-option\\\"],[15,2,[30,1,[\\\"data\\\"]]],[15,\\\"selected\\\",[52,[28,[37,11],[[30,1,[\\\"data\\\"]],[33,12]],null],\\\"true\\\"]],[12],[1,\\\"\\\\n                                    \\\"],[1,[30,1,[\\\"text\\\"]]],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[15,\\\"for\\\",[29,[[36,5],\\\"-feedback-nature\\\"]]],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,0],[\\\"components.navMenu.feedback.nature\\\"],null]],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"toolbar-help\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[15,1,[29,[[36,5],\\\"-icon-feedback-nature\\\"]]],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,5],\\\"-icon-feedback-nature\\\"]]],[14,\\\"placement\\\",\\\"right\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,0],[\\\"components.navMenu.feedback.instructionText.nature\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,0],[14,0,\\\"feedback-priority feedback-element\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-form-field-dropdown\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-dropdown\\\"],[15,1,[29,[[36,5],\\\"-feedback-priorites\\\"]]],[15,2,[36,13]],[14,3,\\\"feedback-priorities\\\"],[15,\\\"onchange\\\",[28,[37,7],[[30,0],\\\"updatePriorities\\\"],null]],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-listbox\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,9],[[28,[37,9],[[33,14]],null]],null],null,[[[1,\\\"                                \\\"],[10,\\\"gux-option\\\"],[15,2,[30,2,[\\\"data\\\"]]],[15,\\\"selected\\\",[52,[28,[37,11],[[30,2,[\\\"data\\\"]],[33,12]],null],\\\"true\\\"]],[12],[1,\\\"\\\\n                                    \\\"],[1,[30,2,[\\\"text\\\"]]],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n\\\"]],[2]],null],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[15,\\\"for\\\",[29,[[36,5],\\\"-feedback-priorites\\\"]]],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,0],[\\\"components.navMenu.feedback.priority\\\"],null]],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"toolbar-help\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[15,1,[29,[[36,5],\\\"-icon-feedback-priorites\\\"]]],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,5],\\\"-icon-feedback-priorites\\\"]]],[14,\\\"placement\\\",\\\"right\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,0],[\\\"components.navMenu.feedback.instructionText.priority\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,0],[14,0,\\\"feedback-functionality feedback-element\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-form-field-dropdown\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-dropdown\\\"],[15,1,[29,[[36,5],\\\"-feedback-functionality\\\"]]],[15,2,[36,15]],[14,3,\\\"feedback-functionality\\\"],[15,\\\"onchange\\\",[28,[37,7],[[30,0],\\\"updateFunctionality\\\"],null]],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-listbox\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,9],[[28,[37,9],[[33,16]],null]],null],null,[[[1,\\\"                                \\\"],[10,\\\"gux-option\\\"],[15,2,[30,3,[\\\"data\\\"]]],[15,\\\"selected\\\",[52,[28,[37,11],[[30,3,[\\\"data\\\"]],[33,12]],null],\\\"true\\\"]],[12],[1,\\\"\\\\n                                    \\\"],[1,[30,3,[\\\"text\\\"]]],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n\\\"]],[3]],null],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[15,\\\"for\\\",[29,[[36,5],\\\"-feedback-functionality\\\"]]],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,0],[\\\"components.navMenu.feedback.functionalityType\\\"],null]],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"toolbar-help\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[15,1,[29,[[36,5],\\\"-icon-feedback-functionality\\\"]]],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,5],\\\"-icon-feedback-functionality\\\"]]],[14,\\\"placement\\\",\\\"right\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,0],[\\\"components.navMenu.feedback.instructionText.functionalityType\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,0],[14,0,\\\"feedback-subject feedback-element\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-form-field-text-like\\\"],[14,\\\"character-limit\\\",\\\"250\\\"],[15,\\\"onchange\\\",[28,[37,7],[[30,0],\\\"updateSubject\\\"],null]],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"input\\\"],[14,\\\"slot\\\",\\\"input\\\"],[14,3,\\\"subject\\\"],[15,1,[29,[[36,5],\\\"-subject\\\"]]],[14,4,\\\"text\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[15,\\\"for\\\",[29,[[36,5],\\\"-subject\\\"]]],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,0],[\\\"components.navMenu.feedback.subject\\\"],null]],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"toolbar-help\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[15,1,[29,[[36,5],\\\"-icon-subject\\\"]]],[12],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,5],\\\"-icon-subject\\\"]]],[14,\\\"placement\\\",\\\"right\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,0],[\\\"components.navMenu.feedback.instructionText.subject\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[1,[28,[35,17],null,[[\\\"model\\\",\\\"maxCount\\\"],[[33,18],\\\"250\\\"]]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,0],[14,0,\\\"details-container feedback-element\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"details-form-control\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-form-field-textarea\\\"],[14,\\\"character-limit\\\",\\\"4000\\\"],[15,\\\"onchange\\\",[28,[37,7],[[30,0],\\\"updateDetails\\\"],null]],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"textarea\\\"],[14,\\\"slot\\\",\\\"input\\\"],[14,3,\\\"details\\\"],[15,1,[29,[[36,5],\\\"-details\\\"]]],[12],[1,\\\" \\\"],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[15,\\\"for\\\",[29,[[36,5],\\\"-details\\\"]]],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,0],[\\\"components.navMenu.feedback.details\\\"],null]],[1,\\\"\\\\n\\\\n                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"toolbar-help\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[15,1,[29,[[36,5],\\\"-icon-details\\\"]]],[12],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[1,[28,[35,17],null,[[\\\"model\\\",\\\"maxCount\\\"],[[33,19],\\\"4000\\\"]]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"instruction-text details\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,0],[\\\"components.navMenu.feedback.instructionText.details\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,0],[14,0,\\\"version\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[33,20,[\\\"semver\\\"]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,\\\"gux-button\\\"],[14,\\\"accent\\\",\\\"primary\\\"],[15,\\\"disabled\\\",[36,21]],[15,\\\"onclick\\\",[28,[37,7],[[30,0],\\\"submit\\\"],null]],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,0],[\\\"components.navMenu.feedback.submit\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,\\\"gux-button\\\"],[14,\\\"accent\\\",\\\"ghost\\\"],[15,\\\"onclick\\\",[28,[37,7],[[30,0],\\\"cancel\\\"],null]],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,0],[\\\"components.navMenu.feedback.cancel\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[1,[28,[35,22],null,[[\\\"contact\\\"],[[28,[37,7],[[30,0],\\\"showContactForm\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]]],[13]],[\\\"natureType\\\",\\\"requestPriority\\\",\\\"functionalityType\\\"],false,[\\\"t\\\",\\\"if\\\",\\\"or\\\",\\\"application\\\",\\\"displayFeedbackForm\\\",\\\"elementId\\\",\\\"natureType\\\",\\\"action\\\",\\\"each\\\",\\\"-track-array\\\",\\\"natureTypes\\\",\\\"eq\\\",\\\"value\\\",\\\"requestPriority\\\",\\\"requestPriorities\\\",\\\"functionalityType\\\",\\\"functionalityTypes\\\",\\\"characters-used\\\",\\\"subject\\\",\\\"requestDescription\\\",\\\"applicationService\\\",\\\"isDisabled\\\",\\\"resource-center-search-v2\\\"]]\",\"moduleName\":\"web-directory/components/feedback-section-v2/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport { reads } from '@ember/object/computed';\nimport { scheduleOnce, run } from '@ember/runloop';\nimport { on } from '@ember/object/evented';\nimport { computed } from '@ember/object';\nimport Component from '@ember/component';\n\nconst RESIZE_DEBOUNCE_MS = 200;\n\nconst DEFAULT_LEFT = 85;\nconst DEFAULT_TOP = 70;\n\nconst DRAG_MIN_LEFT = 0;\nconst DRAG_MIN_TOP = 0;\n\ninterface FloatingBounds {\n    top: number;\n    left: number;\n}\n\n/**\n * Floating calls widget — a draggable, minimizable overlay that shows\n * active/incoming non-ACD calls. Dragging is implemented with native\n * pointer events instead of jQuery UI draggable.\n *\n * @attribute minimized - controls minimized vs. expanded view\n */\nexport default Component.extend({\n    classNameBindings: [':floating-calls', 'expanded', 'isDragging:dragging:', 'phone.showFloatingCalls::hide'],\n\n    phone: service('phone'),\n    session: service('session'),\n    sidebar: service('sidebar'),\n    commandNav: service('command-nav'),\n\n    expanded: false,\n    minimized: false,\n    isDragging: false,\n\n    maxLeft: 0,\n    maxTop: 0,\n\n    _dragActive: false,\n    /** Pointer offset from element top-left at drag start */\n    _dragOffsetX: 0,\n    _dragOffsetY: 0,\n    /** Debounced resize handler reference */\n    _resizeHandler: null as (() => void) | null,\n\n    // ── Actions ──────────────────────────────────────────────────────────────\n\n    actions: {\n        minimize() {\n            this.toggleProperty('minimized');\n            this.setBounds(false);\n        },\n\n        close() {\n            (this.element as HTMLElement).style.display = 'none';\n        },\n\n        popback() {\n            if ((this as any).get('session.useNewNav')) {\n                (this as any).get('commandNav').selectPanel('voice');\n            } else {\n                (this as any).get('sidebar').togglePanel('callControls');\n            }\n        },\n\n        toggleExpanded() {\n            this.toggleProperty('expanded');\n        },\n\n        changeActiveCall(conversation: unknown) {\n            (this as any).set('phone.activeCall', conversation);\n        }\n    },\n\n    // ── Lifecycle ─────────────────────────────────────────────────────────────\n\n    setInitialPosition: on('didInsertElement', function (this: any) {\n        // Create stable bound references once — required for removeEventListener to work\n        this._boundPointerMove = (e: PointerEvent) => this._handlePointerMove(e);\n        this._boundPointerUp = (e: PointerEvent) => this._handlePointerUp(e);\n        this._dragActive = false;\n\n        scheduleOnce('afterRender', this, () => {\n            this._initDragHandles();\n            this.setBounds(true);\n            this._attachWindowResize();\n        });\n    }),\n\n    removeEvents: on('willDestroyElement', function (this: any) {\n        this._detachWindowResize();\n        this._removeDragListeners();\n        if (this._boundPointerDown && this.element) {\n            this.element.removeEventListener('pointerdown', this._boundPointerDown);\n        }\n    }),\n\n    // ── Drag implementation ───────────────────────────────────────────────────\n\n    _initDragHandles(this: any) {\n        this._boundPointerDown = (e: PointerEvent) => this._onPointerDown(e);\n        this.element.addEventListener('pointerdown', this._boundPointerDown);\n    },\n\n    _onPointerDown(this: any, event: PointerEvent) {\n        if (event.button !== 0) {\n            return;\n        }\n\n        // Check the event originated on a handle via closest(), but exclude\n        // interactive elements (buttons, links) so clicks still fire normally.\n        const target = event.target as Element;\n        const onTopBar = target.closest('.top-bar') !== null;\n        const onButton = target.closest('button, a, [role=\"button\"]') !== null;\n        if (!onTopBar || onButton) {\n            return;\n        }\n\n        event.preventDefault();\n\n        const el: HTMLElement = this.element;\n\n        this._recalcMaxBounds();\n\n        this._dragActive = true;\n        this.set('isDragging', true);\n\n        // Use offsetLeft/offsetTop (relative to offset parent) rather than\n        // getBoundingClientRect() (viewport-relative) so the offset stays correct\n        // when the page has scrolled or the offset parent isn't the viewport.\n        this._dragOffsetX = event.clientX - el.offsetLeft;\n        this._dragOffsetY = event.clientY - el.offsetTop;\n\n        // Use pointer capture so pointermove/pointerup are always delivered to\n        // this element even if the pointer leaves the window — prevents stale\n        // listeners from accumulating if the user releases outside the browser.\n        el.setPointerCapture(event.pointerId);\n        el.addEventListener('pointermove', this._boundPointerMove);\n        el.addEventListener('pointerup', this._boundPointerUp);\n        el.addEventListener('pointercancel', this._boundPointerUp);\n    },\n\n    _recalcMaxBounds(this: any) {\n        const el: HTMLElement = this.element;\n        const appScroll = document.querySelector<HTMLElement>('.application-scroll');\n        const navBar = document.querySelector<HTMLElement>('.navigation-action-bar');\n        const navBarWidth = navBar ? navBar.offsetWidth : 0;\n        const visibleHeight = appScroll ? appScroll.clientHeight : window.innerHeight;\n        const isMinimized = this.get('minimized');\n        const widthPx = isMinimized ? 90 : 225;\n        this.maxLeft = window.innerWidth - navBarWidth - widthPx;\n        this.maxTop = visibleHeight - el.offsetHeight - 20;\n    },\n\n    _handlePointerMove(this: any, event: PointerEvent) {\n        if (!this._dragActive) {\n            return;\n        }\n\n        let newLeft = event.clientX - this._dragOffsetX;\n        let newTop = event.clientY - this._dragOffsetY;\n\n        newLeft = Math.max(DRAG_MIN_LEFT, Math.min(newLeft, this.maxLeft));\n        newTop = Math.max(DRAG_MIN_TOP, Math.min(newTop, this.maxTop));\n\n        const el: HTMLElement = this.element;\n        el.style.left = `${newLeft}px`;\n        el.style.top = `${newTop}px`;\n    },\n\n    _handlePointerUp(this: any, _event: PointerEvent) {\n        if (!this._dragActive) {\n            return;\n        }\n        this._dragActive = false;\n        run(() => {\n            this.set('isDragging', false);\n        });\n\n        const el: HTMLElement = this.element;\n        this.get('phone').set('floatingBounds', {\n            top: el.offsetTop,\n            left: el.offsetLeft\n        });\n\n        this._removeDragListeners();\n    },\n\n    _removeDragListeners(this: any) {\n        const el: HTMLElement | undefined = this.element;\n        if (!el) {\n            return;\n        }\n        el.removeEventListener('pointermove', this._boundPointerMove);\n        el.removeEventListener('pointerup', this._boundPointerUp);\n        el.removeEventListener('pointercancel', this._boundPointerUp);\n    },\n\n    // ── Resize handling ───────────────────────────────────────────────────────\n\n    _attachWindowResize(this: any) {\n        let timer: ReturnType<typeof setTimeout> | null = null;\n        this._resizeHandler = () => {\n            if (timer !== null) {\n                clearTimeout(timer);\n            }\n            timer = setTimeout(() => {\n                run(() => this.setBounds(false));\n            }, RESIZE_DEBOUNCE_MS);\n        };\n        window.addEventListener('resize', this._resizeHandler);\n    },\n\n    _detachWindowResize(this: any) {\n        if (this._resizeHandler) {\n            window.removeEventListener('resize', this._resizeHandler);\n            this._resizeHandler = null;\n        }\n    },\n\n    // ── Position / bounds ─────────────────────────────────────────────────────\n\n    /**\n     * Calculates containment bounds and positions the element.\n     *\n     * @param useStored - when true, restore previously saved position from\n     *   phone.floatingBounds before falling back to the element's current pos.\n     */\n    setBounds(this: any, useStored: boolean) {\n        const el: HTMLElement = this.element;\n        if (!el) {\n            return;\n        }\n\n        const appScroll = document.querySelector<HTMLElement>('.application-scroll');\n        const navBar = document.querySelector<HTMLElement>('.navigation-action-bar');\n\n        const navBarWidth = navBar ? navBar.offsetWidth : 0;\n        const visibleHeight = appScroll ? appScroll.clientHeight : window.innerHeight;\n\n        let top: number | undefined;\n        let left: number | undefined;\n\n        if (useStored) {\n            const stored: FloatingBounds | undefined = this.get('phone.floatingBounds');\n            if (stored) {\n                top = stored.top;\n                left = stored.left;\n            }\n        }\n\n        if (top === undefined) {\n            top = el.offsetTop || DEFAULT_TOP;\n        }\n        if (left === undefined) {\n            left = el.offsetLeft || DEFAULT_LEFT;\n        }\n\n        const isMinimized = this.get('minimized');\n        const widthPx = isMinimized ? 90 : 225;\n\n        this.maxLeft = window.innerWidth - navBarWidth - widthPx;\n        this.maxTop = visibleHeight - el.offsetHeight - 20;\n\n        left = Math.max(DRAG_MIN_LEFT, Math.min(left, this.maxLeft));\n        top = Math.max(DRAG_MIN_TOP, Math.min(top, this.maxTop));\n\n        if (!left) {\n            left = DEFAULT_LEFT;\n        }\n        if (!top) {\n            top = DEFAULT_TOP;\n        }\n\n        el.style.left = `${left}px`;\n        el.style.top = `${top}px`;\n        el.style.width = `${widthPx}px`;\n        el.style.height = 'auto';\n\n        this.get('phone').set('floatingBounds', { left, top });\n    },\n\n    _handleShowFloatingCallsChange: on('didInsertElement', function (this: any) {\n        this.addObserver('phone.showFloatingCalls', this, '_onShowFloatingCallsChanged');\n    }),\n\n    _onShowFloatingCallsChanged(this: any) {\n        if (this.get('phone.showFloatingCalls')) {\n            this.element.style.display = '';\n            this.setBounds(true);\n        }\n    },\n\n    // ── Computed properties ───────────────────────────────────────────────────\n\n    activeConversation: reads('phone.activeCall'),\n\n    incomingConversations: computed('phone.incomingNonAcdConversations.[]', function (this: any) {\n        return this.get('phone.incomingNonAcdConversations');\n    }),\n\n    conversations: computed('activeConversation', 'phone.activeNonAcdCalls', function (this: any) {\n        const active = this.get('activeConversation');\n        if (!active) {\n            return [];\n        }\n        const activeId = active.get('id');\n        const allCalls = this.get('phone.activeNonAcdCalls');\n        return allCalls.filter(\n            (conversation: any) => conversation.get('id') !== activeId && !conversation.get('isIncoming')\n        );\n    }),\n\n    conversationsCount: reads('phone.activeNonAcdCalls.length'),\n\n    showMore: computed('phone.activeNonAcdCalls.[]', function (this: any) {\n        return this.get('phone.activeNonAcdCalls.length') > 1;\n    }),\n\n    moreCount: computed('expanded', 'phone.activeNonAcdCalls.[]', function (this: any) {\n        return this.get('phone.activeNonAcdCalls.length') - 1;\n    }),\n\n    _resetExpandedOnSingleCall: computed('conversationsCount', function (this: any) {\n        if (this.get('conversationsCount') === 1) {\n            this.set('expanded', false);\n        }\n        return null;\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"ZffKQF2E\",\"block\":\"[[[41,[51,[33,1]],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"top-bar\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"full-view\\\"],[12],[1,\\\"\\\\n            \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link compress-float\\\"],[16,\\\"aria-label\\\",[28,[37,2],[\\\"common.collapse\\\"],null]],[24,4,\\\"button\\\"],[4,[38,3],[[30,0],\\\"popback\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/ic-window-contract\\\"],[15,\\\"screenreader-text\\\",[28,[37,2],[\\\"common.collapse\\\"],null]],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"move-bar\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"button\\\"],[14,0,\\\"btn btn-link move-float\\\"],[15,\\\"aria-label\\\",[28,[37,2],[\\\"common.more\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"menu-kebab-horizontal\\\"],[15,\\\"screenreader-text\\\",[28,[37,2],[\\\"common.more\\\"],null]],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"window-controls\\\"],[12],[1,\\\"\\\\n            \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link minimize-float\\\"],[16,\\\"aria-label\\\",[28,[37,2],[\\\"common.minimize\\\"],null]],[24,4,\\\"button\\\"],[4,[38,3],[[30,0],\\\"minimize\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/minus-circle\\\"],[15,\\\"screenreader-text\\\",[28,[37,2],[\\\"common.minimize\\\"],null]],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link close-float\\\"],[16,\\\"aria-label\\\",[28,[37,2],[\\\"common.close\\\"],null]],[24,4,\\\"button\\\"],[4,[38,3],[[30,0],\\\"close\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/close-circle\\\"],[15,\\\"screenreader-text\\\",[28,[37,2],[\\\"common.close\\\"],null]],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[42,[28,[37,5],[[28,[37,5],[[33,6]],null]],null],null,[[[1,\\\"        \\\"],[10,0],[14,0,\\\"clickable call incoming-call\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,7],[[30,1]],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"\\\\n\\\"],[41,[33,9],[[[1,\\\"        \\\"],[11,0],[24,0,\\\"clickable call floating-active-conversation active\\\"],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[16,\\\"data-t\\\",[29,[\\\"floating-active-conversation-\\\",[33,9,[\\\"id\\\"]]]]],[4,[38,3],[[30,0],\\\"changeActiveCall\\\",[33,9]],null],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,7],[[33,9]],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[42,[28,[37,5],[[28,[37,5],[[33,10]],null]],null],null,[[[1,\\\"        \\\"],[11,0],[24,0,\\\"clickable call floating-active-conversation\\\"],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[16,\\\"data-t\\\",[29,[\\\"floating-active-conversation-\\\",[30,2,[\\\"id\\\"]]]]],[4,[38,3],[[30,0],\\\"changeActiveCall\\\",[30,2]],null],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,7],[[30,2]],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[2]],null],[1,\\\"\\\\n\\\"],[41,[33,11],[[[1,\\\"        \\\"],[11,0],[24,0,\\\"show-more clickable\\\"],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[4,[38,3],[[30,0],\\\"toggleExpanded\\\"],null],[12],[1,\\\"\\\\n\\\"],[41,[33,12],[[[1,\\\"                \\\"],[1,[28,[35,2],[\\\"purecloud.floating.showLess\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                \\\"],[1,[28,[35,2],[\\\"purecloud.floating.showMore\\\"],[[\\\"count\\\"],[[33,13]]]]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,1],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"minimized-view\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"top-bar\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"full-view\\\"],[12],[1,\\\"\\\\n                \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link\\\"],[16,\\\"aria-label\\\",[28,[37,2],[\\\"common.collapse\\\"],null]],[24,4,\\\"button\\\"],[4,[38,3],[[30,0],\\\"popback\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/ic-window-contract\\\"],[15,\\\"screenreader-text\\\",[28,[37,2],[\\\"common.collapse\\\"],null]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"move-bar\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"button\\\"],[14,0,\\\"btn btn-link\\\"],[15,\\\"aria-label\\\",[28,[37,2],[\\\"common.more\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"menu-kebab-horizontal\\\"],[15,\\\"screenreader-text\\\",[28,[37,2],[\\\"common.more\\\"],null]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"window-controls\\\"],[12],[1,\\\"\\\\n                \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link\\\"],[16,\\\"aria-label\\\",[28,[37,2],[\\\"common.expand\\\"],null]],[24,4,\\\"button\\\"],[4,[38,3],[[30,0],\\\"minimize\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/plus-circle\\\"],[15,\\\"screenreader-text\\\",[28,[37,2],[\\\"common.expand\\\"],null]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link\\\"],[16,\\\"aria-label\\\",[28,[37,2],[\\\"common.close\\\"],null]],[24,4,\\\"button\\\"],[4,[38,3],[[30,0],\\\"close\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/close-circle\\\"],[15,\\\"screenreader-text\\\",[28,[37,2],[\\\"common.close\\\"],null]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"conversations-minimized\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/phone\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[1,[34,14]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"conversation\\\",\\\"conversation\\\"],false,[\\\"unless\\\",\\\"minimized\\\",\\\"t\\\",\\\"action\\\",\\\"each\\\",\\\"-track-array\\\",\\\"incomingConversations\\\",\\\"active-call-entry\\\",\\\"if\\\",\\\"activeConversation\\\",\\\"conversations\\\",\\\"showMore\\\",\\\"expanded\\\",\\\"moreCount\\\",\\\"conversationsCount\\\"]]\",\"moduleName\":\"web-directory/components/floating-calls/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport { reads } from '@ember/object/computed';\nimport { run, once } from '@ember/runloop';\nimport { observer, computed, set, get } from '@ember/object';\nimport Component from '@ember/component';\n\nimport { CallForwardingWrapper } from './forwarding-helpers';\n\nconst ROUTE_ENTRY_LIMIT = 4;\n\nconst VOICEMAIL_CHOICES = {\n    LASTCALL: 'LASTCALL',\n    PURECLOUD: 'PURECLOUD',\n    NONE: 'NONE'\n};\n\nconst DISABLE_VOICEMAIL_ERROR_CODE = 'callforwarding.voicemaillastcallmustbeanexternalphonenumber';\n\nfunction emptyStationData() {\n    return CallForwardingWrapper.create({\n        new: true\n    });\n}\n\nexport default Component.extend({\n    classNames: ['follow-me-settings-panel', 'phone-settings', 'panel-content'],\n\n    intl: service(),\n    phone: service(),\n    store: service(),\n    logger: service('stash-logger'),\n    pigeon: service(),\n    session: service(),\n    permissions: service(),\n    sidebar: service(),\n    commandNav: service('command-nav'),\n    notification: service(),\n\n    model: null,\n\n    callRoutes: null,\n\n    currentStation: reads('phone.station'),\n\n    calls: reads('model.calls'),\n    enableCallRoutes: reads('model.enabled'),\n    isExternalVoicemail: reads('model.isExternalVoicemail'),\n\n    actions: {\n        toggleCallRoutes(ev) {\n            if (ev.key && ev.key !== 'Enter' && ev.key !== ' ') {\n                return;\n            }\n            const model = this.model;\n            model.toggleProperty('enabled');\n\n            // If we do not have any routes configured, server errors on enable\n            // We need to delay saving enabled until future\n            if (this.get('calls.length') > 0) {\n                model\n                    .save({\n                        adapterOptions: {\n                            patch: true\n                        }\n                    })\n                    .catch(error => {\n                        this.logger.error('There was an error toggling call route state:', {\n                            error,\n                            toggled: model.get('enabled')\n                        });\n\n                        model.reload();\n\n                        this.showErrorNotification(error);\n                    });\n            }\n        },\n\n        selectUserStation(station) {\n            return this.phone.chooseStation(station.get('id'));\n        },\n\n        deselectUserStation() {\n            return this.phone.disassociateStation();\n        },\n\n        selectNumber(stationData, number) {\n            stationData.set('number', number);\n            this.saveCallRoutes(stationData);\n        },\n\n        selectStation(stationData, station) {\n            stationData.set('station', station);\n            this.saveCallRoutes(stationData);\n        },\n\n        addStation(station) {\n            const stations = this.callRoutes;\n            if (stations.length === ROUTE_ENTRY_LIMIT) {\n                return;\n            }\n\n            set(station, 'saved', true);\n\n            stations.pushObject(emptyStationData());\n        },\n\n        removeStation(station) {\n            this.callRoutes.removeObject(station);\n\n            const noNewRoutes = this.callRoutes.filterBy('new').length === 0;\n            if (noNewRoutes) {\n                this.callRoutes.pushObject(emptyStationData());\n            }\n\n            this.saveCallRoutes();\n        },\n\n        updateVoicemail(station, externalVoicemailState) {\n            const model = this.model;\n            const collection = this.callRoutes;\n            let callRoutes = collection.reject(route => {\n                return !route.get('target.value');\n            });\n\n            if (externalVoicemailState === true) {\n                model.set('voicemail', VOICEMAIL_CHOICES.LASTCALL);\n            } else if (this.get('permissions.hasVoicemailAccess')) {\n                model.set('voicemail', VOICEMAIL_CHOICES.PURECLOUD);\n            } else {\n                model.set('voicemail', VOICEMAIL_CHOICES.NONE);\n            }\n\n            station.set('savingVoicemail', true);\n\n            callRoutes = callRoutes.map(obj => {\n                return obj.toAPIJSON();\n            });\n            model.set('calls', callRoutes);\n\n            model\n                .save({\n                    adapterOptions: {\n                        patch: true\n                    }\n                })\n                .then(() => {\n                    station.set('isInternalDID', false);\n                })\n                .catch(error => {\n                    this.logger.error('There was an issue setting voicemail options:', { error });\n\n                    this._checkForInternalDID(station, error);\n\n                    this.showErrorNotification(error);\n                })\n                .finally(() => {\n                    if (this.isDestroyed) {\n                        return;\n                    }\n\n                    station.set('savingVoicemail', false);\n                });\n        },\n\n        disassociateStation() {\n            return this.phone.disassociateStation();\n        },\n\n        openStationPicker() {\n            this.set('showStationPicker', true);\n        },\n\n        disconnectPersistentConnection() {\n            return this.phone.disconnectPersistentConnection();\n        },\n\n        chooseStation(uri) {\n            return this.phone.chooseStation(uri);\n        },\n\n        closeStationPicker() {\n            this.set('showStationPicker', false);\n        },\n\n        openWebrtcSettings() {\n            if (this.get('session.useNewNav')) {\n                this.set('commandNav.callControlsTab', 'phoneSettings');\n            } else {\n                this.sidebar.togglePanelSubstate('callControls', 'currentTab', 'phoneSettings');\n            }\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n\n        if (!this.get('permissions.canCallForward')) {\n            return;\n        }\n\n        const store = this.store;\n        const guid = this.get('session.person.guid');\n\n        const pigeon = this.pigeon;\n        pigeon.registerPriorityTopic(`v2.users.${guid}.callforwarding`);\n        pigeon.on('callforwarding', this, this._updateCallForwarding);\n\n        this.set('loading', true);\n        store\n            .findRecord('call-forwarding', guid)\n            .then(model => {\n                if (this.isDestroyed) {\n                    return;\n                }\n\n                this.set('model', model);\n\n                this._buildCallRoutes();\n            })\n            .catch(error => {\n                this.logger.error('Call forwarding data not found:', {\n                    guid,\n                    error\n                });\n            })\n            .finally(() => {\n                if (this.isDestroyed) {\n                    return;\n                }\n\n                this.set('loading', false);\n            });\n    },\n\n    currentPhoneNumber: computed('session.person.primaryContactInfo.voice.[]', function () {\n        const phoneField = this.get('session.person.phone');\n        if (phoneField) {\n            return get(phoneField, 'number');\n        }\n        return null;\n    }),\n\n    cannotEnable: computed('session.person.isOnQueue', function () {\n        return this.get('session.person.isOnQueue');\n    }),\n\n    callsChanged: observer('calls', function () {\n        once(this, this._buildCallRoutes);\n    }),\n\n    checkedTranslation: computed('model.enabled', function () {\n        return this.get('model.enabled') ? 'toggle.on' : 'toggle.off';\n    }),\n\n    saveCallRoutes(routeToSave, adjustVoicemail = true) {\n        const model = this.model;\n        const collection = this.callRoutes;\n        const addingNewCallRoute = routeToSave !== undefined && routeToSave.get('new');\n\n        let callRoutes = collection.reject(route => {\n            return !route.get('target.value');\n        });\n\n        if (routeToSave) {\n            routeToSave.set('saving', true);\n        }\n\n        if (adjustVoicemail) {\n            if (callRoutes.length === 0) {\n                model.set('voicemail', VOICEMAIL_CHOICES.NONE);\n            } else if (\n                (routeToSave && routeToSave.get('isStation')) ||\n                get(callRoutes, 'lastObject').get('isStation')\n            ) {\n                if (this.get('permissions.hasVoicemailAccess')) {\n                    model.set('voicemail', VOICEMAIL_CHOICES.PURECLOUD);\n                } else {\n                    model.set('voicemail', VOICEMAIL_CHOICES.NONE);\n                }\n            } else {\n                if (model.get('voicemail') !== VOICEMAIL_CHOICES.LASTCALL) {\n                    model.set('voicemail', VOICEMAIL_CHOICES.NONE);\n                }\n            }\n        }\n\n        callRoutes = callRoutes.map(obj => {\n            return obj.toAPIJSON();\n        });\n        model.set('calls', callRoutes);\n\n        return model\n            .save({\n                adapterOptions: {\n                    patch: true\n                }\n            })\n            .then(() => {\n                if (this.isDestroyed) {\n                    return;\n                }\n\n                if (routeToSave) {\n                    routeToSave.set('new', false);\n                    routeToSave.set('saved', true);\n                    routeToSave.set('isInternalDID', false);\n\n                    // Pretend we are doing stuff\n                    run.later(function () {\n                        routeToSave.set('saving', false);\n                    }, 250);\n                }\n\n                if (collection && collection.length < ROUTE_ENTRY_LIMIT && addingNewCallRoute) {\n                    collection.pushObject(emptyStationData());\n                }\n            })\n            .catch(error => {\n                if (this._isInternalDIDError(error)) {\n                    // If we get an internal DID error due to the voicemail prop not matching\n                    // we are going to retry saving after resetting the voicemail prop\n                    model.set('voicemail', VOICEMAIL_CHOICES.PURECLOUD);\n                    return this.saveCallRoutes(routeToSave, false).then(() => {\n                        // Continue to mark as internal DID\n                        routeToSave.set('isInternalDID', true);\n                    });\n                }\n\n                this.logger.error('Error saving call routes:', { error });\n\n                this._checkForInternalDID(routeToSave, error);\n                this.showErrorNotification(error);\n\n                return model.reload().then(() => {\n                    if (this.isDestroyed) {\n                        return;\n                    }\n\n                    if (routeToSave) {\n                        routeToSave.set('saving', false);\n\n                        if (routeToSave.get('new')) {\n                            routeToSave.set('callRoute', {\n                                targets: [{}]\n                            });\n                        }\n                    }\n                });\n            });\n    },\n\n    showErrorNotification(error) {\n        const intl = this.intl;\n\n        let title = intl.t('followMe.errorSaving.title');\n        let message = intl.t('followMe.errorSaving.message');\n\n        if (this._isInternalDIDError(error)) {\n            return;\n        }\n\n        if (error && error.errors) {\n            const { code } = error.errors[0];\n            const [, errorType] = code.split('.');\n            const titleKey = `followMe.${errorType}.title`,\n                messageKey = `followMe.${errorType}.message`;\n            if (intl.exists(titleKey) && intl.exists(titleKey)) {\n                title = intl.t(titleKey);\n                message = intl.t(messageKey);\n            }\n        }\n\n        this.notification.error(title, message);\n    },\n\n    _buildCallRoutes() {\n        const store = this.store;\n        const calls = this.calls || [];\n        const callRoutes = (this.callRoutes || []).rejectBy('new');\n\n        if (!!calls.length && !!callRoutes.length) {\n            // Modify currently cached data. Makes QA happy that elements\n            // arent deleted out from under them. Also performance, I guess?\n            calls.forEach((call, index) => {\n                if (callRoutes.length > index) {\n                    const callRoute = callRoutes.objectAt(index);\n                    callRoute.setProperties({\n                        new: false,\n                        saved: true,\n                        callRoute: call\n                    });\n                } else {\n                    const wrapper = CallForwardingWrapper.create({\n                        store,\n                        saved: true,\n                        callRoute: call\n                    });\n                    callRoutes.pushObject(wrapper);\n                }\n            });\n        } else {\n            let stationData = calls.map(callRoute => {\n                return CallForwardingWrapper.create({\n                    store,\n                    saved: true,\n                    callRoute: callRoute\n                });\n            });\n\n            if (stationData.length < ROUTE_ENTRY_LIMIT) {\n                stationData.pushObject(emptyStationData());\n            }\n\n            this.set('callRoutes', stationData);\n        }\n    },\n\n    _updateCallForwarding(data) {\n        this.logger.info('Call forwarding pigeon change:', { data });\n        this.model.reload();\n    },\n\n    _isInternalDIDError(error = {}) {\n        const details = get(error, 'errors.firstObject');\n        return details && details.code === DISABLE_VOICEMAIL_ERROR_CODE;\n    },\n\n    _checkForInternalDID(station, error) {\n        if (!station || !error) {\n            return;\n        }\n\n        if (this._isInternalDIDError(error)) {\n            station.set('isInternalDID', true);\n        }\n    }\n});\n","import { alias, equal, reads } from '@ember/object/computed';\nimport EmberObject, { computed } from '@ember/object';\nimport RSVP from 'rsvp';\nimport DS from 'ember-data';\n\nconst { PromiseArray } = DS;\n\nexport function searchForStation(store: any, value: any, session: any) {\n    let promise = RSVP.resolve([]);\n    if (value) {\n        promise = store.query('station', { name: `*${value}*` }).then((results: any) => {\n            return results.filter((model: any) => {\n                if (model.get('isWebrtc')) {\n                    return model.get('webRtcUserId') === session.get('person.guid');\n                }\n                return true;\n            });\n        });\n    }\n    // @ts-ignore (create does exist its just not recognizing it)\n    return PromiseArray.create({\n        promise\n    });\n}\n\nexport const CallForwardingWrapper = EmberObject.extend({\n    new: false,\n    saved: false,\n    saving: false,\n    savingVoicemail: false,\n\n    isInternalDID: false, // set on api save error\n\n    store: null as any,\n    callRoute: null as any, // api data\n\n    loadingStation: false,\n\n    target: alias('callRoute.targets.firstObject'),\n    isStation: equal('target.type', 'STATION'),\n    isNumber: equal('target.type', 'PHONENUMBER'),\n\n    isRemoteStation: reads('station.isRemoteStation'),\n\n    value: reads('target.value'),\n\n    init() {\n        this._super(...arguments);\n\n        if (!this.get('callRoute')) {\n            this.set('callRoute', {\n                targets: [{}]\n            });\n        }\n\n        const stationGuid = this.get('value');\n        if (stationGuid && this.get('isStation')) {\n            this.set('loadingStation', true);\n            this.get('store')\n                .findRecord('station', stationGuid)\n                .then((station: any) => {\n                    this.set('station', station);\n                })\n                .catch((error: any) => {\n                    console.error('Could not locate a station:', {\n                        error,\n                        guid: stationGuid\n                    });\n                })\n                .finally(() => {\n                    this.set('loadingStation', false);\n                });\n        }\n    },\n\n    isExtension: computed('target.value', function () {\n        const value = this.get('target.value');\n        if (value) {\n            return value.indexOf('ext=') !== -1;\n        }\n        return false;\n    }),\n\n    number: computed('callRoute', 'target.value', {\n        get() {\n            if (!this.get('callRoute') || this.get('isStation')) {\n                return null;\n            }\n            return this.get('target.value');\n        },\n\n        //@ts-ignore\n        set(key, value) {\n            if (!value) {\n                this.set('target', {});\n                return value;\n            }\n            this.set('target.type', 'PHONENUMBER');\n            this.set('target.value', value);\n            return value;\n        }\n    }),\n\n    _station: null,\n    station: computed('callRoute', 'target.value', {\n        get() {\n            if (!this.get('callRoute') || this.get('isNumber') || !this.get('target.value')) {\n                return null;\n            }\n            return this.get('_station');\n        },\n\n        //@ts-ignore\n        set(key, value) {\n            if (!value) {\n                this.set('_station', null);\n                this.set('target', {});\n                return value;\n            }\n            this.set('target.type', 'STATION');\n            this.set('target.value', value.get('id'));\n\n            this.set('_station', value);\n\n            return value;\n        }\n    }),\n\n    toAPIJSON() {\n        const type = this.get('target')?.type;\n        const value = this.get('target')?.value;\n        return {\n            targets: [\n                {\n                    type,\n                    value\n                }\n            ],\n            timeoutMilliseconds: 12000\n        };\n    }\n});\n","import { reads, and } from '@ember/object/computed';\nimport $ from 'jquery';\nimport { resolve } from 'rsvp';\nimport { inject as service } from '@ember/service';\nimport { run } from '@ember/runloop';\nimport { computed, observer, set, get } from '@ember/object';\nimport Component from '@ember/component';\nimport DS from 'ember-data';\nimport { eventToString } from 'web-directory/utils/keystroke';\nimport { searchForStation } from '../forwarding-helpers';\n\nconst SEARCH_DEBOUNCE_MS = 250;\n\nexport default Component.extend({\n    classNames: ['follow-me-station-input', 'follow-me-route-entry'],\n    classNameBindings: ['isLast:last-station-input'],\n\n    intl: service(),\n    store: service(),\n    search: service(),\n    session: service(),\n    permissions: service(),\n    addressformat: service(),\n    ajax: service(),\n    application: service(),\n    logger: service('stash-logger'),\n\n    index: null,\n    routeData: null,\n    callRoutes: null,\n    isExternalVoicemail: false,\n\n    selectNumber: () => {},\n    selectStation: () => {},\n    addStation: () => {},\n    removeStation: () => {},\n\n    currentSearch: null,\n    currentRequest: null,\n    currentNumber: null,\n\n    // { [station id]: boolean }\n    contactDropdownStates: {},\n\n    actions: {\n        toggleStationContactDropdown(stationId, event) {\n            const dropdownStates = this.contactDropdownStates;\n            const newStates = {};\n            if (dropdownStates[stationId] === undefined) {\n                newStates[stationId] = true;\n            }\n\n            this.set('contactDropdownStates', newStates);\n\n            run.scheduleOnce('afterRender', () => {\n                // we're opening the popover for station id result\n                if (newStates[stationId] === true) {\n                    this.setupPopoverDismissHandler(stationId);\n                }\n            });\n\n            event.preventDefault();\n            event.stopPropagation();\n        },\n\n        performSearch(event) {\n            this.set('currentSearch', event.target.value);\n        },\n\n        submit(event) {\n            const value = event.target.value;\n            if (eventToString(event) === 'ENTER' && !!value) {\n                this.send('selectNumber', value);\n            }\n        },\n\n        selectStation(station, isSelectedRoute) {\n            if (isSelectedRoute) {\n                return;\n            }\n            this.set('currentSearch', '');\n            this.selectStation(station);\n        },\n\n        selectNumber(number) {\n            if (!number) {\n                return;\n            }\n\n            const addressformat = this.addressformat;\n\n            // Treat numbers in an invalid format as extensions\n            if (!addressformat.isValidNumber(number, null, true)) {\n                if (number.charAt(0) === '+') {\n                    number = number.substring(1);\n                }\n                number = `;ext=${number}`;\n            }\n\n            this.set('currentNumber', number);\n            this.selectNumber(number);\n\n            // Close the dropdown when an item is selected from it\n            this.set('contactDropdownStates', {});\n        },\n\n        updateVoicemail(event) {\n            this.updateVoicemail(event.target.checked);\n        },\n\n        removeStation() {\n            if (this.isLast && this.isOnlyRoute) {\n                return;\n            }\n            this.removeStation();\n        },\n\n        attemptSave(event) {\n            const isSameNumber = this.isNumber && this.get('routeData.number') === event.target.value;\n            if (this.get('routeData.new') || isSameNumber) {\n                return;\n            }\n\n            if (this.startsWithNumber) {\n                this.send('selectNumber', event.target.value);\n            }\n        }\n    },\n\n    saved: reads('routeData.saved'),\n    saving: reads('routeData.saving'),\n    isNumber: reads('routeData.isNumber'),\n    isExtension: reads('routeData.isExtension'),\n    isStation: reads('routeData.isStation'),\n    isRemoteStation: reads('routeData.isRemoteStation'),\n\n    voicemailDisabled: and('routeData.isInternalDID', 'isNumber'),\n\n    /**\n     * @attribute\n     * Current search results as a PromiseArray. Updated by _runStationsSearch\n     * after the debounce delay. Read directly by the template via (await stations).\n     */\n    stations: null,\n\n    /**\n     * Schedules _runStationsSearch via debounce whenever currentSearch changes.\n     * Using an observer here is intentional — stations is plain state, not a\n     * derived value, so a computed would create a reactivity loop.\n     */\n    _onCurrentSearchChange: observer('currentSearch', function () {\n        // Handle retained so willDestroyElement can cancel it — otherwise the search fires up to\n        // SEARCH_DEBOUNCE_MS after the component is gone and sets `stations` on a destroyed object.\n        this._stationsSearchTimer = run.debounce(this, this._runStationsSearch, SEARCH_DEBOUNCE_MS);\n    }),\n\n    /**\n     * Executes the station search and sets this.stations directly.\n     * Called via run.debounce — do not call directly.\n     * @private\n     */\n    _runStationsSearch() {\n        if (this.get('isDestroyed') || this.get('isDestroying')) {\n            return;\n        }\n\n        const store = this.get('store');\n        const search = this.get('currentSearch');\n        let result;\n\n        if (search && search.length > 1) {\n            const stationsPromise = searchForStation(store, search, this.get('session')).then(stations => {\n                const routes = this.get('callRoutes') || [];\n                const routeIds = routes.filterBy('isStation').mapBy('station.id');\n                const results = stations.reject(station => {\n                    return routeIds.indexOf(station.get('id')) > -1;\n                });\n                results.forEach(result => set(result, 'isStation', true));\n                return results;\n            });\n\n            const entitiesPromise = this.get('search')\n                .performSearch(search, 0, ['groups', 'users'])\n                .then(({ results }) => {\n                    return this.processEntities(results);\n                });\n\n            try {\n                const promise = Promise.all([stationsPromise, entitiesPromise]).then(results => {\n                    return [...results[0], ...results[1]];\n                });\n                result = DS.PromiseArray.create({ promise });\n            } catch (err) {\n                this.get('logger').error('<route-entry> search failed', err);\n                result = DS.PromiseArray.create({ promise: resolve([]) });\n            }\n        } else {\n            result = DS.PromiseArray.create({ promise: resolve([]) });\n        }\n\n        this.set('stations', result);\n    },\n\n    displayValue: computed('routeData.number', 'routeData.station.name', 'isNumber', function () {\n        const station = this.routeData;\n        if (this.isNumber) {\n            const number = station.get('number');\n            if (number.indexOf(';ext') === 0) {\n                return number.split(';ext=')[1];\n            }\n            return number;\n        }\n        return station.get('station.name');\n    }),\n\n    showDropdown: computed('currentSearch', 'stations.[]', 'stations.isFulfilled', {\n        get() {\n            return (\n                this.get('currentSearch.length') !== 0 &&\n                this.get('stations.length') !== 0 &&\n                this.get('stations.isFulfilled')\n            );\n        },\n        set(key, value) {\n            return value;\n        }\n    }),\n\n    startsWithNumber: computed('currentSearch', function () {\n        const search = this.currentSearch;\n        if (search) {\n            // super naive checking\n            let number = search.charAt(0);\n            if (search.charAt(0) === '+') {\n                number = search.charAt(1);\n            }\n            return !isNaN(Number(number));\n        }\n        return false;\n    }),\n\n    isValidNumber: computed('currentNumber', function () {\n        const number = this.currentNumber;\n        if (!number || number.length === 0) {\n            return true;\n        }\n        return this.addressformat.isValidNumber(number, null, true);\n    }),\n\n    isLast: computed('index', 'callRoutes.[]', 'callRoutes.@each.new', function () {\n        const savedRoutes = this.callRoutes.reject(route => route['new']);\n        return this.routeData === savedRoutes.get('lastObject');\n    }),\n\n    isOnlyRoute: computed('callRoutes.[]', 'callRoutes.@each.new', function () {\n        const savedRoutes = this.callRoutes.reject(route => route['new']);\n        return this.routeData === savedRoutes.get('lastObject') && savedRoutes.length === 1;\n    }),\n\n    showCheckbox: computed('saved', 'isNumber', 'isLast', 'isExtension', function () {\n        return this.isLast && this.saved && this.isNumber && !this.isExtension;\n    }),\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        $(window).on(`click.${this.elementId}`, run.bind(this, this.detectOutsideClick));\n\n        this.set('showDropdown', false);\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n\n        $(window).off(`.${this.elementId}`);\n    },\n\n    // Timer cleanup lives here rather than in willDestroyElement: that hook only runs for components\n    // that were rendered, so a unit test creating this component via factoryFor().create() would\n    // never reach it and the debounce would survive the test.\n    willDestroy() {\n        // typeof check rather than truthiness: backburner timer ids start at 0, so a truthy check\n        // skips cancelling the first timer scheduled in a page.\n        if (typeof this._stationsSearchTimer === 'number') {\n            run.cancel(this._stationsSearchTimer);\n            this._stationsSearchTimer = null;\n        }\n        this._super(...arguments);\n    },\n\n    detectOutsideClick(event) {\n        const $target = $(event.target);\n        if ($target.is(this.$('input.station-search-input')) && !this.showDropdown) {\n            this.send('performSearch', event);\n        } else if ($target.closest(this.elementId).length !== 1 || $target.closest('.dropdown-menu').length !== 1) {\n            this.set('currentSearch', '');\n            this.set('currentPromise', null);\n\n            if (this.isStation) {\n                this.$('input.station-search-input').val(this.displayValue);\n            }\n        }\n    },\n\n    setupPopoverDismissHandler(stationId) {\n        const pop = $(`#${stationId}-station-person-contact-button-popover`);\n        pop.on('guxdismiss', evt => {\n            this.send('toggleStationContactDropdown', stationId, evt);\n        });\n    },\n\n    async processEntities(results) {\n        const rawUserIds = results.filter(r => r.get('type') === 'person').map(r => r.get('id'));\n        const rawGroupIds = results.filter(r => r.get('type') === 'group').map(r => r.get('id'));\n        let usersPromise = resolve({ entities: [] });\n        let groupsPromise = resolve({ entities: [] });\n        if (rawUserIds.length > 0) {\n            const usersUri = this.application.pcV2Uri(`api/v2/users?id=${rawUserIds.join(',')}`);\n            usersPromise = this.ajax.ajaxGet(usersUri);\n        }\n        if (rawGroupIds.length > 0) {\n            const groupsUri = this.application.pcV2Uri(`api/v2/groups?id=${rawGroupIds.join(',')}`);\n            groupsPromise = this.ajax.ajaxGet(groupsUri);\n        }\n        const [users, groups] = await Promise.all([usersPromise, groupsPromise]);\n\n        const entities = [];\n        for (let result of results) {\n            let addresses = [];\n            if (result.get('type') === 'person') {\n                const apiUser = users.entities.find(user => user.id === result.id);\n                if (apiUser && apiUser.addresses) {\n                    for (let address of apiUser.addresses) {\n                        if (address.mediaType === 'PHONE') {\n                            if (address.address) {\n                                addresses.push(address);\n                            } else if (address.extension) {\n                                address.address = address.extension;\n                                address.display = address.extension;\n                                addresses.push(address);\n                            }\n                        }\n                    }\n                    // name should be set, but lets ensure it's set\n                    result.set('name', get(apiUser, 'name'));\n                }\n            }\n            if (result.get('type') === 'group') {\n                const apiGroup = groups.entities.find(group => group.id === result.id);\n\n                if (apiGroup && apiGroup.addresses) {\n                    for (let address of apiGroup.addresses) {\n                        if (address.mediaType === 'PHONE') {\n                            if (address.address) {\n                                addresses.push(address);\n                            } else if (address.extension) {\n                                address.address = address.extension;\n                                address.display = address.extension;\n                                addresses.push(address);\n                            }\n                        }\n                    }\n                    // name should be set, but lets ensure it's set\n                    result.set('name', get(apiGroup, 'name'));\n                }\n            }\n\n            if (addresses.length === 0) {\n                continue;\n            }\n\n            const typeText =\n                result.get('type') === 'person'\n                    ? this.intl.t('entityStrings.person')\n                    : this.intl.t('entityStrings.group');\n\n            set(result, 'typeText', typeText);\n            set(result, 'addresses', addresses);\n            set(result, 'isStation', false);\n\n            entities.push(result);\n        }\n        return entities;\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"yvkPe2yT\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[10,1],[14,0,\\\"saving-icon\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[10,\\\"input\\\"],[15,1,[29,[[36,2],\\\"-stations\\\"]]],[14,0,\\\"form-control purecloud-input station-search-input\\\"],[15,\\\"placeholder\\\",[28,[37,3],[\\\"followMe.stationSearch.placeholder\\\"],null]],[15,2,[36,4]],[15,\\\"oninput\\\",[28,[37,5],[[30,0],\\\"performSearch\\\"],[[\\\"on\\\"],[\\\"input\\\"]]]],[15,\\\"onkeydown\\\",[28,[37,5],[[30,0],\\\"submit\\\"],[[\\\"on\\\"],[\\\"keydown\\\"]]]],[15,\\\"onblur\\\",[28,[37,5],[[30,0],\\\"attemptSave\\\"],[[\\\"on\\\"],[\\\"blur\\\"]]]],[12],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,6],[[33,7,[\\\"isPending\\\"]],[33,8,[\\\"loadingStation\\\"]]],null],[[[1,\\\"    \\\"],[10,1],[14,0,\\\"loading-icon\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,9],[[[1,\\\"    \\\"],[11,3],[24,6,\\\"#\\\"],[16,0,[29,[\\\"remove-icon \\\",[52,[28,[37,10],[[33,11],[33,12]],null],\\\"disabled\\\"]]]],[4,[38,5],[[30,0],\\\"removeStation\\\"],null],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"svg-icon\\\"],[14,\\\"icon-name\\\",\\\"close\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,10],[[33,11],[33,12]],null],[[[1,\\\"            \\\"],[10,\\\"gux-tooltip\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,3],[\\\"followMe.routeEntry.cannotRemoveLastEntry\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,13],[[33,9]],null],[[[1,\\\"    \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"icon add-number-icon\\\"],[16,\\\"aria-label\\\",[28,[37,3],[\\\"common.add\\\"],null]],[4,[38,5],[[30,0],\\\"selectNumber\\\",[33,14]],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"        \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"svg-icon\\\"],[14,\\\"icon-name\\\",\\\"add\\\"],[15,\\\"screenreader-text\\\",[28,[37,3],[\\\"common.add\\\"],null]],[12],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,15],[[[1,\\\"    \\\"],[10,0],[15,0,[29,[\\\"external-voicemail \\\",[52,[33,16],\\\"disabled\\\"]]]],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"external-voicemail-input\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"input\\\"],[15,1,[29,[[36,2],\\\"-voicemail-value\\\"]]],[15,0,[29,[[52,[33,17],\\\"voicemail-on\\\",\\\"voicemail-off\\\"]]]],[15,\\\"title\\\",[28,[37,3],[\\\"followMe.externalVoicemailService\\\"],null]],[15,\\\"disabled\\\",[36,16]],[15,\\\"checked\\\",[28,[37,10],[[33,17],[28,[37,13],[[33,16]],null]],null]],[15,\\\"onchange\\\",[28,[37,5],[[30,0],\\\"updateVoicemail\\\"],[[\\\"on\\\"],[\\\"change\\\"]]]],[14,4,\\\"checkbox\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[15,\\\"for\\\",[29,[[36,2],\\\"-voicemail-value\\\"]]],[12],[1,[28,[35,3],[\\\"followMe.externalVoicemailService\\\"],null]],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,8,[\\\"savingVoicemail\\\"]],[[[1,\\\"                \\\"],[10,1],[14,0,\\\"saving-voicemail-icon\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,16],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"voicemail-disabled-warning\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/ic-alert-circle\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"],[41,[33,18,[\\\"hasVoicemailAccess\\\"]],[[[1,\\\"                    \\\"],[10,1],[12],[1,[28,[35,3],[\\\"followMe.internalDIDVoicemailWarning\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,1],[12],[1,[28,[35,3],[\\\"followMe.internalDIDWarning\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,19],[[[1,\\\"    \\\"],[1,[28,[35,20],null,[[\\\"tagName\\\",\\\"classNames\\\",\\\"stations\\\",\\\"callRoutes\\\",\\\"contactDropdownStates\\\",\\\"toggleStationContactDropdown\\\",\\\"selectNumber\\\",\\\"selectStation\\\"],[\\\"ul\\\",\\\"stations-list dropdown-menu show\\\",[28,[37,21],[[33,7]],null],[33,22],[33,23],[28,[37,5],[[30,0],\\\"toggleStationContactDropdown\\\"],null],[28,[37,5],[[30,0],\\\"selectNumber\\\"],null],[28,[37,5],[[30,0],\\\"selectStation\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],null]],[],false,[\\\"if\\\",\\\"saving\\\",\\\"elementId\\\",\\\"t\\\",\\\"displayValue\\\",\\\"action\\\",\\\"or\\\",\\\"stations\\\",\\\"routeData\\\",\\\"saved\\\",\\\"and\\\",\\\"isLast\\\",\\\"isOnlyRoute\\\",\\\"not\\\",\\\"currentSearch\\\",\\\"showCheckbox\\\",\\\"voicemailDisabled\\\",\\\"isExternalVoicemail\\\",\\\"permissions\\\",\\\"showDropdown\\\",\\\"follow-me-settings-panel/stations-list\\\",\\\"await\\\",\\\"callRoutes\\\",\\\"contactDropdownStates\\\"]]\",\"moduleName\":\"web-directory/components/follow-me-settings-panel/route-entry/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\n\n/**\n * Renders the list of station/entity search results for the follow-me forwarding search dropdown.\n *\n * @attribute stations - Array of station and entity results to display\n * @attribute callRoutes - Current call routes, used to mark already-selected stations\n * @attribute contactDropdownStates - Map of station id -> boolean for popover open state\n * @attribute toggleStationContactDropdown - Action to open/close a station's contact popover\n * @attribute selectNumber - Action called when a phone number is selected\n * @attribute selectStation - Action called when a station is selected\n */\nexport default Component.extend({\n    tagName: 'ul',\n    classNames: ['stations-list', 'dropdown-menu', 'show'],\n\n    stations: null,\n    callRoutes: null,\n    contactDropdownStates: null,\n\n    selectNumber: () => {},\n    selectStation: () => {},\n    toggleStationContactDropdown: () => {}\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"BWtY0wyx\",\"block\":\"[[[42,[28,[37,1],[[28,[37,1],[[33,2]],null]],null],null,[[[41,[30,1,[\\\"isStation\\\"]],[[[1,\\\"        \\\"],[10,\\\"li\\\"],[15,0,[29,[\\\"station-choice\\\\n                \\\",[52,[28,[37,4],[[30,1,[\\\"available\\\"]]],null],\\\"in-use\\\"],\\\"\\\\n                \\\",[52,[28,[37,5],[[33,6],[30,1]],null],\\\"selected-as-route\\\"]]]],[12],[1,\\\"\\\\n            \\\"],[11,3],[24,6,\\\"#\\\"],[16,\\\"data-name\\\",[29,[[30,1,[\\\"name\\\"]]]]],[4,[38,7],[[30,0],[33,8],[30,1],[28,[37,5],[[33,6],[30,1]],null]],null],[12],[1,\\\"\\\\n                \\\"],[10,1],[14,0,\\\"station-name\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[30,1,[\\\"name\\\"]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,4],[[30,1,[\\\"available\\\"]]],null],[[[1,\\\"                    \\\"],[10,1],[14,0,\\\"status\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[30,1,[\\\"state\\\"]]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[10,\\\"li\\\"],[14,0,\\\"station-entity-choice\\\"],[15,\\\"data-t\\\",[29,[[30,1,[\\\"id\\\"]],\\\"-station-person-contact\\\"]]],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"station-entity-info\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"station-details\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"station-image\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,9],null,[[\\\"entity\\\",\\\"enableMiniCard\\\",\\\"microCard\\\",\\\"size\\\",\\\"isLinkable\\\",\\\"showPresence\\\",\\\"subscribeToPresence\\\"],[[30,1],false,false,4,false,false,false]]]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"station-attributes\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,1],[14,0,\\\"station-name\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[30,1,[\\\"name\\\"]]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                        \\\"],[10,1],[14,0,\\\"station-type\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[30,1,[\\\"typeText\\\"]]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"station-contact-info-dropdown\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"button\\\"],[15,1,[29,[[30,1,[\\\"id\\\"]],\\\"-station-person-contact-button\\\"]]],[14,0,\\\"station-data-row-more-menu station-person-contact-row-more-menu\\\"],[15,\\\"aria-label\\\",[28,[37,10],[\\\"common.more\\\"],null]],[15,\\\"onclick\\\",[28,[37,7],[[30,0],[33,11],[30,1,[\\\"id\\\"]]],null]],[15,\\\"data-t\\\",[29,[[30,1,[\\\"id\\\"]],\\\"-station-person-contact-button\\\"]]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"menu-kebab-vertical\\\"],[15,\\\"screenreader-text\\\",[28,[37,10],[\\\"common.more\\\"],null]],[12],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[41,[28,[37,12],[[33,13],[30,1,[\\\"id\\\"]]],null],[[[1,\\\"        \\\"],[10,\\\"gux-popover\\\"],[15,1,[29,[[30,1,[\\\"id\\\"]],\\\"-station-person-contact-button-popover\\\"]]],[14,\\\"position\\\",\\\"top\\\"],[15,\\\"for\\\",[29,[[30,1,[\\\"id\\\"]],\\\"-station-person-contact-button\\\"]]],[14,\\\"is-open\\\",\\\"true\\\"],[14,\\\"close-on-outside-click\\\",\\\"true\\\"],[15,\\\"data-t\\\",[29,[[30,1,[\\\"id\\\"]],\\\"-station-person-contact-button-popover\\\"]]],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,\\\"slot\\\",\\\"title\\\"],[12],[1,[28,[35,10],[\\\"components.inbox.labels.phone\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"station-person-row-contact-drop-down\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,1],[[28,[37,1],[[30,1,[\\\"addresses\\\"]]],null]],null],null,[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"station-contact-list-item\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"button\\\"],[14,0,\\\"station-contact-number\\\"],[15,\\\"onclick\\\",[28,[37,7],[[30,0],[33,14],[30,2,[\\\"address\\\"]]],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[30,2,[\\\"display\\\"]]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[2]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[1]],[[[1,\\\"    \\\"],[10,\\\"li\\\"],[14,0,\\\"station-choice no-results\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,10],[\\\"search.noResults\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[\\\"station\\\",\\\"address\\\"],false,[\\\"each\\\",\\\"-track-array\\\",\\\"stations\\\",\\\"if\\\",\\\"not\\\",\\\"is-selected-call-route\\\",\\\"callRoutes\\\",\\\"action\\\",\\\"selectStation\\\",\\\"entity-image\\\",\\\"t\\\",\\\"toggleStationContactDropdown\\\",\\\"get\\\",\\\"contactDropdownStates\\\",\\\"selectNumber\\\"]]\",\"moduleName\":\"web-directory/components/follow-me-settings-panel/stations-list/template.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"V711pwqU\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[1,[28,[35,2],[[33,3,[\\\"defaultStation\\\"]],[33,3,[\\\"station\\\"]]],[[\\\"selectPhone\\\",\\\"closeStationPicker\\\"],[[28,[37,4],[[30,0],\\\"chooseStation\\\"],null],[28,[37,4],[[30,0],\\\"closeStationPicker\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"panel-section\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"section-label\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"h3\\\"],[14,0,\\\"phone-label\\\"],[12],[1,[28,[35,5],[\\\"followMe.panelTitle\\\"],null]],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,6],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"panel-section current-number\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"section-label\\\"],[12],[1,\\\"\\\\n                \\\"],[10,2],[12],[1,[28,[35,5],[\\\"followMe.yourNumber.title\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,0],[14,0,\\\"content\\\"],[12],[1,\\\"\\\\n                \\\"],[10,2],[14,0,\\\"number\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[34,6]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,2],[14,0,\\\"info\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,5],[\\\"followMe.yourNumber.info\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"panel-section\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"section-label\\\"],[12],[1,\\\"\\\\n            \\\"],[10,2],[12],[1,[28,[35,5],[\\\"followMe.stationPicker.title\\\"],null]],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[14,0,\\\"content\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,7],[[33,3,[\\\"station\\\"]],[33,3,[\\\"canCallForward\\\"]],[33,8]],[[\\\"showStationPicker\\\",\\\"showActions\\\",\\\"persistentConnectionActive\\\",\\\"showAudioControls\\\",\\\"openWebrtcSettings\\\",\\\"disassociateStation\\\",\\\"disconnectPersistentConnection\\\",\\\"openStationPicker\\\"],[true,false,[33,3,[\\\"persistentConnectionActive\\\"]],false,[28,[37,4],[[30,0],\\\"openWebrtcSettings\\\"],null],[28,[37,4],[[30,0],\\\"disassociateStation\\\"],null],[28,[37,4],[[30,0],\\\"disconnectPersistentConnection\\\"],null],[28,[37,4],[[30,0],\\\"openStationPicker\\\"],null]]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,9,[\\\"canCallForward\\\"]],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"panel-section follow-me-section\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"section-label\\\"],[12],[1,\\\"\\\\n                \\\"],[10,2],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,5],[\\\"followMe.forwardCalls.title\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,10],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,\\\"gux-toggle\\\"],[14,0,\\\"follow-toggle\\\"],[15,\\\"checked\\\",[36,11]],[15,\\\"onkeydown\\\",[28,[37,4],[[30,0],\\\"toggleCallRoutes\\\"],null]],[15,\\\"onclick\\\",[28,[37,4],[[30,0],\\\"toggleCallRoutes\\\"],null]],[15,\\\"disabled\\\",[36,12]],[15,\\\"label\\\",[29,[[28,[37,5],[\\\"followMe.forwardCalls.title\\\"],null],\\\" \\\",[28,[37,5],[[33,13]],null]]]],[14,\\\"label-position\\\",\\\"left\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,12],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"content call-forwarding-disabled\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/ic-alert-triangle\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[10,1],[12],[1,[28,[35,5],[\\\"purecloud.callForwarding.disabledOnQueue\\\"],null]],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                \\\"],[10,0],[15,0,[29,[\\\"content voicemail-help \\\",[52,[28,[37,14],[[33,11]],null],\\\"hide\\\"]]]],[12],[1,\\\"\\\\n                    \\\"],[10,1],[12],[1,\\\"\\\\n\\\"],[41,[33,9,[\\\"hasVoicemailAccess\\\"]],[[[1,\\\"                            \\\"],[1,[28,[35,5],[\\\"followMe.forwardCalls.help\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[1,[28,[35,5],[\\\"followMe.forwardCalls.noVoicemailAccess\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"\\\\n\\\"],[41,[33,11],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"content content-stations-listing\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"label\\\"],[15,\\\"for\\\",[29,[[36,15],\\\"-stations\\\"]]],[14,0,\\\"info follow-me-info\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,5],[\\\"followMe.forwardCalls.info\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\\n                    \\\"],[10,\\\"ol\\\"],[14,0,\\\"stations-listing\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,17],[[28,[37,17],[[33,18]],null]],null],null,[[[1,\\\"                            \\\"],[10,\\\"li\\\"],[14,0,\\\"stations-listing-item\\\"],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,19],null,[[\\\"index\\\",\\\"routeData\\\",\\\"callRoutes\\\",\\\"isExternalVoicemail\\\",\\\"selectStation\\\",\\\"selectNumber\\\",\\\"addStation\\\",\\\"removeStation\\\",\\\"updateVoicemail\\\"],[[30,2],[30,1],[33,18],[33,20],[28,[37,4],[[30,0],\\\"selectStation\\\",[30,1]],null],[28,[37,4],[[30,0],\\\"selectNumber\\\",[30,1]],null],[28,[37,4],[[30,0],\\\"addStation\\\",[30,1]],null],[28,[37,4],[[30,0],\\\"removeStation\\\",[30,1]],null],[28,[37,4],[[30,0],\\\"updateVoicemail\\\",[30,1]],null]]]]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[1,2]],null],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]]],[\\\"routeData\\\",\\\"index\\\"],false,[\\\"if\\\",\\\"showStationPicker\\\",\\\"station-picker-v2\\\",\\\"phone\\\",\\\"action\\\",\\\"t\\\",\\\"currentPhoneNumber\\\",\\\"phone-settings\\\",\\\"showEnableCallForwarding\\\",\\\"permissions\\\",\\\"loading\\\",\\\"enableCallRoutes\\\",\\\"cannotEnable\\\",\\\"checkedTranslation\\\",\\\"not\\\",\\\"elementId\\\",\\\"each\\\",\\\"-track-array\\\",\\\"callRoutes\\\",\\\"follow-me-settings-panel/route-entry\\\",\\\"isExternalVoicemail\\\"]]\",\"moduleName\":\"web-directory/components/follow-me-settings-panel/template.hbs\",\"isStrictMode\":false});","import { readOnly } from '@ember/object/computed';\nimport { A } from '@ember/array';\nimport { getOwner } from '@ember/application';\nimport { inject as service } from '@ember/service';\nimport Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { Promise } from 'rsvp';\nimport { next } from '@ember/runloop';\nimport { task, waitForProperty } from 'ember-concurrency';\n\nfunction publicationHasPayload(publication) {\n    return publication && publication.payload;\n}\n\n/**\n   Component that renders the frame-router element from iframe-coordinator. Provides listeners for several publications sent by client.publish.\n\n    { topic: 'streamingTopicSubscribe',   payload: 'myStreamingTopic' }\n    { topic: 'streamingTopicUnsubscribe', payload: 'myStreamingTopic' }\n    { topic: 'dismissToast',              payload: { id: 'toastId' } }\n    { topic: 'showToast',                 payload: { id: 'toastId' } }\n    { topic: 'callPersonById',            payload: 'user-guid' }\n    { topic: 'startChatWithPersonById',   payload: 'user-guid' }\n    { topic: 'startChatByJid,             payload: 'jId' }\n    { topic: 'launchVideoWithPersonById', payload: 'user-guid' }\n    { topic: 'launchVideoProviderWithPersonById', payload: { personId: 'personId', providerId: 'videoType' } }\n    { topic: 'favoriteEntityById',        payload: { entityId: 'entityId', entityType: 'entityType', favoriteStatus: boolean } },\n    { topic: 'help.openHelpPanel',        payload: { anchor: string } }\n    { topic: 'updateProfileImage',        payload: { image: 'image', entityJid: 'entityJid' } }\n    { topic: 'userGeneralFieldUpdated',   payload: {} }\n    { topic: 'emergencyAddrUpdated',      payload: {} }\n    { topic: 'modalRequestsV2', payload: {\n        detail: {\n            modalId: string,\n            modalData: {},\n            modalDetails: {\n                title: string,\n                size: string,\n                timeout: number,\n                primaryButtonText: string,\n                secondaryButtonText: string,\n                closureButtonText: string,\n                buttonAlignment: string\n            }\n        }\n    } }\n\n\n    Sends the following publications.\n\n    { topic: 'toastAction',           payload: { action: 'myToastActionName', id: 'toastId' } }\n    { topic: 'streamingTopicMessage', payload: {} } // Payload can be any streaming update object\n    { topic: 'entityFavoriteAction',  payload: { entityId: 'entityId', favoriteStatus: boolean, data: {} } }\n    { topic: 'notifyToastAction',     payload: { notificationId: 'notificationId', action: 'actionLabel' } }\n    { topic: 'streamingTopicSubscribed',       payload: { topic: 'myStreamingTopic' } }\n    { topic: 'streamingTopicUnsubscribed',     payload: { topic: 'myStreamingTopic' } }\n    { topic: 'streamingTopicSubscribeError',   payload: { topic: 'myStreamingTopic', error: { ... } } }\n    { topic: 'streamingTopicUnsubscribeError', payload: { topic: 'myStreamingTopic', error: { ... } } }\n\n\n    Accessibility: exposes role=\"region\" and aria-label from page.data title, with fallback to the\n    active client's defaultTitle from clientConfig.\n\n*/\nexport default Component.extend({\n    tagName: 'frame-router',\n    attributeBindings: [\n        'route',\n        'pubSubBindingsAttribute:pubSubBindings',\n        'activeClientAttribute:activeClient',\n        'frame-id',\n        'frameRole:role',\n        'frameRegionLabel:aria-label'\n    ],\n    classNameBindings: ['visible:visible:hidden'],\n    visible: true,\n    exposeActiveClientAttribute: true,\n    exposePubSubBindingsAttribute: true,\n    frameRole: 'region',\n    pageDataTitle: null,\n\n    /**\n     * @attribute\n     * Optional override for the frame region aria-label when page.data title is unavailable.\n     */\n    accessibilityLabel: null,\n\n    frameRegionLabel: computed(\n        'pageDataTitle',\n        'activeClient',\n        'clientConfig',\n        'route',\n        'accessibilityLabel',\n        function () {\n            const explicitLabel = this.get('accessibilityLabel');\n            if (explicitLabel) {\n                return explicitLabel;\n            }\n\n            const pageTitle = this.get('pageDataTitle');\n            if (pageTitle) {\n                return pageTitle;\n            }\n\n            const clientConfig = this.get('clientConfig') || {};\n            const activeClient = this.get('activeClient');\n            if (activeClient && clientConfig[activeClient] && clientConfig[activeClient].defaultTitle) {\n                return clientConfig[activeClient].defaultTitle;\n            }\n\n            const route = this.get('route');\n            if (route) {\n                const clients = Object.values(clientConfig).sort(\n                    (clientA, clientB) => clientB.assignedRoute.length - clientA.assignedRoute.length\n                );\n                const matchingClient = clients.find(client => route.startsWith(client.assignedRoute));\n                if (matchingClient && matchingClient.defaultTitle) {\n                    return matchingClient.defaultTitle;\n                }\n            }\n\n            return null;\n        }\n    ),\n\n    activeClientAttribute: computed('activeClient', 'exposeActiveClientAttribute', function () {\n        if (!this.exposeActiveClientAttribute) {\n            return null;\n        }\n        return this.activeClient || null;\n    }),\n\n    pubSubBindingsAttribute: computed('pubSubBindings', 'exposePubSubBindingsAttribute', function () {\n        if (!this.exposePubSubBindingsAttribute) {\n            return null;\n        }\n        return this.pubSubBindings || null;\n    }),\n\n    intl: service(),\n    sidebar: service(),\n    commandNav: service('command-nav'),\n    streaming: service(),\n    application: service(),\n    notification: service(),\n    phone: service(),\n    chat: service(),\n    favorites: service(),\n    logger: service('stash-logger'),\n    session: service(),\n    modal: service('modal'),\n    help: service(),\n    chatFrame: service(),\n    mediaProviders: service(),\n    emergencyLocation: service('emergency-location'),\n    alerting: service('alerting'),\n    frameService: service('center-stage-frame'),\n\n    isActivityPlanRulesEnabled: readOnly('session.features.WEM-1246_ActivityPlanRules'),\n\n    _sidePanelClientEventListenerSetup: false,\n\n    setupClientEventListeners() {\n        if (!this.enableSidePanelClientEvents || this._sidePanelClientEventListenerSetup) {\n            return;\n        }\n        this._sidePanelClientEventListenerSetup = true;\n\n        /*\n        This is an example of a an event sent from User Rules.\n        {\n            topic: 'sidePanelClientEvent',\n            payload: {\n                clientId: 'user-rules-webui',\n                eventName: 'ruleCreated',\n                data: {\n                    ruleId: '8fc569bd-6626-42a6-ba49-8604576470a4'\n                }\n            }\n        }\n        */\n        this.element.messaging.addListener('sidePanelClientEvent', publication => {\n            this.publishClientAction(publication);\n        });\n    },\n\n    /*\n        This takes the event from the client and invokes a publish on the center-stage frame.\n    */\n    publishClientAction(publication) {\n        const publishEvent = {\n            topic: publication.payload.eventName,\n            payload: publication.payload.data\n        };\n        this.frameService.publishClientAction(publishEvent);\n        if (publication.payload.data && publication.payload.data.dismiss) {\n            this.modal.closeModal();\n        }\n    },\n\n    /*\n        modalRequest has been extended to support side panel requests.\n        Being a public facing library, the decision was made to not extend iframe-coordinator\n        Instead, we've just utilised the modalData param to allow passing a type\n    */\n    modalRequest(event) {\n        if (!event.detail || !event.detail.modalId || !event.detail.modalData) {\n            this.publishInvalidModal('Unable to create requested modal: missing required modalId');\n        }\n\n        this.modal.showModal(event.detail, this.publishModalData.bind(this), this.publishModalDismiss.bind(this));\n    },\n\n    async showIfcModal(message) {\n        let modal = {\n            title: message.detail.modalDetails.title ? message.detail.modalDetails.title : '',\n            size: message.detail.modalDetails.size ? message.detail.modalDetails.size : 'dynamic',\n            buttonAlignment: message.detail.modalDetails.buttonAlignment\n                ? message.detail.modalDetails.buttonAlignment\n                : 'end',\n            ifcModalData: message.detail.modalData ? message.detail.modalData : {},\n            ifcModalId: message.detail.modalId,\n            timeout: message.detail.modalDetails.timeout\n        };\n        const ifcModalButtons = this.getIfcModalButtonDetails(message.detail.modalDetails);\n        modal = { ...modal, buttons: ifcModalButtons };\n        return this.alerting.pushModal(modal);\n    },\n\n    async handleIfcModal(message) {\n        const modalId = message.detail.modalId;\n\n        try {\n            const modalResult = await this.showIfcModal(message);\n\n            if (modalResult && modalResult.ifcModalId == modalId && modalResult.type == 'buttonClicked') {\n                if (modalResult.buttonId == 'primaryButtonText') {\n                    this.publishModalPrimaryClick('primaryButtonClick');\n                } else if (modalResult.buttonId == 'secondaryButtonText') {\n                    this.publishModalSecondaryClick('secondaryButtonClick');\n                } else if (modalResult.buttonId == 'closureButtonText') {\n                    this.publishModalDismiss();\n                }\n            }\n\n            if (modalResult && modalResult.ifcModalId == modalId && modalResult.type == 'timeout') {\n                this.publishModalTimeout('timeout');\n            }\n        } catch (e) {\n            this.logger.error('Failed to handle IFC modal', { error: e, modalId, message });\n            this.publishInvalidModal({ error: 'Modal operation failed', modalId });\n        }\n    },\n\n    getIfcModalButtonDetails(modalDetails) {\n        let modalButtons = {};\n        if (modalDetails.primaryButtonText) {\n            modalButtons = {\n                ...modalButtons,\n                positive: {\n                    label: modalDetails.primaryButtonText,\n                    id: 'primaryButtonText'\n                }\n            };\n        }\n        if (modalDetails.secondaryButtonText) {\n            modalButtons = {\n                ...modalButtons,\n                secondary: {\n                    label: modalDetails.secondaryButtonText,\n                    id: 'secondaryButtonText'\n                }\n            };\n        }\n        if (modalDetails.closureButtonText) {\n            modalButtons = {\n                ...modalButtons,\n                negative: {\n                    label: modalDetails.closureButtonText,\n                    id: 'closureButtonText'\n                }\n            };\n        }\n        return modalButtons;\n    },\n\n    handleModalEvent() {\n        if (!this.element || !this.element.messaging) {\n            return;\n        }\n        this.element.messaging.addListener('modalRequestsV2', publication => {\n            if (\n                !publication.payload ||\n                !publication.payload.detail ||\n                !publication.payload.detail.modalId ||\n                !publication.payload.detail.modalData\n            ) {\n                this.logger.warn('Invalid modalRequestsV2 payload', { publication });\n                return;\n            }\n            this.handleIfcModal(publication.payload);\n        });\n    },\n\n    navRequest(event) {\n        const requestedUrl = new URL(event.detail.url);\n        const hash = requestedUrl.hash;\n        const router = getOwner(this).lookup('router:main')._routerMicrolib;\n        let route = hash.replace(/^#/, '');\n\n        // Remap legacy iframe routes to their -v2 equivalents\n        // The iframes send /person, /group, /search but the Ember router expects -v2 variants\n        route = route.replace(/^\\/person\\//, '/person-v2/');\n        route = route.replace(/^\\/group(\\/|$)/, '/group-v2$1');\n        route = route.replace(/^\\/search(\\/|$|\\?)/, '/search-v2$1');\n\n        const resolvedHash = `#${route}`;\n\n        // Make sure that the route is valid before updating the hash\n        if (router.recognizer.recognize(route)) {\n            // If we are already at this location then close the panel to show it\n            if (window.location.hash === resolvedHash) {\n                if (this.get('session.useNewNav')) {\n                    this.commandNav.selectPanel('panel-not-active');\n                } else {\n                    this.sidebar.closePanel();\n                }\n            } else {\n                if (event.detail.history === 'replace') {\n                    window.location.replace(resolvedHash);\n                } else {\n                    window.location.hash = resolvedHash;\n                }\n            }\n        } else {\n            this.logger.warn('Unrecognized route in frame-router nav request', { requestedUrl, route });\n        }\n    },\n\n    clientChanged(event) {\n        this.set('activeClient', event.detail);\n        this.resetStreamingSubscriptions();\n    },\n\n    /**\n       @desc Concatenates a toast ID and client ID to guarantee unique toast IDs across clients.\n       @param {string} clientId\n       @param {string} toastId\n       @returns {string} - Unique ID consisting of toast ID from client and client ID\n    */\n    getUniqueToastId(clientId = '', toastId = '') {\n        return `${clientId}-${toastId}`;\n    },\n\n    handleClickHandler(id) {\n        if (id) {\n            this.publishToastAction('clickHandlerTriggered', id);\n        }\n    },\n\n    notifyRequest(event) {\n        const title = event.detail.title;\n        const message = event.detail.message;\n        const type = event.detail.custom && event.detail.custom.type;\n        const options = event.detail.custom || {};\n\n        if (!type || typeof this.notification[type] !== 'function') {\n            return;\n        }\n\n        const toastIdFromClient = options.id;\n\n        options.target = {\n            send: action => {\n                this.publishToastAction(action, toastIdFromClient);\n            }\n        };\n\n        if (options.clickHandler) {\n            options.clickHandler = () => {\n                this.handleClickHandler(toastIdFromClient);\n            };\n        }\n\n        if (options.id) {\n            // Use unique ID to avoid conflicts with other iframe clients\n            options.id = this.getUniqueToastId(event.detail.clientId, toastIdFromClient);\n\n            // The desktop-notification component overwrites id with what's in the tag property, so add that as well\n            options.tag = options.id;\n        }\n\n        // Track IFC client information for telemetry\n        if (event.detail.clientId) {\n            options.ifcClientId = event.detail.clientId;\n        }\n\n        this.notification[type](title, message, options);\n    },\n\n    publishToastAction(action, id) {\n        if (!this.element || !this.element.publish) {\n            return;\n        }\n\n        this.element.publish({\n            topic: 'toastAction',\n\n            payload: {\n                action,\n                id\n            }\n        });\n    },\n\n    publishStreamingTopic(payload) {\n        if (!this.element || !this.element.publish) {\n            return;\n        }\n\n        this.element.publish({\n            topic: 'streamingTopicMessage',\n            payload\n        });\n    },\n\n    publishFavoriteTopic(payload) {\n        if (!this.element || !this.element.publish) {\n            return;\n        }\n\n        this.element.publish({\n            topic: 'entityFavoriteAction',\n            payload\n        });\n    },\n\n    publishModalData(payload) {\n        if (!this.element || !this.element.publish) {\n            return;\n        }\n\n        this.element.publish({\n            topic: 'modalData',\n            payload\n        });\n    },\n\n    publishModalTimeout(payload) {\n        if (!this.element || !this.element.publish) {\n            return;\n        }\n\n        this.element.publish({\n            topic: 'modalTimeout',\n            payload\n        });\n    },\n\n    publishModalDismiss(payload) {\n        if (!this.element || !this.element.publish) {\n            return;\n        }\n\n        this.element.publish({\n            topic: 'modalDismiss',\n            payload\n        });\n    },\n\n    publishInvalidModal(payload) {\n        if (!this.element || !this.element.publish) {\n            return;\n        }\n\n        this.element.publish({\n            topic: 'invalidModal',\n            payload\n        });\n    },\n\n    publishModalPrimaryClick(payload) {\n        if (!this.element || !this.element.publish) {\n            return;\n        }\n\n        this.element.publish({\n            topic: 'primaryButtonClick',\n            payload\n        });\n    },\n\n    publishModalSecondaryClick(payload) {\n        if (!this.element || !this.element.publish) {\n            return;\n        }\n\n        this.element.publish({\n            topic: 'secondaryButtonClick',\n            payload\n        });\n    },\n\n    resetStreamingSubscriptions() {\n        return this.unsubscribeTopics.perform();\n    },\n\n    unsubscribeTopics: task(function* () {\n        yield waitForProperty(this, 'application.streamingServiceConnect.isIdle');\n\n        const connection = yield this.get('streaming.v2Promise');\n        const subscribedTopics = this.subscribedTopics || [];\n\n        subscribedTopics.forEach(t => {\n            connection.notifications.unsubscribe(t, this.streamingTopicHandler);\n        });\n        this.set('subscribedTopics', A());\n    }),\n\n    onStreamingTopicSubscribe(publication) {\n        return this.get('streaming.v2Promise').then(connection => {\n            const priority = this.topicPriority;\n            const topic = publication.payload;\n            this.subscribedTopics.addObject(topic);\n            return connection.notifications.subscribe(topic, this.streamingTopicHandler, false, priority).then(\n                () => {\n                    if (!this.element || !this.element.publish) {\n                        return;\n                    }\n\n                    this.element.publish({ topic: 'streamingTopicSubscribed', payload: { topic } });\n                },\n                err => {\n                    if (!this.element || !this.element.publish) {\n                        return;\n                    }\n\n                    const error = this.cloneStreamingErrorForPublish(err, 'Subscribe', topic);\n                    this.element.publish({ topic: 'streamingTopicSubscribeError', payload: { topic, error } });\n                    if (err && (err.status === 403 || err.message.includes('permission'))) {\n                        this.handleForbiddenStreamingSubscriptionsRequest(publication, err);\n                    }\n                }\n            );\n        });\n    },\n\n    onStreamingTopicUnsubscribe(publication) {\n        return this.get('streaming.v2Promise').then(connection => {\n            const topic = publication.payload;\n            const streamingTopicHandler = this.streamingTopicHandler;\n            this.subscribedTopics.removeObject(topic);\n            return connection.notifications.unsubscribe(topic, streamingTopicHandler).then(\n                () => {\n                    if (!this.element || !this.element.publish) {\n                        return;\n                    }\n\n                    this.element.publish({ topic: 'streamingTopicUnsubscribed', payload: { topic } });\n                },\n                err => {\n                    if (!this.element || !this.element.publish) {\n                        return;\n                    }\n\n                    const error = this.cloneStreamingErrorForPublish(err, 'Unsubscribe', topic);\n                    this.element.publish({ topic: 'streamingTopicUnsubscribeError', payload: { topic, error } });\n                }\n            );\n        });\n    },\n\n    // Generate a new Error instance from a given streaming client error for use in client publish.\n    // Errors from failed streaming subscription changes are often a raw AxiosError from the API\n    // request made by genesys-cloud-streaming-client. That object isn't cloneable for postMessage,\n    // and we'd rather control exactly the error shape we're sending to clients anyway.\n    cloneStreamingErrorForPublish(err, operation, topic) {\n        const error = new Error(`${operation} failed for topic ${topic}`);\n        error.name = 'StreamingSubscriptionError';\n\n        // Copy message & stack from given error instance + HTTP status and response if AxiosError\n        if (err && typeof err === 'object') {\n            if (err.message && typeof err.message === 'string') {\n                error.message = err.message;\n            }\n            if (err.stack && typeof err.stack === 'string') {\n                error.stack = err.stack;\n            }\n\n            if (err.name === 'AxiosError') {\n                if ('status' in err && typeof err.status === 'number') {\n                    error.status = err.status;\n                }\n                try {\n                    if (typeof err.response.data === 'string') {\n                        error.body = err.response.data;\n                    } else {\n                        // Roundtrip the response data through JSON serialize/deserialize to ensure\n                        // it only has cloneable fields (i.e. strip out functions, etc.)\n                        error.body = JSON.parse(JSON.stringify(err.response.data));\n                    }\n                } catch (e) {\n                    this.logger.warn('Failed to capture streaming subscription error detail from AxiosError', {\n                        error: e\n                    });\n                }\n            }\n        }\n\n        return error;\n    },\n\n    setupStreaming: task(function* () {\n        if (!this.element || !this.element.messaging) {\n            return;\n        }\n\n        yield waitForProperty(this, 'application.streamingServiceConnect.isIdle');\n\n        const connection = yield this.get('streaming.v2Promise');\n\n        if (!connection.connected) {\n            yield new Promise(resolve => connection.on('connected', resolve));\n        }\n\n        yield this.resetStreamingSubscriptions();\n\n        const streamingTopicHandler = this.publishStreamingTopic.bind(this);\n        this.set('streamingTopicHandler', streamingTopicHandler);\n\n        if (!this.element) {\n            return;\n        }\n\n        this.element.messaging.addListener('streamingTopicSubscribe', publication => {\n            if (!publicationHasPayload(publication)) {\n                return;\n            }\n            this.onStreamingTopicSubscribe(publication);\n        });\n\n        this.element.messaging.addListener('streamingTopicUnsubscribe', publication => {\n            if (!publicationHasPayload(publication)) {\n                return;\n            }\n            this.onStreamingTopicUnsubscribe(publication);\n        });\n    }),\n\n    setupToasts() {\n        if (!this.element || !this.element.messaging) {\n            return;\n        }\n\n        this.element.addEventListener('notifyRequest', this.notifyRequest.bind(this));\n\n        this.element.messaging.addListener('dismissToast', publication => {\n            if (!publicationHasPayload(publication) || !publication.payload.id) {\n                return;\n            }\n\n            // Use unique ID to avoid conflicts with other iframe clients\n            const toastId = this.getUniqueToastId(publication.clientId, publication.payload.id);\n            this.notification.dismiss(toastId);\n        });\n\n        this.element.messaging.addListener('showToast', publication => {\n            if (!publicationHasPayload(publication) || !publication.payload.id) {\n                return;\n            }\n\n            // Use unique ID to avoid conflicts with other iframe clients\n            const toastId = this.getUniqueToastId(publication.clientId, publication.payload.id);\n            this.notification.show(toastId);\n        });\n    },\n\n    setupMakeCall() {\n        if (!this.element || !this.element.messaging) {\n            return;\n        }\n\n        this.element.messaging.addListener('callPersonById', async publication => {\n            try {\n                await this.phone.callPersonById(publication.payload);\n            } catch (e) {\n                this.logger.error('Failed to call person', { error: e, publication });\n            }\n        });\n    },\n\n    setupStartChat() {\n        if (!this.element || !this.element.messaging) {\n            return;\n        }\n\n        this.element.messaging.addListener('startChatWithPersonById', async publication => {\n            try {\n                await this.chat.openChatRoomForPersonById(publication.payload);\n            } catch (e) {\n                this.logger.error('Failed to open chat with person', { error: e, publication });\n            }\n        });\n    },\n\n    setupStartChatByJid() {\n        if (!this.element || !this.element.messaging) {\n            return;\n        }\n\n        this.element.messaging.addListener('startChatByJid', async publication => {\n            try {\n                if (!publicationHasPayload(publication) || !publication.payload.jid) {\n                    throw new Error('No JID provided');\n                } else {\n                    await this.chat.openChatRoomForJid(publication.payload.jid);\n                }\n            } catch (e) {\n                this.logger.error('Failed to open group chat', { error: e, publication });\n            }\n        });\n    },\n\n    setupLaunchVideo() {\n        if (!this.element || !this.element.messaging) {\n            return;\n        }\n\n        this.element.messaging.addListener('launchVideoWithPersonById', async publication => {\n            try {\n                await this.chat.openChatRoomWithVideoForPersonById(publication.payload);\n            } catch (e) {\n                this.logger.error('Failed to open video chat with person', { error: e, publication });\n            }\n        });\n\n        this.element.messaging.addListener('launchVideoProviderWithPersonById', async publication => {\n            try {\n                const { personId, providerId } = publication.payload;\n                const person = await this.store.find('person', personId);\n                const provider = this.mediaProviders.getProvider(providerId, person);\n                provider.action();\n            } catch (e) {\n                this.logger.error('Failed to open video provider with person', { error: e, publication });\n            }\n        });\n    },\n\n    setupFavoriteEntity() {\n        if (!this.element || !this.element.messaging) {\n            return;\n        }\n\n        this.element.messaging.addListener('favoriteEntityById', async publication => {\n            try {\n                let {\n                    payload: { favoriteStatus, entityType, entityId }\n                } = publication;\n\n                if (favoriteStatus) {\n                    await this.favorites.favoriteEntityById(entityType, entityId);\n                } else {\n                    await this.favorites.unFavoriteEntityById(entityType, entityId);\n                }\n            } catch (e) {\n                this.logger.error('Failed to change entity favorite status', { error: e, publication });\n            }\n        });\n\n        this.favorites.on('favoriteChange', payload => {\n            this.publishFavoriteTopic(payload);\n        });\n    },\n\n    setupUpdateProfileImage() {\n        if (!this.element || !this.element.messaging) {\n            return;\n        }\n\n        this.element.messaging.addListener('updateProfileImage', async publication => {\n            try {\n                let {\n                    payload: { image, entityJid }\n                } = publication;\n\n                await this.chatFrame.confirmUploadImage(image, entityJid);\n\n                await this.session.handleUpdateProfileImage(entityJid);\n            } catch (e) {\n                this.logger.error('Failed to update entity profile picture', { error: e, publication });\n            }\n        });\n    },\n\n    setupOpenHelp() {\n        if (!this.element || !this.element.messaging) {\n            return;\n        }\n\n        this.element.messaging.addListener('help.openHelpPanel', async publication => {\n            try {\n                let anchor = publication.payload ? publication.payload.anchor : undefined;\n                this.help.openContextualHelpTab(anchor);\n            } catch (e) {\n                this.logger.error('Failed to open help panel', { error: e, publication });\n            }\n        });\n    },\n\n    setupSessionEntity() {\n        if (!this.element || !this.element.messaging) {\n            return;\n        }\n\n        this.element.messaging.addListener('userGeneralFieldUpdated', async publication => {\n            try {\n                await this.session.handleUserFieldUpdated(publication.payload);\n            } catch (e) {\n                this.logger.error('Failed to update user field', { error: e, publication });\n            }\n        });\n    },\n\n    setupEmergencyLocationEntity() {\n        if (!this.element || !this.element.messaging) {\n            return;\n        }\n\n        this.element.messaging.addListener('emergencyAddrUpdated', async publication => {\n            try {\n                await this.emergencyLocation.handleEmergencyAddrUpdated(publication.payload);\n            } catch (e) {\n                this.logger.error('Failed to update emergency address', { error: e, publication });\n            }\n        });\n    },\n\n    extractTopicPermissionErrorParts(err) {\n        // If enablePartialBulkResubscribe is enabled on streaming client, we will get a\n        // StreamingSubscriptionError as the promise rejection for lack of permissions.\n        if (err && err.name === 'StreamingSubscriptionError') {\n            // Ideally we would have some stable error code value we could check against,\n            // but that does not exist yet so we have to look at message text.\n            // See NOT-1120 which asks for more structured error info in bulk subscribe response.\n            if (err.topic && (err.message || '').includes('does not have permission')) {\n                return { topic: err.topic };\n            }\n        }\n        // Otherwise, assume err is an AxiosError from the failed bulk subscription endpoint...\n\n        let responseData = undefined;\n\n        // Streaming client will give us the HTTP error itself (it uses axios internally) from the\n        // failed PUT to bulk resubscribe. We need to inspect the response body content.\n        if (err && err.response && err.response.data && typeof err.response.data === 'object') {\n            // AxiosError should have the already parsed JSON response body in the \"data\" field\n            responseData = err.response.data;\n        } else if (err && err.response && err.response.text && typeof err.response.text === 'string') {\n            // Earlier versions of axios included unparsed response JSON in the \"text\" field\n            responseData = JSON.parse(err.response.text);\n        }\n\n        if (responseData && typeof responseData === 'object' && responseData.message) {\n            // Grab the message from the error\n            const message = responseData.message;\n\n            // Permission and topic are listed in quotes\n            const missingPerms = message.match(/\"(.*?)\"/g);\n            const [perm, topic] = missingPerms || [];\n\n            if (perm && topic) {\n                return { topic, permission: perm };\n            }\n        }\n    },\n\n    handleForbiddenStreamingSubscriptionsRequest(publication, err) {\n        const intl = this.intl;\n        const logger = this.logger;\n        const notification = this.notification;\n\n        const { clientId, topic: clientTopic } = publication || {};\n\n        if (!clientId || !clientTopic || !err) {\n            return;\n        }\n\n        try {\n            const errorParts = this.extractTopicPermissionErrorParts(err);\n\n            if (errorParts) {\n                const { permission, topic: streamingTopic } = errorParts;\n\n                // only show one error message for the client\n                const errorId = `${clientId}.${clientTopic}`;\n                // We may not know the permission, so switch up which string if all we have is topic\n                const errorKey = permission\n                    ? 'streaming.subscription.forbidden'\n                    : 'streaming.subscription.forbiddenTopic';\n                const errorMessage = intl.t(errorKey, {\n                    perm: permission,\n                    topic: streamingTopic\n                });\n\n                notification.error(null, errorMessage, {\n                    id: errorId,\n                    tag: errorId\n                });\n            }\n        } catch (e) {\n            logger.error('Failed to parse streaming subscription error for iframe client', { error: e, publication });\n        }\n    },\n\n    setupFrames: task(function* () {\n        if (!this.element) {\n            return;\n        }\n\n        try {\n            yield this.setupStreaming.perform();\n        } catch (e) {\n            // ignore failures to setup streaming\n        }\n\n        try {\n            this.handleModalEvent();\n            this.setupToasts();\n            this.setupMakeCall();\n            this.setupStartChat();\n            this.setupLaunchVideo();\n            this.setupStartChatByJid();\n            this.setupFavoriteEntity();\n            this.setupOpenHelp();\n            this.setupUpdateProfileImage();\n            this.setupSessionEntity();\n            this.setupEmergencyLocationEntity();\n\n            this.element.addEventListener('modalRequest', this.modalRequest.bind(this));\n            this.element.addEventListener('navRequest', this.navRequest.bind(this));\n            this.element.addEventListener('clientChanged', event => {\n                // changing the activeClient twice in the same runloop will cause a rerender error\n                next(() => this.clientChanged(event));\n            });\n\n            this.element.setupFrames(this.clientConfig, {\n                locale: this.get('intl.isoLocale'),\n                hostRootUrl: window.location.origin + window.location.pathname + window.location.search\n            });\n        } catch (e) {\n            this.get('logger').error('frame-router: error during frame setup', { error: e });\n        }\n        if (this.isActivityPlanRulesEnabled) {\n            this.setupClientEventListeners();\n        }\n    }),\n\n    handlePageDataForAccessibility(event) {\n        if (event && event.payload && event.payload.title) {\n            this.set('pageDataTitle', event.payload.title);\n            return;\n        }\n        if (event && event.payload && Object.prototype.hasOwnProperty.call(event.payload, 'title')) {\n            this.set('pageDataTitle', null);\n        }\n    },\n\n    setupPageDataAccessibility() {\n        if (!this.element || !this.element.messaging) {\n            return;\n        }\n        this.element.messaging.addListener('page.data', this.handlePageDataForAccessibility.bind(this));\n    },\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n        const previousRoute = this._accessibilityRoute;\n        const nextRoute = this.get('route');\n        if (previousRoute !== undefined && previousRoute !== nextRoute) {\n            this.set('pageDataTitle', null);\n        }\n        this._accessibilityRoute = nextRoute;\n    },\n\n    didInsertElement() {\n        if (!this.element) {\n            return;\n        }\n\n        this.setupFrames.perform().catch(e => {\n            if (e !== undefined) {\n                this.get('logger').error('frame-router: setupFrames failed', { error: e });\n            }\n        });\n        this.setupPageDataAccessibility();\n\n        if (this.pubSubBindings) {\n            Object.entries(this.pubSubBindings).forEach(([key, value]) => {\n                this.element.messaging.addListener(key, value);\n            });\n        }\n    }\n});\n","import { inject as service } from '@ember/service';\nimport Component from '@ember/component';\n\nexport default Component.extend({\n    classNames: ['free-trial-support'],\n\n    application: service(),\n    intl: service(),\n    session: service(),\n\n    route: '/trial-support',\n\n    init() {\n        this._super(...arguments);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.setupFrameRouter();\n    },\n\n    setupFrameRouter() {\n        let appUrl = `${window.location.origin}/trial-support-ui/#/`;\n        if (window.location.hostname.indexOf('localhost') > -1) {\n            appUrl = 'http://localhost:5000/#/';\n        }\n\n        let frame = this.element.querySelector('frame-router');\n\n        if (!frame) {\n            return;\n        }\n\n        frame.setupFrames(\n            {\n                support: {\n                    url: appUrl,\n                    assignedRoute: this.route\n                }\n            },\n            {\n                locale: this.get('intl.isoRegionalLocale'),\n                hostRootUrl: window.location.origin,\n                custom: {\n                    authToken: this.get('session.accessToken')\n                }\n            }\n        );\n    },\n\n    actions: {\n        closeTrialSupport() {\n            this.application.dismissTrialSupport();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"wUJ2RdQw\",\"block\":\"[[[10,0],[14,0,\\\"trial-support-enabled\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"frame-router\\\"],[14,0,\\\"trial-router\\\"],[14,\\\"route\\\",\\\"trial-support\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"button\\\"],[15,\\\"aria-label\\\",[28,[37,0],[\\\"freeTrial.supportClose\\\"],null]],[15,\\\"onclick\\\",[28,[37,1],[[30,0],\\\"closeTrialSupport\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"trial-support__close\\\"],[15,\\\"screenreader-text\\\",[28,[37,0],[\\\"freeTrial.supportClose\\\"],null]],[14,\\\"icon-name\\\",\\\"close\\\"],[12],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"t\\\",\\\"action\\\"]]\",\"moduleName\":\"web-directory/components/free-trial-support/template.hbs\",\"isStrictMode\":false});","import { reads, readOnly, equal } from '@ember/object/computed';\nimport { scheduleOnce, bind, run } from '@ember/runloop';\nimport { getOwner } from '@ember/application';\nimport { computed, observer } from '@ember/object';\nimport { inject } from '@ember/service';\nimport Component from '@ember/component';\nimport { modalClients, sidePanelClients } from '../../iframe-client-config';\nimport { modalDataToQueryString } from 'web-directory/utils/modal';\n\n// frame-router expects app-relative route values; absolute URLs can be double-prefixed in global-modal.\nfunction toAppRelativeRoute(url) {\n    if (typeof url !== 'string' || !url) {\n        return url;\n    }\n    try {\n        const parsed = new URL(url, window.location.origin);\n        if (parsed.hash) {\n            const pathWithoutTrailingSlash = parsed.pathname.replace(/\\/$/, '');\n            const hashPath = parsed.hash.replace(/^#/, '');\n            return `${pathWithoutTrailingSlash}${hashPath}`;\n        }\n        return `${parsed.pathname}${parsed.search || ''}`;\n    } catch (e) {\n        return url;\n    }\n}\n\nexport default Component.extend({\n    classNames: ['global-modal-wrapper'],\n\n    modal: inject('modal'),\n    intl: inject(),\n    session: inject(),\n\n    displayedModal: reads('modal.displayedModal'),\n    modalData: reads('modal.modalData'),\n    parsedQueryParams: reads('modal.parsedQueryParams'),\n    isGuxSidePanelBetaEnabled: readOnly('session.features.WEM-1246_ActivityPlanRules'),\n    legacyClientConfig: modalClients,\n    isSidePanelModal: equal('modalData.type', 'sidePanel'),\n\n    clientConfig: computed('isSidePanelClient', 'isGuxSidePanelBetaEnabled', 'intl.locale', 'intl.loaded', function () {\n        const intl = this.intl;\n        const sourceConfig = this.isGuxSidePanelBetaEnabled && this.isSidePanelClient ? sidePanelClients : modalClients;\n        const translatedConfig = {};\n\n        Object.keys(sourceConfig).forEach(key => {\n            const config = sourceConfig[key];\n            translatedConfig[key] = Object.assign({}, config);\n\n            if (translatedConfig[key].defaultTitle) {\n                translatedConfig[key].defaultTitle = intl.t(translatedConfig[key].defaultTitle).toString();\n            }\n        });\n\n        return translatedConfig;\n    }),\n\n    resolvedClientConfig: computed('clientConfig', 'displayedModal', 'parsedQueryParams', 'modalData', function () {\n        const config = this.clientConfig;\n        const copy = {};\n        Object.keys(config).forEach(clientId => {\n            copy[clientId] = { ...config[clientId] };\n        });\n        if (this.isSidePanelModal) {\n            return this.applyQueryOverridesForPanel(copy);\n        }\n        return this.applyQueryOverridesForModal(copy);\n    }),\n\n    isSidePanelClient: computed('displayedModal', function () {\n        const displayedModal = this.displayedModal;\n        return !!(displayedModal && sidePanelClients[displayedModal]);\n    }),\n\n    sidePanelData: computed('modalData', 'isSidePanelModal', function () {\n        const modalData = this.modalData;\n        if (this.isSidePanelModal && modalData && modalData.data) {\n            return modalData.data;\n        }\n        return modalData;\n    }),\n\n    modalClass: computed('displayedModal', 'modalRoute', 'isSidePanelModal', 'isGuxSidePanelBetaEnabled', function () {\n        if (!this.isGuxSidePanelBetaEnabled) {\n            return this.displayedModal && this.modalRoute ? 'shownModal hydrated' : 'hidden-modal';\n        }\n        const isLegacyModalEligible = !this.isSidePanelModal || !this.isGuxSidePanelBetaEnabled;\n        return this.displayedModal && this.modalRoute && isLegacyModalEligible ? 'shownModal hydrated' : 'hidden-modal';\n    }),\n\n    // Unlike gux-modal-legacy (class-driven visibility), side-panel is controlled via imperative\n    // showModal/hideModal APIs, so we derive an explicit \"open\" signal for lifecycle sync.\n    isSidePanelOpen: computed('displayedModal', 'isSidePanelModal', 'modalRoute', function () {\n        return !!this.displayedModal && this.isSidePanelModal && !!this.modalRoute;\n    }),\n    isLegacyModalOpen: computed('displayedModal', 'modalRoute', 'isSidePanelOpen', function () {\n        return !!this.displayedModal && !!this.modalRoute && !this.isSidePanelOpen;\n    }),\n    legacyRoute: computed('isSidePanelClient', 'modalRoute', 'isGuxSidePanelBetaEnabled', function () {\n        if (this.isSidePanelClient && this.isGuxSidePanelBetaEnabled) {\n            return null;\n        }\n        return this.modalRoute;\n    }),\n    sidePanelRoute: computed('isSidePanelClient', 'isSidePanelModal', 'modalRoute', function () {\n        if (!this.isSidePanelClient || !this.isSidePanelModal) {\n            return null;\n        }\n        return this.modalRoute;\n    }),\n\n    modalRoute: computed(\n        'displayedModal',\n        'resolvedClientConfig',\n        'modalData',\n        'isSidePanelClient',\n        'isSidePanelModal',\n        'isGuxSidePanelBetaEnabled',\n        function () {\n            const displayedModal = this.displayedModal;\n            if (!displayedModal) {\n                return null;\n            }\n            if (!this.isGuxSidePanelBetaEnabled) {\n                const modalFrameData = this.legacyClientConfig[displayedModal];\n                if (!modalFrameData) {\n                    return null;\n                }\n                const queryStr = modalDataToQueryString(this.modalData);\n                return `${modalFrameData.assignedRoute}${queryStr}`;\n            }\n            if (this.isSidePanelClient && !this.isSidePanelModal) {\n                return null;\n            }\n            const modalFrameData = this.resolvedClientConfig[displayedModal];\n            if (!modalFrameData) {\n                return null;\n            }\n            if (this.isSidePanelModal) {\n                return modalFrameData.assignedRoute;\n            }\n            const queryStr = modalDataToQueryString(this.modalData);\n            return `${modalFrameData.assignedRoute}${queryStr}`;\n        }\n    ),\n\n    guxDismiss(ev) {\n        ev.preventDefault();\n        ev.stopPropagation();\n\n        this.modal.onDismiss({\n            modalType: this.displayedModal\n        });\n    },\n    closeModalHandler(event) {\n        if (event.payload['modalType'] === this.displayedModal) {\n            this.modal.closeModal();\n        }\n    },\n    modalDataHandler(event) {\n        if (event.payload['modalType'] === this.displayedModal) {\n            this.modal.onData(event.payload);\n        }\n    },\n    panelTitle: computed('displayedModal', 'modalRoute', 'pageDataTitle', function () {\n        const fromPageData = this.pageDataTitle;\n        if (fromPageData) {\n            return fromPageData;\n        }\n        return '';\n    }),\n    setRouter() {\n        const router = getOwner(this).lookup('router:main');\n        if (router) {\n            router.on(\n                'willTransition',\n                bind(this, () => {\n                    this.modal.closeModal();\n                })\n            );\n        }\n    },\n    init() {\n        this._super(...arguments);\n        if (this.isGuxSidePanelBetaEnabled) {\n            this.pageDataTitle = null;\n            this.pubSubBindings = {\n                'page.data': event => {\n                    if (event && event.payload && event.payload.title) {\n                        this.set('pageDataTitle', event.payload.title);\n                    }\n                }\n            };\n            this._lastDisplayedModalForTitle = this.displayedModal;\n        }\n    },\n    didUpdateAttrs() {\n        this._super(...arguments);\n        if (this.isGuxSidePanelBetaEnabled) {\n            const displayedModal = this.displayedModal;\n            if (displayedModal !== this._lastDisplayedModalForTitle) {\n                this.set('pageDataTitle', null);\n                this._lastDisplayedModalForTitle = displayedModal;\n            }\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.element.addEventListener('guxdismiss', this.guxDismiss.bind(this));\n        if (!this.isGuxSidePanelBetaEnabled) {\n            const currData = this.legacyClientConfig;\n            const newData = this.applyLegacyQueryOverrides(currData);\n            this.set('legacyClientConfig', newData);\n            const frame = this.element.querySelector('frame-router');\n            if (frame && frame.messaging) {\n                frame.messaging.addListener('closeModal', this.closeModalHandler.bind(this));\n                frame.messaging.addListener('modalData', this.modalDataHandler.bind(this));\n            }\n        }\n        if (this.isGuxSidePanelBetaEnabled) {\n            this.element.addEventListener('modalSidePanelDismiss', this.guxDismiss.bind(this));\n            if (this.element.messaging) {\n                this.element.messaging.addListener('closeModal', this.closeModalHandler.bind(this));\n                this.element.messaging.addListener('modalData', this.modalDataHandler.bind(this));\n            }\n            scheduleOnce('afterRender', this, this.bindLegacyModalFrameListeners);\n        }\n        this.setRouter();\n    },\n\n    didRender() {\n        this._super(...arguments);\n        if (!this.isGuxSidePanelBetaEnabled) {\n            return;\n        }\n        scheduleOnce('afterRender', this, this.bindLegacyModalFrameListeners);\n        if (this.isSidePanelModal) {\n            scheduleOnce('afterRender', this, this.syncSidePanelModal);\n        }\n    },\n\n    bindLegacyModalFrameListeners() {\n        if (!this.element) {\n            return;\n        }\n        const frame = this.element.querySelector('gux-modal-legacy frame-router');\n        if (!frame || !frame.messaging || frame.__globalModalLegacyBindingsAttached) {\n            return;\n        }\n        frame.messaging.addListener('closeModal', this.closeModalHandler.bind(this));\n        frame.messaging.addListener('modalData', this.modalDataHandler.bind(this));\n        frame.__globalModalLegacyBindingsAttached = true;\n    },\n\n    // Re-sync panel open/close whenever side-panel eligibility changes. We defer to afterRender\n    // so the custom element and its slotted frame-router exist before calling component methods.\n    _syncSidePanelModal: observer('isSidePanelOpen', 'isGuxSidePanelBetaEnabled', function () {\n        if (!this.isGuxSidePanelBetaEnabled || !this.element) {\n            return;\n        }\n        run(() => {\n            scheduleOnce('afterRender', this, this.syncSidePanelModal);\n        });\n    }),\n    syncSidePanelModal() {\n        if (!this.isGuxSidePanelBetaEnabled) {\n            return;\n        }\n        const panel = this.element && this.element.querySelector('#global-ifc-modal-panel');\n        if (!panel) {\n            return;\n        }\n        // Side-panel modal is managed with imperative methods, not CSS classes.\n        if (this.isSidePanelOpen) {\n            if (typeof panel.showModal === 'function') {\n                panel.showModal();\n            }\n            return;\n        }\n        if (typeof panel.hideModal === 'function') {\n            panel.hideModal();\n        } else if (typeof panel.close === 'function') {\n            panel.close();\n        }\n    },\n\n    // Separate functions for side-panel and modal query overrides to keep the main applyQueryOverridesForModal function clean.\n    applyQueryOverridesForPanel(modalData) {\n        const displayedModal = this.displayedModal;\n        const modalFrameData = displayedModal ? modalData[displayedModal] : null;\n        if (modalFrameData && typeof modalFrameData.urlFormat === 'function') {\n            const url = modalFrameData.urlFormat(this.sidePanelData);\n            modalFrameData.url = url;\n            modalFrameData.assignedRoute = toAppRelativeRoute(url);\n        }\n\n        const queryParams = this.parsedQueryParams;\n        if (!queryParams) {\n            return modalData;\n        }\n        const clientConfig = this.clientConfig;\n        Object.keys(clientConfig).forEach(clientId => {\n            let urlOverride = queryParams[`global-sidepanel-${clientId}`];\n            if (urlOverride !== undefined) {\n                if (typeof modalData[clientId].timeMachineUrl === 'function') {\n                    modalData[clientId].url = modalData[clientId].timeMachineUrl(urlOverride, this.sidePanelData);\n                } else {\n                    modalData[clientId].url = urlOverride;\n                }\n            }\n        });\n        return modalData;\n    },\n    applyLegacyQueryOverrides(modalData) {\n        const queryParams = this.parsedQueryParams;\n        if (!queryParams) {\n            return this.legacyClientConfig;\n        }\n        const clientConfig = this.legacyClientConfig;\n        Object.keys(clientConfig).forEach(clientId => {\n            let urlOverride = queryParams[`global-modal-${clientId}`];\n            if (urlOverride !== undefined) {\n                if (typeof modalData[clientId].timeMachineUrl === 'function') {\n                    modalData[clientId].url = modalData[clientId].timeMachineUrl(urlOverride);\n                } else {\n                    modalData[clientId].url = urlOverride;\n                }\n            }\n        });\n        return modalData;\n    },\n    applyQueryOverridesForModal(modalData) {\n        const queryParams = this.parsedQueryParams;\n        if (!queryParams) {\n            return this.clientConfig;\n        }\n        const clientConfig = this.clientConfig;\n        Object.keys(clientConfig).forEach(clientId => {\n            let urlOverride = queryParams[`global-modal-${clientId}`];\n            if (urlOverride !== undefined) {\n                if (typeof modalData[clientId].timeMachineUrl === 'function') {\n                    modalData[clientId].url = modalData[clientId].timeMachineUrl(urlOverride);\n                } else {\n                    modalData[clientId].url = urlOverride;\n                }\n            }\n        });\n        return modalData;\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"/3d9RTk8\",\"block\":\"[[[41,[33,1],[[[41,[33,2],[[[1,\\\"        \\\"],[10,\\\"gux-modal-side-panel-beta\\\"],[14,\\\"size\\\",\\\"large\\\"],[14,1,\\\"global-ifc-modal-panel\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-side-panel-header\\\"],[14,\\\"slot\\\",\\\"header\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-side-panel-heading\\\"],[14,\\\"slot\\\",\\\"title\\\"],[12],[1,[34,3]],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,\\\"slot\\\",\\\"content\\\"],[14,0,\\\"global-ifc-panel\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,4],[[[1,\\\"                    \\\"],[1,[28,[35,5],null,[[\\\"clientConfig\\\",\\\"route\\\",\\\"activeClient\\\",\\\"pubSubBindings\\\",\\\"enableSidePanelClientEvents\\\"],[[33,6],[33,7],[33,8],[33,9],true]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"footer\\\"],[14,0,\\\"hide-element\\\"],[14,\\\"slot\\\",\\\"footer\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n    \\\"],[10,\\\"gux-modal-legacy\\\"],[15,0,[36,10]],[14,\\\"size\\\",\\\"dynamic\\\"],[15,1,[52,[33,2],null,[33,8]]],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,\\\"slot\\\",\\\"content\\\"],[14,\\\"tabindex\\\",\\\"0\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,11],[[[1,\\\"                \\\"],[1,[28,[35,5],null,[[\\\"clientConfig\\\",\\\"route\\\",\\\"activeClient\\\"],[[33,6],[33,12],[33,8]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                \\\"],[1,[28,[35,5],null,[[\\\"clientConfig\\\",\\\"route\\\"],[[33,6],[33,12]]]]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"    \\\"],[10,\\\"gux-modal-legacy\\\"],[15,0,[36,10]],[14,\\\"size\\\",\\\"dynamic\\\"],[15,1,[36,8]],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,\\\"slot\\\",\\\"content\\\"],[14,\\\"tabindex\\\",\\\"0\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,5],null,[[\\\"clientConfig\\\",\\\"route\\\"],[[33,13],[33,14]]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[],false,[\\\"if\\\",\\\"isGuxSidePanelBetaEnabled\\\",\\\"isSidePanelModal\\\",\\\"panelTitle\\\",\\\"isSidePanelOpen\\\",\\\"frame-router\\\",\\\"resolvedClientConfig\\\",\\\"sidePanelRoute\\\",\\\"displayedModal\\\",\\\"pubSubBindings\\\",\\\"modalClass\\\",\\\"isLegacyModalOpen\\\",\\\"legacyRoute\\\",\\\"legacyClientConfig\\\",\\\"modalRoute\\\"]]\",\"moduleName\":\"web-directory/components/global-modal/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport { reads } from '@ember/object/computed';\nimport Component from '@ember/component';\nimport { computed } from '@ember/object';\n\nexport default Component.extend({\n    classNames: ['global-side-panel-wrapper'],\n    classNameBindings: ['panelTemplate:show-panel:hidden-panel'],\n    containerClassNames: ['global-side-panel-component'],\n    translucentOverlay: true,\n    overlayClassNames: 'translucent',\n\n    intl: service(),\n    panel: service('side-panel'),\n\n    headerText: reads('panel.headerText'),\n    confirmText: computed('panel.confirmText', function () {\n        if (this.get('panel.confirmText')) {\n            return this.get('panel.confirmText');\n        }\n        return this.intl.t('common.confirm');\n    }),\n    cancelText: computed('panel.cancelText', function () {\n        if (this.get('panel.cancelText')) {\n            return this.get('panel.cancelText');\n        }\n        return this.intl.t('common.cancel');\n    }),\n\n    cancel: reads('panel.cancelAction'),\n    confirm: reads('panel.confirmAction'),\n\n    showHeader: reads('panel.showHeader'),\n    showFooter: reads('panel.showFooter'),\n\n    extraClassNames: reads('panel.panelClasses'),\n    panelTemplate: reads('panel.template'),\n    panelTemplateProps: reads('panel.templateProps'),\n\n    confirmDisabled: reads('panel.confirmDisabled'),\n    noCancel: false,\n\n    actions: {\n        close() {\n            this.send('sendCancel');\n        },\n\n        sendConfirm() {\n            if (this.confirm) {\n                let ret = this.confirm();\n                if (ret && ret.then) {\n                    this.set('loading', true);\n                    ret.then(() => {\n                        this.set('loading', false);\n                    });\n                }\n            } else {\n                this.sendAction('confirm');\n            }\n        },\n\n        sendCancel() {\n            if (this.attrs.cancel) {\n                this.attrs.cancel();\n            }\n            this.panel.resetSidePanel();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"/ycQcTtD\",\"block\":\"[[[10,0],[14,0,\\\"side-panel\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"side-panel-header\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,1],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"header-title\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[34,1]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[11,0],[24,0,\\\"close-button\\\"],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[16,\\\"aria-label\\\",[28,[37,2],[\\\"common.close\\\"],null]],[4,[38,3],[[30,0],\\\"close\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"close\\\"],[15,\\\"screenreader-text\\\",[28,[37,2],[\\\"common.close\\\"],null]],[12],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[46,[33,5],null,[[\\\"params\\\"],[[33,6]]],null],[1,\\\"\\\\n\\\\n\\\"],[41,[33,7],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"side-panel-footer\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-button\\\"],[15,\\\"gux-title\\\",[29,[[36,8]]]],[14,\\\"accent\\\",\\\"primary\\\"],[15,\\\"disabled\\\",[36,9]],[15,\\\"onclick\\\",[28,[37,3],[[30,0],\\\"sendConfirm\\\"],null]],[14,\\\"role\\\",\\\"button\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[34,8]],[1,\\\"\\\\n\\\\n\\\"],[41,[33,10],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"gux-button\\\"],[15,\\\"gux-title\\\",[29,[[36,11]]]],[14,\\\"accent\\\",\\\"secondary\\\"],[15,\\\"onclick\\\",[28,[37,3],[[30,0],\\\"sendCancel\\\"],null]],[14,\\\"role\\\",\\\"button\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[34,11]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13],[1,\\\"\\\\n\\\\n\\\"],[11,0],[24,0,\\\"global-side-panel-overlay\\\"],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[4,[38,3],[[30,0],\\\"close\\\"],null],[12],[13]],[],false,[\\\"if\\\",\\\"headerText\\\",\\\"t\\\",\\\"action\\\",\\\"component\\\",\\\"panelTemplate\\\",\\\"panelTemplateProps\\\",\\\"showFooter\\\",\\\"confirmText\\\",\\\"confirmDisabled\\\",\\\"loading\\\",\\\"cancelText\\\"]]\",\"moduleName\":\"web-directory/components/global-side-panel/template.hbs\",\"isStrictMode\":false});","import { reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport Component from '@ember/component';\n\nexport default Component.extend({\n    session: service(),\n\n    bootstrapIcons: reads('session.isAuthenticated')\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"OKg5q5uy\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[10,\\\"i\\\"],[14,0,\\\"ion-chevron-right invisible\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[10,\\\"i\\\"],[14,0,\\\"pc-moon pc-email invisible\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[10,\\\"i\\\"],[14,0,\\\"pc-moon pc-loading invisible\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],null]],[],false,[\\\"if\\\",\\\"bootstrapIcons\\\"]]\",\"moduleName\":\"web-directory/components/icon-bootstrap/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport { reads } from '@ember/object/computed';\nimport { computed } from '@ember/object';\nimport Component from '@ember/component';\nimport moment from '../../../utils/dates';\n\nconst EXPLANATION_EXPIRY_THRESHOLD_DAYS = 7;\n\nexport default Component.extend({\n    classNames: ['inbox-message', 'adherence-explanations', 'clickable', 'adherenceExplanation-message'],\n    classNameBindings: ['adherenceExplanation.markedAsRead:read:unread'],\n    hovered: false,\n    clock: service(),\n    intl: service(),\n    wfm: service(),\n    permissions: service(),\n    notification: service(),\n    store: service(),\n    session: service(),\n    sidebar: service(),\n    commandNav: service('command-nav'),\n\n    canEdit: reads('permissions.hasAdherenceExplanationEditAccess'),\n\n    person: computed('adherenceExplanation.adherenceExplanation.agent', function () {\n        const userGuid = this.get('adherenceExplanation.adherenceExplanation.agent.id');\n        return userGuid ? this.wfm.getPersonById(userGuid) : null;\n    }),\n\n    agentName: computed('person.state', function () {\n        return (\n            this.wfm.getAgentNameByIdWithState(this.get('person.id')) || this.intl.t('notification.inbox.unknownAgent')\n        );\n    }),\n\n    notes: computed('adherenceExplanation.adherenceExplanation.notes', function () {\n        return this.get('adherenceExplanation.adherenceExplanation.notes') || null;\n    }),\n\n    date: computed('clock.minute', 'adherenceExplanation.timestamp', function () {\n        // Consume clock.minute to establish Glimmer autotracking (Ember 3.28 compatibility)\n        this.get('clock.minute');\n        const date = moment(this.get('adherenceExplanation.timestamp'));\n        const locale = this.get('intl.isoLocale');\n        return date.locale(locale).format('LL');\n    }),\n\n    time: computed('clock.minute', 'adherenceExplanation.timestamp', function () {\n        // Consume clock.minute to establish Glimmer autotracking (Ember 3.28 compatibility)\n        this.get('clock.minute');\n        const date = moment(this.get('adherenceExplanation.timestamp'));\n        const locale = this.get('intl.isoLocale');\n        return date.locale(locale).format('LT');\n    }),\n\n    dateFromNow: computed('clock.minute', 'adherenceExplanation.timestamp', function () {\n        // Consume clock.minute to establish Glimmer autotracking (Ember 3.28 compatibility)\n        this.get('clock.minute');\n        const date = moment(this.get('adherenceExplanation.timestamp'));\n        const locale = this.get('intl.isoLocale');\n        return date.locale(locale).fromNow();\n    }),\n\n    isExplanationExpired: computed('adherenceExplanation.adherenceExplanation.startDate', function () {\n        return (\n            this.get('adherenceExplanation.adherenceExplanation.startDate') <\n            moment.utc().subtract(EXPLANATION_EXPIRY_THRESHOLD_DAYS, 'days').toISOString()\n        );\n    }),\n\n    explanationStatusText: computed('isExplanationExpired', function () {\n        return this.isExplanationExpired\n            ? 'notification.inbox.adherenceExplanation.expired'\n            : 'notification.inbox.adherenceExplanation.runningLate';\n    }),\n\n    canShowActionBtn: computed('person.state', 'isExplanationExpired', 'canEdit', function () {\n        // The explanation requests of the hard deleted agents can't be updated. eg. GDPR would do hard delete.\n        if (this.person === undefined) {\n            return false;\n        } else if (this.get('person.state') === 'deleted') {\n            return false;\n        }\n        return this.canEdit && !this.isExplanationExpired;\n    }),\n\n    explanationDetail: computed('adherenceExplanation.adherenceExplanation.lengthMinutes', function () {\n        const explanationLen = this.get('adherenceExplanation.adherenceExplanation.lengthMinutes');\n        const duration = moment.duration(explanationLen, 'minutes');\n        const hours = duration.hours();\n        const minutes = duration.minutes();\n        const startDate = this.get('adherenceExplanation.adherenceExplanation.startDate');\n        const dateFormat = this.intl.t('notification.inbox.dateShortMonthDayFormat');\n        const day = moment(startDate).format(dateFormat);\n        const time = moment(startDate).format('LT');\n        if (hours) {\n            if (minutes) {\n                return this.intl.t('notification.inbox.adherenceExplanation.detail.hoursMinutes', {\n                    hours,\n                    minutes,\n                    day,\n                    time\n                });\n            }\n            return this.intl.t('notification.inbox.adherenceExplanation.detail.hours', { hours, day, time });\n        }\n        return this.intl.t('notification.inbox.adherenceExplanation.detail.minutes', { minutes, day, time });\n    }),\n\n    mouseEnter: function () {\n        this.set('hovered', true);\n    },\n\n    mouseLeave: function () {\n        this.set('hovered', false);\n    },\n\n    changeReadState(isRead) {\n        this.send('hideDropdown');\n        if (this.get('adherenceExplanation.markedAsRead') === isRead) {\n            return;\n        }\n        this.set('adherenceExplanation.markedAsRead', isRead);\n        const explanation = this.adherenceExplanation;\n        this.wfm.toggleNotificationState(explanation);\n    },\n\n    actions: {\n        changeStatus(isRead) {\n            this.changeReadState(isRead);\n        },\n        toggleDropdown() {\n            this.toggleProperty('showDropdown');\n        },\n        hideDropdown() {\n            this.set('showDropdown', false);\n        },\n        async readAndViewDetails() {\n            try {\n                this.changeReadState(true);\n                const explanation = this.adherenceExplanation;\n                // Ignore redirection to schedules when the explanation is not aligned to businessUnit.\n                if (!Object.prototype.hasOwnProperty.call(explanation.adherenceExplanation, 'businessUnit')) {\n                    return;\n                }\n                const url = await this.wfm.getScheduleUrl(explanation.adherenceExplanation);\n                if (!this.get('wfm.isRouteChanged')) {\n                    if (url) {\n                        window.location.hash = url;\n                        if (this.get('session.useNewNav')) {\n                            this.commandNav.selectPanel('panel-not-active');\n                        } else {\n                            this.sidebar.closePanel();\n                        }\n                    } else {\n                        // Show toast message when none of the schedule matches the explanations.\n                        const title = this.intl.t(\n                            'notification.inbox.adherenceExplanation.toast.scheduleSearch.info.title'\n                        );\n                        const msg = this.intl.t(\n                            'notification.inbox.adherenceExplanation.toast.scheduleSearch.info.noMatchingSchedule',\n                            {\n                                agentName: this.agentName\n                            }\n                        );\n                        this.notification.info(title, msg);\n                    }\n                }\n            } catch (error) {\n                let key, params;\n                const getMessage = (key, params) => {\n                    if (params) {\n                        return this.intl.t(key, params);\n                    }\n                    return this.intl.t(key);\n                };\n                if (error.status === 403 && error.payload.code === 'missing.any.permissions') {\n                    key = 'notification.inbox.adherenceExplanation.toast.scheduleSearch.error.noViewPermission';\n                } else if (error.status === 403 && error.payload.code === 'wfm.team.only.permissions.not.allowed') {\n                    key =\n                        'notification.inbox.adherenceExplanation.toast.scheduleSearch.error.teamOnlyPermissionsNotAllowed';\n                } else if (error.status === 404 && error.payload.code === 'wfm.business.unit.not.found') {\n                    key = 'notification.inbox.adherenceExplanation.toast.scheduleSearch.error.noBuFound';\n                    params = { agentName: this.agentName };\n                } else {\n                    key = 'notification.inbox.adherenceExplanation.toast.scheduleSearch.error.searchFailed';\n                }\n                const title = this.intl.t('notification.inbox.adherenceExplanation.toast.scheduleSearch.error.title');\n                const msg = getMessage(key, params);\n                this.notification.error(title, msg);\n            }\n        },\n        async updateExplanation(status) {\n            try {\n                const explanation = this.adherenceExplanation;\n                this.changeReadState(true);\n                await this.wfm.updateAdherenceExplanation(explanation.adherenceExplanation, status);\n            } catch (error) {\n                const title = this.intl.t('notification.inbox.adherenceExplanation.toast.badrequest.title');\n                let message = this.intl.t('notification.inbox.adherenceExplanation.toast.badrequest.message', {\n                    agentName: this.agentName\n                });\n\n                if (error.status === 403) {\n                    message = this.intl.t('notification.inbox.adherenceExplanation.toast.badrequest.noEditPermission');\n                } else if (error.status === 404 && error.payload.code === 'not.found') {\n                    message = this.intl.t('notification.inbox.adherenceExplanation.toast.badrequest.muNotFound', {\n                        agentName: this.agentName\n                    });\n                }\n                this.notification.error(title, message);\n            }\n        },\n        handleKeyDown(event) {\n            if (event.key !== 'Enter') {\n                return;\n            }\n            this.send('readAndViewDetails');\n            event.stopPropagation();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"kQIIMBAR\",\"block\":\"[[[10,0],[14,0,\\\"inbox-row\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"image\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,1],[[[6,[39,2],null,[[\\\"entity\\\",\\\"showPresence\\\",\\\"enableMiniCard\\\"],[[33,1],true,true]],[[\\\"default\\\"],[[[[1,\\\"                \\\"],[1,[28,[35,3],null,[[\\\"entity\\\"],[[33,1]]]]],[1,\\\"\\\\n\\\"]],[]]]]]],[]],[[[6,[39,2],null,[[\\\"entity\\\",\\\"showPresence\\\",\\\"enableMiniCard\\\"],[[33,1],false,false]],[[\\\"default\\\"],[[[[1,\\\"                \\\"],[1,[28,[35,3],null,[[\\\"entity\\\"],[[33,1]]]]],[1,\\\"\\\\n\\\"]],[]]]]]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[11,0],[24,0,\\\"right\\\"],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[16,\\\"onkeydown\\\",[28,[37,4],[[30,0],\\\"handleKeyDown\\\"],null]],[4,[38,4],[[30,0],\\\"readAndViewDetails\\\"],null],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"information col-sm-8\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"no-padding name\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"agent-info\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,1],[14,0,\\\"agent-name\\\"],[12],[1,[34,5]],[13],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"agent-explanation-detail\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[34,6]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,7],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"note-wrapper\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,1],[12],[10,\\\"b\\\"],[12],[1,[28,[35,8],[\\\"notification.inbox.adherenceExplanation.notes\\\"],null]],[13],[13],[1,\\\"\\\\n                        \\\"],[10,0],[14,0,\\\"explanation-note\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,1],[15,1,[29,[[36,9],\\\"-notes\\\"]]],[12],[1,\\\"\\\\n                                \\\"],[1,[34,7]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                            \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,9],\\\"-notes\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n                                \\\"],[1,[34,7]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[14,0,\\\"ib-time col-sm-4\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,10],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"absolute-time\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,0],[12],[1,[34,11]],[13],[1,\\\"\\\\n                    \\\"],[10,0],[12],[1,[34,12]],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"relative-time\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[34,13]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"ib-action\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"explanation-status pull-left\\\"],[15,\\\"title\\\",[28,[37,8],[[33,14]],null]],[12],[1,\\\"\\\\n\\\"],[41,[33,15],[[[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/ic-iw-active-circle-question\\\"],[15,\\\"screenreader-text\\\",[29,[[28,[37,8],[[33,14]],null]]]],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"run\\\"],[15,\\\"screenreader-text\\\",[29,[[28,[37,8],[[33,14]],null]]]],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"dropdown pull-left\\\"],[12],[1,\\\"\\\\n\\\"],[6,[39,16],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[[33,17],\\\"inbox-panel-v2.explanation-request\\\"]],[[\\\"default\\\"],[[[[1,\\\"                \\\"],[10,\\\"button\\\"],[14,0,\\\"btn btn-link btn-sm dropdown-toggle menu-selector\\\"],[15,1,[29,[[30,0,[\\\"elementId\\\"]],\\\"-dropdownMenu\\\"]]],[15,\\\"title\\\",[28,[37,8],[\\\"components.inbox.actions.moreActions\\\"],null]],[15,\\\"aria-label\\\",[28,[37,8],[\\\"components.inbox.actions.moreActions\\\"],null]],[14,\\\"aria-haspopup\\\",\\\"true\\\"],[15,\\\"aria-expanded\\\",[29,[[36,17]]]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"menu-kebab-horizontal\\\"],[15,\\\"screenreader-text\\\",[28,[37,8],[\\\"components.inbox.actions.moreActions\\\"],null]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"ul\\\"],[15,0,[29,[\\\"explanation-dropdown dropdown-menu \\\",[52,[33,17],\\\"show\\\"]]]],[12],[1,\\\"\\\\n\\\"],[41,[33,18],[[[1,\\\"                        \\\"],[10,\\\"li\\\"],[14,0,\\\"action-buttons list-header approve-button\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,\\\"gux-button\\\"],[14,\\\"accent\\\",\\\"tertiary\\\"],[14,\\\"gux-title\\\",\\\"Approve\\\"],[15,\\\"onclick\\\",[28,[37,4],[[30,0],\\\"updateExplanation\\\",\\\"Approved\\\"],null]],[14,\\\"role\\\",\\\"button\\\"],[12],[1,\\\"\\\\n                                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"checkmark\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                                \\\"],[10,1],[12],[1,[28,[35,8],[\\\"notification.inbox.adherenceExplanation.approve\\\"],null]],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\\n                        \\\"],[10,\\\"li\\\"],[14,0,\\\"action-buttons list-header\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,\\\"gux-button\\\"],[14,\\\"accent\\\",\\\"tertiary\\\"],[14,\\\"gux-title\\\",\\\"Deny\\\"],[15,\\\"onclick\\\",[28,[37,4],[[30,0],\\\"updateExplanation\\\",\\\"Denied\\\"],null]],[14,\\\"role\\\",\\\"button\\\"],[12],[1,\\\"\\\\n                                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"close\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                                \\\"],[10,1],[12],[1,[28,[35,8],[\\\"notification.inbox.adherenceExplanation.deny\\\"],null]],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,19,[\\\"markedAsRead\\\"]],[[[1,\\\"                        \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n                            \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"btn btn-link toggle-read-unread mark-as-unread\\\"],[4,[38,4],[[30,0],\\\"changeStatus\\\",false],null],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,8],[\\\"components.inbox.actions.markAsUnread\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n                            \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"btn btn-link toggle-read-unread mark-as-read\\\"],[4,[38,4],[[30,0],\\\"changeStatus\\\",true],null],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,8],[\\\"components.inbox.actions.markAsRead\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                    \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n                        \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"btn btn-link details\\\"],[4,[38,4],[[30,0],\\\"readAndViewDetails\\\"],null],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,8],[\\\"components.inbox.actions.viewDetails\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"if\\\",\\\"person\\\",\\\"entity-image\\\",\\\"integration-badges\\\",\\\"action\\\",\\\"agentName\\\",\\\"explanationDetail\\\",\\\"notes\\\",\\\"t\\\",\\\"elementId\\\",\\\"hovered\\\",\\\"date\\\",\\\"time\\\",\\\"dateFromNow\\\",\\\"explanationStatusText\\\",\\\"isExplanationExpired\\\",\\\"drop-down\\\",\\\"showDropdown\\\",\\\"canShowActionBtn\\\",\\\"adherenceExplanation\\\"]]\",\"moduleName\":\"web-directory/components/inbox-panel-v2/adherence-explanations/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport Component from '@ember/component';\n\nexport default Component.extend({\n    classNames: ['ib-textbox'],\n    classNameBindings: ['isNonEditable::editable'],\n    inbox: service(),\n\n    isNonEditable: true,\n\n    defaultValue: null,\n    value: null,\n\n    didInsertElement() {\n        // store the old value\n        this.set('defaultValue', this.value);\n    },\n\n    actions: {\n        enter() {\n            this.sendAction('onEnter', this.value);\n            this.set('defaultValue', this.value);\n        },\n\n        cancel() {\n            // roll back the current value to the default value and trigger the hook\n            this.set('value', this.defaultValue);\n            this.sendAction('onCancel');\n        },\n\n        clearText() {\n            // clear the current text and trigger the hook\n            this.set('value', '');\n            this.sendAction('onClear');\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"bg7khg+f\",\"block\":\"[[[10,0],[15,0,[29,[\\\"form-group input-group-sm ib-cancellable-textbox \\\",[52,[33,1],\\\"only-read-input\\\"]]]],[12],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"text-input cancellable-text-input-area\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"label\\\"],[15,\\\"for\\\",[29,[[36,2],\\\"-cancellable\\\"]]],[14,0,\\\"hidden\\\"],[12],[1,\\\" \\\"],[1,[28,[35,3],[\\\"components.inbox.labels.callLogName\\\"],null]],[1,\\\" \\\"],[13],[1,\\\"\\\\n        \\\"],[1,[28,[35,4],null,[[\\\"id\\\",\\\"type\\\",\\\"class\\\",\\\"enter\\\",\\\"disabled\\\",\\\"value\\\"],[[28,[37,5],[[33,2],\\\"-cancellable\\\"],null],\\\"text\\\",\\\"form-control cancellable-text-input\\\",[28,[37,6],[[30,0],\\\"enter\\\"],null],[33,1],[33,7]]]]],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[14,0,\\\"input-group-btn clear-btn-wrapper\\\"],[12],[1,\\\"\\\\n            \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link btn-sm clear-btn\\\"],[16,\\\"aria-label\\\",[28,[37,3],[\\\"common.clear\\\"],null]],[24,4,\\\"button\\\"],[4,[38,6],[[30,0],\\\"clearText\\\"],[[\\\"bubbles\\\"],[false]]],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"close-circle\\\"],[15,\\\"screenreader-text\\\",[28,[37,3],[\\\"common.clear\\\"],null]],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-sm btn-link cancel-btn\\\"],[24,4,\\\"button\\\"],[4,[38,6],[[30,0],\\\"cancel\\\"],[[\\\"bubbles\\\"],[false]]],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,3],[\\\"components.inbox.actions.cancel\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"if\\\",\\\"isNonEditable\\\",\\\"elementId\\\",\\\"t\\\",\\\"input\\\",\\\"concat\\\",\\\"action\\\",\\\"value\\\"]]\",\"moduleName\":\"web-directory/components/inbox-panel-v2/cancellable-textbox/template.hbs\",\"isStrictMode\":false});","import { readOnly } from '@ember/object/computed';\nimport { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@ember/component';\nimport { formatTimestampForDisplay } from 'web-directory/utils/date-time';\nimport moment from '../../../utils/dates';\n\nexport default Component.extend({\n    classNames: ['inbox-message', 'coaching-appointments-message', 'clickable', 'coaching-appointments'],\n    classNameBindings: [\n        'coachingAppointment.markedAsRead:read:unread',\n        'coachingAppointment.actionType:Deleted:Scheduled'\n    ],\n    hovered: false,\n    application: service(),\n    ajax: service(),\n    clock: service(),\n    inbox: service(),\n    intl: service(),\n    notification: service(),\n    coaching: service(),\n    modal: service('modal'),\n\n    mouseEnter: function () {\n        this.set('hovered', true);\n    },\n\n    mouseLeave: function () {\n        this.set('hovered', false);\n    },\n\n    actions: {\n        changeStatus: function (status) {\n            this.coaching.changeCoachingNotificationReadState(this.coachingAppointment, status);\n            this.set('showDropdown', false);\n        },\n        viewDetails: function () {\n            this.toggleCoachingModal();\n        },\n        readAndViewDetails: function () {\n            this.coaching.changeCoachingNotificationReadState(this.coachingAppointment, true);\n            this.toggleCoachingModal();\n            this.set('showDropdown', false);\n        },\n        readAndViewDevelopmentPlan: function () {\n            this.coaching.changeCoachingNotificationReadState(this.coachingAppointment, true);\n            this.set('showDropdown', false);\n            const route = '#/analytics/agents/development/me';\n            if (this.hasDevelopmentPlan) {\n                const appsUri = this.get('application.purecloudAppsUri');\n                const startDate = moment(this.get('coachingAppointment.dateStart'))\n                    .startOf('week')\n                    .format('YYYY-MM-DD');\n                const endDate = moment(startDate).add(1, 'years').format('YYYY-MM-DD');\n                const devUri = `/directory/${route}?dateSpan=custom&start=${startDate}&end=${endDate}&intervalKeyValue=Due`;\n                const developmentUri = new URL(devUri, appsUri);\n                window.open(developmentUri.href, '_self');\n            } else {\n                window.location.hash = route;\n            }\n        }\n    },\n\n    relationship: computed('coachingAppointment.relationship', function () {\n        const relationship = this.get('coachingAppointment.relationship');\n        return this.intl.t(`notification.inbox.coachingAppointment.relationships.${relationship}`);\n    }),\n\n    attendeeName: computed('coachingAppointment', 'coachingAttendees', function () {\n        const attendee = this.coachingAppointment.appointment.attendees[0];\n        if (attendee != null) {\n            const att = this.coachingAttendees.get(attendee.id);\n            if (att) {\n                return att.name;\n            }\n        } else {\n            return '';\n        }\n    }),\n\n    localizedStatus: computed('coachingAppointment.status', function () {\n        const status = this.coachingAppointment.status;\n        return this.intl.t(`notification.inbox.coachingAppointment.status.${status}`);\n    }),\n\n    dateStart: readOnly('coachingAppointment.dateStart'),\n\n    formattedDateStart: computed('coachingAppointment.dateStart', function () {\n        const dateStart = this.get('coachingAppointment.dateStart');\n        if (dateStart == null || dateStart === '') {\n            return '';\n        }\n        return formatTimestampForDisplay(dateStart);\n    }),\n\n    time: computed('coachingAppointment.dateStart', function () {\n        const date = moment(this.get('coachingAppointment.dateStart'));\n        const locale = this.get('intl.isoLocale');\n        return date.locale(locale).format('LT');\n    }),\n\n    dateFromNow: computed('clock.minute', 'coachingAppointment.dateStart', function () {\n        // Consume clock.minute to establish Glimmer autotracking (Ember 3.28 compatibility)\n        this.get('clock.minute');\n        const date = moment(this.get('coachingAppointment.dateStart'));\n        const now = moment();\n        const locale = this.get('intl.isoLocale');\n\n        if (now.isAfter(date)) {\n            return this.intl.t('notification.inbox.coachingAppointmentDue', {\n                time: date.locale(locale).fromNow()\n            });\n        } else {\n            return date.locale(locale).fromNow();\n        }\n    }),\n\n    shouldShowInvalidMessage: computed('coachingAppointment.status', function () {\n        var isInvalid = this.get('coachingAppointment.status') == 'InvalidSchedule';\n        return isInvalid;\n    }),\n\n    toggleCoachingModal() {\n        const inboxItem = this.coachingAppointment;\n        if (inboxItem.actionType === 'Delete') {\n            const intl = this.intl;\n            const title = intl.t('notification.inbox.coachingAppointment.toast.deleted.title');\n            const message = intl.t('notification.inbox.coachingAppointment.toast.deleted.message');\n            this.notification.info(title, message);\n            this.coaching.updateOnDelete(inboxItem);\n        } else if (inboxItem.status !== 'Completed') {\n            const displayedModal = this.get('modal.displayedModal');\n            if (displayedModal) {\n                this.modal.closeModal();\n            } else {\n                this.modal.showModal({\n                    modalId: 'wemCoachingUi',\n                    modalData: { appointmentId: this.get('coachingAppointment.appointment.id') }\n                });\n            }\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"BKuMXw/c\",\"block\":\"[[[10,0],[14,0,\\\"inbox-row\\\"],[12],[1,\\\"\\\\n    \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"right\\\"],[4,[38,0],[[30,0],\\\"readAndViewDetails\\\"],null],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"information col-sm-8\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"ib-details\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"appointment-text\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,0],[12],[1,\\\"\\\\n                        \\\"],[10,0],[14,0,\\\"appointment-name\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,1],[12],[1,[33,1,[\\\"name\\\"]]],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,3],[[33,1,[\\\"actionType\\\"]],\\\"Delete\\\"],null],[[[1,\\\"                            \\\"],[10,1],[12],[1,\\\"\\\\n                                \\\"],[2,[28,[37,4],[\\\"notification.inbox.coachingAppointment.messageDeleted\\\"],[[\\\"dateStart\\\",\\\"lengthInMinutes\\\"],[[33,5],[33,1,[\\\"lengthInMinutes\\\"]]]]]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[10,1],[12],[1,\\\"\\\\n                                \\\"],[2,[28,[37,4],[\\\"notification.inbox.coachingAppointment.message\\\"],[[\\\"dateStart\\\",\\\"lengthInMinutes\\\",\\\"localizedStatus\\\"],[[33,5],[33,1,[\\\"lengthInMinutes\\\"]],[33,6]]]]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"coaching-appointment-relationship\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,1],[12],[1,[28,[35,4],[\\\"notification.inbox.coachingAppointment.relationship\\\"],null]],[13],[1,\\\"\\\\n                        \\\"],[10,1],[12],[1,[34,7]],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,8],[[[1,\\\"                        \\\"],[10,1],[14,0,\\\"coaching-appointment-invalid\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"invalid-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/ic-alert-octo\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                            \\\"],[1,[28,[35,4],[\\\"notification.inbox.coachingAppointment.appointmentScheduleInvalid\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"coaching-notification-time-column ib-time col-sm-2\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,9],[[[1,\\\"                \\\"],[10,\\\"gux-date-beta\\\"],[15,\\\"datetime\\\",[29,[[36,10]]]],[14,\\\"format\\\",\\\"long\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-time-beta\\\"],[15,\\\"datetime\\\",[29,[[36,10]]]],[14,\\\"format\\\",\\\"short\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                \\\"],[1,[34,11]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"ib-action\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"dropdown pull-left\\\"],[12],[1,\\\"\\\\n\\\"],[6,[39,12],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[[33,13],\\\"inbox-panel-v2.coaching-appointments\\\"]],[[\\\"default\\\"],[[[[1,\\\"                \\\"],[10,\\\"button\\\"],[14,0,\\\"btn btn-link btn-sm dropdown-toggle menu-selector\\\"],[15,\\\"aria-label\\\",[28,[37,4],[\\\"common.more\\\"],null]],[15,1,[29,[[30,0,[\\\"elementId\\\"]],\\\"-dropdownMenu\\\"]]],[14,\\\"aria-haspopup\\\",\\\"true\\\"],[15,\\\"aria-expanded\\\",[29,[[36,13]]]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"menu-kebab-horizontal\\\"],[15,\\\"screenreader-text\\\",[28,[37,4],[\\\"common.more\\\"],null]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"ul\\\"],[15,0,[29,[\\\"dropdown-menu \\\",[52,[33,13],\\\"show\\\"]]]],[15,\\\"aria-labelledby\\\",[29,[[30,0,[\\\"elementId\\\"]],\\\"-dropdownMenu\\\"]]],[12],[1,\\\"\\\\n\\\"],[41,[33,1,[\\\"markedAsRead\\\"]],[[[1,\\\"                        \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n                            \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link toggle-read-unread\\\"],[24,4,\\\"button\\\"],[4,[38,0],[[30,0],\\\"changeStatus\\\",false],null],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,4],[\\\"components.inbox.actions.markAsUnread\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n                            \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link toggle-read-unread\\\"],[24,4,\\\"button\\\"],[4,[38,0],[[30,0],\\\"changeStatus\\\",true],null],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,4],[\\\"components.inbox.actions.markAsRead\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                    \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n                        \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link details\\\"],[24,4,\\\"button\\\"],[4,[38,0],[[30,0],\\\"readAndViewDetails\\\"],null],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,4],[\\\"components.inbox.actions.viewDetails\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n                        \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link development-plan\\\"],[24,4,\\\"button\\\"],[4,[38,0],[[30,0],\\\"readAndViewDevelopmentPlan\\\"],null],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,4],[\\\"components.inbox.actions.viewDevelopmentPlan\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"action\\\",\\\"coachingAppointment\\\",\\\"if\\\",\\\"eq\\\",\\\"t\\\",\\\"formattedDateStart\\\",\\\"localizedStatus\\\",\\\"relationship\\\",\\\"shouldShowInvalidMessage\\\",\\\"hovered\\\",\\\"dateStart\\\",\\\"dateFromNow\\\",\\\"drop-down\\\",\\\"showDropdown\\\"]]\",\"moduleName\":\"web-directory/components/inbox-panel-v2/coaching-appointments/template.hbs\",\"isStrictMode\":false});","import { htmlSafe } from '@ember/template';\nimport { debounce, later } from '@ember/runloop';\nimport { getOwner } from '@ember/application';\nimport { readOnly, bool, reads, lte, and } from '@ember/object/computed';\nimport EmberObject, { computed, get, set, observer } from '@ember/object';\nimport { on } from '@ember/object/evented';\nimport { inject as service } from '@ember/service';\nimport Component from '@ember/component';\nimport _ from 'lodash';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport { parseQueryParams } from 'web-directory/utils/query-parser';\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['inbox-panel'],\n\n    application: service(),\n    sidebar: service(),\n    session: service(),\n    timeline: service(),\n    inbox: service(),\n    phone: service(),\n    permissions: service(),\n    intl: service(),\n    notification: service(),\n    logger: service('stash-logger'),\n    router: null,\n\n    showHeader: true,\n    recordFilter: 'showAll',\n\n    voicemailFrame: null,\n    voicemailFrameConfig: null,\n    _groupVoicemails: null,\n    groupVoicemailReadStatus: null,\n    inCallControls: false,\n    showReadOptions: false,\n\n    voicemailFrameId: computed('showHeader', function () {\n        return this.showHeader ? 'voicemail-standalone-main' : 'voicemail-standalone-mini';\n    }),\n\n    faxesFrameId: computed('showHeader', function () {\n        return this.showHeader ? 'faxes-standalone-main' : 'faxes-standalone-mini';\n    }),\n\n    groupMailboxEnabled: readOnly('session.features.EC-772_get-groups-mailboxes'),\n\n    canViewRecordings: readOnly('permissions.canViewRecordings'),\n\n    faxesFrame: null,\n    faxesFrameConfig: null,\n\n    currentFilter: computed('recordFilter', function () {\n        return this.intl.t('components.inbox.filters.' + this.recordFilter);\n    }),\n\n    newExportsAvailable: bool('inbox.newExportsAvailable'),\n    newAlertsAvailable: bool('inbox.newAlertsAvailable'),\n\n    canManageAlerts: readOnly('permissions.canEditReportingAlerts'),\n\n    isCopyStaticLinkEnabled: computed('permissions.canViewStaticLink', function () {\n        return this.get('permissions.canViewStaticLink');\n    }),\n\n    inboxPanelAttentionCounts: computed(\n        'unreadVoicemails',\n        'unreadFaxes',\n        'unreadRecordings',\n        'unreadEvaluations',\n        'unreadTimeOffRequests',\n        'unreadShiftTradeRequests',\n        'unreadReportingExports',\n        'unreadReportingAlerts',\n        'unreadCoachingAppointments',\n        'unreadLearningAssignments',\n        'unreadAdherenceExplanations',\n        function () {\n            let attentionCountObject = EmberObject.create({});\n            if (this.unreadVoicemails) {\n                attentionCountObject.set('voicemails', true);\n            }\n            if (this.unreadFaxes) {\n                attentionCountObject.set('faxes', true);\n            }\n            if (this.unreadRecordings) {\n                attentionCountObject.set('recordings', true);\n            }\n            if (this.unreadEvaluations) {\n                attentionCountObject.set('evaluations', true);\n            }\n            if (this.unreadTimeOffRequests) {\n                attentionCountObject.set('timeOffRequests', true);\n            }\n            if (this.unreadShiftTradeRequests) {\n                attentionCountObject.set('shiftTradeRequests', true);\n            }\n            if (this.unreadCoachingAppointments) {\n                attentionCountObject.set('coachingAppointments', true);\n            }\n            if (this.unreadReportingExports) {\n                attentionCountObject.set('reportingExports', true);\n            }\n            if (this.unreadReportingAlerts) {\n                attentionCountObject.set('reportingAlerts', true);\n            }\n            if (this.unreadLearningAssignments) {\n                attentionCountObject.set('learningAssignments', true);\n            }\n            if (this.hasAdherenceExplanationAccess && this.unreadAdherenceExplanations) {\n                attentionCountObject.set('adherenceExplanations', true);\n            }\n\n            return attentionCountObject;\n        }\n    ),\n\n    inboxPanelConfigs: computed(\n        'phone.enabled',\n        'hasVoicemailAccess',\n        'hasEvaluationAccess',\n        'hasTimeOffRequestAccess',\n        'hasShiftTradeRequestAccess',\n        'hasReportingExportAccess',\n        'hasReportingAlertAccess',\n        'hasLearningAssignmentAccess',\n        'coachingAppointmentShow',\n        'hasAdherenceExplanationAccess',\n        'hasCoachingAppointmentAccess',\n        'canViewRecordings',\n        function () {\n            return [\n                EmberObject.create({\n                    id: 'voicemails',\n                    showTab: this.get('phone.enabled') && this.hasVoicemailAccess,\n                    icon: {\n                        guxIcon: {\n                            name: 'voicemail',\n                            decorative: 'true'\n                        }\n                    },\n                    name: this.intl.t('notification.inbox.voicemails'),\n                    supplementalClassNames: 'tab voicemail-tab monochromic-icon',\n                    sortPriority: 100\n                }),\n                EmberObject.create({\n                    id: 'faxes',\n                    showTab: this.get('phone.enabled'),\n                    icon: {\n                        guxIcon: {\n                            name: 'fax',\n                            decorative: 'true'\n                        }\n                    },\n                    name: this.intl.t('notification.inbox.faxes'),\n                    supplementalClassNames: 'tab fax-tab monochromic-icon',\n                    sortPriority: 101\n                }),\n                EmberObject.create({\n                    id: 'recordings',\n                    showTab: this.get('phone.enabled') && this.canViewRecordings,\n                    icon: {\n                        guxIcon: {\n                            name: 'record',\n                            decorative: 'true'\n                        }\n                    },\n                    name: this.intl.t('notification.inbox.recordings'),\n                    supplementalClassNames: 'tab recording-tab monochromic-icon',\n                    sortPriority: 102\n                }),\n                EmberObject.create({\n                    id: 'evaluations',\n                    showTab: this.hasEvaluationAccess,\n                    icon: {\n                        guxIcon: {\n                            name: 'file-preview',\n                            decorative: 'true'\n                        }\n                    },\n                    name: this.intl.t('notification.inbox.evaluations'),\n                    supplementalClassNames: 'tab evaluation-tab monochromic-icon',\n                    sortPriority: 103\n                }),\n                EmberObject.create({\n                    id: 'timeOffRequests',\n                    showTab: this.hasTimeOffRequestAccess,\n                    icon: {\n                        guxIcon: {\n                            name: 'calendar',\n                            decorative: 'true'\n                        }\n                    },\n                    name: this.intl.t('notification.inbox.timeOffRequests'),\n                    supplementalClassNames: 'tab timeOffRequest-tab monochromic-icon',\n                    sortPriority: 104\n                }),\n                EmberObject.create({\n                    id: 'shiftTradeRequests',\n                    showTab: this.hasShiftTradeRequestAccess,\n                    icon: {\n                        guxIcon: {\n                            name: 'trade',\n                            decorative: 'true'\n                        }\n                    },\n                    name: this.intl.t('notification.inbox.shiftTradeRequests'),\n                    supplementalClassNames: 'tab shiftTradeRequest-tab monochromic-icon',\n                    sortPriority: 105\n                }),\n                EmberObject.create({\n                    id: 'explanations',\n                    showTab: this.hasAdherenceExplanationAccess,\n                    icon: {\n                        guxIcon: {\n                            name: 'alert-warning-octogon',\n                            decorative: 'true'\n                        }\n                    },\n                    name: this.intl.t('notification.inbox.explanations'),\n                    supplementalClassNames: 'tab adherenceExplanations-tab monochromic-icon',\n                    sortPriority: 106\n                }),\n                EmberObject.create({\n                    id: 'coachingAppointments',\n                    showTab: this.hasCoachingAppointmentAccess,\n                    icon: {\n                        guxIcon: {\n                            name: 'coaching',\n                            decorative: 'true'\n                        }\n                    },\n                    name: this.intl.t('notification.inbox.coachingAppointments'),\n                    supplementalClassNames: 'tab coachingAppointments-tab monochromic-icon',\n                    sortPriority: 107\n                }),\n                EmberObject.create({\n                    id: 'learningAssignments',\n                    showTab: this.hasLearningAssignmentAccess,\n                    icon: {\n                        guxIcon: {\n                            name: 'skills',\n                            decorative: 'true'\n                        }\n                    },\n                    name: this.intl.t('notification.inbox.moduleAssignments'),\n                    supplementalClassNames: 'tab learningAssignments-tab monochromic-icon',\n                    sortPriority: 108\n                }),\n                EmberObject.create({\n                    id: 'reportingExports',\n                    showTab: this.hasReportingExportAccess,\n                    icon: {\n                        guxIcon: {\n                            name: 'export',\n                            decorative: 'true'\n                        }\n                    },\n                    name: this.intl.t('notification.inbox.reportingexport'),\n                    supplementalClassNames: 'tab reportingExport-tab monochromic-icon',\n                    sortPriority: 109\n                }),\n                EmberObject.create({\n                    id: 'reportingAlerts',\n                    showTab: this.hasReportingAlertAccess,\n                    icon: {\n                        guxIcon: {\n                            name: 'bell',\n                            decorative: 'true'\n                        }\n                    },\n                    name: this.intl.t('notification.inbox.reportingAlerts'),\n                    supplementalClassNames: 'tab reportingAlert-tab monochromic-icon',\n                    sortPriority: 110\n                })\n            ];\n        }\n    ),\n\n    itemToggled(_, value) {\n        this.send('changeSelection', value);\n    },\n\n    init() {\n        this._super(...arguments);\n        const groupMailboxEnabled = this.groupMailboxEnabled;\n\n        if (groupMailboxEnabled) {\n            this.setProperties({\n                _groupVoicemails: []\n            });\n        } else {\n            this.setProperties({\n                _groupVoicemails: [],\n                groupVoicemailReadStatus: {}\n            });\n        }\n\n        this.initVoicemailStandaloneConfig();\n        if (!groupMailboxEnabled) {\n            this.updateGroupVoicemailUnreads();\n        }\n\n        this.initFaxesStandaloneConfig();\n    },\n\n    didInsertElement(...args) {\n        this._super(...args);\n\n        if (this.get('phone.enabled')) {\n            try {\n                const router = getOwner(this).lookup('router:main');\n                this.set('router', router || null);\n            } catch (e) {\n                console.error(\"Failed to setup router. Can't transition\", { thrownError: e });\n                this.set('router', null);\n            }\n            this.setupVoicemailFrameRouter();\n            this.setupFaxesFrameRouter();\n        }\n    },\n\n    setupVoicemailFrameRouter() {\n        const voicemailFrame = this.set('voicemailFrame', this.element.querySelector('frame-router.voicemail-ui'));\n        if (!voicemailFrame) {\n            this.logger.debug('<inbox-panel-v2> no voicemail frame found!');\n            return;\n        }\n\n        voicemailFrame.messaging.addListener('makePhoneCallWithAddress', async ({ payload }) => {\n            this.handleVoicemailCallback(payload);\n        });\n\n        voicemailFrame.messaging.addListener('publishForwardNotification', data => {\n            const { payload } = data;\n            this.triggerForwardNotification(payload.user, payload.error);\n        });\n\n        voicemailFrame.messaging.addListener('updateGroupVoicemails', async ({ payload: groupVoicemails }) => {\n            if (groupVoicemails) {\n                this.set(\n                    '_groupVoicemails',\n                    groupVoicemails.map(groupVm => EmberObject.create(groupVm))\n                );\n            }\n        });\n\n        voicemailFrame.messaging.addListener('navigateToExternalContact', data => {\n            try {\n                const externalContactId = data.payload.externalContactId;\n                const router = this.router;\n                const route = 'relate.contacts-ui-redirect';\n                if (router && router.transitionTo && externalContactId) {\n                    router.transitionTo(route, externalContactId);\n                }\n            } catch (error) {\n                this.logger.error('Failed to navigate to external contact', error);\n            }\n        });\n    },\n\n    setupFaxesFrameRouter() {\n        const faxesFrame = this.set('faxesFrame', this.element.querySelector('frame-router.faxes-ui'));\n\n        if (!faxesFrame) {\n            this.logger.debug('<inbox-panel-v2> no fax frame found!');\n            return;\n        }\n        faxesFrame.messaging.addListener('notifyRequest', ({ payload }) => {\n            if (payload.custom.type === 'error') {\n                this.notification.error(payload.title, payload.message);\n            }\n        });\n    },\n\n    async handleVoicemailCallback(payload) {\n        try {\n            if (payload.callerAddress) {\n                await this.phone.makeCall(payload.callerAddress);\n                this.sidebar.openPanel('callControls');\n            } else {\n                this.logger.error(\n                    '<inbox-panel-v2/voicemail-standalone> makePhoneCallWithAddress no caller address!',\n                    payload\n                );\n            }\n        } catch (err) {\n            this.logger.error(\n                '<inbox-panel-v2/voicemail-standalone> makePhoneCallWithAddress event failed!: ',\n                payload,\n                err\n            );\n        }\n    },\n\n    currentTotal: reads('inbox.totalUnread'),\n\n    validChoices: reads('inbox.validChoices'),\n\n    panels: {\n        voicemails: true,\n        faxes: false,\n        recordings: false,\n        evaluations: false,\n        timeOffRequests: false,\n        shiftTradeRequests: false,\n        coachingAppointments: false,\n        learningAssignments: false,\n        reportingExports: false,\n        reportingAlerts: false,\n        explanations: false\n    },\n\n    comparator: EmberObject.create({\n        truthyValue: true,\n        falseValue: false\n    }),\n\n    // Alerts have an 'unread' property rather than a 'read' property\n    alertsComparator: EmberObject.create({\n        truthyValue: false,\n        falseValue: true\n    }),\n\n    evaluationsComparator: EmberObject.create({\n        truthyValue: true,\n        falseValue: 'PENDING'\n    }),\n\n    pageCount: reads('inbox.pageCount'),\n    recordingsPageCount: reads('inbox.recordingsPageCount'),\n    exportsPageCount: reads('inbox.exportsPageCount'),\n    alertsPageCount: reads('inbox.alertsPageCount'),\n\n    removedGroups: [],\n\n    loadVoicemails() {\n        const pageIndex = this.pageIndex;\n        this.inbox.loadVoicemails(pageIndex + 1); // voicemail service page number is 1 based, this component page index is 0 based\n    },\n\n    loadRecordings(pageNum) {\n        this.inbox.loadRecordings(pageNum);\n    },\n\n    loadReportingExports(pageNum) {\n        this.inbox.loadReportingExportsByPage(pageNum);\n    },\n\n    loadReportingAlerts(pageNum) {\n        this.inbox.loadReportingAlertsByPage(pageNum);\n    },\n\n    pageChanged(event) {\n        this.inbox.get('coaching').changeNotificationPageNumber(event.detail);\n        this.inbox.loadCoachingAppointments();\n    },\n\n    itemsPerPageChanged(event) {\n        this.inbox.get('coaching').changeNotificationPageSize(event.detail);\n        this.inbox.loadCoachingAppointments();\n    },\n\n    goBackPage: function () {\n        if (this.pageIndex > 0) {\n            this.decrementProperty('pageIndex');\n            debounce(this, this.loadVoicemails, 250);\n        }\n    },\n\n    goNextPage: function () {\n        this.incrementProperty('pageIndex');\n        debounce(this, this.loadVoicemails, 250);\n    },\n\n    triggerForwardNotification: function (user, error) {\n        if (!error) {\n            const message = this.intl.t('components.inbox.forwardSuccess', { user: user });\n            this.notification.info(null, message);\n            return;\n        }\n\n        let message = this.intl.safestring('components.inbox.forwardError').toString();\n\n        if (!error.code) {\n            this.notification.error(null, message);\n            return;\n        }\n\n        error = error.code.toString();\n        if (error.includes('does.not.have.voicemail.enabled')) {\n            message = this.intl.safestring('components.inbox.forwardErrorVoicemailDisabled').toString();\n        } else if (error === 'voicemail.not.authorized.voicemail.message') {\n            message = this.intl.safestring('components.inbox.forwardErrorUnauthorized').toString();\n        }\n        this.notification.error(null, message);\n    },\n\n    toggleOptions() {\n        this.toggleProperty('showReadOptions');\n    },\n\n    actions: {\n        changeSelection(selection) {\n            this.set(`panels.${this.currentChoice}`, false);\n            this.set('currentChoice', selection);\n            this.set(`panels.${selection}`, true);\n            this.set('inbox.inboxTabChoice', null);\n        },\n\n        setRecordFilter(selection) {\n            this.set('showReadOptions', false);\n            return this.set('recordFilter', selection);\n        },\n\n        nextPage() {\n            this.goNextPage();\n        },\n\n        backPage() {\n            this.goBackPage();\n        },\n\n        loadLearningAssignments() {\n            this.inbox.loadLearningAssignments();\n        },\n\n        nextRecordingsPage() {\n            debounce(this, this.loadRecordings, this.recordingsPageNumber + 1, 250);\n        },\n\n        previousRecordingsPage() {\n            if (this.recordingsPageNumber > 1) {\n                debounce(this, this.loadRecordings, this.recordingsPageNumber - 1, 250);\n            }\n        },\n\n        nextExportsPage() {\n            debounce(this, this.loadReportingExports, this.exportsPageNumber + 1, 250);\n        },\n\n        previousExportsPage() {\n            if (this.exportsPageNumber > 1) {\n                debounce(this, this.loadReportingExports, this.exportsPageNumber - 1, 250);\n            }\n        },\n\n        nextAlertsPage() {\n            debounce(this, this.loadReportingAlerts, this.alertsPageNumber + 1, 250);\n        },\n\n        previousAlertsPage() {\n            if (this.alertsPageNumber > 1) {\n                debounce(this, this.loadReportingAlerts, this.alertsPageNumber - 1, 250);\n            }\n        },\n\n        filterGroupVoicemails(groupData) {\n            const removed = this.removedGroups;\n            const selected = get(groupData, 'selected');\n            set(groupData, 'selected', !selected);\n            if (selected) {\n                removed.pushObject(groupData.group);\n            } else {\n                this.set(\n                    'removedGroups',\n                    removed.filter(group => group.id !== groupData.group.id)\n                );\n            }\n        },\n\n        viewNewExports() {\n            debounce(this, this.loadReportingExports, 1, 250);\n        },\n\n        viewNewAlerts() {\n            debounce(this, this.loadReportingAlerts, 1, 250);\n        },\n\n        markAllAsUnread: function () {\n            this.inbox.toggleAllAlertsReadState(true).then(() => {\n                // Refresh the alerts in the inbox UI\n                later(this, this.actions.viewNewAlerts);\n            });\n        },\n\n        markAllAsRead: function () {\n            this.inbox.toggleAllAlertsReadState(false).then(() => {\n                // Refresh the alerts in the inbox UI\n                later(this, this.actions.viewNewAlerts);\n            });\n        },\n\n        deleteAll: function () {\n            this.inbox.deleteAllAlertNotifications().then(() => {\n                // Refresh the alerts in the inbox UI\n                later(this, this.actions.viewNewAlerts);\n            });\n        },\n\n        handleKeyDownForLeftDropdown(selection, e) {\n            if (e.code === 'Enter') {\n                this.send('changeSelection', selection);\n            }\n        },\n\n        handleKeyDownForRightDropdown(selection, e) {\n            if (e.code === 'Enter') {\n                this.send('setRecordFilter', selection);\n            }\n        }\n    },\n\n    voicemails: computed(\n        'inbox.voicemails.@each.read',\n        'inbox.voicemails.@each.note',\n        'inbox.voicemails.@each.copiedTo',\n        'recordFilter',\n        'removedGroups.[]',\n        function () {\n            let voicemails = this.get('inbox.voicemails');\n            let comparator = this.comparator;\n            const removedGroups = this.removedGroups.mapBy('guid');\n\n            voicemails = voicemails.filter(voicemail => {\n                const compared = this.filterEntity(voicemail, 'read', comparator);\n                if (!compared) {\n                    return false;\n                }\n                if (removedGroups.length && voicemail.get('isGroupVoicemail')) {\n                    return !_.includes(removedGroups, voicemail.get('group.id'));\n                }\n                return true;\n            });\n            return voicemails.splice(0, voicemails.length);\n        }\n    ),\n\n    pageIndex: 0,\n    pageNumber: reads('inbox.pageNumber'),\n    recordingsPageNumber: reads('inbox.recordingsPageNumber'),\n    exportsPageNumber: reads('inbox.exportsPageNumber'),\n    alertsPageNumber: reads('inbox.alertsPageNumber'),\n\n    recordings: computed('inbox.sortedRecordings.@each.read', 'recordFilter', function () {\n        return this.get('inbox.sortedRecordings').filter(entity => this.filterEntity(entity, 'read', this.comparator));\n    }),\n\n    faxes: computed('inbox.faxes.@each.read', 'inbox.faxes.@each.name', 'recordFilter', function () {\n        return this.get('inbox.faxes').filter(entity => this.filterEntity(entity, 'read', this.comparator));\n    }),\n\n    evaluations: computed('inbox.sortedEvaluations.@each.status', 'recordFilter', function () {\n        if (!this.get('inbox.sortedEvaluations')) {\n            return [];\n        }\n        return this.get('inbox.sortedEvaluations').filter(entity =>\n            this.filterEntity(entity, 'status', this.evaluationsComparator)\n        );\n    }),\n\n    isTimeOffRequestsLoading: computed('inbox.loading.notifications', function () {\n        return this.get('inbox.loading.notifications');\n    }),\n\n    timeOffRequests: computed('inbox.sortedTimeOffRequests.@each.status', 'recordFilter', function () {\n        if (!this.get('inbox.sortedTimeOffRequests')) {\n            return [];\n        }\n        return this.get('inbox.sortedTimeOffRequests').filter(entity =>\n            this.filterEntity(entity, 'markedAsRead', this.comparator)\n        );\n    }),\n\n    adherenceExplanations: computed('inbox.sortedAdherenceExplanations.@each.status', 'recordFilter', function () {\n        if (!this.hasAdherenceExplanationAccess) {\n            return [];\n        }\n        const explanations = this.get('inbox.sortedAdherenceExplanations');\n        return explanations.filter(entity => this.filterEntity(entity, 'markedAsRead', this.comparator));\n    }),\n\n    coachingAppointments: computed('inbox.coachingAppointments.@each.status', 'recordFilter', function () {\n        if (!this.get('inbox.coachingAppointments')) {\n            return [];\n        }\n        return this.get('inbox.coachingAppointments').filter(entity =>\n            this.filterEntity(entity, 'markedAsRead', this.comparator)\n        );\n    }),\n\n    coachingAttendees: computed('inbox.coachingAttendees', function () {\n        return this.get('inbox.coachingAttendees');\n    }),\n\n    learningAssignments: computed('inbox.sortedLearningAssignments.@each.state', 'recordFilter', function () {\n        if (!this.get('inbox.sortedLearningAssignments')) {\n            return [];\n        }\n        return this.get('inbox.sortedLearningAssignments').filter(assignment => {\n            const recordFilter = this.recordFilter;\n            if (recordFilter === 'showUnread') {\n                return assignment.state === 'Assigned';\n            } else if (recordFilter === 'showRead') {\n                return assignment.state !== 'Assigned';\n            }\n            return true;\n        });\n    }),\n\n    shiftTradeRequests: computed('inbox.sortedShiftTradeRequests.@each.status', 'recordFilter', function () {\n        if (!this.get('inbox.sortedShiftTradeRequests')) {\n            return [];\n        }\n        return this.get('inbox.sortedShiftTradeRequests').filter(entity =>\n            this.filterEntity(entity, 'markedAsRead', this.comparator)\n        );\n    }),\n\n    reportingExports: computed('inbox.sortedReportingExports.@each.status', 'recordFilter', function () {\n        if (!this.get('inbox.sortedReportingExports')) {\n            return [];\n        }\n        return this.get('inbox.sortedReportingExports').filter(entity =>\n            this.filterEntity(entity, 'read', this.comparator)\n        );\n    }),\n\n    reportingAlerts: computed('inbox.sortedReportingAlerts.@each.status', 'recordFilter', function () {\n        if (!this.get('inbox.sortedReportingAlerts')) {\n            return [];\n        }\n        const sorted = this.get('inbox.sortedReportingAlerts').filter(entity =>\n            this.filterEntity(entity, 'unread', this.alertsComparator)\n        );\n\n        return sorted;\n    }),\n\n    currentPageDisplay: computed('pageNumber', 'pageIndex', function () {\n        return this.pageIndex + 1;\n    }),\n\n    disableNextButton: computed('pageNumber', 'pageIndex', 'voicemails', function () {\n        return this.pageIndex >= this.pageCount - 1;\n    }),\n\n    disableBackOriginal: lte('pageIndex', 0),\n\n    disableBackButton: computed('disableBackOriginal', function () {\n        return this.disableBackOriginal;\n    }),\n\n    disablePageNumber: computed('voicemails.[]', 'pageCount', function () {\n        const voicemails = this.voicemails;\n        return !voicemails || this.get('voicemails.length') === 0 || !this.pageCount;\n    }),\n\n    disableRecordingsNextButton: computed('recordingsPageNumber', 'recordingsPageCount', 'recordings', function () {\n        return this.recordingsPageNumber >= this.recordingsPageCount;\n    }),\n\n    disableRecordingsBackButton: lte('recordingsPageNumber', 1),\n\n    disableRecordingsPageNumber: computed('recordings.[]', 'recordingsPageCount', function () {\n        const recordings = this.recordings;\n        return !recordings || this.get('recordings.length') === 0 || !this.recordingsPageCount;\n    }),\n\n    disableExportsNextButton: computed('exportsPageNumber', 'exportsPageCount', 'reportingExports', function () {\n        return this.exportsPageNumber >= this.exportsPageCount;\n    }),\n\n    disableExportsBackButton: lte('exportsPageNumber', 1),\n\n    disableExportsPageNumber: computed('reportingExports.[]', 'exportsPageCount', function () {\n        const reportingExports = this.reportingExports;\n        if (this.exportsPageNumber > 1) {\n            return false;\n        }\n        return !reportingExports || this.get('reportingExports.length') === 0 || !this.exportsPageCount;\n    }),\n\n    disableAlertsNextButton: computed('alertsPageNumber', 'alertsPageCount', 'reportingAlerts', function () {\n        return this.alertsPageNumber >= this.alertsPageCount;\n    }),\n\n    disableAlertsBackButton: lte('alertsPageNumber', 1),\n\n    disableAlertsPageNumber: computed('reportingAlerts.[]', 'alertsPageCount', function () {\n        const reportingAlerts = this.reportingAlerts;\n        if (this.alertsPageNumber > 1) {\n            return false;\n        }\n        return !reportingAlerts || this.get('reportingAlerts.length') === 0 || !this.alertsPageCount;\n    }),\n\n    unreadVoicemails: reads('inbox.unreadVoicemails'),\n    unreadRecordings: reads('inbox.unreadRecordings'),\n    unreadFaxes: reads('inbox.unreadFaxes'),\n    unreadEvaluations: computed('inbox.unreadEvaluations', function () {\n        // capped at 25, see https://inindca.atlassian.net/browse/QM-3502\n        return this.get('inbox.unreadEvaluations') >= 25\n            ? this.intl.t('components.inbox.exceededMaxCount', {\n                  count: this.get('inbox.unreadEvaluations')\n              })\n            : this.get('inbox.unreadEvaluations');\n    }),\n    unreadTimeOffRequests: reads('inbox.unreadTimeOffRequests'),\n    unreadShiftTradeRequests: reads('inbox.unreadShiftTradeRequests'),\n    unreadCoachingAppointments: reads('inbox.unreadCoachingAppointments'),\n    unreadLearningAssignments: reads('inbox.unreadLearningAssignments'),\n    unreadReportingExports: reads('inbox.unreadReportingExports'),\n    unreadReportingAlerts: reads('inbox.unreadReportingAlerts'),\n    unreadAdherenceExplanations: reads('inbox.unreadAdherenceExplanations'),\n\n    loading: reads('inbox.loading'),\n\n    _autoPageChange: observer('recordings.[]', 'loading.recordings', function () {\n        if (this.get('loading.recordings')) {\n            return;\n        }\n\n        if (!this.get('recordings.length') && this.recordingsPageNumber > 1) {\n            this.send('previousRecordingsPage');\n        }\n    }),\n\n    filterEntity(entity, key, comparator) {\n        let allow = true;\n        const recordFilter = this.recordFilter;\n\n        if (recordFilter === 'showUnread') {\n            allow = get(entity, key) === comparator.get('falseValue');\n        } else if (recordFilter === 'showRead') {\n            allow = get(entity, key) === comparator.get('truthyValue');\n        }\n        return allow;\n    },\n\n    setInitialPanel: on(\n        'init',\n        observer('hasVoicemailAccess', function () {\n            if (!this.get('hasVoicemailAccess')) {\n                return this.set('panels.faxes', true);\n            }\n        })\n    ),\n\n    setSelectionCoachingAppointments: on(\n        'init',\n        observer('inbox.inboxTabChoice', function () {\n            const inboxTabChoice = this.get('inbox.inboxTabChoice');\n            if (inboxTabChoice) {\n                this.set(`panels.${this.get('currentChoice')}`, false);\n                this.set('currentChoice', inboxTabChoice);\n                this.set(`panels.${inboxTabChoice}`, true);\n            }\n        })\n    ),\n\n    publishRecordFilterToVoicemailAppOnChange: observer('recordFilter', function () {\n        const recordFilter = this.recordFilter;\n        this.publishToVoicemailFrame('recordFilterChange', recordFilter);\n    }),\n    publishRemovedGroupsToVoicemailAppOnChange: observer('removedGroups.[]', function () {\n        const removedGroups = this.removedGroups.map(group => group.id);\n        this.publishToVoicemailFrame('removedGroupsChange', { removedGroups });\n    }),\n\n    publishRecordFilterToFaxAppOnChange: observer('recordFilter', function () {\n        this.publishToFaxFrame('recordFilterChange', this.recordFilter);\n    }),\n\n    publishToVoicemailFrame(topic, payload) {\n        let frame = this.voicemailFrame;\n        if (frame && topic && payload) {\n            try {\n                frame.publish({\n                    topic: topic,\n                    payload: payload\n                });\n            } catch (error) {\n                this.logger.error('Error publishing to voicemail iframe', {\n                    error\n                });\n            }\n        }\n    },\n\n    publishToFaxFrame(topic, payload) {\n        const frame = this.faxesFrame;\n        if (frame && topic && payload) {\n            try {\n                frame.publish({\n                    topic: topic,\n                    payload: payload\n                });\n            } catch (error) {\n                this.logger.error('Error publishing to fax iframe', {\n                    error\n                });\n            }\n        }\n    },\n\n    currentChoice: computed('phone.enabled', 'hasVoicemailAccess', function () {\n        if (this.get('phone.enabled') && this.hasVoicemailAccess) {\n            return this.get('validChoices.voicemails');\n        }\n\n        if (!this.get('phone.enabled') && this.hasReportingExportAccess) {\n            return this.get('validChoices.reportingExports');\n        }\n\n        if (this.hasReportingAlertAccess) {\n            return this.get('validChoices.reportingAlerts');\n        }\n\n        if (this.hasTimeOffRequestAccess) {\n            return this.get('validChoices.timeOffRequests');\n        }\n\n        if (this.hasCoachingAppointments) {\n            return this.get('validChoices.coachingAppointments');\n        }\n\n        if (this.hasLearningAssignmentAccess) {\n            return this.get('validChoices.learningAssignments');\n        }\n\n        if (this.hasShiftTradeRequestAccess) {\n            return this.get('validChoices.shiftTradeRequests');\n        }\n\n        if (this.hasAdherenceExplanationAccess) {\n            return this.get('validChoices.explanations');\n        }\n\n        return this.get('validChoices.faxes');\n    }),\n\n    currentChoiceTitle: computed(\n        'currentChoice',\n        'unreadVoicemails',\n        'unreadFaxes',\n        'unreadRecordings',\n        'unreadEvaluations',\n        'unreadTimeOffRequests',\n        'unreadCoachingAppointments',\n        'unreadLearningAssignments',\n        'unreadShiftTradeRequests',\n        'session.features',\n        'unreadAdherenceExplanations',\n        function () {\n            const currentChoice = this.currentChoice;\n            let currentChoiceTitle = this.intl.t(`notification.inbox.${currentChoice}`);\n            if (currentChoice === 'voicemails' && this.unreadVoicemails > 0) {\n                currentChoiceTitle = this.intl.t('notification.inbox.voicemailsWithCount', {\n                    unreadVoicemails: this.unreadVoicemails\n                });\n            } else if (currentChoice === 'faxes' && this.unreadFaxes > 0) {\n                currentChoiceTitle = this.intl.t('notification.inbox.faxesWithCount', {\n                    unreadFaxes: this.unreadFaxes\n                });\n            } else if (currentChoice === 'recordings' && this.unreadRecordings > 0) {\n                currentChoiceTitle = this.intl.t('notification.inbox.recordingsWithCount', {\n                    unreadRecordings: this.unreadRecordings\n                });\n            } else if (currentChoice === 'evaluations' && this.unreadEvaluations > 0) {\n                currentChoiceTitle = this.intl.t('notification.inbox.evaluationsWithCount', {\n                    unreadEvaluations: this.unreadEvaluations\n                });\n            } else if (currentChoice === 'timeOffRequests' && this.unreadTimeOffRequests > 0) {\n                currentChoiceTitle = this.intl.t('notification.inbox.timeOffRequestsWithCount', {\n                    unreadTimeOffRequests: this.unreadTimeOffRequests\n                });\n            } else if (currentChoice === 'coachingAppointments' && this.unreadCoachingAppointments > 0) {\n                currentChoiceTitle = this.intl.t('notification.inbox.coachingAppointmentsWithCount', {\n                    unreadCoachingAppointments: this.unreadCoachingAppointments\n                });\n            } else if (currentChoice === 'learningAssignments' && this.unreadLearningAssignments > 0) {\n                currentChoiceTitle = this.intl.t('notification.inbox.assignmentsWithCount', {\n                    unreadLearningAssignments: this.unreadLearningAssignments\n                });\n            } else if (currentChoice === 'shiftTradeRequests' && this.unreadShiftTradeRequests > 0) {\n                currentChoiceTitle = this.intl.t('notification.inbox.shiftTradeRequestsWithCount', {\n                    unreadShiftTradeRequests: this.unreadShiftTradeRequests\n                });\n            } else if (currentChoice === 'explanations' && !!this.unreadAdherenceExplanations) {\n                currentChoiceTitle = this.intl.t('notification.inbox.adherenceExplanationsWithCount', {\n                    unreadAdherenceExplanations: this.unreadAdherenceExplanations\n                });\n            }\n            return htmlSafe(currentChoiceTitle);\n        }\n    ),\n\n    showVoicemails: computed('currentChoice', function () {\n        return this.get('validChoices.voicemails') === this.currentChoice;\n    }),\n    showFaxes: computed('currentChoice', function () {\n        return this.get('validChoices.faxes') === this.currentChoice;\n    }),\n    showRecordings: computed('currentChoice', function () {\n        return this.get('validChoices.recordings') === this.currentChoice;\n    }),\n    showEvaluations: computed('currentChoice', function () {\n        return this.get('validChoices.evaluations') === this.currentChoice;\n    }),\n    showTimeOffRequests: computed('currentChoice', function () {\n        return this.get('validChoices.timeOffRequests') === this.currentChoice;\n    }),\n    showShiftTradeRequests: computed('currentChoice', function () {\n        return this.get('validChoices.shiftTradeRequests') === this.currentChoice;\n    }),\n    showAdherenceExplanations: computed('currentChoice', function () {\n        return this.hasAdherenceExplanationAccess && this.get('validChoices.explanations') === this.currentChoice;\n    }),\n    showCoachingAppointments: computed('currentChoice', function () {\n        return this.get('validChoices.coachingAppointments') === this.currentChoice;\n    }),\n    showLearningAssignments: computed('currentChoice', function () {\n        return this.get('validChoices.learningAssignments') === this.currentChoice;\n    }),\n    showReportingExports: computed('currentChoice', function () {\n        return this.get('validChoices.reportingExports') === this.currentChoice;\n    }),\n    showReportingAlerts: computed('currentChoice', function () {\n        return this.get('validChoices.reportingAlerts') === this.currentChoice;\n    }),\n    selectedFaxes: computed('faxes.content.@each.selected', function () {\n        return _.filter(this.get('faxes.content'), function (fax) {\n            return fax.get('selected');\n        });\n    }),\n\n    hasVoicemailAccess: reads('permissions.hasVoicemailAccess'),\n\n    hasEvaluationAccess: reads('permissions.hasEvaluationAccess'),\n\n    hasTimeOffRequestAccess: reads('permissions.hasTimeOffRequestAccess'),\n\n    hasShiftTradeRequestAccess: reads('permissions.hasAgentShiftTradeRequestAccess'),\n\n    hasReportingExportAccess: reads('permissions.hasReportingExportAccess'),\n\n    hasReportingAlertAccess: reads('permissions.hasReportingAlertAccess'),\n\n    hasAdherenceExplanationAccess: reads('permissions.hasAdherenceExplanationViewAccess'),\n\n    hasCoachingAppointmentAccess: computed('permissions.hasCoachingParticipate', function () {\n        return this.get('permissions.hasCoachingParticipate');\n    }),\n\n    hasCoachingUsability: computed('session.features', function () {\n        return this.get('session.features')['coaching.usability.ui'];\n    }),\n\n    hasCoachingOverdue: computed('session.features', function () {\n        return this.get('session.features')['coaching.overdue.ui'];\n    }),\n\n    hasDevelopmentPlan: true,\n\n    hasLearningAssignmentAccess: computed('inbox.isLearningAssignmentEnabled', function () {\n        return this.get('inbox.isLearningAssignmentEnabled');\n    }),\n\n    assignmentMessages: computed(function () {\n        return {\n            noUnreadAssignments: this.intl.t('notification.inbox.noUnreadAssignments'),\n            noReadAssignments: this.intl.t('notification.inbox.noReadAssignments'),\n            noAssignments: this.intl.t('notification.inbox.noAssignments'),\n            moduleAssignments: this.intl.t('notification.inbox.moduleAssignments')\n        };\n    }),\n\n    groupVoicemails: computed('_groupVoicemails.[]', function () {\n        if (!this._groupVoicemails) {\n            return [];\n        }\n        return this._groupVoicemails;\n    }),\n\n    voicemailGroups: computed('groupVoicemails.@each.groupEntity', 'removedGroups.[]', function () {\n        let groups = [];\n        groups = this.groupVoicemails.mapBy('group');\n        const data = [];\n\n        const uniqueGroups = _.uniqBy(groups, 'id').map(group => {\n            const removedGroup = this.removedGroups.find(removedGroup => removedGroup.id === group.id);\n            return {\n                group,\n                selected: !removedGroup\n            };\n        });\n        data.pushObjects(uniqueGroups);\n        return data;\n    }),\n\n    hasGroupVoicemails: computed('groupVoicemails.[]', function () {\n        return this.get('groupVoicemails.length') > 0;\n    }),\n\n    /**\n     * Stop gap to resolve an issue with Group voicemail Unread/Read status.\n     * Once https://inindca.atlassian.net/browse/EC-772 is completed, we\n     * can improve, or remove, this logic.\n     */\n    updateGroupVoicemailUnreads: observer(\n        'groupVoicemails.[]',\n        'inCallControls',\n        'groupMailboxEnabled',\n        async function () {\n            if (this.inCallControls || this.groupMailboxEnabled) {\n                // we only want to make the group voicemail mailbox requests if we're in inbox pane.\n                return;\n            }\n            const inbox = this.inbox;\n            const groupVoicemails = this.groupVoicemails;\n            let unreadGroupVoicemailCount = 0;\n            let hasChanges = false;\n            const newReadStatus = {};\n            const existingVoicemailIds = Object.keys(this.groupVoicemailReadStatus);\n            groupVoicemails.forEach(groupVM => {\n                const existingReadStatus = this.get(`groupVoicemailReadStatus.${groupVM.id}`);\n                if (groupVM.read !== existingReadStatus) {\n                    hasChanges = true;\n                }\n                if (!groupVM.read) {\n                    unreadGroupVoicemailCount++;\n                }\n                set(newReadStatus, groupVM.id, groupVM.read);\n            });\n            if (!hasChanges) {\n                // double check if any group voicemails were deleted\n                // deleted group voicemails will exist in groupVoicemailReadStatus but not the array\n                const deletedGroupVoicemails = existingVoicemailIds.filter(\n                    id => groupVoicemails.find(vm => vm.id === id) === undefined\n                );\n                hasChanges = deletedGroupVoicemails.length > 0;\n            }\n            if (hasChanges) {\n                inbox.updateUnreadGroupVoicemails(unreadGroupVoicemailCount);\n            }\n            this.set('groupVoicemailReadStatus', newReadStatus);\n        }\n    ),\n\n    showGroupVoicemailFilter: and('hasGroupVoicemails'),\n\n    unselectAllFaxes() {\n        return _.each(this.get('faxes.content'), function (fax) {\n            return fax.set('selected', false);\n        });\n    },\n\n    initVoicemailStandaloneConfig: function () {\n        const queryParams = parseQueryParams();\n        let featureBranch = queryParams['voicemailStandalone'] || queryParams['voicemailstandalone'];\n        if (!featureBranch) {\n            featureBranch = '';\n        } else if (featureBranch && featureBranch !== '') {\n            console.debug(\n                'component/inbox-panel-v2 checkVoicemailStandaloneFeatureBranch: found feature branch: ',\n                featureBranch\n            );\n        }\n        const voicemailStandaloneUrl = new URL(\n            `/voicemail-standalone-v2/${featureBranch}?mini=${!this.showHeader}`,\n            window.location\n        ).toString();\n        const voicemailFrameConfig = {\n            voicemailStandaloneUI: {\n                url: voicemailStandaloneUrl,\n                assignedRoute: '/'\n            }\n        };\n        this.set('voicemailFrameConfig', voicemailFrameConfig);\n    },\n\n    initFaxesStandaloneConfig: function () {\n        const queryParams = parseQueryParams();\n        let featureBranch = queryParams['faxesStandalone'] || queryParams['faxesstandalone'];\n        if (!featureBranch) {\n            featureBranch = '';\n        } else if (featureBranch && featureBranch != '') {\n            console.debug(\n                'component/inbox-panel-v2 checkFaxesStandalonefeatureBranch: found feature branch: ',\n                featureBranch\n            );\n        }\n        const faxesStandaloneUrl = new URL(\n            `/faxes-standalone/${featureBranch}?mini=${!this.showHeader}`,\n            window.location\n        ).toString();\n        const faxesFrameConfig = {\n            faxesStandaloneUI: {\n                url: faxesStandaloneUrl,\n                assignedRoute: '/'\n            }\n        };\n        this.set('faxesFrameConfig', faxesFrameConfig);\n    }\n});\n","import Component from '@ember/component';\n\nexport default Component.extend({\n    isGroupVoicemail: false,\n\n    actions: {\n        sendConfirm() {\n            this.sendAction('confirm');\n        },\n\n        sendCancel() {\n            this.sendAction('cancel');\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"rDMzsc9p\",\"block\":\"[[[6,[39,0],null,[[\\\"action\\\"],[[28,[37,1],[[30,0],\\\"sendCancel\\\"],null]]],[[\\\"default\\\"],[[[[1,\\\"    \\\"],[10,0],[14,0,\\\"delete-confirmation\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"body\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,3],[[[1,\\\"                \\\"],[10,\\\"small\\\"],[14,0,\\\"text-muted\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,4],[\\\"components.inbox.deleteGroupVoicemailWarning\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"title\\\"],[12],[1,[28,[35,4],[\\\"chat.attachment.modal.titleDelete\\\"],null]],[13],[1,\\\"\\\\n                \\\"],[10,\\\"small\\\"],[14,0,\\\"text-muted\\\"],[12],[1,[28,[35,4],[\\\"common.cannotUndone\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[14,0,\\\"footer\\\"],[12],[1,\\\"\\\\n            \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-success btn-purecloud\\\"],[24,4,\\\"button\\\"],[4,[38,1],[[30,0],\\\"sendConfirm\\\"],null],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,4],[\\\"common.delete\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link btn-cancel\\\"],[24,4,\\\"button\\\"],[4,[38,1],[[30,0],\\\"sendCancel\\\"],null],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,4],[\\\"common.cancelDelete\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]]],[],false,[\\\"click-outside\\\",\\\"action\\\",\\\"if\\\",\\\"isGroupVoicemail\\\",\\\"t\\\"]]\",\"moduleName\":\"web-directory/components/inbox-panel-v2/delete-confirmation/template.hbs\",\"isStrictMode\":false});","import { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@ember/component';\nimport moment from '../../../utils/dates';\nimport _ from 'lodash';\n\nexport default Component.extend({\n    classNames: ['inbox-message', 'clickable'],\n    classNameBindings: ['isRead:read:unread'],\n    hovered: false,\n    clock: service(),\n    inbox: service(),\n    intl: service(),\n    session: service(),\n    store: service(),\n\n    mouseEnter: function () {\n        this.set('hovered', true);\n    },\n\n    mouseLeave: function () {\n        this.set('hovered', false);\n    },\n\n    person: computed('evaluation.agent.id', function () {\n        const userGuid = this.get('evaluation.agent.id');\n\n        if (userGuid) {\n            return this.store.findRecord('person', userGuid);\n        }\n\n        return null;\n    }),\n\n    actions: {\n        openChat: function (jid) {\n            this.bubbleAction({\n                action: 'openChatRoom',\n                actionContext: [jid]\n            });\n        },\n\n        toggleRead: function () {\n            this.inbox.readEvaluation(this.evaluation);\n        }\n    },\n\n    redacted: computed('evaluation.redacted', function () {\n        return this.get('evaluation.redacted');\n    }),\n\n    date: computed('evaluation.changedDate', function () {\n        const date = moment(this.get('evaluation.changedDate'));\n        return date.format('LL');\n    }),\n\n    time: computed('evaluation.changedDate', function () {\n        const date = moment(this.get('evaluation.changedDate'));\n        return date.locale(this.get('intl.isoLocale')).format('LT');\n    }),\n\n    dateFromNow: computed('clock.minute', 'evaluation.changedDate', function () {\n        // Consume clock.minute to establish Glimmer autotracking (Ember 3.28 compatibility)\n        this.get('clock.minute');\n        const date = moment(this.get('evaluation.changedDate'));\n        return date.fromNow();\n    }),\n\n    userAction: computed('evaluation.status', function () {\n        const status = this.get('evaluation.status');\n        const userId = this.get('session.user.id');\n        const evaluator = this.get('evaluation.evaluator');\n        const assignee = this.get('evaluation.assignee');\n        const isPendingOrInProgress =\n            status && (status.toLowerCase() === 'pending' || status.toLowerCase() === 'inprogress');\n\n        if (evaluator && evaluator.id === userId && isPendingOrInProgress) {\n            return 'SCORE';\n        }\n\n        if (assignee && assignee.id === userId) {\n            return isPendingOrInProgress ? 'SCORE_ASSIGNED' : 'REVIEW_ASSIGNED';\n        }\n\n        return 'REVIEW';\n    }),\n\n    showAgent: computed('userAction', function () {\n        const userAction = this.userAction;\n        if (userAction === 'SCORE' || userAction === 'SCORE_ASSIGNED' || userAction === 'REVIEW_ASSIGNED') {\n            return true;\n        }\n        return false;\n    }),\n\n    showAssignee: computed('userAction', function () {\n        return false;\n    }),\n\n    svgKey: computed('evaluation.mediaType', function () {\n        if (_.includes(this.get('evaluation.mediaType'), 'CALL')) {\n            if (this.userAction === 'SCORE') {\n                // TODO: Update with new icon when available - Austin Miller\n                return 'phone-success';\n            } else {\n                return 'phone';\n            }\n        } else if (\n            _.includes(this.get('evaluation.mediaType'), 'CHAT') ||\n            _.includes(this.get('evaluation.mediaType'), 'MESSAGE')\n        ) {\n            if (this.userAction === 'SCORE') {\n                // TODO: Update with new icon when available - Austin Miller\n                return 'chat';\n            } else {\n                return 'chat';\n            }\n        } else if (_.includes(this.get('evaluation.mediaType'), 'EMAIL')) {\n            if (this.userAction === 'SCORE') {\n                // TODO: Update with new icon when available - Austin Miller\n                return 'message-email';\n            } else {\n                return 'message-email';\n            }\n        }\n    }),\n\n    isRead: computed('evaluation.agent', 'evaluation.status', function () {\n        const userId = this.get('session.user.id');\n        const agent = this.get('evaluation.agent');\n        const status = this.get('evaluation.status');\n        const linkContext = this.get('evaluation.linkContext');\n        return (\n            linkContext &&\n            linkContext.toLowerCase() === 'agent' &&\n            agent &&\n            userId === agent.id &&\n            status &&\n            status.toLowerCase() === 'inreview'\n        );\n    }),\n\n    conversationDate: computed('evaluation.conversationDate', function () {\n        if (this.get('evaluation.conversationDate')) {\n            const date = moment(this.get('evaluation.conversationDate'));\n            return date.format('LL');\n        } else {\n            return null;\n        }\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"vnSlXdCl\",\"block\":\"[[[10,0],[14,0,\\\"inbox-row\\\"],[12],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"image\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,1],[[[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"svg-icon\\\"],[15,\\\"icon-name\\\",[29,[[36,1]]]],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[1,[28,[35,2],null,[[\\\"entity\\\",\\\"showPresence\\\",\\\"enableMiniCard\\\"],[[33,3],true,true]]]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"right\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"information\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"inner-information-container\\\"],[12],[1,\\\"\\\\n                \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"open-eval normal-weight\\\"],[4,[38,4],[[30,0],\\\"toggleRead\\\"],null],[12],[1,\\\"\\\\n                    \\\"],[10,1],[14,0,\\\"no-padding name voicemail-from-label\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,5],[[[1,\\\"                            \\\"],[1,[28,[35,6],[\\\"components.inbox.labels.redacted\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,7],[[28,[37,8],[[33,9],\\\"SCORE\\\"],null],[28,[37,8],[[33,9],\\\"SCORE_ASSIGNED\\\"],null]],null],[[[41,[33,10],[[[1,\\\"                                \\\"],[1,[28,[35,6],[\\\"components.inbox.labels.scoreEvaluationWithDate\\\"],[[\\\"conversationDate\\\"],[[33,10]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                \\\"],[1,[28,[35,6],[\\\"components.inbox.labels.scoreEvaluation\\\"],null]],[1,\\\"\\\\n\\\"]],[]]]],[]],[[[41,[28,[37,7],[[28,[37,8],[[33,9],\\\"REVIEW\\\"],null],[28,[37,8],[[33,9],\\\"REVIEW_ASSIGNED\\\"],null]],null],[[[41,[33,10],[[[1,\\\"                                \\\"],[1,[28,[35,6],[\\\"components.inbox.labels.reviewEvaluationWithDate\\\"],[[\\\"conversationDate\\\"],[[33,10]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                \\\"],[1,[28,[35,6],[\\\"components.inbox.labels.reviewEvaluation\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                        \\\"]],[]],null]],[]]]],[]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"grey-label\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,5],[[[1,\\\"                        \\\"],[1,[28,[35,6],[\\\"components.inbox.labels.noViewEvaluationPermission\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,11,[\\\"declinedReview\\\"]],[[[1,\\\"                        \\\"],[1,[28,[35,6],[\\\"components.inbox.labels.disputeDeclined\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,12],[[28,[37,8],[[33,9],\\\"REVIEW\\\"],null],[33,11,[\\\"rescore\\\"]]],null],[[[1,\\\"                            \\\"],[1,[28,[35,6],[\\\"components.inbox.labels.rescore\\\"],null]],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,13],[[[1,\\\"                            \\\"],[1,[28,[35,6],[\\\"components.inbox.labels.agentName\\\"],[[\\\"agentName\\\"],[[28,[37,7],[[33,11,[\\\"agent\\\",\\\"name\\\"]],\\\"\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,14],[[[1,\\\"                            \\\"],[1,[28,[35,6],[\\\"components.inbox.labels.assigneeName\\\"],[[\\\"assigneeName\\\"],[[28,[37,7],[[33,11,[\\\"assignee\\\",\\\"name\\\"]],\\\"\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                    \\\"]],[]]]],[]]],[1,\\\"                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[14,0,\\\"ib-time\\\"],[12],[1,\\\"\\\\n\\\"],[41,[51,[33,5]],[[[41,[28,[37,7],[[28,[37,8],[[33,9],\\\"SCORE\\\"],null],[28,[37,8],[[33,9],\\\"SCORE_ASSIGNED\\\"],null],[28,[37,8],[[33,9],\\\"REVIEW_ASSIGNED\\\"],null]],null],[[[41,[33,16],[[[1,\\\"                        \\\"],[10,0],[12],[1,[28,[35,6],[\\\"components.inbox.labels.dateAssigned\\\"],[[\\\"date\\\"],[[33,17]]]]],[13],[1,\\\"\\\\n                        \\\"],[10,0],[12],[1,[34,18]],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[1,[28,[35,6],[\\\"components.inbox.labels.dateAssigned\\\"],[[\\\"date\\\"],[[33,19]]]]],[1,\\\"\\\\n\\\"]],[]]]],[]],[[[41,[28,[37,8],[[33,9],\\\"REVIEW\\\"],null],[[[41,[33,16],[[[1,\\\"                        \\\"],[10,0],[12],[1,[28,[35,6],[\\\"components.inbox.labels.dateReleased\\\"],[[\\\"date\\\"],[[33,17]]]]],[13],[1,\\\"\\\\n                        \\\"],[10,0],[12],[1,[34,18]],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[1,[28,[35,6],[\\\"components.inbox.labels.dateReleased\\\"],[[\\\"date\\\"],[[33,19]]]]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                \\\"]],[]],null]],[]]]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"if\\\",\\\"svgKey\\\",\\\"entity-image\\\",\\\"person\\\",\\\"action\\\",\\\"redacted\\\",\\\"t\\\",\\\"or\\\",\\\"eq\\\",\\\"userAction\\\",\\\"conversationDate\\\",\\\"evaluation\\\",\\\"and\\\",\\\"showAgent\\\",\\\"showAssignee\\\",\\\"unless\\\",\\\"hovered\\\",\\\"date\\\",\\\"time\\\",\\\"dateFromNow\\\"]]\",\"moduleName\":\"web-directory/components/inbox-panel-v2/evaluations-v2/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport layout from './template';\nimport { inject as service } from '@ember/service';\n\nconst expiredScheduledCountDisplayLimit = 20;\nconst exportsExpiringSoonDays = 7;\n\nexport default Component.extend({\n    layout,\n    classNames: ['export-expiration-summary'],\n    intl: service('intl'),\n    notification: service('notification'),\n    engageanalytics: service('engageanalytics'),\n\n    exportExpirationSummary: null,\n    tooltip: '',\n\n    isRenewing: false,\n\n    tooManyExpiredScheduledExports: computed('exportExpirationSummary.expiredScheduleCount', function () {\n        return this.get('exportExpirationSummary.expiredScheduleCount') > expiredScheduledCountDisplayLimit;\n    }),\n\n    expiringScheduledExportsCountDisplay: computed('exportExpirationSummary.expiringScheduleCount', function () {\n        return this.get('exportExpirationSummary.expiringScheduleCount') ?? 0;\n    }),\n\n    expiredScheduledExportsCountDisplay: computed(\n        'exportExpirationSummary.expiredScheduleCount',\n        'tooManyExpiredScheduledExports',\n        function () {\n            return this.get('tooManyExpiredScheduledExports')\n                ? expiredScheduledCountDisplayLimit\n                : this.get('exportExpirationSummary.expiredScheduleCount') ?? 0;\n        }\n    ),\n\n    isRenewDisabled: computed('expiringScheduledExportsCountDisplay', 'isRenewing', function () {\n        return this.get('expiringScheduledExportsCountDisplay') === 0 || this.get('isRenewing');\n    }),\n\n    actions: {\n        renewExpiringExports: async function () {\n            try {\n                this.set('isRenewing', true);\n                const expiringExportsResponse = await this.get('engageanalytics').renewExpiringExports();\n\n                if (expiringExportsResponse === '') {\n                    this.get('notification').info(\n                        null,\n                        this.get('intl').t('components.inbox.exportExpiration.renewExpiringSuccess')\n                    );\n                    this.set('isRenewing', false);\n                }\n            } catch (error: unknown) {\n                this.set('isRenewing', false);\n                this.get('notification').error(\n                    null,\n                    this.get('intl').t('components.inbox.exportExpiration.renewExpiringFailure')\n                );\n                console.error('Failed to renew expiring scheduled exports', { error });\n            }\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n\n        this.set(\n            'tooltip',\n            this.get('intl').t('components.inbox.exportExpiration.tooltip', { days: exportsExpiringSoonDays })\n        );\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"eW88f6/f\",\"block\":\"[[[10,0],[14,0,\\\"inbox-message export-expiration-container\\\"],[12],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"expired-expiring-exports\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"expired\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"expired-title\\\"],[12],[1,\\\" \\\"],[1,[28,[35,0],[\\\"components.inbox.exportExpiration.expired\\\"],null]],[1,\\\" \\\"],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"count-container\\\"],[12],[1,\\\"\\\\n                \\\"],[10,1],[14,0,\\\"scheduled-export-count\\\"],[12],[1,\\\" \\\"],[1,[34,1]],[1,\\\" \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,3],[[[1,\\\"                    \\\"],[10,1],[14,0,\\\"scheduled-export-plus\\\"],[12],[1,\\\" \\\"],[1,[28,[35,0],[\\\"components.inbox.exportExpiration.plus\\\"],null]],[1,\\\" \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[14,0,\\\"expiring\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"expiring-title\\\"],[12],[1,\\\" \\\"],[1,[28,[35,0],[\\\"components.inbox.exportExpiration.exportsExpiringSoon\\\"],null]],[1,\\\" \\\"],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"count-container\\\"],[12],[1,\\\"\\\\n                \\\"],[10,1],[14,0,\\\"scheduled-export-count\\\"],[15,\\\"title\\\",[29,[[36,4]]]],[12],[1,\\\"\\\\n                    \\\"],[1,[34,5]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"renew-view-options\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"renew-expiring-exports\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-button\\\"],[14,0,\\\"renew-expiring-exports-button\\\"],[15,\\\"aria-label\\\",[28,[37,0],[\\\"components.inbox.exportExpiration.renewExpiringExports\\\"],null]],[15,\\\"gux-title\\\",[28,[37,0],[\\\"components.inbox.exportExpiration.renewExpiringExports\\\"],null]],[14,\\\"accent\\\",\\\"primary\\\"],[15,\\\"onclick\\\",[28,[37,6],[[30,0],\\\"renewExpiringExports\\\"],null]],[14,\\\"role\\\",\\\"button\\\"],[15,\\\"disabled\\\",[36,7]],[12],[1,\\\"\\\\n\\\"],[41,[33,8],[[[1,\\\"                    \\\"],[1,[28,[35,0],[\\\"components.inbox.exportExpiration.renewing\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[1,[28,[35,0],[\\\"components.inbox.exportExpiration.renewExpiringExports\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,3],[14,0,\\\"link-to-scheduled-exports\\\"],[14,6,\\\"#/analytics/scheduledExports\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,0],[\\\"components.inbox.exportExpiration.viewScheduledExports\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"t\\\",\\\"expiredScheduledExportsCountDisplay\\\",\\\"if\\\",\\\"tooManyExpiredScheduledExports\\\",\\\"tooltip\\\",\\\"expiringScheduledExportsCountDisplay\\\",\\\"action\\\",\\\"isRenewDisabled\\\",\\\"isRenewing\\\"]]\",\"moduleName\":\"web-directory/components/inbox-panel-v2/export-expiration-summary/template.hbs\",\"isStrictMode\":false});","import { readOnly } from '@ember/object/computed';\nimport { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@ember/component';\nimport moment from '../../../utils/dates';\nimport { formatDateForDisplay } from 'web-directory/utils/date-time';\n\nexport default Component.extend({\n    classNames: ['inbox-message', 'learning-assignments-message', 'clickable', 'learning-assignments'],\n    classNameBindings: ['isUnread:unread'],\n    hovered: false,\n    application: service(),\n    clock: service(),\n    intl: service(),\n    session: service(),\n    frameService: service('center-stage-frame'),\n\n    mouseEnter: function () {\n        this.set('hovered', true);\n    },\n\n    mouseLeave: function () {\n        this.set('hovered', false);\n    },\n\n    actions: {\n        openAssignment: function () {\n            const assignment = this.learningAssignment;\n            const appsUri = this.get('application.purecloudAppsUri');\n\n            const centerStageClients = this.get('frameService.centerStageClients');\n            const learningAppUri = new URL(centerStageClients.learningModules.url);\n            const assignmentUri = new URL(`${learningAppUri.pathname}#/assignments/${assignment.id}`, appsUri);\n\n            window.open(assignmentUri.href, '_blank');\n            this.set('showDropdown', false);\n        },\n        openDevelopmentPlan: function () {\n            const appsUri = this.get('application.purecloudAppsUri');\n            const startDate = moment(this.get('learningAssignment.dateRecommendedForCompletion'))\n                .startOf('week')\n                .format('YYYY-MM-DD');\n            const endDate = moment(startDate).add(1, 'years').format('YYYY-MM-DD');\n            const path = `/directory/#/analytics/agents/development/me?dateSpan=custom&start=${startDate}&end=${endDate}&intervalKeyValue=Due`;\n            const developmentUri = new URL(path, appsUri);\n            window.open(developmentUri.href, '_self');\n            this.set('showDropdown', false);\n        }\n    },\n\n    isModuleOverdue: computed('learningAssignment.isOverdue', 'session.features', function () {\n        const isOverdue = this.get('learningAssignment.isOverdue');\n        const isFeatureToggleEnabled = this.get('session.features')['learning.release.assessment.ui'];\n        return isOverdue && isFeatureToggleEnabled;\n    }),\n\n    isUnread: computed('learningAssignment.state', function () {\n        const assignment = this.learningAssignment;\n        return assignment.state === 'Assigned' || assignment.state === 'InvalidSchedule';\n    }),\n\n    date: readOnly('learningAssignment.dateRecommendedForCompletion'),\n\n    date2: computed('learningAssignment.dateRecommendedForCompletion', function () {\n        return formatDateForDisplay(this.get('learningAssignment.dateRecommendedForCompletion'), 'medium');\n    }),\n\n    time: computed('learningAssignment.dateRecommendedForCompletion', function () {\n        const date = moment(this.get('learningAssignment.dateRecommendedForCompletion'));\n        return date.locale(this.get('intl.isoLocale')).format('LT');\n    }),\n\n    startTime: computed(\n        'learningAssignment.dateRecommendedForCompletion',\n        'learningAssignment.module.lengthInMinutes',\n        function () {\n            const date = moment(this.get('learningAssignment.dateRecommendedForCompletion'));\n            const duration = moment.duration(this.get('learningAssignment.lengthInMinutes'), 'minutes');\n            const startTime = date.subtract(duration);\n            return startTime.toISOString();\n        }\n    ),\n\n    duration: computed('learningAssignment.lengthInMinutes', function () {\n        const duration = this.get('learningAssignment.lengthInMinutes');\n        const hours = Math.floor(duration / 60);\n        const minutes = Math.floor(duration % 60);\n        if (hours) {\n            return this.intl.t('components.timeElapsed.detail.hoursMinutes', { hours: hours, minutes: minutes });\n        }\n        return this.intl.t('components.timeElapsed.detail.minutes', { minutes: minutes });\n    }),\n\n    dateFromNow: computed('clock.minute', 'learningAssignment.dateRecommendedForCompletion', function () {\n        // Consume clock.minute to establish Glimmer autotracking (Ember 3.28 compatibility)\n        this.get('clock.minute');\n        const date = moment(this.get('learningAssignment.dateRecommendedForCompletion'));\n        return date.locale(this.get('intl.isoLocale')).fromNow();\n    }),\n\n    hasSchedule: computed('learningAssignment.lengthInMinutes', function () {\n        return !!this.get('learningAssignment.lengthInMinutes');\n    }),\n\n    shouldShowInvalidMessage: computed('learningAssignment.state', function () {\n        return this.get('learningAssignment.state') === 'InvalidSchedule';\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"akGEA3sc\",\"block\":\"[[[10,0],[14,0,\\\"inbox-row\\\"],[12],[1,\\\"\\\\n    \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"right\\\"],[4,[38,0],[[30,0],\\\"openAssignment\\\"],null],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"information col-sm-8\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"ib-details\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[12],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"assignment-name\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"strong\\\"],[12],[1,[33,1,[\\\"module\\\",\\\"name\\\"]]],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"assignment-due-date\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,3],[[[1,\\\"                        \\\"],[10,1],[14,0,\\\"due-date-message\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,4],[\\\"notification.inbox.learningAssignment.messageWfm\\\"],[[\\\"date\\\",\\\"time\\\",\\\"duration\\\"],[[33,5],[33,6],[33,7]]]]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,1],[14,0,\\\"due-date-message\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,4],[\\\"notification.inbox.learningAssignment.message\\\"],[[\\\"dueDate\\\"],[[33,5]]]]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,8],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"assignment-overdue\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,1],[14,0,\\\"module-assignment-overdue\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"overdue-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/ic-alert-triangle\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                            \\\"],[1,[28,[35,4],[\\\"notification.inbox.learningAssignment.overdueMessage\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,9],[[[1,\\\"                    \\\"],[10,1],[14,0,\\\"learning-assignment-invalid\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"invalid-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/ic-alert-octo\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,[28,[35,4],[\\\"notification.inbox.learningAssignment.assignmentScheduleInvalid\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"ib-time\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,10],[[[1,\\\"                \\\"],[10,\\\"gux-date-beta\\\"],[15,\\\"datetime\\\",[29,[[36,11]]]],[14,\\\"format\\\",\\\"full\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-time-beta\\\"],[15,\\\"datetime\\\",[29,[[36,11]]]],[14,\\\"format\\\",\\\"short\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                \\\"],[1,[34,12]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,13],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"ib-action\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"dropdown pull-left\\\"],[12],[1,\\\"\\\\n\\\"],[6,[39,14],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[[33,15],\\\"inbox-panel-v2.learning-assignments \\\"]],[[\\\"default\\\"],[[[[1,\\\"                    \\\"],[10,\\\"button\\\"],[14,0,\\\"btn btn-link btn-sm dropdown-toggle menu-selector\\\"],[15,\\\"aria-label\\\",[28,[37,4],[\\\"common.more\\\"],null]],[15,1,[29,[[30,0,[\\\"elementId\\\"]],\\\"-dropdownMenu\\\"]]],[14,\\\"aria-haspopup\\\",\\\"true\\\"],[15,\\\"aria-expanded\\\",[29,[[36,15]]]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"menu-kebab-horizontal\\\"],[15,\\\"screenreader-text\\\",[28,[37,4],[\\\"common.more\\\"],null]],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"ul\\\"],[15,0,[29,[\\\"dropdown-menu \\\",[52,[33,15],\\\"show\\\"]]]],[15,\\\"aria-labelledby\\\",[29,[[30,0,[\\\"elementId\\\"]],\\\"-dropdownMenu\\\"]]],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n                            \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link details\\\"],[24,4,\\\"button\\\"],[4,[38,0],[[30,0],\\\"openAssignment\\\"],null],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,4],[\\\"components.inbox.actions.viewDetails\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n                            \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link development-plan\\\"],[24,4,\\\"button\\\"],[4,[38,0],[[30,0],\\\"openDevelopmentPlan\\\"],null],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,4],[\\\"components.inbox.actions.viewDevelopmentPlan\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13]],[],false,[\\\"action\\\",\\\"learningAssignment\\\",\\\"if\\\",\\\"hasSchedule\\\",\\\"t\\\",\\\"date2\\\",\\\"startTime\\\",\\\"duration\\\",\\\"isModuleOverdue\\\",\\\"shouldShowInvalidMessage\\\",\\\"hovered\\\",\\\"date\\\",\\\"dateFromNow\\\",\\\"hasDevelopmentPlan\\\",\\\"drop-down\\\",\\\"showDropdown\\\"]]\",\"moduleName\":\"web-directory/components/inbox-panel-v2/learning-assignments/template.hbs\",\"isStrictMode\":false});","import { lt, not } from '@ember/object/computed';\nimport Component from '@ember/component';\n\nexport default Component.extend({\n    classNames: ['notes-editor'],\n\n    recording: null,\n\n    notes: '',\n\n    attrs: {\n        save: () => {},\n        cancel: () => {}\n    },\n\n    actions: {\n        setNotes(event) {\n            this.set('notes', event.target.value);\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n\n        this.set('notes', this.get('recording.note') || '');\n    },\n\n    isValid: lt('notes.length', 2000),\n    saveDisabled: not('isValid')\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"2JMOw7uM\",\"block\":\"[[[10,\\\"textarea\\\"],[14,0,\\\"form-control note-field\\\"],[15,\\\"oninput\\\",[28,[37,0],[[30,0],\\\"setNotes\\\"],[[\\\"on\\\"],[\\\"input\\\"]]]],[12],[1,[33,1,[\\\"note\\\"]]],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"buttons\\\"],[12],[1,\\\"\\\\n    \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link save-notes-button\\\"],[16,\\\"disabled\\\",[36,2]],[24,4,\\\"button\\\"],[4,[38,0],[[30,0],[33,3],[33,4]],null],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,5],[\\\"common.save\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link cancel-notes-button\\\"],[24,4,\\\"button\\\"],[4,[38,0],[[30,0],[33,6]],null],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,5],[\\\"common.cancel\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,2],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"error-message\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,5],[\\\"components.inbox.notesTooLong\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[],false,[\\\"action\\\",\\\"recording\\\",\\\"saveDisabled\\\",\\\"save\\\",\\\"notes\\\",\\\"t\\\",\\\"cancel\\\",\\\"if\\\"]]\",\"moduleName\":\"web-directory/components/inbox-panel-v2/notes-editor/template.hbs\",\"isStrictMode\":false});","import { reads, not, readOnly } from '@ember/object/computed';\nimport { resolve } from 'rsvp';\nimport { inject as service } from '@ember/service';\nimport { computed, set } from '@ember/object';\nimport Component from '@ember/component';\nimport moment from 'web-directory/utils/dates';\nimport { buildDetailPageRoute } from 'web-directory/utils/reporting-alert-summary/reporting-alert-summary';\n\nexport default Component.extend({\n    classNames: ['inbox-message', 'reporting-alert-entry'],\n    classNameBindings: ['isAlertRead:read:unread', 'alert.id'],\n\n    inbox: service(),\n    intl: service(),\n    notification: service(),\n    permissions: service(),\n    session: service(),\n    clock: service(),\n    application: service(),\n    ajax: service(),\n    sidebar: service(),\n\n    hovered: false,\n    showDropdown: false,\n    hasAlertSummary: false,\n\n    canDeleteAlert: reads('permissions.canDeleteReportingAlerts'),\n\n    canEditAlert: reads('permissions.canEditReportingAlerts'),\n\n    canEditAlertRule: reads('permissions.canEditReportingAlertRules'),\n\n    isAlertMuted: computed('reportingAlert.dateMutedUntil', function () {\n        const now = moment();\n        const mutedUntil = moment(this.get('reportingAlert.dateMutedUntil'));\n        return now.isBefore(mutedUntil);\n    }),\n\n    isAlertSnoozed: computed('reportingAlert.dateSnoozedUntil', function () {\n        const now = moment();\n        const snoozedUntil = moment(this.get('reportingAlert.dateSnoozedUntil'));\n        return now.isBefore(snoozedUntil);\n    }),\n\n    // An alert can only be snoozed or muted, not both at the same time, and you also can't re-snooze or mute a currently snoozed/muted alert\n    isSnoozingOrMutingAllowed: computed('isAlertSnoozed', 'isAlertMuted', function () {\n        const isAlertSnoozed = this.isAlertSnoozed;\n        const isAlertMuted = this.isAlertMuted;\n        return !isAlertSnoozed && !isAlertMuted;\n    }),\n\n    timeSinceCreation: computed('clock.minute', 'reportingAlert.dateStart', function () {\n        // Consume clock.minute to establish Glimmer autotracking (Ember 3.28 compatibility)\n        this.get('clock.minute');\n        moment.relativeTimeThreshold('m', 60);\n        const date = moment(this.get('reportingAlert.dateStart'));\n        return date.fromNow();\n    }),\n\n    creationTime: computed('reportingAlert.dateStart', function () {\n        return moment(this.get('reportingAlert.dateStart')).format('LL LT');\n    }),\n\n    mutedUntil: computed('reportingAlert.dateMutedUntil', function () {\n        const date = moment(this.get('reportingAlert.dateMutedUntil')).format('LL LT');\n        return this.intl.t('components.inbox.alertMuted', { date });\n    }),\n\n    snoozedUntil: computed('reportingAlert.dateSnoozedUntil', function () {\n        const date = moment(this.get('reportingAlert.dateSnoozedUntil')).format('LL LT');\n        return this.intl.t('components.inbox.alertSnoozed', { date });\n    }),\n\n    isAlertRead: not('reportingAlert.unread'),\n\n    canViewLinkToInteractionDetails: readOnly('permissions.canViewInteractionDetails'),\n    canViewLinkToAgentStatusDetail: readOnly('permissions.canViewAgentStatus'),\n    canViewLinkToQueuePerformanceDetail: readOnly('permissions.canViewQueuePerformance'),\n    canViewLinkToAgentPerformanceDetail: readOnly('permissions.canViewAgentPerformance'),\n\n    linkToDetailsPage: computed(\n        'reportingAlert.alertSummary',\n        'canViewLinkToInteractionDetails',\n        'canViewLinkToAgentStatusDetail',\n        'canViewLinkQueuePerformanceDetail',\n        'canViewLinkToAgentPerformanceDetail',\n        function () {\n            const permissions = {\n                canViewInteractionDetails: this.canViewLinkToInteractionDetails,\n                canViewAgentStatusDetails: this.canViewLinkToAgentStatusDetail,\n                canViewAgentPerformanceDetails: this.canViewLinkToAgentPerformanceDetail,\n                canViewQueuePerformance: this.canViewLinkToQueuePerformanceDetail\n            };\n\n            return buildDetailPageRoute(this.get('reportingAlert.alertSummary'), permissions);\n        }\n    ),\n\n    toggleDropdown() {\n        this.toggleProperty('showDropdown');\n    },\n\n    hideDropdown() {\n        this.set('showDropdown', false);\n    },\n\n    mouseEnter() {\n        this.set('hovered', true);\n    },\n\n    mouseLeave() {\n        this.set('hovered', false);\n    },\n\n    deleteAlert() {\n        this.hideDropdown();\n        this.inbox.deleteAlert(this.reportingAlert);\n    },\n\n    cancelAlert() {\n        this.hideDropdown();\n        this.inbox.cancelAlert(this.reportingAlert);\n    },\n\n    changeStatus(newReadStatus) {\n        this.hideDropdown();\n        if (newReadStatus !== this.get('reportingAlert.unread')) {\n            return this.inbox.changeReportingAlertReadState(this.reportingAlert, newReadStatus);\n        }\n        return resolve();\n    },\n\n    goToAlertRule() {\n        if (this.canEditAlertRule) {\n            const ruleId = this.get('reportingAlert.rule.id');\n            const route = `#/analytics/alerting/rules/${ruleId}/configure`;\n            window.location.hash = route;\n            this.sidebar.ensureRouteVisibility();\n        }\n    },\n\n    async snoozeAlert() {\n        this.hideDropdown();\n        const snoozeOptions = {\n            type: 'Snooze',\n            dateStart: moment().toISOString(),\n            dateEnd: moment().add(15, 'minutes').toISOString()\n        };\n        const result = await this.inbox.updateReportingAlert(this.reportingAlert, snoozeOptions);\n        if (result) {\n            set(this.reportingAlert, 'snoozed', result.snoozed);\n            set(this.reportingAlert, 'dateSnoozedUntil', result.dateSnoozedUntil);\n        }\n    },\n\n    async muteAlert() {\n        this.hideDropdown();\n        const muteOptions = {\n            type: 'Mute',\n            dateStart: moment().toISOString(),\n            dateEnd: moment().add(15, 'minutes').toISOString()\n        };\n        const result = await this.inbox.updateReportingAlert(this.reportingAlert, muteOptions);\n        if (result) {\n            set(this.reportingAlert, 'muted', result.muted);\n            set(this.reportingAlert, 'dateMutedUntil', result.dateMutedUntil);\n        }\n    },\n\n    _getId() {\n        return this.get('reportingAlert.id');\n    },\n\n    actions: {\n        setHasAlertSummary() {\n            this.set('hasAlertSummary', true);\n        }\n    }\n});\n","import Component from '@ember/component';\nimport { inject } from '@ember/service';\nimport { readOnly } from '@ember/object/computed';\nimport { resolve } from 'rsvp';\nimport { ReportingAlertSummary } from 'web-directory/utils/reporting-alert-summary/reporting-alert-summary';\nimport { warnClosureAction } from 'web-directory/utils/acd';\nimport TtlCache from 'web-directory/utils/ttl-cache';\n\nexport default Component.extend({\n    intl: inject('intl'),\n    engageanalytics: inject('engageanalytics'),\n    queueService: inject('queue'),\n    logger: inject('stash-logger'),\n\n    alertSummary: readOnly('reportingAlert.alertSummary'),\n    ruleName: readOnly('reportingAlert.rule.name'),\n\n    mainEntity: '',\n    otherEntityDetails: resolve([]),\n    ruleNameSeparator: '',\n    inboxService: {},\n\n    /**\n     * @action\n     * When the reporting alert has alert summary, then this action is supposed to\n     * set has-alert-summary class in the parent component's element(s).\n     */\n    setHasAlertSummary: () => warnClosureAction('actionSetHasAlertSummary', null),\n\n    init() {\n        this._super(...arguments);\n\n        const inboxService: Record<string, TtlCache<string | undefined>> = this.get('inboxService');\n\n        const reportingAlertSummary = new ReportingAlertSummary({\n            ruleName: this.get('ruleName'),\n            alertSummary: this.get('alertSummary'),\n            intl: this.get('intl'),\n            cache: inboxService.cache,\n            queueService: this.get('queueService'),\n            engageanalytics: this.get('engageanalytics'),\n            logger: this.get('logger')\n        });\n\n        const mainEntity = reportingAlertSummary.getMainEntity();\n        const ruleNameSeparator = mainEntity ? ' - ' : '';\n\n        this.setProperties({\n            mainEntity,\n            ruleNameSeparator,\n            otherEntityDetails: reportingAlertSummary.getOtherEntities()\n        });\n\n        if (reportingAlertSummary.hasOtherEntityDetails()) {\n            this.get('setHasAlertSummary')();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"WnbZqHGl\",\"block\":\"[[[10,0],[14,0,\\\"reporting-alert-summary name\\\"],[12],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"reporting-alert-rule-name-container\\\"],[12],[1,\\\"\\\\n        \\\"],[10,2],[14,0,\\\"reporting-alert-rule-name\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,0],[\\\"notification.inbox.reportingAlertSummary.ruleName\\\"],[[\\\"mainEntity\\\",\\\"ruleName\\\",\\\"separator\\\"],[[33,1],[33,2],[33,3]]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"reporting-alert-entity-details-container\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,5],[[28,[37,5],[[28,[37,6],[[33,7]],null]],null]],null],null,[[[41,[30,1,[\\\"names\\\"]],[[[1,\\\"                \\\"],[10,2],[14,0,\\\"reporting-alert-entity-detail\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,0],[\\\"notification.inbox.reportingAlertSummary.entityDetail\\\"],[[\\\"type\\\",\\\"names\\\"],[[30,1,[\\\"type\\\"]],[30,1,[\\\"names\\\"]]]]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[1]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[13]],[\\\"otherEntityDetail\\\"],false,[\\\"t\\\",\\\"mainEntity\\\",\\\"ruleName\\\",\\\"ruleNameSeparator\\\",\\\"each\\\",\\\"-track-array\\\",\\\"await\\\",\\\"otherEntityDetails\\\",\\\"if\\\"]]\",\"moduleName\":\"web-directory/components/inbox-panel-v2/reporting-alert/reporting-alert-summary/template.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"xnXqroJg\",\"block\":\"[[[10,0],[14,0,\\\"inbox-row\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"file-details\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,0],null,[[\\\"inboxService\\\",\\\"reportingAlert\\\",\\\"setHasAlertSummary\\\"],[[33,1],[33,2],[28,[37,3],[[30,0],\\\"setHasAlertSummary\\\"],null]]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[15,0,[29,[\\\"time-container ib-time \\\",[52,[33,5],\\\"has-alert-summary\\\"]]]],[12],[1,\\\"\\\\n        \\\"],[10,1],[14,0,\\\"time\\\"],[12],[1,\\\" \\\"],[1,[52,[33,6],[33,7],[33,8]]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"action-container\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"status-icon-container\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,2,[\\\"muted\\\"]],[[[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[15,1,[29,[[36,9],\\\"-muted-icon\\\"]]],[14,0,\\\"muted-alert-icon\\\"],[14,\\\"icon-name\\\",\\\"volume-disable\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,9],\\\"-muted-icon\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[34,10]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,2,[\\\"snoozed\\\"]],[[[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[15,1,[29,[[36,9],\\\"-snoozed-icon\\\"]]],[14,0,\\\"snoozed-alert-icon\\\"],[14,\\\"icon-name\\\",\\\"clock-outline\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,9],\\\"-snoozed-icon\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[34,11]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[14,0,\\\"ib-action\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"dropdown pull-left\\\"],[12],[1,\\\"\\\\n\\\"],[6,[39,12],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[[33,13],\\\"inbox-panel-v2.reporting-alert\\\"]],[[\\\"default\\\"],[[[[1,\\\"                    \\\"],[10,\\\"button\\\"],[14,0,\\\"btn btn-link btn-sm dropdown-toggle menu-selector\\\"],[15,\\\"aria-label\\\",[28,[37,14],[\\\"common.more\\\"],null]],[15,1,[29,[[30,0,[\\\"elementId\\\"]],\\\"-dropdownMenu\\\"]]],[14,\\\"aria-haspopup\\\",\\\"true\\\"],[15,\\\"aria-expanded\\\",[29,[[36,13]]]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"menu-kebab-horizontal\\\"],[15,\\\"screenreader-text\\\",[28,[37,14],[\\\"common.more\\\"],null]],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\\n                    \\\"],[10,\\\"ul\\\"],[15,0,[29,[\\\"dropdown-menu \\\",[52,[33,13],\\\"show\\\"]]]],[15,\\\"aria-labelledby\\\",[29,[[30,0,[\\\"elementId\\\"]],\\\"-dropdownMenu\\\"]]],[12],[1,\\\"\\\\n\\\"],[41,[33,15],[[[1,\\\"                            \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n                                \\\"],[10,3],[14,0,\\\"btn btn-link link-to-details\\\"],[15,6,[36,15]],[12],[1,\\\"\\\\n                                    \\\"],[1,[28,[35,14],[\\\"components.inbox.actions.viewDetails\\\"],null]],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,16],[[[1,\\\"                            \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n                                \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"btn btn-link toggle-read-unread\\\"],[4,[38,3],[[30,0],[33,17],[33,18]],null],[12],[1,\\\"\\\\n                                    \\\"],[1,[28,[35,14],[[28,[37,19],[\\\"components.inbox.actions.markAs\\\",[52,[33,18],\\\"Unread\\\",\\\"Read\\\"]],null]],null]],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,20],[[[1,\\\"                            \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n                                \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"btn btn-link snooze-alert\\\"],[4,[38,3],[[30,0],[33,21]],null],[12],[1,\\\"\\\\n                                    \\\"],[1,[28,[35,14],[\\\"components.inbox.actions.snoozeAlert\\\"],null]],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\\n                            \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n                                \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"btn btn-link mute-alert\\\"],[4,[38,3],[[30,0],[33,22]],null],[12],[1,\\\"\\\\n                                    \\\"],[1,[28,[35,14],[\\\"components.inbox.actions.muteAlert\\\"],null]],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,23],[[[1,\\\"                            \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n                                \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"btn btn-link edit\\\"],[4,[38,3],[[30,0],[33,24]],null],[12],[1,\\\"\\\\n                                    \\\"],[1,[28,[35,14],[\\\"components.inbox.actions.viewRule\\\"],null]],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,25],[[[1,\\\"                            \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n                                \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"btn btn-link delete\\\"],[4,[38,3],[[30,0],[33,26]],null],[12],[1,\\\"\\\\n                                    \\\"],[1,[28,[35,14],[\\\"components.inbox.actions.deleteAlert\\\"],null]],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"inbox-panel-v2/reporting-alert/reporting-alert-summary\\\",\\\"inbox\\\",\\\"reportingAlert\\\",\\\"action\\\",\\\"if\\\",\\\"hasAlertSummary\\\",\\\"hovered\\\",\\\"creationTime\\\",\\\"timeSinceCreation\\\",\\\"elementId\\\",\\\"mutedUntil\\\",\\\"snoozedUntil\\\",\\\"drop-down\\\",\\\"showDropdown\\\",\\\"t\\\",\\\"linkToDetailsPage\\\",\\\"canEditAlert\\\",\\\"changeStatus\\\",\\\"isAlertRead\\\",\\\"concat\\\",\\\"isSnoozingOrMutingAllowed\\\",\\\"snoozeAlert\\\",\\\"muteAlert\\\",\\\"canEditAlertRule\\\",\\\"goToAlertRule\\\",\\\"canDeleteAlert\\\",\\\"deleteAlert\\\"]]\",\"moduleName\":\"web-directory/components/inbox-panel-v2/reporting-alert/template.hbs\",\"isStrictMode\":false});","import { bool, reads, equal, gt } from '@ember/object/computed';\nimport { run } from '@ember/runloop';\nimport { resolve } from 'rsvp';\nimport { htmlSafe } from '@ember/template';\nimport { inject as service } from '@ember/service';\nimport { computed } from '@ember/object';\nimport Component from '@ember/component';\nimport moment from 'web-directory/utils/dates';\nimport Clipboard from 'clipboard';\n\nconst EMAIL_STATUS_FAILED = 'Failed';\nconst EMAIL_STATUS_PENDING = 'Pending';\nconst EXPORT_FORMAT_PDF = 'PDF';\nconst EMAIL_ERROR_DESCRIPTION_SUBSTRING = 'maximum upload size';\n\nconst CATEGORY_AGGREGATES_VIEW_TYPES = new Set([\n    'TOPIC_TREND_SUMMARY_VIEW',\n    'TOPIC_TREND_DETAIL_VIEW',\n    'AGENT_TOPIC_SUMMARY_VIEW',\n    'AGENT_TOPIC_DETAIL_VIEW',\n    'QUEUE_TOPIC_SUMMARY_VIEW',\n    'QUEUE_TOPIC_DETAIL_VIEW',\n    'FLOW_TOPIC_SUMMARY_VIEW',\n    'FLOW_TOPIC_DETAIL_VIEW'\n]);\n\nexport default Component.extend({\n    classNames: ['inbox-message', 'reporting-export-entry'],\n    classNameBindings: ['isExportRead:read:unread', 'reportingExport.id'],\n\n    inbox: service(),\n    intl: service(),\n    notification: service(),\n    permissions: service(),\n    session: service(),\n    clock: service(),\n    application: service(),\n    ajax: service(),\n\n    hovered: false,\n    showDropdown: false,\n    copyExportButton: null,\n    copyStaticLinkButton: null,\n    isCopyStaticLinkEnabled: false,\n\n    canRunNow: computed('reportingExport.status', 'reportingExport.exportAllowedToRerun', function () {\n        // Failed Exports with exportAllowedToRerun: true\n        return this.get('reportingExport.status') === 'FAILED' && this.get('reportingExport.exportAllowedToRerun');\n    }),\n\n    hasStaticLink: bool('reportingExport.scheduleStaticLinkUrl'),\n\n    canDeleteExport: reads('permissions.canDeleteReportingExports'),\n\n    canEditExport: reads('permissions.canEditReportingExports'),\n\n    timeSinceCreation: computed('clock.minute', 'reportingExport.createdDateTime', function () {\n        // Consume clock.minute to establish Glimmer autotracking (Ember 3.28 compatibility)\n        this.get('clock.minute');\n        moment.relativeTimeThreshold('m', 60);\n        const date = moment(this.get('reportingExport.createdDateTime'));\n        return date.fromNow();\n    }),\n\n    isPdf: equal('reportingExport.exportFormat', EXPORT_FORMAT_PDF),\n\n    downloadAriaText: computed('reportingExport.name', function () {\n        const exportName = this.get('reportingExport.name') || '';\n        return this.get('intl').t('components.inbox.actions.downloadExport', { exportName });\n    }),\n\n    moreActionsAriaText: computed('reportingExport.name', function () {\n        const exportName = this.get('reportingExport.name') || '';\n        return this.get('intl').t('components.inbox.actions.moreActionsForExport', { exportName });\n    }),\n\n    exportViewTranslationKey: computed('reportingExport.viewType', 'session.features', function () {\n        const viewType = this.get('reportingExport.viewType');\n        if (this.get('session.features.WEM-1262_category-aggregates') && CATEGORY_AGGREGATES_VIEW_TYPES.has(viewType)) {\n            return `components.inbox.exportViewsCategoryAggregates.${viewType}`;\n        }\n        return `components.inbox.exportViews.${viewType}`;\n    }),\n\n    creationTime: computed('reportingExport.createdDateTime', function () {\n        return moment(this.get('reportingExport.createdDateTime')).format('LL LT');\n    }),\n\n    isExportRead: computed('reportingExport.read', 'reportingExport.status', function () {\n        return (\n            this.get('reportingExport.read') ||\n            (this.get('reportingExport.status') !== 'COMPLETED' &&\n                this.get('reportingExport.status') !== 'COMPLETED_WITH_PARTIAL_RESULTS')\n        );\n    }),\n\n    didEmailFail: computed('reportingExport.emailStatuses', function () {\n        const emailStatuses = this.get('reportingExport.emailStatuses');\n        if (emailStatuses) {\n            return Object.values(emailStatuses).includes(EMAIL_STATUS_FAILED);\n        }\n\n        return false;\n    }),\n\n    isEmailPending: computed('reportingExport.emailStatuses', function () {\n        const emailStatuses = this.get('reportingExport.emailStatuses');\n        if (emailStatuses) {\n            return Object.values(emailStatuses).includes(EMAIL_STATUS_PENDING);\n        }\n\n        return false;\n    }),\n\n    isEmailedExportFileTooLarge: computed('reportingExport.errorEmailDescription', function () {\n        const emailErrorDescription = this.get('reportingExport.emailErrorDescription') || '';\n        return emailErrorDescription.indexOf(EMAIL_ERROR_DESCRIPTION_SUBSTRING) > -1;\n    }),\n\n    emailStatusesValues: computed('reportingExport.emailStatuses', function () {\n        const emailStatuses = this.get('reportingExport.emailStatuses');\n        let emailStatusList = [];\n        if (emailStatuses) {\n            Object.keys(emailStatuses).forEach(address => {\n                const status = emailStatuses[address];\n                if (address && status) {\n                    const statusText = this.intl.t(`components.inbox.emailExport.${status}`, {\n                        address\n                    });\n                    emailStatusList.push(statusText);\n                }\n            });\n        }\n        return emailStatusList;\n    }),\n\n    isEmailRecipientListPresent: gt('emailStatusesValues.length', 0),\n\n    percentageComplete: computed('reportingExport', function () {\n        let percentage = 0;\n        if (this.get('reportingExport.percentageComplete')) {\n            percentage = this.get('reportingExport.percentageComplete');\n        }\n        return `${(100 * percentage).toFixed(0)}%`;\n    }),\n\n    percentageStyle: computed('percentageComplete', function () {\n        return htmlSafe(`width: ${this.percentageComplete};`);\n    }),\n\n    exportSchedule: computed('reportingExport.scheduleExpression', function () {\n        const schedule = this.get('reportingExport.scheduleExpression');\n        if (schedule) {\n            return this.convertCronScheduleToHuman(schedule);\n        }\n    }),\n\n    /**\n     * @desc Takes a quartz cron expression and converts it to a localized 'human friendly' string\n     * @param {string} cronString a quartz cron expression, such as '0 1 4 * * ?'\n     * @returns {string} localized human-friendly representation of the schedule expression, such as \"Daily at 4:00 AM\"\n     */\n    convertCronScheduleToHuman(cronString) {\n        const intl = this.intl;\n        const cronValues = cronString.split(' ');\n\n        const isWildCard = value => {\n            return value === '*' || value === '?';\n        };\n\n        const humanValues = cronValues.map(v => {\n            const isSet = !isWildCard(v);\n            return isSet ? v : undefined;\n        });\n\n        const hour = humanValues[2];\n        const minute = humanValues[1];\n        let time;\n\n        if (hour && minute) {\n            const times = hour.split(',').map(hour => {\n                return moment().hour(hour).minute(minute).format('LT');\n            });\n            time = times.join(', ');\n        }\n\n        const day = humanValues[5];\n\n        let days;\n        if (day) {\n            days = day\n                .split(',')\n                .map(day => {\n                    return intl.t(`components.inbox.exportSchedule.weekdays.${day}`);\n                })\n                .join(', ');\n        }\n\n        if (humanValues[5] && days && time) {\n            return intl.t(`components.inbox.exportSchedule.timeAndDays`, { time, days });\n        } else if (humanValues[4] && time) {\n            const quarterday = humanValues[4];\n            return intl.t(`components.inbox.exportSchedule.quarterly`, { quarterday, time });\n        } else if (humanValues[3] && time) {\n            const monthday = humanValues[3];\n            return intl.t(`components.inbox.exportSchedule.monthly`, { monthday, time });\n        } else if (humanValues[2] && time) {\n            return intl.t(`components.inbox.exportSchedule.timeAndDays`, { time, days });\n        } else if (humanValues[1]) {\n            const minutes = humanValues[1];\n            return intl.t(`components.inbox.exportSchedule.hourly`, { minutes });\n        }\n    },\n\n    toggleDropdown() {\n        this.toggleProperty('showDropdown');\n    },\n\n    hideDropdown() {\n        this.set('showDropdown', false);\n    },\n\n    mouseEnter() {\n        this.set('hovered', true);\n    },\n\n    mouseLeave() {\n        this.set('hovered', false);\n    },\n\n    deleteExport() {\n        this.hideDropdown();\n        this.inbox.deleteExport(this.reportingExport);\n    },\n\n    cancelExport() {\n        this.hideDropdown();\n        this.inbox.cancelExport(this.reportingExport);\n    },\n\n    changeStatus(newReadStatus) {\n        this.hideDropdown();\n        if (newReadStatus !== this.get('reportingExport.read')) {\n            return this.inbox.changeReportingExportReadState(this.reportingExport, newReadStatus);\n        }\n        return resolve();\n    },\n\n    async onDownload() {\n        const downloadUrl = this.get('reportingExport.downloadUrl');\n\n        if (downloadUrl) {\n            const downloadId = downloadUrl.split('/').pop();\n            const downloadResponse = await this.ajax.ajaxGet(\n                this.application.pcV2Uri(`api/v2/downloads/${downloadId}`),\n                { data: { issueRedirect: false } }\n            );\n            const s3Url = downloadResponse.url;\n            window.open(s3Url);\n            this.changeStatus(true);\n        }\n    },\n\n    onCopyExportId() {\n        this._setUpCopyButton();\n        this.hideDropdown();\n    },\n\n    onCopyStaticLink() {\n        this._setUpCopyLinkButton();\n        this.hideDropdown();\n    },\n\n    onRunNow() {\n        this.inbox.runExport(this.reportingExport);\n        this.hideDropdown();\n    },\n\n    _getId() {\n        return this.get('reportingExport.id');\n    },\n\n    _getStaticLink() {\n        if (this.hasStaticLink) {\n            return this.get('reportingExport.scheduleStaticLinkUrl');\n        }\n    },\n\n    _setUpCopyButton() {\n        if (this.copyExportButton) {\n            this.copyExportButton.off('success');\n            this.copyExportButton.off('error');\n            this.copyExportButton.destroy();\n        }\n\n        const exportId = this.get('reportingExport.id');\n        const runId = this.get('reportingExport.runId');\n\n        const btn = document\n            .getElementById(`${this.elementId}`)\n            .getElementsByClassName(`copy-export-id-${exportId}-runId-${runId}`)[0];\n        let copyButton;\n\n        if (btn) {\n            copyButton = new Clipboard(btn, {\n                text: this._getId.bind(this)\n            });\n\n            copyButton.on('success', () => {\n                run(() => {\n                    this.notification.info(null, this.intl.t('components.inbox.actions.copyExportIdSuccess'));\n                });\n            });\n            copyButton.on('error', () => {\n                run(() => {\n                    this.notification.info(null, this.intl.t('components.inbox.actions.copyExportIdFailure'));\n                });\n            });\n\n            this.set('copyExportButton', copyButton);\n        }\n    },\n\n    _setUpCopyLinkButton() {\n        if (this.copyStaticLinkButton) {\n            this.copyStaticLinkButton.off('success');\n            this.copyStaticLinkButton.off('error');\n            this.copyStaticLinkButton.destroy();\n        }\n\n        const exportId = this.get('reportingExport.id');\n        const runId = this.get('reportingExport.runId');\n\n        const btn = document\n            .getElementById(`${this.elementId}`)\n            .getElementsByClassName(`copy-static-link-${exportId}-runId-${runId}`)[0];\n        let copyButton;\n\n        if (btn) {\n            copyButton = new Clipboard(btn, {\n                text: this._getStaticLink.bind(this)\n            });\n\n            copyButton.on('success', () => {\n                run(() => {\n                    this.notification.info(null, this.intl.t('components.inbox.actions.copyStaticLinkSuccess'));\n                });\n            });\n            copyButton.on('error', () => {\n                run(() => {\n                    this.notification.info(null, this.intl.t('components.inbox.actions.copyStaticLinkFailure'));\n                });\n            });\n\n            this.set('copyStaticLinkButton', copyButton);\n        }\n    },\n\n    didInsertElement() {\n        this._setUpCopyButton();\n        this._setUpCopyLinkButton();\n    },\n\n    willDestroyElement() {\n        if (this.copyExportButton) {\n            this.copyExportButton.off('success');\n            this.copyExportButton.off('error');\n            this.copyExportButton.destroy();\n        }\n\n        if (this.copyStaticLinkButton) {\n            this.copyStaticLinkButton.off('success');\n            this.copyStaticLinkButton.off('error');\n            this.copyStaticLinkButton.destroy();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"jG2ol865\",\"block\":\"[[[10,0],[14,0,\\\"inbox-row\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"document-icon-container\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,1],[[[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"file\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"file-text\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"file-details\\\"],[12],[1,\\\"\\\\n        \\\"],[10,1],[14,0,\\\"file-name name\\\"],[15,\\\"title\\\",[33,2,[\\\"name\\\"]]],[12],[1,[33,2,[\\\"name\\\"]]],[13],[1,\\\"\\\\n        \\\"],[10,1],[14,0,\\\"view-name\\\"],[12],[1,[28,[35,3],[[33,4]],null]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"time-container ib-time\\\"],[12],[1,\\\"\\\\n        \\\"],[10,1],[14,0,\\\"time\\\"],[12],[1,\\\" \\\"],[1,[52,[33,5],[33,6],[33,7]]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"action-container\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"status-icon-container\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,8],[[33,2,[\\\"status\\\"]],\\\"COMPLETED\\\"],null],[[[1,\\\"                \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link btn-sm download-btn\\\"],[16,\\\"aria-label\\\",[36,9]],[24,4,\\\"button\\\"],[4,[38,10],[[30,0],[33,11]],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"download\\\"],[15,\\\"screenreader-text\\\",[28,[37,3],[\\\"components.inbox.actions.download\\\"],null]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,8],[[33,2,[\\\"status\\\"]],\\\"COMPLETED_WITH_PARTIAL_RESULTS\\\"],null],[[[1,\\\"                \\\"],[11,\\\"button\\\"],[16,1,[29,[[36,12],\\\"-partial-download-btn\\\"]]],[24,0,\\\"btn btn-link btn-sm download-btn\\\"],[16,\\\"aria-label\\\",[36,9]],[24,4,\\\"button\\\"],[4,[38,10],[[30,0],[33,11]],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"partial-completed-download\\\"],[14,\\\"icon-name\\\",\\\"download\\\"],[15,\\\"screenreader-text\\\",[28,[37,3],[\\\"components.inbox.actions.download\\\"],null]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,12],\\\"-partial-download-btn\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,3],[\\\"components.inbox.exportCompletedWithPartialResults\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,8],[[33,2,[\\\"status\\\"]],\\\"RUNNING\\\"],null],[[[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[15,1,[29,[[36,12],\\\"-running-icon\\\"]]],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin loading-export-icon\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,12],\\\"-running-icon\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,3],[\\\"components.inbox.exportInProgress\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,8],[[33,2,[\\\"status\\\"]],\\\"SUBMITTED\\\"],null],[[[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[15,1,[29,[[36,12],\\\"-submitted-icon\\\"]]],[14,0,\\\"submitted-export-icon\\\"],[14,\\\"icon-name\\\",\\\"clock-outline\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,12],\\\"-submitted-icon\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,3],[\\\"components.inbox.exportSubmitted\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,8],[[33,2,[\\\"status\\\"]],\\\"CANCELLING\\\"],null],[[[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[15,1,[29,[[36,12],\\\"-cancelling-icon\\\"]]],[14,0,\\\"cancelling-export-icon\\\"],[14,\\\"icon-name\\\",\\\"ban-outline\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,12],\\\"-cancelling-icon\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,3],[\\\"components.inbox.exportCancelling\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,8],[[33,2,[\\\"status\\\"]],\\\"CANCELLED\\\"],null],[[[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[15,1,[29,[[36,12],\\\"-cancelled-icon\\\"]]],[14,0,\\\"cancelled-export-icon\\\"],[14,\\\"icon-name\\\",\\\"ban-outline\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,12],\\\"-cancelled-icon\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,3],[\\\"components.inbox.exportCancelled\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,8],[[33,2,[\\\"status\\\"]],\\\"FAILED\\\"],null],[[[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[15,1,[29,[[36,12],\\\"-failed-icon\\\"]]],[14,0,\\\"export-error-icon\\\"],[14,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,12],\\\"-failed-icon\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,3],[\\\"components.inbox.exportError\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"]],[]],null]],[]]]],[]]]],[]]]],[]]]],[]]]],[]]],[1,\\\"\\\\n\\\"],[41,[33,13],[[[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[15,1,[29,[[36,12],\\\"-email-details\\\"]]],[15,0,[29,[\\\"email-details\\\",[52,[33,14],\\\" export-error-icon\\\"],[52,[33,15],\\\" export-pending-icon\\\"]]]],[14,\\\"icon-name\\\",\\\"message-email\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,12],\\\"-email-details\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,16],[[[1,\\\"                        \\\"],[1,[28,[35,3],[\\\"components.inbox.exportErrorEmailFileTooLarge\\\"],null]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[42,[28,[37,18],[[28,[37,18],[[33,19]],null]],null],null,[[[1,\\\"                        \\\"],[10,\\\"li\\\"],[14,0,\\\"export-email-entry\\\"],[12],[1,\\\"\\\\n                            \\\"],[2,[30,1]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,20],[[[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[15,1,[29,[[36,12],\\\"-schedule-details\\\"]]],[14,\\\"icon-name\\\",\\\"legacy/clock\\\"],[14,0,\\\"schedule-details\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,12],\\\"-schedule-details\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n                    \\\"],[2,[36,20]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,21],[[33,22],[28,[37,23],[[33,24],[28,[37,21],[[28,[37,8],[[33,2,[\\\"status\\\"]],\\\"COMPLETED\\\"],null],[28,[37,8],[[33,2,[\\\"status\\\"]],\\\"COMPLETED_WITH_PARTIAL_RESULTS\\\"],null]],null]],null]],null],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"ib-action\\\"],[12],[1,\\\"\\\\n\\\"],[41,[51,[28,[37,8],[[33,2,[\\\"status\\\"]],\\\"CANCELLED\\\"],null]],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"dropdown pull-left\\\"],[12],[1,\\\"\\\\n\\\"],[6,[39,26],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[[33,27],\\\"inbox-panel-v2.reporting-export\\\"]],[[\\\"default\\\"],[[[[1,\\\"                            \\\"],[10,\\\"button\\\"],[14,0,\\\"btn btn-link btn-sm dropdown-toggle menu-selector\\\"],[15,\\\"aria-label\\\",[36,28]],[15,1,[29,[[30,0,[\\\"elementId\\\"]],\\\"-dropdownMenu\\\"]]],[14,\\\"aria-haspopup\\\",\\\"true\\\"],[15,\\\"aria-expanded\\\",[29,[[36,27]]]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"menu-kebab-horizontal\\\"],[15,\\\"screenreader-text\\\",[28,[37,3],[\\\"common.more\\\"],null]],[12],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\\n                            \\\"],[10,\\\"ul\\\"],[15,0,[29,[\\\"dropdown-menu \\\",[52,[33,27],\\\"show\\\"]]]],[15,\\\"aria-labelledby\\\",[29,[[30,0,[\\\"elementId\\\"]],\\\"-dropdownMenu\\\"]]],[12],[1,\\\"\\\\n\\\"],[41,[51,[28,[37,8],[[33,2,[\\\"status\\\"]],\\\"FAILED\\\"],null]],[[[41,[28,[37,23],[[33,24],[28,[37,21],[[28,[37,8],[[33,2,[\\\"status\\\"]],\\\"COMPLETED\\\"],null],[28,[37,8],[[33,2,[\\\"status\\\"]],\\\"COMPLETED_WITH_PARTIAL_RESULTS\\\"],null]],null]],null],[[[1,\\\"                                        \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n                                            \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"btn btn-link toggle-read-unread\\\"],[4,[38,10],[[30,0],[33,29],[28,[37,30],[[33,31]],null]],null],[12],[1,\\\"\\\\n                                                \\\"],[1,[28,[35,3],[[28,[37,32],[\\\"components.inbox.actions.markAs\\\",[52,[33,31],\\\"Unread\\\",\\\"Read\\\"]],null]],null]],[1,\\\"\\\\n                                            \\\"],[13],[1,\\\"\\\\n                                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,22],[[[41,[28,[37,21],[[28,[37,8],[[33,2,[\\\"status\\\"]],\\\"RUNNING\\\"],null],[28,[37,8],[[33,2,[\\\"status\\\"]],\\\"SUBMITTED\\\"],null],[28,[37,8],[[33,2,[\\\"status\\\"]],\\\"CANCELLING\\\"],null]],null],[[[1,\\\"                                        \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n                                            \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"btn btn-link delete\\\"],[4,[38,10],[[30,0],[33,33]],null],[12],[1,\\\"\\\\n                                                \\\"],[1,[28,[35,3],[\\\"components.inbox.actions.cancelExport\\\"],null]],[1,\\\"\\\\n                                            \\\"],[13],[1,\\\"\\\\n                                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                        \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n                                            \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"btn btn-link delete\\\"],[4,[38,10],[[30,0],[33,34]],null],[12],[1,\\\"\\\\n                                                \\\"],[1,[28,[35,3],[\\\"components.inbox.actions.deleteExport\\\"],null]],[1,\\\"\\\\n                                            \\\"],[13],[1,\\\"\\\\n                                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[]],null],[1,\\\"\\\\n                                \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n                                    \\\"],[11,\\\"button\\\"],[16,0,[29,[\\\"btn btn-link copy-export-id-\\\",[33,2,[\\\"id\\\"]],\\\"-runId-\\\",[33,2,[\\\"runId\\\"]]]]],[24,4,\\\"button\\\"],[4,[38,10],[[30,0],[33,35]],null],[12],[1,\\\"\\\\n                                        \\\"],[1,[28,[35,3],[\\\"components.inbox.actions.copyExportId\\\"],null]],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,23],[[33,36],[33,37]],null],[[[1,\\\"                                    \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n                                        \\\"],[11,\\\"button\\\"],[16,0,[29,[\\\"btn btn-link copy-static-link-\\\",[33,2,[\\\"id\\\"]],\\\"-runId-\\\",[33,2,[\\\"runId\\\"]]]]],[24,4,\\\"button\\\"],[4,[38,10],[[30,0],[33,38]],null],[12],[1,\\\"\\\\n                                            \\\"],[1,[28,[35,3],[\\\"components.inbox.actions.copyStaticLink\\\"],null]],[1,\\\"\\\\n                                        \\\"],[13],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,39],[[[1,\\\"                                    \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n                                        \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link run-now\\\"],[24,4,\\\"button\\\"],[4,[38,10],[[30,0],[33,40]],null],[12],[1,\\\"\\\\n                                            \\\"],[1,[28,[35,3],[\\\"components.inbox.actions.runNow\\\"],null]],[1,\\\"\\\\n                                        \\\"],[13],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,22],[[[1,\\\"                        \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link btn-sm\\\"],[16,\\\"aria-label\\\",[28,[37,3],[\\\"components.inbox.actions.deleteExport\\\"],null]],[24,4,\\\"button\\\"],[4,[38,10],[[30,0],[33,34]],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"close\\\"],[15,\\\"screenreader-text\\\",[28,[37,3],[\\\"components.inbox.actions.deleteExport\\\"],null]],[12],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,8],[[33,2,[\\\"status\\\"]],\\\"RUNNING\\\"],null],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"export-progress-background\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[15,5,[36,41]],[14,0,\\\"export-progress-bar\\\"],[12],[1,[34,42]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"email\\\"],false,[\\\"if\\\",\\\"isPdf\\\",\\\"reportingExport\\\",\\\"t\\\",\\\"exportViewTranslationKey\\\",\\\"hovered\\\",\\\"creationTime\\\",\\\"timeSinceCreation\\\",\\\"eq\\\",\\\"downloadAriaText\\\",\\\"action\\\",\\\"onDownload\\\",\\\"elementId\\\",\\\"isEmailRecipientListPresent\\\",\\\"didEmailFail\\\",\\\"isEmailPending\\\",\\\"isEmailedExportFileTooLarge\\\",\\\"each\\\",\\\"-track-array\\\",\\\"emailStatusesValues\\\",\\\"exportSchedule\\\",\\\"or\\\",\\\"canDeleteExport\\\",\\\"and\\\",\\\"canEditExport\\\",\\\"unless\\\",\\\"drop-down\\\",\\\"showDropdown\\\",\\\"moreActionsAriaText\\\",\\\"changeStatus\\\",\\\"not\\\",\\\"isExportRead\\\",\\\"concat\\\",\\\"cancelExport\\\",\\\"deleteExport\\\",\\\"onCopyExportId\\\",\\\"isCopyStaticLinkEnabled\\\",\\\"hasStaticLink\\\",\\\"onCopyStaticLink\\\",\\\"canRunNow\\\",\\\"onRunNow\\\",\\\"percentageStyle\\\",\\\"percentageComplete\\\"]]\",\"moduleName\":\"web-directory/components/inbox-panel-v2/reporting-export/template.hbs\",\"isStrictMode\":false});","import { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@ember/component';\nimport moment from '../../../utils/dates';\n\nexport default Component.extend({\n    classNames: ['inbox-message', 'shiftTradeRequest-message-v2', 'clickable', 'shiftTradeRequest-message'],\n    classNameBindings: ['shiftTradeRequest.markedAsRead:read:unread'],\n    hovered: false,\n    clock: service(),\n    intl: service(),\n    session: service(),\n    wfm: service(),\n\n    mouseEnter: function () {\n        this.set('hovered', true);\n    },\n\n    mouseLeave: function () {\n        this.set('hovered', false);\n    },\n\n    actions: {\n        changeStatus: function (status) {\n            this.wfm.changeShiftTradeRequestReadState(this.shiftTradeRequest, status);\n        },\n        readAndViewDetails: function () {\n            this.wfm.changeShiftTradeRequestReadState(this.shiftTradeRequest, true);\n            this.wfm.readShiftTradeRequest(this.shiftTradeRequest);\n        },\n        handleKeyDown: function (event) {\n            if (event.key !== 'Enter') {\n                return;\n            }\n            this.send('readAndViewDetails');\n            event.stopPropagation();\n        }\n    },\n\n    shiftTrade: computed('shiftTradeRequest.{shiftTrade,alternativeShift}', function () {\n        return this.get('shiftTradeRequest.alternativeShift')\n            ? this.get('shiftTradeRequest.alternativeShift')\n            : this.get('shiftTradeRequest.shiftTrade');\n    }),\n\n    initiatingUserId: computed('shiftTrade', function () {\n        return this.get('shiftTrade.initiatingUser.id');\n    }),\n\n    initiatingUserName: computed('initiatingUserId', function () {\n        const userGuid = this.initiatingUserId;\n        if (userGuid && userGuid !== 'System') {\n            return this.wfm.getAgentNameById(userGuid);\n        }\n        return null;\n    }),\n\n    initiatingDisplayedUserName: computed('initiatingUserId', function () {\n        return this.initiatingUserName || this.intl.t('notification.inbox.unknownAgent');\n    }),\n\n    receivingUserId: computed('shiftTrade', function () {\n        return this.get('shiftTrade.receivingUser.id');\n    }),\n\n    receivingUserName: computed('receivingUserId', function () {\n        const userGuid = this.receivingUserId;\n        if (userGuid && userGuid !== 'System') {\n            return this.wfm.getAgentNameById(userGuid);\n        }\n        return null;\n    }),\n\n    receivingDisplayedUserName: computed('receivingUserId', function () {\n        return this.receivingUserName || this.intl.t('notification.inbox.unknownAgent');\n    }),\n\n    alternativeShiftUserName: computed('initiatingUserName', 'receivingUserName', function () {\n        if (this.initiatingUserName) {\n            return this.initiatingDisplayedUserName;\n        } else if (this.receivingUserName) {\n            return this.receivingDisplayedUserName;\n        }\n\n        return this.intl.t('notification.inbox.unknownAgent');\n    }),\n\n    areAgentsValid: computed('initiatingUserName', 'receivingUserName', function () {\n        return this.initiatingUserName || this.receivingUserName;\n    }),\n\n    isMyRequest: computed('shiftTradeRequest.agentNotification', function () {\n        return this.get('shiftTradeRequest.agentNotification');\n    }),\n\n    localizedStatus: computed('shiftTrade', function () {\n        const newState = this.get('shiftTrade.newState');\n        const shiftTradeRequestStatus = `notification.inbox.shiftTradeRequest.${newState}`;\n        return this.intl.t(shiftTradeRequestStatus);\n    }),\n\n    shiftDate: computed('shiftTrade', function () {\n        const initiatingShiftDate = this.get('shiftTrade.initiatingShiftDate');\n        const date = moment(initiatingShiftDate);\n        const dateFormat = this.intl.t('notification.inbox.dateShortMonthDayFormat');\n        return date.format(dateFormat);\n    }),\n\n    isWeeklyTrade: computed('shiftTrade.granularity', function () {\n        return this.get('shiftTrade.granularity') === 'Weekly';\n    }),\n\n    weeklyTradeRange: computed('isWeeklyTrade', function () {\n        if (this.isWeeklyTrade) {\n            const weekStart = moment(this.get('shiftTrade.weekDate'));\n            const weekEnd = weekStart.clone().add(1, 'week').subtract(1, 'day');\n            const dateFormat = this.intl.t('notification.inbox.dateShortMonthDayFormat');\n            return this.intl.t('components.inbox.dateRange', {\n                start: weekStart.format(dateFormat),\n                end: weekEnd.format(dateFormat)\n            });\n        }\n        return '';\n    }),\n\n    date: computed('shiftTradeRequest.timestamp', function () {\n        const date = moment(this.get('shiftTradeRequest.timestamp'));\n        const locale = this.get('intl.isoLocale');\n        return date.locale(locale).format('LL');\n    }),\n\n    time: computed('shiftTradeRequest.timestamp', function () {\n        const date = moment(this.get('shiftTradeRequest.timestamp'));\n        const locale = this.get('intl.isoLocale');\n        return date.locale(locale).format('LT');\n    }),\n\n    dateFromNow: computed('clock.minute', 'shiftTradeRequest.timestamp', function () {\n        // Consume clock.minute to establish Glimmer autotracking (Ember 3.28 compatibility)\n        this.get('clock.minute');\n        const date = moment(this.get('shiftTradeRequest.timestamp'));\n        const locale = this.get('intl.isoLocale');\n        return date.locale(locale).fromNow();\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"JXBgutPi\",\"block\":\"[[[10,0],[14,0,\\\"inbox-row\\\"],[12],[1,\\\"\\\\n    \\\"],[11,0],[24,0,\\\"right\\\"],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[16,\\\"onkeydown\\\",[28,[37,0],[[30,0],\\\"handleKeyDown\\\"],null]],[4,[38,0],[[30,0],\\\"readAndViewDetails\\\"],null],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"information col-sm-8\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"ib-details\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,2,[\\\"alternativeShift\\\"]],[[[41,[28,[37,3],[[33,4],[33,5]],null],[[[1,\\\"                        \\\"],[1,[28,[35,6],[\\\"notification.inbox.shiftTradeRequest.agentWeeklyAlternativeShiftDescription\\\"],[[\\\"dateRange\\\",\\\"status\\\"],[[33,7],[33,8]]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,4],[[[1,\\\"                        \\\"],[1,[28,[35,6],[\\\"notification.inbox.shiftTradeRequest.agentDescription\\\"],[[\\\"shiftDate\\\",\\\"status\\\"],[[33,9],[33,8]]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,5],[[[1,\\\"                        \\\"],[1,[28,[35,6],[\\\"notification.inbox.shiftTradeRequest.adminWeeklyAlternativeShiftDescription\\\"],[[\\\"agentName\\\",\\\"dateRange\\\",\\\"status\\\"],[[33,10],[33,7],[33,8]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[1,[28,[35,6],[\\\"notification.inbox.shiftTradeRequest.adminDailyAlternativeShiftDescription\\\"],[[\\\"agentName\\\",\\\"shiftDate\\\",\\\"status\\\"],[[33,10],[33,9],[33,8]]]]],[1,\\\"\\\\n                    \\\"]],[]]]],[]]]],[]]]],[]],[[[41,[28,[37,3],[[33,4],[33,2,[\\\"shiftTrade\\\",\\\"newState\\\"]]],null],[[[1,\\\"                        \\\"],[1,[28,[35,6],[\\\"notification.inbox.shiftTradeRequest.agentDescription\\\"],[[\\\"shiftDate\\\",\\\"status\\\"],[[33,9],[33,8]]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,4],[[[1,\\\"                        \\\"],[1,[28,[35,6],[\\\"notification.inbox.shiftTradeRequest.directTradeDescription\\\"],[[\\\"shiftDate\\\",\\\"initiatingUser\\\"],[[33,9],[33,11]]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,12],[[[1,\\\"                        \\\"],[1,[28,[35,6],[\\\"notification.inbox.shiftTradeRequest.adminDescriptionWithAgents\\\"],[[\\\"shiftDate\\\",\\\"initiatingUser\\\",\\\"receivingUser\\\"],[[33,9],[33,11],[33,13]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[1,[28,[35,6],[\\\"notification.inbox.shiftTradeRequest.adminDescriptionWithoutAgents\\\"],[[\\\"shiftDate\\\"],[[33,9]]]]],[1,\\\"\\\\n                    \\\"]],[]]]],[]]]],[]]]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"ib-time col-sm-4\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,14],[[[1,\\\"                \\\"],[10,0],[12],[1,[34,15]],[13],[1,\\\"\\\\n                \\\"],[10,0],[12],[1,[34,16]],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                \\\"],[1,[34,17]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"ib-action\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"dropdown pull-left\\\"],[12],[1,\\\"\\\\n\\\"],[6,[39,18],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[[33,19],\\\"inbox-panel-v2.shift-trade-requests-v2\\\"]],[[\\\"default\\\"],[[[[1,\\\"                \\\"],[10,\\\"button\\\"],[14,0,\\\"btn btn-link btn-sm dropdown-toggle menu-selector\\\"],[15,\\\"aria-label\\\",[28,[37,6],[\\\"common.more\\\"],null]],[15,1,[29,[[30,0,[\\\"elementId\\\"]],\\\"-dropdownMenu\\\"]]],[14,\\\"aria-haspopup\\\",\\\"true\\\"],[15,\\\"aria-expanded\\\",[29,[[36,19]]]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"menu-kebab-horizontal\\\"],[15,\\\"screenreader-text\\\",[28,[37,6],[\\\"common.more\\\"],null]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"ul\\\"],[15,0,[29,[\\\"dropdown-menu \\\",[52,[33,19],\\\"show\\\"]]]],[15,\\\"aria-labelledby\\\",[29,[[30,0,[\\\"elementId\\\"]],\\\"-dropdownMenu\\\"]]],[12],[1,\\\"\\\\n\\\"],[41,[33,2,[\\\"markedAsRead\\\"]],[[[1,\\\"                        \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n                            \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"btn btn-link toggle-read-unread\\\"],[4,[38,0],[[30,0],\\\"changeStatus\\\",false],null],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,6],[\\\"components.inbox.actions.markAsUnread\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n                            \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"btn btn-link toggle-read-unread\\\"],[4,[38,0],[[30,0],\\\"changeStatus\\\",true],null],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,6],[\\\"components.inbox.actions.markAsRead\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                    \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n                        \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"btn btn-link details\\\"],[4,[38,0],[[30,0],\\\"readAndViewDetails\\\"],null],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,6],[\\\"components.inbox.actions.viewDetails\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"action\\\",\\\"if\\\",\\\"shiftTradeRequest\\\",\\\"and\\\",\\\"isMyRequest\\\",\\\"isWeeklyTrade\\\",\\\"t\\\",\\\"weeklyTradeRange\\\",\\\"localizedStatus\\\",\\\"shiftDate\\\",\\\"alternativeShiftUserName\\\",\\\"initiatingDisplayedUserName\\\",\\\"areAgentsValid\\\",\\\"receivingDisplayedUserName\\\",\\\"hovered\\\",\\\"date\\\",\\\"time\\\",\\\"dateFromNow\\\",\\\"drop-down\\\",\\\"showDropdown\\\"]]\",\"moduleName\":\"web-directory/components/inbox-panel-v2/shift-trade-requests-v2/template.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"XAqWkjUr\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"heading\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"panel-title\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,\\\"role\\\",\\\"heading\\\"],[14,\\\"aria-level\\\",\\\"1\\\"],[14,0,\\\"text text-static\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,2],[\\\"components.navMenu.inbox\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[1,[28,[35,3],null,[[\\\"onchange\\\",\\\"selection\\\",\\\"toggleItemConfigs\\\",\\\"attentionStarburst\\\"],[[28,[37,4],[[30,0],[33,5]],null],[33,6],[33,7],[33,8]]]]],[1,\\\"\\\\n\\\"],[6,[39,9],null,[[\\\"showDropdown\\\",\\\"classNames\\\"],[[33,10],\\\"btn-group ib-tabdropdown\\\"]],[[\\\"default\\\"],[[[[1,\\\"            \\\"],[10,\\\"button\\\"],[15,0,[29,[\\\"btn btn-link dropdown-toggle menu-selector toggle-item \\\",[52,[33,10],\\\"selected\\\"]]]],[14,\\\"aria-haspopup\\\",\\\"true\\\"],[14,\\\"aria-expanded\\\",\\\"false\\\"],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[34,11]],[1,\\\"\\\\n                \\\"],[10,1],[14,0,\\\"caret\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"ul\\\"],[15,0,[29,[\\\"dropdown-menu \\\",[52,[33,10],\\\"show\\\",\\\"hide\\\"],\\\" dropdown-menu-right\\\"]]],[12],[1,\\\"\\\\n                \\\"],[11,\\\"li\\\"],[16,\\\"onkeydown\\\",[28,[37,4],[[30,0],\\\"handleKeyDownForRightDropdown\\\",\\\"showAll\\\"],null]],[4,[38,4],[[30,0],\\\"setRecordFilter\\\",\\\"showAll\\\"],null],[12],[1,\\\"\\\\n                    \\\"],[10,3],[14,6,\\\"#\\\"],[12],[1,[28,[35,2],[\\\"components.inbox.filters.showAll\\\"],null]],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[11,\\\"li\\\"],[16,\\\"onkeydown\\\",[28,[37,4],[[30,0],\\\"handleKeyDownForRightDropdown\\\",\\\"showRead\\\"],null]],[4,[38,4],[[30,0],\\\"setRecordFilter\\\",\\\"showRead\\\"],null],[12],[1,\\\"\\\\n                    \\\"],[10,3],[14,6,\\\"#\\\"],[12],[1,[28,[35,2],[\\\"components.inbox.filters.showRead\\\"],null]],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[11,\\\"li\\\"],[16,\\\"onkeydown\\\",[28,[37,4],[[30,0],\\\"handleKeyDownForRightDropdown\\\",\\\"showUnread\\\"],null]],[4,[38,4],[[30,0],\\\"setRecordFilter\\\",\\\"showUnread\\\"],null],[12],[1,\\\"\\\\n                    \\\"],[10,3],[14,6,\\\"#\\\"],[12],[1,[28,[35,2],[\\\"components.inbox.filters.showUnread\\\"],null]],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,12],[[[1,\\\"                    \\\"],[10,\\\"li\\\"],[14,0,\\\"separator\\\"],[12],[13],[1,\\\"\\\\n\\\\n\\\"],[42,[28,[37,14],[[28,[37,14],[[33,15]],null]],null],null,[[[1,\\\"                        \\\"],[11,\\\"li\\\"],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[4,[38,4],[[30,0],\\\"filterGroupVoicemails\\\",[30,1]],null],[12],[1,\\\"\\\\n                            \\\"],[10,3],[14,6,\\\"#\\\"],[12],[1,\\\"\\\\n                                \\\"],[10,\\\"i\\\"],[15,0,[29,[\\\"pc \\\",[52,[30,1,[\\\"selected\\\"]],\\\"pc-checked\\\",\\\"pc-unchecked\\\"]]]],[12],[13],[1,\\\"\\\\n                                \\\"],[10,1],[14,0,\\\"group-name\\\"],[12],[1,\\\"\\\\n                                    \\\"],[1,[30,1,[\\\"group\\\",\\\"name\\\"]]],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"panel-content ib-panelcontent-v2\\\"],[12],[1,\\\"\\\\n\\\"],[41,[51,[33,1]],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"panel-body\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"dropdown-container\\\"],[12],[1,\\\"\\\\n\\\"],[6,[39,17],null,[[\\\"title\\\"],[[33,18]]],[[\\\"default\\\"],[[[[41,[33,19,[\\\"enabled\\\"]],[[[41,[33,20],[[[1,\\\"                            \\\"],[11,\\\"li\\\"],[16,0,[29,[[52,[33,21],\\\"unread\\\"]]]],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[16,\\\"onkeydown\\\",[28,[37,4],[[30,0],\\\"handleKeyDownForLeftDropdown\\\",[33,22,[\\\"voicemails\\\"]]],null]],[4,[38,4],[[30,0],\\\"changeSelection\\\",[33,22,[\\\"voicemails\\\"]]],null],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,2],[\\\"notification.inbox.voicemails\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n                        \\\"],[11,\\\"li\\\"],[16,0,[29,[[52,[33,23],\\\"unread\\\"]]]],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[16,\\\"onkeydown\\\",[28,[37,4],[[30,0],\\\"handleKeyDownForLeftDropdown\\\",[33,22,[\\\"faxes\\\"]]],null]],[4,[38,4],[[30,0],\\\"changeSelection\\\",[33,22,[\\\"faxes\\\"]]],null],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,2],[\\\"notification.inbox.faxes\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,24],[[[1,\\\"                            \\\"],[11,\\\"li\\\"],[16,0,[29,[[52,[33,25],\\\"unread\\\"]]]],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[16,\\\"onkeydown\\\",[28,[37,4],[[30,0],\\\"handleKeyDownForLeftDropdown\\\",[33,22,[\\\"recordings\\\"]]],null]],[4,[38,4],[[30,0],\\\"changeSelection\\\",[33,22,[\\\"recordings\\\"]]],null],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,2],[\\\"notification.inbox.recordings\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null],[41,[33,26],[[[1,\\\"                        \\\"],[11,\\\"li\\\"],[16,0,[29,[[52,[33,27],\\\"unread\\\"]]]],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[16,\\\"onkeydown\\\",[28,[37,4],[[30,0],\\\"handleKeyDownForLeftDropdown\\\",[33,22,[\\\"evaluations\\\"]]],null]],[4,[38,4],[[30,0],\\\"changeSelection\\\",[33,22,[\\\"evaluations\\\"]]],null],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,2],[\\\"notification.inbox.evaluations\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,28],[[[1,\\\"                        \\\"],[11,\\\"li\\\"],[16,0,[29,[[52,[33,29],\\\"unread\\\"]]]],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[16,\\\"onkeydown\\\",[28,[37,4],[[30,0],\\\"handleKeyDownForLeftDropdown\\\",[33,22,[\\\"timeOffRequests\\\"]]],null]],[4,[38,4],[[30,0],\\\"changeSelection\\\",[33,22,[\\\"timeOffRequests\\\"]]],null],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,2],[\\\"notification.inbox.timeOffRequests\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,30],[[[1,\\\"                        \\\"],[11,\\\"li\\\"],[16,0,[29,[[52,[33,31],\\\"unread\\\"]]]],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[16,\\\"onkeydown\\\",[28,[37,4],[[30,0],\\\"handleKeyDownForLeftDropdown\\\",[33,22,[\\\"shiftTradeRequests\\\"]]],null]],[4,[38,4],[[30,0],\\\"changeSelection\\\",[33,22,[\\\"shiftTradeRequests\\\"]]],null],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,2],[\\\"notification.inbox.shiftTradeRequests\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,32],[[[1,\\\"                        \\\"],[11,\\\"li\\\"],[16,0,[29,[[52,[33,33],\\\"unread\\\"]]]],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[16,\\\"onkeydown\\\",[28,[37,4],[[30,0],\\\"handleKeyDownForLeftDropdown\\\",[33,22,[\\\"explanations\\\"]]],null]],[4,[38,4],[[30,0],\\\"changeSelection\\\",[33,22,[\\\"explanations\\\"]]],null],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,2],[\\\"notification.inbox.explanations\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,34],[[[1,\\\"                        \\\"],[11,\\\"li\\\"],[16,0,[29,[[52,[33,35],\\\"unread\\\"]]]],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[16,\\\"onkeydown\\\",[28,[37,4],[[30,0],\\\"handleKeyDownForLeftDropdown\\\",[33,22,[\\\"coachingAppointments\\\"]]],null]],[4,[38,4],[[30,0],\\\"changeSelection\\\",[33,22,[\\\"coachingAppointments\\\"]]],null],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,2],[\\\"notification.inbox.coachingAppointments\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,36],[[[1,\\\"                        \\\"],[11,\\\"li\\\"],[16,0,[29,[[52,[33,37],\\\"unread\\\"]]]],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[16,\\\"onkeydown\\\",[28,[37,4],[[30,0],\\\"handleKeyDownForLeftDropdown\\\",[33,22,[\\\"learningAssignments\\\"]]],null]],[4,[38,4],[[30,0],\\\"changeSelection\\\",[33,22,[\\\"learningAssignments\\\"]]],null],[12],[1,\\\"\\\\n                            \\\"],[1,[33,38,[\\\"moduleAssignments\\\"]]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]]]],[1,\\\"\\\\n\\\"],[6,[39,17],null,[[\\\"title\\\"],[[33,11]]],[[\\\"default\\\"],[[[[1,\\\"                    \\\"],[11,\\\"li\\\"],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[16,\\\"onkeydown\\\",[28,[37,4],[[30,0],\\\"handleKeyDownForRightDropdown\\\",\\\"showAll\\\"],null]],[4,[38,4],[[30,0],\\\"setRecordFilter\\\",\\\"showAll\\\"],null],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,2],[\\\"components.inbox.filters.showAll\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[11,\\\"li\\\"],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[16,\\\"onkeydown\\\",[28,[37,4],[[30,0],\\\"handleKeyDownForRightDropdown\\\",\\\"showRead\\\"],null]],[4,[38,4],[[30,0],\\\"setRecordFilter\\\",\\\"showRead\\\"],null],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,2],[\\\"components.inbox.filters.showRead\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[11,\\\"li\\\"],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[16,\\\"onkeydown\\\",[28,[37,4],[[30,0],\\\"handleKeyDownForRightDropdown\\\",\\\"showUnread\\\"],null]],[4,[38,4],[[30,0],\\\"setRecordFilter\\\",\\\"showUnread\\\"],null],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,2],[\\\"components.inbox.filters.showUnread\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"content\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,19,[\\\"enabled\\\"]],[[[1,\\\"            \\\"],[10,0],[15,0,[29,[\\\"inbox-panel-content\\\\n                    \\\",[52,[33,1],\\\"main-voicemail-panel\\\"],\\\"\\\\n                    \\\",[52,[51,[33,39]],\\\"hide\\\"]]]],[14,\\\"data-t\\\",\\\"voicemail-standalone\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,40],null,[[\\\"class\\\",\\\"frame-id\\\",\\\"clientConfig\\\",\\\"route\\\"],[\\\"voicemail-ui\\\",[33,41],[33,42],\\\"/\\\"]]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,0],[15,0,[29,[\\\"inbox-listing faxes \\\",[52,[33,1],\\\"main-faxes-panel\\\"],\\\" \\\",[52,[51,[33,43]],\\\"hide\\\"]]]],[14,\\\"data-t\\\",\\\"faxes-standalone\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,40],null,[[\\\"class\\\",\\\"frame-id\\\",\\\"clientConfig\\\",\\\"route\\\"],[\\\"faxes-ui\\\",[33,44],[33,45],\\\"/\\\"]]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,0],[15,0,[29,[\\\"inbox-listing notifications \\\",[52,[51,[33,46]],\\\"hide\\\"]]]],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"list-scrollable\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,14],[[28,[37,14],[[33,47]],null]],null],null,[[[1,\\\"                        \\\"],[1,[28,[35,48],[[30,2]],[[\\\"inCallControls\\\"],[[33,49]]]]],[1,\\\"\\\\n\\\"]],[2]],[[[1,\\\"                        \\\"],[10,1],[14,0,\\\"empty text-center\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,50,[\\\"loading\\\",\\\"recordings\\\"]],[[[1,\\\"                                \\\"],[10,\\\"gux-radial-loading\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                \\\"],[10,1],[14,0,\\\"empty text-center block-panel\\\"],[12],[1,\\\"\\\\n                                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"record\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,51],[[33,52],\\\"showUnread\\\"],null],[[[1,\\\"                                        \\\"],[10,2],[12],[1,[28,[35,2],[\\\"notification.inbox.noUnreadRecordings\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,51],[[33,52],\\\"showRead\\\"],null],[[[1,\\\"                                        \\\"],[10,2],[12],[1,[28,[35,2],[\\\"notification.inbox.noReadRecordings\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                        \\\"],[10,2],[12],[1,[28,[35,2],[\\\"notification.inbox.noRecordings\\\"],null]],[13],[1,\\\"\\\\n                                    \\\"]],[]]]],[]]],[1,\\\"                                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"button-navigation-wrapper\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"button-wrapper\\\"],[12],[1,\\\"\\\\n\\\"],[41,[51,[33,53]],[[[1,\\\"                            \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link back-button\\\"],[24,4,\\\"button\\\"],[4,[38,4],[[30,0],\\\"previousRecordingsPage\\\"],null],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,2],[\\\"common.previous\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n\\\"],[41,[51,[33,54]],[[[41,[33,50,[\\\"loading\\\",\\\"recordings\\\"]],[[[1,\\\"                            \\\"],[10,1],[14,0,\\\"page-number-indicator loading\\\"],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,2],[\\\"common.loading\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[10,1],[14,0,\\\"page-number-indicator\\\"],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,2],[\\\"common.pageOf\\\"],[[\\\"current\\\",\\\"total\\\"],[[33,55],[33,56]]]]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[]],null],[1,\\\"                    \\\"],[10,0],[14,0,\\\"button-wrapper\\\"],[12],[1,\\\"\\\\n\\\"],[41,[51,[33,57]],[[[1,\\\"                            \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link next-button\\\"],[24,4,\\\"button\\\"],[4,[38,4],[[30,0],\\\"nextRecordingsPage\\\"],null],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,2],[\\\"common.next\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n        \\\"],[10,0],[15,0,[29,[\\\"inbox-listing evaluations \\\",[52,[51,[33,58]],\\\"hide\\\"]]]],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,14],[[28,[37,14],[[33,59]],null]],null],null,[[[1,\\\"                \\\"],[1,[28,[35,60],null,[[\\\"evaluation\\\"],[[30,3]]]]],[1,\\\"\\\\n\\\"]],[3]],[[[1,\\\"                \\\"],[10,1],[14,0,\\\"empty text-center\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,50,[\\\"loading\\\",\\\"evaluations\\\"]],[[[1,\\\"                        \\\"],[10,\\\"gux-radial-loading\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,1],[14,0,\\\"empty text-center block-panel\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"file-preview\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,51],[[33,52],\\\"showUnread\\\"],null],[[[1,\\\"                                \\\"],[10,2],[12],[1,[28,[35,2],[\\\"notification.inbox.noUnreadEvaluations\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,51],[[33,52],\\\"showRead\\\"],null],[[[1,\\\"                                \\\"],[10,2],[12],[1,[28,[35,2],[\\\"notification.inbox.noReadEvaluations\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                \\\"],[10,2],[12],[1,[28,[35,2],[\\\"notification.inbox.noEvaluations\\\"],null]],[13],[1,\\\"\\\\n                            \\\"]],[]]]],[]]],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[15,0,[29,[\\\"inbox-listing time-off-request \\\",[52,[51,[33,61]],\\\"hide\\\"]]]],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,14],[[28,[37,14],[[33,62]],null]],null],null,[[[1,\\\"                \\\"],[1,[28,[35,63],null,[[\\\"timeOffRequest\\\"],[[30,4]]]]],[1,\\\"\\\\n\\\"]],[4]],[[[1,\\\"                \\\"],[10,1],[14,0,\\\"empty text-center\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,64],[[[1,\\\"                        \\\"],[10,\\\"gux-radial-loading\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,1],[14,0,\\\"empty text-center block-panel\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"calendar\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,51],[[33,52],\\\"showUnread\\\"],null],[[[1,\\\"                                \\\"],[10,2],[12],[1,[28,[35,2],[\\\"notification.inbox.noUnreadTimeOffRequests\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,51],[[33,52],\\\"showRead\\\"],null],[[[1,\\\"                                \\\"],[10,2],[12],[1,[28,[35,2],[\\\"notification.inbox.noReadTimeOffRequests\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                \\\"],[10,2],[12],[1,[28,[35,2],[\\\"notification.inbox.noTimeOffRequests\\\"],null]],[13],[1,\\\"\\\\n                            \\\"]],[]]]],[]]],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[15,0,[29,[\\\"inbox-listing shift-trade-request \\\",[52,[51,[33,65]],\\\"hide\\\"]]]],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,14],[[28,[37,14],[[33,66]],null]],null],null,[[[1,\\\"                \\\"],[1,[28,[35,67],null,[[\\\"shiftTradeRequest\\\"],[[30,5]]]]],[1,\\\"\\\\n\\\"]],[5]],[[[1,\\\"                \\\"],[10,1],[14,0,\\\"empty text-center\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,50,[\\\"loading\\\",\\\"notifications\\\"]],[[[1,\\\"                        \\\"],[10,\\\"gux-radial-loading\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,1],[14,0,\\\"empty text-center block-panel\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"calendar\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,51],[[33,52],\\\"showUnread\\\"],null],[[[1,\\\"                                \\\"],[10,2],[12],[1,[28,[35,2],[\\\"notification.inbox.noUnreadShiftTradeRequests\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,51],[[33,52],\\\"showRead\\\"],null],[[[1,\\\"                                \\\"],[10,2],[12],[1,[28,[35,2],[\\\"notification.inbox.noReadShiftTradeRequests\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                \\\"],[10,2],[12],[1,[28,[35,2],[\\\"notification.inbox.noShiftTradeRequests\\\"],null]],[13],[1,\\\"\\\\n                            \\\"]],[]]]],[]]],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[15,0,[29,[\\\"inbox-listing adherence-explanations \\\",[52,[51,[33,68]],\\\"hide\\\"]]]],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,14],[[28,[37,14],[[33,69]],null]],null],null,[[[1,\\\"                \\\"],[1,[28,[35,70],null,[[\\\"adherenceExplanation\\\"],[[30,6]]]]],[1,\\\"\\\\n\\\"]],[6]],[[[1,\\\"                \\\"],[10,1],[14,0,\\\"empty text-center\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,50,[\\\"loading\\\",\\\"notifications\\\"]],[[[1,\\\"                        \\\"],[10,\\\"gux-radial-loading\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,1],[14,0,\\\"empty text-center block-panel\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"alert-warning-octogon\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,51],[[33,52],\\\"showUnread\\\"],null],[[[1,\\\"                                \\\"],[10,2],[12],[1,[28,[35,2],[\\\"notification.inbox.noUnreadAdherenceExplanations\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,51],[[33,52],\\\"showRead\\\"],null],[[[1,\\\"                                \\\"],[10,2],[12],[1,[28,[35,2],[\\\"notification.inbox.noReadAdherenceExplanations\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                \\\"],[10,2],[12],[1,[28,[35,2],[\\\"notification.inbox.noAdherenceExplanations\\\"],null]],[13],[1,\\\"\\\\n                            \\\"]],[]]]],[]]],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[15,0,[29,[\\\"inbox-listing coaching-appointments \\\",[52,[51,[33,71]],\\\"hide\\\"]]]],[12],[1,\\\"\\\\n\\\"],[41,[33,72],[[[1,\\\"                \\\"],[10,\\\"small\\\"],[14,0,\\\"help-message text-muted\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,2],[\\\"notification.inbox.fromlast60days\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[42,[28,[37,14],[[28,[37,14],[[33,72]],null]],null],null,[[[1,\\\"                \\\"],[1,[28,[35,73],null,[[\\\"coachingAppointment\\\",\\\"coachingAttendees\\\",\\\"hasCoachingUsability\\\",\\\"hasCoachingAnalytics\\\",\\\"hasCoachingOverdue\\\",\\\"hasDevelopmentPlan\\\"],[[30,7],[33,74],[33,75],true,[33,76],[33,77]]]]],[1,\\\"\\\\n\\\"]],[7]],[[[1,\\\"                \\\"],[10,1],[14,0,\\\"empty text-center\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,78,[\\\"coachingAppointments\\\"]],[[[1,\\\"                        \\\"],[10,\\\"gux-radial-loading\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,1],[14,0,\\\"empty text-center block-panel\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"calendar\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,51],[[33,52],\\\"showUnread\\\"],null],[[[1,\\\"                                \\\"],[10,2],[12],[1,[28,[35,2],[\\\"notification.inbox.noUnreadCoachingAppointments\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,51],[[33,52],\\\"showRead\\\"],null],[[[1,\\\"                                \\\"],[10,2],[12],[1,[28,[35,2],[\\\"notification.inbox.noReadCoachingAppointments\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                \\\"],[10,2],[12],[1,[28,[35,2],[\\\"notification.inbox.noCoachingAppointments\\\"],null]],[13],[1,\\\"\\\\n                            \\\"]],[]]]],[]]],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[41,[33,75],[[[1,\\\"                \\\"],[10,0],[14,1,\\\"coaching-appointments-pagination\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-pagination-legacy\\\"],[15,\\\"currentPage\\\",[33,50,[\\\"coaching\\\",\\\"getPageNumber\\\"]]],[15,\\\"totalItems\\\",[33,50,[\\\"coaching\\\",\\\"getTotalItems\\\"]]],[15,\\\"itemsPerPage\\\",[33,50,[\\\"coaching\\\",\\\"getPageSize\\\"]]],[15,\\\"itemsPerPageOptions\\\",[33,50,[\\\"coaching\\\",\\\"itemsPerPageOptions\\\"]]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[15,0,[29,[\\\"inbox-listing learning-assignments \\\",[52,[51,[33,79]],\\\"hide\\\"]]]],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,14],[[28,[37,14],[[33,80]],null]],null],null,[[[1,\\\"                \\\"],[1,[28,[35,81],null,[[\\\"learningAssignment\\\",\\\"hasDevelopmentPlan\\\"],[[30,8],[33,77]]]]],[1,\\\"\\\\n\\\"]],[8]],[[[1,\\\"                \\\"],[10,1],[14,0,\\\"empty text-center\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,78,[\\\"learningAssignments\\\"]],[[[1,\\\"                        \\\"],[10,\\\"gux-radial-loading\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,1],[14,0,\\\"empty text-center block-panel\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,50,[\\\"learningTab\\\",\\\"hasError\\\"]],[[[1,\\\"                                \\\"],[10,\\\"gux-blank-state\\\"],[14,0,\\\"inbox-listing error-container\\\"],[12],[1,\\\"\\\\n                                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"slot\\\",\\\"image\\\"],[14,0,\\\"inbox-listing error-container error-image\\\"],[15,\\\"icon-name\\\",[33,50,[\\\"learningTab\\\",\\\"errorState\\\",\\\"icon\\\"]]],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                                    \\\"],[10,0],[14,\\\"slot\\\",\\\"primary-message\\\"],[14,0,\\\"inbox-listing error-container error-title\\\"],[12],[1,\\\"\\\\n                                        \\\"],[1,[33,50,[\\\"learningTab\\\",\\\"errorState\\\",\\\"title\\\"]]],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n                                    \\\"],[10,0],[14,\\\"slot\\\",\\\"additional-guidance\\\"],[14,0,\\\"inbox-listing error-container error-message\\\"],[12],[1,\\\"\\\\n                                        \\\"],[1,[33,50,[\\\"learningTab\\\",\\\"errorState\\\",\\\"message\\\"]]],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n                                    \\\"],[10,\\\"gux-button\\\"],[14,\\\"slot\\\",\\\"call-to-action\\\"],[15,\\\"onclick\\\",[28,[37,4],[[30,0],\\\"loadLearningAssignments\\\"],null]],[12],[1,\\\"\\\\n                                        \\\"],[1,[33,50,[\\\"learningTab\\\",\\\"errorState\\\",\\\"refresh\\\"]]],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"resource\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,51],[[33,52],\\\"showUnread\\\"],null],[[[1,\\\"                                    \\\"],[10,2],[12],[1,[33,38,[\\\"noUnreadAssignments\\\"]]],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,51],[[33,52],\\\"showRead\\\"],null],[[[1,\\\"                                    \\\"],[10,2],[12],[1,[33,38,[\\\"noReadAssignments\\\"]]],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                    \\\"],[10,2],[12],[1,[33,38,[\\\"noAssignments\\\"]]],[13],[1,\\\"\\\\n                                \\\"]],[]]]],[]]]],[]]],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[15,0,[29,[\\\"inbox-listing reporting-export \\\",[52,[51,[33,82]],\\\"hide\\\"]]]],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,83],null,[[\\\"exportExpirationSummary\\\"],[[33,50,[\\\"exportExpirationSummary\\\"]]]]]],[1,\\\"\\\\n\\\\n            \\\"],[10,0],[14,0,\\\"list-scrollable\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,84],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"new-export-available-indicator\\\"],[12],[1,\\\"\\\\n                        \\\"],[11,3],[24,6,\\\"#\\\"],[4,[38,4],[[30,0],\\\"viewNewExports\\\"],null],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,2],[\\\"notification.inbox.newExportAvailable\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[42,[28,[37,14],[[28,[37,14],[[33,85]],null]],null],null,[[[1,\\\"                    \\\"],[1,[28,[35,86],null,[[\\\"reportingExport\\\",\\\"isCopyStaticLinkEnabled\\\"],[[30,9],[33,87]]]]],[1,\\\"\\\\n\\\"]],[9]],[[[1,\\\"                    \\\"],[10,1],[14,0,\\\"empty text-center\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,50,[\\\"loading\\\",\\\"reportingExport\\\"]],[[[1,\\\"                            \\\"],[10,\\\"gux-radial-loading\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[10,1],[14,0,\\\"empty text-center block-panel\\\"],[12],[1,\\\"\\\\n                                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"export\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,51],[[33,88],\\\"showUnread\\\"],null],[[[1,\\\"                                    \\\"],[10,2],[12],[1,[28,[35,2],[\\\"notification.inbox.noUnreadReportingExports\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,51],[[33,88],\\\"showRead\\\"],null],[[[1,\\\"                                    \\\"],[10,2],[12],[1,[28,[35,2],[\\\"notification.inbox.noReadReportingExports\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                    \\\"],[10,2],[12],[1,[28,[35,2],[\\\"notification.inbox.noReportingExports\\\"],null]],[13],[1,\\\"\\\\n                                \\\"]],[]]]],[]]],[1,\\\"                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,0],[14,0,\\\"button-navigation-wrapper\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"button-wrapper\\\"],[12],[1,\\\"\\\\n\\\"],[41,[51,[33,89]],[[[1,\\\"                        \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link back-button\\\"],[24,4,\\\"button\\\"],[4,[38,4],[[30,0],\\\"previousExportsPage\\\"],null],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,2],[\\\"common.previous\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n\\\"],[41,[51,[33,90]],[[[41,[33,50,[\\\"loading\\\",\\\"reportingExports\\\"]],[[[1,\\\"                        \\\"],[10,1],[14,0,\\\"page-number-indicator loading\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,2],[\\\"common.loading\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,1],[14,0,\\\"page-number-indicator\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,2],[\\\"common.pageOf\\\"],[[\\\"current\\\",\\\"total\\\"],[[33,91],[33,92]]]]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[]],null],[1,\\\"                \\\"],[10,0],[14,0,\\\"button-wrapper\\\"],[12],[1,\\\"\\\\n\\\"],[41,[51,[33,93]],[[[1,\\\"                        \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link next-button\\\"],[24,4,\\\"button\\\"],[4,[38,4],[[30,0],\\\"nextExportsPage\\\"],null],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,2],[\\\"common.next\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[15,0,[29,[\\\"inbox-listing reporting-alert \\\",[52,[51,[33,94]],\\\"hide\\\"]]]],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"list-scrollable\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,95],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"new-alert-available-indicator\\\"],[12],[1,\\\"\\\\n                        \\\"],[11,3],[24,6,\\\"#\\\"],[4,[38,4],[[30,0],\\\"viewNewAlerts\\\"],null],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,2],[\\\"notification.inbox.newAlertsAvailable\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                \\\"],[10,0],[14,0,\\\"classic-view-link-container\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,96],[[[1,\\\"                        \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"mark-all-as-unread\\\"],[4,[38,4],[[30,0],\\\"markAllAsUnread\\\"],null],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,2],[\\\"components.inbox.markAllAsUnread\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                        \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"mark-all-as-read\\\"],[4,[38,4],[[30,0],\\\"markAllAsRead\\\"],null],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,2],[\\\"components.inbox.markAllAsRead\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                        \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"delete-all\\\"],[4,[38,4],[[30,0],\\\"deleteAll\\\"],null],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,2],[\\\"components.inbox.deleteAll\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n\\\"],[42,[28,[37,14],[[28,[37,14],[[33,97]],null]],null],null,[[[1,\\\"                    \\\"],[1,[28,[35,98],null,[[\\\"reportingAlert\\\"],[[30,10]]]]],[1,\\\"\\\\n\\\"]],[10]],[[[1,\\\"                    \\\"],[10,1],[14,0,\\\"empty text-center\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,50,[\\\"loading\\\",\\\"reportingAlert\\\"]],[[[1,\\\"                            \\\"],[10,\\\"gux-radial-loading\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[10,1],[14,0,\\\"empty text-center block-panel\\\"],[12],[1,\\\"\\\\n                                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"bell\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,51],[[33,99],\\\"showUnread\\\"],null],[[[1,\\\"                                    \\\"],[10,2],[12],[1,[28,[35,2],[\\\"notification.inbox.noUnreadReportingAlerts\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,51],[[33,99],\\\"showRead\\\"],null],[[[1,\\\"                                    \\\"],[10,2],[12],[1,[28,[35,2],[\\\"notification.inbox.noReadReportingAlerts\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                    \\\"],[10,2],[12],[1,[28,[35,2],[\\\"notification.inbox.noReportingAlerts\\\"],null]],[13],[1,\\\"\\\\n                                \\\"]],[]]]],[]]],[1,\\\"                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,0],[14,0,\\\"button-navigation-wrapper\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"button-wrapper\\\"],[12],[1,\\\"\\\\n\\\"],[41,[51,[33,100]],[[[1,\\\"                        \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link back-button\\\"],[24,4,\\\"button\\\"],[4,[38,4],[[30,0],\\\"previousAlertsPage\\\"],null],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,2],[\\\"common.previous\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n\\\"],[41,[51,[33,101]],[[[41,[33,50,[\\\"loading\\\",\\\"reportingAlerts\\\"]],[[[1,\\\"                        \\\"],[10,1],[14,0,\\\"page-number-indicator loading\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,2],[\\\"common.loading\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,1],[14,0,\\\"page-number-indicator\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,2],[\\\"common.pageOf\\\"],[[\\\"current\\\",\\\"total\\\"],[[33,102],[33,103]]]]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[]],null],[1,\\\"                \\\"],[10,0],[14,0,\\\"button-wrapper\\\"],[12],[1,\\\"\\\\n\\\"],[41,[51,[33,104]],[[[1,\\\"                        \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link next-button\\\"],[24,4,\\\"button\\\"],[4,[38,4],[[30,0],\\\"nextAlertsPage\\\"],null],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,2],[\\\"common.next\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[15,0,[29,[\\\"notifications \\\",[52,[51,[33,105]],\\\"hide\\\"]]]],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,14],[[28,[37,14],[[33,106]],null]],null],\\\"@index\\\",[[[1,\\\"                \\\"],[1,[28,[35,107],null,[[\\\"message\\\"],[[30,11]]]]],[1,\\\"\\\\n\\\"]],[11]],[[[1,\\\"                \\\"],[10,1],[14,0,\\\"text-center block-panel\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,2],[\\\"notification.inbox.noNotifications\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[\\\"groupData\\\",\\\"recording\\\",\\\"evaluation\\\",\\\"timeOffRequest\\\",\\\"shiftTradeRequest\\\",\\\"adherenceExplanation\\\",\\\"coachingAppointment\\\",\\\"learningAssignment\\\",\\\"reportingExport\\\",\\\"reportingAlert\\\",\\\"notification\\\"],false,[\\\"if\\\",\\\"showHeader\\\",\\\"t\\\",\\\"toggle-item-bar\\\",\\\"action\\\",\\\"itemToggled\\\",\\\"currentChoice\\\",\\\"inboxPanelConfigs\\\",\\\"inboxPanelAttentionCounts\\\",\\\"drop-down\\\",\\\"showReadOptions\\\",\\\"currentFilter\\\",\\\"showGroupVoicemailFilter\\\",\\\"each\\\",\\\"-track-array\\\",\\\"voicemailGroups\\\",\\\"unless\\\",\\\"dropdown-menu\\\",\\\"currentChoiceTitle\\\",\\\"phone\\\",\\\"hasVoicemailAccess\\\",\\\"unreadVoicemails\\\",\\\"validChoices\\\",\\\"unreadFaxes\\\",\\\"canViewRecordings\\\",\\\"unreadRecordings\\\",\\\"hasEvaluationAccess\\\",\\\"unreadEvaluations\\\",\\\"hasTimeOffRequestAccess\\\",\\\"unreadTimeOffRequests\\\",\\\"hasShiftTradeRequestAccess\\\",\\\"unreadShiftTradeRequests\\\",\\\"hasAdherenceExplanationAccess\\\",\\\"unreadAdherenceExplanations\\\",\\\"hasCoachingAppointmentAccess\\\",\\\"unreadCoachingAppointments\\\",\\\"hasLearningAssignmentAccess\\\",\\\"unreadLearningAssignments\\\",\\\"assignmentMessages\\\",\\\"showVoicemails\\\",\\\"frame-router\\\",\\\"voicemailFrameId\\\",\\\"voicemailFrameConfig\\\",\\\"showFaxes\\\",\\\"faxesFrameId\\\",\\\"faxesFrameConfig\\\",\\\"showRecordings\\\",\\\"recordings\\\",\\\"inbox-panel-v2/voice-recording-v2\\\",\\\"inCallControls\\\",\\\"inbox\\\",\\\"eq\\\",\\\"recordFilter\\\",\\\"disableRecordingsBackButton\\\",\\\"disableRecordingsPageNumber\\\",\\\"recordingsPageNumber\\\",\\\"recordingsPageCount\\\",\\\"disableRecordingsNextButton\\\",\\\"showEvaluations\\\",\\\"evaluations\\\",\\\"inbox-panel-v2/evaluations-v2\\\",\\\"showTimeOffRequests\\\",\\\"timeOffRequests\\\",\\\"inbox-panel-v2/time-off-requests-v2\\\",\\\"isTimeOffRequestsLoading\\\",\\\"showShiftTradeRequests\\\",\\\"shiftTradeRequests\\\",\\\"inbox-panel-v2/shift-trade-requests-v2\\\",\\\"showAdherenceExplanations\\\",\\\"adherenceExplanations\\\",\\\"inbox-panel-v2/adherence-explanations\\\",\\\"showCoachingAppointments\\\",\\\"coachingAppointments\\\",\\\"inbox-panel-v2/coaching-appointments\\\",\\\"coachingAttendees\\\",\\\"hasCoachingUsability\\\",\\\"hasCoachingOverdue\\\",\\\"hasDevelopmentPlan\\\",\\\"loading\\\",\\\"showLearningAssignments\\\",\\\"learningAssignments\\\",\\\"inbox-panel-v2/learning-assignments\\\",\\\"showReportingExports\\\",\\\"inbox-panel-v2/export-expiration-summary\\\",\\\"newExportsAvailable\\\",\\\"reportingExports\\\",\\\"inbox-panel-v2/reporting-export\\\",\\\"isCopyStaticLinkEnabled\\\",\\\"exportFilter\\\",\\\"disableExportsBackButton\\\",\\\"disableExportsPageNumber\\\",\\\"exportsPageNumber\\\",\\\"exportsPageCount\\\",\\\"disableExportsNextButton\\\",\\\"showReportingAlerts\\\",\\\"newAlertsAvailable\\\",\\\"canManageAlerts\\\",\\\"reportingAlerts\\\",\\\"inbox-panel-v2/reporting-alert\\\",\\\"alertFilter\\\",\\\"disableAlertsBackButton\\\",\\\"disableAlertsPageNumber\\\",\\\"alertsPageNumber\\\",\\\"alertsPageCount\\\",\\\"disableAlertsNextButton\\\",\\\"showNotifications\\\",\\\"notifications\\\",\\\"notification-message\\\"]]\",\"moduleName\":\"web-directory/components/inbox-panel-v2/template.hbs\",\"isStrictMode\":false});","import { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@ember/component';\nimport _ from 'lodash';\nimport moment from '../../../utils/dates';\n\nexport default Component.extend({\n    classNames: ['inbox-message', 'timeOffRequest-message-v2', 'clickable', 'timeOffRequest-message'],\n    classNameBindings: ['timeOffRequest.markedAsRead:read:unread'],\n    hovered: false,\n    clock: service(),\n    inbox: service(),\n    intl: service(),\n    session: service(),\n    wfm: service(),\n\n    mouseEnter: function () {\n        this.set('hovered', true);\n    },\n\n    mouseLeave: function () {\n        this.set('hovered', false);\n    },\n\n    actions: {\n        changeStatus: function (status) {\n            this.wfm.changeTimeOffRequestReadState(this.timeOffRequest, status);\n        },\n        readAndViewDetails: function () {\n            this.wfm.changeTimeOffRequestReadState(this.timeOffRequest, true);\n            this.wfm.readTimeOffRequest(this.timeOffRequest);\n        },\n        handleKeyDown(event) {\n            if (event.key !== 'Enter') {\n                return;\n            }\n            this.send('readAndViewDetails');\n            event.stopPropagation();\n        }\n    },\n\n    agentName: computed('timeOffRequest.timeOffRequest.user', function () {\n        const userGuid = this.get('timeOffRequest.timeOffRequest.user.id');\n        if (userGuid) {\n            return this.wfm.getAgentNameById(userGuid);\n        }\n        return null;\n    }),\n\n    displayedAgentName: computed('timeOffRequest.timeOffRequest.user', function () {\n        return this.agentName || this.intl.t('notification.inbox.unknownAgent');\n    }),\n\n    isMyRequest: computed(\n        'timeOffRequest.agentNotification',\n        'timeOffRequest.timeOffRequest.user',\n        'session.person.id',\n        function () {\n            return (\n                this.get('timeOffRequest.agentNotification') &&\n                this.get('timeOffRequest.timeOffRequest.user.id') === this.get('session.person.id')\n            );\n        }\n    ),\n\n    localizedStatus: computed('timeOffRequest.timeOffRequest.status', function () {\n        return this.intl.t(`notification.inbox.timeOffRequest.${this.timeOffRequest.timeOffRequest.status}`);\n    }),\n\n    // Formats list of dates to MMM D, MMM D - MMM D\n    // dateShortMonthDayFormat is MMM D, dateRange is startdate - enddate (for ranges), dateRangerDelimiter is ', ' in this example\n    dateRangeDescription: computed(\n        'timeOffRequest.timeOffRequest.fullDayManagementUnitDates',\n        'timeOffRequest.timeOffRequest.partialDayStartDateTimes',\n        function () {\n            const fullDatesRaw = this.get('timeOffRequest.timeOffRequest.fullDayManagementUnitDates');\n            const fulldates = fullDatesRaw === undefined ? [] : fullDatesRaw;\n            const partialDatesRaw = this.get('timeOffRequest.timeOffRequest.partialDayStartDateTimes');\n            const partialdates = partialDatesRaw === undefined ? [] : partialDatesRaw;\n            const dates = fulldates.concat(partialdates);\n\n            const rangePairs = [];\n            let rangeStart;\n            let rangeEnd;\n            const datesLength = dates.length;\n            const dateFormat = this.intl.t('notification.inbox.dateShortMonthDayFormat');\n            for (let i = 0; i <= datesLength - 1; i++) {\n                const currentDate = moment(dates[i]);\n                const nextDay = moment(currentDate).add(1, 'day');\n                const nextDate = moment(dates[i + 1]);\n\n                if (i === datesLength - 1 || !nextDay.isSame(nextDate)) {\n                    if (rangeStart === undefined) {\n                        rangeStart = currentDate.format(dateFormat);\n                        rangePairs.push(rangeStart);\n                    } else {\n                        rangeEnd = currentDate.format(dateFormat);\n                        const rangePair = this.intl.t('components.inbox.dateRange', {\n                            start: rangeStart,\n                            end: rangeEnd\n                        });\n                        rangePairs.push(rangePair);\n                    }\n                    rangeStart = undefined;\n                    rangeEnd = undefined;\n                } else {\n                    if (rangeStart === undefined) {\n                        rangeStart = currentDate.format(dateFormat);\n                    }\n                }\n            }\n            const groups = _.uniq(rangePairs);\n            const list = groups.join(this.intl.t('notification.inbox.timeOffRequest.dateRangeDelimiter'));\n            return list;\n        }\n    ),\n\n    date: computed('timeOffRequest.timestamp', function () {\n        const date = moment(this.get('timeOffRequest.timestamp'));\n        const locale = this.get('intl.isoLocale');\n        return date.locale(locale).format('LL');\n    }),\n\n    time: computed('timeOffRequest.timestamp', function () {\n        const date = moment(this.get('timeOffRequest.timestamp'));\n        const locale = this.get('intl.isoLocale');\n        return date.locale(locale).format('LT');\n    }),\n\n    dateFromNow: computed('clock.minute', 'timeOffRequest.timestamp', function () {\n        // Consume clock.minute to establish Glimmer autotracking (Ember 3.28 compatibility)\n        this.get('clock.minute');\n        const date = moment(this.get('timeOffRequest.timestamp'));\n        const locale = this.get('intl.isoLocale');\n        return date.locale(locale).fromNow();\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"ih26qPz+\",\"block\":\"[[[10,0],[14,0,\\\"inbox-row\\\"],[12],[1,\\\"\\\\n    \\\"],[11,0],[24,0,\\\"right\\\"],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[16,\\\"onkeydown\\\",[28,[37,0],[[30,0],\\\"handleKeyDown\\\"],null]],[4,[38,0],[[30,0],\\\"readAndViewDetails\\\"],null],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"information col-sm-8\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"ib-details\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,2],[[[1,\\\"                    \\\"],[1,[28,[35,3],[\\\"notification.inbox.timeOffRequest.description\\\"],[[\\\"dateRangeDescription\\\",\\\"status\\\"],[[33,4],[33,5]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[1,[28,[35,3],[\\\"notification.inbox.timeOffRequest.adminDescription\\\"],[[\\\"dateRangeDescription\\\",\\\"agentName\\\"],[[33,4],[33,6]]]]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"ib-time col-sm-4\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,7],[[[1,\\\"                \\\"],[10,0],[12],[1,[34,8]],[13],[1,\\\"\\\\n                \\\"],[10,0],[12],[1,[34,9]],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                \\\"],[1,[34,10]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"ib-action\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"dropdown pull-left\\\"],[12],[1,\\\"\\\\n\\\"],[6,[39,11],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[[33,12],\\\"inbox-panel-v2.time-off-requests-v2\\\"]],[[\\\"default\\\"],[[[[1,\\\"                \\\"],[10,\\\"button\\\"],[14,0,\\\"btn btn-link btn-sm dropdown-toggle menu-selector\\\"],[15,\\\"aria-label\\\",[28,[37,3],[\\\"common.more\\\"],null]],[15,1,[29,[[30,0,[\\\"elementId\\\"]],\\\"-dropdownMenu\\\"]]],[14,\\\"aria-haspopup\\\",\\\"true\\\"],[15,\\\"aria-expanded\\\",[29,[[36,12]]]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"menu-kebab-horizontal\\\"],[15,\\\"screenreader-text\\\",[28,[37,3],[\\\"common.more\\\"],null]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"ul\\\"],[15,0,[29,[\\\"dropdown-menu \\\",[52,[33,12],\\\"show\\\"]]]],[15,\\\"aria-labelledby\\\",[29,[[30,0,[\\\"elementId\\\"]],\\\"-dropdownMenu\\\"]]],[12],[1,\\\"\\\\n\\\"],[41,[33,13,[\\\"markedAsRead\\\"]],[[[1,\\\"                        \\\"],[10,\\\"li\\\"],[12],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"btn btn-link toggle-read-unread\\\"],[4,[38,0],[[30,0],\\\"changeStatus\\\",false],null],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,3],[\\\"components.inbox.actions.markAsUnread\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,\\\"li\\\"],[12],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"btn btn-link toggle-read-unread\\\"],[4,[38,0],[[30,0],\\\"changeStatus\\\",true],null],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,3],[\\\"components.inbox.actions.markAsRead\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                    \\\"],[10,\\\"li\\\"],[12],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"btn btn-link details\\\"],[4,[38,0],[[30,0],\\\"readAndViewDetails\\\"],null],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,3],[\\\"components.inbox.actions.viewDetails\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"action\\\",\\\"if\\\",\\\"isMyRequest\\\",\\\"t\\\",\\\"dateRangeDescription\\\",\\\"localizedStatus\\\",\\\"displayedAgentName\\\",\\\"hovered\\\",\\\"date\\\",\\\"time\\\",\\\"dateFromNow\\\",\\\"drop-down\\\",\\\"showDropdown\\\",\\\"timeOffRequest\\\"]]\",\"moduleName\":\"web-directory/components/inbox-panel-v2/time-off-requests-v2/template.hbs\",\"isStrictMode\":false});","import { observer, get, computed } from '@ember/object';\nimport { resolve } from 'rsvp';\nimport { schedule } from '@ember/runloop';\nimport { A } from '@ember/array';\nimport { not, or, alias, bool, and, reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport Component from '@ember/component';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport moment from '../../../utils/dates';\nimport { formatDateForDisplay, formatTimeForDisplay } from 'web-directory/utils/date-time';\n\nexport default Component.extend({\n    classNames: ['inbox-message', 'clickable', 'voice-recording-v2'],\n    classNameBindings: [\n        'activeRecording::hide-voicemail',\n        'activeRecording:active',\n        'isRead:read:unread',\n        'recording.id'\n    ],\n\n    intl: service(),\n    phone: service(),\n    inbox: service(),\n    clock: service(),\n    timeline: service(),\n    notification: service(),\n    addressformat: service(),\n    permissions: service(),\n    session: service(),\n    store: service(),\n    logger: service('stash-logger'),\n\n    showDropdown: false,\n    showConferenceDropdown: false,\n\n    recording: null,\n    hovered: false,\n    activeRecording: false,\n\n    isNonEditable: true,\n    isEditable: not('isNonEditable'),\n\n    makingCall: false,\n    callConnecting: false,\n    callId: null,\n\n    inCallControls: false,\n\n    stopPlayingVoicemail: null,\n\n    mouseEnter: function () {\n        this.set('hovered', true);\n    },\n\n    mouseLeave: function () {\n        if (this.isNonEditable) {\n            this.set('hovered', false);\n        }\n    },\n\n    getOtherParties: async function () {\n        let participants = await this.participants;\n\n        if (participants.length === 0) {\n            return A([]);\n        }\n\n        // Filter out the current user\n        const currentUserGuid = this.get('session.person.guid');\n        participants = participants.filter(p => currentUserGuid !== p.get('userId'));\n\n        // Filter out any partitipant purposes that are not agent, external, or user\n        participants = participants.filter(p => {\n            const purpose = p.get('purpose');\n            return purpose === 'agent' || purpose === 'external' || purpose === 'user';\n        });\n\n        return A(participants);\n    },\n\n    /**\n     * Takes in the other external recording party and searches through the recording participants to return:\n     *      'ani' if:\n     *          the participant IS a Genesys Auth User:\n     *          AND:\n     *          the participant and other party 'dnis' ARE equal:\n     *      'dnis' if:\n     *          the participant IS NOT a Genesys Auth User:\n     *          OR:\n     *          the participant and other party 'dnis' ARE NOT equal:\n     * @param {*} otherParty the other external party on the recording\n     * @returns the teleComType 'ani' or 'dnis'\n     */\n    getTeleComType: async function (otherParty) {\n        const participants = (await this.participants).toArray();\n        return participants.find(participant => {\n            const participantIsAuthUser = participant.get('userId') === this.get('session.person.id');\n            const participantDnisAndOtherPartyDnisEqual = participant.get('dnis') === otherParty.get('dnis');\n            return participantIsAuthUser && participantDnisAndOtherPartyDnisEqual;\n        })\n            ? 'ani'\n            : 'dnis';\n    },\n\n    actions: {\n        async sendToProfile() {\n            const entity = await this.person;\n            this.bubbleAction({\n                action: 'transitionToEntityDetail',\n                actionContext: [entity]\n            });\n        },\n        toggleRename() {\n            this.send('hideDropdown');\n            this.set('isNonEditable', false);\n            this.set('hovered', true);\n\n            schedule('afterRender', this, function () {\n                const input = this.element.querySelector('.ib-cancellable-textbox input');\n                if (input) {\n                    input.focus();\n                }\n                return;\n            });\n        },\n\n        cancelEditName() {\n            this.set('isNonEditable', true);\n        },\n\n        downloadMedia() {\n            this.send('hideDropdown');\n\n            this.recording.fetchAudio('wav', true).then(() => {\n                const newWindow = window.open(this.get('recording.mediaUri'), '_blank');\n                if (!newWindow || newWindow.closed || typeof newWindow.closed === 'undefined') {\n                    const title = this.intl.safestring('notification.inbox.errorDownloadingVoicemail.title').toString();\n                    const message = this.intl\n                        .safestring('notification.inbox.errorDownloadingVoicemail.message')\n                        .toString();\n                    this.notification.error(title, message);\n                }\n            });\n        },\n\n        openMedia(event) {\n            if (this.isEditable) {\n                return;\n            }\n\n            const target = event.target;\n            if (target.classList.contains('action-audio') || target.closest('.action-audio')) {\n                return;\n            }\n            this.toggleProperty('activeRecording');\n            this.timeline.markRead('call', this.get('recording.conversation.id'));\n        },\n\n        async makeCall() {\n            if (this.makingCall || this.showSpinner) {\n                return resolve();\n            }\n\n            const cannotCall = await this.cannotMakeCall;\n            if (cannotCall) {\n                return resolve();\n            }\n\n            this.set('makingCall', true);\n            this.set('callConnecting', true);\n            this.send('hideDropdown');\n\n            const stopVoicemail = this.stopPlayingVoicemail;\n            if (stopVoicemail && typeof stopVoicemail === 'function') {\n                stopVoicemail();\n            }\n\n            return this.person\n                .then(person => {\n                    const recording = this.recording;\n                    let phoneNumber = recording.get('callerAddress');\n                    if (person) {\n                        phoneNumber = person;\n                    }\n                    return this.phone.makeCall(phoneNumber, person);\n                })\n                .then(call => this.set('callId', call.id))\n                .then(() => {\n                    this.bubbleAction({\n                        action: 'openPanel',\n                        actionContext: ['callControls']\n                    });\n                })\n                .catch(error => {\n                    console.error('Failed to make a call from voice recording.', { error });\n                })\n                .finally(() => {\n                    this.set('makingCall', false);\n                });\n        },\n\n        confirmDelete() {\n            this.send('hideDropdown');\n            this.set('isShowingDeleteConfirmation', true);\n        },\n\n        close() {\n            this.set('isShowingDeleteConfirmation', false);\n        },\n\n        openChat() {\n            this.send('hideDropdown');\n            this.person.then(p => {\n                const jid = p.get('jid');\n                this.bubbleAction({\n                    action: 'openChatRoom',\n                    actionContext: [jid]\n                });\n            });\n        },\n\n        deleteAttachment() {\n            let recording = this.recording;\n            recording.deleteRecord();\n            const type = this.isVoicemail ? 'voicemail' : 'recording';\n\n            recording\n                .save()\n                .then(() => {\n                    this.inbox.deleteRecording(recording, type);\n                })\n                .catch(function (e) {\n                    console.error('Failed to DELETE voicemail', { error: e });\n                })\n                .finally(() => this.send('close'));\n        },\n\n        changeText(value) {\n            if (!value || value === '') {\n                const title = this.intl.safestring('notification.inbox.errorUpdatingName.title').toString();\n                const message = this.intl.safestring('notification.inbox.errorUpdatingName.message').toString();\n                this.notification.error(title, message);\n                return;\n            }\n            this.set('isNonEditable', true);\n            this.set('recording.name', value);\n            this.recording\n                .save()\n                .then(recording => {\n                    console.log('recording status updated', recording);\n                })\n                .catch(error => {\n                    console.error(\"failed to update the message's name.\", error);\n                });\n        },\n\n        toggleRead(read) {\n            this.send('hideDropdown');\n            const currentRead = this.isRead;\n            read = read !== undefined ? read : !this.isRead;\n            this.set('recording.read', read);\n            this.recording\n                .save()\n                .then(recording => {\n                    console.log('recording status updated', recording);\n                })\n                .catch(error => {\n                    console.error('failed to mark the message as read.', { error });\n                    this.set('recording.read', currentRead);\n                    const title = this.intl.safestring('notification.inbox.errorUpdatingRead.title').toString();\n                    const message = this.intl.safestring('notification.inbox.errorUpdatingRead.message').toString();\n                    this.notification.error(title, message);\n                });\n            const inboxLink = document.querySelector('.action-item.inbox a');\n            if (inboxLink) {\n                inboxLink.classList.remove('faa-horizontal', 'animated');\n            }\n        },\n\n        markRead() {\n            if (!this.isRead) {\n                this.send('toggleRead');\n            }\n        },\n\n        toggleEditNotes() {\n            this.toggleProperty('editingNotes');\n        },\n\n        saveNotes(notes) {\n            const recording = this.recording;\n            this.set('editingNotes', false);\n            this.set('recording.note', notes);\n            recording.save().catch(() => {\n                this.get('logger').error('Error saving notes for recording:', {\n                    recordingId: this.get('recording.id')\n                });\n\n                const title = this.intl.safestring('notification.inbox.errorSavingNotes.title').toString();\n                const message = this.intl.safestring('notification.inbox.errorSavingNotes.message').toString();\n                this.notification.error(title, message);\n\n                recording.rollbackAttributes();\n            });\n        },\n\n        toggleDropdown() {\n            this.toggleProperty('showDropdown');\n        },\n\n        hideDropdown() {\n            this.set('showDropdown', false);\n        },\n\n        registerStopVoicemailHandler(handler) {\n            this.set('stopPlayingVoicemail', handler);\n        }\n    },\n\n    callConnected: observer('phone.activeCall', function () {\n        const activeCall = this.get('phone.activeCall');\n\n        if (activeCall) {\n            const activeCallId = get(activeCall, 'id');\n            const componentCallIsActiveCall = activeCallId === this.callId;\n            if (componentCallIsActiveCall) {\n                this.set('callConnecting', false);\n            }\n        }\n    }),\n\n    showSpinner: computed('makingCall', 'callConnecting', function () {\n        return this.makingCall || this.callConnecting;\n    }),\n\n    isHoveredOrActive: or('hovered', 'activeRecording'),\n\n    copiedText: computed('recording.{copiedTo,copiedFrom}', function () {\n        let recording = this.recording;\n        if (!_.isEmpty(recording.get('copiedTo'))) {\n            let entity = recording.get('copiedTo').sortBy('date').get('lastObject');\n\n            if (!entity.user && !entity.group) {\n                return null;\n            }\n\n            let user = entity.user ? entity.user.name : entity.group.name;\n            return this.intl.t('components.inbox.forwardedTo', { user: user });\n        } else if (!_.isEmpty(recording.get('copiedFrom'))) {\n            let user = recording.get('copiedFrom.user.name') || recording.get('copiedFrom.group.name');\n            return this.intl.t('components.inbox.forwardedFrom', { user: user });\n        }\n        return null;\n    }),\n\n    name: computed('recording.{name,callerName,callerAddress}', 'activeRecording', {\n        get: async function () {\n            const recording = this.recording;\n            const recordingName = recording.get('name');\n            // Server names recordings as `Recording` by default, regardless of session language\n            if (recordingName === 'Recording') {\n                return this.intl.t('components.inbox.recording').toString();\n            }\n\n            const calculatedName = await this.getDefaultName();\n\n            return recordingName || calculatedName;\n        },\n        // Changing the name really changes the record's name, but doesn't persist it until the user chooses to.\n        set: function (key, value) {\n            let recording = this.recording;\n            recording.set('name', value);\n            return value;\n        }\n    }),\n\n    callerId: computed('name', async function () {\n        let callerId;\n\n        const participants = await this.participants;\n        if (participants.length > 2) {\n            callerId = this.intl.t('components.inbox.multipleParticipants').toString();\n        } else {\n            let otherParties = await this.getOtherParties();\n            let otherParty = otherParties && otherParties.length > 0 ? otherParties.objectAt(0) : null;\n            let otherPartyName = otherParty.get('name');\n\n            if (otherParty.get('userId')) {\n                callerId = otherPartyName;\n            } else {\n                const otherPartyAddress = this.get('recording.callerAddress');\n\n                if (otherPartyAddress && otherPartyAddress !== otherPartyName) {\n                    const addressFormat = this.addressFormat;\n                    const formattedAddress = await addressFormat.formatOrLookupAddressForDisplay(\n                        otherPartyAddress,\n                        null\n                    );\n                    callerId = `${otherPartyName} ${formattedAddress}`;\n                } else {\n                    callerId = otherPartyName;\n                }\n            }\n        }\n\n        return callerId;\n    }),\n\n    isNameNotDefault: computed('recording.name', 'isEditable', function () {\n        let recording = this.recording;\n\n        let calculatedName = this.getDefaultName(),\n            recordingName = recording.get('name');\n\n        let isEditing = this.isEditable,\n            sameValue = recordingName !== calculatedName;\n\n        return isEditing || sameValue;\n    }),\n\n    otherPartyAddress: alias('recording.otherParty.address'),\n\n    isVoicemailParticipantInternal: bool('recording.callerUser'),\n\n    isRecordingParticipantInternal: computed('participants', async function () {\n        const otherParties = await this.getOtherParties();\n        if (otherParties.length > 1) {\n            return false;\n        }\n\n        return otherParties.objectAt(0).get('purpose') === 'user';\n    }),\n\n    isPurecloudUser: or('isVoicemailParticipantInternal', 'isRecordingParticipantInternal'),\n\n    person: computed('participants', 'recording.callerUser', async function () {\n        let personPromise = resolve();\n\n        const recording = this.recording;\n        if (recording) {\n            let userGuid = null;\n            let otherParties = await this.getOtherParties();\n\n            // If there is more than one other party, then we can't return anything becuase the person is ambigious\n            if (otherParties.length > 1) {\n                return personPromise;\n            }\n\n            let otherParty = otherParties && otherParties.length > 0 ? otherParties.objectAt(0) : null;\n\n            if (otherParty) {\n                if (otherParty.get('purpose') === 'external') {\n                    const teleComType = await this.getTeleComType(otherParty);\n                    personPromise = resolve(otherParty.get(teleComType));\n                } else {\n                    userGuid = otherParty.get('userId');\n                }\n            } else if (recording.get('callerUser.id')) {\n                userGuid = recording.get('callerUser.id');\n            }\n\n            if (userGuid) {\n                personPromise = this.store.findRecord('person', userGuid);\n            }\n        }\n\n        return personPromise;\n    }),\n\n    participants: computed('recording', async function () {\n        let participants = A([]);\n\n        const conversation = await this.get('recording.conversation');\n        if (conversation && conversation.get) {\n            // <-- some conversations are not ember objects?\n            participants = await conversation.get('participants');\n        }\n\n        return participants;\n    }),\n\n    phoneDisabled: computed('phone.enabled', 'phone.phoneDisabled', function () {\n        return !this.get('phone.enabled') || this.get('phone.phoneDisabled');\n    }),\n\n    cannotMakeCall: computed(\n        'phone.enabled',\n        'phone.phoneDisabled',\n        'person',\n        'recording.callerAddress',\n        async function () {\n            return this.person.then(person => {\n                const phoneNumber = this.get('recording.callerAddress');\n                return !(person || phoneNumber);\n            });\n        }\n    ),\n\n    personEmails: computed('person', function () {\n        let promise = this.person.then(person => {\n            return this.getContactFieldValuesByType(person, 'email');\n        });\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    }),\n\n    personPhones: computed('person', function () {\n        let promise = this.person.then(person => {\n            let phoneNumbers = this.getContactFieldValuesByType(person, 'voice') || [];\n            return phoneNumbers.map(field => {\n                let address = this.addressformat.format(field.data);\n                return {\n                    field,\n                    address,\n                    display: this.addressformat.formatAddressForDisplay(address)\n                };\n            });\n        });\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    }),\n\n    personId: computed('person', async function () {\n        let person = await this.person;\n        return get(person, 'id');\n    }),\n\n    date: computed('recording.date', function () {\n        return formatDateForDisplay(this.get('recording.date'), 'long');\n    }),\n\n    time: computed('recording.date', function () {\n        return formatTimeForDisplay(this.get('recording.date'), 'short');\n    }),\n\n    dateFromNow: computed('clock.minute', 'recording.date', function () {\n        // Consume clock.minute to establish Glimmer autotracking (Ember 3.28 compatibility)\n        this.get('clock.minute');\n        const date = moment(this.get('recording.date')).locale(this.get('intl.isoLocale'));\n\n        return date.fromNow();\n    }),\n\n    isRead: computed('recording.read', function () {\n        return this.get('recording.read');\n    }),\n\n    deleteTooltipText: computed(function () {\n        return this.intl.safestring('tooltip.recording.delete').toString();\n    }),\n\n    callBackTooltipText: computed(function () {\n        return this.intl.safestring('tooltip.recording.callBack').toString();\n    }),\n\n    toggleReadTooltipText: computed('isRead', function () {\n        if (this.isRead) {\n            return this.intl.safestring('tooltip.recording.markUnread').toString();\n        }\n        return this.intl.safestring('tooltip.recording.markRead').toString();\n    }),\n\n    isVoicemail: computed('recording.type', function () {\n        return this.get('recording.type') === 'voicemail';\n    }),\n\n    isRecording: not('isVoicemail'),\n\n    isConference: computed('participants', async function () {\n        const participants = await this.participants;\n        return participants.length > 2;\n    }),\n\n    isRemainingParticipant: bool('remainingParticipants.length'),\n\n    groupImageUrl: computed('isConference', function () {\n        return this.get('applicationService.urlprefix') + 'assets/images/svg/group.svg';\n    }),\n\n    remainingParticipants: computed('isConference', async function () {\n        const isConference = await this.isConference;\n        if (isConference) {\n            const otherParticipants = await this.getOtherParties();\n            const ids = otherParticipants.map(function (participant) {\n                return participant.userId;\n            });\n\n            return DS.PromiseArray.create({\n                promise: this.store.findMany('person', ids)\n            });\n        }\n        return [];\n    }),\n\n    isConferenceAndRecording: and('isConference', 'activeRecording', 'isRemainingParticipant'),\n\n    groupName: reads('recording.group.name'),\n\n    async getDefaultName() {\n        const addressformatService = this.addressformat;\n        const recording = this.recording;\n        const activeRecording = this.activeRecording;\n        const intl = this.intl;\n        const conversation = recording.get('conversation');\n        const { callerUser, callerName, callerAddress } = recording;\n\n        if (callerName || callerAddress) {\n            if (callerUser || callerName) {\n                return callerName || addressformatService.format(callerAddress);\n            } else {\n                return callerAddress ? addressformatService.format(callerAddress) : callerName;\n            }\n        } else if (!conversation || conversation.get('participants.length') < 1) {\n            return intl.safestring('purecloud.error.phoneNumberInvalid').toString();\n        }\n\n        const otherParties = await this.getOtherParties();\n        const otherParty = otherParties.length ? otherParties.objectAt(0) : null;\n        let defaultName = '';\n\n        if (otherParty && otherParty.name) {\n            if (conversation.get('participants.length') < 3) {\n                defaultName = otherParty.name;\n            } else if (activeRecording) {\n                defaultName = otherParties.mapBy('name').join(', ');\n            } else {\n                defaultName = intl.t('components.inbox.labels.conferenceRecording', {\n                    participantsCount: conversation.get('participants.length')\n                });\n            }\n\n            return defaultName;\n        } else if (conversation.get('isOutbound')) {\n            defaultName = addressformatService.formatAddressForDisplay(otherParty.dnis);\n        } else {\n            defaultName = addressformatService.formatAddressForDisplay(otherParty.ani);\n        }\n\n        return defaultName;\n    },\n\n    formattedCallerAddress: computed('name', async function () {\n        const { callerName, callerAddress } = this.recording;\n        let callerAddr;\n        if (callerAddress && callerAddress.indexOf('sip') > -1) {\n            callerAddr = resolve();\n        } else if (callerName !== callerAddress) {\n            const addressformatService = this.addressformat;\n            callerAddr = await addressformatService.formatOrLookupAddressForDisplay(callerAddress);\n        }\n        return callerAddr;\n    }),\n\n    getContactFieldValuesByType(person, type) {\n        if (!person || !person.getContactFieldValuesByType) {\n            return [];\n        }\n        let items = person.getContactFieldValuesByType(type).map(function (item) {\n            return { data: item };\n        });\n        let primary = person.getFieldValue(`primaryContactInfo.${type}`, true);\n        if (!_.isEmpty(primary)) {\n            var primaryItem = _.find(items, function (item) {\n                return get(item.data, '_id') === get(primary, 'value.fieldId');\n            });\n            if (primaryItem) {\n                primaryItem.primary = true;\n            }\n        }\n        return _.sortBy(items, function (item) {\n            return item.primary;\n        });\n    }\n}).reopenClass({ positionalParams: ['recording'] });\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"UjLiWKq5\",\"block\":\"[[[10,0],[14,0,\\\"inbox-row\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"image\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,1],[[33,2]],null],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"entity-image chat-presence offline\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"img\\\"],[15,\\\"alt\\\",[28,[37,3],[\\\"images.userSubmitted\\\"],null]],[14,0,\\\"full-width-image entity-person\\\"],[15,\\\"src\\\",[29,[[36,4]]]],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,1],[[33,5]],null],[[[6,[39,6],null,[[\\\"entity\\\",\\\"showPresence\\\",\\\"enableMiniCard\\\"],[[28,[37,1],[[33,5]],null],true,true]],[[\\\"default\\\"],[[[[1,\\\"                \\\"],[1,[28,[35,7],null,[[\\\"entity\\\"],[[28,[37,1],[[33,5]],null]]]]],[1,\\\"\\\\n\\\"]],[]]]]]],[]],[[[6,[39,6],null,[[\\\"entity\\\",\\\"showPresence\\\",\\\"enableMiniCard\\\"],[[28,[37,1],[[33,5]],null],false,false]],[[\\\"default\\\"],[[[[1,\\\"                \\\"],[1,[28,[35,7],null,[[\\\"entity\\\"],[[28,[37,1],[[33,5]],null]]]]],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"        \\\"]],[]]]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"right\\\"],[15,\\\"onclick\\\",[28,[37,8],[[30,0],\\\"openMedia\\\"],null]],[14,\\\"tabindex\\\",\\\"0\\\"],[14,\\\"role\\\",\\\"button\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"information\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"no-padding name\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,9],[[33,10],[33,11]],null],[[[1,\\\"                    \\\"],[1,[28,[35,12],null,[[\\\"value\\\",\\\"onEnter\\\",\\\"onCancel\\\",\\\"isNonEditable\\\"],[[28,[37,1],[[33,13]],null],[28,[37,8],[[30,0],\\\"changeText\\\"],null],[28,[37,8],[[30,0],\\\"cancelEditName\\\"],null],[33,14]]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,15,[\\\"isGroupVoicemail\\\"]],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"group-name-ani\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,1],[[33,13]],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"voicemail-from-label voicemail-group-name\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,1],[14,0,\\\"group-image\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,6],null,[[\\\"entity\\\"],[[33,15,[\\\"groupEntity\\\"]]]]]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                        \\\"],[10,1],[14,0,\\\"group-name\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[34,16]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"voicemail-from-label\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,1],[14,0,\\\"caller-name\\\"],[12],[1,[28,[35,1],[[33,13]],null]],[13],[1,\\\"\\\\n                        \\\"],[10,0],[14,0,\\\"caller-address\\\"],[12],[1,[28,[35,1],[[33,17]],null]],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"]],[]]]],[]]],[1,\\\"\\\\n\\\"],[41,[33,18],[[[1,\\\"                    \\\"],[10,0],[15,0,[29,[\\\"forwarded \\\",[52,[33,15,[\\\"copiedTo\\\"]],\\\"forwarded-to\\\",\\\"forwarded-from\\\"]]]],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[15,1,[29,[[36,19],\\\"-copied-icon\\\"]]],[14,\\\"icon-name\\\",\\\"arrow-right\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,19],\\\"-copied-icon\\\"]]],[14,\\\"placement\\\",\\\"bottom\\\"],[12],[1,\\\"\\\\n                            \\\"],[2,[36,18]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,20],[[[1,\\\"                    \\\"],[1,[28,[35,3],[\\\"common.and\\\"],null]],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"dropdown\\\"],[12],[1,\\\"\\\\n\\\"],[6,[39,21],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\",\\\"attachOutsideClick\\\"],[[33,22],\\\"voice-recording-v2.conference-participants\\\",true]],[[\\\"default\\\"],[[[[1,\\\"                            \\\"],[10,\\\"button\\\"],[14,0,\\\"btn btn-link btn-sm dropdown-toggle menu-selector\\\"],[14,\\\"aria-haspopup\\\",\\\"true\\\"],[15,\\\"aria-expanded\\\",[29,[[36,22]]]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,3],[\\\"components.inbox.labels.howManyOthers\\\"],[[\\\"noOfOthers\\\"],[[33,23,[\\\"length\\\"]]]]]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                            \\\"],[10,\\\"ul\\\"],[15,0,[29,[\\\"dropdown-menu \\\",[52,[33,22],\\\"show\\\"]]]],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,25],[[28,[37,25],[[33,23]],null]],null],null,[[[1,\\\"                                    \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n                                        \\\"],[10,0],[14,0,\\\"ib-entitydropdown\\\"],[12],[1,\\\"\\\\n                                            \\\"],[10,0],[14,0,\\\"entity-person\\\"],[12],[1,\\\"\\\\n\\\"],[6,[39,6],null,[[\\\"entity\\\",\\\"showPresence\\\"],[[28,[37,1],[[30,1]],null],true]],[[\\\"default\\\"],[[[[1,\\\"                                                    \\\"],[1,[28,[35,7],null,[[\\\"entity\\\"],[[28,[37,1],[[30,1]],null]]]]],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"                                            \\\"],[13],[1,\\\"\\\\n                                            \\\"],[10,0],[14,0,\\\"entity-person-name\\\"],[12],[1,\\\"\\\\n                                                \\\"],[10,3],[14,6,\\\"#\\\"],[12],[1,[30,1,[\\\"name\\\"]]],[13],[1,\\\"\\\\n                                            \\\"],[13],[1,\\\"\\\\n                                        \\\"],[13],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"caller-id\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,1],[[33,26]],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[14,0,\\\"ib-time\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,27],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"absolute-time\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,0],[12],[1,[34,28]],[13],[1,\\\"\\\\n                    \\\"],[10,0],[12],[1,[34,29]],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"relative-time\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[34,30]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[14,0,\\\"item action-audio\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,31],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"row\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"col-sm-12 ib-player\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,0],[14,0,\\\"voicemail\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,0],[14,0,\\\"message\\\"],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,32],null,[[\\\"source\\\",\\\"markAsRead\\\",\\\"registerStopVoicemailHandler\\\"],[[33,15,[\\\"audioSource\\\"]],[28,[37,8],[[30,0],\\\"markRead\\\"],null],[28,[37,8],[[30,0],\\\"registerStopVoicemailHandler\\\"],null]]]]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                        \\\"],[10,0],[14,0,\\\"ib-download\\\"],[12],[1,\\\"\\\\n                            \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-secondary btn-lg\\\"],[16,\\\"title\\\",[28,[37,3],[\\\"components.inbox.actions.download\\\"],null]],[16,\\\"aria-label\\\",[28,[37,3],[\\\"components.inbox.actions.download\\\"],null]],[24,4,\\\"button\\\"],[4,[38,8],[[30,0],\\\"downloadMedia\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"download\\\"],[15,\\\"screenreader-text\\\",[28,[37,3],[\\\"components.inbox.actions.download\\\"],null]],[12],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,33],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"row\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,0],[14,0,\\\"col-sm-12 recording-notes\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,34],[[[1,\\\"                                \\\"],[1,[28,[35,35],null,[[\\\"recording\\\",\\\"save\\\",\\\"cancel\\\"],[[33,15],[28,[37,8],[[30,0],\\\"saveNotes\\\"],null],[28,[37,8],[[30,0],\\\"toggleEditNotes\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                \\\"],[10,1],[14,0,\\\"notes\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,15,[\\\"note\\\"]],[[[1,\\\"                                        \\\"],[1,[33,15,[\\\"note\\\"]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                        \\\"],[1,[28,[35,3],[\\\"components.inbox.emptyNotes\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                                \\\"],[13],[1,\\\"\\\\n\\\\n                                \\\"],[10,1],[14,0,\\\"edit\\\"],[12],[1,\\\"\\\\n                                    \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link\\\"],[24,4,\\\"button\\\"],[4,[38,8],[[30,0],\\\"toggleEditNotes\\\"],null],[12],[1,\\\"\\\\n                                        \\\"],[1,[28,[35,3],[\\\"common.edit\\\"],null]],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"ib-action\\\"],[12],[1,\\\"\\\\n\\\"],[41,[51,[33,37]],[[[1,\\\"            \\\"],[11,\\\"button\\\"],[16,1,[29,[[36,19],\\\"-make-call-btn\\\"]]],[16,0,[29,[\\\"btn btn-link btn-sm make-call \\\",[52,[28,[37,1],[[33,38]],null],\\\"disabled-btn\\\"]]]],[16,\\\"title\\\",[28,[37,3],[\\\"components.inbox.actions.call\\\"],null]],[16,\\\"aria-label\\\",[28,[37,3],[\\\"components.inbox.actions.call\\\"],null]],[16,\\\"aria-disabled\\\",[28,[37,1],[[33,38]],null]],[24,4,\\\"button\\\"],[4,[38,8],[[30,0],\\\"makeCall\\\"],null],[12],[1,\\\"\\\\n\\\"],[41,[33,39],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[15,\\\"screenreader-text\\\",[28,[37,3],[\\\"components.inbox.actions.callingInProgress\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"phone\\\"],[15,\\\"screenreader-text\\\",[28,[37,3],[\\\"components.inbox.actions.call\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,1],[[33,38]],null],[[[1,\\\"                \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,19],\\\"-make-call-btn\\\"]]],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,3],[\\\"components.inbox.recordingCannotCall\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null],[1,\\\"        \\\"],[10,0],[14,0,\\\"dropdown pull-left\\\"],[12],[1,\\\"\\\\n\\\"],[6,[39,21],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\"],[[33,40],\\\"inbox-panel-v2.voice-recording-v2\\\"]],[[\\\"default\\\"],[[[[1,\\\"                \\\"],[10,\\\"button\\\"],[14,0,\\\"btn btn-link btn-sm dropdown-toggle menu-selector\\\"],[15,1,[29,[[30,0,[\\\"elementId\\\"]],\\\"-dropdownMenu\\\"]]],[15,\\\"title\\\",[28,[37,3],[\\\"components.inbox.actions.moreActions\\\"],null]],[15,\\\"aria-label\\\",[28,[37,3],[\\\"components.inbox.actions.moreActions\\\"],null]],[14,\\\"aria-haspopup\\\",\\\"true\\\"],[15,\\\"aria-expanded\\\",[29,[[36,40]]]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"menu-kebab-horizontal\\\"],[15,\\\"screenreader-text\\\",[28,[37,3],[\\\"components.inbox.actions.moreActions\\\"],null]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"ul\\\"],[15,0,[29,[\\\"dropdown-menu \\\",[52,[33,40],\\\"show\\\"]]]],[15,\\\"aria-labelledby\\\",[29,[[30,0,[\\\"elementId\\\"]],\\\"-dropdownMenu\\\"]]],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,1],[[33,41]],null],[[[41,[33,42],[[[1,\\\"                            \\\"],[10,\\\"li\\\"],[14,0,\\\"list-header\\\"],[12],[1,\\\"\\\\n                                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"phone\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                                \\\"],[1,[28,[35,3],[\\\"components.inbox.labels.phone\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"],[42,[28,[37,25],[[28,[37,25],[[28,[37,1],[[33,42]],null]],null]],null],null,[[[1,\\\"                                \\\"],[10,\\\"li\\\"],[14,0,\\\"entry phone\\\"],[12],[1,\\\"\\\\n                                    \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"btn btn-link\\\"],[4,[38,8],[[30,0],\\\"makeCall\\\",[30,2,[\\\"address\\\"]]],null],[12],[1,\\\"\\\\n\\\"],[41,[30,2,[\\\"display\\\"]],[[[1,\\\"                                            \\\"],[1,[30,2,[\\\"display\\\"]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                            \\\"],[1,[30,2,[\\\"address\\\"]]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                                    \\\"],[13],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n\\\"]],[2]],null]],[]],null],[41,[33,43],[[[1,\\\"                            \\\"],[11,\\\"li\\\"],[24,0,\\\"list-header\\\"],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[4,[38,8],[[30,0],\\\"hideDropdown\\\"],null],[12],[1,\\\"\\\\n                                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"message-email\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                                \\\"],[1,[28,[35,3],[\\\"components.inbox.labels.email\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"],[42,[28,[37,25],[[28,[37,25],[[33,43]],null]],null],null,[[[1,\\\"                                \\\"],[10,\\\"li\\\"],[14,0,\\\"entry email\\\"],[12],[1,\\\"\\\\n                                    \\\"],[10,3],[15,6,[29,[\\\"mailto:\\\",[30,3,[\\\"ref\\\"]]]]],[14,0,\\\"btn btn-link\\\"],[12],[1,[30,3,[\\\"data\\\",\\\"value\\\"]]],[13],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n\\\"]],[3]],null]],[]],null],[41,[33,44,[\\\"canViewBusinessChat\\\"]],[[[1,\\\"                            \\\"],[10,\\\"li\\\"],[14,0,\\\"action-buttons list-header\\\"],[12],[1,\\\"\\\\n                                \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-default action-button\\\"],[24,4,\\\"button\\\"],[4,[38,8],[[30,0],\\\"openChat\\\"],null],[12],[1,\\\"\\\\n                                    \\\"],[1,[28,[35,3],[\\\"components.inbox.actions.openChat\\\"],null]],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[28,[37,1],[[33,45]],null],[[[1,\\\"                            \\\"],[11,\\\"li\\\"],[24,0,\\\"action-buttons list-header\\\"],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[4,[38,8],[[30,0],\\\"hideDropdown\\\"],null],[12],[1,\\\"\\\\n                                \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"btn btn-default action-button voice-recording-link-to-profile\\\"],[4,[38,8],[[30,0],\\\"sendToProfile\\\"],null],[12],[1,\\\"\\\\n                                    \\\"],[1,[28,[35,3],[\\\"components.inbox.actions.openProfile\\\"],null]],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,46],[[[1,\\\"                        \\\"],[10,\\\"li\\\"],[12],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"btn btn-link toggle-read-unread mark-as-unread\\\"],[4,[38,8],[[30,0],\\\"toggleRead\\\",false],null],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,3],[\\\"components.inbox.actions.markAsUnread\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,\\\"li\\\"],[12],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"btn btn-link toggle-read-unread mark-as-read\\\"],[4,[38,8],[[30,0],\\\"toggleRead\\\",true],null],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,3],[\\\"components.inbox.actions.markAsRead\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"\\\\n                    \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n                        \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"btn btn-link download\\\"],[4,[38,8],[[30,0],\\\"downloadMedia\\\"],null],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,3],[\\\"components.inbox.actions.download\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,9],[[33,14],[33,47]],null],[[[1,\\\"                        \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n                            \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"btn btn-link rename\\\"],[4,[38,8],[[30,0],\\\"toggleRename\\\",true],null],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,3],[\\\"components.inbox.actions.rename\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,33],[[[1,\\\"                        \\\"],[10,\\\"li\\\"],[12],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"btn btn-link delete\\\"],[4,[38,8],[[30,0],\\\"confirmDelete\\\"],null],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,3],[\\\"components.inbox.actions.deleteVoicemail\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,\\\"li\\\"],[12],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"btn btn-link delete\\\"],[4,[38,8],[[30,0],\\\"confirmDelete\\\"],null],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,3],[\\\"components.inbox.actions.deleteRecording\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,15,[\\\"note\\\"]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"no-action\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"edit\\\"],[15,\\\"title\\\",[29,[[28,[37,3],[\\\"components.inbox.nonEmptyNotes\\\"],null]]]],[15,\\\"screenreader-text\\\",[29,[[28,[37,3],[\\\"components.inbox.nonEmptyNotes\\\"],null]]]],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,48],[[[1,\\\"    \\\"],[1,[28,[35,49],null,[[\\\"isGroupVoicemail\\\",\\\"cancel\\\",\\\"confirm\\\"],[[33,15,[\\\"isGroupVoicemail\\\"]],\\\"close\\\",\\\"deleteAttachment\\\"]]]],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"person\\\",\\\"phone\\\",\\\"email\\\"],false,[\\\"if\\\",\\\"await\\\",\\\"isConference\\\",\\\"t\\\",\\\"groupImageUrl\\\",\\\"person\\\",\\\"entity-image\\\",\\\"integration-badges\\\",\\\"action\\\",\\\"and\\\",\\\"isNameNotDefault\\\",\\\"isEditable\\\",\\\"inbox-panel-v2/cancellable-textbox\\\",\\\"name\\\",\\\"isNonEditable\\\",\\\"recording\\\",\\\"groupName\\\",\\\"formattedCallerAddress\\\",\\\"copiedText\\\",\\\"elementId\\\",\\\"isConferenceAndRecording\\\",\\\"drop-down\\\",\\\"showConferenceDropdown\\\",\\\"remainingParticipants\\\",\\\"each\\\",\\\"-track-array\\\",\\\"callerId\\\",\\\"isHoveredOrActive\\\",\\\"date\\\",\\\"time\\\",\\\"dateFromNow\\\",\\\"activeRecording\\\",\\\"audio-player\\\",\\\"isVoicemail\\\",\\\"editingNotes\\\",\\\"inbox-panel-v2/notes-editor\\\",\\\"unless\\\",\\\"phoneDisabled\\\",\\\"cannotMakeCall\\\",\\\"showSpinner\\\",\\\"showDropdown\\\",\\\"isPurecloudUser\\\",\\\"personPhones\\\",\\\"personEmails\\\",\\\"permissions\\\",\\\"personId\\\",\\\"isRead\\\",\\\"isRecording\\\",\\\"isShowingDeleteConfirmation\\\",\\\"inbox-panel-v2/delete-confirmation\\\"]]\",\"moduleName\":\"web-directory/components/inbox-panel-v2/voice-recording-v2/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport LoggerMixin from '../../mixins/logger';\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['infinite-scroll'],\n    classNameBindings: ['hideScrollbars'],\n\n    /**\n     * @Input\n     * `true` if the component should be showing a loading state\n     */\n    loading: false,\n    /**\n     * `true` if the component should not invoke any infinite scroll\n     * interactions\n     */\n    disabled: false,\n    /**\n     * `true` if the scrollbar display should be visually hidden\n     */\n    hideScrollbars: false,\n\n    /**\n     * The amount of space in pixels that when the user scrolls within\n     * it will trigger the infinite scroll event for the parent to\n     * react to.\n     * !! If possible do not override this value with an inputted value.\n     * The functionality and UX should be consistent so if the threshold\n     * needs to increase it should increase everywhere.\n     */\n    scrollBottomThreshold: 100,\n\n    /**\n     * Lifecycle hook triggered when the element is rendered and inserted\n     * into the DOM\n     */\n    didInsertElement() {\n        // @ts-ignore\n        const element: HTMLDivElement = this.get('element');\n        element.onscroll = () => {\n            this.onScroll();\n        };\n    },\n\n    /**\n     * Invoked when the infinite scroll component has detected scrolling\n     * behavior within its main element\n     */\n    onScroll() {\n        // @ts-ignore\n        const element: HTMLDivElement = this.get('element');\n        const scrollBottom = element.scrollTop + element.clientHeight;\n        const scrollThreshold = scrollBottom + this.get('scrollBottomThreshold');\n        if (scrollThreshold >= element.scrollHeight) {\n            this.checkInfiniteScroll();\n        }\n    },\n\n    /**\n     * Checks if infinite scrolling can be invoked based on other factors and properties\n     */\n    checkInfiniteScroll() {\n        if (!this.get('loading') && !this.get('disabled')) {\n            this.infiniteScroll();\n        }\n    },\n\n    /**\n     * @Action\n     * Invoked when the scroll container has reached the scroll threshold to load more data\n     */\n    infiniteScroll() {\n        console.warn('Infinite scroll event closure action has not been set up.');\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"E/KQqsQY\",\"block\":\"[[[18,1,null],[1,\\\"\\\\n\\\"],[41,[33,2],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"infinite-scroll-loader\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"&default\\\"],false,[\\\"yield\\\",\\\"if\\\",\\\"loading\\\"]]\",\"moduleName\":\"web-directory/components/infinite-scroll/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport { reads } from '@ember/object/computed';\nimport Component from '@ember/component';\nimport { computed } from '@ember/object';\n\nexport default Component.extend({\n    classNames: ['integration-badge'],\n    tagName: 'span',\n\n    intl: service(),\n\n    // represents what integration we want to show\n    integration: null,\n    isSmall: false,\n    useLightIcon: false,\n\n    iconUri: computed('integration.icon', 'isSmall', 'useLightIcon', function () {\n        if (this.isSmall) {\n            return this.useLightIcon\n                ? this.get('integration.badgeIcons.light')\n                : this.get('integration.badgeIcons.dark');\n        }\n        return this.get('integration.icon');\n    }),\n\n    translation: reads('integration.translation')\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"V1szodqa\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[10,\\\"img\\\"],[15,0,[29,[\\\"integration-icon \\\",[52,[33,2],\\\"mini-icon\\\"]]]],[15,\\\"src\\\",[36,3]],[15,\\\"alt\\\",[36,4]],[12],[13],[1,\\\"\\\\n\\\"]],[]],null]],[],false,[\\\"if\\\",\\\"integration\\\",\\\"isSmall\\\",\\\"iconUri\\\",\\\"translation\\\"]]\",\"moduleName\":\"web-directory/components/integration-badge/template.hbs\",\"isStrictMode\":false});","import { equal } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport Component from '@ember/component';\n\nexport default Component.extend({\n    classNames: ['integration-badges'],\n\n    phoneIntegrations: service(),\n\n    entity: null,\n    size: null,\n    useLightIcon: false,\n    isSmall: equal('size', 'small')\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"2Q3chBsz\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[10,0],[15,0,[29,[[52,[33,2],\\\"small-integration-badge\\\",\\\"\\\"]]]],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,4],[[28,[37,4],[[28,[37,5],[[33,1]],null]],null]],null],null,[[[1,\\\"            \\\"],[1,[28,[35,6],null,[[\\\"integration\\\",\\\"isSmall\\\",\\\"useLightIcon\\\"],[[30,1],[33,2],[33,7]]]]],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"phoneIntegration\\\"],false,[\\\"if\\\",\\\"entity\\\",\\\"isSmall\\\",\\\"each\\\",\\\"-track-array\\\",\\\"phone-integrations\\\",\\\"integration-badge\\\",\\\"useLightIcon\\\"]]\",\"moduleName\":\"web-directory/components/integration-badges/template.hbs\",\"isStrictMode\":false});","import { computed } from '@ember/object';\nimport { htmlSafe } from '@ember/template';\nimport { scheduleOnce } from '@ember/runloop';\nimport Component from '@ember/component';\nimport layout from './template';\n\nexport default Component.extend({\n    // config\n    layout,\n    classNames: ['annotation'],\n    classNameBindings: ['flipped'],\n\n    // lifecycle\n    didRender() {\n        scheduleOnce('render', this, () => {\n            const locationMs = this.get('annotation.location');\n            const totalDurationMs = this.totalDurationMs;\n            const position = (locationMs / totalDurationMs) * 100;\n\n            this.element.style.left = htmlSafe(`${position}%`);\n        });\n    },\n\n    // if the annotation less than half way along the timeline, flip it.\n    flipped: computed('annotation.location', 'totalDurationMs', function () {\n        const locationMs = this.get('annotation.location');\n        const totalDurationMs = this.totalDurationMs;\n\n        return locationMs / totalDurationMs < 0.5;\n    }),\n    totalDurationMs: computed('totalDuration', function () {\n        return this.totalDuration * 1000;\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"Ww8boCEm\",\"block\":\"[[[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/bookmark-solid\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"annotation-details\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"annotation-details-left\\\"],[12],[1,\\\"\\\\n        \\\"],[10,1],[14,0,\\\"annotation-text\\\"],[15,\\\"title\\\",[33,0,[\\\"description\\\"]]],[12],[1,[33,0,[\\\"description\\\"]]],[13],[1,\\\"\\\\n        \\\"],[10,1],[14,0,\\\"annotation-type\\\"],[15,\\\"title\\\",[52,[33,0,[\\\"user\\\",\\\"name\\\"]],[33,0,[\\\"user\\\",\\\"name\\\"]],[33,0,[\\\"type\\\"]]]],[12],[1,[52,[33,0,[\\\"user\\\",\\\"name\\\"]],[33,0,[\\\"user\\\",\\\"name\\\"]],[33,0,[\\\"type\\\"]]]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"annotation-details-divider\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"annotation-details-right\\\"],[12],[1,\\\"\\\\n        \\\"],[10,1],[14,0,\\\"annotation-location\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,2],null,[[\\\"durationInMs\\\"],[[33,0,[\\\"location\\\"]]]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"annotation\\\",\\\"if\\\",\\\"duration-format\\\"]]\",\"moduleName\":\"web-directory/components/interaction-annotation/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport ComputedProperty from '@ember/object/computed';\nimport { inject } from '@ember/service';\nimport { Maybe } from 'web-directory/types';\nimport { warnClosureAction } from 'web-directory/utils/acd-ts';\nimport { UnionFromTuple } from 'web-directory/utils/types';\n\nconst NotificationType = ['onApproachingInactivityTimeout', 'onInactivityTimeout'] as const;\nexport type NotificationType = UnionFromTuple<typeof NotificationType>;\n\n/**\n * A self-contained component that displays the inactivity timeout for an interaction. This component\n * was broken out of the interaction card v2 to avoid having to inject a clock service into a component\n * that did not need it since since it can fire every second.\n */\nexport default Component.extend({\n    classNames: ['interaction-inactivity-status'] as const,\n    classNameBindings: ['status'] as const,\n\n    /**\n     * clock service for calculating time ticks\n     */\n    clock: inject('clock'),\n\n    /**\n     * intl service for displaying notifications\n     */\n    intl: inject('intl'),\n\n    /**\n     * notification service for displaying notifications\n     */\n    notification: inject('notification'),\n\n    /**\n     * command-nav service for integrating with nav systems\n     */\n    commandNav: inject('command-nav'),\n\n    /**\n     * @deprecated\n     * sidebar service for integrating with legacy nav\n     */\n    sidebar: inject('sidebar'),\n\n    /**\n     * @attribute\n     * interaction inactivity timeout\n     */\n    inactivityTimeout: new Date(),\n\n    /**\n     * @attribute\n     * flag indicating if the interaction is disconnected\n     */\n    isDisconnected: false,\n\n    /**\n     * @attribute\n     * flag indicating if the new nav system is being used\n     */\n    useNewNav: false as boolean,\n\n    /**\n     * stored previous inactivity timeout\n     */\n    _prevInactivityTimeout: null as Maybe<Date>,\n\n    /**\n     * status of the interaction\n     */\n    _status: 'normal' as Status,\n\n    /**\n     * map for the active notifications initiated by this component so we can\n     * hide them when they are interacted with.\n     */\n    _notifications: {} as { [key in NotificationType]?: any },\n\n    /**\n     * formatted inactivity timeout\n     */\n    inactivityTimeoutFormatted: computed('inactivityTimeout', function () {\n        const inactivityTimeout = this.get('inactivityTimeout');\n        if (!inactivityTimeout) return null;\n\n        return inactivityTimeout.toLocaleString(undefined, {\n            year: 'numeric',\n            month: 'numeric',\n            day: 'numeric',\n            hour: 'numeric',\n            minute: 'numeric',\n            hour12: true\n        });\n    }) as ComputedProperty<Maybe<string>>,\n\n    /**\n     * flag indicating if the inactivity timeout is approaching\n     */\n    status: computed('inactivityTimeout', 'isDisconnected', 'clock.second', function () {\n        // Consume clock.second to establish Glimmer autotracking (Ember 3.28 compatibility)\n        this.get('clock.second');\n\n        const inactivityTimeout = this.get('inactivityTimeout');\n        if (!inactivityTimeout) return 'normal';\n\n        const status = getInactivityStatus(inactivityTimeout, this.get('isDisconnected'));\n        if (['approaching', 'disconnected'].includes(status)) {\n            this.onStatusChanged(status);\n        }\n\n        return status;\n    }) as ComputedProperty<Status>,\n\n    init() {\n        this._super(...arguments);\n        const inactivityTimeout = this.get('inactivityTimeout');\n        if (inactivityTimeout) {\n            // we want to force the notification determination here in case of loading into\n            // the experience with a conversation timing out\n            const status = getInactivityStatus(inactivityTimeout, this.get('isDisconnected'));\n            this.onStatusChanged(status, { eventType: 'force' });\n        }\n    },\n\n    didReceiveAttrs() {\n        const inactivityTimeout = this.get('inactivityTimeout');\n        if (inactivityTimeout !== this.get('_prevInactivityTimeout')) {\n            this.set('_prevInactivityTimeout', inactivityTimeout);\n            const status = getInactivityStatus(inactivityTimeout, this.get('isDisconnected'));\n\n            // we don't want to emit on attrs update, we only want to emit when the status changes during runtime\n            this.onStatusChanged(status);\n        }\n    },\n\n    /**\n     * Due to how this component does not render once an interaction has disconnected (wrap up state on card),\n     * we catch the new state before the component is destroyed and emit the status change. We have to assume that\n     * the interaction timed out due to inactivity here since there is no explicit way to know.\n     *\n     * @note If this component is tearing down, and the inactivity timer has hit it's threshold then we assume\n     * it has been disconnected due to inactivity and fire the disconnected notification.\n     */\n    willDestroy() {\n        const inactivityTimeout = this.get('inactivityTimeout');\n        if (!inactivityTimeout) return;\n\n        const status = getInactivityStatus(inactivityTimeout, true);\n        this.onStatusChanged(status);\n    },\n\n    /**\n     * Checks if the approaching status has changed and if so,\n     * calls the actionOnApproachingTimeout method.\n     *\n     * @param isApproaching - boolean indicating if the approaching status has changed\n     */\n    onStatusChanged(status: Status, options: { eventType?: 'force' | 'normal' } = {}) {\n        const { eventType } = { eventType: 'normal', ...options };\n        if (this.get('_status') === status && eventType !== 'force') return;\n        this.set('_status', status);\n\n        switch (status) {\n            case 'approaching':\n                this._displayNotification(\n                    'purecloud.acdInteraction.approachingInactivityTimeout.notification.message',\n                    {\n                        action: 'purecloud.acdInteraction.approachingInactivityTimeout.notification.view',\n                        tag: 'onApproachingInactivityTimeout'\n                    }\n                );\n                break;\n            case 'disconnected':\n                this._displayNotification('purecloud.acdInteraction.inactivityTimeout.notification.message', {\n                    tag: 'onInactivityTimeout'\n                });\n                break;\n        }\n    },\n\n    /**\n     * Displays a notification with the given title and message.\n     *\n     * @param titleKey - The key for the title of the notification.\n     * @param messageKey - The key for the message of the notification.\n     */\n    _displayNotification(\n        message: string | null,\n        config: {\n            tag: NotificationType;\n            action?: string;\n            clickHandler?: () => void;\n        }\n    ) {\n        message = message ? this.get('intl').t(message).toString() : null;\n        const action = config?.action ? this.get('intl').t(config.action).toString() : undefined;\n        const actionHandlers: { [key in NotificationType]?: string } = {};\n\n        // only append the action handler if the action has been defined\n        if (action) actionHandlers[config.tag] = action;\n\n        const inactivityTimeout = this.get('inactivityTimeout');\n        const secondsRemaining = getSecondsRemaining(inactivityTimeout);\n\n        // if the timeout has already happened then don't display the notification\n        if (config.tag === 'onApproachingInactivityTimeout' && secondsRemaining <= 0) return;\n\n        const notifications = this.get('_notifications');\n        // if the notification has already been displayed then hide it and remove it from the notifications map\n        // before displaying the updated one\n        if (notifications[config.tag]) {\n            this._hideNotification(config.tag);\n        }\n\n        const hideAfter = config.tag === 'onApproachingInactivityTimeout' ? secondsRemaining : 10000;\n        notifications[config.tag] = this.get('notification').info(null, message, {\n            target: this,\n            actionHandlers,\n            hideAfter\n        });\n\n        this.set('_notifications', notifications);\n    },\n\n    /**\n     * Hides the notification with the given tag.\n     *\n     * @param tag The tag of the notification to hide.\n     */\n    _hideNotification(tag: NotificationType) {\n        const notifications = this.get('_notifications') ?? {};\n\n        const notification = notifications[tag];\n        if (notification) notification.hide();\n\n        delete notifications[tag];\n        this.set('_notifications', notifications);\n    },\n\n    /**\n     * @action\n     * Action to view the conversation when the notification is clicked.\n     */\n    actionViewConversation: () => warnClosureAction('actionViewConversation'),\n\n    /**\n     * Action to view the conversation when the approaching inactivity notification is clicked.\n     */\n    _onApproachingInactivityTimeout() {\n        this._selectPanel();\n        this.actionViewConversation();\n        this._hideNotification('onApproachingInactivityTimeout');\n    },\n\n    _selectPanel() {\n        const useNewNav = this.get('useNewNav');\n        if (useNewNav) {\n            const currentPanel = this.get('commandNav').get('currentPanel');\n            if (currentPanel !== 'agent') {\n                this.get('commandNav').selectPanel('agent', true);\n            }\n        } else {\n            this.get('sidebar').openPanel('acdInteractions');\n        }\n    },\n\n    actions: {\n        onApproachingInactivityTimeout() {\n            this._onApproachingInactivityTimeout();\n        }\n    }\n});\n\nconst APPROACHING_TIMEOUT_THRESHOLD = 60; // 1 minute\ntype Status = 'normal' | 'approaching' | 'disconnected';\n\nfunction getSecondsRemaining(inactivityTimeout: Date): number {\n    const now = new Date();\n    const timeRemaining = inactivityTimeout.getTime() - now.getTime();\n    return Math.floor(timeRemaining / 1000);\n}\n\nfunction getInactivityStatus(inactivityTimeout: Date, isDisconnected: boolean): Status {\n    const secondsRemaining = getSecondsRemaining(inactivityTimeout);\n\n    // if the interaction is disconnected and the timeout has passed, we consider the interaction disconnected\n    // by the system due to inactivity.\n    if (isDisconnected && secondsRemaining <= 0) return 'disconnected';\n    return secondsRemaining <= APPROACHING_TIMEOUT_THRESHOLD ? 'approaching' : 'normal';\n}\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"P75oJTUq\",\"block\":\"[[[10,\\\"gux-icon\\\"],[15,1,[29,[\\\"inactivity-timeout-icon-\\\",[36,0]]]],[14,\\\"icon-name\\\",\\\"fa/timer-regular\\\"],[15,\\\"aria-labelledby\\\",[29,[\\\"inactivity-timeout-tooltip-\\\",[36,0]]]],[15,\\\"screenreader-text\\\",[28,[37,1],[\\\"purecloud.acdInteraction.approachingInactivityTimeout.tooltip\\\"],[[\\\"time\\\"],[[33,2]]]]],[12],[13],[1,\\\"\\\\n\\\\n\\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[\\\"inactivity-timeout-icon-\\\",[36,0]]]],[12],[1,\\\"\\\\n    \\\"],[1,[28,[35,1],[\\\"purecloud.acdInteraction.approachingInactivityTimeout.tooltip\\\"],[[\\\"time\\\"],[[33,2]]]]],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"elementId\\\",\\\"t\\\",\\\"inactivityTimeoutFormatted\\\"]]\",\"moduleName\":\"web-directory/components/interaction-inactivity-status/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport Component from '@ember/component';\nimport EmberObject, { computed } from '@ember/object';\nimport { A } from '@ember/array';\nimport { run } from '@ember/runloop';\nimport Clipboard from 'clipboard';\n\n/**\n * Displays internal application logs with filtering and clipboard support.\n * Replaces the former internal-logs controller logic.\n */\nexport default Component.extend({\n    classNames: ['internal-logs'],\n\n    stashLogger: service(),\n    notification: service(),\n    intl: service(),\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        run.scheduleOnce('afterRender', () => {\n            const copyBtn = new Clipboard('.copy-to-clipboard-btn', {\n                text: this._getLogsString.bind(this)\n            });\n            copyBtn.on('success', () => {\n                run(() => this.notification.info(null, this.intl.t('purecloud.copyToClipboardSuccess')));\n            });\n            this.set('_clipboardInstance', copyBtn);\n        });\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        const clipboard = this.get('_clipboardInstance');\n        if (clipboard) {\n            clipboard.destroy();\n        }\n    },\n\n    _getLogsString() {\n        return (\n            this.logs\n                .map((log, index) => `${index}: ${log.topic} -- ${log.time} -- ${log.level}: ${log.stringified}`)\n                .join('\\n') || ''\n        );\n    },\n\n    loggingOptions: computed('stashLogger.loggingOptions.[]', function () {\n        const options = [];\n\n        this.get('stashLogger.loggingOptions').forEach(option => {\n            if (!option.localLevel) {\n                return;\n            }\n\n            options.push(\n                EmberObject.create(\n                    {\n                        selected: true\n                    },\n                    option\n                )\n            );\n        });\n\n        return A(options);\n    }),\n\n    logs: computed('loggingOptions.@each.selected', 'stashLogger.internalLogs.[]', function () {\n        const selectedOptions = this.get('loggingOptions').filterBy('selected', true);\n\n        const logs = this.get('stashLogger.internalLogs').filter(({ topic, level, itemsToLog }) => {\n            return selectedOptions.some(option => {\n                return this.get('stashLogger').checkItemsAgainstOptions(option, level, topic, itemsToLog).local;\n            });\n        });\n\n        logs.filter(log => !log.stringified).forEach(log => (log.stringified = JSON.stringify(log.itemsToLog)));\n\n        return logs;\n    }),\n\n    actions: {\n        toggleOption(option) {\n            option.toggleProperty('selected');\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"8vha6vMH\",\"block\":\"[[[10,\\\"h3\\\"],[12],[1,[28,[35,0],[\\\"purecloud.internalLogs.header\\\"],null]],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"options-container\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,2],[[28,[37,2],[[33,3]],null]],null],null,[[[1,\\\"        \\\"],[11,\\\"button\\\"],[16,0,[29,[\\\"btn logging-option \\\",[52,[30,1,[\\\"selected\\\"]],\\\"selected\\\"]]]],[24,4,\\\"button\\\"],[4,[38,5],[[30,0],\\\"toggleOption\\\",[30,1]],null],[12],[1,\\\"\\\\n            \\\"],[10,0],[12],[1,\\\"\\\\n\\\"],[41,[30,1,[\\\"topic\\\"]],[[[1,\\\"                    \\\"],[10,0],[12],[2,[28,[37,0],[\\\"purecloud.internalLogs.topic\\\"],[[\\\"topic\\\"],[[30,1,[\\\"topic\\\"]]]]]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[30,1,[\\\"regex\\\"]],[[[1,\\\"                    \\\"],[10,0],[12],[2,[28,[37,0],[\\\"purecloud.internalLogs.regex\\\"],[[\\\"regex\\\"],[[30,1,[\\\"regex\\\"]]]]]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[30,1,[\\\"propertyToMatch\\\"]],[[[1,\\\"                    \\\"],[10,0],[12],[2,[28,[37,0],[\\\"purecloud.internalLogs.property\\\"],[[\\\"property\\\"],[[30,1,[\\\"propertyToMatch\\\"]]]]]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n                \\\"],[10,0],[12],[2,[28,[37,0],[\\\"purecloud.internalLogs.level\\\"],[[\\\"level\\\"],[[30,1,[\\\"localLevel\\\"]]]]]],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[12],[1,\\\"\\\\n    \\\"],[10,\\\"button\\\"],[14,0,\\\"btn copy-to-clipboard-btn\\\"],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/clipboard\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[10,1],[12],[1,[28,[35,0],[\\\"purecloud.copyToClipboard\\\"],null]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[42,[28,[37,2],[[28,[37,2],[[33,6]],null]],null],null,[[[1,\\\"    \\\"],[10,0],[14,0,\\\"log-item\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"json-label\\\"],[12],[1,[30,3]],[1,\\\": \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[12],[1,\\\"\\\\n            \\\"],[1,[30,2,[\\\"topic\\\"]]],[1,\\\"\\\\n            --\\\\n            \\\"],[1,[30,2,[\\\"time\\\"]]],[1,\\\"\\\\n            --\\\\n            \\\"],[1,[30,2,[\\\"level\\\"]]],[1,\\\":\\\\n            \\\"],[1,[30,2,[\\\"stringified\\\"]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[2,3]],null]],[\\\"option\\\",\\\"log\\\",\\\"index\\\"],false,[\\\"t\\\",\\\"each\\\",\\\"-track-array\\\",\\\"loggingOptions\\\",\\\"if\\\",\\\"action\\\",\\\"logs\\\"]]\",\"moduleName\":\"web-directory/components/internal-logs-panel/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport Component from '@ember/component';\n\nexport default Component.extend({\n    classNames: ['log-capture-help'],\n\n    intl: service(),\n    rollingLogCapture: service('rolling-log-capture'),\n    notification: service(),\n\n    actions: {\n        async submitRollingLogs() {\n            try {\n                await this.rollingLogCapture.postMessages();\n\n                const title = this.intl.t('logCaptureHelp.success.title');\n                const message = this.intl.t('logCaptureHelp.success.message');\n                this.notification.success(title, message, {\n                    forceBrowserNotification: true,\n                    hideAfter: 5\n                });\n            } catch (err) {\n                if (err.code === 'NO_MESSAGES') {\n                    const title = this.intl.t('logCaptureHelp.empty.title');\n                    const message = this.intl.t('logCaptureHelp.empty.message');\n                    this.notification.info(title, message);\n                    return;\n                }\n\n                const title = this.intl.t('logCaptureHelp.fail.title');\n                const message = this.intl.t('logCaptureHelp.fail.message');\n                this.notification.error(title, message);\n            }\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"QSJ4asBi\",\"block\":\"[[[10,0],[14,0,\\\"log-capture-header\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"h3\\\"],[14,0,\\\"gux-heading-xl-semibold\\\"],[12],[1,[28,[35,0],[\\\"logCaptureHelp.title\\\"],null]],[13],[1,\\\"\\\\n    \\\"],[10,\\\"hr\\\"],[12],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"log-capture-description\\\"],[12],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,0],[\\\"logCaptureHelp.description.p1\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,0],[\\\"logCaptureHelp.description.p2\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[1,\\\"    \\\"],[10,3],[14,6,\\\"https://help.genesys.cloud/articles/gather-console-logs\\\"],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"external-link\\\"],[14,\\\"icon-name\\\",\\\"external-link\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[14,\\\"size\\\",\\\"small\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[1,[28,[35,0],[\\\"logCaptureHelp.learnMore\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"send-logs\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"gux-button\\\"],[14,\\\"accent\\\",\\\"primary\\\"],[15,\\\"onclick\\\",[28,[37,1],[[30,0],\\\"submitRollingLogs\\\"],null]],[12],[1,[28,[35,0],[\\\"logCaptureHelp.sendLogsBtn\\\"],null]],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"]],[],false,[\\\"t\\\",\\\"action\\\"]]\",\"moduleName\":\"web-directory/components/log-capture-help/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport { reads } from '@ember/object/computed';\nimport Component from '@ember/component';\n\nexport default Component.extend({\n    classNames: ['login-oauth'],\n\n    session: service(),\n\n    isAuthenticated: reads('session.isAuthenticated'),\n\n    // attrs\n    offerMobileApp: false,\n    // Expected Actions: mobileOfferDenied, authenticate\n\n    onMobileOfferDecline() {\n        return this.attrs.mobileOfferDeclined().then(this.attrs.authenticate);\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        if (!this.offerMobileApp) {\n            this.attrs.authenticate();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"OTvaRkBj\",\"block\":\"[[[41,[28,[37,1],[[33,2]],null],[[[41,[33,3],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"pre-auth-mobile-offer\\\"],[12],[1,\\\"\\\\n\\\"],[6,[39,4],null,[[\\\"showHeader\\\",\\\"showFooter\\\",\\\"extraClassNames\\\",\\\"destinationElementId\\\",\\\"isOpen\\\"],[false,false,\\\"mobile\\\",\\\"app-offer-modal-destination\\\",[33,3]]],[[\\\"default\\\"],[[[[1,\\\"                \\\"],[1,[28,[35,5],null,[[\\\"sendClose\\\"],[[28,[37,6],[[30,0],[33,7]],null]]]]],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"\\\\n            \\\"],[10,0],[14,1,\\\"app-offer-modal-destination\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[1,[34,8]],[1,\\\"\\\\n\\\"]],[]]]],[]],[[],[]]]],[],false,[\\\"if\\\",\\\"not\\\",\\\"isAuthenticated\\\",\\\"offerMobileApp\\\",\\\"modal-gux\\\",\\\"mobile-modal\\\",\\\"action\\\",\\\"onMobileOfferDecline\\\",\\\"auth-loading\\\"]]\",\"moduleName\":\"web-directory/components/login-oauth/template.hbs\",\"isStrictMode\":false});","import { isUnrecoverableAppFailure } from 'web-directory/models/unrecoverable-app-failure';\nimport Ember from 'ember';\nimport { assertNever } from 'web-directory/utils/types';\n\nconst { Component, computed, inject } = Ember;\n\ntype MaintenanceModeMessageKeys = {\n    titleKey: string;\n    descKey?: string;\n    actionKey: string;\n};\n\n/**\n * Displays the maintenance/error page with appropriate messaging\n * based on the type of unrecoverable app failure.\n * Replaces the former maintenance controller logic.\n *\n * @attribute model - The unrecoverable app failure model from the route\n * @attribute reloadApp - Closure action to reload the application\n */\nconst MaintenancePage = Component.extend({\n    intl: inject.service(),\n    applicationService: inject.service('application'),\n\n    /**\n     * @attribute\n     * The unrecoverable app failure model passed from the route\n     */\n    model: null,\n\n    /**\n     * @attribute\n     * Closure action to reload the application\n     */\n    reloadApp: null,\n\n    hasDesc: computed.bool('messageKeys.descKey'),\n\n    messageKeys: computed('model', function (): MaintenanceModeMessageKeys {\n        const model = this.get('model');\n\n        if (!isUnrecoverableAppFailure(model)) {\n            return {\n                titleKey: 'unrecoverableAppFailure.unknownFailure.title',\n                descKey: 'unrecoverableAppFailure.unknownFailure.desc',\n                actionKey: 'unrecoverableAppFailure.unknownFailure.action'\n            };\n        }\n\n        if (model.type === 'sessionBootstrapError') {\n            let descKey: string;\n\n            const { failedStep } = model;\n            switch (failedStep) {\n                case 'loadFeatureToggles':\n                case 'setupTheme':\n                case 'setupUserAndTrustee':\n                case 'setupLogCapture':\n                case 'establishDirectorySession':\n                case 'initServerTranslations':\n                case 'loadPresences':\n                case 'loadUserDetails':\n                case 'loadUserFavorites':\n                case 'setupCarrierPigeon':\n                case 'initAppSession':\n                case 'loadOrgPermissions':\n                case 'loadOrgTranscriptSettings':\n                case 'loadPerson':\n                    // Initial steps are all mapped 1:1 to translations\n                    // When adding a new step, be sure to add a translation or map it to a common translation\n                    descKey = `unrecoverableAppFailure.sessionBootstrap.stepFailures.${failedStep}`;\n                    break;\n                default:\n                    assertNever(failedStep);\n            }\n\n            return {\n                titleKey: 'unrecoverableAppFailure.sessionBootstrap.errorPageTitle',\n                descKey,\n                actionKey:\n                    model.status === 429\n                        ? 'unrecoverableAppFailure.sessionBootstrap.userRateLimited'\n                        : 'unrecoverableAppFailure.sessionBootstrap.systemLoad'\n            };\n        }\n\n        let rootKey: string;\n        let descKey: undefined | string = undefined;\n        switch (model.type) {\n            case 'timeMachineFailure':\n            case 'missingAuthenticator':\n            case 'sessionInvalidationFailure':\n            case 'invalidEnv':\n            case 'profileFetchServerFailure':\n            case 'generalAuthenticationFailure':\n                // Initial failure types are all mapped 1:1 to translations\n                // When adding a new step, be sure to add a translation or map it to a common translation\n                rootKey = `unrecoverableAppFailure.${model.type}`;\n                if ((this.get('intl') as any).exists(`${rootKey}.desc`)) {\n                    descKey = `${rootKey}.desc`;\n                }\n                break;\n            default:\n                assertNever(model.type);\n        }\n\n        return {\n            titleKey: `${rootKey!}.title`,\n            descKey,\n            actionKey: `${rootKey!}.action`\n        };\n    })\n});\n\nexport default MaintenancePage;\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"lNuc8auG\",\"block\":\"[[[10,\\\"h3\\\"],[14,0,\\\"title\\\"],[12],[1,\\\"\\\\n    \\\"],[1,[28,[35,0],[[28,[37,1],[[33,2],\\\"titleKey\\\"],null]],null]],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,4],[[[1,\\\"    \\\"],[10,2],[14,0,\\\"desc\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,0],[[28,[37,1],[[33,2],\\\"descKey\\\"],null]],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"action-container\\\"],[12],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,0],[[28,[37,1],[[33,2],\\\"actionKey\\\"],null]],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,3],[14,6,\\\"#\\\"],[15,\\\"onclick\\\",[28,[37,5],[[30,0],[33,6]],null]],[14,0,\\\"btn btn-default\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,0],[\\\"unrecoverableAppFailure.reloadApp\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"brand-footer\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"genesys-logo-container\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"brand-footer-text\\\"],[12],[1,[28,[35,0],[\\\"about.copyright\\\"],[[\\\"currentYear\\\"],[[33,7,[\\\"currentYear\\\"]]]]]],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"t\\\",\\\"get\\\",\\\"messageKeys\\\",\\\"if\\\",\\\"hasDesc\\\",\\\"action\\\",\\\"reloadApp\\\",\\\"applicationService\\\"]]\",\"moduleName\":\"web-directory/components/maintenance-page/template.hbs\",\"isStrictMode\":false});","import { computed } from '@ember/object';\nimport { assert } from '@ember/debug';\nimport { once, scheduleOnce, bind, later, join, run } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport Component from '@ember/component';\nimport Popper from 'popper.js';\n\nexport default Component.extend({\n    tagName: 'ul',\n    classNames: ['media-provider-video-dropdown'],\n    classNameBindings: ['displayDropdown:display-dropdown:hide'],\n\n    webrtc: service(),\n    mediaProviders: service(),\n\n    user: null,\n    room: null,\n    attachTo: null,\n    attachClickHandler: false,\n\n    _displayDropdown: true,\n\n    // Default implementation is to just run the provider action\n    selectProvider(provider) {\n        run.once(provider, provider.action);\n        this.send('hide');\n    },\n\n    _popper: null,\n    _targetEl: null,\n\n    actions: {\n        hide() {\n            this.set('_displayDropdown', false);\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n\n        assert(!!this.user, '`user` is required');\n        assert(!!this.attachTo, '`attachTo` is required');\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        scheduleOnce('afterRender', this, this.setup);\n    },\n\n    willDestroyElement() {\n        if (this._popper) {\n            this._popper.destroy();\n            this._popper = null;\n        }\n\n        if (this._boundHandleOutsideClick) {\n            window.removeEventListener('click', this._boundHandleOutsideClick);\n        }\n        if (this._targetEl && this._boundHandleTargetClick) {\n            this._targetEl.removeEventListener('click', this._boundHandleTargetClick);\n        }\n\n        this._super(...arguments);\n    },\n\n    setup() {\n        const targetEl = document.querySelector(this.attachTo);\n        if (!targetEl) {\n            // Let's wait for a bit and check again...\n            // This might happen when we are waiting on asynchronous helpers\n            later(() => this.setup(), 250);\n\n            return;\n        }\n\n        if (this._targetEl) {\n            // We've already setup, dont try again\n            return;\n        }\n\n        this._targetEl = targetEl;\n\n        const popoverEl = this.element;\n        this._popper = new Popper(targetEl, popoverEl, {\n            placement: 'bottom',\n            arrowElement: this.element.querySelector('.media-provider-arrow'),\n            modifiers: {\n                flip: {\n                    behavior: ['bottom', 'top', 'left']\n                },\n                preventOverflow: {\n                    padding: 1\n                }\n            }\n        });\n\n        // Attach a click handler to the target so that we can control the dropdown\n        // internally instead of externally\n        if (this.attachClickHandler) {\n            this.set('_displayDropdown', false);\n\n            this._boundHandleTargetClick = bind(this, () => once(this, this.handleClick));\n            targetEl.addEventListener('click', this._boundHandleTargetClick);\n\n            this._boundHandleOutsideClick = bind(this, this.handleOutsideClick);\n            window.addEventListener('click', this._boundHandleOutsideClick);\n        }\n    },\n\n    handleClick() {\n        this.toggleProperty('_displayDropdown');\n\n        join(() => scheduleOnce('afterRender', this, () => this._popper && this._popper.scheduleUpdate()));\n    },\n\n    handleOutsideClick(event) {\n        if (!this.displayDropdown) {\n            return;\n        }\n\n        let target = event.target;\n        let attachToEl = document.querySelector(this.attachTo);\n        let isAttachTarget = target === attachToEl || (attachToEl && attachToEl.contains(target));\n        let isInsideComponent = this.element && this.element.contains(target);\n\n        if (!isAttachTarget && !isInsideComponent) {\n            this.send('hide');\n        }\n    },\n\n    showingVideo: computed(\n        'webrtc.activeRoom.{showingVideo,isAcdRoom}',\n        'mediaProviders.usingVideoProvider',\n        function () {\n            const showingPurecloudVideo =\n                this.get('webrtc.activeRoom.showingVideo') && !this.get('webrtc.activeRoom.isAcdRoom');\n            const showingMediaProvider = this.get('mediaProviders.usingVideoProvider');\n            return showingPurecloudVideo || showingMediaProvider;\n        }\n    ),\n\n    providers: computed('user', 'room', 'webrtc.activeRoom.oneToOneTarget.presence', function () {\n        return this.mediaProviders.getVideoProviders(this.user, this.room);\n    }),\n\n    displayDropdown: computed(\n        '_displayDropdown',\n        'attachTo',\n        'user.profile.content.isOffline',\n        'showingVideo',\n        'room',\n        function () {\n            let targetEl = this._targetEl;\n            if (!targetEl || this.showingVideo) {\n                return false;\n            }\n\n            let chatRoom = this.room;\n            if (chatRoom && chatRoom.isGroupRoom()) {\n                return this._displayDropdown;\n            }\n\n            return this._displayDropdown;\n        }\n    )\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"xXybdT9e\",\"block\":\"[[[42,[28,[37,1],[[28,[37,1],[[33,2]],null]],null],null,[[[41,[30,1,[\\\"haveAccess\\\"]],[[[1,\\\"        \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n            \\\"],[11,3],[16,1,[29,[[36,4],\\\"-provider-\\\",[30,1,[\\\"label\\\"]]]]],[24,6,\\\"#\\\"],[16,0,[29,[[52,[28,[37,5],[[30,1,[\\\"disabled\\\"]]],null],\\\"disabled\\\"]]]],[16,\\\"aria-disabled\\\",[28,[37,5],[[30,1,[\\\"disabled\\\"]]],null]],[4,[38,6],[[30,0],[33,7],[30,1]],null],[12],[1,\\\"\\\\n                \\\"],[1,[30,1,[\\\"label\\\"]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,5],[[30,1,[\\\"disabled\\\"]]],null],[[[1,\\\"                \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,4],\\\"-provider-\\\",[30,1,[\\\"label\\\"]]]]],[14,\\\"placement\\\",\\\"right\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,8],[[28,[37,5],[[30,1,[\\\"disabledMessage\\\"]]],null]],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[1]],null],[10,0],[14,0,\\\"media-provider-arrow\\\"],[12],[13]],[\\\"provider\\\"],false,[\\\"each\\\",\\\"-track-array\\\",\\\"providers\\\",\\\"if\\\",\\\"elementId\\\",\\\"await\\\",\\\"action\\\",\\\"selectProvider\\\",\\\"t\\\"]]\",\"moduleName\":\"web-directory/components/media-providers/video-dropdown/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\n\nconst MenuItemComponent = Component.extend({\n    showIcon: true,\n    classNames: ['menu-item'],\n    labelIdentifierClass: 'menu-item-label',\n\n    actions: {\n        customClick: function (tgt) {\n            this.sendAction('leafItemClick', tgt.node);\n        },\n        topClick: function () {\n            this.sendAction('leafItemClickEmpty');\n        }\n    }\n});\n\nexport default MenuItemComponent;\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"T3lxuhm5\",\"block\":\"[[[41,[33,1,[\\\"url\\\"]],[[[1,\\\"    \\\"],[11,3],[16,6,[29,[[33,1,[\\\"url\\\"]]]]],[16,\\\"aria-label\\\",[28,[37,2],[[52,[33,1,[\\\"isCurrentURL\\\"]],\\\"components.navMenu.pageIsShown\\\",\\\"components.navMenu.pageIsHidden\\\"]],[[\\\"type\\\"],[[33,1,[\\\"label\\\"]]]]]],[16,0,[29,[[52,[33,3],\\\"active\\\"]]]],[4,[38,4],[[30,0],\\\"topClick\\\"],[[\\\"preventDefault\\\"],[false]]],[12],[1,\\\"\\\\n        \\\"],[10,1],[15,0,[29,[[36,5]]]],[12],[1,[33,1,[\\\"label\\\"]]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"    \\\"],[11,3],[24,6,\\\"#\\\"],[16,\\\"aria-label\\\",[28,[37,2],[[52,[33,1,[\\\"isCurrentURL\\\"]],\\\"components.navMenu.pageIsShown\\\",\\\"components.navMenu.pageIsHidden\\\"]],[[\\\"type\\\"],[[33,1,[\\\"label\\\"]]]]]],[16,\\\"aria-expanded\\\",[29,[[52,[33,1,[\\\"open\\\"]],\\\"true\\\",\\\"false\\\"]]]],[16,0,[29,[[52,[33,3],\\\"active\\\"]]]],[4,[38,4],[[30,0],\\\"customClick\\\",[33,1]],null],[12],[1,\\\"\\\\n        \\\"],[10,1],[15,0,[29,[[36,5]]]],[12],[1,[33,1,[\\\"label\\\"]]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[],false,[\\\"if\\\",\\\"menuItem\\\",\\\"t\\\",\\\"isMenuBranchActive\\\",\\\"action\\\",\\\"labelIdentifierClass\\\"]]\",\"moduleName\":\"web-directory/components/menu-item/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport { on } from '@ember/object/evented';\nimport Component from '@ember/component';\n\nconst iPhoneLink = 'https://itunes.apple.com/us/app/interactive-intelligence-collaborate/id777864400?mt=8';\nconst androidLink = 'https://play.google.com/store/apps/details?id=com.inin.purecloud.directory';\n\nexport default Component.extend({\n    classNames: ['mobile-modal'],\n\n    intl: service(),\n    sidebar: service('sidebar'),\n    application: service('application'),\n\n    userId: null,\n    mobileVersion: '',\n    appLink: '',\n    appGreeting: null,\n\n    actions: {\n        sendClose() {\n            this.sendAction('sendClose');\n        }\n    },\n\n    checkMobileVersion: on('init', function () {\n        const version = navigator.appVersion;\n        const intl = this.intl;\n        const isApple = version.includes('iPhone') || version.includes('iPad');\n        const isAndroid = version.includes('Android');\n        const userId = this.get('session.user.id');\n\n        let appLink = '';\n        let appGreeting = intl.safestring('mobile.version.other').toString();\n        let mobileVersion = '';\n\n        if (isApple) {\n            const device = intl.safestring('mobile.version.apple').toString();\n            appLink = iPhoneLink;\n            appGreeting = intl.t('mobile.greeting', { device });\n            mobileVersion = 'iphone';\n        }\n\n        if (isAndroid) {\n            const device = intl.safestring('mobile.version.android').toString();\n            appLink = androidLink;\n            appGreeting = intl.t('mobile.greeting', { device });\n            mobileVersion = 'android';\n        }\n\n        this.setProperties({\n            userId,\n            appLink,\n            appGreeting,\n            mobileVersion\n        });\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"Oyx9H6yz\",\"block\":\"[[[10,0],[15,0,[29,[\\\"mobile-banner \\\",[36,0]]]],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"banner-text\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,1],[\\\"mobile.featureText\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"mobile-links\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"app-link\\\"],[12],[1,\\\"\\\\n        \\\"],[10,3],[15,6,[29,[[36,2]]]],[14,0,\\\"btn btn-link\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,1],[\\\"mobile.appText\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[11,0],[24,0,\\\"detail-link\\\"],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[4,[38,3],[[30,0],\\\"sendClose\\\"],null],[12],[1,\\\"\\\\n        \\\"],[10,3],[14,6,\\\"\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,1],[\\\"mobile.detailText\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"mobileVersion\\\",\\\"t\\\",\\\"appLink\\\",\\\"action\\\"]]\",\"moduleName\":\"web-directory/components/mobile-modal/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { inject } from '@ember/service';\nimport { Maybe } from 'web-directory/types';\n\nexport default Component.extend({\n    classNames: ['modal-gux'] as const,\n\n    intl: inject('intl'),\n\n    /**\n     * Text details to header and buttons in footer\n     */\n    headerText: '',\n    headerIcon: '',\n    confirmText: '',\n    cancelText: '',\n\n    /**\n     * True/False for a delay in the confirm button's function\n     */\n    confirmLoading: false as Boolean,\n\n    /**\n     * This value is to determine initial keyboard focus in the dialog\n     * by giving a selector as a string\n     * by default it is on the cancel button\n     */\n    initialFocus: '#cancel-button',\n\n    /**\n     * This value is to determine the side of the GUX Dialog\n     * options are: small, medium, large, and dynamic\n     * by it is set to dynamic\n     */\n    size: 'dynamic',\n\n    /**\n     * True/False for the dialog being open\n     */\n    isOpen: false,\n\n    cancel: null as Maybe<() => Promise<void>>,\n    confirm: null as Maybe<() => Promise<void>>,\n\n    /**\n     * True/false if header and footers are shown\n     */\n    showHeader: true,\n    showFooter: true,\n\n    /**\n     * Addition classes that will be applied to the outermost modal container\n     */\n    extraClassNames: '',\n\n    /**\n     * True/false if the confirm button is dangerous\n     */\n    dangerous: false as Boolean,\n\n    /**\n     * True/false for disabling the confirm button\n     */\n    confirmDisabled: false as Boolean,\n\n    confirmAction: computed({\n        get() {\n            return this.get('confirm');\n        },\n\n        set(_key, value: Maybe<() => Promise<void>>) {\n            if (typeof value === 'function') {\n                this.set('confirm', value);\n            }\n            return value;\n        }\n    }),\n\n    cancelAction: computed({\n        get() {\n            return this.get('cancel');\n        },\n\n        set(_key, value: Maybe<() => Promise<void>>) {\n            if (typeof value === 'function') {\n                this.set('cancel', value);\n            }\n            return value;\n        }\n    }),\n\n    disableAction: computed({\n        get() {\n            return this.setConfirmDisabled.bind(this);\n        },\n\n        set() {\n            return this.setConfirmDisabled.bind(this);\n        }\n    }),\n\n    init() {\n        this._super(...arguments);\n        this.setText();\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.$('gux-modal').on('guxdismiss', () => {\n            this.onCancel();\n        });\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.$('gux-modal').off('guxdismiss');\n    },\n\n    /**\n     *\n     * Setting values\n     *\n     */\n    setConfirmDisabled(value: any) {\n        return this.set('confirmDisabled', value);\n    },\n\n    setText() {\n        const intl = this.get('intl');\n        let { headerText, confirmText, cancelText } = this.getProperties('headerText', 'confirmText', 'cancelText');\n\n        if (headerText === '') {\n            headerText = intl.safestring('components.modal.header').toString();\n        }\n\n        if (confirmText === '') {\n            confirmText = intl.safestring('common.confirm').toString();\n        }\n\n        if (cancelText === '') {\n            cancelText = intl.safestring('common.cancel').toString();\n        }\n\n        this.setProperties({\n            headerText,\n            confirmText,\n            cancelText\n        });\n    },\n\n    /**\n     * Handling the confirmation behavior\n     */\n    onConfirm() {\n        const confirmAction = this.get('confirm');\n        if (typeof confirmAction === 'function') {\n            let ret = confirmAction();\n            if (ret && ret.then) {\n                this.set('confirmLoading', true);\n                ret.then(() => {\n                    this.set('confirmLoading', false);\n                });\n            }\n        } else {\n            this.sendAction('confirm');\n        }\n    },\n\n    /**\n     * Handling the cancel behavior\n     */\n    onCancel() {\n        const cancelAction = this.get('cancel');\n        if (typeof cancelAction === 'function') {\n            cancelAction();\n        } else {\n            this.sendAction('cancel');\n        }\n    },\n\n    actions: {\n        sendClose() {\n            this.send('sendCancel');\n        },\n\n        sendConfirm() {\n            this.onConfirm();\n        },\n\n        sendCancel() {\n            this.onCancel();\n        },\n\n        setAttribute(key: any, value: any) {\n            this.set(key, value);\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"nQZPocJh\",\"block\":\"[[[10,0],[14,1,\\\"modal-container\\\"],[15,0,[29,[[36,0]]]],[12],[1,\\\"\\\\n    \\\"],[10,\\\"gux-modal\\\"],[15,\\\"initial-focus\\\",[36,1]],[15,\\\"size\\\",[36,2]],[15,\\\"open\\\",[36,3]],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,5],[[33,6],[33,7]],null],[[[41,[33,8],[[[1,\\\"                \\\"],[10,0],[14,5,\\\"display: flex; align-items: flex-start; gap: 12px;\\\"],[14,\\\"slot\\\",\\\"title\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,5,\\\"width: 36px; height: 36px; flex-shrink: 0; flex-grow: 0;\\\"],[15,\\\"icon-name\\\",[36,8]],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[1,[34,7]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                \\\"],[10,0],[14,\\\"slot\\\",\\\"title\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[34,7]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[]],null],[41,[33,3],[[[1,\\\"            \\\"],[10,0],[14,\\\"slot\\\",\\\"content\\\"],[12],[1,\\\"\\\\n                \\\"],[18,1,[[33,10],[33,11],[33,12],[28,[37,13],[[30,0],\\\"setAttribute\\\"],null],[33,7],[33,14],[33,15]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[28,[37,5],[[33,16],[28,[37,17],[[33,14],[33,15]],null]],null],[[[1,\\\"            \\\"],[10,\\\"gux-cta-group\\\"],[14,\\\"slot\\\",\\\"footer\\\"],[14,\\\"align\\\",\\\"end\\\"],[15,\\\"dangerous\\\",[36,18]],[12],[1,\\\"\\\\n\\\"],[41,[33,15],[[[1,\\\"                    \\\"],[10,\\\"gux-button\\\"],[14,1,\\\"cancel-button\\\"],[14,\\\"slot\\\",\\\"dismiss\\\"],[15,\\\"onclick\\\",[28,[37,13],[[30,0],\\\"sendCancel\\\"],null]],[14,\\\"data-testid\\\",\\\"modal-gux-cancel-button\\\"],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[34,15]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,14],[[[1,\\\"                    \\\"],[10,\\\"gux-button\\\"],[14,\\\"slot\\\",\\\"primary\\\"],[15,\\\"disabled\\\",[36,19]],[15,\\\"onclick\\\",[28,[37,13],[[30,0],\\\"sendConfirm\\\"],null]],[14,\\\"data-testid\\\",\\\"modal-gux-confirm-button\\\"],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[34,14]],[1,\\\"\\\\n\\\"],[41,[33,20],[[[1,\\\"                            \\\"],[10,\\\"gux-radial-loading\\\"],[14,\\\"context\\\",\\\"input\\\"],[14,\\\"screenreader-text\\\",\\\"Loading...\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[\\\"&default\\\"],false,[\\\"extraClassNames\\\",\\\"initialFocus\\\",\\\"size\\\",\\\"isOpen\\\",\\\"if\\\",\\\"and\\\",\\\"showHeader\\\",\\\"headerText\\\",\\\"headerIcon\\\",\\\"yield\\\",\\\"confirmAction\\\",\\\"cancelAction\\\",\\\"disableAction\\\",\\\"action\\\",\\\"confirmText\\\",\\\"cancelText\\\",\\\"showFooter\\\",\\\"or\\\",\\\"dangerous\\\",\\\"confirmDisabled\\\",\\\"confirmLoading\\\"]]\",\"moduleName\":\"web-directory/components/modal-gux/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed, get, set } from '@ember/object';\nimport { readOnly } from '@ember/object/computed';\nimport { inject } from '@ember/service';\nimport { getModeFilterPanelKey, type ModeAction } from './modes';\n\nexport default Component.extend({\n    classNames: ['mode-manager'] as const,\n    classNameBindings: ['hasModeSwitcher::single-mode'] as const,\n\n    rosterSidePanelService: inject('modes/roster-side-panel-service'),\n    rosterSelectionService: inject('modes/roster-selection-service'),\n    modeService: inject('modes/mode-service'),\n    interapptionsStateService: inject('modes/interapptions-state-service'),\n    mainstageLayoutService: inject('modes/mainstage-layout-service'),\n    sessionService: inject('session'),\n\n    modes: readOnly('modeService.modes'),\n    hasModeSwitcher: readOnly('modeService.hasModeSwitcher'),\n\n    selected: readOnly('modeService.selectedModeId'),\n\n    currentMode: readOnly('modeService.currentMode'),\n\n    displayedMainStageMode: readOnly('modeService.displayedMainStageMode'),\n\n    /**\n     * When true, the native scripter component is rendered inside the shared carousel slot.\n     * False means the scripter gadget provider handles it.\n     */\n    useScripterGadget: computed.bool('sessionService.features.PURE-6186_Scripter_Gadget_GCUI'),\n\n    /**\n     * Safe default for activeInteractions — the interaction panel is always mounted so this\n     * must never be undefined; acd-interactions-panel-v2/interaction calls .length on it directly.\n     */\n    activeInteractions: computed('displayedMainStageMode.activeInteractions', function (this: any): any[] {\n        return this.get('displayedMainStageMode.activeInteractions') ?? [];\n    }),\n\n    /**\n     * True when a roster item is selected for the main stage. When false, the shared\n     * empty-main-stage is shown across all modes.\n     */\n    hasMainStageSelection: computed('rosterSelectionService.selection', function (): boolean {\n        const selection = this.get('rosterSelectionService.selection');\n        return !!selection?.payload;\n    }),\n\n    /**\n     * Size/collapsed pushed up by the legacy interaction mainstage (Active/Inactive modes) via the\n     * onMainstageSizeChanged/onMainstageCollapsedChanged closure actions.\n     *\n     * Custom mainstage modes (History/Contacts) drive their layout through the mainstage-layout-service instead.\n     */\n    _pushedMainstageSize: 'medium' as string,\n    _pushedMainstageCollapsed: false as boolean,\n\n    /**\n     * The current mainstage size for the grid `panel-size-*` class. For custom mainstage modes it is\n     * sourced from the mainstage-layout-service (the displayed mode is the single source of truth);\n     * for the legacy interaction main stage it is the value pushed up by the interaction component.\n     */\n    mainstageSize: computed(\n        'displayedMainStageMode.mainStageComponent',\n        'mainstageLayoutService.currentSize',\n        '_pushedMainstageSize',\n        function (this: any): string {\n            return this.get('displayedMainStageMode.mainStageComponent')\n                ? this.get('mainstageLayoutService.currentSize')\n                : this.get('_pushedMainstageSize');\n        }\n    ),\n\n    /**\n     * Whether the mainstage is collapsed (controls the `mainstage-collapsed` class). Sourced the same\n     * way as `mainstageSize`.\n     */\n    isMainstageCollapsed: computed(\n        'displayedMainStageMode.mainStageComponent',\n        'mainstageLayoutService.currentCollapsed',\n        '_pushedMainstageCollapsed',\n        function (this: any): boolean {\n            return this.get('displayedMainStageMode.mainStageComponent')\n                ? this.get('mainstageLayoutService.currentCollapsed')\n                : this.get('_pushedMainstageCollapsed');\n        }\n    ),\n\n    _closeSidePanel() {\n        this.get('rosterSidePanelService').close();\n    },\n\n    _openFilterPanel() {\n        const mode = this.get('currentMode');\n        const modeId = get(mode, 'id');\n        const filter = get(mode, 'filter');\n        if (!mode || !modeId || !filter?.enabled) return;\n\n        this.get('rosterSidePanelService').toggle({\n            componentName: filter.panelComponent,\n            panelKey: getModeFilterPanelKey(modeId)\n        });\n    },\n\n    _headerAction(action: ModeAction) {\n        if (!action.onAction) {\n            console.warn('No action handler provided for header action', action);\n            return;\n        }\n\n        action.onAction();\n    },\n\n    _searchQueryChange(value: string) {\n        const mode = this.get('currentMode');\n        if (!mode) return;\n        set(mode, 'searchQuery', value);\n    },\n\n    _showAllHiddenItems() {\n        const mode = this.get('currentMode');\n        if (!mode) return;\n        mode.showAllHiddenItems();\n    },\n\n    _sortOrderChange(value: string) {\n        const mode = this.get('currentMode');\n        if (!mode) return;\n        set(mode, 'sortOrder', value);\n    },\n\n    _onMainstageFocusedChanged(value: boolean) {\n        this.get('displayedMainStageMode')?.onMainstageFocusedChanged(value);\n    },\n\n    _insertChatText(text: string) {\n        this.get('displayedMainStageMode')?.insertChatText?.(text);\n    },\n\n    _insertSmsText(response: { strippedText?: string; structuredMessage?: string }) {\n        this.get('displayedMainStageMode')?.insertSmsText?.(response);\n    },\n\n    _insertEmailText(text: string) {\n        this.get('displayedMainStageMode')?.insertEmailText?.(text);\n    },\n\n    _displayError(messageKey: string, options?: Record<string, any>) {\n        this.get('displayedMainStageMode')?.displayError(messageKey, options);\n    },\n\n    _loadDivisionName(divisionId: string | undefined) {\n        return this.get('displayedMainStageMode')?.loadDivisionName(divisionId);\n    },\n\n    _contextualScriptAvailabilityChanged(scriptAvailable: boolean) {\n        this.get('displayedMainStageMode')?.contextualScriptAvailabilityChanged(scriptAvailable);\n    },\n\n    actions: {\n        onFilter() {\n            this._openFilterPanel();\n        },\n\n        onSelectMode(mode: string) {\n            this.get('modeService').selectMode(mode);\n        },\n\n        onCloseSidePanel() {\n            this._closeSidePanel();\n        },\n\n        onRosterSearchQueryChange(value: string) {\n            this._searchQueryChange(value);\n        },\n\n        onRosterSortOrderChange(value: string) {\n            this._sortOrderChange(value);\n        },\n\n        onShowAllHiddenItems() {\n            this._showAllHiddenItems();\n        },\n\n        onHeaderAction(action: ModeAction) {\n            this._headerAction(action);\n        },\n\n        onMainstageFocusedChanged(value: boolean) {\n            this._onMainstageFocusedChanged(value);\n        },\n\n        insertChatText(text: string) {\n            this._insertChatText(text);\n        },\n\n        insertSmsText(response: { strippedText?: string; structuredMessage?: string }) {\n            this._insertSmsText(response);\n        },\n\n        insertEmailText(text: string) {\n            this._insertEmailText(text);\n        },\n\n        displayError(messageKey: string, options?: Record<string, any>) {\n            this._displayError(messageKey, options);\n        },\n\n        loadDivisionName(divisionId: string | undefined) {\n            return this._loadDivisionName(divisionId);\n        },\n\n        contextualScriptAvailabilityChanged(scriptAvailable: boolean) {\n            this._contextualScriptAvailabilityChanged(scriptAvailable);\n        },\n\n        /**\n         * Only invoked by the legacy `acd-interactions-panel-v2/interaction` component (Active/Inactive modes).\n         * Custom main-stage modes (History/Contacts) drive layout through mainstage-layout-service\n         * and are not wired to this action.\n         */\n        onMainstageSizeChanged(size: string) {\n            this.set('_pushedMainstageSize', size);\n        },\n\n        /**\n         * Only invoked by the legacy `acd-interactions-panel-v2/interaction` component (Active/Inactive modes).\n         * Custom main-stage modes (History/Contacts) drive layout through mainstage-layout-service\n         * and are not wired to this action.\n         */\n        onMainstageCollapsedChanged(collapsed: boolean) {\n            this.set('_pushedMainstageCollapsed', collapsed);\n        },\n\n        isContextualScriptAvailable(interaction: any) {\n            return interaction && (interaction.get('isEmail') || interaction.get('isSms'));\n        }\n    }\n});\n","import { getOwner } from '@ember/application';\nimport Component from '@ember/component';\nimport { computed, defineProperty } from '@ember/object';\nimport { run } from '@ember/runloop';\nimport { inject } from '@ember/service';\nimport RSVP from 'rsvp';\nimport {\n    computeInteractionKey,\n    getInteractionType\n} from 'web-directory/components/acd-interactions-panel-v2/interapptions-manager-v2/component';\nimport type { Maybe } from 'web-directory/types';\nimport { _buildAppProviderComputed, _buildProviderConfig } from 'web-directory/utils/app-provider';\nimport type { AppContext, ConversationAppContext } from 'web-directory/utils/apps';\nimport { isTesting } from 'web-directory/utils/testing';\nimport {\n    PanelSetting,\n    addNativeProvider,\n    standardTransformationFtComputedDepKey,\n    transformPanelId,\n    transformPanelSetting\n} from 'web-directory/utils/transform-panels';\nimport { _buildWorkerProviderComputed } from 'web-directory/utils/worker-provider';\n\ntype PanelSettings = Record<string, PanelSetting>;\n\n/**\n * Container component that renders `interapptions-manager-v2` at the mode-manager level.\n *\n * Responsibilities:\n * - Configures app and worker providers\n * - Fetches default panel settings\n * - Reads activeAppContexts and selectedAppContext from the interapptions-state-service\n * - Computes forcedPanelSelectionMap from interaction state\n * - Writes interapptions-manager-v2 outputs to the interapptions-state-service\n *\n * This component persists across mode switches so that the interapptions manager's\n * iframe pool and app state are not destroyed.\n */\nexport default Component.extend({\n    tagName: '' as const,\n\n    // --- Services ---\n    // NOTE: 'permissions', 'session', and 'logger' must use these exact names because\n    // _buildProviderComputed (shared-provider.ts) hardcodes this.get('permissions'),\n    // this.get('session.features'), and this.logger when evaluating provider boolExprs.\n    interapptionsStateService: inject('modes/interapptions-state-service'),\n    mainstageLayoutService: inject('modes/mainstage-layout-service'),\n    modeService: inject('modes/mode-service'),\n    agentUIBackendService: inject('agent-ui-backend'),\n    permissions: inject('permissions'),\n    session: inject('session'),\n    apps: inject('apps'),\n    logger: inject('stash-logger'),\n    commandNav: inject('command-nav'),\n\n    // --- State ---\n    interapptionProviders: null as any,\n    workerProviders: null as any,\n    _defaultPanelSettings: null as Maybe<Record<string, any>>,\n\n    // --- Computeds ---\n\n    /**\n     * AppContext[] computed by the state service from the current mode's allItems.\n     */\n    activeAppContexts: computed.readOnly('interapptionsStateService.activeAppContexts'),\n\n    /**\n     * The selected AppContext computed by the state service from the current mode's selectedItem.\n     */\n    selectedAppContext: computed.readOnly('interapptionsStateService.selectedAppContext'),\n\n    /**\n     * Filtered provider list for the interapptions manager (contextual + conversation).\n     */\n    v2InterapptionProviders: computed('interapptionProviders', function (): any[] {\n        const interapptionProviders = this.get('interapptionProviders') as any[] | null;\n        if (!interapptionProviders) return [];\n\n        return interapptionProviders.filter((curr: any) => {\n            const type = curr.group || 'contextual';\n            return type === 'contextual' || type === 'conversation';\n        });\n    }),\n\n    /**\n     * Default panel settings fetched from the agent UI backend.\n     */\n    defaultPanelSettings: computed(\n        '_defaultPanelSettings',\n        standardTransformationFtComputedDepKey,\n        function (this: any): PanelSettings {\n            const features = this.get('session').get('features');\n            const basePanelSettings = (this.get('_defaultPanelSettings') ?? {}) as PanelSettings;\n            return Object.fromEntries(\n                Object.entries(basePanelSettings).map(([key, currSetting]) => {\n                    const transformedPanel = transformPanelSetting(currSetting, features);\n\n                    if (transformedPanel.type === 'BuiltIn') {\n                        // Append the native provider, if needed.\n                        // Safe to call even if the panelId already includes the native provider\n                        transformedPanel.panelId = addNativeProvider(transformedPanel.panelId);\n                    }\n\n                    return [key, transformedPanel];\n                })\n            );\n        }\n    ),\n\n    /**\n     * Computes forced panel selections based on interaction state.\n     */\n    forcedPanelSelectionMap: computed('activeAppContexts', standardTransformationFtComputedDepKey, function (): Record<\n        string,\n        string[]\n    > {\n        const activeAppContexts: AppContext[] = this.get('activeAppContexts');\n        const features = this.get('session').get('features');\n        const baseForcedPanelSelectionMap = activeAppContexts\n            .filter((appContext): appContext is ConversationAppContext => {\n                return appContext.type === 'conversation';\n            })\n            .reduce<Record<string, string[]>>((result, appContext) => {\n                const forcedPanels: string[] = [];\n\n                if (appContext.payload.get('isDisconnected') || appContext.payload.get('isTerminated')) {\n                    forcedPanels.push('wrapupCodesGadget&wrapupCodesGadgetProvider');\n                }\n\n                const requiresStructuredMessage = this._doesRequireStructuredMessage(appContext.payload);\n                if (requiresStructuredMessage) {\n                    forcedPanels.push('responses&native');\n                }\n\n                const internalMessages = appContext.payload.get('participantForCurrentUser.internalMessages');\n                if (internalMessages && internalMessages.length > 0) {\n                    forcedPanels.push('consultConversationGadget&consultGadgetProvider');\n                }\n\n                // Auto-open video and cobrowse panels when sessions become active.\n                // This ensures users don't need to manually click to open the panel when a session starts.\n                // This serves as a workaround until we have official support for pinning panels.\n                if (appContext.payload.get('isVideoActive')) {\n                    forcedPanels.push('video&videoProvider');\n                }\n\n                if (appContext.payload.get('cobrowseSessionShareActive')) {\n                    forcedPanels.push('cobrowse&cobrowseProvider');\n                }\n\n                result[computeInteractionKey(appContext.id, getInteractionType(appContext))] = forcedPanels;\n                return result;\n            }, {});\n\n        // Transform the panel ids as needed\n        return Object.fromEntries(\n            Object.entries(baseForcedPanelSelectionMap).map(([key, forcedPanels]) => {\n                if (forcedPanels.length === 0) {\n                    return [key, []];\n                }\n                return [key, forcedPanels.map(panelId => addNativeProvider(transformPanelId(panelId, features)))];\n            })\n        );\n    }),\n\n    useScripterGadget: computed.bool('session.features.PURE-6186_Scripter_Gadget_GCUI'),\n\n    /**\n     * Length of notes history for the selected interaction.\n     * Used by interapptions-manager-v2 to set attention count on the notes gadget.\n     */\n    notesHistoryLength: computed('interapptionsStateService.selectedAppContext', function (): number {\n        const selectedAppContext = this.get('interapptionsStateService.selectedAppContext');\n        if (!selectedAppContext || !('payload' in selectedAppContext)) return 0;\n        const notesHistory =\n            typeof selectedAppContext.payload.get === 'function'\n                ? selectedAppContext.payload.get('notesHistory')\n                : selectedAppContext.payload.notesHistory;\n        return notesHistory ? notesHistory.length : 0;\n    }),\n\n    _doesRequireStructuredMessage: function (interaction: any): boolean {\n        const lastInbound = interaction.get('lastCustomerMessage');\n        if (interaction.get('subMessageType') === 'whatsapp' && lastInbound) {\n            // Check if last inbound message is older than 24 hours (24h * 60min * 60s * 1000ms)\n            return new Date(lastInbound.timestamp).getTime() <= Date.now() - 24 * 60 * 60 * 1000;\n        }\n        return false;\n    },\n\n    // --- Lifecycle ---\n\n    init() {\n        this._super(...arguments);\n        this.configureAppProviders();\n        this.configureWorkerProviders();\n        this.configureDefaultPanels();\n    },\n\n    /**\n     * Configure app providers from the container registry.\n     */\n    configureAppProviders() {\n        const providerConfigMap = getOwner(this).lookup('app-provider:provider-config-map');\n        const providerConfig = _buildProviderConfig(providerConfigMap, this.get('logger'));\n        defineProperty(this, 'interapptionProviders', _buildAppProviderComputed(providerConfig));\n    },\n\n    /**\n     * Configure worker providers from the container registry.\n     */\n    configureWorkerProviders() {\n        const workerProviderConfigMap = getOwner(this).lookup('worker-provider:provider-config-map');\n        const providerConfig = _buildProviderConfig(workerProviderConfigMap, this.get('logger'));\n        defineProperty(this, 'workerProviders', _buildWorkerProviderComputed(providerConfig));\n    },\n\n    /**\n     * Fetches org default panel settings, retrying once after a delay when the first attempt fails.\n     */\n    _fetchDefaultPanelSettingsWithRetry(): RSVP.Promise<any> {\n        return this.get('agentUIBackendService')\n            .getOrganizationDefaultPanelSettings()\n            .catch((error: Error) => {\n                this.get('logger').error(\n                    'Failed initial attempt to load the org-level default panel settings, retrying...',\n                    { error }\n                );\n                return new RSVP.Promise<void>(resolve => run.later(() => resolve(), 1000)).then(() => {\n                    if (this.get('isDestroyed') || this.get('isDestroying')) return;\n                    return this.get('agentUIBackendService').getOrganizationDefaultPanelSettings();\n                });\n            });\n    },\n\n    /**\n     * @Init\n     * Configure the default sub-panels to show.\n     */\n    configureDefaultPanels() {\n        const shouldFetchDefaultPanelSettings =\n            this.get('permissions').validateDonutPermission('agentUI:defaultPanels:view');\n\n        if (!isTesting && shouldFetchDefaultPanelSettings) {\n            this._fetchDefaultPanelSettingsWithRetry()\n                .then((settings: any) => {\n                    if (this.get('isDestroyed') || this.get('isDestroying')) return;\n                    this.set('_defaultPanelSettings', settings && typeof settings === 'object' ? settings : {});\n                })\n                .catch((error: Error) => {\n                    if (this.get('isDestroyed') || this.get('isDestroying')) return;\n                    this.get('logger').error('Failed to load org-level default panel settings', { error });\n                    this.set('_defaultPanelSettings', {});\n                });\n        }\n    },\n\n    // --- Actions ---\n\n    actions: {\n        onAppPoolReady(appPoolV2: any) {\n            this.get('interapptionsStateService').set('appPoolV2', appPoolV2);\n        },\n\n        onAppAttentionCountChanged(attentionCountPerCompositeId: Record<string, number>) {\n            this.get('interapptionsStateService').set('attentionCountPerCompositeId', attentionCountPerCompositeId);\n        },\n\n        onHasConversationAppForCurrInteractionChanged(value: boolean) {\n            this.get('interapptionsStateService').set('hasConversationAppForCurrInteraction', value);\n        },\n\n        onVisibleContextualAppsForCurrInteractionChanged(value: string[]) {\n            this.get('interapptionsStateService').set('visibleContextualAppsForCurrInteraction', value);\n        },\n\n        onHasContextualFocusModeEnabledChanged(value: boolean) {\n            this.get('interapptionsStateService').set('hasContextualFocusModeEnabled', value);\n        },\n\n        onAppsForcedOpen(_appDefIds: string[]) {\n            // When apps are forced open, exit mainstage focus mode (matches legacy behavior)\n            this.get('mainstageLayoutService').resetFocused();\n        },\n\n        insertChatText(text: string) {\n            this.get('interapptionsStateService').set('cannedResponseChatText', text);\n        },\n\n        insertSmsText(response: { strippedText?: string; structuredMessage?: string }) {\n            this.get('interapptionsStateService').set('cannedResponseSmsText', response.strippedText || null);\n            this.get('interapptionsStateService').set('structuredMessage', response.structuredMessage || null);\n        },\n\n        insertEmailText(text: string) {\n            this.get('interapptionsStateService').set('cannedResponseEmailText', text);\n        },\n\n        buildValidInterapption(typeId: string, id: string, config: any, trustedProvider?: boolean) {\n            return this.get('apps').buildValidInterapption(typeId, id, config, trustedProvider);\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"YScflC0u\",\"block\":\"[[[1,[28,[35,0],null,[[\\\"useAppsV2ConversationInterapptionManager\\\",\\\"activeInteractions\\\",\\\"forcedPanelSelectionMap\\\",\\\"defaultPanelSettings\\\",\\\"contextualInteractionScriptStateMap\\\",\\\"onAppPoolReady\\\",\\\"onAppAttentionCountChanged\\\",\\\"onHasConversationAppForCurrInteractionChanged\\\",\\\"onVisibleContextualAppsForCurrInteractionChanged\\\",\\\"onHasContextualFocusModeEnabledChanged\\\",\\\"onAppsForcedOpen\\\",\\\"appProviders\\\",\\\"workerProviders\\\",\\\"selectedInteraction\\\",\\\"buildValidInterapption\\\",\\\"insertChatText\\\",\\\"insertSmsText\\\",\\\"insertEmailText\\\",\\\"useScripterGadget\\\",\\\"notesHistoryLength\\\",\\\"agentPanelIsActive\\\"],[true,[33,1],[33,2],[33,3],[33,4,[\\\"contextualInteractionScriptStateMap\\\"]],[28,[37,5],[[30,0],\\\"onAppPoolReady\\\"],null],[28,[37,5],[[30,0],\\\"onAppAttentionCountChanged\\\"],null],[28,[37,5],[[30,0],\\\"onHasConversationAppForCurrInteractionChanged\\\"],null],[28,[37,5],[[30,0],\\\"onVisibleContextualAppsForCurrInteractionChanged\\\"],null],[28,[37,5],[[30,0],\\\"onHasContextualFocusModeEnabledChanged\\\"],null],[28,[37,5],[[30,0],\\\"onAppsForcedOpen\\\"],null],[33,6],[33,7],[33,8],[28,[37,5],[[30,0],\\\"buildValidInterapption\\\"],null],[28,[37,5],[[30,0],\\\"insertChatText\\\"],null],[28,[37,5],[[30,0],\\\"insertSmsText\\\"],null],[28,[37,5],[[30,0],\\\"insertEmailText\\\"],null],[33,9],[33,10],[33,11,[\\\"agentPanelIsActive\\\"]]]]]]],[],false,[\\\"acd-interactions-panel-v2/interapptions-manager-v2\\\",\\\"activeAppContexts\\\",\\\"forcedPanelSelectionMap\\\",\\\"defaultPanelSettings\\\",\\\"interapptionsStateService\\\",\\\"action\\\",\\\"v2InterapptionProviders\\\",\\\"workerProviders\\\",\\\"selectedAppContext\\\",\\\"useScripterGadget\\\",\\\"notesHistoryLength\\\",\\\"commandNav\\\"]]\",\"moduleName\":\"web-directory/components/mode-manager/interapptions-container/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { inject } from '@ember/service';\n\n/**\n * Shared empty main stage shown when no roster item is selected across any mode.\n *\n * Visual treatment ports the legacy interaction-queue-status (on/off-queue illustration);\n * copy is selection-generic rather than conversation-specific.\n */\nexport default Component.extend({\n    classNames: ['empty-main-stage'] as const,\n    classNameBindings: ['isOnQueue:is-on-queue:is-off-queue'] as const,\n\n    session: inject('session'),\n\n    /**\n     * Whether the agent is on queue. Drives illustration and status message.\n     */\n    isOnQueue: computed('session.person.isOnQueue', function (): boolean {\n        return !!this.get('session.person.isOnQueue');\n    }),\n\n    messageKey: computed('isOnQueue', function (): string {\n        if (this.get('isOnQueue')) {\n            return 'modes.emptyMainStage.waitingOnQueue';\n        }\n        return 'modes.emptyMainStage.noSelection';\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"bjr75IzI\",\"block\":\"[[[10,0],[14,0,\\\"empty-main-stage-container\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"empty-main-stage-content\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"empty-main-stage-image\\\"],[12],[1,\\\"\\\\n            \\\"],[10,2],[14,0,\\\"empty-main-stage-message\\\"],[14,\\\"role\\\",\\\"status\\\"],[14,\\\"aria-live\\\",\\\"polite\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,0],[[33,1]],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"t\\\",\\\"messageKey\\\"]]\",\"moduleName\":\"web-directory/components/mode-manager/main-stages/empty-main-stage/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { readOnly } from '@ember/object/computed';\nimport { inject } from '@ember/service';\nimport type { Maybe } from 'web-directory/types';\nimport { MainstageSizes, MainstageSizeIcons, type MainstageSize } from 'web-directory/utils/mainstage';\n\nexport default Component.extend({\n    classNames: ['external-contact-main-stage'] as const,\n\n    rosterSelectionService: inject('modes/roster-selection-service'),\n    interapptionsStateService: inject('modes/interapptions-state-service'),\n    mainstageLayoutService: inject('modes/mainstage-layout-service'),\n\n    /**\n     * @attribute\n     * The current mode object passed from mode-manager template.\n     */\n    mode: null as Maybe<any>,\n\n    showMainstageSizer: false,\n    mainstageSizes: MainstageSizes,\n    mainstageSizeIcons: MainstageSizeIcons,\n\n    /**\n     * The id of the currently selected roster item for this mode.\n     */\n    selectedId: computed('rosterSelectionService.selection', 'mode.id', function (this: any): string | null {\n        const selection = this.get('rosterSelectionService.selection');\n        if (selection?.modeId !== this.get('mode.id')) return null;\n        return selection.id ?? null;\n    }),\n\n    hasContextualFocusModeEnabled: readOnly('interapptionsStateService.hasContextualFocusModeEnabled'),\n\n    /**\n     * Resolved layout for the current selection, owned by the mainstage-layout-service.\n     */\n    mainstageSize: readOnly('mainstageLayoutService.currentSize'),\n    isMainstageCollapsed: readOnly('mainstageLayoutService.currentCollapsed'),\n\n    /**\n     * Handles the `guxdismiss` custom event bubbling from `gux-popover` when it auto-closes\n     * (outside click, escape, etc.). Resets the sizer boolean so the button highlight stays in sync.\n     */\n    guxdismiss(event: any) {\n        if (event?.target?.id === 'ec-mainstage-size-popover') {\n            this.set('showMainstageSizer', false);\n        }\n    },\n\n    actions: {\n        onToggleMainstageCollapse(this: any) {\n            this.get('mainstageLayoutService').toggleCollapse();\n        },\n\n        toggleSizer(this: any) {\n            this.toggleProperty('showMainstageSizer');\n        },\n\n        sizeMainstage(this: any, size: MainstageSize) {\n            this.set('showMainstageSizer', false);\n            this.get('mainstageLayoutService').updateSize(size);\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"cSenjDSA\",\"block\":\"[[[10,0],[14,0,\\\"external-contact-header\\\"],[12],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[15,0,[29,[\\\"external-contact-main-stage-grid \\\",[52,[33,1],\\\"collapsed\\\"]]]],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"interaction-content\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"mainstage-header\\\"],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"mainstage-title\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"h3\\\"],[14,0,\\\"message-type\\\"],[12],[1,[28,[35,2],[\\\"purecloud.acdInteraction.interactionTypes.externalContact\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,0],[14,0,\\\"mainstage-header__action-container\\\"],[12],[1,\\\"\\\\n                \\\"],[11,\\\"button\\\"],[24,1,\\\"ec-mainstage-size-collapse\\\"],[16,0,[29,[\\\"mainstage-header__action-button mainstage-header__collapse-button\\\\n                        \\\",[52,[33,1],\\\"enabled\\\"]]]],[16,\\\"aria-label\\\",[52,[33,1],[28,[37,2],[\\\"common.expand\\\"],null],[28,[37,2],[\\\"common.collapse\\\"],null]]],[16,\\\"aria-pressed\\\",[52,[33,1],\\\"true\\\",\\\"false\\\"]],[24,4,\\\"button\\\"],[4,[38,3],[[30,0],\\\"onToggleMainstageCollapse\\\"],null],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"chevron-double-left\\\"],[15,\\\"screenreader-text\\\",[52,[33,1],[28,[37,2],[\\\"common.expand\\\"],null],[28,[37,2],[\\\"common.collapse\\\"],null]]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"ec-mainstage-size-collapse\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,1],[[[1,\\\"                        \\\"],[1,[28,[35,2],[\\\"common.expand\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[1,[28,[35,2],[\\\"common.collapse\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[51,[33,1]],[[[1,\\\"                    \\\"],[11,\\\"button\\\"],[24,1,\\\"ec-mainstage-size-open\\\"],[16,0,[29,[\\\"mainstage-header__action-button\\\\n                            \\\",[36,5],\\\"-size-active\\\\n                            \\\",[52,[33,6],\\\"open\\\"]]]],[16,\\\"aria-label\\\",[28,[37,2],[\\\"purecloud.acdInteraction.panelSizerTooltip\\\"],null]],[16,\\\"aria-expanded\\\",[52,[33,6],\\\"true\\\",\\\"false\\\"]],[24,4,\\\"button\\\"],[4,[38,3],[[30,0],\\\"toggleSizer\\\"],null],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[15,\\\"icon-name\\\",[29,[[28,[37,7],[[33,8],[33,5]],null]]]],[15,\\\"screenreader-text\\\",[28,[37,2],[\\\"purecloud.acdInteraction.panelSizerTooltip\\\"],null]],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\\n                    \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"ec-mainstage-size-open\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,2],[\\\"purecloud.acdInteraction.panelSizerTooltip\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\\n                    \\\"],[10,\\\"gux-popover\\\"],[14,1,\\\"ec-mainstage-size-popover\\\"],[14,0,\\\"mainstage-size-popover\\\"],[14,\\\"position\\\",\\\"bottom-end\\\"],[14,\\\"for\\\",\\\"ec-mainstage-size-open\\\"],[15,\\\"is-open\\\",[36,6]],[12],[1,\\\"\\\\n                        \\\"],[10,0],[14,0,\\\"mainstage-size-list\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,10],[[28,[37,10],[[33,11]],null]],null],null,[[[1,\\\"                                \\\"],[10,\\\"li\\\"],[14,\\\"role\\\",\\\"option\\\"],[15,1,[29,[\\\"ec-\\\",[30,1],\\\"-mainstage-size\\\"]]],[15,0,[29,[\\\"mainstage-size-btn \\\",[30,1],\\\"-size-btn \\\",[52,[28,[37,12],[[33,5],[30,1]],null],\\\"active\\\"]]]],[15,\\\"aria-selected\\\",[29,[[28,[37,12],[[33,5],[30,1]],null]]]],[15,\\\"onclick\\\",[28,[37,3],[[30,0],\\\"sizeMainstage\\\",[30,1]],null]],[12],[1,\\\"\\\\n                                    \\\"],[10,\\\"gux-icon\\\"],[15,\\\"icon-name\\\",[29,[[28,[37,7],[[33,8],[30,1]],null]]]],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                                    \\\"],[10,1],[12],[1,[28,[35,2],[[28,[37,13],[\\\"purecloud.acdInteraction.mainStageSize.\\\",[30,1]],null]],null]],[13],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[14,0,\\\"external-contact-main-stage-body\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[12],[1,[34,14]],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[\\\"size\\\"],false,[\\\"if\\\",\\\"isMainstageCollapsed\\\",\\\"t\\\",\\\"action\\\",\\\"unless\\\",\\\"mainstageSize\\\",\\\"showMainstageSizer\\\",\\\"get\\\",\\\"mainstageSizeIcons\\\",\\\"each\\\",\\\"-track-array\\\",\\\"mainstageSizes\\\",\\\"eq\\\",\\\"concat\\\",\\\"selectedId\\\"]]\",\"moduleName\":\"web-directory/components/mode-manager/main-stages/external-contact-main-stage/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { readOnly } from '@ember/object/computed';\nimport { inject } from '@ember/service';\nimport type { Maybe } from 'web-directory/types';\nimport { MainstageSizes, MainstageSizeIcons, type MainstageSize } from 'web-directory/utils/mainstage';\n\nexport default Component.extend({\n    classNames: ['history-main-stage'] as const,\n\n    rosterSelectionService: inject('modes/roster-selection-service'),\n    interapptionsStateService: inject('modes/interapptions-state-service'),\n    mainstageLayoutService: inject('modes/mainstage-layout-service'),\n\n    /**\n     * @attribute\n     * The current mode object passed from mode-manager template.\n     */\n    mode: null as Maybe<any>,\n\n    showMainstageSizer: false,\n    mainstageSizes: MainstageSizes,\n    mainstageSizeIcons: MainstageSizeIcons,\n\n    /**\n     * The id of the currently selected roster item for this mode.\n     */\n    selectedId: computed('rosterSelectionService.selection', 'mode.id', function (this: any): string | null {\n        const selection = this.get('rosterSelectionService.selection');\n        if (selection?.modeId !== this.get('mode.id')) return null;\n        return selection.id ?? null;\n    }),\n\n    hasContextualFocusModeEnabled: readOnly('interapptionsStateService.hasContextualFocusModeEnabled'),\n\n    /**\n     * Resolved layout for the current selection, owned by the mainstage-layout-service.\n     */\n    mainstageSize: readOnly('mainstageLayoutService.currentSize'),\n    isMainstageCollapsed: readOnly('mainstageLayoutService.currentCollapsed'),\n\n    /**\n     * Handles the `guxdismiss` custom event bubbling from `gux-popover` when it auto-closes\n     * (outside click, escape, etc.). Resets the sizer boolean so the button highlight stays in sync.\n     */\n    guxdismiss(event: any) {\n        if (event?.target?.id === 'history-mainstage-size-popover') {\n            this.set('showMainstageSizer', false);\n        }\n    },\n\n    actions: {\n        onToggleMainstageCollapse(this: any) {\n            this.get('mainstageLayoutService').toggleCollapse();\n        },\n\n        toggleSizer(this: any) {\n            this.toggleProperty('showMainstageSizer');\n        },\n\n        sizeMainstage(this: any, size: MainstageSize) {\n            this.set('showMainstageSizer', false);\n            this.get('mainstageLayoutService').updateSize(size);\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"gp118v2r\",\"block\":\"[[[10,0],[14,0,\\\"history-header\\\"],[12],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[15,0,[29,[\\\"history-main-stage-grid \\\",[52,[33,1],\\\"collapsed\\\"]]]],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"interaction-content\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"mainstage-header\\\"],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"mainstage-title\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"h3\\\"],[14,0,\\\"message-type\\\"],[12],[1,[28,[35,2],[\\\"purecloud.acdInteraction.interactionTypes.analyticsConversation\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,0],[14,0,\\\"mainstage-header__action-container\\\"],[12],[1,\\\"\\\\n                \\\"],[11,\\\"button\\\"],[24,1,\\\"history-mainstage-size-collapse\\\"],[16,0,[29,[\\\"mainstage-header__action-button mainstage-header__collapse-button\\\\n                        \\\",[52,[33,1],\\\"enabled\\\"]]]],[16,\\\"aria-label\\\",[52,[33,1],[28,[37,2],[\\\"common.expand\\\"],null],[28,[37,2],[\\\"common.collapse\\\"],null]]],[16,\\\"aria-pressed\\\",[52,[33,1],\\\"true\\\",\\\"false\\\"]],[24,4,\\\"button\\\"],[4,[38,3],[[30,0],\\\"onToggleMainstageCollapse\\\"],null],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"chevron-double-left\\\"],[15,\\\"screenreader-text\\\",[52,[33,1],[28,[37,2],[\\\"common.expand\\\"],null],[28,[37,2],[\\\"common.collapse\\\"],null]]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"history-mainstage-size-collapse\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,1],[[[1,\\\"                        \\\"],[1,[28,[35,2],[\\\"common.expand\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[1,[28,[35,2],[\\\"common.collapse\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[51,[33,1]],[[[1,\\\"                    \\\"],[11,\\\"button\\\"],[24,1,\\\"history-mainstage-size-open\\\"],[16,0,[29,[\\\"mainstage-header__action-button\\\\n                            \\\",[36,5],\\\"-size-active\\\\n                            \\\",[52,[33,6],\\\"open\\\"]]]],[16,\\\"aria-label\\\",[28,[37,2],[\\\"purecloud.acdInteraction.panelSizerTooltip\\\"],null]],[16,\\\"aria-expanded\\\",[52,[33,6],\\\"true\\\",\\\"false\\\"]],[24,4,\\\"button\\\"],[4,[38,3],[[30,0],\\\"toggleSizer\\\"],null],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[15,\\\"icon-name\\\",[29,[[28,[37,7],[[33,8],[33,5]],null]]]],[15,\\\"screenreader-text\\\",[28,[37,2],[\\\"purecloud.acdInteraction.panelSizerTooltip\\\"],null]],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\\n                    \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"history-mainstage-size-open\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,2],[\\\"purecloud.acdInteraction.panelSizerTooltip\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\\n                    \\\"],[10,\\\"gux-popover\\\"],[14,1,\\\"history-mainstage-size-popover\\\"],[14,0,\\\"mainstage-size-popover\\\"],[14,\\\"position\\\",\\\"bottom-end\\\"],[14,\\\"for\\\",\\\"history-mainstage-size-open\\\"],[15,\\\"is-open\\\",[36,6]],[12],[1,\\\"\\\\n                        \\\"],[10,0],[14,0,\\\"mainstage-size-list\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,10],[[28,[37,10],[[33,11]],null]],null],null,[[[1,\\\"                                \\\"],[10,\\\"li\\\"],[14,\\\"role\\\",\\\"option\\\"],[15,1,[29,[\\\"history-\\\",[30,1],\\\"-mainstage-size\\\"]]],[15,0,[29,[\\\"mainstage-size-btn \\\",[30,1],\\\"-size-btn \\\",[52,[28,[37,12],[[33,5],[30,1]],null],\\\"active\\\"]]]],[15,\\\"aria-selected\\\",[29,[[28,[37,12],[[33,5],[30,1]],null]]]],[15,\\\"onclick\\\",[28,[37,3],[[30,0],\\\"sizeMainstage\\\",[30,1]],null]],[12],[1,\\\"\\\\n                                    \\\"],[10,\\\"gux-icon\\\"],[15,\\\"icon-name\\\",[29,[[28,[37,7],[[33,8],[30,1]],null]]]],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                                    \\\"],[10,1],[12],[1,[28,[35,2],[[28,[37,13],[\\\"purecloud.acdInteraction.mainStageSize.\\\",[30,1]],null]],null]],[13],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[14,0,\\\"history-main-stage-body\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[12],[1,[34,14]],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[\\\"size\\\"],false,[\\\"if\\\",\\\"isMainstageCollapsed\\\",\\\"t\\\",\\\"action\\\",\\\"unless\\\",\\\"mainstageSize\\\",\\\"showMainstageSizer\\\",\\\"get\\\",\\\"mainstageSizeIcons\\\",\\\"each\\\",\\\"-track-array\\\",\\\"mainstageSizes\\\",\\\"eq\\\",\\\"concat\\\",\\\"selectedId\\\"]]\",\"moduleName\":\"web-directory/components/mode-manager/main-stages/history-main-stage/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { Maybe } from 'web-directory/types';\n\nconst MAX_ITEM_COUNT_BADGE_DISPLAY = 99;\n\nexport default Component.extend({\n    classNames: ['mode-button'] as const,\n    classNameBindings: ['selected'] as const,\n\n    tagName: 'button' as const,\n\n    /**\n     * @attribute\n     * The icon name to display\n     */\n    icon: null as Maybe<string>,\n\n    /**\n     * @attribute\n     * The raw string value of the label to display\n     */\n    label: null as Maybe<string>,\n\n    /**\n     * @attribute\n     * Whether the mode button is active\n     */\n    selected: false as boolean,\n\n    /**\n     * @attribute\n     * Number shown in the roster item count badge (only when {@link showItemCountBadge} is true and count &gt; 0).\n     */\n    itemCount: 0 as number,\n\n    /**\n     * @attribute\n     * When true and {@link itemCount} is greater than zero, a badge is shown on the button.\n     */\n    showItemCountBadge: false as boolean,\n\n    /**\n     * The maximum number to display in the item count badge.\n     */\n    maxItemCountBadgeDisplay: MAX_ITEM_COUNT_BADGE_DISPLAY\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"cxgPcITZ\",\"block\":\"[[[41,[28,[37,1],[[33,2],[28,[37,3],[[28,[37,4],[[33,5],0],null],0],null]],null],[[[1,\\\"    \\\"],[10,1],[14,0,\\\"mode-button-count-badge\\\"],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,3],[[33,5],[33,6]],null],[[[1,\\\"            \\\"],[1,[28,[35,7],[\\\"modes.sidebar.rosterItemCountOverflow\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[1,[34,5]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,1],[14,0,\\\"sr-only\\\"],[12],[1,[28,[35,7],[\\\"modes.sidebar.rosterItemCountA11y\\\"],[[\\\"count\\\"],[[33,5]]]]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[10,\\\"gux-icon\\\"],[14,\\\"size\\\",\\\"m\\\"],[15,\\\"icon-name\\\",[36,8]],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[12],[1,[34,9]],[13]],[],false,[\\\"if\\\",\\\"and\\\",\\\"showItemCountBadge\\\",\\\"gt\\\",\\\"or\\\",\\\"itemCount\\\",\\\"maxItemCountBadgeDisplay\\\",\\\"t\\\",\\\"icon\\\",\\\"label\\\"]]\",\"moduleName\":\"web-directory/components/mode-manager/mode-button/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { cancel, debounce, next, run } from '@ember/runloop';\nimport { inject } from '@ember/service';\n\n/** Layout row: digit and optional i18n key for the letter row under classic ITU-T E.161 / phone keypads. */\ntype ModeDialPadKey = {\n    digit: string;\n    subtitleTranslationKey?: string;\n};\n\nconst DIALPAD_KEYS: ModeDialPadKey[] = [\n    { digit: '1' },\n    { digit: '2', subtitleTranslationKey: 'modeDialPad.subtitle2' },\n    { digit: '3', subtitleTranslationKey: 'modeDialPad.subtitle3' },\n    { digit: '4', subtitleTranslationKey: 'modeDialPad.subtitle4' },\n    { digit: '5', subtitleTranslationKey: 'modeDialPad.subtitle5' },\n    { digit: '6', subtitleTranslationKey: 'modeDialPad.subtitle6' },\n    { digit: '7', subtitleTranslationKey: 'modeDialPad.subtitle7' },\n    { digit: '8', subtitleTranslationKey: 'modeDialPad.subtitle8' },\n    { digit: '9', subtitleTranslationKey: 'modeDialPad.subtitle9' },\n    { digit: '*' },\n    { digit: '0', subtitleTranslationKey: 'modeDialPad.subtitle0' },\n    { digit: '#' }\n];\n\nconst DTMF_DEBOUNCE_MS = 500;\n\n/** Volume multiplier for the local keypress tone, matching legacy dial-pad-number. */\nconst DTMF_VOLUME_PERCENTAGE = 0.5;\n\n/**\n * Map phone keypad letters (and '+') to digit values as on a classic telephone keypad.\n * Used only for keyboard entry; tones are still sent as their digit string (e.g. \"2\" for ABC).\n */\nconst LETTER_TO_DIALPAD_DIGIT: Record<string, string> = {\n    a: '2',\n    b: '2',\n    c: '2',\n    d: '3',\n    e: '3',\n    f: '3',\n    g: '4',\n    h: '4',\n    i: '4',\n    j: '5',\n    k: '5',\n    l: '5',\n    m: '6',\n    n: '6',\n    o: '6',\n    p: '7',\n    q: '7',\n    r: '7',\n    s: '7',\n    t: '8',\n    u: '8',\n    v: '8',\n    w: '9',\n    x: '9',\n    y: '9',\n    z: '9',\n    '+': '0'\n};\n\nfunction digitFromKeyboardEvent(event: KeyboardEvent): string | null {\n    const k = event.key;\n    if (k === '*' || k === '#') return k;\n    if (/^[0-9]$/.test(k)) return k;\n    const mapped = LETTER_TO_DIALPAD_DIGIT[k.toLowerCase()];\n    return mapped ?? null;\n}\n\nconst DIALPAD_COLS = 3;\nconst DIALPAD_ROWS = 4;\nconst DIALPAD_KEY_COUNT = DIALPAD_COLS * DIALPAD_ROWS;\n/** Index offset between top and bottom row in the same column (vertical wrap). */\nconst DIALPAD_VERTICAL_WRAP = DIALPAD_COLS * (DIALPAD_ROWS - 1);\n/** Step to opposite side of the same row when wrapping horizontally (e.g. col 0 <-> col 2). */\nconst DIALPAD_HORIZONTAL_WRAP = DIALPAD_COLS - 1;\n\nfunction isDialPadArrowKey(key: string): boolean {\n    return key === 'ArrowUp' || key === 'ArrowDown' || key === 'ArrowLeft' || key === 'ArrowRight';\n}\n\n/**\n * Roster / outbound dial pad: optional toggle, digit grid, optional keyboard entry, and\n * optional in-call DTMF via `phone.dialDtmfNumber` using caller-supplied `entityId` and\n * `participantId` (e.g. conversation id and active user participant id). Permission and call-state\n * checks belong outside this component.\n *\n * With `enableKeyboardInput`, the first dial key is focused when the pad opens and Arrow keys move\n * across the 3×4 grid (Down/Right from outside a key enter at \"1\", Up at \"*\", Left at \"3\"). Up/Down\n * wrap between the top and bottom row; Left/Right wrap along the same row. Letter/number keys still\n * enter digits as before.\n */\nexport default Component.extend({\n    classNames: ['mode-dial-pad'] as const,\n\n    phone: inject('phone'),\n    sound: inject('sound'),\n\n    /**\n     * @attribute\n     * When `true`, queued digits are sent with `phone.dialDtmfNumber` after a short debounce\n     * (requires `entityId`, `participantId`, and `phone.dtmf`).\n     */\n    sendDtmf: false,\n\n    /**\n     * @attribute\n     * Conversation / entity id for the DTMF API path (first argument to `dialDtmfNumber`).\n     */\n    entityId: null as string | null,\n\n    /**\n     * @attribute\n     * Participant id for the active user on that entity (second argument to `dialDtmfNumber`).\n     */\n    participantId: null as string | null,\n\n    /**\n     * @attribute\n     * When `false`, the open/close control is hidden and the grid shows whenever this component renders.\n     * @note when this is false, the dial pad is always open\n     */\n    showToggle: true,\n\n    /**\n     * @attribute\n     * When `true` and the pad is open, the first dial key receives focus so keyboard digits work.\n     */\n    enableKeyboardInput: true,\n\n    /**\n     * @attribute\n     * When `true`, the dial pad is disabled and cannot be used.\n     */\n    disabled: false,\n\n    /**\n     * Ordered keys shown in the grid (digit + optional subtitle letters per telephone keypad layout).\n     */\n    dialPadKeys: DIALPAD_KEYS,\n\n    showDialPad: false,\n\n    /** Buffered DTMF characters; flushed via debounced `_flushDtmfQueue`. */\n    dtmfQueue: [] as string[],\n\n    _dtmfTimer: null as any,\n\n    /** Avoid key repeat firing multiple DTMF / digit events while a key is held. */\n    isKeydownPrimed: true,\n\n    init() {\n        this._super(...arguments);\n        // dtmfQueue MUST be set per-instance; arrays on the prototype are shared by reference\n        // across all component instances which causes digits from one pad to leak into another.\n        this.set('dtmfQueue', []);\n        if (!this.get('showToggle')) {\n            this.set('showDialPad', true);\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        if (this.get('showDialPad') && this.get('enableKeyboardInput')) {\n            next(this, this._focusFirstDialKey);\n        }\n    },\n\n    willDestroyElement() {\n        if (this._dtmfTimer) {\n            cancel(this._dtmfTimer);\n            this._dtmfTimer = null;\n        }\n        this._super(...arguments);\n    },\n\n    /**\n     * Default DTMF action: sends tones via `phone.dialDtmfNumber` when `sendDtmf`\n     * is true and `entityId`/`participantId` are set. Override via closure action\n     * in pre-dial contexts (e.g. appending digits to a number input).\n     *\n     * Mirrors legacy dial-pad.dialDtmfNumber — queues digits and debounces the API\n     * call so rapid keypresses are batched into a single request.\n     */\n    actionDigitPress(digit: string) {\n        if (!this.get('sendDtmf')) return;\n\n        const phone = this.get('phone') as { dtmf?: boolean; phoneDisabled?: boolean } | undefined;\n        if (!phone?.dtmf || phone?.phoneDisabled) return;\n\n        const entityId = this.get('entityId');\n        const participantId = this.get('participantId');\n        if (!entityId || !participantId) return;\n\n        const q = this.get('dtmfQueue') as string[];\n        q.push(digit);\n        this._scheduleDtmfFlush();\n    },\n\n    _focusFirstDialKey() {\n        const first = this.element.querySelector('.mode-dial-pad-digit') as HTMLElement | null;\n        if (!first) return;\n        first.focus();\n    },\n\n    _scheduleDtmfFlush() {\n        if (this._dtmfTimer) cancel(this._dtmfTimer);\n        this._dtmfTimer = debounce(this, this._flushDtmfQueue, DTMF_DEBOUNCE_MS);\n    },\n\n    _flushDtmfQueue() {\n        this._dtmfTimer = null;\n        if (this.get('isDestroyed') || this.get('isDestroying')) return;\n\n        const queued = this.get('dtmfQueue') as string[];\n        const digits = queued.join('');\n        this.set('dtmfQueue', []);\n\n        if (!digits) return;\n\n        const entityId = this.get('entityId');\n        const participantId = this.get('participantId');\n        if (!entityId || !participantId) return;\n\n        this.get('phone').dialDtmfNumber(entityId, participantId, digits);\n    },\n\n    _toggleDialPad() {\n        this.toggleProperty('showDialPad');\n        if (this.get('showDialPad') && this.get('enableKeyboardInput')) {\n            next(this, this._focusFirstDialKey);\n        }\n    },\n\n    _digitPress(digit: string) {\n        if (this.get('disabled')) return;\n        this.actionDigitPress(digit);\n\n        this._playDialTone();\n    },\n\n    /**\n     * Plays the local keypress tone ('softphone' sound) at the current call volume.\n     * Mirrors legacy dial-pad-number._triggerSound (PCUCC-89 parity).\n     */\n    _playDialTone() {\n        run(() => {\n            const callVolume = (this.get('phone') as any)?.callVolume ?? 100;\n            const volume = (callVolume * DTMF_VOLUME_PERCENTAGE) / 100;\n            this.get('sound').playSound('softphone', volume);\n        });\n    },\n\n    _getDialPadDigitHosts(): HTMLElement[] {\n        const nodes = this.element.querySelectorAll('.mode-dial-pad-digit');\n        return Array.prototype.slice.call(nodes) as HTMLElement[];\n    },\n\n    /**\n     * Resolves the dial key host (`gux-button`) for a key event; supports shadow-DOM internals via composedPath.\n     */\n    _dialPadHostFromKeyboardEvent(event: KeyboardEvent): HTMLElement | null {\n        const path = typeof event.composedPath === 'function' ? (event.composedPath() as EventTarget[]) : [];\n        for (let i = 0; i < path.length; i++) {\n            const node = path[i];\n            if (node instanceof HTMLElement && node.classList.contains('mode-dial-pad-digit')) {\n                return node;\n            }\n        }\n\n        const target = event.target;\n        if (target instanceof HTMLElement) {\n            return target.closest('.mode-dial-pad-digit') as HTMLElement | null;\n        }\n\n        return null;\n    },\n\n    _indexOfDialPadHost(host: HTMLElement | null): number {\n        if (!host) return -1;\n        return this._getDialPadDigitHosts().indexOf(host);\n    },\n\n    /**\n     * When focus is inside a shadow tree (e.g. `gux-button` internals), walk up to the dial key host.\n     */\n    _focusedDialPadHost(): HTMLElement | null {\n        let el: HTMLElement | null = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n        while (el) {\n            if (el.classList.contains('mode-dial-pad-digit')) return el;\n            const root = el.getRootNode();\n            if (root instanceof ShadowRoot && root.host instanceof HTMLElement) {\n                el = root.host;\n            } else {\n                return null;\n            }\n        }\n        return null;\n    },\n\n    _moveDialPadFocusByArrow(event: KeyboardEvent) {\n        const buttons = this._getDialPadDigitHosts();\n        if (!buttons.length) return;\n\n        const hostFromEvent = this._dialPadHostFromKeyboardEvent(event);\n        const hostFocused = this._focusedDialPadHost();\n        const host = hostFromEvent ?? hostFocused;\n        const index = host ? this._indexOfDialPadHost(host) : -1;\n\n        const key = event.key;\n        let nextIndex: number | null = null;\n\n        if (index < 0) {\n            if (key === 'ArrowDown' || key === 'ArrowRight') {\n                nextIndex = 0;\n            } else if (key === 'ArrowUp') {\n                nextIndex = 9;\n            } else if (key === 'ArrowLeft') {\n                nextIndex = 2;\n            }\n        } else {\n            if (key === 'ArrowLeft') {\n                nextIndex = index % DIALPAD_COLS === 0 ? index + DIALPAD_HORIZONTAL_WRAP : index - 1;\n            } else if (key === 'ArrowRight') {\n                nextIndex = index % DIALPAD_COLS === DIALPAD_COLS - 1 ? index - DIALPAD_HORIZONTAL_WRAP : index + 1;\n            } else if (key === 'ArrowUp') {\n                if (index < DIALPAD_COLS) {\n                    nextIndex = index + DIALPAD_VERTICAL_WRAP;\n                } else {\n                    nextIndex = index - DIALPAD_COLS;\n                }\n            } else if (key === 'ArrowDown') {\n                if (index > DIALPAD_KEY_COUNT - DIALPAD_COLS - 1) {\n                    nextIndex = index - DIALPAD_VERTICAL_WRAP;\n                } else {\n                    nextIndex = index + DIALPAD_COLS;\n                }\n            }\n        }\n\n        event.preventDefault();\n        if (nextIndex !== null && nextIndex >= 0 && nextIndex < buttons.length) {\n            const el = buttons[nextIndex];\n            if (el) el.focus();\n        }\n    },\n\n    _digitsKeydown(event: KeyboardEvent) {\n        if (this.get('disabled')) return;\n        if (!this.get('enableKeyboardInput')) return;\n\n        if (isDialPadArrowKey(event.key)) {\n            this._moveDialPadFocusByArrow(event);\n            return;\n        }\n\n        if (!this.get('isKeydownPrimed')) return;\n        if (!event.shiftKey) this.set('isKeydownPrimed', false);\n\n        const digit = digitFromKeyboardEvent(event);\n        if (digit !== null) {\n            this._digitPress(digit);\n        } else if (event.code && event.code.toLowerCase() === 'escape' && this.get('showToggle')) {\n            this._toggleDialPad();\n        }\n    },\n\n    _digitsKeyup() {\n        if (this.get('disabled')) return;\n        this.set('isKeydownPrimed', true);\n    },\n\n    actions: {\n        onToggleDialPad() {\n            this._toggleDialPad();\n        },\n\n        onDigitPress(digit: string) {\n            this._digitPress(digit);\n        },\n\n        onDigitsKeydown(event: KeyboardEvent) {\n            this._digitsKeydown(event);\n        },\n\n        onDigitsKeyup() {\n            this._digitsKeyup();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"dPZ41KyC\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[10,\\\"gux-button\\\"],[14,\\\"accent\\\",\\\"secondary\\\"],[14,0,\\\"mode-dial-pad-toggle\\\"],[15,\\\"onclick\\\",[28,[37,2],[[30,0],\\\"onToggleDialPad\\\"],null]],[12],[1,\\\"\\\\n\\\"],[41,[33,3],[[[1,\\\"            \\\"],[1,[28,[35,4],[\\\"purecloud.closeDialpad\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[1,[28,[35,4],[\\\"purecloud.openDialpad\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,3],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"mode-dial-pad-digits\\\"],[15,\\\"onkeydown\\\",[28,[37,2],[[30,0],\\\"onDigitsKeydown\\\"],null]],[15,\\\"onkeyup\\\",[28,[37,2],[[30,0],\\\"onDigitsKeyup\\\"],null]],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"mode-dial-pad-grid\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,6],[[28,[37,6],[[33,7]],null]],null],null,[[[1,\\\"                \\\"],[10,\\\"gux-button\\\"],[14,\\\"accent\\\",\\\"secondary\\\"],[14,0,\\\"mode-dial-pad-digit\\\"],[15,\\\"onclick\\\",[28,[37,2],[[30,0],\\\"onDigitPress\\\",[30,1,[\\\"digit\\\"]]],null]],[15,\\\"disabled\\\",[36,8]],[15,\\\"aria-label\\\",[52,[30,1,[\\\"subtitleTranslationKey\\\"]],[28,[37,9],[[30,1,[\\\"digit\\\"]],\\\" \\\",[28,[37,4],[[30,1,[\\\"subtitleTranslationKey\\\"]]],null]],null],[30,1,[\\\"digit\\\"]]]],[12],[1,\\\"\\\\n                    \\\"],[10,1],[14,0,\\\"mode-dial-pad-digit-inner\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,1],[14,0,\\\"mode-dial-pad-digit-main\\\"],[12],[1,[30,1,[\\\"digit\\\"]]],[13],[1,\\\"\\\\n\\\"],[41,[30,1,[\\\"subtitleTranslationKey\\\"]],[[[1,\\\"                            \\\"],[10,1],[14,0,\\\"mode-dial-pad-digit-sub\\\"],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,4],[[30,1,[\\\"subtitleTranslationKey\\\"]]],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"key\\\"],false,[\\\"if\\\",\\\"showToggle\\\",\\\"action\\\",\\\"showDialPad\\\",\\\"t\\\",\\\"each\\\",\\\"-track-array\\\",\\\"dialPadKeys\\\",\\\"disabled\\\",\\\"concat\\\"]]\",\"moduleName\":\"web-directory/components/mode-manager/mode-dial-pad/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport type { ModeRosterEmptyStateAction, ModeRosterEmptyStateVisual } from '../modes/base/mode';\n\n/**\n * Default layout for mode roster empty states: icon or image, title, description, and primary action.\n *\n * @attribute titleKey — intl key for the bold heading.\n * @attribute descriptionKey — intl key for secondary copy (smaller, not bold).\n * @attribute visual — `{ type: 'icon', iconName }` or `{ type: 'image', imageSrc, imageAltKey? }` (one of icon or image).\n * @attribute action — `{ labelKey, onAction }` for the centered button.\n */\nexport default Component.extend({\n    classNames: ['mode-roster-empty-state'] as const,\n\n    titleKey: '',\n\n    descriptionKey: '',\n\n    visual: null as ModeRosterEmptyStateVisual | null,\n\n    action: null as ModeRosterEmptyStateAction | null,\n\n    _primaryAction() {\n        this.get('action')?.onAction();\n    },\n\n    actions: {\n        onPrimaryAction() {\n            this._primaryAction();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"/d3u49UQ\",\"block\":\"[[[10,0],[14,0,\\\"mode-roster-empty-state-inner\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,1],[[[41,[28,[37,2],[[33,1,[\\\"type\\\"]],\\\"icon\\\"],null],[[[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"mode-roster-empty-state-visual\\\"],[15,\\\"icon-name\\\",[33,1,[\\\"icon\\\"]]],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,2],[[33,1,[\\\"type\\\"]],\\\"illustration\\\"],null],[[[1,\\\"            \\\"],[10,\\\"gux-illustration-beta\\\"],[15,\\\"variant\\\",[33,1,[\\\"variant\\\"]]],[14,0,\\\"mode-roster-empty-state-visual\\\"],[12],[13],[1,\\\"\\\\n        \\\"]],[]],null]],[]]]],[]],null],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"mode-roster-empty-state-content\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"h3\\\"],[14,0,\\\"mode-roster-empty-state-title\\\"],[12],[1,[28,[35,3],[[33,4]],null]],[13],[1,\\\"\\\\n        \\\"],[10,2],[14,0,\\\"mode-roster-empty-state-description\\\"],[12],[1,[28,[35,3],[[33,5]],null]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"mode-roster-empty-state-action\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,6],[[[1,\\\"            \\\"],[10,\\\"gux-button\\\"],[14,\\\"accent\\\",\\\"ghost\\\"],[15,\\\"onclick\\\",[28,[37,6],[[30,0],\\\"onPrimaryAction\\\"],null]],[15,\\\"disabled\\\",[33,6,[\\\"disabled\\\"]]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,3],[[33,6,[\\\"labelKey\\\"]]],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"if\\\",\\\"visual\\\",\\\"eq\\\",\\\"t\\\",\\\"titleKey\\\",\\\"descriptionKey\\\",\\\"action\\\"]]\",\"moduleName\":\"web-directory/components/mode-manager/mode-roster-empty-state/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { not } from '@ember/object/computed';\nimport { warnClosureAction } from 'web-directory/utils/acd-ts';\n\n/**\n * Slide-out panel docked to the right edge of the mode roster column.\n * Same width as `--mode-manager-roster-width`. Yield inset body; parent chooses which view to render.\n */\nexport default Component.extend({\n    classNames: ['mode-manager-roster-side-panel'] as const,\n    classNameBindings: ['isOpen:mode-manager-roster-side-panel--open'],\n    attributeBindings: ['ariaHidden:aria-hidden'],\n\n    /**\n     * When true, the panel is slid out to the right of the roster column.\n     */\n    isOpen: false,\n    ariaHidden: not('isOpen'),\n\n    /**\n     * @action\n     * Called when the user dismisses the panel (e.g. close control).\n     */\n    actionClose: () => warnClosureAction('actionClose'),\n\n    actions: {\n        onClose() {\n            this.actionClose();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"zD98fqOa\",\"block\":\"[[[10,\\\"gux-button\\\"],[14,\\\"accent\\\",\\\"ghost\\\"],[14,0,\\\"mode-manager-roster-side-panel-close-button\\\"],[15,\\\"onclick\\\",[28,[37,0],[[30,0],\\\"onClose\\\"],null]],[14,4,\\\"icon\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"close\\\"],[14,0,\\\"close-icon\\\"],[15,\\\"screenreader-text\\\",[28,[37,1],[\\\"common.close\\\"],null]],[12],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[18,1,null]],[\\\"&default\\\"],false,[\\\"action\\\",\\\"t\\\",\\\"yield\\\"]]\",\"moduleName\":\"web-directory/components/mode-manager/mode-roster-side-panel/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { cancel, debounce } from '@ember/runloop';\nimport { Maybe } from 'web-directory/types';\nimport { warnClosureAction } from 'web-directory/utils/acd-ts';\nimport {\n    DEFAULT_MODE_FILTER_PANEL_COMPONENT,\n    DEFAULT_MODE_SORT_OPTIONS,\n    type ModeAction,\n    type ModeRosterEmptyStatesResolved,\n    type ModeFilterConfig,\n    type ModeRosterGroup,\n    type ModeSearchConfig,\n    type ModeSortConfig\n} from '../modes';\nimport { computed } from '@ember/object';\n\nconst MODE_ROSTER_SEARCH_DEBOUNCE_MS = 250;\n\nexport default Component.extend({\n    classNames: ['mode-roster'] as const,\n\n    /**\n     * @attribute\n     * Stable id (e.g. mode id) so roster resets sort to the mode default when context changes.\n     */\n    rosterContextKey: null as Maybe<string>,\n\n    /**\n     * @attribute\n     * the raw string value of what the header in the roster should be.\n     */\n    header: null as Maybe<string>,\n\n    /**\n     * @attribute\n     * the placeholder text for the search field in the roster.\n     */\n    searchPlaceholder: null as Maybe<string>,\n\n    /**\n     * @attribute\n     * the actions that should be rendered in the roster header.\n     */\n    headerActions: [] as ModeAction[],\n\n    /**\n     * @attribute\n     * Search field configuration (`enabled: false` hides the field).\n     * Default config comes from Base Mode component\n     */\n    searchConfig: { enabled: false } as ModeSearchConfig,\n\n    /**\n     * @attribute\n     * Filter control configuration (`enabled: false` hides the button).\n     */\n    filterConfig: {\n        enabled: true,\n        panelComponent: DEFAULT_MODE_FILTER_PANEL_COMPONENT\n    } as ModeFilterConfig,\n\n    /**\n     * @attribute\n     * Sort dropdown configuration (`enabled: false` hides the row; use `options` / `defaultSortOrder` when enabled).\n     */\n    sortConfig: {\n        enabled: true,\n        options: DEFAULT_MODE_SORT_OPTIONS,\n        defaultSortOrder: DEFAULT_MODE_SORT_OPTIONS[0].value\n    } as ModeSortConfig,\n\n    /**\n     * @attribute\n     * Bound to the active mode's roster search string.\n     */\n    searchQuery: '',\n\n    /**\n     * Local value for the search field so typing stays responsive while commits to the parent are debounced.\n     */\n    displaySearchQuery: '',\n\n    /**\n     * @attribute\n     * Bound to the active mode's sort value.\n     */\n    sortOrder: DEFAULT_MODE_SORT_OPTIONS[0].value,\n\n    /**\n     * @attribute\n     * Items after mode search/filter (`visibleItems`).\n     */\n    visibleItems: [] as any[],\n\n    /**\n     * @attribute\n     * Flat list of alerting groups across all modes, each tagged with the mode that owns them.\n     * Rendered in a pinned section between the header buttons and the search/sort UI.\n     * Each entry carries its own `alertingMode` so cards bind to the correct mode's actions\n     * regardless of which mode tab is currently selected.\n     */\n    resolvedAlertingGroups: [] as { group: ModeRosterGroup; alertingMode: any }[],\n\n    /**\n     * @attribute\n     * Mode `loading` — used to avoid flashing empty states before first load.\n     */\n    modeLoading: false,\n\n    /**\n     * @attribute\n     * True when the bootstrap fetch returned items but none have landed in the roster yet.\n     * Distinct from `modeLoading`, which covers the API fetch phase:\n     *   modeLoading = true                                  → API request in progress\n     *   modeLoading = false, isRosterItemPending = true     → fetch done, chains processing, waiting for first item to land\n     *   modeLoading = false, isRosterItemPending = false    → roster ready (empty or populated)\n     */\n    isRosterItemPending: false,\n\n    /**\n     * @attribute\n     * Mode `fetchDataError` — fetch pipeline failed.\n     */\n    fetchDataError: false,\n\n    /**\n     * @attribute\n     * Mode `isFilterActive` — search or filters applied.\n     */\n    isFilterActive: false,\n\n    /**\n     * @attribute\n     * Resolved empty-state config from the active mode (`resolvedRosterEmptyStates`: `initial` / `noResults` / `error`).\n     */\n    rosterEmptyStates: null as ModeRosterEmptyStatesResolved | null,\n\n    /**\n     * @attribute\n     * How many roster items the mode's filters are hiding. Drives the \"hidden by filters\" banner;\n     * `0` hides it entirely, which is the default for modes that don't opt in.\n     */\n    hiddenByFilterCount: 0,\n\n    /**\n     * True when the banner should render: items are hidden, and at least one is still visible so the\n     * `noResults` empty state isn't already explaining the same thing.\n     */\n    isShowingHiddenByFilterBanner: computed(\n        'hiddenByFilterCount',\n        'isRosterShowingList',\n        function (this: any): boolean {\n            return this.get('hiddenByFilterCount') > 0 && this.get('isRosterShowingList');\n        }\n    ),\n\n    /**\n     * @action\n     * Closure action invoked by the banner's \"Show all\" to clear the mode's filters.\n     */\n    actionShowAllHiddenItems: (): void => warnClosureAction('actionShowAllHiddenItems'),\n\n    isRosterShowingLoading: computed(\n        'modeLoading',\n        'isRosterItemPending',\n        'visibleItems.[]',\n        function (this: any): boolean {\n            return (\n                (Boolean(this.get('modeLoading')) || Boolean(this.get('isRosterItemPending'))) &&\n                (this.get('visibleItems') || []).length === 0\n            );\n        }\n    ),\n\n    isRosterShowingList: computed('visibleItems.[]', function (this: any): boolean {\n        return (this.get('visibleItems') || []).length > 0;\n    }),\n\n    rosterEmptyStateKey: computed('fetchDataError', 'isFilterActive', function (this: any): string {\n        if (this.get('fetchDataError')) return 'error';\n        if (this.get('isFilterActive')) return 'noResults';\n        return 'initial';\n    }),\n\n    rosterActiveEmptyState: computed('rosterEmptyStates', 'rosterEmptyStateKey', function (this: any) {\n        const states = this.get('rosterEmptyStates') as ModeRosterEmptyStatesResolved | null;\n        const key = this.get('rosterEmptyStateKey') as string;\n        if (!states) return null;\n        return (states as Record<string, unknown>)[key] ?? null;\n    }),\n\n    hasScrollDepth: false,\n\n    _modeRosterScrollEl: null as Maybe<HTMLElement>,\n    _modeRosterScrollCleanup: null as Maybe<() => void>,\n\n    _lastKnownExternalSearchQuery: '',\n    _lastRosterContextKey: null as Maybe<string>,\n    _searchDebounceTimer: null as Maybe<ReturnType<typeof debounce>>,\n\n    init() {\n        this._super(...arguments);\n        this._lastRosterContextKey = this.get('rosterContextKey');\n        const q = this.get('searchQuery') ?? '';\n        this._lastKnownExternalSearchQuery = q;\n        this.set('displaySearchQuery', q);\n    },\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n        const contextKey = this.get('rosterContextKey');\n        const contextChanged = contextKey !== this._lastRosterContextKey;\n        if (contextChanged) {\n            this._lastRosterContextKey = contextKey;\n        }\n\n        const external = this.get('searchQuery') ?? '';\n        const externalChanged = external !== this._lastKnownExternalSearchQuery;\n\n        if (contextChanged || externalChanged) {\n            this._lastKnownExternalSearchQuery = external;\n            this.set('displaySearchQuery', external);\n            this._cancelPendingSearchDebounce();\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this._ensureScrollListenerAttached();\n    },\n\n    didRender() {\n        this._super(...arguments);\n        this._ensureScrollListenerAttached();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n\n        this._cancelPendingSearchDebounce();\n\n        const cleanup = this._modeRosterScrollCleanup;\n        if (cleanup) cleanup();\n        this._modeRosterScrollCleanup = null;\n        this._modeRosterScrollEl = null;\n    },\n\n    _cancelPendingSearchDebounce() {\n        const t = this._searchDebounceTimer;\n        if (t) {\n            cancel(t);\n            this._searchDebounceTimer = null;\n        }\n    },\n\n    /**\n     * Invoked after MODE_ROSTER_SEARCH_DEBOUNCE_MS of quiet input; forwards the query to the parent.\n     */\n    _flushSearchQueryToParent(value: string) {\n        this._searchDebounceTimer = null;\n        this.actionSearchQueryChange(value);\n    },\n\n    /**\n     * @action\n     * Invoked when the user activates the filter control in the roster header.\n     */\n    actionFilter: () => warnClosureAction('actionFilter'),\n\n    /**\n     * @action\n     * Called when the search field value changes (set from mode-manager).\n     */\n    actionSearchQueryChange: (value: string) => warnClosureAction('actionSearchQueryChange', { value }),\n\n    /**\n     * @action\n     * Called when the user selects a new sort order (set from mode-manager).\n     */\n    actionSortOrderChange: (value: string) => warnClosureAction('actionSortOrderChange', { value }),\n\n    _teardownScrollListener() {\n        const cleanup = this._modeRosterScrollCleanup;\n        if (cleanup) cleanup();\n        this._modeRosterScrollCleanup = null;\n        this._modeRosterScrollEl = null;\n    },\n\n    _ensureScrollListenerAttached() {\n        const scrollEl = this.element?.querySelector('.mode-roster-scroll') as HTMLElement | null;\n        if (!scrollEl) return;\n\n        if (this._modeRosterScrollEl === scrollEl) return;\n\n        this._teardownScrollListener();\n\n        const syncScrollDepth = () => {\n            if (this.get('isDestroyed') || this.get('isDestroying')) return;\n\n            const hasDepth = scrollEl.scrollTop > 0;\n            if (hasDepth !== this.get('hasScrollDepth')) {\n                this.set('hasScrollDepth', hasDepth);\n            }\n        };\n\n        scrollEl.addEventListener('scroll', syncScrollDepth, { passive: true });\n        this._modeRosterScrollCleanup = () => {\n            scrollEl.removeEventListener('scroll', syncScrollDepth);\n        };\n\n        this._modeRosterScrollEl = scrollEl;\n        syncScrollDepth();\n    },\n\n    _scrollToTop() {\n        const el = this._modeRosterScrollEl;\n        if (!el) return;\n        el.scrollTo({ top: 0, behavior: 'smooth' });\n    },\n\n    _handleHeaderAction(action: ModeAction) {\n        if (!action.onAction) {\n            console.warn('No action handler provided for header action', action);\n            return;\n        }\n\n        action.onAction();\n    },\n\n    _searchInput(value: string) {\n        this.set('displaySearchQuery', value);\n        this._searchDebounceTimer = debounce(\n            this,\n            this._flushSearchQueryToParent,\n            value,\n            MODE_ROSTER_SEARCH_DEBOUNCE_MS\n        );\n    },\n\n    actions: {\n        onFilter() {\n            this.actionFilter();\n        },\n\n        onHeaderAction(action: ModeAction) {\n            this._handleHeaderAction(action);\n        },\n\n        onScrollContentsToTop() {\n            this._scrollToTop();\n        },\n\n        onSearchInput(ev: Event) {\n            const target = ev.target as HTMLInputElement | null;\n            this._searchInput(target?.value ?? '');\n        },\n\n        onShowAllHiddenItems() {\n            this.actionShowAllHiddenItems();\n        },\n\n        onSortOrderChangeEvent(event: Event) {\n            const target = event.target as HTMLSelectElement | null;\n            this.actionSortOrderChange(target?.value ?? '');\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"CTSeUzIj\",\"block\":\"[[[10,0],[14,0,\\\"mode-roster-scroll\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[15,0,[29,[\\\"mode-roster-sticky-header \\\",[52,[33,1],\\\"mode-roster-sticky-header--raised\\\"]]]],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"mode-roster-header\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"mode-roster-header-start\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"h2\\\"],[12],[1,[34,2]],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,0],[14,0,\\\"mode-roster-header-buttons\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,4],[[28,[37,4],[[33,5]],null]],null],\\\"id\\\",[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"mode-roster-header-button\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-button\\\"],[15,1,[29,[\\\"mode-roster-header-button-\\\",[30,1,[\\\"id\\\"]]]]],[15,\\\"disabled\\\",[30,1,[\\\"disabled\\\"]]],[15,\\\"onclick\\\",[28,[37,6],[[30,0],\\\"onHeaderAction\\\",[30,1]],null]],[14,4,\\\"icon\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,\\\"gux-icon\\\"],[15,\\\"icon-name\\\",[30,1,[\\\"icon\\\"]]],[14,\\\"decorative\\\",\\\"true\\\"],[15,\\\"screenreader-text\\\",[52,[30,1,[\\\"tooltip\\\"]],[28,[37,7],[[30,1,[\\\"tooltip\\\"]]],null]]],[12],[13],[1,\\\"\\\\n\\\\n                            \\\"],[10,\\\"gux-tooltip\\\"],[15,1,[29,[\\\"mode-roster-header-button-\\\",[30,1,[\\\"id\\\"]],\\\"-tooltip\\\"]]],[15,\\\"for\\\",[29,[\\\"mode-roster-header-button-\\\",[30,1,[\\\"id\\\"]]]]],[14,\\\"placement\\\",\\\"bottom\\\"],[12],[1,\\\"\\\\n                                \\\"],[1,[52,[30,1,[\\\"tooltip\\\"]],[28,[37,7],[[30,1,[\\\"tooltip\\\"]]],null]]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[30,1,[\\\"badge\\\"]],[[[1,\\\"                            \\\"],[10,1],[14,0,\\\"mode-roster-header-button-badge\\\"],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,\\\"\\\\n                                \\\"],[1,[30,1,[\\\"badge\\\"]]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,8,[\\\"length\\\"]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"mode-roster-alerting\\\"],[14,\\\"role\\\",\\\"region\\\"],[15,\\\"aria-label\\\",[28,[37,7],[\\\"modeRoster.alerting.a11y\\\"],null]],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,4],[[28,[37,4],[[33,8]],null]],null],\\\"group.id\\\",[[[1,\\\"                    \\\"],[46,[28,[37,10],[[30,2,[\\\"group\\\",\\\"rosterCardComponent\\\"]],\\\"mode-manager/roster-cards/interaction-group\\\"],null],null,[[\\\"item\\\",\\\"alertingMode\\\"],[[30,2,[\\\"group\\\"]],[30,2,[\\\"alertingMode\\\"]]]],null],[1,\\\"\\\\n\\\"]],[2]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,11,[\\\"enabled\\\"]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"mode-roster-search-row\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-form-field-search\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[14,0,\\\"sr-only\\\"],[14,\\\"for\\\",\\\"mode-roster-search-field\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,7],[\\\"search.search\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"input\\\"],[14,1,\\\"mode-roster-search-field\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,\\\"placeholder\\\",[36,12]],[14,\\\"autocomplete\\\",\\\"off\\\"],[15,2,[36,13]],[15,\\\"oninput\\\",[28,[37,6],[[30,0],\\\"onSearchInput\\\"],null]],[14,4,\\\"search\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,14],[[[1,\\\"            \\\"],[10,\\\"gux-actionable-inline-alert-beta\\\"],[14,0,\\\"mode-roster-hidden-by-filter\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,\\\"slot\\\",\\\"content\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-truncate\\\"],[14,\\\"max-lines\\\",\\\"1\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,7],[\\\"modeRoster.hiddenByFilter.message\\\"],[[\\\"count\\\"],[[33,15]]]]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\\n                \\\"],[10,0],[14,\\\"slot\\\",\\\"action-buttons\\\"],[14,0,\\\"mode-roster-hidden-by-filter-actions\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-button\\\"],[14,0,\\\"mode-roster-hidden-by-filter-action\\\"],[14,\\\"accent\\\",\\\"ghost\\\"],[15,\\\"onclick\\\",[28,[37,6],[[30,0],\\\"onShowAllHiddenItems\\\"],null]],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,7],[\\\"modeRoster.hiddenByFilter.showAll\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,16,[\\\"enabled\\\"]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"mode-roster-sort-row\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"mode-roster-sort-dropdown-shell\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"label\\\"],[14,0,\\\"sr-only mode-roster-sort-by-label\\\"],[14,\\\"for\\\",\\\"mode-roster-sort-dropdown\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,7],[\\\"modeRoster.sort.sortBy\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\\n                    \\\"],[10,\\\"gux-inline-dropdown-beta\\\"],[14,1,\\\"mode-roster-sort-dropdown\\\"],[14,0,\\\"mode-roster-sort-dropdown\\\"],[15,2,[36,17]],[15,\\\"onchange\\\",[28,[37,6],[[30,0],\\\"onSortOrderChangeEvent\\\"],null]],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-listbox\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,4],[[28,[37,4],[[33,16,[\\\"options\\\"]]],null]],null],null,[[[1,\\\"                                \\\"],[10,\\\"gux-option\\\"],[15,2,[30,3,[\\\"value\\\"]]],[15,\\\"selected\\\",[52,[28,[37,18],[[33,17],[30,3,[\\\"value\\\"]]],null],\\\"true\\\"]],[12],[1,\\\"\\\\n                                    \\\"],[1,[28,[35,7],[[30,3,[\\\"translationKey\\\"]]],null]],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n\\\"]],[3]],null],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"mode-roster-sort-dropdown-divider\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"mode-roster-content\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,19],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"mode-roster-loading\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-page-loading-spinner\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,20],[[[42,[28,[37,4],[[28,[37,4],[[33,21]],null]],null],\\\"id\\\",[[[1,\\\"                \\\"],[46,[28,[37,10],[[30,4,[\\\"rosterCardComponent\\\"]],[33,22]],null],null,[[\\\"item\\\"],[[30,4]]],null],[1,\\\"\\\\n\\\"]],[4]],null]],[]],[[[41,[33,23],[[[1,\\\"            \\\"],[1,[28,[35,24],null,[[\\\"titleKey\\\",\\\"descriptionKey\\\",\\\"visual\\\",\\\"action\\\"],[[33,23,[\\\"titleKey\\\"]],[33,23,[\\\"descriptionKey\\\"]],[33,23,[\\\"visual\\\"]],[33,23,[\\\"action\\\"]]]]]],[1,\\\"\\\\n        \\\"]],[]],null]],[]]]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,1],[[[1,\\\"    \\\"],[10,\\\"gux-button\\\"],[14,0,\\\"mode-roster-scroll-top\\\"],[14,\\\"accent\\\",\\\"secondary\\\"],[15,\\\"onclick\\\",[28,[37,6],[[30,0],\\\"onScrollContentsToTop\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"arrow-up\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[14,\\\"size\\\",\\\"small\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[1,[28,[35,7],[\\\"modeRoster.scrollTop\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"headerAction\\\",\\\"entry\\\",\\\"option\\\",\\\"item\\\"],false,[\\\"if\\\",\\\"hasScrollDepth\\\",\\\"header\\\",\\\"each\\\",\\\"-track-array\\\",\\\"headerActions\\\",\\\"action\\\",\\\"t\\\",\\\"resolvedAlertingGroups\\\",\\\"component\\\",\\\"or\\\",\\\"searchConfig\\\",\\\"searchPlaceholder\\\",\\\"displaySearchQuery\\\",\\\"isShowingHiddenByFilterBanner\\\",\\\"hiddenByFilterCount\\\",\\\"sortConfig\\\",\\\"sortOrder\\\",\\\"eq\\\",\\\"isRosterShowingLoading\\\",\\\"isRosterShowingList\\\",\\\"visibleItems\\\",\\\"rosterCardComponent\\\",\\\"rosterActiveEmptyState\\\",\\\"mode-manager/mode-roster-empty-state\\\"]]\",\"moduleName\":\"web-directory/components/mode-manager/mode-roster/template.hbs\",\"isStrictMode\":false});","import { A } from '@ember/array';\nimport { computed, get } from '@ember/object';\nimport { readOnly } from '@ember/object/computed';\nimport { inject } from '@ember/service';\nimport type { CommunicationType, WorkitemInteraction } from '@genesys/genesys-cloud-conversation-utils';\nimport type { RosterSelectedItem } from 'web-directory/services/modes/roster-selection-service';\nimport type { Conversation, Maybe } from 'web-directory/types';\nimport { singularizeMediaType } from 'web-directory/utils/acd-ts';\nimport type { AppContext } from 'web-directory/utils/apps';\nimport { fetchParticipantName, fetchQueueName, getRawParticipantName } from 'web-directory/utils/participant-name';\nimport {\n    ModeModelFactory,\n    SubscriptionEvent,\n    SubscriptionTopic,\n    allItemsMapToValuesArray,\n    getModeFilterPanelKey,\n    type ModeItemsMap,\n    type ModeRosterGroup,\n    type ModeSearchAndFilterOptions\n} from './base';\nimport {\n    buildAlertingGroups,\n    countActiveFilterCategories,\n    findCallsToHoldOnSelect,\n    getExternalContactId,\n    isItemAlerting,\n    isWorkitem,\n    matchesActiveModeFilters,\n    plainString,\n    type ActiveModeFilterState\n} from './utils';\n\nexport { findCallsToHoldOnSelect, findUnheldConnectedCalls } from './utils';\n\nconst OUTBOUND_PANEL_COMPONENT = 'mode-manager/roster-side-panels/outbound-panel';\nconst SETTINGS_PANEL_COMPONENT = 'mode-manager/roster-side-panels/settings-panel';\nconst FILTER_PANEL_COMPONENT = 'mode-manager/roster-side-panels/active-mode-filter-panel';\n\nexport default ModeModelFactory.extend({\n    id: 'active',\n    icon: 'agent',\n    fetchDataSchedule: 'boot',\n    fetchFnPopulatesAllItemsDirectly: true,\n    rosterCardComponent: 'mode-manager/roster-cards/interaction-group',\n    showSidebarItemCountBadge: true,\n    hasInterapptions: true,\n\n    // --- Service injections ---\n    rosterSidePanelService: inject('modes/roster-side-panel-service'),\n    conversationModeService: inject('modes/conversation-mode-service'),\n    workitemModeService: inject('modes/workitem-mode-service'),\n    communicationService: inject('communication'),\n    phoneService: inject('phone'),\n    taskManagementService: inject('task-management'),\n    sessionService: inject('session'),\n    externalContactsService: inject('external-contacts'),\n    permissionsService: inject('permissions'),\n    ajaxService: inject('ajax'),\n    intlService: inject('intl'),\n    webrtcService: inject('webrtc'),\n    loggerService: inject('stash-logger'),\n    notificationService: inject('notification'),\n    queueService: inject('queue'),\n    queueToggleService: inject('queueToggle'),\n    storeService: inject('store'),\n\n    // --- Feature toggles ---\n    acdExternalContactDivNameFT: readOnly('sessionService.features.PURE-3835'),\n    acdExternalContactWorkitemsDivNameFT: readOnly('sessionService.features.PURE-6191'),\n    acdAnnounceMonitoring: readOnly('sessionService.features.acdAnnounceMonitoring'),\n    acdAnnounceMonitoringDigital: readOnly('sessionService.features.acdAnnounceMonitoringDigital'),\n    acdDisconnectedConversationIconsFT: readOnly('sessionService.features.PURE-6472_Disconnected_Conversation_Icons'),\n    acdFacebookIconUpdateFT: readOnly('sessionService.features.AI-1025'),\n    acdTwitterXIconUpdateFT: readOnly('sessionService.features.PURE-5797_MESSAGING_TWITTER_PRIVATE_DIRECT_MESSAGES'),\n    acdEngagementSourcesFT: readOnly('sessionService.features.PURE-5534_OpenMessagingEngagementSourceTagging'),\n    inactivityTimeoutFT: readOnly('sessionService.features.PURE-5268_digital_messaging_inactivity_handling'),\n    useNewNav: readOnly('sessionService.useNewNav'),\n\n    // --- Permissions ---\n    permissions: computed(\n        'permissionsService.{canEmailOnBehalfOfQueue,canSendMessageOnBehalfOfQueue,phoneEnabled,hasExternalContactsViewContactAccess,canViewQueue,canViewCustomerIntents}',\n        function (this: any): Record<string, boolean> {\n            const p = this.get('permissionsService');\n            return {\n                canCreateEmail: p.get('canEmailOnBehalfOfQueue'),\n                canSendMessage: p.get('canSendMessageOnBehalfOfQueue'),\n                canMakeCall: p.get('phoneEnabled'),\n                canViewExternalContacts: p.get('hasExternalContactsViewContactAccess'),\n                canViewQueue: p.get('canViewQueue'),\n                canViewCustomerIntents: p.get('canViewCustomerIntents')\n            };\n        }\n    ),\n\n    // --- Interaction state ---\n\n    externalContacts: readOnly('externalContactsService.contacts'),\n    isTypingInteractions: null as Maybe<string[]>,\n    draftUpdateHash: null as Maybe<any>,\n\n    enableOutboundContact: computed('permissions', function (this: any): boolean {\n        const permissions = this.get('permissions');\n        if (!permissions?.canViewExternalContacts) {\n            return false;\n        }\n\n        return !!(permissions?.canMakeCall || permissions?.canCreateEmail || permissions?.canSendMessage);\n    }),\n\n    // --- Main-stage adapter: these feed acd-interactions-panel-v2/interaction via mode-manager/template.hbs ---\n\n    activeInteractions: computed('allItems', function (this: any): any[] {\n        return allItemsMapToValuesArray(this.get('allItems')).filter((item: any) => !isWorkitem(item));\n    }),\n\n    activeWorkitems: computed('allItems', function (this: any): any[] {\n        return allItemsMapToValuesArray(this.get('allItems')).filter((item: any) => isWorkitem(item));\n    }),\n\n    selectedInteraction: computed('rosterSelectionService.selection', 'id', function (this: any): Maybe<any> {\n        const selection = this.get('rosterSelectionService.selection');\n        if (selection?.modeId !== this.get('id')) return null;\n        const payload = selection?.payload;\n        return payload && !isWorkitem(payload) ? payload : null;\n    }),\n\n    selectedWorkitem: computed('rosterSelectionService.selection', 'id', function (this: any): Maybe<any> {\n        const selection = this.get('rosterSelectionService.selection');\n        if (selection?.modeId !== this.get('id')) return null;\n        const payload = selection?.payload;\n        return payload && isWorkitem(payload) ? payload : null;\n    }),\n\n    useCommunicationACW: readOnly('selectedInteraction.useCommunicationACW'),\n\n    /**\n     * Array of interactionIds whose answer/decline buttons should be hidden.\n     * Mirrors legacy acd-interactions-panel-v2.hideInteractionButtons:\n     * - Alerting calls needing a WebRTC session (no pending session yet)\n     * - Interactions already accepted by this client\n     * - Interactions queued for auto-answer\n     */\n    hideInteractionButtons: computed(\n        'allItems',\n        'conversationModeService.{phoneService,webrtcSdkService}',\n        function (this: any): string[] {\n            const allItems = this.get('allItems') as Map<string, any>;\n            if (!allItems || allItems.size === 0) return [];\n\n            const cms = this.get('conversationModeService');\n            const phoneService = cms?.get('phoneService');\n            const webrtcSdkService = cms?.get('webrtcSdkService');\n\n            if (!phoneService || !webrtcSdkService) return [];\n\n            const isWebrtcStation = phoneService.get('station.isWebrtc');\n            const persistentConnectionActive = phoneService.get('persistentConnectionActive');\n            const hasPersistentConnection = phoneService.get('station.persistentConnection');\n            const useSdk = webrtcSdkService.get('useSdk');\n\n            const result: string[] = [];\n\n            allItems.forEach((interaction: any) => {\n                const id: string = get(interaction, 'id');\n                if (!id) return;\n\n                // Condition 1: accepted by client\n                const acceptedByClient: boolean = get(interaction, 'acceptedByClient');\n                if (acceptedByClient) {\n                    result.push(id);\n                    return;\n                }\n\n                // Condition 2: alerting call needing WebRTC session\n                const isCall: boolean = get(interaction, 'isCall');\n                const isAlerting: boolean = get(interaction, 'isAlerting');\n\n                if (isCall && isAlerting && isWebrtcStation) {\n                    if (!persistentConnectionActive && !hasPersistentConnection) {\n                        const pendingSessions = useSdk\n                            ? webrtcSdkService.get('pendingSessions') || []\n                            : cms.get('webrtcSdkService.pendingSessions') || [];\n\n                        const hasPendingSession = useSdk\n                            ? pendingSessions.findBy('conversationId', id)\n                            : pendingSessions.findBy('callInfo.conversationId', id);\n\n                        if (!hasPendingSession) {\n                            result.push(id);\n                            return;\n                        }\n                    }\n                }\n\n                // Condition 3: queued for auto-answer\n                if (isCall && isAlerting) {\n                    const autoAnswerCalls = useSdk\n                        ? webrtcSdkService.get('_inboundAcdCallsToAutoAnswer') || []\n                        : this.get('webrtcService.inboundAcdCallsToAutoAnswer') || [];\n                    const shouldAutoAnswer = autoAnswerCalls.findBy('id', id);\n                    if (shouldAutoAnswer) {\n                        result.push(id);\n                    }\n                }\n            });\n\n            return result;\n        }\n    ),\n\n    /**\n     * Roster header actions. Recomputed when filterState changes so the filter badge stays in sync.\n     */\n    headerActions: computed('filterState', function (this: any) {\n        return this._buildHeaderActions();\n    }),\n\n    /**\n     * Cache for default queue lookups. Keyed by media type to avoid redundant\n     * `/api/v2/routing/queues/me` calls when multiple outbound-contact components\n     * mount simultaneously.\n     */\n    _defaultQueueCache: null as Record<string, Promise<any>> | null,\n\n    /**\n     * Cache for queue record fetches. Keyed by queueId to avoid redundant\n     * `/api/v2/routing/queues/{id}` calls across outbound-contact instances.\n     */\n    _queueFetchCache: null as Record<string, Promise<any>> | null,\n\n    /**\n     * For pivot outbound functionality, called from the roster card's\n     * interaction-outbound-contact component when an agent clicks a phone number outbound option.\n     * Mirrors legacy acd-interactions-panel-v2 actionCreateCall.\n     *\n     * requestInteractionSelection is called with the returned conversation id so the new call is\n     * auto-selected when it first lands on the roster (via the call chain's selectRequestedInteraction\n     * step), matching the behavior of createMessage and createEmail.\n     *\n     * @param selection - OutboundPhoneData from interaction-outbound-contact: { e164, id, queue, ... }\n     */\n    async createCall(selection: any) {\n        const number = get(selection, 'e164');\n        const contactId = get(selection, 'id');\n        const queue = get(selection, 'queue');\n\n        const response = await this.get('phoneService').makeCall(number, null, queue, contactId);\n        this.get('conversationModeService').requestInteractionSelection(response?.id);\n        return response;\n    },\n\n    /**\n     * For pivot outbound functionality, called from the roster card's\n     * interaction-outbound-contact component when an agent clicks an SMS outbound option.\n     *\n     * useExistingConversation=true mirrors legacy actionCreateMessage: this entry point is for\n     * outbound from an existing conversation group (join existing if one exists), unlike the\n     * outbound panel which creates fresh conversations.\n     *\n     * @param selection - OutboundPhoneData from interaction-outbound-contact: { e164, id, queue, entityType, ... }\n     */\n    async createMessage(selection: any) {\n        const options = {\n            queueId: selection.queue.id,\n            entity: {\n                id: get(selection, 'id'),\n                value: get(selection, 'e164'),\n                entity: { type: get(selection, 'entityType') }\n            },\n            toAddressMessengerType: 'sms'\n        };\n\n        const response = await this.get('communicationService').createMessage(options, true);\n        this.get('conversationModeService').requestInteractionSelection(response?.id);\n        return response;\n    },\n\n    /**\n     * For pivot outbound functionality, called from the roster card's\n     * interaction-outbound-contact component when an agent clicks an email outbound option.\n     * Mirrors legacy acd-interactions-panel-v2 actionCreateEmail.\n     *\n     * @param selection - OutboundEmailData from interaction-outbound-contact: { email, id, queue, ... }\n     */\n    async createEmail(selection: any) {\n        const email = get(selection, 'email');\n        const contactId = get(selection, 'id');\n        const queue = get(selection, 'queue');\n\n        const response = await this.get('communicationService').createEmail(queue.id, email, contactId);\n        this.get('conversationModeService').requestInteractionSelection(response?.id);\n        return response;\n    },\n\n    fetchDefaultQueue(type: CommunicationType): any {\n        if (!this._defaultQueueCache) {\n            this.set('_defaultQueueCache', {});\n        }\n        const cache = this._defaultQueueCache!;\n        if (!cache[type]) {\n            const singularType = singularizeMediaType(type);\n            cache[type] = this.get('queueService').getDefaultQueue(singularType);\n        }\n        return cache[type];\n    },\n\n    fetchQueue(queueId: string, options: any = {}): any {\n        if (!queueId) {\n            return this.get('storeService').findRecord('queue', queueId, options);\n        }\n        if (!this._queueFetchCache) {\n            this.set('_queueFetchCache', {});\n        }\n        const cache = this._queueFetchCache!;\n        if (!cache[queueId]) {\n            cache[queueId] = this.get('storeService').findRecord('queue', queueId, options);\n        }\n        return cache[queueId];\n    },\n\n    /**\n     * Forwards canned response chat text to the state service.\n     */\n    insertChatText(this: any, text: string): void {\n        this.get('interapptionsStateService').set('cannedResponseChatText', text);\n    },\n\n    /**\n     * Forwards canned response SMS text to the state service.\n     */\n    insertSmsText(this: any, response: { strippedText?: string; structuredMessage?: string }): void {\n        this.get('interapptionsStateService').set('cannedResponseSmsText', response.strippedText || null);\n        this.get('interapptionsStateService').set('structuredMessage', response.structuredMessage || null);\n    },\n\n    /**\n     * Forwards canned response email text to the state service.\n     */\n    insertEmailText(this: any, text: string): void {\n        this.get('interapptionsStateService').set('cannedResponseEmailText', text);\n    },\n\n    displayError(messageKey: string, messageKeyOptions?: Record<string, any>) {\n        const message = this.get('intlService').t(messageKey, messageKeyOptions);\n        this.get('notificationService').error(null, message, {});\n    },\n\n    /**\n     * Conversation interactions and workitems share one action; the item type is resolved here and the type-specific answer\n     * is dispatched through the matching mode service. The newly answered item is set as the selected interaction first.\n     * @param item - The item to answer. Conversation or Workitem\n     */\n    answer(item: any) {\n        this.selectItem(item);\n\n        if (isWorkitem(item)) {\n            this.get('workitemModeService')\n                .answer(item)\n                .catch((error: any) => {\n                    if (error?.payload?.code === 'too.many.requests.retry.after') {\n                        this.displayError('purecloud.acdInteraction.workitem.errors.rateLimit');\n                    } else {\n                        this.displayError('purecloud.acdInteraction.workitem.errors.answer');\n                    }\n                });\n            return;\n        }\n\n        // Conversation interactions route voice to the phone service and digital types through\n        // the communication service.\n        this.get('conversationModeService').answer(item);\n\n        const isExternalCampaign = get(item, 'isExternalCampaign');\n        if (isExternalCampaign && navigator?.clipboard) {\n            const formattedCustomerPhoneNumber = get(item, 'formattedCustomerPhoneNumber');\n            navigator.clipboard.writeText(formattedCustomerPhoneNumber).catch(() => {\n                /* swallow */\n            });\n        }\n    },\n\n    /**\n     * Single decline entry point for the active roster. Resolves the item type and dispatches the\n     * type-specific decline through the matching mode service. Declining does not change the\n     * selection — the item is about to leave the roster.\n     */\n    decline(item: any) {\n        if (isWorkitem(item)) {\n            this.get('workitemModeService')\n                .decline(item)\n                .catch((error: any) => {\n                    if (error?.payload?.code === 'too.many.requests.retry.after') {\n                        this.displayError('purecloud.acdInteraction.workitem.errors.rateLimit');\n                    } else {\n                        this.displayError('purecloud.acdInteraction.workitem.errors.decline');\n                    }\n                });\n            return;\n        }\n        this.get('conversationModeService').decline(item);\n    },\n\n    async loadQueue(queueId: string): Promise<string> {\n        if (queueId) {\n            try {\n                const name = await fetchQueueName(queueId, this.get('storeService'), this.get('loggerService'));\n                if (name) return name;\n            } catch (error) {\n                this.get('loggerService').error('ACD: Could not fetch queue name', { error });\n            }\n        }\n        return this.get('intlService').t('purecloud.acdInteraction.unknown');\n    },\n\n    async loadParticipantName(interaction: any, participantId: string): Promise<string> {\n        const conversation: Conversation = get(interaction, '__interaction_metadata__');\n        const participants = conversation?.participants || [];\n        const participant = participants.find((p: any) => p.id === participantId);\n        const noName = this.get('intlService').t('purecloud.acdInteraction.noName');\n\n        if (!participant) return noName;\n\n        try {\n            const name = await fetchParticipantName(\n                participant,\n                this.get('storeService'),\n                this.get('externalContactsService'),\n                this.get('loggerService')\n            );\n            if (name) return name;\n        } catch (error) {\n            this.get('loggerService').error('ACD: Could not load participant name', { error });\n        }\n\n        return noName;\n    },\n\n    /**\n     * Maps allItems to AppContext[]. ActiveMode contains both conversations (Ember models)\n     * and workitems (plain objects with a .workitem property), so we handle each explicitly.\n     */\n    convertToAppContexts(allItems: ModeItemsMap): AppContext[] {\n        const contexts: AppContext[] = [];\n        allItems.forEach((item: any) => {\n            if (!item) return;\n            // Workitems are plain objects with a `workitem` property\n            if (isWorkitem(item)) {\n                const id = item.id;\n                if (!id) return;\n                contexts.push({ type: 'workitem', payload: item, id });\n            } else {\n                const id = typeof item.get === 'function' ? item.get('id') : item.id;\n                if (!id) return;\n                contexts.push({ type: 'conversation', payload: item, id });\n            }\n        });\n        return contexts;\n    },\n\n    init() {\n        this._super(...arguments);\n        this.set('draftUpdateHash', A([]));\n        this.set('isTypingInteractions', A([]));\n\n        this._registerRosterSelectionHandlers();\n\n        this.get('conversationModeService').initialize(this);\n\n        // Initialize workitem processing chain only when the user can view workitems.\n        // Mirrors legacy acdworkitem which skips hydration/subscription without\n        // workitems:workitem:view. The triggerAutoAnswer callback delegates to\n        // conversation-mode-service's auto-answer handler.\n        if (this.get('permissionsService').get('canViewWorkitem')) {\n            this.get('workitemModeService').initialize(this, {\n                triggerAutoAnswer: (model: any, type: string, subType?: string) => {\n                    this.get('conversationModeService')._handleAutoAnswer(model, type, subType);\n                }\n            });\n        }\n    },\n\n    /**\n     * Registers the active mode's roster selection behavior.\n     *\n     * Two layers are registered, resolved most-specific-first by the roster selection service:\n     *\n     * - Mode level (`active`) — the default for digital interactions (chat, email, message,\n     *   callback). Hold/unhold settles asynchronously on the platform, so the request is\n     *   dispatched fire-and-forget and never blocks the selection state machine.\n     * - Type level (`active.call`) — voice calls carry a media stream and only one may be\n     *   live (unheld) at a time, so these handlers `await` the hold/unhold. The state machine\n     *   will not advance the switch until the previous call is confirmed held and the incoming\n     *   call unheld, mirroring the legacy `waitForTasks` orchestration in `interaction.js`.\n     * - Type level (`active.workitem`) — workitems mirror the default digital behavior\n     *   (non-blocking fire-and-forget) but their hold state is their assignment state, so the\n     *   hold/unhold is driven through the task-management API rather than the communication\n     *   service.\n     */\n    _registerRosterSelectionHandlers(): void {\n        const rosterSelectionService = this.get('rosterSelectionService');\n        if (!rosterSelectionService) return;\n\n        const communicationService = this.get('communicationService');\n        const loggerService = this.get('loggerService');\n\n        // Default (digital) — non-blocking fire-and-forget. The handlers are async so they\n        // satisfy the handler signature, but they intentionally do not await the hold/unhold,\n        // so the selection state machine advances without waiting for the platform to settle.\n        rosterSelectionService.registerHandlers(this.get('id'), {\n            select: async (selection: RosterSelectedItem) => {\n                unholdInteraction(selection, communicationService).catch((error: unknown) => {\n                    loggerService.error('ActiveMode: failed to unhold selected interaction', {\n                        remoteData: { error, id: selection.id }\n                    });\n                });\n            },\n            postSelect: async (selection: RosterSelectedItem) => {\n                holdInteraction(selection, communicationService).catch((error: unknown) => {\n                    loggerService.error('ActiveMode: failed to hold deselected interaction', {\n                        remoteData: { error, id: selection.id }\n                    });\n                });\n            }\n        });\n\n        // Calls — awaited so hold/unhold settles before the selection switch advances. Voice is\n        // single-occupancy: selecting a call holds every OTHER live call and unholds this one.\n        // Leaving a call is intentionally a no-op so the call keeps running while the agent moves\n        // through digital interactions; a call is held only when a different call is later selected.\n        rosterSelectionService.registerHandlers(`${this.get('id')}.call`, {\n            preSelect: async (selection: RosterSelectedItem) => {\n                const allItems = this.get('allItems') as Map<string, any> | null;\n                const callsToHold = allItems ? findCallsToHoldOnSelect(selection.id, allItems.values()) : [];\n\n                // Hold competing calls first so two streams are never live at once, then unhold\n                // the incoming call. All awaited — voice must settle before the switch completes.\n                if (callsToHold.length > 0) {\n                    await Promise.all(\n                        callsToHold.map((call: any) =>\n                            communicationService.hold(call).catch((error: unknown) => {\n                                loggerService.error('ActiveMode: failed to hold competing call interaction', {\n                                    remoteData: { error, id: get(call, 'id') }\n                                });\n                            })\n                        )\n                    );\n                }\n            },\n            select: async (selection: RosterSelectedItem) => {\n                try {\n                    await unholdInteraction(selection, communicationService);\n                } catch (error) {\n                    loggerService.error('ActiveMode: failed to unhold selected call interaction', {\n                        remoteData: { error, id: selection.id }\n                    });\n                }\n            },\n            // No-op — leaving a call must not hold it. A call is only held when a\n            // *different* call is selected (handled in preSelect). This prevents\n            // fallthrough to the mode-level default postSelect which would hold it.\n            postSelect: async () => {}\n        });\n\n        // Workitems — non-blocking fire-and-forget, mirroring the default digital behavior but\n        // driven through task management's assignment-state API rather than the communication\n        // service. Selecting a workitem unholds it; leaving it holds it.\n        const taskManagementService = this.get('taskManagementService');\n        rosterSelectionService.registerHandlers(`${this.get('id')}.workitem`, {\n            select: async (selection: RosterSelectedItem) => {\n                unholdWorkitem(selection, taskManagementService).catch((error: unknown) => {\n                    loggerService.error('ActiveMode: failed to unhold selected workitem', {\n                        remoteData: { error, id: selection.id }\n                    });\n                });\n            },\n            postSelect: async (selection: RosterSelectedItem) => {\n                holdWorkitem(selection, taskManagementService).catch((error: unknown) => {\n                    loggerService.error('ActiveMode: failed to hold deselected workitem', {\n                        remoteData: { error, id: selection.id }\n                    });\n                });\n            }\n        });\n    },\n\n    _buildHeaderActions() {\n        return [\n            {\n                id: 'settings',\n                icon: 'settings',\n                tooltip: 'modeRoster.sidePanel.settings.tooltip',\n                onAction: () => {\n                    this.toggleSettingsSidePanel();\n                }\n            },\n            {\n                id: 'filter',\n                icon: 'fa/filter-regular',\n                tooltip: 'modeRoster.sidePanel.filter.tooltip',\n                badge: countActiveFilterCategories(this.get('filterState')),\n                onAction: () => {\n                    this.toggleFilterSidePanel();\n                }\n            },\n            {\n                id: 'outbound',\n                icon: 'custom/headset-circle-plus-solid',\n                tooltip: 'modeRoster.sidePanel.outbound.tooltip',\n                onAction: () => this.toggleOutboundSidePanel()\n            }\n        ];\n    },\n\n    /**\n     * Active roster empty states. The initial CTA label tracks on-queue state so agents\n     * can go on or off queue from the same control.\n     */\n    rosterEmptyStates: computed('sessionService.person.isOnQueue', function (this: any) {\n        const isOnQueue = !!this.get('sessionService.person.isOnQueue');\n        return {\n            initial: {\n                titleKey: 'modeRoster.active.emptyState.title',\n                descriptionKey: isOnQueue\n                    ? 'modeRoster.active.emptyState.onQueueDescription'\n                    : 'modeRoster.active.emptyState.description',\n                action: {\n                    labelKey: isOnQueue\n                        ? 'modeRoster.active.emptyState.actionLabelOffQueue'\n                        : 'modeRoster.active.emptyState.actionLabel',\n                    onAction: () => this.toggleQueue()\n                }\n            },\n            error: {\n                titleKey: 'modeRoster.active.error.title',\n                descriptionKey: 'modeRoster.active.error.description',\n                action: {\n                    labelKey: 'modeRoster.active.error.actionLabel',\n                    onAction: () => this.fetchData()\n                }\n            }\n        };\n    }),\n\n    toggleFilterSidePanel() {\n        this.get('rosterSidePanelService').toggle({\n            componentName: FILTER_PANEL_COMPONENT,\n            panelKey: getModeFilterPanelKey(this.get('id')),\n            context: { mode: this }\n        });\n    },\n\n    toggleSettingsSidePanel() {\n        this.get('rosterSidePanelService').toggle({\n            componentName: SETTINGS_PANEL_COMPONENT,\n            panelKey: 'active:settings'\n        });\n    },\n\n    toggleOutboundSidePanel() {\n        this.get('rosterSidePanelService').toggle({\n            componentName: OUTBOUND_PANEL_COMPONENT,\n            panelKey: 'active:outbound'\n        });\n    },\n\n    toggleQueue() {\n        this.get('queueToggleService').handleToggle();\n    },\n\n    willDestroy() {\n        this.get('rosterSidePanelService').close();\n        this.get('rosterSelectionService').unregisterHandlersForMode(this.get('id'));\n        this.get('conversationModeService').teardown();\n        this.get('workitemModeService').teardown();\n\n        this._super(...arguments);\n    },\n\n    _onMyConversationEvent(payload: any, topicData: any = {}) {\n        if (this.get('isDestroyed') || this.get('isDestroying') || !payload?.id) return;\n\n        const topicName = topicData?.topicName || '';\n        const isTypingEvent = topicName.includes('conversations.inbound.typing.event');\n\n        if (isTypingEvent) {\n            this.get('conversationModeService').handleTypingEvent(payload);\n        } else if (payload.id) {\n            this.get('conversationModeService').processEvent({ payload, eventSource: 'realtime' });\n        }\n    },\n\n    /**\n     * Handles the draft event from the subscription service. Draft payloads are not full\n     * conversation objects — they contain draft-specific data keyed by conversationId.\n     * The email chain's `emailDraftShortCircuit` step upserts the draft into the mode's\n     * `draftUpdateHash` and halts the chain. Mirrors legacy acdemail._handleDraftEvent.\n     */\n    _onDraftEvent(payload: any) {\n        if (this.get('isDestroyed') || this.get('isDestroying') || !payload?.conversationId) return;\n\n        this.get('conversationModeService').processEvent({ payload, eventSource: 'draftEvent' });\n    },\n\n    /**\n     * Handles realtime workitem events from pigeon. Routes the payload through\n     * the workitem-mode-service processing chain which will add/update/remove\n     * workitems from the appropriate mode roster based on assignment state.\n     */\n    _onWorkitemEvent(payload: any) {\n        if (this.get('isDestroyed') || this.get('isDestroying') || !payload?.id) return;\n\n        this.get('workitemModeService').processEvent({ payload, eventSource: 'realtime' });\n    },\n\n    prepareSubscriptionEventsFn() {\n        const events: SubscriptionEvent[] = [];\n        events.push({ event: 'my-conversations', handler: this._onMyConversationEvent });\n\n        // likely a permission, but none implemented in legacy\n        events.push({ event: 'draft', handler: this._onDraftEvent });\n\n        // likely a permission, but none implemented in legacy\n        events.push({ event: 'event', handler: this._onMyConversationEvent });\n\n        // Workitem realtime events\n        events.push({ event: 'workitems', handler: this._onWorkitemEvent });\n\n        this.set('subscriptionEvents', events);\n        return Promise.resolve();\n    },\n\n    prepareSubscriptionTopicsFn() {\n        const person = this.get('sessionService').get('person');\n        if (!person) return;\n\n        const guid = get(person, 'guid');\n        if (!guid) return;\n\n        const topics: SubscriptionTopic[] = [];\n\n        // all conversations\n        topics.push({ topic: `v2.users.${guid}.conversations`, type: 'priority' });\n\n        // likely a permission, but none implemented in legacy\n        topics.push({ topic: `v2.users.${guid}.conversations.emails.draft`, type: 'priority' });\n\n        const permissions = this.get('permissions');\n        if (get(permissions, 'canViewWebMessaging')) {\n            topics.push({ topic: `v2.users.${guid}.conversations.inbound.typing.event`, type: 'priority' });\n        }\n\n        // Workitem topic — uses custom event name so pigeon fires 'workitems' instead of the default topic-derived name\n        const permissionsService = this.get('permissionsService') as any;\n        if (permissionsService.get('canViewWorkitem')) {\n            topics.push({\n                topic: `v2.taskmanagement.workitems.users.${guid}`,\n                type: 'priority',\n                eventName: 'workitems'\n            });\n        }\n\n        this.set('subscriptionTopics', topics);\n        return Promise.resolve();\n    },\n\n    async fetchFn(): Promise<any[]> {\n        const activeConversations = await this.get('conversationModeService').fetchAll();\n        if (!this._isAlive()) return [];\n\n        for (const activeConversation of activeConversations) {\n            this.get('conversationModeService').processEvent({\n                payload: activeConversation,\n                eventSource: 'api'\n            });\n        }\n\n        // Fetch active workitems only when the user has workitems:workitem:view.\n        // Without the permission, skip the query entirely (same gate as subscription + init).\n        let activeWorkitems: any[] = [];\n        if (this.get('permissionsService').get('canViewWorkitem')) {\n            activeWorkitems = await this.get('workitemModeService').fetchActive();\n            if (!this._isAlive()) return [];\n\n            for (const activeWorkitem of activeWorkitems) {\n                this.get('workitemModeService').processEvent({\n                    payload: activeWorkitem,\n                    eventSource: 'api'\n                });\n            }\n        }\n\n        // If items were enqueued, flag that we're waiting for the first one to land in the\n        // roster. This keeps the loading spinner visible until at least one item clears the\n        // processing chain, preventing a flash of empty-state content.\n        // The flag is cleared by setItem on first insert, or by a backstop timer in fetchData.\n        if (activeConversations.length > 0 || activeWorkitems.length > 0) {\n            this.set('isRosterItemPending', true);\n        }\n\n        if (this._isAlive()) {\n            const conversationModeService = this.get('conversationModeService');\n            if (conversationModeService && typeof conversationModeService.signalReady === 'function') {\n                conversationModeService.signalReady();\n            }\n        }\n\n        return []; // chains handle allItems via setItem (async, after fetchData replaces the map)\n    },\n\n    applySearchAndFilterFn(items: any[], options: ModeSearchAndFilterOptions): any[] {\n        const query = options.searchQuery.toLowerCase();\n        const filterState = options.filterState as ActiveModeFilterState | null;\n\n        return items.filter(item => {\n            // Roster filters (channel, queue, direction). Shared with `hiddenByFilterCount` so the\n            // banner's count always agrees with what the roster actually hides.\n            if (!matchesActiveModeFilters(item, filterState)) return false;\n\n            // If no search query, item passes\n            if (!query) return true;\n\n            // Workitem search\n            if (isWorkitem(item)) {\n                const name = item.workitem?.name || '';\n                const id = item.id || '';\n                const description = item.workitem?.description || '';\n                if (name.toLowerCase().includes(query)) return true;\n                if (id.toLowerCase().includes(query)) return true;\n                if (description.toLowerCase().includes(query)) return true;\n                return false;\n            }\n\n            // Conversation search\n            if (plainString(item.id).toLowerCase().includes(query)) return true;\n            if (plainString(item.address).toLowerCase().includes(query)) return true;\n\n            const participantHit = (item.participants ?? []).some((participant: any) => {\n                if (plainString(participant.name).toLowerCase().includes(query)) return true;\n                if (plainString(participant.address).toLowerCase().includes(query)) return true;\n                return false;\n            });\n\n            if (participantHit) return true;\n            return false;\n        });\n    },\n\n    /**\n     * Alerting roster groups for the pinned cross-mode alerting section.\n     *\n     * Sourced from this mode's `allItems` (NOT `visibleItems`), so alerting cards are shown\n     * regardless of the current mode's search query, filters, or sort. Each alerting item is\n     * isolated into its own single-item group. Rendered by `mode-roster` in a pinned section\n     * that persists across every mode.\n     */\n    alertingGroups: computed('allItems', function (this: any): ModeRosterGroup[] {\n        return buildAlertingGroups(allItemsMapToValuesArray(this.get('allItems')));\n    }),\n\n    /**\n     * How many roster items the active filters are hiding, surfaced by the roster as\n     * `N items hidden by filters`. Deliberately counts only filters, not the search query.\n     *\n     * Two kinds of item are excluded because they stay on screen despite failing the filters:\n     *  - alerting items, which render in the pinned cross-mode alerting section (see `alertingGroups`)\n     *  - the current selection, which `visibleItems` re-inserts so it never disappears mid-interaction\n     *\n     * Counts both conversations and workitems.\n     */\n    hiddenByFilterCount: computed(\n        'allItems',\n        'filterState',\n        'rosterSelectionService.selection',\n        function (this: any): number {\n            const filterState: ActiveModeFilterState | null = this.get('filterState');\n            if (!filterState) return 0;\n\n            const selection = this.get('rosterSelectionService.selection');\n            const selectedId = selection?.modeId === this.get('id') ? this._getItemId(selection.payload) : undefined;\n\n            return allItemsMapToValuesArray(this.get('allItems')).reduce((hidden: number, item: any) => {\n                const itemIsAlerting = isItemAlerting(item);\n                const itemIsSelected = selectedId && this._getItemId(item) === selectedId;\n                const itemMatchesFilters = matchesActiveModeFilters(item, filterState);\n\n                if (itemIsAlerting || itemIsSelected || itemMatchesFilters) {\n                    return hidden;\n                }\n\n                return hidden + 1;\n            }, 0);\n        }\n    ),\n\n    /**\n     * Clears the roster's filters so the hidden items reappear. Leaves `searchQuery` untouched:\n     * the banner only ever reports filter-hidden items, so clearing search would remove a\n     * constraint the user was never told about.\n     */\n    showAllHiddenItems() {\n        this.set('filterState', null);\n    },\n\n    /**\n     * Groups items by canonical external contact ID. Handles both conversations\n     * (externalContactId at top level) and workitems (customer.externalContactId).\n     *\n     * Alerting items are excluded here — they are rendered in the pinned cross-mode alerting\n     * section (see `alertingGroups`), so leaving them out of the in-list roster avoids duplicate\n     * cards on the active mode.\n     */\n    groupItemsFn(items: any[]): any[] {\n        const groups: any[] = [];\n        const externalContactsService = this.get('externalContactsService') as any;\n\n        const nonAlertingItems = items.filter((item: any) => !isItemAlerting(item));\n\n        nonAlertingItems.forEach((item: any) => {\n            const externalContactId = getExternalContactId(item);\n            const canonical = externalContactsService?.getCanonicalContactSync?.(externalContactId);\n            const groupId: string | undefined = canonical?.id;\n\n            let group: any;\n\n            if (groupId) {\n                group = groups.find((g: any) => g.groupId === groupId);\n            }\n\n            if (group) {\n                if (!group.items.includes(item)) {\n                    group.items.push(item);\n                }\n            } else {\n                groups.push({\n                    id: '',\n                    groupId: groupId || '',\n                    items: [item]\n                });\n            }\n        });\n\n        groups.forEach((group: any) => {\n            const gId = group.groupId;\n            group.id = gId || group.items[0]?.id || '';\n\n            const canonical = gId ? externalContactsService?.getCanonicalContactSync?.(gId) : null;\n            const contactName = canonical?.name || canonical?.get?.('name');\n\n            if (contactName) {\n                group.sortName = String(contactName).toLocaleLowerCase();\n            } else {\n                const participant = get(group.items[0], 'participantForCustomer');\n                const rawName = participant ? getRawParticipantName(participant) : null;\n                const fallback = this.get('intlService').t('purecloud.acdInteraction.noName');\n                group.sortName = (rawName || fallback).toLocaleLowerCase();\n            }\n        });\n\n        return groups;\n    }\n});\n\n// ─── Roster Selection Hold/Unhold ──────────────────────────────────────────────\n\n/**\n * Minimal slice of the communication service needed to hold/unhold an interaction.\n * Matches the loosely-typed `hold`/`unhold` signatures on the real service, whose\n * argument is an Ember interaction model.\n */\nexport interface InteractionHoldService {\n    hold: (interaction: any) => Promise<unknown>;\n    unhold: (interaction: any) => Promise<unknown>;\n}\n\n/**\n * Default (digital) select behavior: unhold a held interaction.\n *\n * Digital interactions (chat, email, message, callback) settle their hold state\n * asynchronously on the platform, so the unhold is dispatched fire-and-forget and\n * never blocks the roster selection state machine. Failures are logged, not thrown.\n * Only already-held interactions are dispatched to avoid redundant requests.\n *\n * @param selection - The committed roster selection; its `payload` is the interaction model.\n * @param communicationService - Service used to dispatch the unhold request.\n */\nexport async function unholdInteraction(\n    selection: RosterSelectedItem,\n    communicationService: InteractionHoldService\n): Promise<void> {\n    const interaction = selection?.payload;\n    if (!interaction || !get(interaction, 'isHeld')) return;\n    await communicationService.unhold(interaction);\n}\n\n/**\n * Default (digital) post-select behavior: hold an unheld interaction.\n *\n * Mirrors {@link unholdInteraction} for the teardown side — when a\n * digital interaction leaves the selection it is held without blocking. Only\n * connected, not-already-held interactions are dispatched, since the platform\n * rejects holds on non-connected interactions.\n *\n * @param selection - The outgoing roster selection; its `payload` is the interaction model.\n * @param communicationService - Service used to dispatch the hold request.\n */\nexport async function holdInteraction(\n    selection: RosterSelectedItem,\n    communicationService: InteractionHoldService\n): Promise<void> {\n    const interaction = selection?.payload;\n    if (!interaction) return;\n    if (!get(interaction, 'isConnected') || get(interaction, 'isHeld')) return;\n    await communicationService.hold(interaction);\n}\n\n/**\n * Minimal slice of the task-management service needed to hold/unhold a workitem.\n * Matches the `holdWorkitemInteraction`/`unholdWorkitemInteraction` signatures on the real\n * service, which drive the workitem's assignment state through the task-management API.\n */\nexport interface WorkitemHoldService {\n    holdWorkitemInteraction: (interaction: WorkitemInteraction) => Promise<unknown>;\n    unholdWorkitemInteraction: (interaction: WorkitemInteraction) => Promise<unknown>;\n}\n\n/**\n * Workitem select behavior: unhold a held workitem.\n *\n * Mirrors {@link unholdInteraction} for workitems. Where digital interactions settle their hold\n * state through the communication service, a workitem's hold state is its assignment state, so\n * the unhold is driven through task management (which transitions the workitem back to\n * `Connected`). Dispatched fire-and-forget; only already-held workitems are sent to avoid\n * redundant assignment-state requests.\n *\n * @param selection - The committed roster selection; its `payload` is the workitem interaction.\n * @param taskManagementService - Service used to dispatch the unhold (assignment-state) request.\n */\nexport async function unholdWorkitem(\n    selection: RosterSelectedItem,\n    taskManagementService: WorkitemHoldService\n): Promise<void> {\n    const workitemInteraction = selection?.payload as WorkitemInteraction | undefined;\n    if (!workitemInteraction || workitemInteraction.workitem?.state !== 'held') return;\n    await taskManagementService.unholdWorkitemInteraction(workitemInteraction);\n}\n\n/**\n * Workitem post-select behavior: hold a connected workitem.\n *\n * Mirrors {@link holdInteraction} for the teardown side — when a workitem leaves the selection it\n * is held by transitioning its assignment state to `Held` through task management. Only connected\n * workitems are dispatched, since the platform rejects holds on workitems in any other state.\n *\n * @param selection - The outgoing roster selection; its `payload` is the workitem interaction.\n * @param taskManagementService - Service used to dispatch the hold (assignment-state) request.\n */\nexport async function holdWorkitem(\n    selection: RosterSelectedItem,\n    taskManagementService: WorkitemHoldService\n): Promise<void> {\n    const workitemInteraction = selection?.payload as WorkitemInteraction | undefined;\n    if (!workitemInteraction || workitemInteraction.workitem?.state !== 'connected') return;\n    await taskManagementService.holdWorkitemInteraction(workitemInteraction);\n}\n","export * from './mode';\nexport { default as ModeModelFactory } from './mode';\nexport * from './subscription';\nexport { default as ModeSubscriptionFactory } from './subscription';\n","import { computed, get } from '@ember/object';\nimport { readOnly } from '@ember/object/computed';\nimport { cancel, later } from '@ember/runloop';\nimport { inject } from '@ember/service';\nimport Promise from 'rsvp';\nimport type { ScriptState } from 'web-directory/services/modes/interapptions-state-service';\nimport type { AppContext } from 'web-directory/utils/apps';\nimport { getRawParticipantName } from 'web-directory/utils/participant-name';\nimport { getItemSortTimestamp } from '../utils';\nimport ModeSubscriptionFactory from './subscription';\nimport { isWorkitem } from '../utils';\n\nexport type ModeRosterEmptyStateVisual = { type: 'icon'; icon: string } | { type: 'illustration'; variant: string };\n\nexport type ModeRosterEmptyStateAction = {\n    /** Translation key for the action button label. */\n    labelKey: string;\n    onAction: () => void;\n};\n\n/**\n * Fully resolved empty state for one roster scenario (initial / no-results / fetch error).\n */\nexport type ModeRosterEmptyStateResolved = {\n    titleKey: string;\n    descriptionKey: string;\n    action?: ModeRosterEmptyStateAction;\n    visual?: ModeRosterEmptyStateVisual;\n};\n\nexport type ModeRosterEmptyStatesResolved = {\n    initial: ModeRosterEmptyStateResolved;\n    noResults: ModeRosterEmptyStateResolved;\n    error: ModeRosterEmptyStateResolved;\n};\n\n/** Per-state overrides modes may pass before `init` normalizes. */\nexport type ModeRosterEmptyStatePartial = Partial<Omit<ModeRosterEmptyStateResolved, 'visual' | 'action'>> & {\n    visual?: Partial<ModeRosterEmptyStateVisual> & Pick<ModeRosterEmptyStateVisual, 'type'>;\n    action?: Partial<ModeRosterEmptyStateAction>;\n};\n\nexport type ModeRosterEmptyStatesInput = {\n    initial?: ModeRosterEmptyStatePartial;\n    noResults?: ModeRosterEmptyStatePartial;\n    error?: ModeRosterEmptyStatePartial;\n};\n\nexport function modeRosterFilterStateHasActiveSelection(state: Record<string, unknown> | null | undefined): boolean {\n    if (state == null) return false;\n    if (typeof state !== 'object' || Array.isArray(state)) return false;\n    return Object.keys(state).length > 0;\n}\n\nexport function getModeFilterPanelKey(modeId: string): string {\n    return `${modeId}:filter`;\n}\n\nfunction mergeVisual(\n    base: ModeRosterEmptyStateVisual | null | undefined,\n    over?: ModeRosterEmptyStatePartial['visual'] | null\n): ModeRosterEmptyStateVisual | undefined {\n    if (over == null) return base ?? undefined;\n    if (over.type === 'icon') {\n        const fallback = base?.type === 'icon' ? base.icon : 'fa/inbox-regular';\n        return { type: 'icon', icon: over.icon ?? fallback };\n    }\n    return {\n        type: 'illustration',\n        variant: over.variant ?? (base?.type === 'illustration' ? base.variant : '')\n    };\n}\n\nfunction mergeEmptyStateAction(\n    base: ModeRosterEmptyStateAction | null | undefined,\n    partial: ModeRosterEmptyStatePartial['action'] | null | undefined\n): ModeRosterEmptyStateAction | undefined {\n    if (partial == null) return base ?? undefined;\n    const labelKey = partial.labelKey ?? base?.labelKey;\n    const onAction = partial.onAction ?? base?.onAction;\n    if (labelKey == null || onAction == null) return undefined;\n    return { labelKey, onAction };\n}\n\nfunction mergeResolvedEmptyState(\n    base: ModeRosterEmptyStateResolved,\n    partial: ModeRosterEmptyStatePartial | undefined\n): ModeRosterEmptyStateResolved {\n    if (!partial) return base;\n    return {\n        titleKey: partial.titleKey ?? base.titleKey,\n        descriptionKey: partial.descriptionKey ?? base.descriptionKey,\n        visual: partial.visual != null ? mergeVisual(base.visual, partial.visual) : base.visual,\n        action: partial.action != null ? mergeEmptyStateAction(base.action, partial.action) : base.action\n    };\n}\n\nfunction buildDefaultRosterEmptyStatesForMode(mode: any): ModeRosterEmptyStatesResolved {\n    const initialBase: ModeRosterEmptyStateResolved = {\n        titleKey: 'modeRoster.emptyStates.initial.title',\n        descriptionKey: 'modeRoster.emptyStates.initial.description'\n    };\n    const noResultsBase: ModeRosterEmptyStateResolved = {\n        titleKey: 'modeRoster.emptyStates.noResults.title',\n        descriptionKey: 'modeRoster.emptyStates.noResults.description',\n        visual: { type: 'illustration', variant: 'magnifying-glass-question' },\n        action: {\n            labelKey: 'modeRoster.emptyStates.noResults.actionLabel',\n            onAction: () => {\n                mode.get('rosterSidePanelService')?.closeSpecificSidePanel(getModeFilterPanelKey(mode.get('id')));\n                mode.set('searchQuery', '');\n                mode.set('filterState', null);\n            }\n        }\n    };\n    const errorBase: ModeRosterEmptyStateResolved = {\n        titleKey: 'modeRoster.emptyStates.error.title',\n        descriptionKey: 'modeRoster.emptyStates.error.description',\n        visual: { type: 'icon', icon: 'fa/triangle-exclamation-regular' },\n        action: {\n            labelKey: 'modeRoster.emptyStates.error.actionLabel',\n            onAction: () => mode.fetchData()\n        }\n    };\n    return {\n        initial: mergeResolvedEmptyState(initialBase, undefined),\n        noResults: mergeResolvedEmptyState(noResultsBase, undefined),\n        error: mergeResolvedEmptyState(errorBase, undefined)\n    };\n}\n\nexport function normalizeModeEmptyStates(mode: any, input?: ModeRosterEmptyStatesInput): ModeRosterEmptyStatesResolved {\n    const defaults = buildDefaultRosterEmptyStatesForMode(mode);\n    if (!input) return defaults;\n    return {\n        initial: mergeResolvedEmptyState(defaults.initial, input.initial),\n        noResults: mergeResolvedEmptyState(defaults.noResults, input.noResults),\n        error: mergeResolvedEmptyState(defaults.error, input.error)\n    };\n}\n\nexport type ModeAction = {\n    id: string;\n    icon: string;\n    onAction: (...args: any[]) => void;\n    disabled?: boolean | ((...args: any[]) => boolean);\n    tooltip?: string;\n    badge?: number;\n};\n\n/**\n * Resolver that derives a comparable value from a roster item or group.\n * Used by sort options to declaratively describe how to compare entries.\n *\n * - For `itemSort`: receives a single roster item.\n * - For `groupSort`: receives a `ModeRosterGroup`.\n *\n * Must return a `number` or `string` for comparison:\n * - Numbers are compared numerically.\n * - Strings are compared via `localeCompare` for correct i18n ordering.\n */\nexport type SortResolver<T = any> = (entry: T) => number | string;\n\n/**\n * Defines how to sort items within a multi-item group.\n */\nexport type ItemSortDescriptor = {\n    resolve: SortResolver<any>;\n    direction: 'asc' | 'desc';\n};\n\n/**\n * Defines how to sort groups relative to each other in the roster.\n */\nexport type GroupSortDescriptor = {\n    resolve: SortResolver<ModeRosterGroup>;\n    direction: 'asc' | 'desc';\n};\n\n/**\n * One entry in the roster sort dropdown.\n *\n * Each option explicitly declares how groups are ordered (`groupSort`) and\n * how items within a multi-item group are ordered (`itemSort`).\n *\n * - `groupSort.resolve` receives a `ModeRosterGroup` and returns a comparable value.\n * - `itemSort.resolve` receives a single item and returns a comparable value.\n *\n * Alerting groups are always pinned to the top regardless of sort direction.\n */\nexport type ModeSortOption = {\n    value: string;\n    translationKey: string;\n    groupSort: GroupSortDescriptor;\n    itemSort: ItemSortDescriptor;\n};\n\n// ─── Common sort resolvers ───────────────────────────────────────────────────\n\n/** Resolve a single item's start timestamp (epoch ms). */\nfunction resolveItemStartTimestamp(item: any): number {\n    if (!item) return 0;\n\n    // Workitems use dateCreated (ISO string)\n    if (isWorkitem(item)) {\n        const dateCreated = item.workitem.dateCreated;\n        return dateCreated ? new Date(dateCreated).valueOf() : 0;\n    }\n\n    // Conversations use startTimestamp (number)\n    const ts = typeof item.get === 'function' ? item.get('startTimestamp') : item?.startTimestamp;\n    return ts || 0;\n}\n\n/** Resolve the maximum (newest) start timestamp across a group's items. */\nfunction resolveGroupNewestTimestamp(group: ModeRosterGroup): number {\n    const items: any[] = group.items || [];\n    if (items.length === 0) return 0;\n    return Math.max(...items.map(resolveItemStartTimestamp));\n}\n\n/** Resolve the minimum (oldest) start timestamp across a group's items. */\nfunction resolveGroupOldestTimestamp(group: ModeRosterGroup): number {\n    const items: any[] = group.items || [];\n    if (items.length === 0) return 0;\n    const timestamps = items.map(resolveItemStartTimestamp).filter(ts => ts > 0);\n    if (timestamps.length === 0) return 0;\n    return Math.min(...timestamps);\n}\n\n/**\n * Resolve the group's display name for alphabetical sorting.\n * Groups without a name return empty string — `sortGroups` handles the \"push to end\" logic.\n */\nfunction resolveGroupName(group: ModeRosterGroup): string {\n    return group.sortName || '';\n}\n\nexport const DEFAULT_MODE_SORT_OPTIONS: ModeSortOption[] = [\n    {\n        value: 'createdAtDesc',\n        translationKey: 'modeRoster.sort.createdAtDesc',\n        groupSort: { resolve: resolveGroupNewestTimestamp, direction: 'desc' },\n        itemSort: { resolve: resolveItemStartTimestamp, direction: 'desc' }\n    },\n    {\n        value: 'createdAtAsc',\n        translationKey: 'modeRoster.sort.createdAtAsc',\n        groupSort: { resolve: resolveGroupOldestTimestamp, direction: 'asc' },\n        itemSort: { resolve: resolveItemStartTimestamp, direction: 'asc' }\n    },\n    {\n        value: 'nameAsc',\n        translationKey: 'modeRoster.sort.nameAsc',\n        groupSort: { resolve: resolveGroupName, direction: 'asc' },\n        itemSort: { resolve: resolveItemStartTimestamp, direction: 'desc' }\n    },\n    {\n        value: 'nameDesc',\n        translationKey: 'modeRoster.sort.nameDesc',\n        groupSort: { resolve: resolveGroupName, direction: 'desc' },\n        itemSort: { resolve: resolveItemStartTimestamp, direction: 'desc' }\n    }\n];\n\n/**\n * Resolved roster search UI config (pass `false` or `{ enabled: false }` from mode config to hide search).\n */\nexport type ModeSearchConfig = { enabled: boolean };\n\n/** Default Ember layout for the roster filter side panel (override per mode via `filter.panelComponent`). */\nexport const DEFAULT_MODE_FILTER_PANEL_COMPONENT = 'mode-manager/roster-side-panels/filter-panel';\n\n/**\n * Resolved roster filter control config (filter panel content stays separate; this toggles the header control).\n */\nexport type ModeFilterConfig = { enabled: false } | { enabled: true; panelComponent: string };\n\n/**\n * Resolved roster sort config.\n */\nexport type ModeSortConfig =\n    | { enabled: false }\n    | { enabled: true; options: ModeSortOption[]; defaultSortOrder: string };\n\n/** Input: omit / `undefined` → enabled with defaults; `false` → disabled. */\nexport type ModeSearchConfigInput = false | { enabled?: boolean };\n\n/** Input: omit / `undefined` → enabled with default panel layout; `false` → disabled. */\nexport type ModeFilterConfigInput = false | { enabled?: boolean; panelComponent?: string };\n\n/** Input: omit / `undefined` → default options and `createdAtAsc`; `false` → sort UI off. */\nexport type ModeSortConfigInput =\n    | false\n    | {\n          enabled?: boolean;\n          options?: ModeSortOption[];\n          defaultSortOrder?: string;\n      };\n\nexport type ModeSearchAndFilterOptions = {\n    searchQuery: string;\n    filterState: Record<string, unknown>;\n    sortOrder: string;\n};\n\n/**\n * When the mode manager should call `fetchData()` automatically.\n * Omit on a mode to disable automatic fetching (subclasses can still call `fetchData` manually).\n */\nexport type ModeFetchDataSchedule = 'boot' | 'activate';\n\nexport function normalizeModeSearchConfig(input?: ModeSearchConfigInput): ModeSearchConfig {\n    if (input === false) return { enabled: false };\n    if (input && input.enabled === false) return { enabled: false };\n    return { enabled: true };\n}\n\nexport function normalizeModeFilterConfig(input?: ModeFilterConfigInput): ModeFilterConfig {\n    if (input === false) return { enabled: false };\n    if (input && input.enabled === false) return { enabled: false };\n    const panelComponent =\n        input && typeof input === 'object' && input.panelComponent\n            ? input.panelComponent\n            : DEFAULT_MODE_FILTER_PANEL_COMPONENT;\n    return { enabled: true, panelComponent };\n}\n\nexport function normalizeModeSortConfig(input?: ModeSortConfigInput): ModeSortConfig {\n    if (input === false) return { enabled: false };\n    if (input && typeof input === 'object' && input.enabled === false) return { enabled: false };\n\n    const options =\n        input && typeof input === 'object' && input.options && input.options.length > 0\n            ? input.options\n            : DEFAULT_MODE_SORT_OPTIONS;\n\n    const defaultSortOrder =\n        input && typeof input === 'object' && input.defaultSortOrder ? input.defaultSortOrder : options[0].value;\n\n    return { enabled: true, options, defaultSortOrder };\n}\n\n/**\n * Compare two resolved sort values. Uses `localeCompare` for strings (proper i18n)\n * and numeric comparison for numbers.\n *\n * @returns negative if a < b, positive if a > b, 0 if equal\n */\nexport function compareSortValues(a: string | number, b: string | number): number {\n    if (typeof a === 'string' && typeof b === 'string') {\n        return a.localeCompare(b);\n    }\n    // Coerce to number for mixed or numeric comparisons\n    const numA = typeof a === 'number' ? a : 0;\n    const numB = typeof b === 'number' ? b : 0;\n    return numA - numB;\n}\n\n/**\n * Sort items within a group using the active sort option's `itemSort` descriptor.\n */\nexport function sortItemsWithinGroup(items: any[], itemSort: ItemSortDescriptor): any[] {\n    if (!items || items.length <= 1) return items || [];\n    const direction = itemSort.direction === 'desc' ? -1 : 1;\n\n    return [...items].sort((a, b) => {\n        return direction * compareSortValues(itemSort.resolve(a), itemSort.resolve(b));\n    });\n}\n\n/**\n * Sort groups using the active sort option's `groupSort` descriptor.\n * Alerting groups are always pinned to the top.\n * When two groups resolve to the same value, falls back to newest-item-first\n * for stable ordering.\n */\nexport function sortGroups(\n    groups: ModeRosterGroup[],\n    groupSort: GroupSortDescriptor,\n    isAlertingFn: (group: ModeRosterGroup) => boolean\n): ModeRosterGroup[] {\n    if (!groups || groups.length <= 1) return groups || [];\n    const direction = groupSort.direction === 'desc' ? -1 : 1;\n    return [...groups].sort((a, b) => {\n        const aAlerting = isAlertingFn(a);\n        const bAlerting = isAlertingFn(b);\n        if (aAlerting && !bAlerting) return -1;\n        if (!aAlerting && bAlerting) return 1;\n\n        const aVal = groupSort.resolve(a);\n        const bVal = groupSort.resolve(b);\n\n        const compareResult = direction * compareSortValues(aVal, bVal);\n        if (compareResult !== 0) {\n            return compareResult;\n        }\n\n        // Tiebreaker: newest item timestamp (most recent group first)\n        const timestampA = Math.max(...(a.items || []).map(getItemSortTimestamp));\n        const timestampB = Math.max(...(b.items || []).map(getItemSortTimestamp));\n        return timestampB - timestampA;\n    });\n}\n\n/**\n * A single group (rendered as a roster card) in the roster. All modes produce groups\n * conforming to this shape. For example, the active mode groups interactions by\n * canonical externalContactId.\n */\nexport type ModeRosterGroup<T = any> = {\n    id: string; // unique identifier for the group (used as the `{{each}}` key).\n    groupId: string;\n    items: T[];\n    sortName?: string; // resolved display name for group-level alphabetical sorting.\n    rosterCardComponent?: string; // optional per-group card override (e.g. workitem groups).\n};\n\n/**\n * Roster rows keyed by `String(item.id)` for O(1) updates (e.g. subscription events).\n */\nexport type ModeItemsMap = Map<string, any>;\n\n/**\n * Build a map from a fetch/array payload. Items with nullish `id` are skipped.\n */\nexport function itemsArrayToMap(items: any[]): ModeItemsMap {\n    const map = new Map<string, any>();\n    for (const item of items) {\n        if (item == null || item.id == null) continue;\n        map.set(String(item.id), item);\n    }\n    return map;\n}\n\n/**\n * Convert a map to an array of values.\n * @param map - The map to convert to an array.\n * @returns The array of values from the map.\n */\nexport function allItemsMapToValuesArray(map: ModeItemsMap | null | undefined): any[] {\n    if (!(map instanceof Map)) return [];\n    return Array.from(map.values());\n}\n\n// Mode Model Base Class\nconst ModeModelFactory = ModeSubscriptionFactory.extend({\n    externalContactsService: inject('external-contacts'),\n    rosterSelectionService: inject('modes/roster-selection-service'),\n    modeService: inject('modes/mode-service'),\n    rosterSidePanelService: inject('modes/roster-side-panel-service'),\n    interapptionsStateService: inject('modes/interapptions-state-service'),\n    mainstageLayoutService: inject('modes/mainstage-layout-service'),\n    notificationService: inject('notification'),\n    applicationService: inject('application'),\n    ajaxService: inject('ajax'),\n    intlService: inject('intl'),\n\n    /**\n     * @override\n     * The unique identifier for the mode.\n     */\n    id: '',\n\n    /**\n     * @override\n     * The icon for the mode.\n     */\n    icon: '',\n\n    /**\n     * @override\n     * The actions for the mode to be rendered in the roster header to the right of the title, above the search and filter controls.\n     */\n    headerActions: null as ModeAction[] | null,\n\n    /**\n     * @override\n     * Optional per-mode empty state overrides (`ModeRosterEmptyStatesInput`). Modes may set this in `.extend`\n     * or after `init`; it is never overwritten by the base. Use `resolvedRosterEmptyStates` for the merged\n     * roster UI shape.\n     */\n    rosterEmptyStates: undefined as ModeRosterEmptyStatesInput | undefined,\n\n    /**\n     * @override\n     * Controls automatic `fetchData()` invocation by `mode-manager/modes`.\n     * Leave unset for modes that do not need lifecycle-driven loading.\n     */\n    fetchDataSchedule: undefined as ModeFetchDataSchedule | undefined,\n\n    /**\n     * @override\n     * When true, this mode's `allItems` contribute to the interapptions-state-service's\n     * `activeAppContexts`. Apps/gadgets for these items persist across mode switches.\n     * Modes that don't need interapptions leave this false.\n     */\n    hasInterapptions: false,\n\n    /**\n     * Defaults to the base roster card which supports modular header/body subcomponents.\n     * Modes may override to supply a fully custom card. The header/body subcomponents can also receive custom components.\n     * The component receives `item` (a `ModeRosterGroup`) as an attribute.\n     */\n    rosterCardComponent: 'mode-manager/roster-cards/base' as string,\n\n    /**\n     * Displays the specified component path as the mainstage when roster card of this mode is selected.\n     * If this value remains null, the mode's mainstage will render \"acd-interactions-panel-v2/interaction\" component by default\n     * See `components/mode-manager/template.hbs` for the rendering logic\n     */\n    mainStageComponent: null as string | null,\n\n    /**\n     * @override\n     * When true, the sidebar mode button shows a badge for `itemCount`. Each mode must set this in `.extend({ ... })`.\n     */\n    showSidebarItemCountBadge: false,\n\n    /**\n     * Raw roster search config until init normalizes (subclass may set in `.extend`).\n     *\n     * @note Search field was removed from PURE-7222 initial GA.\n     * Default behavior now hides it, but keeping implementation for future use\n     */\n    search: false as ModeSearchConfigInput | undefined,\n\n    /**\n     * Raw roster filter config until init normalizes (subclass may set in `.extend`).\n     */\n    filter: undefined as ModeFilterConfigInput | undefined,\n\n    /**\n     * Raw roster sort config until init normalizes (subclass may set in `.extend`).\n     */\n    sort: undefined as ModeSortConfigInput | undefined,\n\n    /**\n     * Whether the last `fetchData` call failed.\n     */\n    fetchDataError: false,\n\n    /**\n     * The search query for the roster.\n     */\n    searchQuery: '',\n\n    /**\n     * The sort order for the roster.\n     */\n    sortOrder: '',\n\n    /**\n     * The filter state for the roster.\n     */\n    filterState: null as Record<string, unknown> | null,\n\n    /**\n     * Whether the roster is loading.\n     * @default true – without defaulting to true the roster may appear empty until the subscription service is connected and `fetchData` is called.\n     */\n    loading: true,\n\n    /**\n     * True when the bootstrap fetch returned items but none have landed in the roster yet —\n     * i.e. at least one item was enqueued into the processing chain but `setItem` has not\n     * been called yet. Prevents a flash of roster empty-state content while chains are still processing.\n     *\n     * Distinct from `loading`, which covers the API fetch phase:\n     *   loading = true                               → API request in progress\n     *   loading = false, isRosterItemPending = true  → fetch done, chains processing, waiting for first item to land\n     *   loading = false, isRosterItemPending = false → roster ready (empty or populated)\n     */\n    isRosterItemPending: false,\n\n    /**\n     * Handle for the `isRosterItemPending` backstop timer scheduled at the end of `fetchData`.\n     * Held so the timer can be cancelled when the mode is destroyed, or superseded when `fetchData`\n     * runs again. Without this the timer outlives the mode and fires against a destroyed object.\n     */\n    _rosterItemPendingTimer: null as ReturnType<typeof later> | null,\n\n    /**\n     * All roster rows keyed by item id (`String(id)`). Mutate via `setItem`,\n     * `deleteItem`, or replace in `fetchData`; after in-place `Map` edits call\n     * `notifyAllItemsChanged` so computeds refresh.\n     *\n     * NOTE: The initial value here is a type-only hint. The real instance-own Map\n     * is created in `init()` to prevent all mode instances from sharing the same\n     * prototype-level Map.\n     */\n    allItems: null as unknown as ModeItemsMap,\n\n    /**\n     * When true, `fetchData` skips replacing `allItems` with the return value of `fetchFn`.\n     * Set this on modes whose `fetchFn` populates `allItems` directly (e.g. via async processing\n     * chains) rather than returning items for the base to map. Without this flag, the base\n     * `set('allItems', itemsArrayToMap([]))` would clobber items already written by chains\n     * that completed during the `fetchFn` await.\n     */\n    fetchFnPopulatesAllItemsDirectly: false,\n\n    /**\n     * Division name cache to avoid redundant API calls. Keyed by divisionId.\n     * Initialized per-instance in init().\n     */\n    cachedDivisionsMap: null as Map<string, string | undefined> | null,\n\n    /**\n     * Feature toggle for external contact division name lookups.\n     * Subclasses bind this to `sessionService.features.PURE-3835`; the base\n     * declares it so `loadDivisionName` can call `this.get('acdExternalContactDivNameFT')`\n     * without a TS error.\n     */\n    acdExternalContactDivNameFT: undefined as boolean | undefined,\n\n    /**\n     * The label for the mode to be rendered in the roster header and in the side bar.\n     */\n    _label: null as string | null | undefined,\n\n    /**\n     * The placeholder for the search field in the roster.\n     */\n    _searchPlaceholder: null as string | null | undefined,\n\n    /**\n     * @override - can override if the mode needs to calculate the item count differently.\n     * Count of items in `allItems` (not filtered by search); sidebar badge uses this.\n     */\n    itemCount: readOnly('allItems.size'),\n\n    /**\n     * @override\n     * Alerting roster groups for this mode. Returns an empty array by default — only modes\n     * with alerting behavior (e.g. Active) should override this with a real computed.\n     * Consumed by `mode-service.resolvedAlertingGroups` to build the cross-mode alerting section.\n     */\n    alertingGroups: [] as ModeRosterGroup[],\n\n    /**\n     * Fully merged empty states (defaults + `rosterEmptyStates`). Templates and roster should bind this.\n     */\n    resolvedRosterEmptyStates: computed('rosterEmptyStates', function (this: any): ModeRosterEmptyStatesResolved {\n        const input = this.get('rosterEmptyStates') as ModeRosterEmptyStatesInput | undefined;\n        return normalizeModeEmptyStates(this, input);\n    }),\n\n    label: computed('_label', 'id', function (this: any): string {\n        const explicit = this.get('_label') as string | null | undefined;\n        if (explicit) return explicit;\n        return `modes.${this.get('id')}.label`;\n    }),\n\n    searchPlaceholder: computed('_searchPlaceholder', 'id', function (this: any): string {\n        const explicit = this.get('_searchPlaceholder') as string | null | undefined;\n        if (explicit) return explicit;\n        return `modes.${this.get('id')}.searchPlaceholder`;\n    }),\n\n    /**\n     * Extract the id from a roster item, supporting both Ember objects (`.get('id')`)\n     * and plain objects (`.id`).\n     */\n    _getItemId(item: any): string | undefined {\n        if (!item) return undefined;\n        return typeof item.get === 'function' ? item.get('id') : item.id;\n    },\n\n    /**\n     * Final roster output: filter → group → sort items within groups → sort groups.\n     * Modes should not override this; instead override `groupItemsFn` for custom grouping\n     * or `applySearchAndFilterFn` for custom filtering.\n     *\n     * Selected items are always included in the output regardless of active filters or\n     * search query.\n     */\n    visibleItems: computed(\n        'allItems',\n        'searchQuery',\n        'filterState',\n        'sortOrder',\n        'rosterSelectionService.selection',\n        function (this: any): ModeRosterGroup[] {\n            const asArray = allItemsMapToValuesArray(this.get('allItems'));\n\n            // Step 1: Filter\n            const filtered = this.applySearchAndFilterFn(asArray, {\n                searchQuery: this.get('searchQuery') ?? '',\n                filterState: this.get('filterState') ?? null\n            });\n\n            // Always show the selected item even if the current filters would hide it.\n            const selection = this.get('rosterSelectionService.selection');\n            const selectedItem = selection?.modeId === this.get('id') ? selection.payload : null;\n\n            if (selectedItem) {\n                const selectedId = this._getItemId(selectedItem);\n                const isPresent = selectedId && filtered.some((item: any) => this._getItemId(item) === selectedId);\n\n                if (!isPresent) {\n                    // Re-insert the selected item so it remains visible\n                    const fullItem = asArray.find((item: any) => this._getItemId(item) === selectedId);\n                    if (fullItem) {\n                        filtered.push(fullItem);\n                    }\n                }\n            }\n\n            // Step 2: Group\n            const groups = this.groupItemsFn(filtered);\n\n            // Step 3: Sort (items within groups, then groups themselves)\n            return this.applySortToGroups(groups);\n        }\n    ),\n\n    /**\n     * @override\n     * How many roster items the current mode's filters are hiding. `0` suppresses the roster's\n     * \"hidden by filters\" banner, so modes opt in by overriding this with a real computed (i.e. Active mode).\n     *\n     * Modes that override it should also implement `showAllHiddenItems`.\n     */\n    hiddenByFilterCount: 0,\n\n    /**\n     * @override\n     * Clears whatever the mode's `hiddenByFilterCount` reports on, invoked by the roster banner's\n     * \"Show all\". No-op by default since the banner is hidden unless a mode opts in.\n     */\n    showAllHiddenItems() {},\n\n    isFilterActive: computed('searchQuery', 'filterState', function (this: any): boolean {\n        const q = (this.get('searchQuery') as string) || '';\n        if (q.trim() !== '') return true;\n        return modeRosterFilterStateHasActiveSelection(this.get('filterState'));\n    }),\n\n    init() {\n        this._super(...arguments);\n\n        this.set('cachedDivisionsMap', new Map());\n\n        // Initialize allItems as an instance-own Map before anything else runs.\n        // Without this, all mode instances share the same prototype-level Map, causing\n        // active conversations to appear in the inactive mode's roster (and vice versa).\n        // setItem/deleteItem mutates the Map in place, so this must be an instance-own property.\n        this.set('allItems', new Map());\n\n        this.set('search', normalizeModeSearchConfig(this.get('search') as ModeSearchConfigInput | undefined));\n\n        this.set('filter', normalizeModeFilterConfig(this.get('filter') as ModeFilterConfigInput | undefined));\n\n        this.set('sort', normalizeModeSortConfig(this.get('sort') as ModeSortConfigInput | undefined));\n\n        if (!this.get('headerActions')) {\n            this.set('headerActions', []);\n        }\n\n        const sortCfg = this.get('sort') as ModeSortConfig;\n        if (sortCfg && sortCfg.enabled) {\n            this.set('sortOrder', sortCfg.defaultSortOrder);\n        } else {\n            this.set('sortOrder', '');\n        }\n\n        this._setupSubscription();\n        this._setupEvents();\n\n        if (this.get('fetchDataSchedule') === 'boot') {\n            this.scheduleDataFetch();\n        }\n    },\n\n    /**\n     * @override\n     * Maps this mode's `allItems` to `AppContext[]` for consumption by the interapptions manager.\n     * The default implementation treats all items as conversation contexts.\n     * Modes with different item types (workitems, external contacts) must override this.\n     */\n    convertToAppContexts(allItems: ModeItemsMap): AppContext[] {\n        const contexts: AppContext[] = [];\n        allItems.forEach((item: any) => {\n            if (!item) return;\n            const id = typeof item.get === 'function' ? item.get('id') : item.id;\n            if (!id) return;\n\n            contexts.push({\n                type: 'conversation',\n                payload: item,\n                id\n            });\n        });\n        return contexts;\n    },\n\n    /**\n     * Insert or replace one row by `item.id` and notify roster computeds.\n     * Also clears `isRosterItemPending` on the first successful insert after a bootstrap fetch.\n     */\n    setItem(item: any & { id: string }) {\n        this.get('allItems').set(item.id, item);\n\n        if (this.get('isRosterItemPending')) {\n            this.set('isRosterItemPending', false);\n        }\n\n        this.notifyPropertyChange('allItems');\n    },\n\n    /**\n     * Remove a row by id and notify roster computeds.\n     */\n    deleteItem(id: string) {\n        this.get('allItems').delete(id);\n        this.notifyPropertyChange('allItems');\n    },\n\n    /**\n     * Entry point used by `modes/mode-service` for `fetchDataSchedule` loads.\n     * Waits for pigeon `connect` when `waitForConnect` is true or when `subscriptionTopics`\n     * is non-empty (so topics are registered before fetch). Otherwise calls `fetchData()` immediately.\n     */\n    scheduleDataFetch() {\n        if (!this.get('requiresConnection')) {\n            this.fetchData();\n            return;\n        }\n\n        if (this.get('connected')) {\n            this._registerTopics();\n            this.fetchData();\n            return;\n        }\n\n        if (this.get('_pendingScheduledFetchOnConnect')) return;\n        this.set('_pendingScheduledFetchOnConnect', true);\n        this._attachConnectListener();\n    },\n\n    /**\n     * Invoke to select the mode and begin the scheduled data fetch if configured.\n     */\n    select() {\n        if (this.get('fetchDataSchedule') !== 'activate') return;\n        this.scheduleDataFetch();\n    },\n\n    /**\n     * Shared entry point for selecting a roster item, routed through the roster-selection-service\n     * (keyed by this mode's `id`) so selection state and registered handlers apply consistently\n     * across modes. Modes should customize selection via handlers on that service rather than\n     * overriding this method.\n     *\n     * Also promotes this mode's main stage to the displayed one, since main stage visibility is\n     * decoupled from the roster mode and only changes on selection (see `mode-service`). Clearing\n     * the selection leaves the displayed main stage untouched.\n     *\n     * Modes customize selection behavior by registering handlers with the\n     * roster-selection-service (keyed by mode / type / id) rather than overriding\n     * this method. Override only if a mode needs a fundamentally different entry point.\n     *\n     * @param item The roster item to select, or `null`/`undefined` to clear the selection.\n     * @returns A promise that resolves once the selection has been processed.\n     */\n    selectItem(item: any): Promise<void> {\n        const modeId = this.get('id');\n        return this.get('rosterSelectionService').select(modeId, item);\n    },\n\n    /**\n     * Load or refresh data: pre-fetch → `fetchFn` (replaces `allItems` map) → post-fetch.\n     * Sets `loading` for the full sequence. Subclasses supply data by overriding `fetchFn()` (and\n     * optionally `preFetchFn` / `postFetchFn`); do not override `fetchData` unless unavoidable.\n     *\n     * When `fetchFnPopulatesAllItemsDirectly` is true, the step that replaces `allItems` with the\n     * return value of `fetchFn` is skipped. Use this on modes that populate `allItems` via async\n     * processing chains rather than returning items directly from `fetchFn`.\n     */\n    async fetchData() {\n        if (!this._isAlive()) return;\n\n        this.set('loading', true);\n        this.set('fetchDataError', false);\n        try {\n            await this.preFetchFn();\n            if (!this._isAlive()) return;\n\n            const rawItems = await this.fetchFn();\n            if (!this._isAlive()) return;\n\n            if (!this.get('fetchFnPopulatesAllItemsDirectly')) {\n                const items = Array.isArray(rawItems) ? rawItems : [];\n                this.set('allItems', itemsArrayToMap(items));\n            }\n\n            await this.postFetchFn(rawItems ?? []);\n        } catch (error) {\n            if (!this._isAlive()) return;\n\n            this.set('allItems', new Map());\n            this.set('fetchDataError', true);\n            await this.errorFetchFn();\n            console.error(`[mode-manager] Error fetching mode \"${this.get('id')}\":`, error);\n        } finally {\n            if (this._isAlive()) {\n                this.set('loading', false);\n\n                // Backstop: if no items landed through the chains (e.g. all were filtered out\n                // or chains exited early), clear the pending flag so the roster doesn't spin forever.\n                // The handle is retained so this timer can be cancelled on destroy — an uncancelled\n                // one fires up to 500ms after the mode is gone.\n                this._cancelRosterItemPendingTimer();\n                this.set(\n                    '_rosterItemPendingTimer',\n                    later(\n                        this,\n                        () => {\n                            // Guard before touching the mode at all — `set` on a destroyed\n                            // EmberObject throws, and this callback outlives the mode by up to 500ms\n                            // if it was not cancelled.\n                            if (!this._isAlive()) return;\n                            this.set('_rosterItemPendingTimer', null);\n                            this.set('isRosterItemPending', false);\n                        },\n                        500\n                    )\n                );\n            }\n        }\n    },\n\n    /**\n     * Cancels the pending `isRosterItemPending` backstop timer, if one is scheduled.\n     */\n    _cancelRosterItemPendingTimer(this: any) {\n        const timer = this.get('_rosterItemPendingTimer');\n        // Explicit null/undefined check rather than truthiness: backburner allocates timer ids from a\n        // counter starting at 0, so a truthy check skips cancelling the first timer in a page.\n        if (timer === null || timer === undefined) {\n            return;\n        }\n        cancel(timer);\n        // Assigned directly rather than via `set`: this also runs from willDestroy, where the object\n        // is already tearing down and property notifications are pointless (and unsafe once\n        // destruction completes).\n        this._rosterItemPendingTimer = null;\n    },\n\n    willDestroy(this: any) {\n        // Cancel the backstop timer before teardown. Anything still scheduled would fire against a\n        // destroyed mode, which is both a source of \"Cannot create chain watcher after destroyed\"\n        // flapping in the app and the reason ~35 mode tests were reported as leaking a 500ms timer.\n        this._cancelRosterItemPendingTimer();\n        this._super(...arguments);\n    },\n\n    /**\n     * Apply the active sort option to grouped roster data.\n     * Sorts items within each group, then sorts the groups relative to each other.\n     * Alerting groups are always pinned to the top.\n     */\n    applySortToGroups(groups: ModeRosterGroup[]): ModeRosterGroup[] {\n        if (!Array.isArray(groups) || groups.length === 0) return groups ?? [];\n\n        const sortCfg = this.get('sort') as ModeSortConfig;\n        if (!sortCfg || !sortCfg.enabled) return groups;\n\n        const sortOrder = (this.get('sortOrder') as string) || sortCfg.defaultSortOrder;\n        const sortOption = sortCfg.options.find(option => option.value === sortOrder);\n        if (!sortOption) return groups;\n\n        // Sort items within each group\n        const sortedGroups = groups.map(group => ({\n            ...group,\n            items: sortItemsWithinGroup(group.items, sortOption.itemSort)\n        }));\n\n        // Sort groups relative to each other (alerting pinned to top)\n        return sortGroups(sortedGroups, sortOption.groupSort, group => {\n            const firstItem = group.items[0];\n            return (\n                !!firstItem &&\n                (!!get(firstItem, 'isAlerting') || get(firstItem, 'workitem.assignmentState') === 'Alerting')\n            );\n        });\n    },\n\n    /**\n     * @override – overrides from `ModeSubscriptionFactory`.\n     * Runs after the subscription connect event.\n     * @returns A promise that resolves when the post-connect is complete.\n     */\n    postConnectFn(): Promise<void> {\n        return this.fetchData();\n    },\n\n    /**\n     * @override\n     * Reduce `allItems` using the current search, filter, and sort UI state. Override in modes that\n     * enforce filtering in the roster.\n     */\n    applySearchAndFilterFn(items: any[], _options: ModeSearchAndFilterOptions): any[] {\n        return items;\n    },\n\n    /**\n     * @override\n     * Transform a flat filtered item array into `ModeRosterGroup[]`. Groups items by\n     * canonical external contact ID (via `externalContactsService.getCanonicalContactSync`).\n     * Alerting items are always isolated into their own group.\n     *\n     * Sorting is handled separately by `applySortToGroups` — this function only\n     * performs grouping and resolves `sortName` for group-level sort resolvers.\n     */\n    groupItemsFn(items: any[]): ModeRosterGroup[] {\n        const groups: ModeRosterGroup[] = [];\n        const externalContactsService = this.get('externalContactsService');\n        const intlService = this.get('intlService');\n\n        items.forEach(item => {\n            const externalContactId = get(item, 'externalContactId') || undefined;\n            const canonical = externalContactsService?.getCanonicalContactSync?.(externalContactId);\n            const groupId: string | undefined = canonical?.id;\n            const isAlerting = !!get(item, 'isAlerting');\n\n            let group: ModeRosterGroup | undefined;\n\n            if (groupId && !isAlerting) {\n                group = groups.find(g => g.groupId === groupId && !get(g.items[0], 'isAlerting'));\n            }\n\n            if (group) {\n                if (!group.items.includes(item)) {\n                    group.items.push(item);\n                }\n            } else {\n                groups.push({\n                    id: '',\n                    groupId: groupId || '',\n                    items: [item]\n                });\n            }\n        });\n\n        // Assign stable ids and resolve sortName for group-level sort resolvers\n        groups.forEach(group => {\n            const gId = group.groupId;\n            group.id = gId || group.items[0]?.id || '';\n\n            // Resolve sortName from external contact or participant for name-based sorts\n            const canonical = gId ? externalContactsService?.getCanonicalContactSync?.(gId) : null;\n            const contactName = canonical?.name || canonical?.get?.('name');\n            if (contactName) {\n                group.sortName = String(contactName).toLocaleLowerCase();\n            } else {\n                const participant = get(group.items[0], 'participantForCustomer');\n                const rawName = participant ? getRawParticipantName(participant) : null;\n\n                const fallback = intlService?.t('purecloud.acdInteraction.noName') || '';\n                group.sortName = (rawName || fallback).toLocaleLowerCase();\n            }\n        });\n\n        return groups;\n    },\n\n    /**\n     * @override\n     * Runs before `fetchFn`. Override for setup work tied to a refresh cycle.\n     * @returns A promise that resolves when the pre-fetch is complete.\n     */\n    preFetchFn(): Promise<void> {\n        return Promise.resolve();\n    },\n\n    /**\n     * @override\n     * Fetches roster items for this mode. Subclasses with `fetchDataSchedule` or manual `fetchData`\n     * should override; the base warns and returns an empty list.\n     * @returns A promise that resolves with the roster items.\n     */\n    fetchFn(): Promise<any[]> {\n        const modeId = this.get('id');\n        console.warn(\n            `[mode-manager] Mode \"${modeId}\" should override fetchFn() when using scheduled or manual fetchData().`\n        );\n        return Promise.resolve([]);\n    },\n\n    /**\n     * @override\n     * Runs after `allItems` has been replaced from `fetchFn`. Receives the same array returned by `fetchFn`\n     * (not the internal `Map`).\n     * @param items The roster items.\n     * @returns A promise that resolves when the post-fetch is complete.\n     */\n    postFetchFn(_items: any[]): Promise<void> {\n        return Promise.resolve();\n    },\n\n    /**\n     * @override\n     * Runs when `fetchData` fails. Override for error handling.\n     * @returns A promise that resolves when the error fetch is complete.\n     */\n    errorFetchFn(): Promise<void> {\n        return Promise.resolve();\n    },\n\n    /**\n     * Whether any roster item belonging to this mode is currently selected.\n     */\n    hasSelection: computed(\n        'rosterSelectionService.selection',\n        'rosterSelectionService.pendingModeId',\n        'id',\n        function (this: any): boolean {\n            const id = this.get('id');\n            // True if there is a committed selection for this mode.\n            const selection = this.get('rosterSelectionService.selection');\n            if (selection?.modeId === id && !!selection.payload) return true;\n            // Also true if there is a pending (enqueued but not yet committed) selection for this\n            // mode. This prevents the one-tick hidden flash when switching modes — `pendingModeId`\n            // is set synchronously on roster click before the async drain commits `selection`.\n            return this.get('rosterSelectionService.pendingModeId') === id;\n        }\n    ),\n\n    // --- Action methods called by mode-manager/template.hbs ---\n\n    /**\n     * Writes the mainstage focused state to the mainstage layout service.\n     * Called via `(action 'onMainstageFocusedChanged')` in mode-manager/template.hbs, which\n     * is passed as a closure action to `acd-interactions-panel-v2/interaction`. Only applies\n     * to modes that use the legacy interaction panel (Active/Inactive).\n     *\n     * Modes with a custom `mainStageComponent` (History/Contacts) manage focus directly via the layout service.\n     */\n    onMainstageFocusedChanged(this: any, value: boolean): void {\n        this.get('mainstageLayoutService').setFocused(value);\n    },\n\n    /**\n     * Displays an error notification. Delegates to `notificationService` + `intlService`.\n     * `intlService` is injected by subclasses (`active.ts`, `inactive.ts`); falls back\n     * gracefully if absent.\n     */\n    displayError(this: any, messageKey: string, options?: Record<string, any>): void {\n        const intlService = this.get('intlService');\n        if (!intlService) return;\n        const message = intlService.t(messageKey, options);\n        this.get('notificationService').error(null, message, {});\n    },\n\n    /**\n     * Fetches a division name by ID, with per-instance caching to avoid redundant API calls.\n     * Gates on the `acdExternalContactDivNameFT` feature toggle. Returns `undefined` when the\n     * toggle is off, the id is absent, or the id is the wildcard `'*'`.\n     */\n    async loadDivisionName(divisionId: string | undefined): Promise<string | undefined> {\n        const acdExternalContactDivNameFT = this.get('acdExternalContactDivNameFT');\n        if (acdExternalContactDivNameFT && divisionId && divisionId !== '*') {\n            const cachedDivisionsMap = this.get('cachedDivisionsMap') as Map<string, string | undefined>;\n            return (\n                cachedDivisionsMap.get(divisionId) ??\n                (async () => {\n                    try {\n                        const url = this.get('applicationService').pcV2Uri(\n                            `platform/api/v2/authorization/divisions/${divisionId}`\n                        );\n                        const division = await this.get('ajaxService').ajaxGet(url);\n                        const divisionName = division?.name;\n                        cachedDivisionsMap.set(divisionId, divisionName);\n                        return divisionName;\n                    } catch {\n                        /* swallow */\n                    }\n                })()\n            );\n        }\n        return undefined;\n    },\n\n    /**\n     * Updates the contextualInteractionScriptStateMap on the interapptions state service.\n     * Reads `selectedInteraction` first (conversation), falls back to `selectedWorkitem`\n     * (workitem) so both Active and Inactive modes share one implementation.\n     * Modes may override if they need different behaviour.\n     */\n    contextualScriptAvailabilityChanged(this: any, scriptAvailable: boolean): void {\n        const selectedInteraction = this.get('selectedInteraction');\n        const selectedWorkitem = this.get('selectedWorkitem');\n        const interactionId =\n            (selectedInteraction ? get(selectedInteraction, 'id') : null) ||\n            (selectedWorkitem ? get(selectedWorkitem, 'id') : null);\n\n        if (!interactionId) return;\n\n        const stateService = this.get('interapptionsStateService');\n        const currentMap: Record<string, ScriptState> = stateService.get('contextualInteractionScriptStateMap') || {};\n\n        const existing: ScriptState | undefined = currentMap[interactionId];\n        const updated: ScriptState = {\n            scriptAvailable,\n            changeCount: existing ? existing.changeCount + 1 : 1\n        };\n\n        // Retain entries for still-active interactions; prune stale ones.\n        const allItems = this.get('allItems') as ModeItemsMap | null;\n        const activeIds = allItems ? new Set(allItems.keys()) : new Set<string>();\n\n        const newMap: Record<string, ScriptState> = {};\n        for (const [id, state] of Object.entries(currentMap) as [string, ScriptState][]) {\n            if (activeIds.has(id)) {\n                newMap[id] = state;\n            }\n        }\n        newMap[interactionId] = updated;\n\n        stateService.set('contextualInteractionScriptStateMap', newMap);\n    }\n});\n\nexport default ModeModelFactory;\nexport type ModeModel = InstanceType<typeof ModeModelFactory> & InstanceType<typeof ModeSubscriptionFactory>;\n","import EmberObject, { computed } from '@ember/object';\nimport { readOnly } from '@ember/object/computed';\nimport { inject } from '@ember/service';\nimport { PigeonEvents } from 'web-directory/services/pigeon';\n\nconst ModeSubscriptionFactory = EmberObject.extend({\n    /**\n     * Injected subscription (pigeon) service.\n     */\n    pigeon: inject('pigeon'),\n\n    /**\n     * @override\n     * Subscription topics to register with the subscription service once the\n     * service is connected. Modes may set this in `.extend()` as a string array.\n     * Empty or omitted means no automatic topic registration.\n     *\n     * Initialized to an instance-own array in `init()` — do not use a shared\n     * prototype default (same pattern as `allItems` on the mode base).\n     */\n    subscriptionTopics: null as SubscriptionTopic[] | null,\n\n    /**\n     * @override\n     * Pigeon (subscription service) event registrations. Modes set this in `prepareSubscriptionEventsFn()` or in\n     * `.extend()` as an array of `{ event, handler }`. Each `handler` is bound with `this` as context (same as\n     * `pigeon.on(event, this, handler)`). Empty or omitted means no automatic registration.\n     */\n    subscriptionEvents: null as SubscriptionEvent[] | null,\n\n    /**\n     * True while this mode listens for subscription service `connect` to register topics and/or run a deferred fetch.\n     */\n    _connectListenerActive: false,\n\n    /**\n     * When true, the next subscription service `connect` will run `fetchData()` after registering topics.\n     */\n    _pendingScheduledFetchOnConnect: false,\n\n    /**\n     * After topics are pushed to the subscription service, we unregister this snapshot in `willDestroy`.\n     */\n    _registeredTopicsSnapshot: null as SubscriptionTopic[] | null,\n\n    /**\n     * Guards duplicate `registerTopics` calls for this mode instance.\n     */\n    _hasTopicsRegistered: false,\n\n    /**\n     * After handlers are registered on pigeon, we unregister this snapshot in `willDestroy`.\n     */\n    _registeredEventsSnapshot: null as SubscriptionEvent[] | null,\n\n    /**\n     * Guards duplicate pigeon event registration for this mode instance.\n     */\n    _hasEventsRegistered: false,\n\n    /**\n     * Whether the subscription service is connected.\n     */\n    connected: readOnly('pigeon.connected'),\n\n    /**\n     * Whether the subscription service connection is required for this mode.\n     * Currently we will only require a connection if the mode has any subscription topics,\n     * this can expanded to require a connection for other reasons in the future.\n     */\n    requiresConnection: computed.notEmpty('subscriptionTopics'),\n\n    init() {\n        this._super(...arguments);\n        this.set('subscriptionTopics', []);\n        this.set('subscriptionEvents', []);\n    },\n\n    willDestroy() {\n        this._teardownEvents();\n        this._teardownConnectListener();\n\n        const snapshot = this.get('_registeredTopicsSnapshot');\n        if (snapshot && snapshot.length > 0) {\n            const { priority, normal, custom } = prioritizedTopics(snapshot);\n            if (priority.length > 0) {\n                this.get('pigeon').unRegisterPriorityTopics(priority);\n            }\n            if (normal.length > 0) {\n                this.get('pigeon').unRegisterTopics(normal);\n            }\n            for (const { topic } of custom) {\n                this.get('pigeon').unRegisterPriorityTopic(topic);\n            }\n            this.set('_registeredTopicsSnapshot', null);\n        }\n\n        this._super(...arguments);\n    },\n\n    _isAlive(): boolean {\n        return !this.get('isDestroyed') && !this.get('isDestroying');\n    },\n\n    /**\n     * Registers pigeon Evented listeners from `subscriptionEvents` after `prepareSubscriptionEventsFn()` runs.\n     * Mirrors topic registration: tear down in `willDestroy` via `_teardownEvents`.\n     */\n    async _setupEvents() {\n        await this.prepareSubscriptionEventsFn();\n        if (!this._isAlive() || this.get('_hasEventsRegistered')) return;\n\n        const events = this.get('subscriptionEvents') as SubscriptionEvent[];\n        if (!events || events.length === 0) return;\n\n        const pigeon = this.get('pigeon');\n        for (const { event, handler } of events) {\n            pigeon.on(event, this, handler);\n        }\n\n        this.set('_hasEventsRegistered', true);\n        this.set('_registeredEventsSnapshot', events.slice());\n    },\n\n    /**\n     * Removes pigeon listeners registered for this mode instance.\n     */\n    _teardownEvents() {\n        const snapshot = this.get('_registeredEventsSnapshot');\n        if (!snapshot || snapshot.length === 0) return;\n\n        const pigeon = this.get('pigeon');\n        for (const { event, handler } of snapshot) {\n            pigeon.off(event, this, handler);\n        }\n        this.set('_registeredEventsSnapshot', null);\n        this.set('_hasEventsRegistered', false);\n    },\n\n    /**\n     * For modes with `subscriptionTopics` but no deferred fetch, subscribe to `connect` so topics are\n     * registered when the subscription service connects (also handles already-connected boot).\n     */\n    async _setupSubscription() {\n        await this.prepareSubscriptionTopicsFn();\n        if (!this._isAlive()) return;\n\n        const topics = this.get('subscriptionTopics');\n        if (!topics || topics.length === 0) return;\n\n        if (this.get('connected')) {\n            this._registerTopics();\n            return;\n        }\n\n        this._attachConnectListener();\n    },\n\n    /**\n     * Registers the subscription topics with the subscription service.\n     */\n    _registerTopics() {\n        if (this.get('_hasTopicsRegistered')) return;\n\n        const topics = this.get('subscriptionTopics');\n        if (!topics || topics.length === 0) return;\n\n        const { priority, normal, custom } = prioritizedTopics(topics);\n        if (priority.length > 0) {\n            this.get('pigeon').registerPriorityTopics(priority);\n        }\n        if (normal.length > 0) {\n            this.get('pigeon').registerTopics(normal);\n        }\n        for (const { topic, eventName } of custom) {\n            (this.get('pigeon') as any).registerPriorityTopic(topic, eventName);\n        }\n\n        this.set('_hasTopicsRegistered', true);\n        this.set('_registeredTopicsSnapshot', topics.slice());\n    },\n\n    /**\n     * Attaches the subscription connect listener to the subscription service.\n     */\n    _attachConnectListener() {\n        if (this.get('connected')) {\n            this._onConnect();\n            return;\n        }\n\n        if (this.get('_connectListenerActive')) return;\n        this.get('pigeon').on('connect', this, this._onConnect);\n        this.set('_connectListenerActive', true);\n    },\n\n    /**\n     * Tears down the subscription connect listener to prevent memory leaks.\n     */\n    _teardownConnectListener() {\n        if (!this.get('_connectListenerActive')) return;\n        this.get('pigeon').off('connect', this, this._onConnect);\n        this.set('_connectListenerActive', false);\n    },\n\n    /**\n     * Handle the subscription connect event.\n     */\n    async _onConnect() {\n        try {\n            await this.preConnectFn();\n            if (!this._isAlive()) return;\n\n            this._registerTopics();\n            if (this.get('_pendingScheduledFetchOnConnect')) {\n                this.set('_pendingScheduledFetchOnConnect', false);\n                await this.postConnectFn();\n            }\n        } finally {\n            this._teardownConnectListener();\n        }\n    },\n\n    /**\n     * @override\n     * A function that prepares the subscription topics for the mode.\n     */\n    prepareSubscriptionTopicsFn(): Promise<void> {\n        return Promise.resolve();\n    },\n\n    /**\n     * @override\n     * Prepare `subscriptionEvents` before they are registered (e.g. derive event names from session).\n     * Called from `_setupEvents` during mode init.\n     */\n    prepareSubscriptionEventsFn(): Promise<void> {\n        return Promise.resolve();\n    },\n\n    /**\n     * @override\n     * Runs before the subscription connect event.\n     */\n    preConnectFn(): Promise<void> {\n        return Promise.resolve();\n    },\n\n    /**\n     * @override\n     * Runs after the subscription connect event.\n     */\n    postConnectFn(): Promise<void> {\n        return Promise.resolve();\n    }\n});\n\ntype PrioritizedTopics = { priority: string[]; normal: string[]; custom: { topic: string; eventName: string }[] };\nconst prioritizedTopics = (all: SubscriptionTopic[]): PrioritizedTopics =>\n    all.reduce(\n        (acc, topic) => {\n            if (typeof topic === 'string') {\n                acc.normal.push(topic);\n            } else if (topic.eventName) {\n                // Topics with custom event names must be registered individually\n                acc.custom.push({ topic: topic.topic, eventName: topic.eventName });\n            } else if (topic.type === 'normal') {\n                acc.normal.push(topic.topic);\n            } else if (topic.type === 'priority') {\n                acc.priority.push(topic.topic);\n            }\n            return acc;\n        },\n        { priority: [], normal: [], custom: [] } as PrioritizedTopics\n    );\n\nexport default ModeSubscriptionFactory;\n/** Runtime instance of {@link ModeSubscriptionFactory} (includes Ember `get` / `set`). */\nexport type ModeSubscriptionModel = InstanceType<typeof ModeSubscriptionFactory>;\nexport type SubscriptionTopic = { topic: string; type: 'priority' | 'normal'; eventName?: string } | string;\n\n/** One pigeon Evented subscription: `event` name and `handler` passed to `pigeon.on(event, this, handler)`. */\nexport type SubscriptionEvent = {\n    event: keyof PigeonEvents;\n    handler: (this: ModeSubscriptionModel, ...args: unknown[]) => void;\n};\n","import { inject } from '@ember/service';\nimport type { AppContext } from 'web-directory/utils/apps';\nimport ConversationMixin from 'web-directory/mixins/conversation';\nimport { ModeModelFactory, type ModeItemsMap } from './base';\n\n// Using this endpoint for POC. Confirm whether this is the desired endpoint and payload once feature work begins.\nconst BASE_URI_V2 = 'api/v2/externalcontacts/contacts';\nconst PAGE_SIZE = 20;\n\nexport default ModeModelFactory.extend(ConversationMixin, {\n    id: 'externalContact',\n    icon: 'fa/address-book-regular',\n    fetchDataSchedule: 'activate',\n    showSidebarItemCountBadge: false,\n    hasInterapptions: true,\n    mainStageComponent: 'mode-manager/main-stages/external-contact-main-stage',\n\n    applicationService: inject('application'),\n\n    /**\n     * All items in ExternalContactMode are external contacts (plain objects).\n     * ExternalContactAppContext has no payload — only type and id.\n     */\n    convertToAppContexts(allItems: ModeItemsMap): AppContext[] {\n        const contexts: AppContext[] = [];\n\n        allItems.forEach((item: any) => {\n            if (!item) return;\n            const id = item.id;\n            if (!id) return;\n            contexts.push({ type: 'externalContact', id });\n        });\n\n        return contexts;\n    },\n\n    baseUri(): string {\n        const applicationService = this.get('applicationService');\n        return applicationService.pcV2Uri(BASE_URI_V2);\n    },\n\n    fetchFn(): Promise<any[]> {\n        return this.makeRequest(this.baseUri(), {\n            method: 'get',\n            data: { pageSize: PAGE_SIZE }\n        }).then((response: { entities: any[] }) => response.entities || []);\n    }\n});\n","import { inject } from '@ember/service';\nimport { Models } from 'purecloud-platform-client-internal-v2';\nimport ConversationMixin from 'web-directory/mixins/conversation';\nimport type { AppContext, AnalyticsConversationAppContext } from 'web-directory/utils/apps';\nimport { ModeModelFactory, type ModeItemsMap } from './base';\n\n// Using this endpoint for POC. Confirm whether this is the desired endpoint and payload once feature work begins.\nconst BASE_URI_V2 = 'api/v2/analytics/conversations/details/query';\nconst PAGE_SIZE = 20;\nconst INTERVAL_DAYS = 7;\n\n/**\n * Builds an ISO 8601 interval string covering the last `days` days up to now.\n */\nfunction buildInterval(days: number): string {\n    const end = new Date();\n    const start = new Date(end.getTime() - days * 24 * 60 * 60 * 1000);\n    return `${start.toISOString()}/${end.toISOString()}`;\n}\n\nexport default ModeModelFactory.extend(ConversationMixin, {\n    id: 'history',\n    icon: 'fa/clock-rotate-left-regular',\n    fetchDataSchedule: 'activate',\n    showSidebarItemCountBadge: false,\n    hasInterapptions: true,\n    mainStageComponent: 'mode-manager/main-stages/history-main-stage',\n\n    applicationService: inject('application'),\n    sessionService: inject('session'),\n\n    /**\n     * Maps history items to AnalyticsConversationAppContext[].\n     * Each item is keyed by conversationId (normalized to `id`) and wrapped in the analyticsConversation context type.\n     */\n    convertToAppContexts(allItems: ModeItemsMap): AppContext[] {\n        const contexts: AnalyticsConversationAppContext[] = [];\n\n        allItems.forEach((item: Models.AnalyticsConversationWithoutAttributes & { id: string }) => {\n            if (!item || !item.id) return;\n\n            contexts.push({\n                type: 'analyticsConversation',\n                id: item.id,\n                payload: item\n            });\n        });\n\n        return contexts;\n    },\n\n    baseUri(): string {\n        const applicationService = this.get('applicationService');\n        return applicationService.pcV2Uri(BASE_URI_V2);\n    },\n\n    /**\n     * Fetches recent conversations for the current user via the analytics details query API.\n     * Returns items with an `id` field (mapped from `conversationId`) so `itemsArrayToMap` can key them.\n     */\n    fetchFn(): Promise<Array<Models.AnalyticsConversationWithoutAttributes & { id: string }>> {\n        const userId = (this.get('sessionService') as any).get('person.guid');\n\n        const body: Models.ConversationQuery = {\n            interval: buildInterval(INTERVAL_DAYS),\n            order: 'desc',\n            orderBy: 'conversationEnd',\n            paging: { pageSize: PAGE_SIZE, pageNumber: 1 },\n            segmentFilters: [\n                {\n                    type: 'and',\n                    predicates: [\n                        {\n                            type: 'dimension',\n                            dimension: 'userId',\n                            operator: 'matches',\n                            value: userId\n                        }\n                    ]\n                }\n            ]\n        };\n\n        return this.makeRequest(this.baseUri(), {\n            method: 'post',\n            dataType: 'json',\n            data: body\n        }).then((response: { conversations?: Models.AnalyticsConversationWithoutAttributes[] }) => {\n            const conversations = response.conversations || [];\n            return conversations\n                .filter((c): c is Models.AnalyticsConversationWithoutAttributes & { conversationId: string } => {\n                    return !!c.conversationId;\n                })\n                .map(c => ({ ...c, id: c.conversationId! }));\n        });\n    }\n});\n","import { computed } from '@ember/object';\nimport { readOnly } from '@ember/object/computed';\nimport { inject } from '@ember/service';\nimport type { WorkitemInteraction } from '@genesys/genesys-cloud-conversation-utils';\nimport type { Maybe } from 'web-directory/types';\nimport type { AppContext } from 'web-directory/utils/apps';\nimport { fetchQueueName } from 'web-directory/utils/participant-name';\nimport {\n    ModeModelFactory,\n    allItemsMapToValuesArray,\n    DEFAULT_MODE_SORT_OPTIONS,\n    getModeFilterPanelKey,\n    type ModeItemsMap,\n    type ModeRosterGroup,\n    type ModeSearchAndFilterOptions,\n    type ModeSortOption\n} from './base';\nimport { countInactiveFilterCategories, isWorkitem, type InactiveModeFilterState } from './utils';\n\nconst FILTER_PANEL_COMPONENT = 'mode-manager/roster-side-panels/inactive-mode-filter-panel';\n\n// ─── Inactive mode sort resolvers ────────────────────────────────────────────\n\n/** Resolve dateDue as epoch ms for a single workitem. Items without dateDue sort to the end. */\nfunction resolveItemDateDue(item: any): number {\n    const dateDue = item?.workitem?.dateDue;\n    return dateDue ? new Date(dateDue).getTime() : Infinity;\n}\n\n/** Resolve the earliest dateDue across a group's items. */\nfunction resolveGroupEarliestDateDue(group: ModeRosterGroup): number {\n    const items: any[] = group.items || [];\n    if (items.length === 0) return Infinity;\n    return Math.min(...items.map(resolveItemDateDue));\n}\n\n/** Resolve the latest dateDue across a group's items. */\nfunction resolveGroupLatestDateDue(group: ModeRosterGroup): number {\n    const items: any[] = group.items || [];\n    if (items.length === 0) return 0;\n    return Math.max(\n        ...items.map(i => {\n            const dateDue = i?.workitem?.dateDue;\n            return dateDue ? new Date(dateDue).getTime() : 0;\n        })\n    );\n}\n\n/** Resolve priority for a single workitem. Items without priority sort to the end. */\nfunction resolveItemPriority(item: any): number {\n    return item?.workitem?.priority ?? Infinity;\n}\n\n/** Resolve the highest priority (lowest number) across a group's items. */\nfunction resolveGroupHighestPriority(group: ModeRosterGroup): number {\n    const items: any[] = group.items || [];\n    if (items.length === 0) return Infinity;\n    return Math.min(...items.map(resolveItemPriority));\n}\n\n/** Resolve the lowest priority (highest number) across a group's items. */\nfunction resolveGroupLowestPriority(group: ModeRosterGroup): number {\n    const items: any[] = group.items || [];\n    if (items.length === 0) return 0;\n    return Math.max(...items.map(i => i?.workitem?.priority ?? 0));\n}\n\nconst INACTIVE_SORT_OPTIONS: ModeSortOption[] = [\n    ...DEFAULT_MODE_SORT_OPTIONS,\n    {\n        value: 'dueSoon',\n        translationKey: 'modeRoster.sort.dueSoon',\n        groupSort: { resolve: resolveGroupEarliestDateDue, direction: 'asc' },\n        itemSort: { resolve: resolveItemDateDue, direction: 'asc' }\n    },\n    {\n        value: 'dueLater',\n        translationKey: 'modeRoster.sort.dueLater',\n        groupSort: { resolve: resolveGroupLatestDateDue, direction: 'desc' },\n        itemSort: { resolve: resolveItemDateDue, direction: 'desc' }\n    },\n    {\n        value: 'highPriority',\n        translationKey: 'modeRoster.sort.highPriority',\n        groupSort: { resolve: resolveGroupHighestPriority, direction: 'desc' },\n        itemSort: { resolve: resolveItemPriority, direction: 'desc' }\n    },\n    {\n        value: 'lowPriority',\n        translationKey: 'modeRoster.sort.lowPriority',\n        groupSort: { resolve: resolveGroupLowestPriority, direction: 'asc' },\n        itemSort: { resolve: resolveItemPriority, direction: 'asc' }\n    }\n];\n\nexport default ModeModelFactory.extend({\n    id: 'inactive',\n    icon: 'fa/clipboard-list-regular',\n    fetchDataSchedule: 'boot',\n    fetchFnPopulatesAllItemsDirectly: true,\n    rosterCardComponent: 'mode-manager/roster-cards/interaction-group',\n    showSidebarItemCountBadge: true,\n    hasInterapptions: true,\n\n    sort: {\n        enabled: true,\n        options: INACTIVE_SORT_OPTIONS,\n        defaultSortOrder: 'createdAtDesc'\n    },\n\n    workitemModeService: inject('modes/workitem-mode-service'),\n    rosterSidePanelService: inject('modes/roster-side-panel-service'),\n    sessionService: inject('session'),\n    storeService: inject('store'),\n    loggerService: inject('stashLogger'),\n    intlService: inject('intl'),\n\n    // --- Feature toggles ---\n    acdDisconnectedConversationIconsFT: readOnly('sessionService.features.PURE-6472_Disconnected_Conversation_Icons'),\n    acdExternalContactDivNameFT: readOnly('sessionService.features.PURE-3835'),\n    acdExternalContactWorkitemsDivNameFT: readOnly('sessionService.features.PURE-6191'),\n    acdFacebookIconUpdateFT: readOnly('sessionService.features.AI-1025'),\n    acdTwitterXIconUpdateFT: readOnly('sessionService.features.PURE-5797_MESSAGING_TWITTER_PRIVATE_DIRECT_MESSAGES'),\n    useNewNav: readOnly('sessionService.useNewNav'),\n\n    /**\n     * Roster header actions. Recomputed when filterState changes so the filter badge stays in sync.\n     */\n    headerActions: computed('filterState', function (this: any) {\n        return [\n            {\n                id: 'filter',\n                icon: 'fa/filter-regular',\n                tooltip: 'modeRoster.sidePanel.filter.tooltip',\n                badge: countInactiveFilterCategories(this.get('filterState')),\n                onAction: () => {\n                    this.toggleFilterSidePanel();\n                }\n            }\n        ];\n    }),\n\n    // --- Main-stage adapter: these feed acd-interactions-panel-v2/interaction via mode-manager/template.hbs ---\n    /**\n     * Inactive mode has no conversations — always an empty array.\n     * Required by `acd-interactions-panel-v2/interaction` (`activeInteractions=`).\n     */\n    activeInteractions: Object.freeze([]),\n\n    /**\n     * All inactive workitems from this mode's allItems Map. Every item in the Inactive\n     * mode's roster is a workitem (parked, disconnected, idle, declined).\n     */\n    inactiveWorkitems: computed('allItems', function (this: any): WorkitemInteraction[] {\n        return allItemsMapToValuesArray(this.get('allItems'));\n    }),\n\n    /**\n     * Alias for `inactiveWorkitems` using the attribute name expected by\n     * `acd-interactions-panel-v2/interaction` (`activeWorkitems=`). This allows\n     * `mode-manager/template.hbs` to bind uniformly via `displayedMainStageMode.activeWorkitems`\n     * regardless of which mode is displayed.\n     */\n    activeWorkitems: readOnly('inactiveWorkitems'),\n\n    /**\n     * The selected workitem, if the committed selection is a workitem.\n     * Gated by this mode's id so selections belonging to other modes resolve to null.\n     */\n    selectedWorkitem: computed(\n        'rosterSelectionService.selection',\n        'id',\n        function (this: any): Maybe<WorkitemInteraction> {\n            const selection = this.get('rosterSelectionService.selection');\n            if (selection?.modeId !== this.get('id')) return null;\n            const payload = selection?.payload;\n            return payload && isWorkitem(payload) ? payload : null;\n        }\n    ),\n\n    init() {\n        this._super(...arguments);\n\n        // Register this mode with the workitem-mode-service so the shared\n        // processing chain can route inactive workitems here.\n        // Note: This mode does NOT subscribe to pigeon workitem topics or events.\n        // The active mode owns the single workitem pigeon subscription and forwards\n        // all events through the shared workitem-mode-service processing chain,\n        // which routes items to this mode's roster based on assignment state.\n        this.get('workitemModeService').registerInactiveMode(this);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        this.get('workitemModeService').unregisterInactiveMode(this);\n    },\n\n    /**\n     * Fetches inactive workitems and enqueues them through the shared processing chain.\n     * The chain's updateRoster step will route them to this mode's roster.\n     */\n    async fetchFn(): Promise<WorkitemInteraction[]> {\n        const inactiveWorkitems = await this.get('workitemModeService').fetchInactive();\n        if (!this._isAlive()) return [];\n\n        for (const inactiveWorkitem of inactiveWorkitems) {\n            this.get('workitemModeService').processEvent({\n                payload: inactiveWorkitem,\n                eventSource: 'api'\n            });\n        }\n\n        if (inactiveWorkitems.length > 0) {\n            this.set('isRosterItemPending', true);\n        }\n\n        return []; // chain handles allItems via setItem (async, after fetchData replaces the map)\n    },\n\n    /**\n     * All items in InactiveMode are workitems (for now).\n     */\n    convertToAppContexts(allItems: ModeItemsMap): AppContext[] {\n        const contexts: AppContext[] = [];\n\n        allItems.forEach((item: any) => {\n            if (!item) return;\n            const id = item.id;\n            if (!id) return;\n            contexts.push({ type: 'workitem', payload: item, id });\n        });\n\n        return contexts;\n    },\n\n    applySearchAndFilterFn(items: any[], options: ModeSearchAndFilterOptions): any[] {\n        const query = options.searchQuery.toLowerCase();\n        const filterState = options.filterState as InactiveModeFilterState | null;\n\n        return items.filter(item => {\n            // Apply filter state\n            if (filterState) {\n                if (filterState.statuses && filterState.statuses.length > 0) {\n                    const statusCategory: string = item?.workitem?.statusCategory || '';\n                    if (!filterState.statuses.includes(statusCategory)) return false;\n                }\n                if (filterState.routingStates && filterState.routingStates.length > 0) {\n                    const assignmentState: string = item?.workitem?.assignmentState || '';\n                    if (!filterState.routingStates.includes(assignmentState)) return false;\n                }\n                if (filterState.queueIds && filterState.queueIds.length > 0) {\n                    const queueId: string = item?.workitem?.queueId || '';\n                    if (!filterState.queueIds.includes(queueId)) return false;\n                }\n                if (filterState.worktypeIds && filterState.worktypeIds.length > 0) {\n                    const typeId: string = item?.workitem?.typeId || item?.workitem?.type?.id || '';\n                    if (!filterState.worktypeIds.includes(typeId)) return false;\n                }\n            }\n\n            // If no search query, item passes\n            if (!query) return true;\n\n            // Text search\n            const name = item.workitem?.name || '';\n            const id = item.id || '';\n            const description = item.workitem?.description || '';\n            if (name.toLowerCase().includes(query)) return true;\n            if (id.toLowerCase().includes(query)) return true;\n            if (description.toLowerCase().includes(query)) return true;\n            return false;\n        });\n    },\n\n    // --- Actions ---\n\n    /**\n     * Returns an inactive workitem back to active mode by patching its assignment state to \"Connected\".\n     * Clears the mainstage on success.\n     */\n    returnToActiveMode(workitem: WorkitemInteraction): void {\n        this.get('workitemModeService')\n            .returnToActiveMode(workitem)\n            .catch((error: any) => {\n                if (error?.payload?.code === 'too.many.requests.retry.after') {\n                    this.displayError('purecloud.acdInteraction.workitem.errors.rateLimit');\n                } else {\n                    this.displayError('purecloud.acdInteraction.workitem.errors.returnToActive');\n                }\n            });\n    },\n\n    toggleFilterSidePanel() {\n        this.get('rosterSidePanelService').toggle({\n            componentName: FILTER_PANEL_COMPONENT,\n            panelKey: getModeFilterPanelKey(this.get('id')),\n            context: { mode: this }\n        });\n    },\n\n    async loadQueue(queueId: string): Promise<string> {\n        if (queueId) {\n            try {\n                const name = await fetchQueueName(queueId, this.get('storeService'), this.get('loggerService'));\n                if (!this._isAlive()) return '';\n                if (name) return name;\n            } catch (error) {\n                this.get('loggerService').error('Inactive mode: Could not fetch queue name', { error });\n            }\n        }\n        return this.get('intlService').t('purecloud.acdInteraction.unknown');\n    }\n});\n","import { get } from '@ember/object';\nimport CallInteraction from 'web-directory/models/interaction/call-interaction';\nimport CallbackInteraction from 'web-directory/models/interaction/callback-interaction';\nimport EmailInteraction from 'web-directory/models/interaction/email-interaction';\nimport MessageInteraction from 'web-directory/models/interaction/message-interaction';\nimport type { ConversationType } from 'web-directory/services/modes/conversation-mode-service';\nimport { getRawParticipantName } from 'web-directory/utils/participant-name';\nimport { ModeRosterGroup } from './base';\n\n// ─── General Utilities ───────────────────────────────────────────────────────\n\n/**\n * Some values that come through have variations of our basic string types. A common one is the SafeString type,\n * where we just have to check for the `toString` method.\n * @param value - The value to convert to a plain string.\n * @returns The plain string value.\n */\nexport function plainString(value: unknown): string {\n    if (typeof value === 'string') return value;\n    if (value?.toString) return value.toString();\n    return '';\n}\n\n/**\n * Determines the correct Interaction model class for a raw conversation payload\n * by inspecting participant communication arrays. Mirrors the detection logic\n * in `acd-utilities.getInteractionTypeFromCP`.\n */\nexport function resolveInteractionModel(payload: any, userId: string): any {\n    const participants: any[] = payload?.participants || [];\n\n    const myselfAgent = [...participants]\n        .reverse()\n        .find((p: any) => p.userId === userId && p.purpose?.toLowerCase() === 'agent');\n\n    const isCallback = myselfAgent?.callbacks?.length > 0;\n    if (isCallback) return CallbackInteraction;\n\n    if (participants.some((p: any) => p.calls?.length > 0)) return CallInteraction;\n    if (participants.some((p: any) => p.emails?.length > 0)) return EmailInteraction;\n    if (participants.some((p: any) => p.messages?.length > 0)) return MessageInteraction;\n\n    return null;\n}\n\n/**\n * Determines the conversation type string from a raw conversation payload\n * by inspecting participant communication arrays. Uses the same detection\n * priority as `resolveInteractionModel`: callback > call > email > message.\n * acdChat is deprecated and not supported in the Modes architecture.\n *\n * @param payload - Raw conversation payload from pigeon or API.\n * @param userId - The current user's ID, used to locate the agent participant.\n * @returns The resolved conversation type, or `null` if no type can be determined.\n */\nexport function resolveConversationType(payload: any, userId: string): ConversationType | null {\n    const participants: any[] = payload?.participants || [];\n\n    const myselfAgent = [...participants]\n        .reverse()\n        .find((p: any) => p.userId === userId && p.purpose?.toLowerCase() === 'agent');\n\n    const isCallback = myselfAgent?.callbacks?.length > 0;\n    if (isCallback) return 'callback';\n\n    if (participants.some((p: any) => p.calls?.length > 0)) return 'call';\n    if (participants.some((p: any) => p.emails?.length > 0)) return 'email';\n    if (participants.some((p: any) => p.messages?.length > 0)) return 'message';\n\n    return null;\n}\n\n// ─── Roster Utilities ────────────────────────────────────────────────────────\n\n/**\n * Returns true if the item is a WorkitemInteraction (has a `.workitem` property).\n */\nexport function isWorkitem(item: any): boolean {\n    return !!item?.workitem;\n}\n\n/**\n * Returns the externalContactId for an item, handling both conversations and workitems.\n */\nexport function getExternalContactId(item: any): string | undefined {\n    if (isWorkitem(item)) {\n        return get(item, 'customer.externalContactId') || undefined;\n    }\n    return get(item, 'externalContactId') || undefined;\n}\n\n/**\n * Returns whether an item is in an alerting state, handling both conversations and workitems.\n */\nexport function isItemAlerting(item: any): boolean {\n    if (isWorkitem(item)) {\n        return get(item, 'workitem.assignmentState') === 'Alerting';\n    }\n    return !!get(item, 'isAlerting');\n}\n\n/**\n * Returns the sort timestamp for an item, handling both conversations and workitems.\n *\n * Mirrors the legacy `acd-interactions-panel` roster (`decoratedGroups`):\n * - Alerting items use `Date.now()`, matching legacy's alerting override.\n * - Non-alerting workitems sort by `workitem.dateCreated`.\n * - Non-alerting conversations sort by `startTimestamp`.\n */\nexport function getItemSortTimestamp(item: any): number {\n    if (isItemAlerting(item)) {\n        return Date.now();\n    }\n    if (isWorkitem(item)) {\n        const dateCreated = get(item, 'workitem.dateCreated');\n        return new Date(dateCreated).valueOf() || Date.now();\n    }\n\n    return get(item, 'startTimestamp') || Date.now();\n}\n\n/**\n * Builds roster groups for alerting items, isolating each alerting item into its own\n * single-item group.\n *\n * Intended to be sourced directly from a mode's items (e.g. `allItems` values) rather than its\n * filtered/sorted `visibleItems`, so alerting cards stay visible regardless of the current mode's\n * filters or search query. Used to render alerting cards in a pinned section that persists\n * across every mode.\n *\n * @param items - Candidate items; non-alerting items are ignored. Handles conversations and workitems.\n * @returns Alerting groups, newest alert first.\n */\nexport function buildAlertingGroups(items: any[]): ModeRosterGroup[] {\n    const alertingItems: ModeRosterGroup[] = items\n        .filter(item => isItemAlerting(item))\n        .map(item => {\n            const participant = get(item, 'participantForCustomer');\n            const rawName = participant ? getRawParticipantName(participant) : null;\n            const group: ModeRosterGroup = {\n                id: get(item, 'id'),\n                groupId: '', // alerting items are never grouped with others\n                items: [item],\n                sortName: rawName?.toLocaleLowerCase() || ''\n            };\n\n            return group;\n        });\n\n    // Newest alert should be on top (by sort timestamp: conversations use startTimestamp, workitems use dateCreated)\n    return alertingItems.sort((a, b) => {\n        const aTs = getItemSortTimestamp(a.items[0]);\n        const bTs = getItemSortTimestamp(b.items[0]);\n        return bTs - aTs;\n    });\n}\n\n// ─── Filter Utilities ────────────────────────────────────────────────────────\n\n/**\n * Shape of the active mode's committed filter state.\n * Only keys with active selections are present.\n */\nexport type ActiveModeFilterState = {\n    channels?: string[];\n    queueIds?: string[];\n    direction?: 'inbound' | 'outbound';\n};\n\nexport interface IsInteractionChannelOptionAvailableArgs {\n    /**\n     * The permissions service. `get` reads its cached `can*`/`has*` computeds;\n     * `validateDonutPermission` checks a raw donut permission string.\n     */\n    permissions: {\n        get(key: string): boolean;\n        validateDonutPermission(permission: string, division?: string): boolean;\n    };\n}\n\n/**\n * A single interaction channel the roster can be filtered by. Each option owns both how it\n * matches an interaction (`type` + optional `subMessageType`) and whether the current user is\n * permitted to see it (`isAvailable`), so the two cannot drift apart.\n */\nexport type InteractionChannelOption = {\n    /** Stable filter value persisted in `ActiveModeFilterState.channels`. */\n    value: string;\n    translationKey: string;\n    /**\n     * Interaction model `type` this option matches. `'workitem'` is synthetic — workitems have no\n     * `type` property and are identified by the presence of `.workitem` (see {@link isWorkitem}).\n     */\n    type: string;\n    /** For `message` interactions, the `subMessageType` that must also match. */\n    subMessageType?: string;\n    /**\n     * Predicate deciding whether the current user may see this option. Uses the `accept` family of\n     * permissions — \"can this agent be routed this interaction type\" — because the roster filter\n     * operates on inbound interactions rather than outbound creation.\n     */\n    isAvailable: (context: IsInteractionChannelOptionAvailableArgs) => boolean;\n};\n\nconst TRANSLATION_KEY_PREFIX = 'modeRoster.sidePanel.filter.interactionChannelOption';\nconst MESSAGE_ACCEPT_PERMISSION = 'conversation:message:accept';\n\n/** Shared gate for messaging subtypes — donut permissions stop at `conversation:message:*`. */\nconst isMessageAvailable = ({ permissions }: IsInteractionChannelOptionAvailableArgs): boolean =>\n    permissions.validateDonutPermission(MESSAGE_ACCEPT_PERMISSION);\n\n/**\n * Builds a messaging option. All messaging subtypes share one permission and therefore appear or\n * disappear together; `webmessaging` is the sole exception and is declared explicitly below.\n */\nfunction createMessagingOption(value: string, subMessageType: string): InteractionChannelOption {\n    return {\n        value,\n        translationKey: `${TRANSLATION_KEY_PREFIX}.${value}`,\n        type: 'message',\n        subMessageType,\n        isAvailable: isMessageAvailable\n    };\n}\n\n/**\n * The full interaction channel options list — single source of truth for both the filter panel's option\n * list and {@link matchesInteractionChannelFilter}'s matching rules.\n *\n * Permission mapping:\n *  - voice        → `hasUnifiedCommunications` AND `conversation:call:accept`\n *  - callback     → `conversation:callback:accept`\n *  - email        → `conversation:email:accept`\n *  - workitem     → `permissions.canViewWorkitem` (`workitems:workitem:view`).\n *  - webmessage → `conversation:message:accept` AND `conversation:webmessaging:accept`\n *  - other message        → `conversation:message:accept`\n *\n *\n * `validateDonutPermission` is a plain method rather than a computed, so a consumer's availability\n * computed must depend on `donutPermissions` and `allowedOrgPermissions`.\n */\nexport const INTERACTION_CHANNEL_OPTIONS: InteractionChannelOption[] = [\n    {\n        value: 'voice',\n        translationKey: `${TRANSLATION_KEY_PREFIX}.voice`,\n        type: 'call',\n        isAvailable: ({ permissions }) =>\n            permissions.get('hasUnifiedCommunications') &&\n            permissions.validateDonutPermission('conversation:call:accept')\n    },\n    {\n        value: 'callback',\n        translationKey: `${TRANSLATION_KEY_PREFIX}.callback`,\n        type: 'callback',\n        isAvailable: ({ permissions }) => permissions.validateDonutPermission('conversation:callback:accept')\n    },\n    {\n        value: 'email',\n        translationKey: `${TRANSLATION_KEY_PREFIX}.email`,\n        type: 'email',\n        isAvailable: ({ permissions }) => permissions.validateDonutPermission('conversation:email:accept')\n    },\n    createMessagingOption('apple', 'apple'),\n    createMessagingOption('facebookMessenger', 'facebook'),\n    createMessagingOption('instagram', 'instagram'),\n    createMessagingOption('openMessaging', 'open'),\n    createMessagingOption('sms', 'sms'),\n    createMessagingOption('twitterX', 'twitter'),\n    {\n        // The one messaging subtype with a dedicated permission. Mirrors the transfer-target gating\n        // in `target-dropdown`, which requires both for `subMessageType === 'webmessaging'`.\n        value: 'webmessaging',\n        translationKey: `${TRANSLATION_KEY_PREFIX}.webmessaging`,\n        type: 'message',\n        subMessageType: 'webmessaging',\n        isAvailable: ({ permissions }) =>\n            permissions.validateDonutPermission(MESSAGE_ACCEPT_PERMISSION) &&\n            permissions.validateDonutPermission('conversation:webmessaging:accept')\n    },\n    createMessagingOption('whatsapp', 'whatsapp'),\n    {\n        value: 'workitem',\n        translationKey: `${TRANSLATION_KEY_PREFIX}.workitem`,\n        type: 'workitem',\n        isAvailable: ({ permissions }) => permissions.get('canViewWorkitem')\n    }\n];\n\n/**\n * Filters the `Interaction Channel` dropdown options to the ones the current user is permitted to see.\n */\nexport function getAvailableInteractionChannelOptions(\n    context: IsInteractionChannelOptionAvailableArgs\n): InteractionChannelOption[] {\n    return INTERACTION_CHANNEL_OPTIONS.filter(option => option.isAvailable(context));\n}\n\n/**\n * Returns true if the interaction matches at least one of the selected channel filters.\n */\nexport function matchesInteractionChannelFilter(interaction: any, channels: string[]): boolean {\n    if (!channels || channels.length === 0) return true;\n\n    // Workitems don't have a 'type' property — identify by presence of .workitem\n    const interactionType: string = interaction?.workitem ? 'workitem' : get(interaction, 'type') || '';\n\n    for (const channel of channels) {\n        const option = INTERACTION_CHANNEL_OPTIONS.find(({ value }) => value === channel);\n        if (!option) continue;\n\n        if (interactionType !== option.type) continue;\n\n        // Top-level type match (voice, callback, email, workitem) — no subtype check needed\n        if (!option.subMessageType) return true;\n\n        // Message subtype check\n        const subType: string = get(interaction, 'subMessageType') || '';\n        if (subType === option.subMessageType) return true;\n    }\n\n    return false;\n}\n\n/**\n * Returns true if the interaction's current user participant belongs to one of the selected queues.\n */\nexport function matchesQueueFilter(interaction: any, queueIds: string[]): boolean {\n    if (!queueIds || queueIds.length === 0) return true;\n\n    const participantQueueId: string = get(interaction, 'participantForCurrentUser.queueId') || '';\n    return queueIds.includes(participantQueueId);\n}\n\n/**\n * Returns true if the interaction's direction matches the selected direction filter.\n * Direction is read from the current user's first communication object.\n */\nexport function matchesDirectionFilter(interaction: any, direction: 'inbound' | 'outbound'): boolean {\n    const type: string = get(interaction, 'type') || '';\n\n    let communicationDirection: string | undefined;\n\n    switch (type) {\n        case 'call':\n            communicationDirection = get(interaction, 'participantForCurrentUser.calls.firstObject.direction');\n            break;\n        case 'email':\n            communicationDirection = get(interaction, 'participantForCurrentUser.emails.firstObject.direction');\n            break;\n        case 'message':\n            communicationDirection = get(interaction, 'participantForCurrentUser.messages.firstObject.direction');\n            break;\n        case 'callback':\n            communicationDirection = get(interaction, 'participantForCurrentUser.callbacks.firstObject.direction');\n            break;\n        default:\n            return true; // Unknown type — don't filter out\n    }\n\n    if (!communicationDirection) return true;\n\n    return communicationDirection.toLowerCase() === direction;\n}\n\n/**\n * Applies all active filters to a single interaction. Returns true if the interaction passes all filters.\n */\nexport function matchesAllFilters(interaction: any, filterState: ActiveModeFilterState | null): boolean {\n    if (!filterState) return true;\n\n    if (filterState.channels && filterState.channels.length > 0) {\n        if (!matchesInteractionChannelFilter(interaction, filterState.channels)) return false;\n    }\n\n    if (filterState.queueIds && filterState.queueIds.length > 0) {\n        if (!matchesQueueFilter(interaction, filterState.queueIds)) return false;\n    }\n\n    if (filterState.direction) {\n        if (!matchesDirectionFilter(interaction, filterState.direction)) return false;\n    }\n\n    return true;\n}\n\n/**\n * Applies the active mode's filter criteria to a roster item.\n *\n * Shared by the roster's search-and-filter pass and by the hidden-item count so the two can never\n * disagree about what \"filtered out\" means.\n */\nexport function matchesActiveModeFilters(item: any, filterState: ActiveModeFilterState | null): boolean {\n    if (!filterState) return true;\n\n    if (isWorkitem(item)) {\n        const channels = filterState.channels ?? [];\n        if (channels.length === 0) return true;\n        return channels.includes('workitem');\n    }\n\n    return matchesAllFilters(item, filterState);\n}\n\n/**\n * Counts how many filter categories are active.\n */\nexport function countActiveFilterCategories(filterState: ActiveModeFilterState | null | undefined): number {\n    if (!filterState) return 0;\n    let count = 0;\n    if (filterState.channels && filterState.channels.length > 0) count++;\n    if (filterState.queueIds && filterState.queueIds.length > 0) count++;\n    if (filterState.direction) count++;\n    return count;\n}\n\n/**\n * Filter state shape for the inactive (workitem) mode.\n * Only keys with active selections are present.\n */\nexport type InactiveModeFilterState = {\n    statuses?: string[];\n    routingStates?: string[];\n    queueIds?: string[];\n    worktypeIds?: string[];\n};\n\n/**\n * Counts how many filter categories are active (0–4) for the inactive mode.\n */\nexport function countInactiveFilterCategories(filterState: InactiveModeFilterState | null | undefined): number {\n    if (!filterState) return 0;\n    let count = 0;\n    if (filterState.statuses && filterState.statuses.length > 0) count++;\n    if (filterState.routingStates && filterState.routingStates.length > 0) count++;\n    if (filterState.queueIds && filterState.queueIds.length > 0) count++;\n    if (filterState.worktypeIds && filterState.worktypeIds.length > 0) count++;\n    return count;\n}\n\n/**\n *  Identifies the calls that must be held when a call becomes the selection.\n *\n * Voice is single-occupancy: only one call may carry a live media stream at a time. When a\n * call is selected, every OTHER connected, not-already-held call must be held. Digital\n * interactions impose no such constraint, so a call can stay unheld while the agent moves\n * among digital interactions — it is held only when a different call is later selected.\n *\n * @param incomingCallId - The id of the call being selected (excluded from the result).\n * @param activeInteractions - All active interactions (e.g. the mode's `allItems` values).\n * @returns The connected, unheld calls (other than `incomingCallId`) that should be held.\n */\nexport function findCallsToHoldOnSelect(incomingCallId: string, activeInteractions: Iterable<any>): any[] {\n    const callsToHold: any[] = [];\n    for (const interaction of activeInteractions) {\n        if (!interaction) continue;\n        if (get(interaction, 'id') === incomingCallId) continue;\n        if (get(interaction, 'type') !== 'call') continue;\n        if (!get(interaction, 'isConnected') || get(interaction, 'isHeld')) continue;\n        callsToHold.push(interaction);\n    }\n    return callsToHold;\n}\n\nexport function findUnheldConnectedCalls(interactions: any[]): any[] {\n    const calls: any[] = [];\n    for (const interaction of interactions) {\n        if (!interaction) continue;\n        if (get(interaction, 'type') !== 'call') continue;\n        if (!get(interaction, 'isConnected') || get(interaction, 'isHeld')) continue;\n        calls.push(interaction);\n    }\n    return calls;\n}\n","import Component from '@ember/component';\nimport { inject } from '@ember/service';\nimport { computed } from '@ember/object';\nimport { debounce } from '@ember/runloop';\nimport { getRawParticipantName, fetchParticipantName } from 'web-directory/utils/participant-name';\nimport type { Participant } from '@genesys/genesys-cloud-conversation-utils';\nimport type { Maybe } from 'web-directory/types';\n\n/**\n * Participant name component for the mode-manager roster. Mirrors the legacy\n * `acd-interactions-panel/participant-name` component but uses pure utility\n * functions (`utils/participant-name`) instead of the `participant-name` service,\n * avoiding the `interaction` service dependency.\n *\n * @attribute conversation — raw conversation payload (or `__interaction_metadata__`)\n * @attribute participantId — the customer participant ID to resolve a name for\n */\nexport default Component.extend({\n    classNames: ['participant-name'],\n    tagName: 'span',\n\n    externalContactsService: inject('external-contacts'),\n    storeService: inject('store'),\n    intlService: inject('intl'),\n    loggerService: inject('stash-logger'),\n\n    /**\n     * @attribute\n     * Conversation payload (raw or __interaction_metadata__)\n     */\n    conversation: null as Maybe<any>,\n\n    /**\n     * @attribute\n     * Participant ID to resolve name for\n     */\n    participantId: null as Maybe<string>,\n\n    /**\n     * Tracked previous participant identity for diffing\n     */\n    _oldParticipantKey: null as Maybe<string>,\n\n    /**\n     * External contact ID currently subscribed to for change events\n     */\n    _trackedExternalContactId: null as Maybe<string>,\n\n    /**\n     * Bound reference to _fetchParticipantName for use as listener callback\n     */\n    _boundFetchName: null as (() => void) | null,\n\n    /**\n     * Async-resolved participant name (set by _fetchParticipantName)\n     */\n    _name: null as Maybe<string>,\n\n    /**\n     * Sync-resolved participant name from raw payload\n     */\n    _rawName: computed('conversation', 'participantId', function (this: any): Maybe<string> {\n        const participant = this._getParticipant();\n        if (!participant) return null;\n        return getRawParticipantName(participant);\n    }),\n\n    /**\n     * Final resolved name — async wins once available, sync shown first.\n     */\n    name: computed('_name', '_rawName', function (this: any): string {\n        return (\n            this.get('_name') || this.get('_rawName') || this.get('intlService').t('purecloud.acdInteraction.noName')\n        );\n    }),\n\n    init() {\n        this._super(...arguments);\n        this.set('_boundFetchName', this._fetchParticipantName.bind(this));\n    },\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n\n        const participant = this._getParticipant();\n        if (!participant) return;\n\n        // Participant diffing — bail if identity hasn't changed\n        const key = `${participant.userId || ''}|${participant.externalContactId || ''}|${participant.queueId || ''}`;\n        if (key === this.get('_oldParticipantKey')) return;\n        this.set('_oldParticipantKey', key);\n\n        // Subscribe to external contact changes\n        this._subscribeExternalContact(participant.externalContactId);\n\n        // Debounced async fetch\n        debounce(this, this._fetchParticipantName, 200);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        this._unsubscribeExternalContact();\n    },\n\n    /**\n     * Find the participant from the conversation payload by participantId.\n     */\n    _getParticipant(): Maybe<Participant> {\n        const conversation = this.get('conversation');\n        const participantId = this.get('participantId');\n        if (!conversation || !participantId) return null;\n\n        const participants: any[] = conversation.participants || [];\n        return participants.find((p: any) => p.id === participantId) || null;\n    },\n\n    /**\n     * Async fetch for participant display name.\n     */\n    async _fetchParticipantName() {\n        const participant = this._getParticipant();\n        if (!participant) return;\n\n        const storeService = this.get('storeService');\n        const externalContactsService = this.get('externalContactsService');\n        const loggerService = this.get('loggerService');\n\n        const name: Maybe<string> = await fetchParticipantName(\n            participant as Participant,\n            storeService,\n            externalContactsService,\n            loggerService\n        );\n\n        if (name && !this.isDestroyed && !this.isDestroying) {\n            this.set('_name', name);\n        }\n    },\n\n    /**\n     * Subscribe to external contact change events for live name updates.\n     */\n    _subscribeExternalContact(externalContactId: Maybe<string>) {\n        const previousId = this.get('_trackedExternalContactId');\n        if (previousId === externalContactId) return;\n\n        this._unsubscribeExternalContact();\n\n        if (!externalContactId) return;\n\n        const externalContactsService = this.get('externalContactsService') as any;\n        if (!externalContactsService) return;\n\n        this.set('_trackedExternalContactId', externalContactId);\n\n        externalContactsService.addContactChangeListener(externalContactId, this.get('_boundFetchName')).catch(() => {\n            // Swallow — permissions or missing contact; async path still resolves\n        });\n    },\n\n    /**\n     * Remove external contact change listener.\n     */\n    _unsubscribeExternalContact() {\n        const trackedId = this.get('_trackedExternalContactId');\n        if (!trackedId) return;\n\n        const externalContactsService = this.get('externalContactsService') as any;\n        if (externalContactsService) {\n            externalContactsService.removeContactChangeListener(trackedId, this.get('_boundFetchName'));\n        }\n        this.set('_trackedExternalContactId', null);\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"2DCy64/E\",\"block\":\"[[[1,[34,0]]],[],false,[\\\"name\\\"]]\",\"moduleName\":\"web-directory/components/mode-manager/participant-name/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport type { Maybe } from 'web-directory/types';\n\n/**\n * Default body renderer for the generic group card. Iterates the group's sorted\n * items and renders a simple name + description row for each. Modes that need\n * richer per-item rendering provide a custom body component via their roster card.\n *\n * @attribute items — the sorted array of data objects within the group.\n * @attribute context — body context hash from the group card container.\n */\nexport default Component.extend({\n    classNames: ['roster-group-card-body'] as const,\n    tagName: '' as const,\n\n    /**\n     * @attribute\n     * Sorted items within the group.\n     */\n    items: null as Maybe<any[]>,\n\n    /**\n     * @attribute\n     * Context hash from the group card (shared across all body items in the group).\n     */\n    context: null as Maybe<Record<string, any>>,\n\n    renderedItems: computed('items.[]', function (this: any): Array<{\n        id: string;\n        title: string;\n        description: string;\n        item: any;\n    }> {\n        const items: any[] = this.get('items') || [];\n        return items.map(item => ({\n            id: item?.id || '',\n            title: item?.name || item?.id || '',\n            description: item?.description || '',\n            item\n        }));\n    }),\n\n    actions: {\n        select(item: any): void {\n            const context = (this.get('context') as Record<string, any>) || {};\n            const selectItem = context.selectItem;\n            if (typeof selectItem === 'function') {\n                selectItem(item);\n            }\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"A7XoVfMT\",\"block\":\"[[[42,[28,[37,1],[[28,[37,1],[[33,2]],null]],null],\\\"id\\\",[[[1,\\\"    \\\"],[10,\\\"button\\\"],[14,0,\\\"roster-group-card-body-item\\\"],[15,\\\"onclick\\\",[28,[37,3],[[30,0],\\\"select\\\",[30,1,[\\\"item\\\"]]],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n        \\\"],[10,1],[14,0,\\\"roster-group-card-body-item-title\\\"],[12],[1,[30,1,[\\\"title\\\"]]],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[30,1,[\\\"description\\\"]],[[[1,\\\"            \\\"],[10,1],[14,0,\\\"roster-group-card-body-item-description\\\"],[12],[1,[30,1,[\\\"description\\\"]]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null]],[\\\"entry\\\"],false,[\\\"each\\\",\\\"-track-array\\\",\\\"renderedItems\\\",\\\"action\\\",\\\"if\\\"]]\",\"moduleName\":\"web-directory/components/mode-manager/roster-cards/base/body/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed, get } from '@ember/object';\nimport { inject } from '@ember/service';\nimport type { Maybe } from 'web-directory/types';\nimport type { ModeRosterGroup } from '../../modes';\n\n/**\n * Generic modular group card for the mode-manager roster. Renders a header slot\n * and a body slot (per-item) using dynamic component names. Each slot receives a\n * `context` hash built by this component from the current mode.\n *\n * Modes customize rendering by:\n * 1. Setting `headerComponent` / `bodyComponent` (defaults provided)\n * 2. Extending this component to enrich `headerContext` / `bodyContext` computeds\n *\n * The group card is the single point of contact with the mode service (DDAU).\n *\n * @attribute item — a `ModeRosterGroup` object from `visibleItems`.\n */\nexport default Component.extend({\n    classNames: ['roster-group-card'] as const,\n    classNameBindings: ['isSelected', 'isAlerting'] as const,\n\n    modeService: inject('modes/mode-service'),\n    rosterSelectionService: inject('modes/roster-selection-service'),\n\n    /**\n     * @attribute\n     * The roster group data object passed from mode-roster.\n     */\n    item: null as Maybe<ModeRosterGroup>,\n\n    /**\n     * Component name for the group header slot.\n     * Override in subclasses or set on the mode to customize.\n     */\n    headerComponent: 'mode-manager/roster-cards/base/header' as string,\n\n    /**\n     * Component name for each item in the group body.\n     * Override in subclasses or set on the mode to customize.\n     */\n    bodyComponent: 'mode-manager/roster-cards/base/body' as string,\n\n    /**\n     * @attribute\n     * Optional. When provided, the card binds to this mode instead of the current mode.\n     * Used by the pinned cross-mode alerting section so alerting cards (and their answer/decline\n     * actions) bind to the owning Active mode regardless of which mode is currently selected.\n     */\n    alertingMode: null as Maybe<any>,\n\n    /**\n     * The mode this card binds to: the explicit `alertingMode` when provided, otherwise the\n     * currently selected mode from the mode service.\n     */\n    mode: computed('alertingMode', 'modeService.currentMode', function (this: any) {\n        return this.get('alertingMode') || this.get('modeService.currentMode');\n    }),\n\n    // ---------------------------------------------------------------------------\n    // Group-level derived state\n    // ---------------------------------------------------------------------------\n\n    /**\n     * Whether the first item in the group is in an alerting state.\n     */\n    isAlerting: computed('item.items.[]', function (this: any): boolean {\n        const items = this.get('item.items') || [];\n        const first = items[0];\n        if (!first) return false;\n        return !!get(first, 'isAlerting');\n    }),\n\n    /**\n     * Whether any item in this group is the currently selected item.\n     *\n     * @note could probably simplify to just check the selection id and not the mode id, but we'll keep it for now to be sure\n     */\n    isSelected: computed('item.items.[]', 'rosterSelectionService.selection', 'mode.id', function (this: any): boolean {\n        const items: any[] = this.get('item.items') ?? [];\n        const selection = this.get('rosterSelectionService.selection');\n        const modeId = this.get('mode.id');\n        if (!selection || selection.modeId !== modeId) return false;\n        return items.some(i => get(i, 'id') === selection.id);\n    }),\n\n    /**\n     * Items within the group in their display order. The parent `applySortToGroups`\n     * already sorts items within each group using the active sort option's `itemSort` descriptor.\n     *\n     * Note: This is effectively a passthrough of `item.items`, but subclass components\n     * (conversation, workitem) and templates depend on the `sortedItems` name extensively.\n     */\n    sortedItems: computed('item.items.[]', function (this: any): any[] {\n        return this.get('item.items') || [];\n    }),\n\n    // ---------------------------------------------------------------------------\n    // Context hashes (DDAU — passed to sub-components)\n    // ---------------------------------------------------------------------------\n\n    /**\n     * Context hash passed to the header component. Base provides group metadata.\n     * Subclasses extend this for mode-specific header data.\n     */\n    headerContext: computed('item', 'isAlerting', function (this: any): Record<string, any> {\n        return {\n            group: this.get('item'),\n            isAlerting: this.get('isAlerting')\n        };\n    }),\n\n    /**\n     * Context hash passed to each body item component. Base wires the mode's\n     * shared `selectItem` so clicking a row selects it (group highlight is driven\n     * by `isSelected`). Subclasses extend this for mode-specific body data.\n     */\n    bodyContext: computed('mode', function (this: any): Record<string, any> {\n        const mode = this.get('mode');\n        if (!mode) return {};\n\n        return {\n            selectItem: typeof mode.selectItem === 'function' ? mode.selectItem.bind(mode) : undefined\n        };\n    })\n});\n","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport type { Maybe } from 'web-directory/types';\n\n/**\n * Base header for the group card. Renders the group's display name, optional\n * division/intent badges, and optional outbound contact actions. All data is\n * received via the `context` hash (DDAU from the group card container).\n *\n * Modes enrich the `headerContext` on their roster card to populate badges\n * and actions — no custom header component needed unless the layout itself differs.\n *\n * @attribute context — header context hash from the group card container.\n */\nexport default Component.extend({\n    classNames: ['roster-group-card-header'] as const,\n\n    /**\n     * @attribute\n     * Context hash from the group card container. Base properties:\n     * { group, isAlerting }\n     *\n     * Extended by modes to include:\n     * { externalContactDivisionName, acdExternalContactDivNameFT, showCustomerIntent,\n     *   customerIntentLabel, enableOutboundContact, externalContact, permissions,\n     *   iAmConsulted, actionCreateCall, actionCreateMessage,\n     *   actionCreateEmail, actionDisplayError, actionFetchDefaultQueue, actionFetchQueue }\n     */\n    context: null as Maybe<Record<string, any>>,\n\n    // --- Badges ---\n\n    externalContactDivisionName: computed('context.externalContactDivisionName', function (this: any):\n        | string\n        | undefined {\n        return this.get('context.externalContactDivisionName');\n    }),\n\n    acdExternalContactDivNameFT: computed('context.acdExternalContactDivNameFT', function (this: any): boolean {\n        return !!this.get('context.acdExternalContactDivNameFT');\n    }),\n\n    showCustomerIntent: computed('context.showCustomerIntent', function (this: any): boolean {\n        return !!this.get('context.showCustomerIntent');\n    }),\n\n    customerIntentLabel: computed('context.customerIntentLabel', function (this: any): string | undefined {\n        return this.get('context.customerIntentLabel');\n    }),\n\n    showGroupBadges: computed(\n        'acdExternalContactDivNameFT',\n        'externalContactDivisionName',\n        'showCustomerIntent',\n        function (this: any): boolean {\n            const hasDivision = this.get('acdExternalContactDivNameFT') && !!this.get('externalContactDivisionName');\n            return !!(hasDivision || this.get('showCustomerIntent'));\n        }\n    ),\n\n    // --- Outbound contact ---\n\n    enableOutboundContact: computed('context.enableOutboundContact', function (this: any): boolean {\n        return !!this.get('context.enableOutboundContact');\n    }),\n\n    iAmConsulted: computed('context.iAmConsulted', function (this: any): boolean {\n        return !!this.get('context.iAmConsulted');\n    }),\n\n    externalContact: computed('context.externalContact', function (this: any): any {\n        return this.get('context.externalContact');\n    }),\n\n    permissions: computed('context.permissions', function (this: any): any {\n        return this.get('context.permissions');\n    }),\n\n    group: computed('context.group', function (this: any): any {\n        return this.get('context.group');\n    }),\n\n    // --- Actions ---\n\n    actionCreateCall: computed('context.actionCreateCall', function (this: any): any {\n        return this.get('context.actionCreateCall');\n    }),\n\n    actionCreateMessage: computed('context.actionCreateMessage', function (this: any): any {\n        return this.get('context.actionCreateMessage');\n    }),\n\n    actionCreateEmail: computed('context.actionCreateEmail', function (this: any): any {\n        return this.get('context.actionCreateEmail');\n    }),\n\n    actionDisplayError: computed('context.actionDisplayError', function (this: any): any {\n        return this.get('context.actionDisplayError');\n    }),\n\n    actionFetchDefaultQueue: computed('context.actionFetchDefaultQueue', function (this: any): any {\n        return this.get('context.actionFetchDefaultQueue');\n    }),\n\n    actionFetchQueue: computed('context.actionFetchQueue', function (this: any): any {\n        return this.get('context.actionFetchQueue');\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"bqbjY5+u\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"interaction-group-badges\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,2],[[33,3],[33,4]],null],[[[6,[39,5],null,null,[[\\\"default\\\"],[[[[1,\\\"                \\\"],[1,[34,4]],[1,\\\"\\\\n\\\"]],[]]]]]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,6],[[[6,[39,5],null,[[\\\"color\\\"],[\\\"dark-blue\\\"]],[[\\\"default\\\"],[[[[1,\\\"                \\\"],[1,[34,7]],[1,\\\"\\\\n\\\"]],[]]]]]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"interaction-group-header\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,\\\"role\\\",\\\"heading\\\"],[14,\\\"aria-level\\\",\\\"3\\\"],[14,\\\"tabindex\\\",\\\"-1\\\"],[14,0,\\\"header-text\\\"],[14,1,\\\"interactionGroupHeading\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,8],null,[[\\\"tagName\\\",\\\"conversation\\\",\\\"participantId\\\"],[\\\"h3\\\",[28,[37,9],[[33,10,[\\\"items\\\",\\\"firstObject\\\",\\\"__interaction_metadata__\\\"]],[33,10,[\\\"items\\\",\\\"firstObject\\\"]]],null],[28,[37,9],[[33,10,[\\\"items\\\",\\\"firstObject\\\",\\\"participantForCustomer\\\",\\\"id\\\"]],[33,10,[\\\"items\\\",\\\"firstObject\\\",\\\"customer\\\",\\\"externalContactId\\\"]]],null]]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,2],[[33,11],[28,[37,12],[[33,13]],null]],null],[[[1,\\\"        \\\"],[1,[28,[35,14],null,[[\\\"externalContact\\\",\\\"group\\\",\\\"permissions\\\",\\\"actionCreateCall\\\",\\\"actionCreateMessage\\\",\\\"actionCreateEmail\\\",\\\"actionDisplayError\\\",\\\"actionFetchDefaultQueue\\\",\\\"actionFetchQueue\\\"],[[33,15],[33,10],[33,16],[33,17],[33,18],[33,19],[33,20],[33,21],[33,22]]]]],[1,\\\"\\\\n\\\"]],[]],null],[13]],[],false,[\\\"if\\\",\\\"showGroupBadges\\\",\\\"and\\\",\\\"acdExternalContactDivNameFT\\\",\\\"externalContactDivisionName\\\",\\\"tags-input/label\\\",\\\"showCustomerIntent\\\",\\\"customerIntentLabel\\\",\\\"mode-manager/participant-name\\\",\\\"or\\\",\\\"group\\\",\\\"enableOutboundContact\\\",\\\"not\\\",\\\"iAmConsulted\\\",\\\"acd-interactions-panel/interaction-outbound-contact\\\",\\\"externalContact\\\",\\\"permissions\\\",\\\"actionCreateCall\\\",\\\"actionCreateMessage\\\",\\\"actionCreateEmail\\\",\\\"actionDisplayError\\\",\\\"actionFetchDefaultQueue\\\",\\\"actionFetchQueue\\\"]]\",\"moduleName\":\"web-directory/components/mode-manager/roster-cards/base/header/template.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"3qWTqwr6\",\"block\":\"[[[10,0],[14,0,\\\"roster-group-card-wrapper\\\"],[12],[1,\\\"\\\\n\\\"],[41,[51,[33,1]],[[[1,\\\"        \\\"],[46,[33,3],null,[[\\\"context\\\"],[[33,4]]],null],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n    \\\"],[46,[33,5],null,[[\\\"items\\\",\\\"context\\\"],[[33,6],[33,7]]],null],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"unless\\\",\\\"isAlerting\\\",\\\"component\\\",\\\"headerComponent\\\",\\\"headerContext\\\",\\\"bodyComponent\\\",\\\"sortedItems\\\",\\\"bodyContext\\\"]]\",\"moduleName\":\"web-directory/components/mode-manager/roster-cards/base/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed, get } from '@ember/object';\nimport type { Maybe } from 'web-directory/types';\n\n/**\n * Unified body container that iterates sorted interaction items and renders\n * `acd-interactions-panel/interaction-card-v2` for each. Handles both\n * conversations and workitems by resolving `interactionQueueId` per-item\n * from the parent's unified `interactionQueueIds` array.\n *\n * For conversations: queueId comes from `context.interactionQueueIds[index]`\n * For workitems: queueId also comes from `context.interactionQueueIds[index]`\n *   (the parent component's unified computed already resolves `workitem.queueId` per-item)\n *\n * @attribute items — the sorted array of interaction/workitem models within the group.\n * @attribute context — body context hash from the interaction-group card.\n */\nexport default Component.extend({\n    tagName: '' as const, // tagless — interaction-card-v2 provides its own wrapper\n\n    /**\n     * @attribute\n     * Sorted interaction models within the group (conversations and/or workitems).\n     */\n    items: null as Maybe<any[]>,\n\n    /**\n     * @attribute\n     * Context hash from the interaction-group card container.\n     */\n    context: null as Maybe<Record<string, any>>,\n\n    /**\n     * Enriched items with per-item computed data (queueId, engagementSource).\n     * The parent's `interactionQueueIds` computed already handles both types\n     * (participant-based for conversations, `workitem.queueId` for workitems),\n     * so we simply index into it.\n     */\n    enrichedItems: computed('items.[]', 'context.interactionQueueIds', function (this: any): any[] {\n        const items: any[] = this.get('items') || [];\n        const queueIds: Array<string | undefined> = this.get('context.interactionQueueIds') || [];\n\n        return items.map((item: any, index: number) => ({\n            interaction: item,\n            interactionQueueId: queueIds[index],\n            engagementSource: get(item || {}, 'engagementSource')\n        }));\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"ffwDsIOa\",\"block\":\"[[[42,[28,[37,1],[[28,[37,1],[[33,2]],null]],null],\\\"interaction.id\\\",[[[1,\\\"    \\\"],[1,[28,[35,3],null,[[\\\"interaction\\\",\\\"interactionQueueId\\\",\\\"engagementSource\\\",\\\"selectedInteraction\\\",\\\"selectedWorkitem\\\",\\\"isTypingInteractions\\\",\\\"hideInteractionButtons\\\",\\\"actionAnswerInteraction\\\",\\\"actionDeclineInteraction\\\",\\\"actionSelectInteraction\\\",\\\"actionAnswerWorkitemInteraction\\\",\\\"actionDeclineWorkitemInteraction\\\",\\\"actionSelectWorkitemInteraction\\\",\\\"actionLoadQueue\\\",\\\"actionLoadParticipantName\\\",\\\"acdAnnounceMonitoringFt\\\",\\\"acdAnnounceMonitoringDigitalFt\\\",\\\"draftUpdateHash\\\",\\\"externalContactDivisionName\\\",\\\"acdExternalContactDivNameFT\\\",\\\"acdExternalContactWorkitemsDivNameFT\\\",\\\"acdDisconnectedConversationIconsFT\\\",\\\"acdFacebookIconUpdateFT\\\",\\\"acdTwitterXIconUpdateFT\\\",\\\"acdEngagementSourcesFT\\\",\\\"inactivityTimeoutFT\\\",\\\"useNewNav\\\"],[[30,1,[\\\"interaction\\\"]],[30,1,[\\\"interactionQueueId\\\"]],[30,1,[\\\"engagementSource\\\"]],[33,4,[\\\"selectedInteraction\\\"]],[33,4,[\\\"selectedWorkitem\\\"]],[33,4,[\\\"isTypingInteractions\\\"]],[33,4,[\\\"hideInteractionButtons\\\"]],[33,4,[\\\"actionAnswerInteraction\\\"]],[33,4,[\\\"actionDeclineInteraction\\\"]],[33,4,[\\\"actionSelectInteraction\\\"]],[33,4,[\\\"actionAnswerWorkitemInteraction\\\"]],[33,4,[\\\"actionDeclineWorkitemInteraction\\\"]],[33,4,[\\\"actionSelectWorkitemInteraction\\\"]],[33,4,[\\\"actionLoadQueue\\\"]],[33,4,[\\\"actionLoadParticipantName\\\"]],[33,4,[\\\"acdAnnounceMonitoring\\\"]],[33,4,[\\\"acdAnnounceMonitoringDigital\\\"]],[33,4,[\\\"draftUpdateHash\\\"]],[33,4,[\\\"externalContactDivisionName\\\"]],[33,4,[\\\"acdExternalContactDivNameFT\\\"]],[33,4,[\\\"acdExternalContactWorkitemsDivNameFT\\\"]],[33,4,[\\\"acdDisconnectedConversationIconsFT\\\"]],[33,4,[\\\"acdFacebookIconUpdateFT\\\"]],[33,4,[\\\"acdTwitterXIconUpdateFT\\\"]],[33,4,[\\\"acdEngagementSourcesFT\\\"]],[33,4,[\\\"inactivityTimeoutFT\\\"]],[33,4,[\\\"useNewNav\\\"]]]]]],[1,\\\"\\\\n\\\"]],[1]],null]],[\\\"entry\\\"],false,[\\\"each\\\",\\\"-track-array\\\",\\\"enrichedItems\\\",\\\"acd-interactions-panel/interaction-card-v2\\\",\\\"context\\\"]]\",\"moduleName\":\"web-directory/components/mode-manager/roster-cards/interaction-group/body/template.hbs\",\"isStrictMode\":false});","import { computed, get } from '@ember/object';\nimport { readOnly } from '@ember/object/computed';\nimport findLast from 'lodash/findLast';\nimport type { AssignmentStateType } from '@genesys/genesys-cloud-conversation-utils';\nimport type { Models } from 'purecloud-platform-client-internal-v2';\nimport GroupCard from '../base/component';\n\n/**\n * Unified roster card for the mode-manager that handles both conversations and\n * workitems (including mixed groups). Mirrors the legacy `interaction-group`\n * behavior: one component per group, type dispatch handled at the card-v2 leaf.\n *\n * Key unified behaviors:\n * - `isAlerting` checks both `isAlerting` (conversations) and `workitem.assignmentState` (workitems)\n * - `isSelected` checks both `selectedInteraction` and `selectedWorkitem`\n * - `interactionQueueIds` resolves per-item from participants OR `workitem.queueId`\n * - `_updateDivisionName` early-returns for workitem-first groups\n * - Header renders outbound button, division badge, etc. when applicable (guards on feature toggles)\n *\n * @attribute item — a `ModeRosterGroup` containing conversation and/or workitem models.\n */\nexport default GroupCard.extend({\n    classNames: ['interaction-group'] as const,\n    classNameBindings: ['isSelected', 'isAlerting'] as const,\n\n    // --- Slot configuration ---\n    headerComponent: 'mode-manager/roster-cards/base/header',\n    bodyComponent: 'mode-manager/roster-cards/interaction-group/body',\n\n    // --- Mode-specific readOnly aliases ---\n    externalContacts: readOnly('mode.externalContacts'),\n    selectedItem: readOnly('rosterSelectionService.selection.payload'),\n    enableOutboundContact: readOnly('mode.enableOutboundContact'),\n    acdExternalContactDivNameFT: readOnly('mode.acdExternalContactDivNameFT'),\n    acdExternalContactWorkitemsDivNameFT: readOnly('mode.acdExternalContactWorkitemsDivNameFT'),\n    permissions: readOnly('mode.permissions'),\n\n    // --- Division name ---\n    externalContactDivisionName: undefined as undefined | string,\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n        this._updateDivisionName();\n    },\n\n    // --- Unified isAlerting: handles both conversations and workitems ---\n    isAlerting: computed(\n        'sortedItems.firstObject.isAlerting',\n        'sortedItems.firstObject.workitem.assignmentState',\n        function (this: any): boolean {\n            return (\n                !!this.get('sortedItems.firstObject.isAlerting') ||\n                (this.get('sortedItems.firstObject.workitem.assignmentState') as undefined | AssignmentStateType) ===\n                    'Alerting'\n            );\n        }\n    ),\n\n    // --- Unified isSelected: checks both conversation and workitem selection ---\n    isSelected: computed('sortedItems.[]', 'selectedItem', function (this: any): boolean {\n        const items: any[] = this.get('sortedItems') || [];\n        const selectedId: string = this.get('selectedItem.id') || '';\n        if (!selectedId) return false;\n        return items.some((i: any) => get(i, 'id') === selectedId);\n    }),\n\n    // --- External contact resolution ---\n    externalContact: computed('externalContacts.[]', 'item.groupId', function (this: any): any {\n        const groupId: string = this.get('item.groupId');\n        const contacts = this.get('externalContacts');\n        return groupId && contacts ? contacts.findBy('id', groupId) : null;\n    }),\n\n    // --- Customer intent ---\n    customerIntentLabel: computed('sortedItems.firstObject.customerIntent', function (this: any): string | undefined {\n        return this.get('sortedItems.firstObject')?.customerIntent ?? undefined;\n    }),\n\n    showCustomerIntent: computed('customerIntentLabel', function (this: any): boolean {\n        return false; // not wired yet — parity with legacy\n    }),\n\n    // --- Unified interactionQueueIds: per-item resolution for both types ---\n    interactionQueueIds: computed(\n        'sortedItems.[]',\n        'sortedItems.@each.participantForQueue.queueId',\n        'sortedItems.@each.participantForCurrentUser.{queueId,monitoredParticipantId,coachedParticipantId,bargedParticipantId}',\n        'sortedItems.@each.workitem.queueId',\n        'sortedItems.@each.workitem',\n        function (this: any): Array<undefined | string> {\n            const interactions: any[] = this.get('sortedItems') || [];\n            return interactions.map((interaction: any) => {\n                let queueId =\n                    get(interaction, 'participantForCurrentUser.queueId') ||\n                    get(interaction, 'participantForQueue.queueId') ||\n                    get(interaction, 'workitem.queueId');\n\n                if (!queueId && !get(interaction, 'workitem')) {\n                    const currentUser = get(interaction, 'participantForCurrentUser');\n                    const mcbedParticipantId =\n                        currentUser?.monitoredParticipantId ||\n                        currentUser?.coachedParticipantId ||\n                        currentUser?.bargedParticipantId;\n\n                    if (mcbedParticipantId) {\n                        queueId = findLast(\n                            get(interaction, 'participants') || [],\n                            ({ id, queueId: qId }: Models.Participant) => id === mcbedParticipantId && !!qId\n                        )?.queueId;\n                    }\n                }\n\n                return queueId;\n            });\n        }\n    ),\n\n    // --- Unified division name resolution ---\n    _updateDivisionName() {\n        if (!this.get('acdExternalContactDivNameFT')) return;\n\n        const interaction = (this.get('sortedItems') as any[])?.[0];\n        const setDivisionName = (name: string | undefined) => {\n            if (this && !(this.get('isDestroyed') || this.get('isDestroying'))) {\n                this.set('externalContactDivisionName', name);\n            }\n        };\n\n        const externalContact = this.get('externalContact');\n        if (externalContact) {\n            setDivisionName(externalContact?.division?.name);\n            return;\n        }\n\n        // Workitems don't carry participantForCustomer — no division to resolve\n        if (get(interaction || {}, 'workitem')) {\n            setDivisionName(undefined);\n            return;\n        }\n\n        const divisionId = get(interaction || {}, 'participantForCustomer.externalContactInitialDivisionId');\n        const mode = this.get('mode') as any;\n        if (mode?.loadDivisionName && divisionId) {\n            mode.loadDivisionName.call(mode, divisionId).then((name: string | undefined) => setDivisionName(name));\n        }\n    },\n\n    /**\n     * Adapter: presents this group to the legacy\n     * `acd-interactions-panel/interaction-outbound-contact` component in the shape it expects.\n     *\n     * That component reads the group's rows from `group.interactions`, but `ModeRosterGroup`\n     * exposes them as the more generic `items`.\n     */\n    outboundContactGroup: computed('item', 'sortedItems.[]', function (this: any): Record<string, any> {\n        return Object.assign({}, this.get('item'), { interactions: this.get('sortedItems') });\n    }),\n\n    // --- Enriched header context ---\n    headerContext: computed(\n        'outboundContactGroup',\n        'isAlerting',\n        'externalContactDivisionName',\n        'acdExternalContactDivNameFT',\n        'showCustomerIntent',\n        'customerIntentLabel',\n        'enableOutboundContact',\n        'externalContact',\n        'permissions',\n        'sortedItems.firstObject.iAmConsulted',\n        'mode',\n        function (this: any): Record<string, any> {\n            const mode = this.get('mode');\n            return {\n                group: this.get('outboundContactGroup'),\n                isAlerting: this.get('isAlerting'),\n                externalContactDivisionName: this.get('externalContactDivisionName'),\n                acdExternalContactDivNameFT: this.get('acdExternalContactDivNameFT'),\n                showCustomerIntent: this.get('showCustomerIntent'),\n                customerIntentLabel: this.get('customerIntentLabel'),\n                enableOutboundContact: this.get('enableOutboundContact'),\n                externalContact: this.get('externalContact'),\n                permissions: this.get('permissions'),\n                iAmConsulted: !!this.get('sortedItems.firstObject.iAmConsulted'),\n                actionCreateCall: mode?.createCall?.bind(mode),\n                actionCreateMessage: mode?.createMessage?.bind(mode),\n                actionCreateEmail: mode?.createEmail?.bind(mode),\n                actionDisplayError: mode?.displayError?.bind(mode),\n                actionFetchDefaultQueue: mode?.fetchDefaultQueue?.bind(mode),\n                actionFetchQueue: mode?.fetchQueue?.bind(mode)\n            };\n        }\n    ),\n\n    // --- Enriched body context (full superset for both types) ---\n    bodyContext: computed(\n        'mode',\n        'selectedItem',\n        'externalContactDivisionName',\n        'interactionQueueIds',\n        function (this: any): Record<string, any> {\n            const mode = this.get('mode');\n            if (!mode) return {};\n\n            return {\n                selectedInteraction: this.get('selectedItem'),\n                selectedWorkitem: this.get('selectedItem'),\n                isTypingInteractions: mode.get('isTypingInteractions'),\n                hideInteractionButtons: mode.get('hideInteractionButtons'),\n                draftUpdateHash: mode.get('draftUpdateHash'),\n                externalContactDivisionName: this.get('externalContactDivisionName'),\n                interactionQueueIds: this.get('interactionQueueIds'),\n\n                // Feature toggles\n                acdAnnounceMonitoring: mode.get('acdAnnounceMonitoring'),\n                acdAnnounceMonitoringDigital: mode.get('acdAnnounceMonitoringDigital'),\n                acdExternalContactDivNameFT: mode.get('acdExternalContactDivNameFT'),\n                acdExternalContactWorkitemsDivNameFT: mode.get('acdExternalContactWorkitemsDivNameFT'),\n                acdDisconnectedConversationIconsFT: mode.get('acdDisconnectedConversationIconsFT'),\n                acdFacebookIconUpdateFT: mode.get('acdFacebookIconUpdateFT'),\n                acdTwitterXIconUpdateFT: mode.get('acdTwitterXIconUpdateFT'),\n                acdEngagementSourcesFT: mode.get('acdEngagementSourcesFT'),\n                inactivityTimeoutFT: mode.get('inactivityTimeoutFT'),\n                useNewNav: mode.get('useNewNav'),\n\n                // Actions — conversation\n                actionAnswerInteraction: mode.answer?.bind(mode),\n                actionDeclineInteraction: mode.decline?.bind(mode),\n                actionSelectInteraction: mode.selectItem?.bind(mode),\n                actionLoadQueue: mode.loadQueue?.bind(mode),\n                actionLoadParticipantName: mode.loadParticipantName?.bind(mode),\n\n                // Actions — workitem\n                actionAnswerWorkitemInteraction: mode.answer?.bind(mode),\n                actionDeclineWorkitemInteraction: mode.decline?.bind(mode),\n                actionSelectWorkitemInteraction: mode.selectItem?.bind(mode)\n            };\n        }\n    )\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"NCgK87yO\",\"block\":\"[[[10,0],[14,0,\\\"roster-group-card-wrapper\\\"],[12],[1,\\\"\\\\n\\\"],[41,[51,[33,1]],[[[1,\\\"        \\\"],[46,[33,3],null,[[\\\"context\\\"],[[33,4]]],null],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n    \\\"],[46,[33,5],null,[[\\\"items\\\",\\\"context\\\"],[[33,6],[33,7]]],null],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"unless\\\",\\\"isAlerting\\\",\\\"component\\\",\\\"headerComponent\\\",\\\"headerContext\\\",\\\"bodyComponent\\\",\\\"sortedItems\\\",\\\"bodyContext\\\"]]\",\"moduleName\":\"web-directory/components/mode-manager/roster-cards/interaction-group/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { inject } from '@ember/service';\nimport { computed, set } from '@ember/object';\nimport { Maybe } from 'web-directory/types';\nimport { getAvailableInteractionChannelOptions } from '../../modes/utils';\nimport type { ActiveModeFilterState, InteractionChannelOption } from '../../modes/utils';\n\nconst DIRECTION_OPTIONS = [\n    { value: 'all', translationKey: 'modeRoster.sidePanel.filter.directionOption.all' },\n    { value: 'inbound', translationKey: 'modeRoster.sidePanel.filter.directionOption.inbound' },\n    { value: 'outbound', translationKey: 'modeRoster.sidePanel.filter.directionOption.outbound' }\n];\n\ntype QueueOption = { id: string; name: string };\n\n/**\n * Default roster filter side panel for the active mode. Allows filtering interactions\n * by channel type, queue, and direction. Manages local (uncommitted) state that is\n * applied to the mode's `filterState` when the user clicks \"Apply\".\n */\nexport default Component.extend({\n    classNames: ['active-mode-filter-panel'],\n    ajaxService: inject('ajax'),\n    applicationService: inject('application'),\n    permissionsService: inject('permissions'),\n    rosterSidePanelService: inject('modes/roster-side-panel-service'),\n    storeService: inject('store'),\n\n    /**\n     * @attribute\n     * Payload from the roster side panel service. Expected shape: `{ mode }`.\n     */\n    context: null as Maybe<{ mode: any }>,\n\n    /**\n     * Queue options fetched from the API based on active interaction participants.\n     */\n    queueOptions: null as Maybe<QueueOption[]>,\n\n    /**\n     * Local (uncommitted) selected channel values.\n     */\n    selectedChannels: [] as string[],\n\n    /**\n     * Local (uncommitted) selected queue IDs.\n     */\n    selectedQueueIds: [] as string[],\n\n    /**\n     * Local (uncommitted) selected direction. 'all' means no direction filter.\n     */\n    selectedDirection: 'all' as string,\n\n    /**\n     * Individual `Interaction Channel` options are gated by permissions.\n     */\n    interactionChannelOptions: computed(\n        'permissionsService.{donutPermissions,allowedOrgPermissions,hasUnifiedCommunications,canViewWorkitem}',\n        function (this: any): InteractionChannelOption[] {\n            const availabilityContext = {\n                permissions: this.get('permissionsService')\n            };\n\n            return getAvailableInteractionChannelOptions(availabilityContext);\n        }\n    ),\n\n    directionOptions: DIRECTION_OPTIONS,\n\n    /**\n     * Whether each dropdown's committed selection has been pushed into the web component. Tracked\n     * separately because `Interaction Channel` options are available on the first render while `Queue` options\n     * arrive from an async fetch — syncing both on the same tick would assign queue values before\n     * their `<gux-option-multi>` elements exist.\n     */\n    _interactionChannelDropdownHydrated: false,\n    _queueDropdownHydrated: false,\n\n    /**\n     * True when local selections differ from the committed filterState on the mode.\n     * Used to disable the \"Apply\" button until the user makes a change.\n     */\n    hasLocalChanges: computed(\n        'selectedChannels.[]',\n        'selectedQueueIds.[]',\n        'selectedDirection',\n        'context',\n        function (this: any): boolean {\n            const context: { mode: any } | null | undefined = this.get('context');\n            const mode = context?.mode;\n            const filterState: ActiveModeFilterState | null = mode?.get('filterState');\n\n            const localChannels: string[] = this.get('selectedChannels') || [];\n            const localQueueIds: string[] = this.get('selectedQueueIds') || [];\n            const localDirection: string = this.get('selectedDirection') || 'all';\n\n            const committedChannels = filterState?.channels || [];\n            const committedQueueIds = filterState?.queueIds || [];\n            const committedDirection = filterState?.direction || 'all';\n\n            if (localChannels.length !== committedChannels.length) return true;\n            if (localQueueIds.length !== committedQueueIds.length) return true;\n            if (localDirection !== committedDirection) return true;\n\n            const channelsSame = localChannels.every((c: string) => committedChannels.includes(c));\n            if (!channelsSame) return true;\n\n            const queueIdsSame = localQueueIds.every((q: string) => committedQueueIds.includes(q));\n            if (!queueIdsSame) return true;\n\n            return false;\n        }\n    ),\n\n    /**\n     * True when there are committed filters on the mode that can be cleared.\n     * Used to disable the \"Reset\" button when there is nothing to reset.\n     */\n    hasActiveFilters: computed('context', function (this: any): boolean {\n        const context: { mode: any } | null | undefined = this.get('context');\n        const mode = context?.mode;\n        const filterState: ActiveModeFilterState | null = mode?.get('filterState');\n        if (!filterState) return false;\n\n        const channels = filterState.channels || [];\n        const queueIds = filterState.queueIds || [];\n        const direction = filterState.direction;\n\n        return channels.length > 0 || queueIds.length > 0 || !!direction;\n    }),\n\n    didInsertElement() {\n        this._super(...arguments);\n        this._hydrateFromFilterState();\n        this._fetchQueues();\n    },\n\n    didRender() {\n        this._super(...arguments);\n        this._syncInteractionChannelDropdownValue();\n        this._syncQueueDropdownValue();\n    },\n\n    /**\n     * Pushes a committed selection into a `gux-dropdown-multi`.\n     *\n     * A template `value=` binding can't be used: Ember would set it in the same render pass that\n     * creates the `<gux-option-multi>` children, and those hydrate asynchronously (Stencil\n     * lazy-load), so the web component throws when validating the value against options that don't\n     * exist yet. Deferring a frame lets the options register first.\n     */\n    _syncDropdownValue(selector: string, values: string[]) {\n        requestAnimationFrame(() => {\n            if (this.get('isDestroyed') || this.get('isDestroying')) return;\n\n            const dropdown: (HTMLElement & { value: string }) | null = this.element?.querySelector(selector) ?? null;\n            if (!dropdown) return;\n\n            dropdown.value = values.join(',');\n        });\n    },\n\n    _syncInteractionChannelDropdownValue() {\n        if (this._interactionChannelDropdownHydrated) return;\n        this._interactionChannelDropdownHydrated = true;\n\n        const channels: string[] = this.get('selectedChannels') || [];\n        if (channels.length === 0) return;\n\n        this._syncDropdownValue('.filter-interaction-channel-dropdown', channels);\n    },\n\n    /**\n     * Deferred until `_fetchQueues` has populated `queueOptions`, because assigning a value for a\n     * queue that was never rendered as an option throws. Setting `queueOptions` triggers a\n     * re-render, which brings us back here with the options in place.\n     */\n    _syncQueueDropdownValue() {\n        if (this._queueDropdownHydrated) return;\n\n        const queueIds: string[] = this.get('selectedQueueIds') || [];\n        if (queueIds.length === 0) {\n            this._queueDropdownHydrated = true;\n            return;\n        }\n\n        const queueOptions: Maybe<QueueOption[]> = this.get('queueOptions');\n        if (!queueOptions || queueOptions.length === 0) return;\n\n        this._queueDropdownHydrated = true;\n\n        // `_fetchQueues` seeds itself from the committed filter, so every selected queue is normally\n        // present. A queue deleted server-side can still be missing from the response, so restrict\n        // the assignment to options that actually rendered.\n        const renderableQueueIds = queueIds.filter(id => queueOptions.some(option => option.id === id));\n        if (renderableQueueIds.length === 0) return;\n\n        this._syncDropdownValue('.filter-queue-dropdown', renderableQueueIds);\n    },\n\n    /**\n     * Hydrates local selections from the mode's current committed filterState\n     * so reopening the panel reflects active filters.\n     */\n    _hydrateFromFilterState() {\n        const context: { mode: any } | null | undefined = this.get('context');\n        const mode = context?.mode;\n        const filterState: ActiveModeFilterState | null = mode?.get('filterState');\n\n        if (filterState) {\n            this.set('selectedChannels', filterState.channels ? [...filterState.channels] : []);\n            this.set('selectedQueueIds', filterState.queueIds ? [...filterState.queueIds] : []);\n            this.set('selectedDirection', filterState.direction || 'all');\n        } else {\n            this.set('selectedChannels', []);\n            this.set('selectedQueueIds', []);\n            this.set('selectedDirection', 'all');\n        }\n    },\n\n    /**\n     * QueueIds the dropdown needs to offer: those represented in the current roster, plus any the\n     * committed filter already selects.\n     *\n     * The second half matters because the roster is live. An agent can filter by a queue and then\n     * finish those interactions, at which point the queue has no roster items left.\n     * But the filter is still applied, so the option has to stay available for them to see and clear it.\n     */\n    _collectQueueIds(): Set<string> {\n        const context: { mode: any } | null | undefined = this.get('context');\n        const mode = context?.mode;\n        const queueIds = new Set<string>();\n\n        const allItems: Map<string, any> | undefined = mode?.get('allItems');\n        allItems?.forEach((interaction: any) => {\n            const participants: any[] = interaction.participants ?? [];\n            participants.forEach((p: any) => {\n                if (p.queueId) {\n                    queueIds.add(p.queueId);\n                }\n            });\n        });\n\n        const filterState: ActiveModeFilterState | null = mode?.get('filterState');\n        (filterState?.queueIds ?? []).forEach((queueId: string) => queueIds.add(queueId));\n\n        return queueIds;\n    },\n\n    /**\n     * Fetches queue details for every queue option.\n     * Leverages Ember Data's identity map to avoid re-fetching queues already loaded.\n     */\n    async _fetchQueues() {\n        const queueIds = this._collectQueueIds();\n        if (queueIds.size === 0) return;\n\n        const storeService: any = this.get('storeService');\n        const cached: QueueOption[] = [];\n        const missingIds: string[] = [];\n\n        queueIds.forEach(id => {\n            const existing = storeService.peekRecord('queue', id);\n            if (existing) {\n                cached.push({ id: existing.get('id'), name: existing.get('name') });\n            } else {\n                missingIds.push(id);\n            }\n        });\n\n        if (missingIds.length === 0) {\n            this.set('queueOptions', cached);\n            return;\n        }\n\n        try {\n            const url = this.get('applicationService').pcV2Uri('api/v2/routing/queues');\n            const response = await this.get('ajaxService').request(url, {\n                data: { id: missingIds.join(',') }\n            });\n\n            if (this.get('isDestroyed') || this.get('isDestroying')) return;\n\n            const entities: any[] = response?.entities || [];\n\n            // Push fetched records into Ember Data's identity map for future cache hits\n            storeService.push({\n                data: entities.map((q: any) => ({\n                    id: q.id,\n                    type: 'queue',\n                    attributes: { name: q.name }\n                }))\n            });\n\n            const fetched: QueueOption[] = entities.map((q: any) => ({ id: q.id, name: q.name }));\n            this.set('queueOptions', [...cached, ...fetched]);\n        } catch (error) {\n            // Fall back to cached queues if fetch fails; otherwise filter will be empty\n            if (cached.length > 0) {\n                this.set('queueOptions', cached);\n            }\n        }\n    },\n\n    /**\n     * Builds an ActiveModeFilterState from current local selections.\n     * Only includes keys that represent active filter criteria.\n     */\n    _buildFilterState(): ActiveModeFilterState | null {\n        const channels: string[] = this.get('selectedChannels') || [];\n        const queueIds: string[] = this.get('selectedQueueIds') || [];\n        const direction: string = this.get('selectedDirection') || 'all';\n\n        const state: ActiveModeFilterState = {};\n\n        if (channels && channels.length > 0) {\n            state.channels = channels;\n        }\n        if (queueIds && queueIds.length > 0) {\n            state.queueIds = queueIds;\n        }\n        if (direction && direction !== 'all') {\n            state.direction = direction as 'inbound' | 'outbound';\n        }\n\n        return Object.keys(state).length > 0 ? state : null;\n    },\n\n    actions: {\n        onChannelSelectionChange(event: Event) {\n            const target = event.target as HTMLElement & { value: string };\n            const value = target?.value || '';\n            const channels = value ? value.split(',').filter(Boolean) : [];\n            set(this, 'selectedChannels', channels);\n        },\n\n        onQueueSelectionChange(event: Event) {\n            const target = event.target as HTMLElement & { value: string };\n            const value = target?.value || '';\n            const queueIds = value ? value.split(',').filter(Boolean) : [];\n            set(this, 'selectedQueueIds', queueIds);\n        },\n\n        onDirectionChange(event: Event) {\n            const target = event.target as HTMLInputElement;\n            if (target?.checked) {\n                set(this, 'selectedDirection', target.value);\n            }\n        },\n\n        apply() {\n            const context: { mode: any } | null | undefined = this.get('context');\n            const mode = context?.mode;\n            const newFilterState = this._buildFilterState();\n            this.get('rosterSidePanelService').close();\n            if (mode) {\n                mode.set('filterState', newFilterState);\n            }\n        },\n\n        reset() {\n            const context: { mode: any } | null | undefined = this.get('context');\n            const mode = context?.mode;\n            this.get('rosterSidePanelService').close();\n            if (mode) {\n                mode.set('filterState', null);\n            }\n        },\n\n        cancel() {\n            this.get('rosterSidePanelService').close();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"74jdYcmT\",\"block\":\"[[[10,\\\"h3\\\"],[14,\\\"header\\\",\\\"\\\"],[14,0,\\\"mode-manager-roster-side-panel-filter-title\\\"],[12],[1,\\\"\\\\n    \\\"],[1,[28,[35,0],[\\\"modeRoster.sidePanel.filter.title\\\"],null]],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"active-mode-filter-panel-content\\\"],[12],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"active-mode-filter-panel-body\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-form-field-dropdown\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[12],[1,[28,[35,0],[\\\"modeRoster.sidePanel.filter.inputLabel.interactionChannel\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[10,\\\"gux-dropdown-multi\\\"],[14,0,\\\"filter-interaction-channel-dropdown\\\"],[14,\\\"filter-type\\\",\\\"starts-with\\\"],[14,\\\"placeholder\\\",\\\"None selected\\\"],[15,\\\"oninput\\\",[28,[37,1],[[30,0],\\\"onChannelSelectionChange\\\"],null]],[15,\\\"aria-label\\\",[28,[37,0],[\\\"modeRoster.sidePanel.filter.inputLabel.interactionChannel\\\"],null]],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-listbox-multi\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-select-all\\\"],[12],[13],[1,\\\"\\\\n\\\"],[42,[28,[37,3],[[28,[37,3],[[33,4]],null]],null],\\\"value\\\",[[[1,\\\"                        \\\"],[10,\\\"gux-option-multi\\\"],[15,2,[30,1,[\\\"value\\\"]]],[12],[1,[28,[35,0],[[30,1,[\\\"translationKey\\\"]]],null]],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"gux-form-field-dropdown\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[12],[1,[28,[35,0],[\\\"modeRoster.sidePanel.filter.inputLabel.queue\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[10,\\\"gux-dropdown-multi\\\"],[14,0,\\\"filter-queue-dropdown\\\"],[14,\\\"filter-type\\\",\\\"starts-with\\\"],[14,\\\"placeholder\\\",\\\"None selected\\\"],[15,\\\"oninput\\\",[28,[37,1],[[30,0],\\\"onQueueSelectionChange\\\"],null]],[15,\\\"aria-label\\\",[28,[37,0],[\\\"modeRoster.sidePanel.filter.inputLabel.queue\\\"],null]],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-listbox-multi\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-select-all\\\"],[12],[13],[1,\\\"\\\\n\\\"],[42,[28,[37,3],[[28,[37,3],[[33,5]],null]],null],\\\"id\\\",[[[1,\\\"                        \\\"],[10,\\\"gux-option-multi\\\"],[15,2,[30,2,[\\\"id\\\"]]],[12],[1,[30,2,[\\\"name\\\"]]],[13],[1,\\\"\\\\n\\\"]],[2]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"gux-form-field-radio-group-beta\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"group-label\\\"],[12],[1,[28,[35,0],[\\\"modeRoster.sidePanel.filter.inputLabel.direction\\\"],null]],[13],[1,\\\"\\\\n\\\"],[42,[28,[37,3],[[28,[37,3],[[33,6]],null]],null],\\\"value\\\",[[[1,\\\"                \\\"],[10,\\\"gux-form-field-radio\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[12],[1,[28,[35,0],[[30,3,[\\\"translationKey\\\"]]],null]],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"input\\\"],[14,\\\"slot\\\",\\\"input\\\"],[14,3,\\\"filter-direction\\\"],[15,2,[30,3,[\\\"value\\\"]]],[15,\\\"checked\\\",[28,[37,7],[[33,8],[30,3,[\\\"value\\\"]]],null]],[15,\\\"onchange\\\",[28,[37,1],[[30,0],\\\"onDirectionChange\\\"],null]],[15,\\\"aria-label\\\",[28,[37,0],[[30,3,[\\\"translationKey\\\"]]],null]],[14,4,\\\"radio\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[3]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"active-mode-filter-panel-footer\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-button\\\"],[14,\\\"accent\\\",\\\"primary\\\"],[15,\\\"onclick\\\",[28,[37,1],[[30,0],\\\"apply\\\"],null]],[15,\\\"disabled\\\",[28,[37,9],[[33,10]],null]],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,0],[\\\"modeRoster.sidePanel.filter.buttonLabel.apply\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"gux-button\\\"],[15,\\\"onclick\\\",[28,[37,1],[[30,0],\\\"reset\\\"],null]],[15,\\\"disabled\\\",[28,[37,9],[[33,11]],null]],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,0],[\\\"modeRoster.sidePanel.filter.buttonLabel.reset\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"gux-button\\\"],[14,\\\"accent\\\",\\\"ghost\\\"],[15,\\\"onclick\\\",[28,[37,1],[[30,0],\\\"cancel\\\"],null]],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,0],[\\\"modeRoster.sidePanel.filter.buttonLabel.cancel\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[13]],[\\\"option\\\",\\\"queue\\\",\\\"option\\\"],false,[\\\"t\\\",\\\"action\\\",\\\"each\\\",\\\"-track-array\\\",\\\"interactionChannelOptions\\\",\\\"queueOptions\\\",\\\"directionOptions\\\",\\\"eq\\\",\\\"selectedDirection\\\",\\\"not\\\",\\\"hasLocalChanges\\\",\\\"hasActiveFilters\\\"]]\",\"moduleName\":\"web-directory/components/mode-manager/roster-side-panels/active-mode-filter-panel/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { inject } from '@ember/service';\nimport { computed, set } from '@ember/object';\nimport type { Maybe } from 'web-directory/types';\nimport type { InactiveModeFilterState } from '../../modes/utils';\n\ntype FilterOption = { id: string; name: string };\n\nconst ROUTING_STATE_OPTIONS = [\n    { value: 'Parked', translationKey: 'modeRoster.sidePanel.filter.routingStateOption.parked' },\n    { value: 'Disconnected', translationKey: 'modeRoster.sidePanel.filter.routingStateOption.disconnected' },\n    { value: 'Idle', translationKey: 'modeRoster.sidePanel.filter.routingStateOption.idle' },\n    { value: 'Declined', translationKey: 'modeRoster.sidePanel.filter.routingStateOption.declined' }\n];\n\n/**\n * Roster filter side panel for the inactive (workitem) mode. Allows filtering\n * workitems by status, routing state, queue, and worktype. Manages local\n * (uncommitted) state that is applied to the mode's `filterState` on \"Apply\".\n */\nexport default Component.extend({\n    classNames: ['inactive-mode-filter-panel'],\n    rosterSidePanelService: inject('modes/roster-side-panel-service'),\n    ajaxService: inject('ajax'),\n    applicationService: inject('application'),\n    storeService: inject('store'),\n\n    /**\n     * @attribute\n     * Payload from the roster side panel service. Expected shape: `{ mode }`.\n     */\n    context: null as Maybe<{ mode: any }>,\n\n    /**\n     * Status options derived from the roster's current workitems.\n     */\n    statusOptions: null as Maybe<FilterOption[]>,\n\n    /**\n     * Queue options fetched from the API based on workitem queueIds.\n     */\n    queueOptions: null as Maybe<FilterOption[]>,\n\n    /**\n     * Worktype options derived from the roster's current workitems.\n     */\n    worktypeOptions: null as Maybe<FilterOption[]>,\n\n    /**\n     * Hard-coded routing state options for the inactive roster.\n     */\n    routingStateOptions: ROUTING_STATE_OPTIONS,\n\n    /**\n     * Local (uncommitted) selected status values.\n     */\n    selectedStatuses: [] as string[],\n\n    /**\n     * Local (uncommitted) selected routing state values.\n     */\n    selectedRoutingStates: [] as string[],\n\n    /**\n     * Local (uncommitted) selected queue IDs.\n     */\n    selectedQueueIds: [] as string[],\n\n    /**\n     * Local (uncommitted) selected worktype IDs.\n     */\n    selectedWorktypeIds: [] as string[],\n\n    /**\n     * Whether the dropdown values have been synced after initial hydration.\n     * Prevents setting value on gux-dropdown-multi before its options have registered.\n     */\n    _dropdownsHydrated: false,\n\n    /**\n     * True when local selections differ from the committed filterState on the mode.\n     * Used to disable the \"Apply\" button until the user makes a change.\n     */\n    hasLocalChanges: computed(\n        'selectedStatuses.[]',\n        'selectedRoutingStates.[]',\n        'selectedQueueIds.[]',\n        'selectedWorktypeIds.[]',\n        'context',\n        function (this: any): boolean {\n            const context: { mode: any } | null | undefined = this.get('context');\n            const mode = context?.mode;\n            const filterState: InactiveModeFilterState | null = mode?.get('filterState');\n\n            const localStatuses: string[] = this.get('selectedStatuses') || [];\n            const localRoutingStates: string[] = this.get('selectedRoutingStates') || [];\n            const localQueueIds: string[] = this.get('selectedQueueIds') || [];\n            const localWorktypeIds: string[] = this.get('selectedWorktypeIds') || [];\n\n            const committedStatuses = filterState?.statuses || [];\n            const committedRoutingStates = filterState?.routingStates || [];\n            const committedQueueIds = filterState?.queueIds || [];\n            const committedWorktypeIds = filterState?.worktypeIds || [];\n\n            if (localStatuses.length !== committedStatuses.length) return true;\n            if (localRoutingStates.length !== committedRoutingStates.length) return true;\n            if (localQueueIds.length !== committedQueueIds.length) return true;\n            if (localWorktypeIds.length !== committedWorktypeIds.length) return true;\n\n            if (!localStatuses.every((s: string) => committedStatuses.includes(s))) return true;\n            if (!localRoutingStates.every((r: string) => committedRoutingStates.includes(r))) return true;\n            if (!localQueueIds.every((q: string) => committedQueueIds.includes(q))) return true;\n            if (!localWorktypeIds.every((w: string) => committedWorktypeIds.includes(w))) return true;\n\n            return false;\n        }\n    ),\n\n    /**\n     * True when there are committed filters on the mode that can be cleared.\n     * Used to disable the \"Reset\" button when there is nothing to reset.\n     */\n    hasActiveFilters: computed('context', function (this: any): boolean {\n        const context: { mode: any } | null | undefined = this.get('context');\n        const mode = context?.mode;\n        const filterState: InactiveModeFilterState | null = mode?.get('filterState');\n        if (!filterState) return false;\n\n        const statuses = filterState.statuses || [];\n        const routingStates = filterState.routingStates || [];\n        const queueIds = filterState.queueIds || [];\n        const worktypeIds = filterState.worktypeIds || [];\n\n        return statuses.length > 0 || routingStates.length > 0 || queueIds.length > 0 || worktypeIds.length > 0;\n    }),\n\n    didInsertElement() {\n        this._super(...arguments);\n        this._hydrateFromFilterState();\n        this._collectStatusOptions();\n        this._collectWorktypeOptions();\n        this._fetchQueues();\n    },\n\n    didRender() {\n        this._super(...arguments);\n\n        if (!this._dropdownsHydrated) {\n            this._dropdownsHydrated = true;\n\n            // Defer one frame so gux-dropdown-multi options register before we set values.\n            requestAnimationFrame(() => {\n                if (this.get('isDestroyed') || this.get('isDestroying')) return;\n\n                const el = this.element;\n                if (!el) return;\n\n                const statusDropdown: (HTMLElement & { value: string }) | null =\n                    el.querySelector('.filter-status-dropdown');\n                const routingStateDropdown: (HTMLElement & { value: string }) | null = el.querySelector(\n                    '.filter-routing-state-dropdown'\n                );\n                const queueDropdown: (HTMLElement & { value: string }) | null =\n                    el.querySelector('.filter-queue-dropdown');\n                const worktypeDropdown: (HTMLElement & { value: string }) | null =\n                    el.querySelector('.filter-worktype-dropdown');\n\n                const statuses: string[] = this.get('selectedStatuses') || [];\n                const routingStates: string[] = this.get('selectedRoutingStates') || [];\n                const queueIds: string[] = this.get('selectedQueueIds') || [];\n                const worktypeIds: string[] = this.get('selectedWorktypeIds') || [];\n\n                if (statusDropdown && statuses.length > 0) {\n                    statusDropdown.value = statuses.join(',');\n                }\n                if (routingStateDropdown && routingStates.length > 0) {\n                    routingStateDropdown.value = routingStates.join(',');\n                }\n                if (queueDropdown && queueIds.length > 0) {\n                    queueDropdown.value = queueIds.join(',');\n                }\n                if (worktypeDropdown && worktypeIds.length > 0) {\n                    worktypeDropdown.value = worktypeIds.join(',');\n                }\n            });\n        }\n    },\n\n    /**\n     * Hydrates local selections from the mode's current committed filterState\n     * so reopening the panel reflects active filters.\n     */\n    _hydrateFromFilterState() {\n        const context: { mode: any } | null | undefined = this.get('context');\n        const mode = context?.mode;\n        const filterState: InactiveModeFilterState | null = mode?.get('filterState');\n\n        if (filterState) {\n            this.set('selectedStatuses', filterState.statuses ? [...filterState.statuses] : []);\n            this.set('selectedRoutingStates', filterState.routingStates ? [...filterState.routingStates] : []);\n            this.set('selectedQueueIds', filterState.queueIds ? [...filterState.queueIds] : []);\n            this.set('selectedWorktypeIds', filterState.worktypeIds ? [...filterState.worktypeIds] : []);\n        } else {\n            this.set('selectedStatuses', []);\n            this.set('selectedRoutingStates', []);\n            this.set('selectedQueueIds', []);\n            this.set('selectedWorktypeIds', []);\n        }\n    },\n\n    /**\n     * Collects unique statusCategory values from the mode's allItems and builds\n     * the dropdown options. No API call needed — the value lives on each workitem.\n     */\n    _collectStatusOptions() {\n        const context: { mode: any } | null | undefined = this.get('context');\n        const mode = context?.mode;\n        const allItems: Map<string, any> | undefined = mode?.get('allItems');\n        if (!allItems || allItems.size === 0) return;\n\n        const seen = new Set<string>();\n        allItems.forEach((item: any) => {\n            const statusCategory: string | undefined = item?.workitem?.statusCategory;\n            if (statusCategory) {\n                seen.add(statusCategory);\n            }\n        });\n\n        if (seen.size === 0) return;\n\n        const options: FilterOption[] = [...seen].sort().map(value => ({\n            id: value,\n            name: value\n        }));\n\n        this.set('statusOptions', options);\n    },\n\n    /**\n     * Collects unique queueIds from workitems and fetches queue details from\n     * the routing API. Leverages Ember Data's identity map to avoid redundant fetches.\n     */\n    async _fetchQueues() {\n        const context: { mode: any } | null | undefined = this.get('context');\n        const mode = context?.mode;\n        const allItems: Map<string, any> | undefined = mode?.get('allItems');\n        if (!allItems || allItems.size === 0) return;\n\n        const queueIds = new Set<string>();\n        allItems.forEach((item: any) => {\n            const queueId: string | undefined = item?.workitem?.queueId;\n            if (queueId) {\n                queueIds.add(queueId);\n            }\n        });\n\n        if (queueIds.size === 0) return;\n\n        const storeService: any = this.get('storeService');\n        const cached: FilterOption[] = [];\n        const missingIds: string[] = [];\n\n        queueIds.forEach(id => {\n            const existing = storeService.peekRecord('queue', id);\n            if (existing) {\n                cached.push({ id: existing.get('id'), name: existing.get('name') });\n            } else {\n                missingIds.push(id);\n            }\n        });\n\n        if (missingIds.length === 0) {\n            this.set('queueOptions', cached);\n            return;\n        }\n\n        try {\n            const url = this.get('applicationService').pcV2Uri('api/v2/routing/queues');\n            const response = await this.get('ajaxService').request(url, {\n                data: { id: missingIds.join(',') }\n            });\n\n            if (this.get('isDestroyed') || this.get('isDestroying')) return;\n\n            const entities: any[] = response?.entities || [];\n\n            // Push fetched records into Ember Data's identity map for future cache hits\n            storeService.push({\n                data: entities.map((q: any) => ({\n                    id: q.id,\n                    type: 'queue',\n                    attributes: { name: q.name }\n                }))\n            });\n\n            const fetched: FilterOption[] = entities.map((q: any) => ({ id: q.id, name: q.name }));\n            this.set('queueOptions', [...cached, ...fetched]);\n        } catch (error) {\n            // Fall back to cached queues if fetch fails\n            if (cached.length > 0) {\n                this.set('queueOptions', cached);\n            }\n        }\n    },\n\n    /**\n     * Collects unique worktype id/name pairs from the mode's allItems.\n     * No API call needed — the type object (id + name) is embedded on each workitem.\n     */\n    _collectWorktypeOptions() {\n        const context: { mode: any } | null | undefined = this.get('context');\n        const mode = context?.mode;\n        const allItems: Map<string, any> | undefined = mode?.get('allItems');\n        if (!allItems || allItems.size === 0) return;\n\n        const seen = new Map<string, string>();\n        allItems.forEach((item: any) => {\n            const typeId: string | undefined = item?.workitem?.type?.id;\n            const typeName: string | undefined = item?.workitem?.type?.name;\n            if (typeId && typeName && !seen.has(typeId)) {\n                seen.set(typeId, typeName);\n            }\n        });\n\n        if (seen.size === 0) return;\n\n        const options: FilterOption[] = [...seen.entries()]\n            .map(([id, name]) => ({ id, name }))\n            .sort((a, b) => a.name.localeCompare(b.name));\n\n        this.set('worktypeOptions', options);\n    },\n\n    /**\n     * Builds an InactiveModeFilterState from current local selections.\n     * Only includes keys that represent active filter criteria.\n     */\n    _buildFilterState(): InactiveModeFilterState | null {\n        const statuses: string[] = this.get('selectedStatuses') || [];\n        const routingStates: string[] = this.get('selectedRoutingStates') || [];\n        const queueIds: string[] = this.get('selectedQueueIds') || [];\n        const worktypeIds: string[] = this.get('selectedWorktypeIds') || [];\n\n        const state: InactiveModeFilterState = {};\n\n        if (statuses && statuses.length > 0) {\n            state.statuses = statuses;\n        }\n        if (routingStates && routingStates.length > 0) {\n            state.routingStates = routingStates;\n        }\n        if (queueIds && queueIds.length > 0) {\n            state.queueIds = queueIds;\n        }\n        if (worktypeIds && worktypeIds.length > 0) {\n            state.worktypeIds = worktypeIds;\n        }\n\n        return Object.keys(state).length > 0 ? state : null;\n    },\n\n    actions: {\n        onStatusSelectionChange(event: Event) {\n            const target = event.target as HTMLElement & { value: string };\n            const value = target?.value || '';\n            const statuses = value ? value.split(',').filter(Boolean) : [];\n            set(this, 'selectedStatuses', statuses);\n        },\n\n        onRoutingStateSelectionChange(event: Event) {\n            const target = event.target as HTMLElement & { value: string };\n            const value = target?.value || '';\n            const routingStates = value ? value.split(',').filter(Boolean) : [];\n            set(this, 'selectedRoutingStates', routingStates);\n        },\n\n        onQueueSelectionChange(event: Event) {\n            const target = event.target as HTMLElement & { value: string };\n            const value = target?.value || '';\n            const queueIds = value ? value.split(',').filter(Boolean) : [];\n            set(this, 'selectedQueueIds', queueIds);\n        },\n\n        onWorktypeSelectionChange(event: Event) {\n            const target = event.target as HTMLElement & { value: string };\n            const value = target?.value || '';\n            const worktypeIds = value ? value.split(',').filter(Boolean) : [];\n            set(this, 'selectedWorktypeIds', worktypeIds);\n        },\n\n        apply() {\n            const context: { mode: any } | null | undefined = this.get('context');\n            const mode = context?.mode;\n            const newFilterState = this._buildFilterState();\n            this.get('rosterSidePanelService').close();\n            if (mode) {\n                mode.set('filterState', newFilterState);\n            }\n        },\n\n        reset() {\n            const context: { mode: any } | null | undefined = this.get('context');\n            const mode = context?.mode;\n            this.get('rosterSidePanelService').close();\n            if (mode) {\n                mode.set('filterState', null);\n            }\n        },\n\n        cancel() {\n            this.get('rosterSidePanelService').close();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"efB6A479\",\"block\":\"[[[10,\\\"h3\\\"],[14,\\\"header\\\",\\\"\\\"],[14,0,\\\"mode-manager-roster-side-panel-filter-title\\\"],[12],[1,\\\"\\\\n    \\\"],[1,[28,[35,0],[\\\"modeRoster.sidePanel.filter.title\\\"],null]],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"inactive-mode-filter-panel-content\\\"],[12],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"inactive-mode-filter-panel-body\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-form-field-dropdown\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[12],[1,[28,[35,0],[\\\"modeRoster.sidePanel.filter.inputLabel.status\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[10,\\\"gux-dropdown-multi\\\"],[14,0,\\\"filter-status-dropdown\\\"],[14,\\\"filter-type\\\",\\\"starts-with\\\"],[14,\\\"placeholder\\\",\\\"None selected\\\"],[15,\\\"oninput\\\",[28,[37,1],[[30,0],\\\"onStatusSelectionChange\\\"],null]],[15,\\\"aria-label\\\",[28,[37,0],[\\\"modeRoster.sidePanel.filter.inputLabel.status\\\"],null]],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-listbox-multi\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-select-all\\\"],[12],[13],[1,\\\"\\\\n\\\"],[42,[28,[37,3],[[28,[37,3],[[33,4]],null]],null],\\\"id\\\",[[[1,\\\"                        \\\"],[10,\\\"gux-option-multi\\\"],[15,2,[30,1,[\\\"id\\\"]]],[12],[1,[30,1,[\\\"name\\\"]]],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"gux-form-field-dropdown\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[12],[1,[28,[35,0],[\\\"modeRoster.sidePanel.filter.inputLabel.routingState\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[10,\\\"gux-dropdown-multi\\\"],[14,0,\\\"filter-routing-state-dropdown\\\"],[14,\\\"filter-type\\\",\\\"starts-with\\\"],[14,\\\"placeholder\\\",\\\"None selected\\\"],[15,\\\"oninput\\\",[28,[37,1],[[30,0],\\\"onRoutingStateSelectionChange\\\"],null]],[15,\\\"aria-label\\\",[28,[37,0],[\\\"modeRoster.sidePanel.filter.inputLabel.routingState\\\"],null]],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-listbox-multi\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-select-all\\\"],[12],[13],[1,\\\"\\\\n\\\"],[42,[28,[37,3],[[28,[37,3],[[33,5]],null]],null],\\\"value\\\",[[[1,\\\"                        \\\"],[10,\\\"gux-option-multi\\\"],[15,2,[30,2,[\\\"value\\\"]]],[12],[1,[28,[35,0],[[30,2,[\\\"translationKey\\\"]]],null]],[13],[1,\\\"\\\\n\\\"]],[2]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"gux-form-field-dropdown\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[12],[1,[28,[35,0],[\\\"modeRoster.sidePanel.filter.inputLabel.queue\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[10,\\\"gux-dropdown-multi\\\"],[14,0,\\\"filter-queue-dropdown\\\"],[14,\\\"filter-type\\\",\\\"starts-with\\\"],[14,\\\"placeholder\\\",\\\"None selected\\\"],[15,\\\"oninput\\\",[28,[37,1],[[30,0],\\\"onQueueSelectionChange\\\"],null]],[15,\\\"aria-label\\\",[28,[37,0],[\\\"modeRoster.sidePanel.filter.inputLabel.queue\\\"],null]],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-listbox-multi\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-select-all\\\"],[12],[13],[1,\\\"\\\\n\\\"],[42,[28,[37,3],[[28,[37,3],[[33,6]],null]],null],\\\"id\\\",[[[1,\\\"                        \\\"],[10,\\\"gux-option-multi\\\"],[15,2,[30,3,[\\\"id\\\"]]],[12],[1,[30,3,[\\\"name\\\"]]],[13],[1,\\\"\\\\n\\\"]],[3]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"gux-form-field-dropdown\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[12],[1,[28,[35,0],[\\\"modeRoster.sidePanel.filter.inputLabel.worktype\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[10,\\\"gux-dropdown-multi\\\"],[14,0,\\\"filter-worktype-dropdown\\\"],[14,\\\"filter-type\\\",\\\"starts-with\\\"],[14,\\\"placeholder\\\",\\\"None selected\\\"],[15,\\\"oninput\\\",[28,[37,1],[[30,0],\\\"onWorktypeSelectionChange\\\"],null]],[15,\\\"aria-label\\\",[28,[37,0],[\\\"modeRoster.sidePanel.filter.inputLabel.worktype\\\"],null]],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-listbox-multi\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-select-all\\\"],[12],[13],[1,\\\"\\\\n\\\"],[42,[28,[37,3],[[28,[37,3],[[33,7]],null]],null],\\\"id\\\",[[[1,\\\"                        \\\"],[10,\\\"gux-option-multi\\\"],[15,2,[30,4,[\\\"id\\\"]]],[12],[1,[30,4,[\\\"name\\\"]]],[13],[1,\\\"\\\\n\\\"]],[4]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"inactive-mode-filter-panel-footer\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-button\\\"],[14,\\\"accent\\\",\\\"primary\\\"],[15,\\\"onclick\\\",[28,[37,1],[[30,0],\\\"apply\\\"],null]],[15,\\\"disabled\\\",[28,[37,8],[[33,9]],null]],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,0],[\\\"modeRoster.sidePanel.filter.buttonLabel.apply\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"gux-button\\\"],[15,\\\"onclick\\\",[28,[37,1],[[30,0],\\\"reset\\\"],null]],[15,\\\"disabled\\\",[28,[37,8],[[33,10]],null]],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,0],[\\\"modeRoster.sidePanel.filter.buttonLabel.reset\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"gux-button\\\"],[14,\\\"accent\\\",\\\"ghost\\\"],[15,\\\"onclick\\\",[28,[37,1],[[30,0],\\\"cancel\\\"],null]],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,0],[\\\"modeRoster.sidePanel.filter.buttonLabel.cancel\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[13]],[\\\"option\\\",\\\"option\\\",\\\"queue\\\",\\\"worktype\\\"],false,[\\\"t\\\",\\\"action\\\",\\\"each\\\",\\\"-track-array\\\",\\\"statusOptions\\\",\\\"routingStateOptions\\\",\\\"queueOptions\\\",\\\"worktypeOptions\\\",\\\"not\\\",\\\"hasLocalChanges\\\",\\\"hasActiveFilters\\\"]]\",\"moduleName\":\"web-directory/components/mode-manager/roster-side-panels/inactive-mode-filter-panel/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { gt } from '@ember/object/computed';\nimport { inject } from '@ember/service';\nimport { Maybe } from 'web-directory/types';\n\nconst OUTBOUND_VALUES = ['voice', 'email', 'message', 'workitem'] as const;\ntype OutboundValue = (typeof OUTBOUND_VALUES)[number];\n\n/**\n * Inputs an {@link OutboundOption} availability predicate reads from. Kept intentionally\n * narrow (a permission getter + session feature gates) so predicates stay pure and unit-testable.\n */\nexport interface OutboundAvailabilityContext {\n    /** The permissions service, read via its cached `can*`/`*Enabled` computeds. */\n    permissions: { get(key: string): boolean };\n    /** The session service, read via its feature-benefit computeds (e.g. `allowCreateWorkitemOutbound`). */\n    session: { get(key: string): boolean };\n}\n\ntype OutboundOption = {\n    value: OutboundValue;\n    component: string;\n    /**\n     * Dependency paths (relative to this component) that should retrigger the availability\n     * scan when they change. Aggregated across all options into the computed's dependent keys.\n     */\n    availabilityDependentKeys: string[];\n    /**\n     * Predicate deciding whether the current user can start this outbound interaction. Mirrors\n     * the gating the same interaction uses elsewhere in the app (see permissions service).\n     */\n    isAvailable: (context: OutboundAvailabilityContext) => boolean;\n};\n\n/**\n * The full outbound catalog. Availability is configured per option here (not in a component\n * computed) so each interaction owns the permissions/toggles it requires:\n *  - voice   → `permissions.phoneEnabled` (conversation:call:add + unified comms)\n *  - email   → `permissions.canEmailOnBehalfOfQueue` (conversation:email:create)\n *  - message → `permissions.canSendMessageOnBehalfOfQueue` (conversation:message:create)\n *  - workitem→ `permissions.canViewWorkitem` (workitems:workitem:view) AND `session.allowCreateWorkitemOutbound`\n */\nconst ALL_OUTBOUND_OPTIONS: OutboundOption[] = [\n    {\n        value: 'voice',\n        component: 'mode-manager/roster-side-panels/outbound-panel/create-voice',\n        availabilityDependentKeys: ['permissions.phoneEnabled'],\n        isAvailable: ({ permissions }) => permissions.get('phoneEnabled')\n    },\n    {\n        value: 'email',\n        component: 'mode-manager/roster-side-panels/outbound-panel/create-email',\n        availabilityDependentKeys: ['permissions.canEmailOnBehalfOfQueue'],\n        isAvailable: ({ permissions }) => permissions.get('canEmailOnBehalfOfQueue')\n    },\n    {\n        value: 'message',\n        component: 'mode-manager/roster-side-panels/outbound-panel/create-message',\n        availabilityDependentKeys: ['permissions.canSendMessageOnBehalfOfQueue'],\n        isAvailable: ({ permissions }) => permissions.get('canSendMessageOnBehalfOfQueue')\n    },\n    {\n        value: 'workitem',\n        component: 'mode-manager/roster-side-panels/outbound-panel/create-workitem',\n        availabilityDependentKeys: ['permissions.canViewWorkitem', 'session.allowCreateWorkitemOutbound'],\n        isAvailable: ({ permissions, session }) =>\n            permissions.get('canViewWorkitem') && session.get('allowCreateWorkitemOutbound')\n    }\n];\n\n/** Unique union of every option's dependent keys, used to drive the availability computed. */\nconst OUTBOUND_AVAILABILITY_DEPENDENT_KEYS = ALL_OUTBOUND_OPTIONS.reduce<string[]>((keys, option) => {\n    option.availabilityDependentKeys.forEach(key => {\n        if (!keys.includes(key)) keys.push(key);\n    });\n    return keys;\n}, []);\n\n/**\n * Side panel body for the conversation outbound flow. Receives optional `context` from\n * {@link ModeManagerRosterSidePanelService}. Outbound options are availability-gated per\n * option; when only one is available the segmented control is hidden and its form renders alone.\n */\nexport default Component.extend({\n    classNames: ['mode-manager-roster-side-panel-outbound'] as const,\n\n    rosterSidePanelService: inject('modes/roster-side-panel-service'),\n    permissions: inject('permissions'),\n    session: inject('session'),\n\n    /**\n     * @attribute\n     * Arbitrary payload from the roster side panel service (modes pass what they need).\n     */\n    context: null as Maybe<unknown>,\n\n    /**\n     * Outbound options the current user is permitted to start, re-scanned whenever any\n     * option's declared dependency keys change.\n     *\n     * `computed`'s typings can't express spreading a dynamically-built key list before the\n     * getter, so the call is cast. Safe: the spread is a `string[]` of dependent keys and the\n     * final argument is the getter, matching `computed`'s runtime contract.\n     */\n    availableOutboundOptions: (computed as (...args: unknown[]) => any)(\n        ...OUTBOUND_AVAILABILITY_DEPENDENT_KEYS,\n        function (this: any): OutboundOption[] {\n            const availabilityContext: OutboundAvailabilityContext = {\n                permissions: this.get('permissions'),\n                session: this.get('session')\n            };\n            return ALL_OUTBOUND_OPTIONS.filter((option: OutboundOption) => option.isAvailable(availabilityContext));\n        }\n    ),\n\n    /** Hide the segmented control unless there's an actual choice to make. */\n    hasMultipleOutboundOptions: gt('availableOutboundOptions.length', 1),\n\n    currentValue: 'voice' as OutboundValue,\n\n    currentOption: computed('currentValue', 'availableOutboundOptions', function (this: any):\n        | OutboundOption\n        | undefined {\n        const options: OutboundOption[] = this.get('availableOutboundOptions');\n        return options.find((option: OutboundOption) => option.value === this.get('currentValue')) || options[0];\n    }),\n\n    init(this: any) {\n        this._super(...arguments);\n        this._ensureCurrentValueAvailable();\n    },\n\n    /** Falls back to the first available option when the default selection is gated out. */\n    _ensureCurrentValueAvailable(this: any) {\n        const options: OutboundOption[] = this.get('availableOutboundOptions');\n        if (!options.length) {\n            return;\n        }\n        const isCurrentAvailable = options.some((option: OutboundOption) => option.value === this.get('currentValue'));\n        if (!isCurrentAvailable) {\n            this.set('currentValue', options[0].value);\n        }\n    },\n\n    _setValue(value: OutboundValue) {\n        this.set('currentValue', value);\n    },\n\n    _complete() {\n        this.get('rosterSidePanelService').close();\n    },\n\n    actions: {\n        onValueChange(event: { target: { value: OutboundValue } }) {\n            this._setValue(event.target.value);\n        },\n\n        onComplete() {\n            this._complete();\n        }\n    }\n});\n","import { A } from '@ember/array';\nimport Component from '@ember/component';\nimport { computed, get } from '@ember/object';\nimport { map, readOnly } from '@ember/object/computed';\nimport { inject } from '@ember/service';\nimport { Maybe } from 'web-directory/types';\nimport { warnClosureAction } from 'web-directory/utils/acd';\nimport {\n    type RecipientInputValidation,\n    type RecipientValidationContext\n} from 'web-directory/utils/outbound-recipient-validation';\n\nexport type QueueItem = {\n    id: string;\n    name?: string;\n    value: string;\n};\n\nexport type RecipientItem = {\n    id?: string;\n    value?: string;\n    name?: string;\n    email?: string;\n    bestEmailAddress?: string;\n    phoneNumber?: string;\n    bestPhoneNumber?: string;\n    externalContactId?: string;\n    /**\n     * Source entity used when placing calls (PersonModel, QueueModel, or external marker).\n     * Mirrors dial-pad participant shape so makeCall/makeConferenceCall can resolve userId/queueId.\n     */\n    entity?: unknown;\n    type?: string;\n    externalOrganization?: unknown;\n};\n\ntype RecipientTag = {\n    value: string;\n    text: string;\n    data?: { id?: string };\n};\n\nexport type CreateConversationPayload = {\n    interactionType: string;\n    queue: QueueItem;\n    recipient: RecipientItem;\n    recipients: RecipientItem[];\n    searchValue: string;\n};\n\n/**\n * Configurable outbound creation panel for voice/email/message style conversations.\n * It centralizes queue selection and recipient selection while allowing parent-driven submit behavior.\n */\nexport default Component.extend({\n    classNames: ['mode-outbound-panel-create-conversation'] as const,\n\n    session: inject('session'),\n    queueService: inject('queue'),\n    logger: inject('stashLogger'),\n\n    /**\n     * @attribute\n     * The interaction type used by the selectors (e.g. `email`, `message`, `call`).\n     */\n    interactionType: 'message' as 'message' | 'email' | 'call',\n\n    /**\n     * @attribute\n     * The interaction type to use for queue default lookup.\n     */\n    queueInteractionType: null as Maybe<'message' | 'email' | 'call'>,\n\n    /**\n     * @attribute\n     * Optional supplemental classes for the queue input.\n     */\n    queueSupplementalClasses: '',\n\n    /**\n     * @attribute\n     * Header title text (already translated by caller).\n     */\n    title: '',\n\n    /**\n     * @attribute\n     * Description text (already translated by caller).\n     */\n    description: '',\n\n    /**\n     * @attribute\n     * Determines whether recipient input is single or multi select.\n     */\n    recipientSelectionMode: 'single' as 'single' | 'multi',\n\n    /**\n     * @attribute\n     * Optional override for recipient placeholder (already translated by caller).\n     */\n    recipientPlaceholder: '',\n\n    /**\n     * @attribute\n     * Optional screen reader label key/string for the multi-select recipient input.\n     */\n    recipientLabel: null as Maybe<string>,\n\n    /**\n     * @attribute\n     * Optional supplemental classes for the recipient input.\n     */\n    recipientSupplementalClasses: '',\n\n    /**\n     * @attribute\n     * Optional flag to hide the recipient target dropdown.\n     */\n    hideRecipientTargetDropdown: false,\n\n    /**\n     * @attribute\n     * `true` enables dialpad toggle and digit entry.\n     */\n    enableDialpad: false,\n\n    /**\n     * @attribute\n     * Additional disabled state controlled by parent.\n     */\n    disabled: false,\n\n    /**\n     * @attribute\n     * Label text for the action button (already translated by caller).\n     */\n    actionLabel: '',\n\n    /**\n     * @attribute\n     * Array of available filters to showcase in the queue target selector component.\n     * We only want to showcase queue options.\n     */\n    queueFilter: ['queue'] as const,\n\n    /**\n     * @attribute\n     * Array of available filters to showcase in the contact target selector component.\n     * We only want to showcase external contact options.\n     */\n    recipientFilter: [] as const,\n\n    /**\n     * @attribute\n     * Parent-owned recipient validation. When omitted, no inline validation runs.\n     * Soft severity shows an info message only; hard also disables submit.\n     */\n    recipientValidation: null as Maybe<RecipientInputValidation>,\n\n    searchValue: '',\n\n    queue: null as Maybe<QueueItem>,\n\n    recipient: null as Maybe<RecipientItem>,\n\n    /**\n     * Selected multi-select recipients. Initialized per-instance in `init` so instances\n     * do not share a prototype Ember array (shared defaults break chip add/remove).\n     */\n    recipients: null as Maybe<any>,\n\n    authUser: readOnly('session.publicApiUser'),\n\n    recipientTags: map('recipients', function (recipient: RecipientItem): RecipientTag {\n        const value = recipient.value || recipient.email || recipient.phoneNumber || '';\n        return {\n            value,\n            text: recipient.name || value,\n            data:\n                recipient.externalContactId || recipient.id\n                    ? { id: recipient.externalContactId || recipient.id }\n                    : undefined\n        };\n    }),\n\n    /**\n     * Translation key from the parent validator, or null when the current input is valid / unvalidated.\n     */\n    errorMessageKey: computed(\n        'recipientValidation',\n        'searchValue',\n        'recipient.value',\n        'recipients.@each.{value,entity}',\n        function (this: any): string | null {\n            const validation: Maybe<RecipientInputValidation> = this.get('recipientValidation');\n            if (!validation?.validate) return null;\n\n            const context: RecipientValidationContext = {\n                searchValue: this.get('searchValue') || '',\n                recipient: this.get('recipient'),\n                recipients: ((this.get('recipients') as unknown as RecipientItem[]) || []).slice()\n            };\n\n            return validation.validate(context);\n        }\n    ),\n\n    isSubmitDisabled: computed(\n        'searchValue',\n        'disabled',\n        'queue.id',\n        'recipientSelectionMode',\n        'recipient',\n        'recipients.length',\n        'recipientValidation.severity',\n        'errorMessageKey',\n        function (this: any): boolean {\n            if (this.get('disabled') || !this.get('queue.id')) return true;\n\n            const validation: Maybe<RecipientInputValidation> = this.get('recipientValidation');\n            if (validation?.severity === 'hard' && this.get('errorMessageKey')) {\n                return true;\n            }\n\n            if (this.get('recipientSelectionMode') === 'multi') {\n                return this.get('recipients.length') === 0 && !this.get('searchValue');\n            }\n\n            return !this.get('recipient') && !this.get('searchValue');\n        }\n    ),\n\n    init() {\n        this._super(...arguments);\n        this.set('recipients', A([] as RecipientItem[]));\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.initQueue();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        const recipients = this.get('recipients');\n        if (recipients) {\n            recipients.clear();\n        }\n    },\n\n    initQueue() {\n        if (!this.get('queue')) {\n            const queueInteractionType = this.get('queueInteractionType') || this.get('interactionType');\n            this.get('queueService')\n                .getDefaultQueue(queueInteractionType)\n                .then((queue: QueueItem) => {\n                    this.set('queue', queue);\n                })\n                .catch((error: Error) => {\n                    this.get('logger').error('There was an issue getting the default queue', error);\n                });\n        }\n    },\n\n    _recipientValue(target: RecipientItem) {\n        if (this.get('interactionType') === 'email') {\n            return get(target, 'email') || get(target, 'bestEmailAddress') || get(target, 'value');\n        }\n        // Internal users/queues often have no phoneNumber — fall back to id like dial-pad.\n        return (\n            get(target, 'phoneNumber') || get(target, 'bestPhoneNumber') || get(target, 'value') || get(target, 'id')\n        );\n    },\n\n    /**\n     * Adds a recipient using the same shape dial-pad uses for call participants so\n     * internal users (no phoneNumber) and queues still produce a selectable chip and\n     * a payload makeCall/makeConferenceCall can resolve.\n     */\n    _addRecipient(target: RecipientItem) {\n        let recipients = this.get('recipients');\n        if (!recipients) {\n            recipients = A([] as RecipientItem[]);\n            this.set('recipients', recipients);\n        }\n        const id = get(target, 'id') as string | undefined;\n\n        if (this.get('interactionType') === 'email') {\n            const value = this._recipientValue(target);\n            if (!value) return;\n\n            const exists = (recipients as unknown as RecipientItem[]).some(\n                (recipient: RecipientItem) => recipient.value === value\n            );\n            if (!exists) {\n                recipients.pushObject({\n                    id,\n                    value,\n                    name: (get(target, 'name') as string) || value,\n                    externalContactId: id\n                });\n            }\n            return;\n        }\n\n        const phoneNumber =\n            (get(target, 'phoneNumber') as string | undefined) ||\n            (get(target, 'bestPhoneNumber') as string | undefined);\n\n        if (id) {\n            const type = get(target, 'type') as string | undefined;\n            const value = phoneNumber || id;\n            const exists = (recipients as unknown as RecipientItem[]).some(\n                (recipient: RecipientItem) => recipient.value === value || recipient.id === id\n            );\n            if (!exists) {\n                recipients.pushObject({\n                    entity: type === 'external' ? { type: 'externalcontacts/contact' } : target,\n                    externalOrganization: get(target, 'externalOrganization'),\n                    id,\n                    name: (get(target, 'name') as string) || phoneNumber || value,\n                    value,\n                    externalContactId: type === 'external' ? id : undefined\n                });\n            }\n            return;\n        }\n\n        const value = phoneNumber || (get(target, 'value') as string | undefined);\n        if (!value) return;\n\n        const exists = (recipients as unknown as RecipientItem[]).some(\n            (recipient: RecipientItem) => recipient.value === value\n        );\n        if (!exists) {\n            recipients.pushObject({\n                name: value,\n                value\n            });\n        }\n    },\n\n    /**\n     * @action\n     *\n     * Closure action invoked when user submits the configured panel.\n     */\n    actionSubmit: (payload: CreateConversationPayload) => warnClosureAction('actionSubmit', payload),\n\n    _recipientSelected(target: Maybe<RecipientItem>) {\n        if (this.get('recipientSelectionMode') === 'multi') {\n            if (target) this._addRecipient(target);\n            return;\n        }\n\n        if (!target) {\n            this.set('recipient', null);\n            return;\n        }\n\n        const value = this._recipientValue(target);\n        this.set('recipient', value ? { id: get(target, 'id'), value, name: get(target, 'name') || value } : null);\n    },\n\n    _addNumber(value: string) {\n        this.set('searchValue', `${this.get('searchValue')}${value}`);\n        if (this.get('recipientSelectionMode') === 'single' && this.get('recipient')) {\n            this.set('recipient', null);\n        }\n    },\n\n    _submit() {\n        if (this.get('isSubmitDisabled')) return;\n        this.actionSubmit({\n            interactionType: this.get('interactionType'),\n            queue: this.get('queue') as QueueItem,\n            recipient: this.get('recipient') as RecipientItem,\n            recipients: ((this.get('recipients') as unknown as RecipientItem[]) || []).slice(),\n            searchValue: this.get('searchValue')\n        });\n    },\n\n    actions: {\n        onQueueSelected(queue: QueueItem) {\n            this.set('queue', queue);\n        },\n\n        onRecipientSelected(target: Maybe<RecipientItem>) {\n            this._recipientSelected(target);\n        },\n\n        onRecipientRemovedByIndex(index: number) {\n            const recipients = this.get('recipients');\n            if (!recipients || typeof index !== 'number' || index < 0 || index >= recipients.length) {\n                return;\n            }\n            recipients.removeAt(index, 1);\n        },\n\n        onAddNumber(value: string) {\n            this._addNumber(value);\n        },\n\n        onSubmit() {\n            this._submit();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"NhkGmW+w\",\"block\":\"[[[10,0],[12],[1,\\\"\\\\n    \\\"],[10,\\\"h4\\\"],[12],[1,[34,0]],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,[34,1]],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[18,1,null],[1,\\\"\\\\n\\\\n\\\"],[1,[28,[35,3],null,[[\\\"autofocus\\\",\\\"interactionType\\\",\\\"authUser\\\",\\\"size\\\",\\\"disableInputEnter\\\",\\\"includeFilters\\\",\\\"placeholder\\\",\\\"clearTranslation\\\",\\\"targetSelected\\\",\\\"value\\\",\\\"myQueuesOnly\\\",\\\"supplementalClasses\\\"],[true,[33,4],[33,5],\\\"small\\\",true,[33,6],[28,[37,7],[\\\"purecloud.onBehalfOfQueue\\\"],null],[28,[37,7],[\\\"purecloud.clearBehalfOfQueue\\\"],null],[28,[37,8],[[30,0],\\\"onQueueSelected\\\"],null],[33,9],true,[33,10]]]]],[1,\\\"\\\\n\\\\n\\\"],[10,0],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,12],[[33,13],\\\"multi\\\"],null],[[[1,\\\"        \\\"],[1,[28,[35,14],null,[[\\\"interactionType\\\",\\\"authUser\\\",\\\"includeFilters\\\",\\\"value\\\",\\\"size\\\",\\\"targetSelected\\\",\\\"targetRemoved\\\",\\\"placeholder\\\",\\\"label\\\",\\\"searchValue\\\",\\\"submit\\\",\\\"supplementalClasses\\\",\\\"hideTargetDropdown\\\"],[[33,4],[33,5],[33,15],[33,16],\\\"small\\\",[28,[37,8],[[30,0],\\\"onRecipientSelected\\\"],null],[28,[37,8],[[30,0],\\\"onRecipientRemovedByIndex\\\"],null],[33,17],[33,18],[28,[37,19],[[33,20]],null],[28,[37,8],[[30,0],\\\"onSubmit\\\"],null],[33,21],[33,22]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[1,[28,[35,3],null,[[\\\"interactionType\\\",\\\"authUser\\\",\\\"includeFilters\\\",\\\"value\\\",\\\"size\\\",\\\"searchValue\\\",\\\"targetSelected\\\",\\\"placeholder\\\",\\\"supplementalClasses\\\",\\\"hideTargetDropdown\\\"],[[33,4],[33,5],[33,15],[33,23],\\\"small\\\",[28,[37,19],[[33,20]],null],[28,[37,8],[[30,0],\\\"onRecipientSelected\\\"],null],[33,17],[33,21],[33,22]]]]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"\\\\n\\\"],[41,[33,24],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"mode-outbound-panel-create-conversation-error\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"alert-info\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[10,2],[12],[1,[28,[35,7],[[33,24]],null]],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,25],[[[1,\\\"    \\\"],[1,[28,[35,26],null,[[\\\"actionDigitPress\\\"],[[28,[37,8],[[30,0],\\\"onAddNumber\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[10,\\\"gux-button\\\"],[14,0,\\\"mode-outbound-panel-create-conversation-submit-button\\\"],[14,\\\"accent\\\",\\\"primary\\\"],[15,\\\"onclick\\\",[28,[37,8],[[30,0],\\\"onSubmit\\\"],null]],[15,\\\"disabled\\\",[36,27]],[12],[1,\\\"\\\\n    \\\"],[1,[34,28]],[1,\\\"\\\\n\\\"],[13]],[\\\"&default\\\"],false,[\\\"title\\\",\\\"description\\\",\\\"yield\\\",\\\"single-select-target-dropdown\\\",\\\"interactionType\\\",\\\"authUser\\\",\\\"queueFilter\\\",\\\"t\\\",\\\"action\\\",\\\"queue\\\",\\\"queueSupplementalClasses\\\",\\\"if\\\",\\\"eq\\\",\\\"recipientSelectionMode\\\",\\\"multi-select-target-dropdown\\\",\\\"recipientFilter\\\",\\\"recipientTags\\\",\\\"recipientPlaceholder\\\",\\\"recipientLabel\\\",\\\"mut\\\",\\\"searchValue\\\",\\\"recipientSupplementalClasses\\\",\\\"hideRecipientTargetDropdown\\\",\\\"recipient\\\",\\\"errorMessageKey\\\",\\\"enableDialpad\\\",\\\"mode-manager/mode-dial-pad\\\",\\\"isSubmitDisabled\\\",\\\"actionLabel\\\"]]\",\"moduleName\":\"web-directory/components/mode-manager/roster-side-panels/outbound-panel/create-conversation/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { inject } from '@ember/service';\nimport { isValidEmailAddress } from 'web-directory/utils/email';\nimport { validateEmailInput, type RecipientInputValidation } from 'web-directory/utils/outbound-recipient-validation';\nimport { type CreateConversationPayload, type RecipientItem } from '../create-conversation/component';\n\nexport default Component.extend({\n    classNames: ['mode-outbound-panel-create-email'] as const,\n\n    acdemail: inject('acdemail'),\n    conversationModeService: inject('modes/conversation-mode-service'),\n    queueService: inject('queue'),\n    logger: inject('stashLogger'),\n    notification: inject('notification'),\n    intl: inject('intl'),\n\n    recipientFilter: ['external'] as const,\n\n    busy: false,\n\n    /**\n     * Hard email validation — shows inline info and disables submit while the search value is invalid.\n     */\n    recipientValidation: {\n        severity: 'hard',\n        validate: validateEmailInput\n    } as RecipientInputValidation,\n\n    /**\n     * Generates a recipient string value for email creation\n     *\n     * @returns the newly generated recipient string for email creation\n     */\n    _buildRecipientsStr(recipients: RecipientItem[]): string {\n        return recipients.length ? recipients.map(recipient => recipient.value).join(', ') : '';\n    },\n\n    /**\n     * @action\n     * @optional\n     */\n    actionComplete: () => {\n        /** no-op */\n    },\n\n    async _submit(payload: CreateConversationPayload) {\n        const searchValue = payload.searchValue?.trim();\n\n        const { recipients, queue } = payload;\n\n        if (!!searchValue) {\n            if (isValidEmailAddress(searchValue)) {\n                const exists = recipients.some(recipient => recipient.email === searchValue);\n                if (!exists) recipients.push({ value: searchValue });\n            } else {\n                this.get('notification').error(\n                    this.get('intl').t('purecloud.acdEmail.queueEmailErrorTitle'),\n                    this.get('intl').t('purecloud.acdEmail.createEmailRecipientError')\n                );\n                return;\n            }\n        }\n\n        const recipientsStr = this._buildRecipientsStr(recipients);\n        const validRecipients = isValidEmailAddress(recipientsStr);\n\n        if (!validRecipients) {\n            this.get('notification').error(\n                this.get('intl').t('purecloud.acdEmail.queueEmailErrorTitle'),\n                this.get('intl').t('purecloud.acdEmail.createEmailRecipientError')\n            );\n            return;\n        }\n\n        this.set('busy', true);\n        const party = recipients[0];\n        const externalContactId = party ? party.externalContactId : undefined;\n        try {\n            const response = await this.get('acdemail').createEmail(queue.id, recipientsStr, externalContactId);\n            this.get('conversationModeService').requestInteractionSelection(response?.id);\n            this.get('queueService')\n                .setDefaultQueue(queue, 'email')\n                .catch((error: Error) => {\n                    this.get('logger').error('There was an issue setting the default queue', error);\n                });\n            this.actionComplete();\n        } catch (error: any) {\n            const queueName = queue.value;\n            const message =\n                error.payload?.code === 'email.outbound.queue.address.required'\n                    ? this.get('intl').t('purecloud.acdEmail.unknownCreateEmailError', { queueName })\n                    : this.get('intl').t('purecloud.acdEmail.queueEmailRequired', { queueName });\n\n            this.get('notification').error(this.get('intl').t('purecloud.acdEmail.queueEmailErrorTitle'), message);\n        } finally {\n            this.set('busy', false);\n        }\n    },\n\n    actions: {\n        onSubmit(payload: CreateConversationPayload) {\n            this._submit(payload);\n        },\n\n        onComplete() {\n            this.actionComplete();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"xBW8ySza\",\"block\":\"[[[1,[28,[35,0],null,[[\\\"interactionType\\\",\\\"queueInteractionType\\\",\\\"title\\\",\\\"description\\\",\\\"recipientSelectionMode\\\",\\\"recipientPlaceholder\\\",\\\"recipientLabel\\\",\\\"actionLabel\\\",\\\"actionSubmit\\\",\\\"recipientSupplementalClasses\\\",\\\"queueSupplementalClasses\\\",\\\"recipientFilter\\\",\\\"disabled\\\",\\\"recipientValidation\\\"],[\\\"email\\\",\\\"email\\\",[28,[37,1],[\\\"modeRoster.sidePanel.outbound.sendEmail\\\"],null],[28,[37,1],[\\\"modeRoster.sidePanel.outbound.descriptionEmail\\\"],null],\\\"multi\\\",[28,[37,1],[\\\"searchInput.emailSearch\\\"],null],\\\"searchInput.emailSearchLabel\\\",[28,[37,1],[\\\"modeRoster.sidePanel.outbound.create\\\"],null],[28,[37,2],[[30,0],\\\"onSubmit\\\"],null],\\\"email-address-input\\\",\\\"email-queue-selection\\\",[33,3],[33,4],[33,5]]]]],[1,\\\"\\\\n\\\"]],[],false,[\\\"mode-manager/roster-side-panels/outbound-panel/create-conversation\\\",\\\"t\\\",\\\"action\\\",\\\"recipientFilter\\\",\\\"busy\\\",\\\"recipientValidation\\\"]]\",\"moduleName\":\"web-directory/components/mode-manager/roster-side-panels/outbound-panel/create-email/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed, get } from '@ember/object';\nimport { inject } from '@ember/service';\nimport { Maybe } from 'web-directory/types';\nimport {\n    validatePhoneNumberInput,\n    type RecipientInputValidation\n} from 'web-directory/utils/outbound-recipient-validation';\nimport { type UnionFromTuple } from 'web-directory/utils/types';\nimport { type CreateConversationPayload, type RecipientItem } from '../create-conversation/component';\n\nconst DEFAULT_SUB_MESSAGE_TYPE = 'sms' as const;\nconst NON_DEFAULT_SUB_MESSAGE_TYPES = ['whatsapp', 'open'] as const;\nconst SUB_MESSAGE_TYPES = [DEFAULT_SUB_MESSAGE_TYPE, ...NON_DEFAULT_SUB_MESSAGE_TYPES];\ntype SubMessageType = UnionFromTuple<typeof SUB_MESSAGE_TYPES>;\n\nexport default Component.extend({\n    classNames: ['mode-outbound-panel-create-message'] as const,\n\n    acdsms: inject('acdsms'),\n    conversationModeService: inject('modes/conversation-mode-service'),\n    intl: inject('intl'),\n    logger: inject('stashLogger'),\n    notification: inject('notification'),\n    addressformat: inject('addressformat'),\n    queueService: inject('queue'),\n    session: inject('session'),\n\n    recipientFilter: ['external'] as const,\n\n    busy: false,\n\n    actionComplete: () => {\n        /** no-op */\n    },\n\n    /**\n     * The default sub message type\n     */\n    defaultSubMessageType: DEFAULT_SUB_MESSAGE_TYPE as SubMessageType,\n\n    /**\n     * The sub message type that is currently selected in the dropdown. This is used to send as an option to the\n     * backend and to change the icon in the onCreateMessage button. Value should be initialized to the same value as DEFAULT_SUB_MESSAGE_TYPE.\n     */\n    selectedSubMessageType: DEFAULT_SUB_MESSAGE_TYPE as SubMessageType,\n\n    /**\n     * Array of available sub message types to showcase in the dropdown.\n     * We only want to showcase sub message types that are supported by the backend.\n     * The default sub message type is always included at the beginning of the array.\n     * The sub message types are sorted alphabetically by the locale.\n     */\n    subMessageTypes: computed('defaultSubMessageType', function (): SubMessageType[] {\n        const sortedSubMessageTypes: SubMessageType[] = [...NON_DEFAULT_SUB_MESSAGE_TYPES].sort((a, b) =>\n            a.localeCompare(b, this.get('intl.isoLocale'))\n        );\n        return [this.get('defaultSubMessageType'), ...sortedSubMessageTypes];\n    }),\n\n    /**\n     * Soft phone validation for SMS/WhatsApp. Open messaging skips number verification.\n     */\n    recipientValidation: computed('selectedSubMessageType', function (this: any): RecipientInputValidation {\n        const component = this;\n        const subMsgType: SubMessageType = this.get('selectedSubMessageType');\n        return {\n            severity: 'soft',\n            validate(context) {\n                if (subMsgType === 'open') return null;\n                return validatePhoneNumberInput(context, {\n                    formatEnabled: true,\n                    subMsgType,\n                    formatAddress: (value, country, type) =>\n                        component.get('addressformat').formatAddress(value, country, type),\n                    isValidNumber: (value, country, strict, type) =>\n                        component.get('addressformat').isValidNumber(value, country, strict, type)\n                });\n            }\n        };\n    }),\n\n    /**\n     * `true` if\n     *  - conversation is an sms conversation\n     *  - direct routing feature is on\n     *  - user has a sms direct routing address\n     */\n    _hasDirectRoutingSmsAddress() {\n        const subMsgType = this.get('selectedSubMessageType');\n        if (subMsgType !== 'sms') return false;\n\n        const session = this.get('session');\n        const person = get(session, 'person');\n        if (!person) {\n            this.get('logger').info('No user on session when getting direct routing sms address');\n            return false;\n        }\n\n        try {\n            const directRoutingSmsAddresses = person\n                .getContactFieldValuesByType('sms')\n                .filter((contact: any) => contact.value.integration === 'directrouting');\n            return directRoutingSmsAddresses && directRoutingSmsAddresses.length > 0;\n        } catch (error) {\n            this.get('logger').error('Unable to fetch direct routing sms address from the user', {\n                error,\n                remoteData: { person }\n            });\n            return false;\n        }\n    },\n\n    /**\n     * Generates the options with corresponding formatted values that are sent when creating a new message.\n     */\n    async _generateOptions(payload: CreateConversationPayload, subMsgType: SubMessageType) {\n        const recipient: RecipientItem | null = payload.recipient ? ({ ...payload.recipient } as RecipientItem) : null;\n        const options = {\n            entity: null as Maybe<RecipientItem>,\n            useUserFromAddress: false,\n            queueId: payload.queue?.id,\n            queueName: payload.queue?.name,\n            toAddressMessengerType: subMsgType\n        };\n\n        // supply parameter to use Agent's Direct Routing SMS address outbound if queue setting and user address matches\n        if (payload.queue && this._hasDirectRoutingSmsAddress()) {\n            const fullQueue = await this.get('queueService').getQueue(payload.queue.id);\n            if (fullQueue.directRouting) {\n                options.useUserFromAddress =\n                    fullQueue.directRouting.messageMediaSettings.useAgentAddressOutbound === true;\n            }\n        }\n\n        const recipientValue = recipient?.value ?? payload.searchValue;\n        const formattedAddress = this.get('addressformat').formatAddress(recipientValue, undefined, subMsgType);\n        if (recipient) {\n            recipient.value = formattedAddress;\n            options.entity = recipient;\n        } else {\n            options.entity = { value: formattedAddress };\n        }\n\n        return options;\n    },\n\n    async _submit(payload: CreateConversationPayload) {\n        const queue = payload.queue;\n        this.set('busy', true);\n\n        const subMsgType = this.get('selectedSubMessageType');\n        const options = await this._generateOptions(payload, subMsgType);\n\n        try {\n            const response = await this.get('acdsms').createMessage(options, false);\n            this.get('conversationModeService').requestInteractionSelection(response?.id);\n            // catching error from within this promise because this doesn't affect the message being created\n            this.get('queueService')\n                .setDefaultQueue(queue, 'message')\n                .catch((error: Error) => {\n                    this.get('logger').error('There was an issue setting the default queue', error);\n                });\n            this.actionComplete();\n        } catch (error: any) {\n            let message = this.get('intl').t('purecloud.acdInteraction.sms.errors.errorCreatingMessage');\n            if (error.payload) {\n                if (error.payload.code === 'queue.address.required') {\n                    message = this.get('intl').t('purecloud.acdInteraction.sms.errors.queueSubMessageRequired', {\n                        subMessageType: subMsgType,\n                        queueName: get(queue, 'name')\n                    });\n                } else if (error.payload.code === 'active.conversation') {\n                    message = this.get('intl').t('purecloud.acdInteraction.sms.errors.conversationAlreadyExists');\n                } else if (error.payload.code === 'invalid.phone.number') {\n                    message = this.get('intl').t('purecloud.acdInteraction.sms.errors.invalidPhoneNumber');\n                } else if (error.payload.code === 'invalid.whatsapp.address') {\n                    message = this.get('intl').t('purecloud.acdInteraction.sms.errors.invalidWhatsAppAddress');\n                }\n            }\n\n            this.get('notification').error(\n                this.get('intl').t('purecloud.acdInteraction.sms.errors.queueSmsErrorTitle'),\n                message\n            );\n        } finally {\n            this.set('busy', false);\n        }\n    },\n\n    _selectType(messageType: SubMessageType) {\n        this.set('selectedSubMessageType', messageType);\n    },\n\n    actions: {\n        /**\n         * @note message type only\n         */\n        onSelectType(event: InputEvent) {\n            this._selectType(\n                event && event.target\n                    ? ((event.target as HTMLInputElement).value as SubMessageType)\n                    : this.get('defaultSubMessageType')\n            );\n        },\n\n        onSubmit(payload: CreateConversationPayload) {\n            this._submit(payload);\n        },\n\n        onComplete() {\n            this.actionComplete();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"z/srnL1X\",\"block\":\"[[[6,[39,0],null,[[\\\"interactionType\\\",\\\"queueInteractionType\\\",\\\"title\\\",\\\"description\\\",\\\"recipientSelectionMode\\\",\\\"recipientPlaceholder\\\",\\\"actionLabel\\\",\\\"actionSubmit\\\",\\\"recipientSupplementalClasses\\\",\\\"queueSupplementalClasses\\\",\\\"recipientFilter\\\",\\\"hideRecipientTargetDropdown\\\",\\\"recipientValidation\\\",\\\"enableDialpad\\\"],[\\\"message\\\",\\\"message\\\",[28,[37,1],[\\\"modeRoster.sidePanel.outbound.sendMessage\\\"],null],[28,[37,1],[\\\"modeRoster.sidePanel.outbound.descriptionMessage\\\"],null],\\\"single\\\",[28,[37,1],[[28,[37,2],[\\\"searchInput.\\\",[33,3],\\\"Search\\\"],null]],null],[28,[37,1],[\\\"modeRoster.sidePanel.outbound.create\\\"],null],[28,[37,4],[[30,0],\\\"onSubmit\\\"],null],\\\"message-number-selection\\\",\\\"message-queue-selection\\\",[33,5],[28,[37,6],[[33,3],\\\"open\\\"],null],[33,7],true]],[[\\\"default\\\"],[[[[1,\\\"    \\\"],[10,\\\"gux-dropdown\\\"],[14,1,\\\"messenger-type-dropdown\\\"],[14,3,\\\"messenger\\\"],[15,\\\"onchange\\\",[28,[37,4],[[30,0],\\\"onSelectType\\\"],null]],[15,\\\"aria-label\\\",[28,[37,1],[\\\"purecloud.acdInteraction.interactionTypes.supportedMessengerTypes.selectType\\\"],null]],[15,\\\"disabled\\\",[28,[37,8],[[33,9]],null]],[15,2,[36,3]],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-listbox\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,11],[[28,[37,11],[[33,9]],null]],null],null,[[[1,\\\"                \\\"],[10,\\\"gux-option\\\"],[14,\\\"role\\\",\\\"option\\\"],[15,1,[28,[37,2],[[30,1],\\\"-submessage-type\\\"],null]],[15,2,[30,1]],[15,\\\"selected\\\",[52,[28,[37,6],[[30,1],[33,3]],null],\\\"true\\\"]],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,1],[[28,[37,2],[\\\"purecloud.acdInteraction.interactionTypes.supportedMessengerTypes.\\\",[30,1]],null]],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]]],[\\\"messageType\\\"],false,[\\\"mode-manager/roster-side-panels/outbound-panel/create-conversation\\\",\\\"t\\\",\\\"concat\\\",\\\"selectedSubMessageType\\\",\\\"action\\\",\\\"recipientFilter\\\",\\\"eq\\\",\\\"recipientValidation\\\",\\\"not\\\",\\\"subMessageTypes\\\",\\\"each\\\",\\\"-track-array\\\",\\\"if\\\"]]\",\"moduleName\":\"web-directory/components/mode-manager/roster-side-panels/outbound-panel/create-message/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { inject } from '@ember/service';\nimport { readOnly } from '@ember/object/computed';\nimport { type CreateConversationPayload, type QueueItem, type RecipientItem } from '../create-conversation/component';\nimport {\n    type RecipientInputValidation,\n    validatePhoneNumberInput\n} from 'web-directory/utils/outbound-recipient-validation';\n\nexport default Component.extend({\n    classNames: ['mode-manager-roster-side-panel-outbound-create-voice'] as const,\n\n    busy: false,\n\n    addressformat: inject('addressformat'),\n    conversationModeService: inject('modes/conversation-mode-service'),\n    emergencyLocation: inject('emergency-location'),\n    session: inject('session'),\n    queueService: inject('queue'),\n    logger: inject('stashLogger'),\n    phone: inject('phone'),\n    intl: inject('intl'),\n\n    emergencyLocationOn: readOnly('session.features.emergencyLocation'),\n    emergencyLocationData: readOnly('emergencyLocation.emergencyLocationData'),\n    currentUserId: readOnly('session.person.id'),\n\n    actionComplete: () => {\n        /** no-op */\n    },\n\n    /**\n     * Soft phone validation — shows inline info for unverified numbers without blocking submit.\n     */\n    recipientValidation: computed(function (this: any): RecipientInputValidation {\n        const component = this;\n        return {\n            severity: 'soft',\n            validate(context) {\n                return validatePhoneNumberInput(context, {\n                    isValidNumber: (value, country, strict, subMsgType) => {\n                        if (!component.get('addressformat')) return false;\n                        return component.get('addressformat').isValidNumber(value, country, strict, subMsgType);\n                    }\n                });\n            }\n        };\n    }),\n\n    _makeConferenceCall(recipients: RecipientItem[], queue: QueueItem) {\n        return this.get('phone')\n            .makeConferenceCall(recipients, queue)\n            .then((conversation: { id?: string } | void) => {\n                this.get('queueService').setDefaultQueue(queue, 'call');\n                return conversation;\n            })\n            .catch(error => {\n                this.get('logger').error('Could not make call.', error);\n            });\n    },\n\n    _makeCall(value: string | object, queue: QueueItem, externalContactId?: string) {\n        return this.get('phone')\n            .makeCall(value, null, queue, externalContactId)\n            .catch(error => {\n                this.get('logger').error('Could not make call.', error);\n                throw error;\n            });\n    },\n\n    /**\n     * Resolves the dial-pad-compatible call target from a recipient.\n     * Internal users/queues must pass the entity model (callUserId/callQueueId);\n     * external contacts and raw numbers pass the address string.\n     */\n    _resolveCallTarget(recipient: RecipientItem): { target: string | object; externalContactId?: string } {\n        const entity = recipient.entity as { type?: string; get?: (key: string) => unknown } | undefined;\n        const entityType = entity && typeof entity.get === 'function' ? entity.get('type') : entity?.type;\n        const isExternalContact = entityType === 'externalcontacts/contact';\n\n        if (entity && !isExternalContact) {\n            return { target: entity as object };\n        }\n\n        const value = recipient.value ?? recipient.bestPhoneNumber ?? recipient.phoneNumber;\n        if (!value) {\n            throw new Error('No value found for recipient');\n        }\n\n        return {\n            target: value,\n            externalContactId: isExternalContact ? recipient.id : recipient.externalContactId\n        };\n    },\n\n    async _submit(payload: CreateConversationPayload) {\n        const searchValue = payload.searchValue.trim();\n        const { queue, recipients } = payload;\n\n        if (searchValue) {\n            const formattedAddress = this.get('addressformat').formatAddress(searchValue);\n            const exists = recipients.find(recipient => recipient.value === formattedAddress);\n            if (!exists) recipients.push({ value: formattedAddress });\n        }\n\n        // searchValue can add a recipient, so we need to check if there are any recipients after adding the search value\n        if (!recipients.length) return;\n\n        this.set('busy', true);\n\n        try {\n            let createdConversation: { id?: string } | null | void = null;\n\n            if (recipients.length >= 2) {\n                createdConversation = await this._makeConferenceCall(recipients, queue);\n            } else if (recipients.length === 1) {\n                const { target, externalContactId } = this._resolveCallTarget(recipients[0]);\n                createdConversation = await this._makeCall(target, queue, externalContactId);\n            }\n\n            this.get('conversationModeService').requestInteractionSelection(createdConversation?.id);\n            this.get('queueService')\n                .setDefaultQueue(queue, 'call')\n                .catch((error: Error) => {\n                    this.get('logger').error('There was an issue setting the default queue', error);\n                });\n            this.actionComplete();\n        } catch (error: any) {\n            this.get('logger').error('Could not make call.', error);\n            const message = this.get('intl').lookup('purecloud.error.dialpad.call');\n            this.get('phone').showFeedbackErrorNotification(message);\n        } finally {\n            this.set('busy', false);\n        }\n    },\n\n    actions: {\n        onSubmit(payload: CreateConversationPayload) {\n            this._submit(payload);\n        },\n\n        onComplete() {\n            this.actionComplete();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"laOKNtTP\",\"block\":\"[[[1,[28,[35,0],null,[[\\\"interactionType\\\",\\\"queueInteractionType\\\",\\\"title\\\",\\\"description\\\",\\\"recipientSelectionMode\\\",\\\"recipientPlaceholder\\\",\\\"actionLabel\\\",\\\"queueSupplementalClasses\\\",\\\"recipientSupplementalClasses\\\",\\\"actionSubmit\\\",\\\"enableDialpad\\\",\\\"recipientValidation\\\"],[\\\"call\\\",\\\"call\\\",[28,[37,1],[\\\"modeRoster.sidePanel.outbound.makeCall\\\"],null],[28,[37,1],[\\\"modeRoster.sidePanel.outbound.descriptionCall\\\"],null],\\\"multi\\\",[28,[37,1],[\\\"searchInput.callSearch\\\"],null],[28,[37,1],[\\\"modeRoster.sidePanel.outbound.call\\\"],null],\\\"call-queue-selection\\\",\\\"phone-number-input\\\",[28,[37,2],[[30,0],\\\"onSubmit\\\"],null],true,[33,3]]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[33,5],[[[1,\\\"    \\\"],[1,[28,[35,6],null,[[\\\"showTitle\\\",\\\"showResetButton\\\",\\\"personId\\\",\\\"emergencyLocationData\\\"],[true,false,[33,7],[33,8]]]]],[1,\\\"\\\\n\\\"]],[]],null]],[],false,[\\\"mode-manager/roster-side-panels/outbound-panel/create-conversation\\\",\\\"t\\\",\\\"action\\\",\\\"recipientValidation\\\",\\\"if\\\",\\\"emergencyLocationOn\\\",\\\"emergency-location\\\",\\\"currentUserId\\\",\\\"emergencyLocationData\\\"]]\",\"moduleName\":\"web-directory/components/mode-manager/roster-side-panels/outbound-panel/create-voice/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { readOnly } from '@ember/object/computed';\nimport { inject } from '@ember/service';\nimport { QueueItem } from 'web-directory/components/mode-manager/roster-side-panels/outbound-panel/create-conversation/component';\nimport { Maybe } from 'web-directory/types';\nimport {\n    CreateWorkitemFormValues,\n    StatusOption,\n    WORKITEM_DESCRIPTION_MAX_LENGTH,\n    WORKITEM_NAME_MAX_LENGTH,\n    WorkbinOption,\n    WorktypeOption,\n    buildCreateWorkitemPayload,\n    canSubmitCreateWorkitem,\n    extractCreateWorkitemErrorMessage,\n    normalizeGuxDate,\n    validateCreateWorkitemForm\n} from 'web-directory/utils/workitem-create';\n\nconst FORM_TRANSLATION_PREFIX = 'modeRoster.sidePanel.outbound.workitemForm.';\nconst ERROR_TRANSLATION_PREFIX = `${FORM_TRANSLATION_PREFIX}errors.`;\n\n/**\n * Outbound panel form for creating a workitem. Submits through\n * {@link WorkitemModeService.createWorkitem}.\n */\nexport default Component.extend({\n    classNames: ['mode-outbound-panel-create-workitem'] as const,\n\n    workitemModeService: inject('modes/workitem-mode-service'),\n    intlService: inject('intl'),\n    loggerService: inject('stashLogger'),\n    sessionService: inject('session'),\n\n    name: '',\n    typeId: '',\n    statusId: '',\n    workbinId: '',\n    description: '',\n    priority: '',\n    dueDate: '',\n    dateExpires: '',\n    durationSeconds: '',\n    ttlDate: '',\n\n    busy: false,\n\n    /** Server-provided error message from the last failed create attempt; null when none. */\n    submitError: null as string | null,\n\n    /** Worktype options for the dropdown; null until the first load resolves. */\n    worktypes: null as WorktypeOption[] | null,\n\n    /** True while worktypes are being fetched. */\n    worktypesLoading: false,\n\n    /** True when the worktype fetch failed. */\n    worktypesError: false,\n\n    /** Status options for the selected worktype; null until a worktype is chosen and loaded. */\n    statuses: null as StatusOption[] | null,\n\n    /** True while statuses for the selected worktype are being fetched. */\n    statusesLoading: false,\n\n    /** True when the status fetch failed. */\n    statusesError: false,\n\n    /** Workbin options for the dropdown; null until the first load resolves. */\n    workbins: null as WorkbinOption[] | null,\n\n    /** True while workbins are being fetched. */\n    workbinsLoading: false,\n\n    /** True when the workbin fetch failed. */\n    workbinsError: false,\n\n    /** The queue the workitem is routed to; null until selected. */\n    queue: null as Maybe<QueueItem>,\n\n    /** The authenticated user, required by the shared queue target dropdown. */\n    authUser: readOnly('sessionService.publicApiUser'),\n\n    /** Restricts the shared target dropdown to queue results only. */\n    queueFilter: ['queue'] as const,\n\n    nameMaxLength: WORKITEM_NAME_MAX_LENGTH,\n    descriptionMaxLength: WORKITEM_DESCRIPTION_MAX_LENGTH,\n\n    /**\n     * @action\n     * @optional\n     */\n    actionComplete: () => {\n        /** no-op */\n    },\n\n    formValues: computed(\n        'name',\n        'typeId',\n        'statusId',\n        'workbinId',\n        'queue.id',\n        'description',\n        'priority',\n        'dueDate',\n        'dateExpires',\n        'durationSeconds',\n        'ttlDate',\n        function (this: any): CreateWorkitemFormValues {\n            return {\n                name: this.get('name'),\n                typeId: this.get('typeId'),\n                statusId: this.get('statusId'),\n                workbinId: this.get('workbinId'),\n                queueId: this.get('queue.id') || '',\n                description: this.get('description'),\n                priority: this.get('priority'),\n                dueDate: this.get('dueDate'),\n                dateExpires: this.get('dateExpires'),\n                durationSeconds: this.get('durationSeconds'),\n                ttlDate: this.get('ttlDate')\n            };\n        }\n    ),\n\n    // gux-dropdown's `loading` attribute crashes Stencil and leaves the radial loader\n    // spinning forever, so loading is communicated via a placeholder message instead.\n    worktypePlaceholderKey: computed('worktypesLoading', function (this: any) {\n        return this.get('worktypesLoading')\n            ? `${FORM_TRANSLATION_PREFIX}worktypeLoading`\n            : `${FORM_TRANSLATION_PREFIX}worktypePlaceholder`;\n    }),\n\n    statusPlaceholderKey: computed('statusesLoading', function (this: any) {\n        return this.get('statusesLoading')\n            ? `${FORM_TRANSLATION_PREFIX}statusLoading`\n            : `${FORM_TRANSLATION_PREFIX}statusPlaceholder`;\n    }),\n\n    workbinPlaceholderKey: computed('workbinsLoading', function (this: any) {\n        return this.get('workbinsLoading')\n            ? `${FORM_TRANSLATION_PREFIX}workbinLoading`\n            : `${FORM_TRANSLATION_PREFIX}workbinPlaceholder`;\n    }),\n\n    worktypesDisabled: computed('worktypesLoading', 'worktypesError', 'worktypes.length', function (this: any) {\n        const worktypes = this.get('worktypes');\n        return this.get('worktypesLoading') || this.get('worktypesError') || !(worktypes && worktypes.length);\n    }),\n\n    statusesDisabled: computed('typeId', 'statusesLoading', 'statusesError', 'statuses.length', function (this: any) {\n        const statuses = this.get('statuses');\n        return (\n            !this.get('typeId') ||\n            this.get('statusesLoading') ||\n            this.get('statusesError') ||\n            !(statuses && statuses.length)\n        );\n    }),\n\n    workbinsDisabled: computed('workbinsLoading', 'workbinsError', 'workbins.length', function (this: any) {\n        const workbins = this.get('workbins');\n        return this.get('workbinsLoading') || this.get('workbinsError') || !(workbins && workbins.length);\n    }),\n\n    fieldErrors: computed('formValues', function () {\n        return validateCreateWorkitemForm(this.get('formValues'));\n    }),\n\n    isSubmitDisabled: computed('busy', 'formValues', function () {\n        return this.get('busy') || !canSubmitCreateWorkitem(this.get('formValues'));\n    }),\n\n    nameErrorKey: computed('fieldErrors.name', function () {\n        const key = this.get('fieldErrors').name;\n        return key ? `${ERROR_TRANSLATION_PREFIX}${key}` : null;\n    }),\n\n    descriptionErrorKey: computed('fieldErrors.description', function () {\n        const key = this.get('fieldErrors').description;\n        return key ? `${ERROR_TRANSLATION_PREFIX}${key}` : null;\n    }),\n\n    priorityErrorKey: computed('fieldErrors.priority', function () {\n        const key = this.get('fieldErrors').priority;\n        return key ? `${ERROR_TRANSLATION_PREFIX}${key}` : null;\n    }),\n\n    dueDateErrorKey: computed('fieldErrors.dueDate', function () {\n        const key = this.get('fieldErrors').dueDate;\n        return key ? `${ERROR_TRANSLATION_PREFIX}${key}` : null;\n    }),\n\n    dateExpiresErrorKey: computed('fieldErrors.dateExpires', function () {\n        const key = this.get('fieldErrors').dateExpires;\n        return key ? `${ERROR_TRANSLATION_PREFIX}${key}` : null;\n    }),\n\n    durationSecondsErrorKey: computed('fieldErrors.durationSeconds', function () {\n        const key = this.get('fieldErrors').durationSeconds;\n        return key ? `${ERROR_TRANSLATION_PREFIX}${key}` : null;\n    }),\n\n    ttlDateErrorKey: computed('fieldErrors.ttlDate', function () {\n        const key = this.get('fieldErrors').ttlDate;\n        return key ? `${ERROR_TRANSLATION_PREFIX}${key}` : null;\n    }),\n\n    init(this: any) {\n        this._super(...arguments);\n        this._loadWorktypes();\n        this._loadWorkbins();\n    },\n\n    /**\n     * Loads a dropdown's options into component state, toggling its loading/error flags\n     * and guarding against setting state after teardown. When `shouldApply` is provided,\n     * results (and the loading reset) are ignored if it returns false at resolution time —\n     * used to discard stale status loads after the worktype changes again.\n     */\n    async _loadDropdown(\n        this: any,\n        config: {\n            fetch: () => Promise<Array<{ id: string; name: string }>>;\n            listKey: string;\n            loadingKey: string;\n            errorKey: string;\n            logLabel: string;\n            shouldApply?: () => boolean;\n        }\n    ) {\n        this.set(config.loadingKey, true);\n        this.set(config.errorKey, false);\n\n        const isApplicable = () =>\n            !this.get('isDestroyed') && !this.get('isDestroying') && (!config.shouldApply || config.shouldApply());\n\n        try {\n            const items = await config.fetch();\n            if (!isApplicable()) return;\n            this.set(config.listKey, items);\n        } catch (error: unknown) {\n            if (!isApplicable()) return;\n            this.set(config.errorKey, true);\n            this.get('loggerService').error(config.logLabel, { remoteData: { error } });\n        } finally {\n            if (isApplicable()) {\n                this.set(config.loadingKey, false);\n            }\n        }\n    },\n\n    _loadWorktypes(this: any) {\n        return this._loadDropdown({\n            fetch: () => this.get('workitemModeService').fetchWorktypes(),\n            listKey: 'worktypes',\n            loadingKey: 'worktypesLoading',\n            errorKey: 'worktypesError',\n            logLabel: 'Outbound create-workitem: failed to load worktypes'\n        });\n    },\n\n    _loadStatuses(this: any, worktypeId: string) {\n        return this._loadDropdown({\n            fetch: () => this.get('workitemModeService').fetchWorktypeStatuses(worktypeId),\n            listKey: 'statuses',\n            loadingKey: 'statusesLoading',\n            errorKey: 'statusesError',\n            logLabel: 'Outbound create-workitem: failed to load statuses',\n            // Discard results if the user changed the worktype while this was in flight.\n            shouldApply: () => this.get('typeId') === worktypeId\n        });\n    },\n\n    _loadWorkbins(this: any) {\n        return this._loadDropdown({\n            fetch: () => this.get('workitemModeService').fetchWorkbins(),\n            listKey: 'workbins',\n            loadingKey: 'workbinsLoading',\n            errorKey: 'workbinsError',\n            logLabel: 'Outbound create-workitem: failed to load workbins'\n        });\n    },\n\n    _setDateFromGuxEvent(property: 'dueDate' | 'dateExpires' | 'ttlDate', event: { detail?: string }) {\n        // gux-datepicker emits `yyyy-mm-dd` on its `input` event detail. Ignore stray events\n        // without a valid date so native inner-input events can't clobber a selected value.\n        const normalized = normalizeGuxDate(event?.detail ?? '');\n        if (normalized) this.set(property, normalized);\n    },\n\n    async _submit(this: any) {\n        if (this.get('isSubmitDisabled')) return;\n\n        const payload = buildCreateWorkitemPayload(this.get('formValues'));\n        this.set('busy', true);\n        this.set('submitError', null);\n\n        try {\n            await this.get('workitemModeService').createWorkitem(payload);\n            // Created workitems enter a queue rather than appearing locally as a true\n            // outbound entity, so there is no roster selection to request here.\n            this.actionComplete();\n        } catch (error: unknown) {\n            this.get('loggerService').error('Outbound create-workitem: failed to create workitem', {\n                remoteData: { error }\n            });\n            // Surface the API's validation message (e.g. \"dateExpires cannot be greater than ttl\")\n            // inline in the form, falling back to a generic message when none is provided.\n            const serverMessage = extractCreateWorkitemErrorMessage(error);\n            this.set(\n                'submitError',\n                serverMessage || this.get('intlService').t('modeRoster.sidePanel.outbound.workitemForm.createError')\n            );\n        } finally {\n            this.set('busy', false);\n        }\n    },\n\n    actions: {\n        onNameInput(event: Event) {\n            const target = event.target as HTMLInputElement | null;\n            this.set('name', target?.value ?? '');\n        },\n\n        onWorktypeChange(this: any, event: Event) {\n            const target = event.target as HTMLInputElement | null;\n            const typeId = target?.value ?? '';\n            this.set('typeId', typeId);\n\n            // Statuses belong to the worktype; reset the prior selection/options and reload.\n            this.set('statusId', '');\n            this.set('statuses', null);\n            this.set('statusesError', false);\n\n            if (typeId) {\n                this._loadStatuses(typeId);\n            } else {\n                this.set('statusesLoading', false);\n            }\n        },\n\n        onStatusChange(event: Event) {\n            const target = event.target as HTMLInputElement | null;\n            this.set('statusId', target?.value ?? '');\n        },\n\n        onWorkbinChange(event: Event) {\n            const target = event.target as HTMLInputElement | null;\n            this.set('workbinId', target?.value ?? '');\n        },\n\n        onQueueSelected(this: any, queue: Maybe<QueueItem>) {\n            this.set('queue', queue);\n        },\n\n        onDescriptionInput(event: Event) {\n            const target = event.target as HTMLTextAreaElement | null;\n            this.set('description', target?.value ?? '');\n        },\n\n        onPriorityInput(event: Event) {\n            const target = event.target as HTMLInputElement | null;\n            this.set('priority', target?.value ?? '');\n        },\n\n        onDurationSecondsInput(event: Event) {\n            const target = event.target as HTMLInputElement | null;\n            this.set('durationSeconds', target?.value ?? '');\n        },\n\n        onDueDateChange(event: { detail?: string }) {\n            this._setDateFromGuxEvent('dueDate', event);\n        },\n\n        onDateExpiresChange(event: { detail?: string }) {\n            this._setDateFromGuxEvent('dateExpires', event);\n        },\n\n        onTtlDateChange(event: { detail?: string }) {\n            this._setDateFromGuxEvent('ttlDate', event);\n        },\n\n        onSubmit() {\n            this._submit();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"rTGtBZW8\",\"block\":\"[[[10,0],[12],[1,\\\"\\\\n    \\\"],[10,\\\"h4\\\"],[12],[1,[28,[35,0],[\\\"modeRoster.sidePanel.outbound.workitemForm.title\\\"],null]],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,\\\"gux-form-field-text-like\\\"],[14,\\\"label-position\\\",\\\"above\\\"],[14,\\\"indicator-mark\\\",\\\"optional\\\"],[15,\\\"onchange\\\",[28,[37,1],[[30,0],\\\"onNameInput\\\"],null]],[12],[1,\\\"\\\\n    \\\"],[10,\\\"input\\\"],[14,\\\"slot\\\",\\\"input\\\"],[14,3,\\\"workitem-name\\\"],[14,1,\\\"mode-outbound-workitem-name\\\"],[15,2,[36,2]],[15,\\\"maxlength\\\",[36,3]],[14,\\\"required\\\",\\\"\\\"],[14,\\\"aria-required\\\",\\\"true\\\"],[14,4,\\\"text\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[14,\\\"for\\\",\\\"mode-outbound-workitem-name\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,0],[\\\"modeRoster.sidePanel.outbound.workitemForm.fields.name\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,5],[[[1,\\\"        \\\"],[10,1],[14,\\\"slot\\\",\\\"error\\\"],[12],[1,[28,[35,0],[[33,5]],null]],[13],[1,\\\"\\\\n\\\"]],[]],null],[13],[1,\\\"\\\\n\\\\n\\\"],[10,\\\"gux-form-field-dropdown\\\"],[14,\\\"label-position\\\",\\\"above\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[12],[1,[28,[35,0],[\\\"modeRoster.sidePanel.outbound.workitemForm.fields.worktype\\\"],null]],[13],[1,\\\"\\\\n    \\\"],[10,\\\"gux-dropdown\\\"],[14,1,\\\"mode-outbound-workitem-worktype\\\"],[15,\\\"placeholder\\\",[29,[[28,[37,0],[[33,6]],null]]]],[14,\\\"filter-type\\\",\\\"starts-with\\\"],[15,\\\"disabled\\\",[36,7]],[15,2,[36,8]],[15,\\\"onchange\\\",[28,[37,1],[[30,0],\\\"onWorktypeChange\\\"],null]],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-listbox\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,10],[[28,[37,10],[[33,11]],null]],null],\\\"id\\\",[[[1,\\\"                \\\"],[10,\\\"gux-option\\\"],[15,2,[30,1,[\\\"id\\\"]]],[15,\\\"selected\\\",[52,[28,[37,12],[[30,1,[\\\"id\\\"]],[33,8]],null],\\\"true\\\"]],[12],[1,\\\"\\\\n                    \\\"],[1,[30,1,[\\\"name\\\"]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,13],[[[1,\\\"        \\\"],[10,1],[14,\\\"slot\\\",\\\"error\\\"],[12],[1,[28,[35,0],[\\\"modeRoster.sidePanel.outbound.workitemForm.errors.worktypeLoad\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],null],[13],[1,\\\"\\\\n\\\\n\\\"],[10,\\\"gux-form-field-dropdown\\\"],[14,\\\"label-position\\\",\\\"above\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[12],[1,[28,[35,0],[\\\"modeRoster.sidePanel.outbound.workitemForm.fields.status\\\"],null]],[13],[1,\\\"\\\\n    \\\"],[10,\\\"gux-dropdown\\\"],[14,1,\\\"mode-outbound-workitem-status\\\"],[15,\\\"placeholder\\\",[29,[[28,[37,0],[[33,14]],null]]]],[14,\\\"filter-type\\\",\\\"starts-with\\\"],[15,\\\"disabled\\\",[36,15]],[15,2,[36,16]],[15,\\\"onchange\\\",[28,[37,1],[[30,0],\\\"onStatusChange\\\"],null]],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-listbox\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,10],[[28,[37,10],[[33,17]],null]],null],\\\"id\\\",[[[1,\\\"                \\\"],[10,\\\"gux-option\\\"],[15,2,[30,2,[\\\"id\\\"]]],[15,\\\"selected\\\",[52,[28,[37,12],[[30,2,[\\\"id\\\"]],[33,16]],null],\\\"true\\\"]],[12],[1,\\\"\\\\n                    \\\"],[1,[30,2,[\\\"name\\\"]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[2]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,18],[[[1,\\\"        \\\"],[10,1],[14,\\\"slot\\\",\\\"error\\\"],[12],[1,[28,[35,0],[\\\"modeRoster.sidePanel.outbound.workitemForm.errors.statusLoad\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],null],[13],[1,\\\"\\\\n\\\\n\\\"],[10,\\\"gux-form-field-dropdown\\\"],[14,\\\"label-position\\\",\\\"above\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[12],[1,[28,[35,0],[\\\"modeRoster.sidePanel.outbound.workitemForm.fields.workbin\\\"],null]],[13],[1,\\\"\\\\n    \\\"],[10,\\\"gux-dropdown\\\"],[14,1,\\\"mode-outbound-workitem-workbin\\\"],[15,\\\"placeholder\\\",[29,[[28,[37,0],[[33,19]],null]]]],[14,\\\"filter-type\\\",\\\"starts-with\\\"],[15,\\\"disabled\\\",[36,20]],[15,2,[36,21]],[15,\\\"onchange\\\",[28,[37,1],[[30,0],\\\"onWorkbinChange\\\"],null]],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-listbox\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,10],[[28,[37,10],[[33,22]],null]],null],\\\"id\\\",[[[1,\\\"                \\\"],[10,\\\"gux-option\\\"],[15,2,[30,3,[\\\"id\\\"]]],[15,\\\"selected\\\",[52,[28,[37,12],[[30,3,[\\\"id\\\"]],[33,21]],null],\\\"true\\\"]],[12],[1,\\\"\\\\n                    \\\"],[1,[30,3,[\\\"name\\\"]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[3]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,23],[[[1,\\\"        \\\"],[10,1],[14,\\\"slot\\\",\\\"error\\\"],[12],[1,[28,[35,0],[\\\"modeRoster.sidePanel.outbound.workitemForm.errors.workbinLoad\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],null],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"mode-outbound-panel-create-workitem-queue-field\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"label\\\"],[12],[1,[28,[35,0],[\\\"modeRoster.sidePanel.outbound.workitemForm.fields.queue\\\"],null]],[13],[1,\\\"\\\\n    \\\"],[1,[28,[35,24],null,[[\\\"interactionType\\\",\\\"authUser\\\",\\\"size\\\",\\\"disableInputEnter\\\",\\\"includeFilters\\\",\\\"myQueuesOnly\\\",\\\"value\\\",\\\"placeholder\\\",\\\"clearTranslation\\\",\\\"targetSelected\\\"],[\\\"workitem\\\",[33,25],\\\"small\\\",true,[33,26],true,[33,27],[28,[37,0],[\\\"modeRoster.sidePanel.outbound.workitemForm.queuePlaceholder\\\"],null],[28,[37,0],[\\\"modeRoster.sidePanel.outbound.workitemForm.queueClear\\\"],null],[28,[37,1],[[30,0],\\\"onQueueSelected\\\"],null]]]]],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,\\\"gux-form-field-textarea\\\"],[14,\\\"label-position\\\",\\\"above\\\"],[15,\\\"onchange\\\",[28,[37,1],[[30,0],\\\"onDescriptionInput\\\"],null]],[12],[1,\\\"\\\\n    \\\"],[10,\\\"textarea\\\"],[14,\\\"slot\\\",\\\"input\\\"],[14,3,\\\"workitem-description\\\"],[14,1,\\\"mode-outbound-workitem-description\\\"],[15,\\\"maxlength\\\",[36,28]],[12],[1,\\\"        \\\"],[1,[34,29]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[14,\\\"for\\\",\\\"mode-outbound-workitem-description\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,0],[\\\"modeRoster.sidePanel.outbound.workitemForm.fields.description\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,30],[[[1,\\\"        \\\"],[10,1],[14,\\\"slot\\\",\\\"error\\\"],[12],[1,[28,[35,0],[[33,30]],null]],[13],[1,\\\"\\\\n\\\"]],[]],null],[13],[1,\\\"\\\\n\\\\n\\\"],[10,\\\"gux-form-field-number\\\"],[14,\\\"label-position\\\",\\\"above\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"input\\\"],[14,\\\"slot\\\",\\\"input\\\"],[14,3,\\\"workitem-priority\\\"],[14,1,\\\"mode-outbound-workitem-priority\\\"],[15,2,[36,31]],[15,\\\"oninput\\\",[28,[37,1],[[30,0],\\\"onPriorityInput\\\"],null]],[14,4,\\\"number\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[14,\\\"for\\\",\\\"mode-outbound-workitem-priority\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,0],[\\\"modeRoster.sidePanel.outbound.workitemForm.fields.priority\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,32],[[[1,\\\"        \\\"],[10,1],[14,\\\"slot\\\",\\\"error\\\"],[12],[1,[28,[35,0],[[33,32]],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[10,1],[14,\\\"slot\\\",\\\"help\\\"],[12],[1,[28,[35,0],[\\\"modeRoster.sidePanel.outbound.workitemForm.help.priority\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]]],[13],[1,\\\"\\\\n\\\\n\\\"],[10,\\\"gux-form-field-number\\\"],[14,\\\"label-position\\\",\\\"above\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"input\\\"],[14,\\\"slot\\\",\\\"input\\\"],[14,3,\\\"workitem-duration-seconds\\\"],[14,1,\\\"mode-outbound-workitem-duration-seconds\\\"],[15,2,[36,33]],[14,\\\"min\\\",\\\"0\\\"],[15,\\\"oninput\\\",[28,[37,1],[[30,0],\\\"onDurationSecondsInput\\\"],null]],[14,4,\\\"number\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[14,\\\"for\\\",\\\"mode-outbound-workitem-duration-seconds\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,0],[\\\"modeRoster.sidePanel.outbound.workitemForm.fields.durationSeconds\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,34],[[[1,\\\"        \\\"],[10,1],[14,\\\"slot\\\",\\\"error\\\"],[12],[1,[28,[35,0],[[33,34]],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[10,1],[14,\\\"slot\\\",\\\"help\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,0],[\\\"modeRoster.sidePanel.outbound.workitemForm.help.durationSeconds\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"mode-outbound-panel-create-workitem-date-field\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"gux-datepicker\\\"],[14,\\\"label-position\\\",\\\"above\\\"],[15,\\\"label\\\",[29,[[28,[37,0],[\\\"modeRoster.sidePanel.outbound.workitemForm.fields.dueDate\\\"],null]]]],[15,2,[36,35]],[15,\\\"onInput\\\",[28,[37,1],[[30,0],\\\"onDueDateChange\\\"],null]],[15,\\\"aria-invalid\\\",[52,[33,36],\\\"true\\\",\\\"false\\\"]],[15,\\\"aria-describedby\\\",[52,[33,36],\\\"mode-outbound-workitem-due-date-error\\\"]],[12],[13],[1,\\\"\\\\n\\\"],[41,[33,36],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"mode-outbound-panel-create-workitem-error\\\"],[14,1,\\\"mode-outbound-workitem-due-date-error\\\"],[14,\\\"role\\\",\\\"alert\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/hexagon-exclamation-solid\\\"],[14,\\\"decorative\\\",\\\"\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[10,1],[12],[1,[28,[35,0],[[33,36]],null]],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"mode-outbound-panel-create-workitem-date-field\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"gux-datepicker\\\"],[14,\\\"label-position\\\",\\\"above\\\"],[15,\\\"label\\\",[29,[[28,[37,0],[\\\"modeRoster.sidePanel.outbound.workitemForm.fields.dateExpires\\\"],null]]]],[15,2,[36,37]],[15,\\\"onInput\\\",[28,[37,1],[[30,0],\\\"onDateExpiresChange\\\"],null]],[15,\\\"aria-invalid\\\",[52,[33,38],\\\"true\\\",\\\"false\\\"]],[15,\\\"aria-describedby\\\",[52,[33,38],\\\"mode-outbound-workitem-date-expires-error\\\"]],[12],[13],[1,\\\"\\\\n\\\"],[41,[33,38],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"mode-outbound-panel-create-workitem-error\\\"],[14,1,\\\"mode-outbound-workitem-date-expires-error\\\"],[14,\\\"role\\\",\\\"alert\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/hexagon-exclamation-solid\\\"],[14,\\\"decorative\\\",\\\"\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[10,1],[12],[1,[28,[35,0],[[33,38]],null]],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"mode-outbound-panel-create-workitem-date-field\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"gux-datepicker\\\"],[14,\\\"label-position\\\",\\\"above\\\"],[15,\\\"label\\\",[29,[[28,[37,0],[\\\"modeRoster.sidePanel.outbound.workitemForm.fields.ttl\\\"],null]]]],[15,2,[36,39]],[15,\\\"onInput\\\",[28,[37,1],[[30,0],\\\"onTtlDateChange\\\"],null]],[15,\\\"aria-invalid\\\",[52,[33,40],\\\"true\\\",\\\"false\\\"]],[15,\\\"aria-describedby\\\",[52,[33,40],\\\"mode-outbound-workitem-ttl-error\\\",\\\"mode-outbound-workitem-ttl-help\\\"]],[12],[13],[1,\\\"\\\\n\\\"],[41,[33,40],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"mode-outbound-panel-create-workitem-error\\\"],[14,1,\\\"mode-outbound-workitem-ttl-error\\\"],[14,\\\"role\\\",\\\"alert\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/hexagon-exclamation-solid\\\"],[14,\\\"decorative\\\",\\\"\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[10,1],[12],[1,[28,[35,0],[[33,40]],null]],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[10,2],[14,0,\\\"mode-outbound-panel-create-workitem-help\\\"],[14,1,\\\"mode-outbound-workitem-ttl-help\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,0],[\\\"modeRoster.sidePanel.outbound.workitemForm.help.ttl\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,41],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"mode-outbound-panel-create-workitem-error\\\"],[14,\\\"role\\\",\\\"alert\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/hexagon-exclamation-solid\\\"],[14,\\\"decorative\\\",\\\"\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[10,1],[12],[1,[34,41]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[10,\\\"gux-button\\\"],[14,0,\\\"mode-outbound-panel-create-workitem-submit-button\\\"],[14,\\\"accent\\\",\\\"primary\\\"],[15,\\\"onclick\\\",[28,[37,1],[[30,0],\\\"onSubmit\\\"],null]],[15,\\\"disabled\\\",[36,42]],[12],[1,\\\"\\\\n    \\\"],[1,[28,[35,0],[\\\"modeRoster.sidePanel.outbound.create\\\"],null]],[1,\\\"\\\\n\\\"],[13]],[\\\"worktype\\\",\\\"status\\\",\\\"workbin\\\"],false,[\\\"t\\\",\\\"action\\\",\\\"name\\\",\\\"nameMaxLength\\\",\\\"if\\\",\\\"nameErrorKey\\\",\\\"worktypePlaceholderKey\\\",\\\"worktypesDisabled\\\",\\\"typeId\\\",\\\"each\\\",\\\"-track-array\\\",\\\"worktypes\\\",\\\"eq\\\",\\\"worktypesError\\\",\\\"statusPlaceholderKey\\\",\\\"statusesDisabled\\\",\\\"statusId\\\",\\\"statuses\\\",\\\"statusesError\\\",\\\"workbinPlaceholderKey\\\",\\\"workbinsDisabled\\\",\\\"workbinId\\\",\\\"workbins\\\",\\\"workbinsError\\\",\\\"single-select-target-dropdown\\\",\\\"authUser\\\",\\\"queueFilter\\\",\\\"queue\\\",\\\"descriptionMaxLength\\\",\\\"description\\\",\\\"descriptionErrorKey\\\",\\\"priority\\\",\\\"priorityErrorKey\\\",\\\"durationSeconds\\\",\\\"durationSecondsErrorKey\\\",\\\"dueDate\\\",\\\"dueDateErrorKey\\\",\\\"dateExpires\\\",\\\"dateExpiresErrorKey\\\",\\\"ttlDate\\\",\\\"ttlDateErrorKey\\\",\\\"submitError\\\",\\\"isSubmitDisabled\\\"]]\",\"moduleName\":\"web-directory/components/mode-manager/roster-side-panels/outbound-panel/create-workitem/template.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"liiHSgG0\",\"block\":\"[[[10,\\\"h3\\\"],[14,\\\"header\\\",\\\"\\\"],[14,0,\\\"mode-manager-roster-side-panel-outbound-title\\\"],[12],[1,\\\"\\\\n    \\\"],[1,[28,[35,0],[\\\"modeRoster.sidePanel.outbound.title\\\"],null]],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,2],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"mode-manager-roster-side-panel-outbound-options\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-segmented-control-beta\\\"],[15,2,[36,3]],[15,\\\"onchange\\\",[28,[37,4],[[30,0],\\\"onValueChange\\\"],null]],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,6],[[28,[37,6],[[33,7]],null]],null],\\\"value\\\",[[[1,\\\"                \\\"],[10,\\\"gux-segmented-control-item\\\"],[15,2,[30,1,[\\\"value\\\"]]],[12],[1,\\\"\\\\n                    \\\"],[10,1],[14,\\\"slot\\\",\\\"text\\\"],[12],[1,[28,[35,0],[[28,[37,8],[\\\"modeRoster.sidePanel.outbound.\\\",[30,1,[\\\"value\\\"]]],null]],null]],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,9],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"mode-manager-roster-side-panel-outbound-make\\\"],[12],[1,\\\"\\\\n        \\\"],[46,[33,9,[\\\"component\\\"]],null,[[\\\"actionComplete\\\"],[[28,[37,4],[[30,0],\\\"onComplete\\\"],null]]],null],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"option\\\"],false,[\\\"t\\\",\\\"if\\\",\\\"hasMultipleOutboundOptions\\\",\\\"currentValue\\\",\\\"action\\\",\\\"each\\\",\\\"-track-array\\\",\\\"availableOutboundOptions\\\",\\\"concat\\\",\\\"currentOption\\\",\\\"component\\\"]]\",\"moduleName\":\"web-directory/components/mode-manager/roster-side-panels/outbound-panel/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { Maybe } from 'web-directory/types';\n\n/**\n * Default roster settings side panel. Modes may override via {@link ModeSettingsConfig.panelComponent}.\n */\nexport default Component.extend({\n    classNames: ['mode-manager-roster-side-panel-settings'] as const,\n\n    /**\n     * @attribute\n     * Arbitrary payload from the roster side panel service.\n     */\n    context: null as Maybe<unknown>\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"QErwuohe\",\"block\":\"[[[10,\\\"h3\\\"],[14,\\\"header\\\",\\\"\\\"],[14,0,\\\"mode-manager-roster-side-panel-settings-title\\\"],[12],[1,\\\"\\\\n    \\\"],[1,[28,[35,0],[\\\"modeRoster.sidePanel.settings.title\\\"],null]],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"mode-manager-roster-side-panel-settings-body\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"section\\\"],[14,0,\\\"mode-manager-roster-side-panel-settings-section\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[34,1]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,\\\"section\\\"],[14,0,\\\"mode-manager-roster-side-panel-settings-section\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[34,2]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"t\\\",\\\"components/application-preferences/interactions\\\",\\\"device-selection-with-preview\\\"]]\",\"moduleName\":\"web-directory/components/mode-manager/roster-side-panels/settings-panel/template.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"KPcgJKT2\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"mode-manager-sidebar\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"mode-manager-sidebar-group\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,3],[[28,[37,3],[[33,4]],null]],null],null,[[[1,\\\"                \\\"],[1,[28,[35,5],null,[[\\\"selected\\\",\\\"icon\\\",\\\"label\\\",\\\"itemCount\\\",\\\"showItemCountBadge\\\",\\\"click\\\"],[[28,[37,6],[[33,7],[28,[37,8],[[30,1],\\\"id\\\"],null]],null],[28,[37,8],[[30,1],\\\"icon\\\"],null],[28,[37,9],[[28,[37,8],[[30,1],\\\"label\\\"],null]],null],[28,[37,8],[[30,1],\\\"itemCount\\\"],null],[28,[37,8],[[30,1],\\\"showSidebarItemCountBadge\\\"],null],[28,[37,10],[[30,0],\\\"onSelectMode\\\",[28,[37,8],[[30,1],\\\"id\\\"],null]],null]]]]],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"mode-manager-roster-stack\\\"],[12],[1,\\\"\\\\n    \\\"],[1,[28,[35,11],null,[[\\\"header\\\",\\\"searchPlaceholder\\\",\\\"rosterContextKey\\\",\\\"headerActions\\\",\\\"searchConfig\\\",\\\"filterConfig\\\",\\\"sortConfig\\\",\\\"searchQuery\\\",\\\"sortOrder\\\",\\\"rosterCardComponent\\\",\\\"visibleItems\\\",\\\"resolvedAlertingGroups\\\",\\\"modeLoading\\\",\\\"fetchDataError\\\",\\\"isFilterActive\\\",\\\"hiddenByFilterCount\\\",\\\"rosterEmptyStates\\\",\\\"isRosterItemPending\\\",\\\"actionSearchQueryChange\\\",\\\"actionSortOrderChange\\\",\\\"actionFilter\\\",\\\"actionShowAllHiddenItems\\\"],[[28,[37,9],[[28,[37,8],[[33,12],\\\"label\\\"],null]],null],[28,[37,9],[[28,[37,8],[[33,12],\\\"searchPlaceholder\\\"],null]],null],[28,[37,8],[[33,12],\\\"id\\\"],null],[28,[37,8],[[33,12],\\\"headerActions\\\"],null],[28,[37,8],[[33,12],\\\"search\\\"],null],[28,[37,8],[[33,12],\\\"filter\\\"],null],[28,[37,8],[[33,12],\\\"sort\\\"],null],[28,[37,8],[[33,12],\\\"searchQuery\\\"],null],[28,[37,8],[[33,12],\\\"sortOrder\\\"],null],[28,[37,8],[[33,12],\\\"rosterCardComponent\\\"],null],[28,[37,8],[[33,12],\\\"visibleItems\\\"],null],[33,13,[\\\"resolvedAlertingGroups\\\"]],[28,[37,8],[[33,12],\\\"loading\\\"],null],[28,[37,8],[[33,12],\\\"fetchDataError\\\"],null],[28,[37,8],[[33,12],\\\"isFilterActive\\\"],null],[28,[37,8],[[33,12],\\\"hiddenByFilterCount\\\"],null],[28,[37,8],[[33,12],\\\"resolvedRosterEmptyStates\\\"],null],[28,[37,8],[[33,12],\\\"isRosterItemPending\\\"],null],[28,[37,10],[[30,0],\\\"onRosterSearchQueryChange\\\"],null],[28,[37,10],[[30,0],\\\"onRosterSortOrderChange\\\"],null],[28,[37,10],[[30,0],\\\"onFilter\\\"],null],[28,[37,10],[[30,0],\\\"onShowAllHiddenItems\\\"],null]]]]],[1,\\\"\\\\n\\\\n\\\"],[6,[39,14],null,[[\\\"isOpen\\\",\\\"actionClose\\\"],[[33,15,[\\\"isOpen\\\"]],[28,[37,10],[[30,0],\\\"onCloseSidePanel\\\"],null]]],[[\\\"default\\\"],[[[[41,[33,15,[\\\"panelComponentName\\\"]],[[[1,\\\"            \\\"],[46,[33,15,[\\\"panelComponentName\\\"]],null,[[\\\"context\\\"],[[33,15,[\\\"panelContext\\\"]]]],null],[1,\\\"\\\\n\\\"]],[]],null]],[]]]]],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[15,0,[29,[\\\"mode-manager-main panel-size-\\\",[36,17],\\\"\\\\n        \\\",[52,[33,18],\\\"mainstage-collapsed\\\"],\\\"\\\\n        \\\",[52,[33,19,[\\\"hasContextualFocusModeEnabled\\\"]],\\\"contextual-focus-mode\\\"],\\\"\\\\n        \\\",[52,[28,[37,20],[[28,[37,21],[[33,22]],null],[33,23,[\\\"isMainstageFocused\\\"]]],null],\\\"no-contextual-panel\\\"]]]],[12],[1,\\\"\\\\n\\\"],[1,\\\"    \\\"],[10,0],[15,0,[29,[\\\"mode-main-stage-wrapper\\\\n            \\\",[52,[28,[37,20],[[33,24,[\\\"mainStageComponent\\\"]],[28,[37,21],[[33,24,[\\\"hasSelection\\\"]]],null]],null],\\\"hidden\\\"]]]],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,25],null,[[\\\"interaction\\\",\\\"activeInteractions\\\",\\\"selectedAppContext\\\",\\\"workitem\\\",\\\"activeWorkitems\\\",\\\"useCommunicationACW\\\",\\\"hideInteractionButtons\\\",\\\"appPoolV2\\\",\\\"hasConversationAppForCurrInteraction\\\",\\\"visibleContextualAppsForCurrInteraction\\\",\\\"hasContextualFocusModeEnabled\\\",\\\"isMainstageFocused\\\",\\\"attentionCountPerCompositeId\\\",\\\"cannedResponseChatText\\\",\\\"cannedResponseSmsText\\\",\\\"cannedResponseEmailText\\\",\\\"structuredMessage\\\",\\\"onMainstageFocusedChanged\\\",\\\"contextualScriptAvailabilityChanged\\\",\\\"actionDisplayError\\\",\\\"loadDivisionName\\\",\\\"insertChatText\\\",\\\"insertSmsText\\\",\\\"insertEmailText\\\",\\\"onMainstageSizeChanged\\\",\\\"onMainstageCollapsedChanged\\\",\\\"renderContextualCarousel\\\",\\\"useScripterGadget\\\"],[[33,24,[\\\"selectedInteraction\\\"]],[33,26],[33,19,[\\\"selectedAppContext\\\"]],[33,24,[\\\"selectedWorkitem\\\"]],[33,24,[\\\"activeWorkitems\\\"]],[33,24,[\\\"useCommunicationACW\\\"]],[33,24,[\\\"hideInteractionButtons\\\"]],[33,19,[\\\"appPoolV2\\\"]],[33,19,[\\\"hasConversationAppForCurrInteraction\\\"]],[33,19,[\\\"visibleContextualAppsForCurrInteraction\\\"]],[33,19,[\\\"hasContextualFocusModeEnabled\\\"]],[33,23,[\\\"isMainstageFocused\\\"]],[33,19,[\\\"attentionCountPerCompositeId\\\"]],[33,19,[\\\"cannedResponseChatText\\\"]],[33,19,[\\\"cannedResponseSmsText\\\"]],[33,19,[\\\"cannedResponseEmailText\\\"]],[33,19,[\\\"structuredMessage\\\"]],[28,[37,10],[[30,0],\\\"onMainstageFocusedChanged\\\"],null],[28,[37,10],[[30,0],\\\"contextualScriptAvailabilityChanged\\\"],null],[28,[37,10],[[30,0],\\\"displayError\\\"],null],[28,[37,10],[[30,0],\\\"loadDivisionName\\\"],null],[28,[37,10],[[30,0],\\\"insertChatText\\\"],null],[28,[37,10],[[30,0],\\\"insertSmsText\\\"],null],[28,[37,10],[[30,0],\\\"insertEmailText\\\"],null],[28,[37,10],[[30,0],\\\"onMainstageSizeChanged\\\"],null],[28,[37,10],[[30,0],\\\"onMainstageCollapsedChanged\\\"],null],false,[33,27]]]]],[1,\\\"\\\\n\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[42,[28,[37,3],[[28,[37,3],[[33,4]],null]],null],\\\"id\\\",[[[41,[28,[37,8],[[30,2],\\\"mainStageComponent\\\"],null],[[[1,\\\"            \\\"],[10,0],[15,0,[29,[\\\"mode-main-stage-wrapper \\\",[52,[51,[28,[37,6],[[30,2,[\\\"id\\\"]],[33,24,[\\\"id\\\"]]],null]],\\\"hidden\\\"]]]],[12],[1,\\\"\\\\n                \\\"],[46,[28,[37,8],[[30,2],\\\"mainStageComponent\\\"],null],null,[[\\\"mode\\\"],[[30,2]]],null],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[2]],null],[1,\\\"\\\\n\\\"],[1,\\\"    \\\"],[10,0],[15,0,[29,[\\\"mode-contextual-toolbar \\\",[52,[51,[33,22]],\\\"hidden\\\"]]]],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,29],null,[[\\\"name\\\",\\\"isVisible\\\"],[\\\"contextual-v2\\\",[28,[37,30],[[33,22],[28,[37,21],[[33,19,[\\\"hasContextualFocusModeEnabled\\\"]]],null],[28,[37,21],[[33,23,[\\\"isMainstageFocused\\\"]]],null]],null]]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"mode-contextual-panel\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"sub-panel-wrapper\\\"],[12],[1,\\\"\\\\n\\\"],[6,[39,31],null,[[\\\"name\\\",\\\"isVisible\\\"],[\\\"contextual-v2\\\",[28,[37,30],[[33,22],[28,[37,21],[[33,23,[\\\"isMainstageFocused\\\"]]],null]],null]]],[[\\\"default\\\"],[[[[41,[28,[37,21],[[33,27]],null],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"app-carousel-native-view\\\"],[14,\\\"slot\\\",\\\"scripts\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,32],null,[[\\\"scriptAvailabilityChanged\\\",\\\"selectedInteraction\\\",\\\"isScriptAvailable\\\"],[[28,[37,10],[[30,0],\\\"contextualScriptAvailabilityChanged\\\"],null],[33,24,[\\\"selectedInteraction\\\"]],[28,[37,10],[[30,0],\\\"isContextualScriptAvailable\\\"],null]]]]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[51,[33,22]],[[[1,\\\"        \\\"],[1,[34,33]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n    \\\"],[1,[34,34]],[1,\\\"\\\\n\\\"],[13]],[\\\"mode\\\",\\\"mode\\\"],false,[\\\"if\\\",\\\"hasModeSwitcher\\\",\\\"each\\\",\\\"-track-array\\\",\\\"modes\\\",\\\"mode-manager/mode-button\\\",\\\"eq\\\",\\\"selected\\\",\\\"get\\\",\\\"t\\\",\\\"action\\\",\\\"mode-manager/mode-roster\\\",\\\"currentMode\\\",\\\"modeService\\\",\\\"mode-manager/mode-roster-side-panel\\\",\\\"rosterSidePanelService\\\",\\\"component\\\",\\\"mainstageSize\\\",\\\"isMainstageCollapsed\\\",\\\"interapptionsStateService\\\",\\\"or\\\",\\\"not\\\",\\\"hasMainStageSelection\\\",\\\"mainstageLayoutService\\\",\\\"displayedMainStageMode\\\",\\\"acd-interactions-panel-v2/interaction\\\",\\\"activeInteractions\\\",\\\"useScripterGadget\\\",\\\"unless\\\",\\\"app-carousel-toolbar\\\",\\\"and\\\",\\\"app-carousel-view\\\",\\\"acd-interactions-panel-v2/interaction-script\\\",\\\"mode-manager/main-stages/empty-main-stage\\\",\\\"mode-manager/interapptions-container\\\"]]\",\"moduleName\":\"web-directory/components/mode-manager/template.hbs\",\"isStrictMode\":false});","import { A } from '@ember/array';\nimport Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { debounce } from '@ember/runloop';\nimport { isValidEmailAddress } from 'web-directory/utils/email';\nimport { Maybe } from 'web-directory/types';\nimport { warnClosureAction } from 'web-directory/utils/acd';\nimport safeSet from 'web-directory/utils/safeSet';\nimport { InputTag } from '../tags-input/component';\n\ntype MultiSelectInputTag = InputTag<{ id: string }>;\n\n/**\n * The default value for max tags to be applied. Configurable in the component.\n */\nconst MAX_TAGS = 50;\n\nexport default Component.extend({\n    classNames: ['multi-select-target-dropdown'] as const,\n    classNameBindings: ['hideTargetDropdown:hide-target-dropdown'],\n\n    /**\n     * @attribute\n     *\n     * The currently authenticated user information\n     */\n    authUser: null,\n\n    /**\n     * @attribute\n     *\n     * the type of interaction this is in context of\n     */\n    interactionType: null as Maybe<string>,\n\n    /**\n     * @attribute\n     *\n     * the size of the input dropdown\n     */\n    size: 'medium' as 'medium' | 'small',\n\n    /**\n     * @attribute\n     *\n     * the placeholder text shown on the input\n     */\n    placeholder: null,\n\n    /**\n     * @attribute\n     *\n     * the label text shown on the input for the screenreader\n     */\n    label: null as string | null,\n\n    /**\n     * @attribute\n     *\n     * `true` if the user should be autofocused into the tags input\n     */\n    autofocus: false,\n\n    /**\n     * @attribute\n     *\n     * the filters to be included in this target selector\n     */\n    includeFilters: [] as string[],\n\n    /**\n     * @attribute\n     *\n     * The currently selected value of the component. This value should be passed\n     * in and stored by the parent. We do not want to mutate this value from within the\n     * component itself.\n     */\n    value: A([] as MultiSelectInputTag[]),\n\n    /**\n     * @attribute\n     *\n     * `true` if the target dropdown logic should be supressed and the dropdown be hidden.\n     * This should be used if the user has been tasked with added a recipient, but shouldn't\n     * use the systems internal data to create the recipient, but rather just leveraging the input\n     */\n    hideTargetDropdown: false,\n\n    /**\n     * @attribute\n     *\n     * the max amount of tags that can be applied to the selector\n     */\n    maxTags: MAX_TAGS,\n\n    /**\n     * @attribute this value can be mutated within this component\n     *\n     * @example 2-way data binding\n     * searchValue=(mut searchValue)\n     *\n     * the value of the main input. if updated by parent, it will automatically up the input\n     * in the template and will search once input has been focused.\n     */\n    searchValue: '',\n\n    /**\n     * @attribute\n     *\n     * class names passed in to be applied to the input tag\n     */\n    inputClasses: '',\n\n    /**\n     * @attribute\n     *\n     * `true` if the permissions should be bypassed for the current user\n     */\n    bypassPermissions: false,\n\n    /**\n     * `true` if the target dropdown is open\n     */\n    open: false,\n\n    /**\n     * Reference to the input element in the template created after the bootstrap\n     * selector component has been initialized\n     */\n    input: null as Maybe<HTMLInputElement>,\n\n    /**\n     * Maps the current value of the component into an array of id's or unique values to pass\n     * to the target dropdown in order to prevent the ability of selecting the same participant\n     * twice.\n     */\n    valueIds: computed.map('value', function (tag: MultiSelectInputTag) {\n        return tag.data?.id ?? tag.value;\n    }),\n\n    /**\n     * A mock interaction object to set the type of for target selection context\n     */\n    mockInteraction: computed('interactionType', function () {\n        return {\n            type: this.get('interactionType')\n        };\n    }),\n\n    didInsertElement() {\n        this._super(...arguments);\n        if (!this.get('hideTargetDropdown')) {\n            this.hideOnClickOutside(this.element);\n            this.hideOnKeyOutside(this.element);\n        }\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        document.removeEventListener('click', this.outsideClickListener);\n        this.$(this.element).off('keydown', this.outsideKeyListener);\n    },\n\n    /**\n     * @listener\n     *\n     * reference to the listener for when the element has been clicked outside of.\n     */\n    outsideClickListener: (event: MouseEvent) => warnClosureAction('outsideClickListener', event),\n\n    /**\n     * @listener\n     *\n     * reference to the listener for when the element has been clicked outside of.\n     */\n    outsideKeyListener: () => warnClosureAction('outsideKeyListener', event),\n\n    /**\n     * Listeners to determine if the user has clicked outside of the element being\n     * passed through. If the element has been clicked outside of, then the dropdown\n     * will close.\n     *\n     * @param element the element to check against\n     */\n    hideOnClickOutside(element: Element) {\n        if (element) {\n            this.set('outsideClickListener', event => this.checkFocusState(event.target as Node | null));\n            document.addEventListener('click', this.outsideClickListener);\n        }\n    },\n\n    /**\n     * We use `keydown` because we want to auto close the dropdown if the user tabs out\n     * of the element. `keypress` doesn't support all of the keys such as `tab`.\n     * `keydown` also supports holding the key down for a duration.\n     *\n     * @param element the element to apply the keydown event unto.\n     */\n    hideOnKeyOutside(element: Element) {\n        if (element) {\n            this.set('outsideKeyListener', () => this.checkFocusState());\n            this.$(this.element).on('keydown', this.outsideKeyListener);\n        }\n    },\n\n    /**\n     * Checks the current focus state of this element based on the element to check against (i.e.\n     * click target). If no element is provided, then we will check against the\n     * `document.activeElement` instead.\n     *\n     * @param element the element to check the focus out state against\n     */\n    checkFocusState(element: Node | null = null) {\n        // setTimeout is required for accessing `activeElement`. Otherwise it will show the\n        // activeElement is the document body in between switching focused elements.\n        setTimeout(() => {\n            element = element ?? document.activeElement;\n            if (this.element && !this.element.contains(element)) {\n                this.set('open', false);\n            }\n        });\n    },\n\n    /**\n     * Let the component determine if the popover should be open or closed based on the\n     * current state of the `searchValue`.\n     */\n    determineOpen() {\n        safeSet(this, 'open', !!this.get('searchValue'));\n    },\n\n    /**\n     * Updates the `searchValue` property and any other additional logic that may need\n     * to go along with that in one isolated place.\n     *\n     * @param value the value to update the search property with\n     */\n    updateSearch(value: string) {\n        this.set('searchValue', value);\n\n        // if there is a value we should wait a short time to debounce to make sure\n        // we delay the opening until after user input is finished\n        if (value) {\n            debounce(this, this.determineOpen, 500);\n        } else {\n            // if the input has been removed we can hide the popover immediately.\n            this.set('open', false);\n        }\n    },\n\n    /**\n     * Adds the raw text input to the value array to be passed into the tags input.\n     *\n     * @param text the raw text of the tag to add\n     */\n    _addTag(text: string, reset = true) {\n        if (!text) {\n            this.submit();\n            return;\n        }\n\n        if (this.get('value').length < this.get('maxTags')) {\n            switch (this.get('interactionType')) {\n                case 'email':\n                    if (isValidEmailAddress(text)) {\n                        this.targetSelected({ email: text });\n                        if (reset) {\n                            this.updateSearch('');\n                        }\n                    }\n                    break;\n                default:\n                    if (text) {\n                        this.targetSelected({ phoneNumber: text });\n                        if (reset) {\n                            this.updateSearch('');\n                        }\n                    }\n                    break;\n            }\n        }\n    },\n\n    /**\n     * Quick way to bulk add tags\n     *\n     * @param value the value of tags to add\n     */\n    _addTags(value: string[]) {\n        value.forEach(item => this._addTag(item, false));\n        this.updateSearch('');\n    },\n\n    /**\n     * Invoked when the user inputs data into the main input of the component.\n     *\n     * @param event the event data provided by the input\n     */\n    _inputChange(event: Event) {\n        const { value } = event.target as HTMLInputElement;\n        this.updateSearch(value);\n    },\n\n    /**\n     * Invoked when the user focused the input\n     */\n    _focusInput() {\n        if (this.get('searchValue')) {\n            this.set('open', true);\n        }\n    },\n\n    /**\n     * @action\n     *\n     * Handles when the user presses the enter key while the search input is empty\n     */\n    submit: () => warnClosureAction('submit', null),\n\n    /**\n     * @action\n     *\n     * Handles the removal of a target\n     *\n     * @param target the target to remove from the value\n     */\n    targetRemoved: (index: number) => warnClosureAction('targetRemoved', { index }),\n\n    /**\n     * @action passed from the parent\n     *\n     * Handles the selection of a target\n     *\n     * @param target the selected data corresponding to the target\n     */\n    targetSelected: (target: any) => warnClosureAction('targetSelected', target),\n\n    actions: {\n        /**\n         * Invoked when the user selects data from within the target selector component\n         *\n         * @param target the data that was selected\n         */\n        onTargetSelected(target: any) {\n            this.set('open', false);\n            this.targetSelected(target);\n            this.updateSearch('');\n        },\n\n        onAddTag(value: string) {\n            this._addTag(value);\n        },\n\n        onSubmit() {\n            this.submit();\n        },\n\n        onBulkAddTags(values: string[]) {\n            this._addTags(values);\n        },\n\n        onRemoveTag(index: number) {\n            this.targetRemoved(index);\n        },\n\n        onInputFocus() {\n            this._focusInput();\n        },\n\n        onInputChange(event: KeyboardEvent) {\n            this._inputChange(event);\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"breEEJGV\",\"block\":\"[[[1,[28,[35,0],null,[[\\\"size\\\",\\\"value\\\",\\\"autofocus\\\",\\\"searchValue\\\",\\\"placeholder\\\",\\\"label\\\",\\\"inputClasses\\\",\\\"allowCommaSeparatedParsing\\\",\\\"actionAdd\\\",\\\"actionSubmit\\\",\\\"actionBulkAdd\\\",\\\"actionRemove\\\",\\\"actionInputFocus\\\",\\\"actionInputChange\\\"],[[33,1],[33,2],[33,3],[33,4],[33,5],[33,6],[33,7],true,[28,[37,8],[[30,0],\\\"onAddTag\\\"],null],[28,[37,8],[[30,0],\\\"onSubmit\\\"],null],[28,[37,8],[[30,0],\\\"onBulkAddTags\\\"],null],[28,[37,8],[[30,0],\\\"onRemoveTag\\\"],null],[28,[37,8],[[30,0],\\\"onInputFocus\\\"],null],[28,[37,8],[[30,0],\\\"onInputChange\\\"],null]]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,10],[[33,11],[28,[37,12],[[33,13]],null]],null],[[[1,\\\"    \\\"],[1,[28,[35,14],null,[[\\\"authUser\\\",\\\"interaction\\\",\\\"hideHeader\\\",\\\"searchValue\\\",\\\"includeFilters\\\",\\\"activeParticipantIds\\\",\\\"allowRawInputSelection\\\",\\\"actionSelected\\\",\\\"inputClasses\\\",\\\"bypassPermissions\\\"],[[33,15],[33,16],true,[33,4],[33,17],[33,18],false,[28,[37,8],[[30,0],\\\"onTargetSelected\\\"],null],[33,7],[33,19]]]]],[1,\\\"\\\\n\\\"]],[]],null]],[],false,[\\\"tags-input\\\",\\\"size\\\",\\\"value\\\",\\\"autofocus\\\",\\\"searchValue\\\",\\\"placeholder\\\",\\\"label\\\",\\\"inputClasses\\\",\\\"action\\\",\\\"if\\\",\\\"and\\\",\\\"open\\\",\\\"not\\\",\\\"hideTargetDropdown\\\",\\\"target-dropdown\\\",\\\"authUser\\\",\\\"mockInteraction\\\",\\\"includeFilters\\\",\\\"valueIds\\\",\\\"bypassPermissions\\\"]]\",\"moduleName\":\"web-directory/components/multi-select-target-dropdown/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { inject } from '@ember/service';\nimport { warnClosureAction } from 'web-directory/utils/acd-ts';\nimport { Maybe } from 'web-directory/types/maybe.type';\nimport { computed } from '@ember/object';\nimport type { GuxDatepickerCustomEvent } from 'genesys-spark-components';\n\n/** Fallback max date offset (days from today) when API fails or not yet loaded. */\nconst DEFAULT_MAX_DATE_OFFSET = 7;\n\n/**\n * @component park-schedule-popover\n * @description Component for scheduling SMS parking with date/time selection\n */\nexport default Component.extend({\n    classNames: ['park-schedule-popover'] as const,\n    intl: inject('intl'),\n    logger: inject('stash-logger'),\n    interaction: inject('interaction'),\n\n    /**\n     * @attribute\n     * Action called when user confirms parking\n     */\n    onParkConfirm: (parkExpirationTime: Maybe<string>) => warnClosureAction('onParkConfirm', { parkExpirationTime }),\n\n    /**\n     * The date selected by the user\n     */\n    selectedDate: null as Maybe<string>,\n\n    /**\n     * The time selected by the user\n     */\n    selectedTime: null as Maybe<string>,\n\n    /**\n     * The maximum date Agent can park the interaction\n     */\n    maxDate: null as Maybe<string>,\n\n    /**\n     * The minimum date Agent can park the interaction\n     */\n    minDate: null as Maybe<string>,\n\n    /**\n     * Maximum date offset in days (fetched from API, defaults to DEFAULT_MAX_DATE_OFFSET)\n     * This is the number of days to add to today to get the maximum selectable date\n     */\n    maxDateOffset: DEFAULT_MAX_DATE_OFFSET,\n\n    /**\n     * Maximum duration in days\n     * Used for display purposes in translations\n     */\n    maxDurationDays: computed('maxDateOffset', function () {\n        return this.get('maxDateOffset');\n    }),\n\n    /**\n     * The parking expiration time\n     */\n    parkingExpirationTime: computed('selectedDate', 'selectedTime', function () {\n        const selectedDate = this.get('selectedDate');\n        const selectedTime = this.get('selectedTime');\n\n        if (!selectedDate || !selectedTime) {\n            return null;\n        }\n\n        const combinedDateTime = this._combineDateAndTime(selectedDate, selectedTime);\n\n        return combinedDateTime.toISOString();\n    }),\n\n    /**\n     * The error message for the date/time selection\n     * Validates that selected date/time is not in the past and doesn't exceed max duration\n     * Uses dynamic maxDateOffset from API instead of hardcoded value\n     */\n    dateTimeErrorMessage: computed('selectedDate', 'selectedTime', 'maxDateOffset', function () {\n        const selectedDate = this.get('selectedDate');\n        const selectedTime = this.get('selectedTime');\n\n        if (!selectedDate || !selectedTime) {\n            return null;\n        }\n\n        const combinedDateTime = this._combineDateAndTime(selectedDate, selectedTime);\n\n        const now = new Date();\n        const maxDate = new Date();\n        const maxDateOffset = this.get('maxDateOffset');\n        maxDate.setDate(now.getDate() + maxDateOffset);\n\n        if (combinedDateTime < now) {\n            return this.get('intl').t('purecloud.parkInteraction.errors.pastDate');\n        }\n\n        if (combinedDateTime > maxDate) {\n            return this.get('intl').t('purecloud.parkInteraction.errors.maxDurationExceeded', {\n                day: this.get('maxDurationDays')\n            });\n        }\n\n        return null;\n    }),\n\n    /**\n     * Combines selected date and time strings into a Date object\n     * @param {string} selectedDate - Date string in YYYY-MM-DD format\n     * @param {string} selectedTime - Time string in HH:mm format\n     * @returns {Date} Combined Date object\n     */\n    _combineDateAndTime(selectedDate: string, selectedTime: string): Date {\n        const [hours, minutes] = selectedTime.split(':').map(Number);\n        const [year, month, day] = selectedDate.split('-').map(Number);\n\n        return new Date(year, month - 1, day, hours, minutes, 0, 0);\n    },\n\n    /**\n     * Creates a local date string (YYYY-MM-DD) from a Date object\n     * @param {Date} date - The date to convert\n     * @returns {string} Date string in YYYY-MM-DD format\n     */\n    createLocalISODateString(date: Date): string {\n        const year = date.getFullYear();\n        const month = String(date.getMonth() + 1).padStart(2, '0');\n        const day = String(date.getDate()).padStart(2, '0');\n\n        return `${year}-${month}-${day}`;\n    },\n\n    init() {\n        this._super(...arguments);\n        this.get('interaction')\n            .getParkResumeDaysLimit()\n            .then((maxDateOffset: number) => {\n                this.set('maxDateOffset', maxDateOffset);\n                this._initializeDates();\n            })\n            .catch((error: any) => {\n                this.get('logger').error('Failed to fetch park resume days limit, using default', { error });\n                this.set('maxDateOffset', DEFAULT_MAX_DATE_OFFSET);\n                this._initializeDates();\n            });\n    },\n\n    /** Sets selectedDate to max date, selectedTime to now, and min/max date bounds. */\n    _initializeDates() {\n        const now = new Date();\n        const maxDateOffset = this.get('maxDateOffset');\n        const maxDate = new Date();\n        maxDate.setDate(now.getDate() + maxDateOffset);\n\n        this.set('selectedDate', this.createLocalISODateString(maxDate));\n        this.set('selectedTime', now.toTimeString().split(' ')[0].substring(0, 5));\n        this.set('maxDate', this.createLocalISODateString(maxDate));\n        this.set('minDate', this.createLocalISODateString(now));\n    },\n\n    actions: {\n        onParkClick() {\n            const parkingExpirationTime = this.get('parkingExpirationTime');\n\n            if (!parkingExpirationTime) {\n                return;\n            }\n\n            this.get('onParkConfirm')(parkingExpirationTime);\n        },\n\n        onDateChange(event: GuxDatepickerCustomEvent<string>) {\n            const newDate = event?.detail;\n            this.set('selectedDate', newDate);\n        },\n\n        onTimeChange(event: InputEvent) {\n            const target = event.target as HTMLInputElement & { value: string };\n            const newTime = target?.value;\n            this.set('selectedTime', newTime);\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"N11egtuD\",\"block\":\"[[[10,0],[14,0,\\\"park-schedule-popover\\\"],[14,\\\"aria-labelledby\\\",\\\"park-schedule-popover-title\\\"],[14,\\\"aria-describedby\\\",\\\"park-schedule-popover-description\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"popover-header\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"h2\\\"],[14,0,\\\"title\\\"],[14,1,\\\"park-schedule-popover-title\\\"],[12],[1,[28,[35,0],[\\\"purecloud.parkInteraction.title\\\"],null]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"popover-content\\\"],[12],[1,\\\"\\\\n        \\\"],[10,2],[14,0,\\\"instruction-text\\\"],[14,1,\\\"park-schedule-popover-description\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,0],[\\\"purecloud.parkInteraction.instruction\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[1,\\\"        \\\"],[10,0],[14,0,\\\"form-group\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[14,0,\\\"form-label\\\"],[14,1,\\\"date-label\\\"],[12],[1,[28,[35,0],[\\\"purecloud.parkInteraction.selectDate\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"input-container\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-datepicker\\\"],[15,0,[52,[33,2],\\\"datepicker-error\\\"]],[15,2,[36,3]],[15,\\\"onInput\\\",[28,[37,4],[[30,0],\\\"onDateChange\\\"],null]],[15,\\\"maxDate\\\",[36,5]],[15,\\\"minDate\\\",[36,6]],[14,\\\"aria-labelledby\\\",\\\"date-label\\\"],[15,\\\"aria-describedby\\\",[52,[33,2],\\\"park-schedule-popover-date-error\\\",\\\"park-schedule-popover-date-help-text\\\"]],[15,\\\"aria-invalid\\\",[52,[33,2],\\\"true\\\",\\\"false\\\"]],[14,\\\"aria-required\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"form-subtext\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,2],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"error-message\\\"],[14,1,\\\"park-schedule-popover-date-error\\\"],[14,\\\"role\\\",\\\"alert\\\"],[14,\\\"aria-live\\\",\\\"assertive\\\"],[14,\\\"aria-atomic\\\",\\\"true\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/hexagon-exclamation-solid\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[14,0,\\\"error-icon\\\"],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                        \\\"],[10,1],[14,0,\\\"error-text\\\"],[12],[1,[34,2]],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,2],[14,0,\\\"instruction-subtext\\\"],[14,1,\\\"park-schedule-popover-date-help-text\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,0],[\\\"purecloud.parkInteraction.maxDuration\\\"],[[\\\"day\\\"],[[33,7]]]]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[1,\\\"        \\\"],[10,0],[14,0,\\\"form-group\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[14,0,\\\"form-label\\\"],[14,1,\\\"time-label\\\"],[12],[1,[28,[35,0],[\\\"purecloud.parkInteraction.selectTime\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"input-container\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-time-picker\\\"],[15,2,[36,8]],[15,\\\"has-error\\\",[28,[37,9],[[33,2],true],null]],[14,\\\"aria-labelledby\\\",\\\"time-label\\\"],[15,\\\"aria-describedby\\\",[52,[33,2],\\\"park-schedule-popover-time-error\\\",\\\"park-schedule-popover-time-help-text\\\"]],[15,\\\"aria-invalid\\\",[52,[33,2],\\\"true\\\",\\\"false\\\"]],[14,\\\"aria-required\\\",\\\"true\\\"],[15,\\\"onInput\\\",[28,[37,4],[[30,0],\\\"onTimeChange\\\"],null]],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[1,\\\"    \\\"],[10,0],[14,0,\\\"popover-actions\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-button\\\"],[14,\\\"accent\\\",\\\"primary\\\"],[15,\\\"onclick\\\",[28,[37,4],[[30,0],\\\"onParkClick\\\"],null]],[15,\\\"disabled\\\",[28,[37,9],[[33,2],true],null]],[15,\\\"aria-disabled\\\",[52,[33,2],\\\"true\\\",\\\"false\\\"]],[14,\\\"aria-describedby\\\",\\\"park-button-status-announcement\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,0],[\\\"purecloud.parkInteraction.park\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[1,\\\"    \\\"],[10,0],[14,1,\\\"park-button-status-announcement\\\"],[14,\\\"aria-live\\\",\\\"assertive\\\"],[14,0,\\\"sr-only\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,2],[[[1,\\\"            \\\"],[1,[28,[35,0],[\\\"purecloud.parkInteraction.parkButtonDisabled\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[1,[28,[35,0],[\\\"purecloud.parkInteraction.parkButtonEnabled\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"t\\\",\\\"if\\\",\\\"dateTimeErrorMessage\\\",\\\"selectedDate\\\",\\\"action\\\",\\\"maxDate\\\",\\\"minDate\\\",\\\"maxDurationDays\\\",\\\"selectedTime\\\",\\\"and\\\"]]\",\"moduleName\":\"web-directory/components/park-schedule-popover/template.hbs\",\"isStrictMode\":false});","import { scheduleOnce } from '@ember/runloop';\nimport { on } from '@ember/object/evented';\nimport { observer } from '@ember/object';\nimport Component from '@ember/component';\nimport _ from 'lodash';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['participant-controls-container'],\n\n    shouldAttach: false,\n    tetherBoundingBox: null,\n    tetherDropDownMenu: null,\n    tetherClass: null,\n    onMenuSelector: false,\n    onMenu: false,\n\n    setupTetherDropDown: on('didInsertElement', function () {\n        if (!this.shouldAttach) {\n            return;\n        }\n        const hasParentBox = this.element.closest(`.${this.tetherBoundingBox}`);\n        const hasBoxMember = this.tetherBoundingBox;\n        if (!(hasParentBox || hasBoxMember)) {\n            console.error('tetherBoundingBox property on dropDownComponent was not found');\n            return;\n        }\n        this.set('tetherClass', _.uniqueId('tether_'));\n\n        scheduleOnce('afterRender', () => {\n            const menu = this.element.querySelector('.menu');\n            const target = this.element.querySelector('.menu-selector');\n            try {\n                this.set(\n                    'tetherDropDownMenu',\n                    new window.Tether({\n                        element: menu,\n                        target,\n                        attachment: 'middle left',\n                        targetAttachment: 'middle right',\n                        classPrefix: this.tetherClass,\n                        constraints: [\n                            {\n                                to: this.element.closest(`.${this.tetherBoundingBox}`),\n                                attachment: 'together'\n                            }\n                        ]\n                    })\n                );\n            } catch (error) {\n                const message = 'component: participant-controls    Unable to attach tethered dropdown to participant';\n                this.logger.error(message, {\n                    error\n                });\n            }\n\n            this._hoverHandler = () => {\n                this.toggleProperty('onMenuSelector', () => {\n                    setTimeout(() => {\n                        this.toggleProperty('onMenuSelector');\n                    }, 200);\n                });\n            };\n            this.element.addEventListener('mouseenter', this._hoverHandler);\n            this.element.addEventListener('mouseleave', this._hoverHandler);\n\n            this._tetherHoverHandler = () => {\n                this.toggleProperty('onMenu', () => {\n                    setTimeout(() => {\n                        this.toggleProperty('onMenu');\n                    }, 200);\n                });\n            };\n            const tetherEl = document.querySelector(`.${this.tetherClass}-element`);\n            if (tetherEl) {\n                tetherEl.addEventListener('mouseenter', this._tetherHoverHandler);\n                tetherEl.addEventListener('mouseleave', this._tetherHoverHandler);\n            }\n        });\n    }),\n\n    willDestroyElement() {\n        this._super(...arguments);\n        const menu = this.tetherDropDownMenu;\n        if (menu) {\n            menu.destroy();\n            const { element } = menu;\n            if (element) {\n                element.remove();\n            }\n        }\n        if (this._hoverHandler) {\n            this.element.removeEventListener('mouseenter', this._hoverHandler);\n            this.element.removeEventListener('mouseleave', this._hoverHandler);\n        }\n        const tetherEl = document.querySelector(`.${this.tetherClass}-element`);\n        if (tetherEl && this._tetherHoverHandler) {\n            tetherEl.removeEventListener('mouseenter', this._tetherHoverHandler);\n            tetherEl.removeEventListener('mouseleave', this._tetherHoverHandler);\n        }\n    },\n\n    showTetherDropDowns: observer('onMenuSelector', 'onMenu', function () {\n        const tether = document.querySelector(`.${this.tetherClass}-element`);\n        if (!tether) {\n            return;\n        }\n        if (this.onMenuSelector || this.onMenu) {\n            tether.style.display = 'block';\n            this.tetherDropDownMenu.position();\n        } else {\n            tether.style.display = 'none';\n        }\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"g1DJFRP2\",\"block\":\"[[[18,1,null]],[\\\"&default\\\"],false,[\\\"yield\\\"]]\",\"moduleName\":\"web-directory/components/participant-controls/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport { getOwner } from '@ember/application';\nimport { reads, not, and } from '@ember/object/computed';\nimport { run } from '@ember/runloop';\nimport $ from 'jquery';\nimport { on } from '@ember/object/evented';\nimport Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport AutoSaveDevicesMixin from 'web-directory/mixins/webrtc-service/auto-save-devices';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nexport default Component.extend(AutoSaveDevicesMixin, LoggerMixin, {\n    classNames: ['phone-settings'],\n    classNameBindings: ['isPhoneEnabled:phone-enabled:phone-disabled'],\n\n    webrtc: service(),\n    phone: service(),\n    session: service(),\n    permissions: service(),\n    addressformat: service(),\n    headset: service(),\n    preferences: service(),\n    application: service(),\n    intl: service(),\n\n    showMediaHelperStatus: false,\n    station: null,\n    showStationPicker: false,\n    showAudioControls: false,\n    selectingWebrtcSettings: false,\n    showTroubleshoot: false,\n    showPhoneOptions: false,\n    entity: null,\n    isPhoneEnabled: reads('permissions.phoneEnabled'),\n    isoLocale: reads('intl.isoLocale'),\n    troubleshooterIframeAuthEnabled: reads('session.features.STREAM-1457_troubleshooter_iframe_auth'),\n\n    // remove when followMe is on globally\n    callForwardingActive: reads('phone.callForwardingActive'),\n    callForwardingNumber: reads('phone.callForwardingNumber'),\n    callForwardingExtension: reads('phone.callForwardingExtension'),\n    formattedNumber: computed('callForwardingNumber', 'callForwardingExtension', function () {\n        if (this.callForwardingNumber) {\n            return this.addressformat.formatAddressForDisplay(this.callForwardingNumber);\n        }\n        const extension = this.callForwardingExtension;\n        return `extension: ${extension}`;\n    }),\n    // end remove when followme is on globally\n    // Legacy troubleshooter embed URL, used when the STREAM-1457 toggle is off.\n    webrtcTroubleshooterUrl: computed('isoLocale', function () {\n        const location =\n            window.location.origin === 'https://localhost:4300' ? 'https://localhost:8445' : window.location.origin;\n        const locale = this.isoLocale;\n        const baseUrl = `/webrtc-troubleshooter/#/?locale=${locale}/`;\n        return location + baseUrl;\n    }),\n    requireMediaHelper: computed('phone.station.webRtcRequireMediaHelper', 'application.mediaHelperMode', function () {\n        return this.get('phone.station.webRtcRequireMediaHelper') && !this.get('application.mediaHelperMode');\n    }),\n\n    attachOutsideListener: on('didInsertElement', function () {\n        $(window).on(`click.${this.elementId}`, event => {\n            run(() => {\n                const target = $(event.target);\n                if (!target.parents('.station-setting').length) {\n                    this.set('showPhoneOptions', false);\n                }\n            });\n            return true;\n        });\n    }),\n\n    removeListener: on('willDestroyElement', function () {\n        $(window).off(`.${this.elementId}`);\n    }),\n\n    micPermissionGranted: reads('webrtc.hasMicPermission'),\n    audioCallCapable: reads('webrtc.audioCallCapable'),\n    notShowAudioControls: not('showAudioControls'),\n    canSelectDevices: and('webrtc.audioCallCapable', 'currentStation.isWebrtc'),\n    stationIsWebrtcAndSelectingSettings: and('selectingWebrtcSettings', 'currentStation.isWebrtc'),\n    stationIsWebrtcAndNotSelectingSettings: computed('selectingWebrtcSettings', 'currentStation.isWebrtc', function () {\n        return this.get('currentStation.isWebrtc') && !this.selectingWebrtcSettings;\n    }),\n    showWebrtcControlsByDefault: and('showAudioControls', 'canSelectDevices'),\n    showNoStationMessage: computed('showAudioControls', 'currentStation', function () {\n        return this.showAudioControls && !this.currentStation;\n    }),\n    showNoStationSettingsMessage: computed('showAudioControls', 'currentStation.isWebrtc', function () {\n        return this.showAudioControls && this.currentStation && !this.get('currentStation.isWebrtc');\n    }),\n    currentStation: computed('station', function () {\n        const stationId = this.get('station.id');\n        if (stationId) {\n            return this.station;\n        }\n    }),\n    isHosted: reads('application.hostedContext.isHostedProp'),\n    canActivateQueues: computed(\n        'permissions.canActivateQueues',\n        'permissions.canGoOnQueue',\n        'session.hasTrusteeAccess',\n        function () {\n            return (\n                this.get('permissions.canActivateQueues') &&\n                this.get('permissions.canGoOnQueue') &&\n                !this.get('session.hasTrusteeAccess')\n            );\n        }\n    ),\n    mediaOptions: computed('selectedMicrophone', 'selectedCamera', 'screenStream', function () {\n        const options = this.webrtc.getMediaOptions({\n            camera: this.selectedCamera,\n            microphone: this.selectedMicrophone\n        });\n\n        return options;\n    }),\n\n    canDeselectPhone: computed('permissions.canDisassociateSelf', 'session.person.isOnQueue', function () {\n        return this.get('session.person.isOnQueue') ? this.get('permissions.canDisassociateSelf') : true;\n    }),\n\n    placingCallsExternallyIconText: computed('phone.thisBrowserIsTheOneToAnswerFrom', function () {\n        return this.get('phone.thisBrowserIsTheOneToAnswerFrom')\n            ? this.intl.t('purecloud.station.acceptingCallsFromThisBrowserDetails')\n            : this.intl.t('purecloud.station.acceptingCallsFromThisBrowser');\n    }),\n\n    willDestroyElement() {\n        this.set('webrtc.webrtcTroubleshooterCall', false);\n    },\n\n    actions: {\n        closeMenu() {\n            if (this.closeMenu) {\n                this.closeMenu();\n            }\n        },\n        activateQueues() {\n            const router = getOwner(this).lookup('router:main');\n            router.transitionTo('/queues/activate/me');\n            if (this.get('closeMenu')) {\n                this.get('closeMenu')();\n            }\n        },\n        changePhoneSettings() {\n            this.toggleProperty('showPhoneOptions');\n        },\n        callVoicemail() {\n            this.phone.callVoicemail();\n        },\n        toggleWebrtcSettings() {\n            if (this.openWebrtcSettings) {\n                this.openWebrtcSettings();\n            } else {\n                this.toggleProperty('selectingWebrtcSettings');\n            }\n        },\n        openStationPicker() {\n            if (this.openStationPicker) {\n                this.openStationPicker();\n            }\n        },\n        openCallForwarding() {\n            this.callForwarding();\n        },\n        toggleTroubleshoot() {\n            this.toggleProperty('showTroubleshoot');\n            this.toggleProperty('webrtc.webrtcTroubleshooterCall');\n        },\n        disassociateStation() {\n            this.disassociateStation();\n            this.set('showPhoneOptions', false);\n        },\n        disconnectPersistentConnection() {\n            this.disconnectPersistentConnection();\n            this.set('showPhoneOptions', false);\n        },\n        toggleBrowserAnswer(ev) {\n            if (ev.key && ev.key !== 'Enter' && ev.key !== ' ') {\n                return;\n            }\n            this.phone.toggleBrowserAnswer();\n        }\n    }\n}).reopenClass({\n    positionalParams: ['station', 'canCallForward', 'showEnableCallForwarding']\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"a+ioCrE8\",\"block\":\"[[[10,0],[15,0,[29,[\\\"phone-label \\\",[52,[33,1],\\\"selecting-webrtc-settings\\\"]]]],[12],[1,\\\"\\\\n    \\\"],[1,[28,[35,2],[\\\"purecloud.station.settings\\\"],null]],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,3],[[33,4],[33,5]],null],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"audio-controls-container\\\"],[12],[1,\\\"\\\\n        \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link back\\\"],[16,\\\"aria-label\\\",[29,[[28,[37,2],[\\\"common.back\\\"],null]]]],[24,4,\\\"button\\\"],[4,[38,6],[[30,0],\\\"toggleWebrtcSettings\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"arrow-left\\\"],[15,\\\"screenreader-text\\\",[28,[37,2],[\\\"common.back\\\"],null]],[12],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"audio-controls\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"station-label\\\"],[12],[1,[28,[35,2],[\\\"purecloud.station.audioControls\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[1,[28,[35,7],null,[[\\\"video\\\",\\\"troubleshoot\\\"],[false,false]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,3],[[28,[37,8],[[33,1]],null],[33,9]],null],[[[1,\\\"    \\\"],[10,0],[15,0,[29,[\\\"current-station station-setting \\\",[52,[51,[33,11]],\\\"empty-station\\\"]]]],[12],[1,\\\"\\\\n\\\"],[41,[51,[33,11]],[[[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"icon-phone icon-phone-off\\\"],[14,\\\"icon-name\\\",\\\"legacy/phone-disable\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"current-station-name\\\"],[12],[1,\\\"\\\\n                \\\"],[10,1],[14,0,\\\"empty-message\\\"],[12],[1,[28,[35,2],[\\\"purecloud.noPhoneSelected\\\"],null]],[13],[1,\\\"\\\\n                \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link action-open-station-picker-v2\\\"],[24,4,\\\"button\\\"],[4,[38,6],[[30,0],\\\"openStationPicker\\\"],null],[12],[1,\\\"\\\\n                    \\\"],[10,1],[14,0,\\\"select-text\\\"],[12],[1,[28,[35,2],[\\\"purecloud.station.change\\\"],null]],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"chevron-small-right\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[28,[37,3],[[33,11],[28,[37,8],[[33,1]],null]],null],[[[41,[33,12],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"persistent-call-icon\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"phone-spinner\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"navbar-icon\\\"],[14,\\\"icon-name\\\",\\\"phone\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"icon-phone\\\"],[14,\\\"icon-name\\\",\\\"phone\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[10,0],[14,0,\\\"current-station-name\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[33,11,[\\\"name\\\"]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[11,\\\"button\\\"],[16,\\\"aria-expanded\\\",[29,[[36,13]]]],[16,\\\"aria-label\\\",[28,[37,2],[\\\"components.navMenu.userDropdown.webrtcSettings\\\"],null]],[24,0,\\\"change-phone-settings\\\"],[24,4,\\\"button\\\"],[4,[38,6],[[30,0],\\\"changePhoneSettings\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"chevron-small-down\\\"],[15,\\\"screenreader-text\\\",[28,[37,2],[\\\"components.navMenu.userDropdown.webrtcSettings\\\"],null]],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,13],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"phone-options-dropdown\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"phone-options-arrow\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link action-open-station-picker-v2\\\"],[24,4,\\\"button\\\"],[4,[38,6],[[30,0],\\\"openStationPicker\\\"],null],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,2],[\\\"purecloud.station.change\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,14],[[[1,\\\"                    \\\"],[11,\\\"button\\\"],[24,\\\"data-t\\\",\\\"deselect-phone\\\"],[24,0,\\\"btn btn-link action-disassociate-station\\\"],[24,4,\\\"button\\\"],[4,[38,6],[[30,0],\\\"disassociateStation\\\"],null],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,2],[\\\"purecloud.station.disassociateStation\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[28,[37,3],[[33,15],[28,[37,8],[[33,16]],null]],null],[[[1,\\\"                    \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link action-select-webrtc-settings\\\"],[24,4,\\\"button\\\"],[4,[38,6],[[30,0],\\\"toggleWebrtcSettings\\\"],null],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,2],[\\\"components.navMenu.userDropdown.webrtcSettings\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,12],[[[1,\\\"                    \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link action-disconnect-persistent-connection\\\"],[24,4,\\\"button\\\"],[4,[38,6],[[30,0],\\\"disconnectPersistentConnection\\\"],null],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,2],[\\\"purecloud.station.disconnectPersistentConnection\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]],[1,\\\"\\\\n\\\"],[41,[28,[37,3],[[33,17],[28,[37,8],[[33,18]],null]],null],[[[1,\\\"    \\\"],[1,[34,19]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,16],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"select-placing-calls-externally\\\"],[14,\\\"data-t\\\",\\\"placing-calls-externally\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-toggle\\\"],[14,\\\"display-inline\\\",\\\"\\\"],[14,0,\\\"placing-calls-externally-toggle\\\"],[15,\\\"checked\\\",[33,20,[\\\"thisBrowserIsTheOneToAnswerFrom\\\"]]],[15,\\\"onkeydown\\\",[28,[37,6],[[30,0],\\\"toggleBrowserAnswer\\\"],null]],[15,\\\"onclick\\\",[28,[37,6],[[30,0],\\\"toggleBrowserAnswer\\\"],null]],[15,\\\"label\\\",[29,[[28,[37,2],[\\\"purecloud.station.placingCallsExternally\\\"],null]]]],[14,\\\"label-position\\\",\\\"left\\\"],[12],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,1],[14,0,\\\"placing-calls-externally\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-icon\\\"],[14,1,\\\"placing-calls-externally-info\\\"],[14,\\\"icon-name\\\",\\\"alert-info\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[15,\\\"screenreader-text\\\",[36,21]],[12],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"placing-calls-externally-info\\\"],[14,\\\"accent\\\",\\\"light\\\"],[14,\\\"placement\\\",\\\"bottom\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,\\\"slot\\\",\\\"content\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,20,[\\\"thisBrowserIsTheOneToAnswerFrom\\\"]],[[[1,\\\"                        \\\"],[1,[28,[35,2],[\\\"purecloud.station.acceptingCallsFromThisBrowserDetails\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[1,[28,[35,2],[\\\"purecloud.station.acceptingCallsFromThisBrowser\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"station-setting\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"call-controls-subheader\\\"],[12],[1,[28,[35,2],[\\\"purecloud.station.audioControls\\\"],null]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,22],[[[1,\\\"        \\\"],[1,[28,[35,7],null,[[\\\"video\\\",\\\"openTroubleshoot\\\"],[false,[28,[37,6],[[30,0],\\\"toggleTroubleshoot\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"mic-permission-missing\\\"],[12],[1,[28,[35,2],[\\\"purecloud.station.micPermissionMissing\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]]]],[]],[[[41,[33,23],[[[1,\\\"    \\\"],[19,\\\"partials/no-station-notification\\\",[]],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,25],[[[1,\\\"    \\\"],[1,[28,[35,2],[\\\"purecloud.station.noPhoneSettings\\\"],null]],[1,\\\"\\\\n\\\"]],[]],null]],[]]]],[]]],[1,\\\"\\\\n\\\"],[41,[33,26],[[[1,\\\"    \\\"],[10,0],[15,0,[29,[\\\"actions \\\",[52,[33,1],\\\"hide\\\"]]]],[12],[1,\\\"\\\\n\\\"],[41,[33,27],[[[1,\\\"            \\\"],[10,0],[15,0,[29,[\\\"forward-calls\\\\n                    \\\",[52,[33,28],\\\"webrtc-station\\\"],[52,[28,[37,8],[[28,[37,3],[[33,29],[28,[37,8],[[33,30,[\\\"user\\\",\\\"isTrustee\\\"]]],null]],null]],null],\\\"extended\\\"]]]],[12],[1,\\\"\\\\n                \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link btn-sm btn-link-bordered btn-block begin-forwarding\\\"],[24,4,\\\"button\\\"],[4,[38,6],[[30,0],\\\"openCallForwarding\\\"],null],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,2],[\\\"purecloud.callForwarding.enableCallForwarding\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[28,[37,3],[[33,29],[28,[37,8],[[33,30,[\\\"user\\\",\\\"isTrustee\\\"]]],null]],null],[[[1,\\\"            \\\"],[10,0],[15,0,[29,[\\\"queue-activation-entry \\\",[52,[28,[37,8],[[33,27]],null],\\\"extended\\\"]]]],[12],[1,\\\"\\\\n                \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link btn-sm btn-link-bordered btn-block\\\"],[24,4,\\\"button\\\"],[4,[38,6],[[30,0],\\\"activateQueues\\\"],null],[12],[1,\\\"\\\\n                    \\\"],[10,1],[14,0,\\\"menu-label\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,2],[\\\"components.navMenu.queueActivation\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,3],[[33,31],[33,32,[\\\"mediaHelperMode\\\"]],[33,33,[\\\"isWebrtc\\\"]]],null],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"media-helper-status\\\"],[12],[1,[28,[35,2],[\\\"purecloud.station.mediaHelperMode\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,16],[[[41,[33,34],[[[41,[33,35],[[[1,\\\"            \\\"],[1,[28,[35,36],null,[[\\\"accessibilityLabel\\\"],[[28,[37,2],[\\\"webrtcDevices.troubleshooterTitle\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[10,\\\"iframe\\\"],[15,\\\"title\\\",[29,[[28,[37,2],[\\\"webrtcDevices.troubleshooterTitle\\\"],null]]]],[15,\\\"src\\\",[29,[[36,37]]]],[14,\\\"role\\\",\\\"presentation\\\"],[14,\\\"allow\\\",\\\"camera; microphone\\\"],[14,\\\"frameborder\\\",\\\"0\\\"],[14,\\\"height\\\",\\\"850px\\\"],[14,\\\"width\\\",\\\"100%\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]]],[]],null]],[]],null]],[],true,[\\\"if\\\",\\\"selectingWebrtcSettings\\\",\\\"t\\\",\\\"and\\\",\\\"stationIsWebrtcAndSelectingSettings\\\",\\\"notShowAudioControls\\\",\\\"action\\\",\\\"profile-selection-v2\\\",\\\"not\\\",\\\"showStationPicker\\\",\\\"unless\\\",\\\"station\\\",\\\"persistentConnectionActive\\\",\\\"showPhoneOptions\\\",\\\"canDeselectPhone\\\",\\\"canSelectDevices\\\",\\\"showWebrtcControlsByDefault\\\",\\\"showAudioControls\\\",\\\"audioCallCapable\\\",\\\"webrtc-issues\\\",\\\"phone\\\",\\\"placingCallsExternallyIconText\\\",\\\"micPermissionGranted\\\",\\\"showNoStationMessage\\\",\\\"partial\\\",\\\"showNoStationSettingsMessage\\\",\\\"showActions\\\",\\\"canCallForward\\\",\\\"webrtcStation\\\",\\\"canActivateQueues\\\",\\\"session\\\",\\\"showMediaHelperStatus\\\",\\\"application\\\",\\\"currentStation\\\",\\\"showTroubleshoot\\\",\\\"troubleshooterIframeAuthEnabled\\\",\\\"webrtc-troubleshooter-frame-router\\\",\\\"webrtcTroubleshooterUrl\\\"]]\",\"moduleName\":\"web-directory/components/phone-settings/template.hbs\",\"isStrictMode\":false});","import { equal } from '@ember/object/computed';\nimport { run } from '@ember/runloop';\nimport { assert } from '@ember/debug';\nimport { computed } from '@ember/object';\nimport Component from '@ember/component';\n\nexport default Component.extend({\n    classNames: ['preference-setting', 'settings-preference'],\n\n    type: null,\n    value: null,\n    choices: null,\n    headerKey: null,\n    labelKey: null,\n    subLabelKey: null,\n    subLabelAction: null,\n    setPreference: null,\n    extraClassNames: null,\n\n    // Allows checkboxes to be disabled when saving\n    allowCheckboxDisable: false,\n\n    // autofocuses setting\n    autofocus: false,\n    _focusObserver: null,\n\n    saving: false,\n\n    mainWorkTimer: null,\n    savingTimer: null,\n    successTimer: null,\n\n    actions: {\n        selectValue(e) {\n            let value = e.target.value;\n            const ret = this.setPreference(value);\n            this.handleSave(ret);\n        },\n        selectValueChecked(e) {\n            let value = e.target.checked;\n            const ret = this.setPreference(value);\n            this.handleSave(ret);\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n        assert(\n            'The `setPreference` action needs to be a closure action: {{... setPreference=(action \"myAction\")}}',\n            typeof this.setPreference === 'function'\n        );\n    },\n\n    didRender() {\n        this._super(...arguments);\n        if (this.autofocus) this._waitForElementToBeReadyForFocus();\n    },\n\n    willDestroyElement() {\n        const timers = this.getProperties('savingTimer', 'successTimer', 'mainWorkTimer');\n        run.cancel(timers.savingTimer);\n        run.cancel(timers.successTimer);\n        run.cancel(timers.mainWorkTimer);\n        this._cleanupObserver();\n\n        this._super(...arguments);\n    },\n\n    formElementType: computed('isSelect', 'isCheckbox', function () {\n        // native dom element tag for each type in the component\n        if (this.isSelect) return 'button';\n        if (this.isCheckbox) return 'input';\n    }),\n    isSelect: equal('type', 'select'),\n    isCheckbox: equal('type', 'checkbox'),\n\n    shouldDisableCheckbox: computed('saving', function () {\n        return this.allowCheckboxDisable && this.saving;\n    }),\n\n    handleSave(promise) {\n        // Done to avoid set on destroyed element error if component is recycled\n        const mainWorkTimer = run.later(\n            this,\n            () => {\n                if (!promise || !promise.then) {\n                    return;\n                }\n\n                this.set('saving', true);\n\n                promise\n                    .then(() => {\n                        // More of an illusion that work was actually done (API save tends to be too fast)\n                        const savingTimer = run.later(() => {\n                            this.set('saving', false);\n                            this.set('success', true);\n                        }, 250);\n\n                        const successTimer = run.later(() => {\n                            this.set('success', false);\n                        }, 1250);\n\n                        this.setProperties({ savingTimer, successTimer });\n                    })\n                    .catch(() => {\n                        this.set('saving', false);\n                        this.set('error', true);\n                    });\n            },\n            0\n        );\n\n        this.set('mainWorkTimer', mainWorkTimer);\n    },\n\n    _waitForElementToBeReadyForFocus() {\n        // prevent multiple observers if didRender is called multiple times\n        if (this._focusObserver) {\n            this._cleanupObserver();\n        }\n\n        const target = this.formElementType;\n\n        /**\n         * Create intersection observer that will focus the element\n         * when it becomes fully visible.\n         * Needed for settings embedded in gux-popovers since we dont\n         * know exactly when we will be visible/rendered.\n         */\n        this._focusObserver = new IntersectionObserver(\n            entries => {\n                entries.forEach(entry => {\n                    /**\n                     * Check if element is fully visible (intersectionRation) and\n                     * is currently intersecting with the viewport\n                     */\n                    if (entry.isIntersecting && entry.intersectionRatio === 1) {\n                        entry.target.focus();\n                        this._cleanupObserver();\n                    }\n                });\n            },\n            /**\n             * viewport is root because gux shadow dom,\n             * threshold 1 for element to be 100% visible\n             */\n            { root: null, threshold: 1 }\n        );\n        this._checkForElement(target);\n    },\n\n    _checkForElement(target, attempts = 0) {\n        // component may have been destroyed\n        if (!this._focusObserver) return;\n\n        const element = this.element.querySelector(target);\n        if (element) {\n            // element exist, observe it\n            this._focusObserver.observe(element);\n        } else {\n            // ~2 seconds @ 60fps\n            const maxAttempts = 120;\n            if (attempts < maxAttempts) {\n                // element doesnt exist yet\n                requestAnimationFrame(() => {\n                    this._checkForElement(target, attempts + 1);\n                });\n            } else {\n                // prevent infinite loops in case element never will exist\n                this._cleanupObserver();\n            }\n        }\n    },\n\n    _cleanupObserver() {\n        if (this._focusObserver) {\n            this._focusObserver.disconnect();\n            this._focusObserver = null;\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"8Kq/SCZy\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"settings-header-text\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,2],[[33,1]],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"preference-container\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,3],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"preference-widget\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-form-field-dropdown\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-dropdown\\\"],[15,\\\"onchange\\\",[28,[37,4],[[30,0],\\\"selectValue\\\"],null]],[15,1,[29,[[36,5],\\\"-dropdown\\\"]]],[15,2,[36,6]],[15,3,[28,[37,2],[[33,7]],null]],[15,\\\"aria-label\\\",[28,[37,2],[[33,7]],null]],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-listbox\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,9],[[28,[37,9],[[33,10]],null]],null],null,[[[1,\\\"                            \\\"],[10,\\\"gux-option\\\"],[15,2,[30,1,[\\\"value\\\"]]],[15,\\\"selected\\\",[52,[28,[37,11],[[30,1,[\\\"value\\\"]],[33,6]],null],\\\"true\\\"]],[12],[1,\\\"\\\\n                                \\\"],[1,[30,1,[\\\"label\\\"]]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[15,\\\"for\\\",[29,[[36,5],\\\"-dropdown\\\"]]],[12],[1,[28,[35,2],[[33,7]],null]],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,12],[[[1,\\\"        \\\"],[10,\\\"gux-form-field-checkbox\\\"],[15,0,[29,[\\\"setting-label setting-label-checkbox \\\",[36,13]]]],[12],[1,\\\"\\\\n            \\\"],[10,\\\"input\\\"],[15,1,[29,[[36,5],\\\"-check\\\"]]],[14,\\\"slot\\\",\\\"input\\\"],[15,\\\"checked\\\",[36,6]],[15,3,[28,[37,2],[[33,7]],null]],[15,\\\"disabled\\\",[36,14]],[15,\\\"onchange\\\",[28,[37,4],[[30,0],\\\"selectValueChecked\\\"],null]],[15,0,[36,13]],[14,4,\\\"checkbox\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[15,\\\"for\\\",[29,[[36,5],\\\"-check\\\"]]],[14,\\\"slot\\\",\\\"label\\\"],[12],[1,[28,[35,2],[[33,7]],null]],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n    \\\"],[10,1],[14,0,\\\"indicator\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,15],[[[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,16],[[[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/check\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,17],[[[41,[33,18],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"sub-label\\\"],[12],[1,\\\"\\\\n            \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link btn-xs\\\"],[24,4,\\\"button\\\"],[4,[38,4],[[30,0],[33,18]],null],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,2],[[33,17]],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[10,\\\"label\\\"],[14,0,\\\"sub-label\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,2],[[33,17]],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[]],null],[1,\\\"\\\\n\\\"],[41,[48,[30,2]],[[[1,\\\"    \\\"],[18,2,null],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"option\\\",\\\"&default\\\"],false,[\\\"if\\\",\\\"headerKey\\\",\\\"t\\\",\\\"isSelect\\\",\\\"action\\\",\\\"elementId\\\",\\\"value\\\",\\\"labelKey\\\",\\\"each\\\",\\\"-track-array\\\",\\\"choices\\\",\\\"eq\\\",\\\"isCheckbox\\\",\\\"extraClassNames\\\",\\\"shouldDisableCheckbox\\\",\\\"saving\\\",\\\"success\\\",\\\"subLabelKey\\\",\\\"subLabelAction\\\",\\\"has-block\\\",\\\"yield\\\"]]\",\"moduleName\":\"web-directory/components/preference-setting/template.hbs\",\"isStrictMode\":false});","import { all } from 'rsvp';\nimport { scheduleOnce } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport { computed, trySet } from '@ember/object';\nimport Component from '@ember/component';\nimport _ from 'lodash';\nimport { capitalize } from 'web-directory/utils/string-transforms';\nimport { COLLABORATE_CHAT_EVENTS } from 'web-directory/utils/collab-chat-constants';\n\nconst preferenceDefaults = {\n    soundsMuted: false,\n    mediaExpanded: true,\n    sortedAlpha: 'recent',\n    displayDensity: 'comfortable',\n    giphyKeyboard: 'collapsed'\n};\n\nexport default Component.extend({\n    classNames: ['chat-preferences'],\n\n    session: service(),\n    preferences: service(),\n    intl: service(),\n    settings: service(),\n    chatFrame: service(),\n\n    actions: {\n        selectRosterOrder(value) {\n            this.set('sortedAlpha', value);\n            return this.communicateAndPersistPreference('sortedAlpha', value);\n        },\n\n        selectDisplayDensity(value) {\n            this.set('displayDensity', value);\n            return this.communicateAndPersistPreference('displayDensity', value);\n        },\n\n        selectMediaExpanded(value) {\n            this.set('mediaExpanded', value);\n            value = this.mediaToBoolean(value);\n            return this.communicateAndPersistPreference('mediaExpanded', value);\n        },\n\n        changeSoundsMuted() {\n            this.toggleProperty('soundsMuted');\n            return this.communicateAndPersistPreference('soundsMuted', this.soundsMuted);\n        },\n\n        changeGithubEmbeds() {\n            this.toggleProperty('showGithubEmbeds');\n            return this.communicateAndPersistPreference('showGithubEmbeds', this.showGithubEmbeds);\n        },\n\n        changeGiphyDefaultState(value) {\n            this.set('giphyKeyboard', value);\n            return this.communicateAndPersistPreference('giphyKeyboard', value);\n        },\n\n        openSoundPreferences() {\n            this.settings.openSoundPreference();\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n\n        this.set('loading', true);\n        this._loadPreferences().then(() => {\n            scheduleOnce('afterRender', () => {\n                trySet(this, 'loading', false);\n            });\n        });\n    },\n\n    _loadPreferences() {\n        const preferencesService = this.preferences;\n\n        const promises = [\n            preferencesService.getPreference('chat.global').then(preferences => {\n                preferences = preferences || {};\n                /**\n                 * Settings api is returning bad preferences data so we are manually\n                 * deleting `showGithubEmbeds` to set it properly later on.\n                 **/\n                delete preferences.showGithubEmbeds;\n\n                _.forOwn(preferenceDefaults, (value, key) => {\n                    if (!Object.prototype.hasOwnProperty.call(preferences, key)) {\n                        preferences[key] = value;\n                    }\n                });\n\n                if (typeof preferences.mediaExpanded === 'boolean') {\n                    preferences.mediaExpanded = this.booleanToMediaState(preferences.mediaExpanded);\n                }\n\n                if (!this.isDestroyed) {\n                    this.setProperties(preferences);\n                }\n            }),\n\n            preferencesService.getPreference('widgets').then(settings => {\n                let embed = null;\n                if (settings && settings.githubRepo) {\n                    embed = settings.githubRepo.embed;\n                }\n                if (!this.isDestroyed) {\n                    this.set('showGithubEmbeds', embed);\n                }\n            })\n        ];\n\n        return all(promises);\n    },\n\n    mediaExpandedOptions: computed(function () {\n        return [\n            {\n                value: 'mediaCollapsed',\n                label: this.intl.t('preferences.chat.mediaCollapsed')\n            },\n            {\n                value: 'mediaExpanded',\n                label: this.intl.t('preferences.chat.mediaExpanded')\n            }\n        ];\n    }),\n\n    displayDensityOptions: computed(function () {\n        return [\n            {\n                value: 'comfortable',\n                label: this.intl.t('preferences.chat.displayDensity.comfortable')\n            },\n            {\n                value: 'compact',\n                label: this.intl.t('preferences.chat.displayDensity.compact')\n            },\n            {\n                value: 'compact minimal',\n                label: this.intl.t('preferences.chat.displayDensity.minimal')\n            }\n        ];\n    }),\n\n    sortingOptions: computed(function () {\n        return [\n            {\n                value: 'alpha',\n                label: this.intl.t('chat.roster.settings.aToZ')\n            },\n            {\n                value: 'recent',\n                label: this.intl.t('chat.roster.settings.recent')\n            }\n        ];\n    }),\n\n    giphyKeyboardOptions: computed(function () {\n        return [\n            {\n                value: 'collapsed',\n                label: this.intl.t('preferences.chat.mediaCollapsed')\n            },\n            {\n                value: 'expanded',\n                label: this.intl.t('preferences.chat.mediaExpanded')\n            },\n            {\n                value: 'rememberState',\n                label: this.intl.t('preferences.chat.rememberState')\n            }\n        ];\n    }),\n\n    notDesktop: computed(function () {\n        return !this.get('applicationService.hostedContext').isHosted();\n    }),\n\n    showNotificationsSection: computed('notDesktop', function () {\n        return this.notDesktop;\n    }),\n\n    persistPreference(key, value) {\n        const preferences = this.preferences;\n        if (key === 'showGithubEmbeds') {\n            return preferences.getPreference('widgets').then((prefs = {}) => {\n                if (!prefs.githubRepo) {\n                    prefs.githubRepo = {};\n                }\n                prefs.githubRepo.embed = value;\n                return preferences.setPreference('widgets', prefs, false);\n            });\n        } else {\n            return preferences.getPreference('chat.global').then((prefs = {}) => {\n                prefs[key] = value;\n                return preferences.setPreference('chat.global', prefs, false);\n            });\n        }\n    },\n\n    getPreferenceSettings() {\n        const preferences = this.getProperties('displayDensity', 'sortedAlpha', 'soundsMuted');\n        preferences.mediaExpanded = this.mediaExpanded === 'mediaExpanded';\n        return preferences;\n    },\n\n    booleanToMediaState(value) {\n        const state = value ? 'expanded' : 'collapsed';\n        return `media${capitalize(state)}`;\n    },\n\n    mediaToBoolean(value) {\n        return value === 'mediaExpanded';\n    },\n\n    communicateAndPersistPreference(preferenceKey, value) {\n        this.persistPreference(preferenceKey, value); // Needed to set local global preference values for display\n        // notify collab chat of preference update to keep in sync\n        return this.chatFrame.notifyCollaborateChatIFrame(COLLABORATE_CHAT_EVENTS.publish.updateChatPreference, {\n            value,\n            preferenceKey\n        });\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"OHhxP9qA\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[10,2],[14,0,\\\"text-center\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,2],[\\\"common.loading\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"    \\\"],[1,[28,[35,3],null,[[\\\"labelKey\\\",\\\"type\\\",\\\"value\\\",\\\"choices\\\",\\\"extraClassNames\\\",\\\"setPreference\\\"],[\\\"chat.roster.settings.order\\\",\\\"select\\\",[33,4],[33,5],\\\"sort-order-options\\\",[28,[37,6],[[30,0],\\\"selectRosterOrder\\\"],null]]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[33,7],[[[1,\\\"        \\\"],[1,[28,[35,3],null,[[\\\"headerKey\\\",\\\"labelKey\\\",\\\"type\\\",\\\"value\\\",\\\"extraClassNames\\\",\\\"setPreference\\\"],[\\\"chat.roster.settings.notifications\\\",\\\"preferences.chat.muteAllSounds\\\",\\\"checkbox\\\",[33,8],\\\"mute-sounds\\\",[28,[37,6],[[30,0],\\\"changeSoundsMuted\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"sound-settings-link\\\"],[12],[1,\\\"\\\\n            \\\"],[11,3],[24,6,\\\"#\\\"],[4,[38,6],[[30,0],\\\"openSoundPreferences\\\"],null],[12],[1,[28,[35,2],[\\\"preferences.chat.setNotificationVolume\\\"],null]],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"\\\\n\\\"],[6,[39,3],null,[[\\\"headerKey\\\",\\\"labelKey\\\",\\\"type\\\",\\\"value\\\",\\\"choices\\\",\\\"extraClassNames\\\",\\\"setPreference\\\"],[\\\"chat.roster.settings.media\\\",\\\"preferences.chat.toggleInline\\\",\\\"select\\\",[33,9],[33,10],\\\"pictures-expanded-options\\\",[28,[37,6],[[30,0],\\\"selectMediaExpanded\\\"],null]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n        \\\"],[1,[28,[35,3],null,[[\\\"headerKey\\\",\\\"labelKey\\\",\\\"type\\\",\\\"value\\\",\\\"extraClassNames\\\",\\\"setPreference\\\"],[null,\\\"preferences.chat.showGithubEmbeds\\\",\\\"checkbox\\\",[33,11],\\\"show-github-embeds\\\",[28,[37,6],[[30,0],\\\"changeGithubEmbeds\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"\\\\n    \\\"],[1,[28,[35,3],null,[[\\\"labelKey\\\",\\\"type\\\",\\\"value\\\",\\\"choices\\\",\\\"extraClassNames\\\",\\\"setPreference\\\"],[\\\"preferences.chat.displayDensity.name\\\",\\\"select\\\",[33,12],[33,13],\\\"display-density-options\\\",[28,[37,6],[[30,0],\\\"selectDisplayDensity\\\"],null]]]]],[1,\\\"\\\\n\\\\n    \\\"],[1,[28,[35,3],null,[[\\\"labelKey\\\",\\\"type\\\",\\\"value\\\",\\\"choices\\\",\\\"extraClassNames\\\",\\\"setPreference\\\"],[\\\"chat.roster.settings.giphy\\\",\\\"select\\\",[33,14],[33,15],\\\"giphy-keyboard-options\\\",[28,[37,6],[[30,0],\\\"changeGiphyDefaultState\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]]]],[],false,[\\\"if\\\",\\\"loading\\\",\\\"t\\\",\\\"preference-setting\\\",\\\"sortedAlpha\\\",\\\"sortingOptions\\\",\\\"action\\\",\\\"showNotificationsSection\\\",\\\"soundsMuted\\\",\\\"mediaExpanded\\\",\\\"mediaExpandedOptions\\\",\\\"showGithubEmbeds\\\",\\\"displayDensity\\\",\\\"displayDensityOptions\\\",\\\"giphyKeyboard\\\",\\\"giphyKeyboardOptions\\\"]]\",\"moduleName\":\"web-directory/components/preferences-chat/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport { or, not, bool } from '@ember/object/computed';\nimport { computed } from '@ember/object';\nimport { run, debounce } from '@ember/runloop';\nimport Component from '@ember/component';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nconst SECONDS = 60;\nconst MIN_AGENT_SECONDS = SECONDS;\nconst MAX_AGENT_SECONDS = 864000;\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['preferences-direct-routing'],\n    session: service(),\n    directRouting: service(),\n    intl: service(),\n    notification: service(),\n    alerting: service(),\n\n    backupRoutingOptionChoices: {\n        users: null,\n        queues: null\n    },\n    selectedRoutingOptionUser: null,\n    selectedRoutingOptionQueue: null,\n    primaryBackupOptions: [\n        {\n            value: 'QUEUE',\n            label: 'Queue'\n        },\n        {\n            value: 'USER',\n            label: 'User'\n        }\n    ],\n    backupTimeUnits: {\n        days: {\n            value: 'days',\n            label: 'Days'\n        },\n        hours: {\n            value: 'hours',\n            label: 'Hours'\n        },\n        minutes: {\n            value: 'minutes',\n            label: 'Minutes'\n        }\n    },\n\n    directRoutingInputs: {\n        userPrimaryBackup: null,\n        userPrimaryBackupOption: null,\n        userSecondaryBackupOption: null,\n        userBackupTimeUnitsDays: null,\n        userBackupTimeUnitsHours: null,\n        userBackupTimeUnitsMinutes: null,\n        backedUpUsers: null,\n        waitForVipAgent: false\n    },\n    rawSettings: {\n        userId: null,\n        queueId: null,\n        agentWaitSeconds: null,\n        waitForAgent: false,\n        backedUpUsers: null,\n        primaryBackup: {\n            id: null,\n            type: null\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n        this.initDirectRouting();\n    },\n\n    async initDirectRouting() {\n        run(() => this.set('loading', true));\n        try {\n            await this._loadDirectRoutingSettings();\n        } catch (err) {\n            if (err.status === 404) return;\n            this.logger.error('component/preferences-direct-routing: error initializing direct routing settings: ', {\n                err\n            });\n            // show a error toast\n            const title = this.intl.t('preferences.direct-routing.loadError.title');\n            const message = this.intl.t('preferences.direct-routing.loadError.message');\n            this.notification.error(title, message);\n        } finally {\n            if (!(this.isDestroying || this.isDestroyed)) {\n                run(() => this.set('loading', false));\n            }\n        }\n    },\n\n    async _loadBackupUser(userId) {\n        const user = await this.directRouting.getUserBackupEntity(userId);\n        run(() => this.set('selectedRoutingOptionUser', user));\n    },\n\n    async _loadBackupQueue(queueId) {\n        if (queueId) {\n            const queue = await this.directRouting.getQueueBackupEntity(queueId);\n            run(() => this.set('selectedRoutingOptionQueue', queue));\n        }\n    },\n\n    async _loadDirectRoutingSettings() {\n        const settings = await this.directRouting.getOwnSettings();\n        run(() => {\n            this.processDirectRoutingSettings(settings);\n        });\n    },\n\n    processDirectRoutingSettings(settings) {\n        this.set('backupRoutingOptionChoices.users', []);\n        this.set('rawSettings', settings);\n        // Convert total seconds into days/hours/minutes\n        const totalSeconds = (settings && settings.agentWaitSeconds) || 0;\n        const days = Math.floor(totalSeconds / 86400);\n        const hours = Math.floor((totalSeconds % 86400) / 3600);\n        const minutes = Math.floor((totalSeconds % 3600) / 60);\n        run(() => {\n            const userSecondaryBackupOption = settings.queueId ? settings.queueId : '';\n            const userPrimaryBackupOptionType = settings.primaryBackup.type === 'USER' ? 'userId' : 'queueId';\n            this.set('directRoutingInputs.userBackupTimeUnitsDays', days);\n            this.set('directRoutingInputs.userBackupTimeUnitsHours', hours);\n            this.set('directRoutingInputs.userBackupTimeUnitsMinutes', minutes);\n            this.set('directRoutingInputs.userPrimaryBackup', settings.primaryBackup.type);\n            this.set('directRoutingInputs.userSecondaryBackupOption', userSecondaryBackupOption);\n            this.set('directRoutingInputs.userPrimaryBackupOption', settings[userPrimaryBackupOptionType]);\n            if (settings.primaryBackup.type === 'USER') {\n                this._loadBackupUser(settings.userId);\n                this._loadBackupQueue(settings.queueId);\n            } else {\n                this._loadBackupQueue(settings.queueId);\n            }\n            this.set('directRoutingInputs.waitForVipAgent', settings.waitForAgent);\n            // Set backedUpUsers list only if we have backedUpUsers\n            if (settings.backedUpUsers.length > 0) {\n                this.set('directRoutingInputs.backedUpUsers', settings.backedUpUsers);\n            }\n        });\n    },\n\n    // Filter out routing option choice based on if the user id equals the selectedRoutingOptionUser id\n    _modifiedRoutingOptionChoices(routingOptions) {\n        const userPrimaryBackupOption = this.get('directRoutingInputs.userPrimaryBackupOption');\n        return routingOptions.filter(user => {\n            return user.id !== userPrimaryBackupOption;\n        });\n    },\n\n    waitSecondsCalculated: computed(\n        'directRoutingInputs.{waitForVipAgent,userBackupTimeUnitsDays,userBackupTimeUnitsHours,userBackupTimeUnitsMinutes}',\n        function () {\n            if (this.get('directRoutingInputs.waitForVipAgent')) {\n                const seconds =\n                    this.get('directRoutingInputs.userBackupTimeUnitsDays') * 86400 +\n                    this.get('directRoutingInputs.userBackupTimeUnitsHours') * 3600 +\n                    this.get('directRoutingInputs.userBackupTimeUnitsMinutes') * SECONDS;\n                return seconds;\n            }\n            return null;\n        }\n    ),\n\n    invalidWaitSecondsMin: computed('waitSecondsCalculated', function () {\n        return this.waitSecondsCalculated < MIN_AGENT_SECONDS;\n    }),\n    invalidWaitSecondsMax: computed('waitSecondsCalculated', function () {\n        return this.waitSecondsCalculated > MAX_AGENT_SECONDS;\n    }),\n    invalidWaitSeconds: or('invalidWaitSecondsMin', 'invalidWaitSecondsMax'),\n\n    enableSave: computed(\n        'rawSettings',\n        'showSecondaryBackup',\n        'directRoutingInputs.userBackupTimeUnitsDays',\n        'directRoutingInputs.userBackupTimeUnitsHours',\n        'directRoutingInputs.userBackupTimeUnitsMinutes',\n        'directRoutingInputs.waitForVipAgent',\n        'directRoutingInputs.userPrimaryBackupOption',\n        'directRoutingInputs.userSecondaryBackupOption',\n        function () {\n            const rawSettings = this.rawSettings;\n            const inputs = this.directRoutingInputs;\n            if (!inputs) {\n                return false;\n            }\n            const hasWaitForAgentChanged = rawSettings.waitForAgent !== inputs.waitForVipAgent;\n            const hasWaitSecondsChanged =\n                rawSettings.waitForAgent && rawSettings.agentWaitSeconds !== this.waitSecondsCalculated;\n            const hasValidWaitSeconds = !(inputs.waitForVipAgent && this.invalidWaitSeconds);\n            const hasPrimaryBackupOptionChanged = rawSettings.primaryBackup.id !== inputs.userPrimaryBackupOption;\n            const hasSelectedPrimaryOption = inputs.userPrimaryBackupOption;\n            const secondaryBackupAvailable = this.showSecondaryBackup;\n            if (secondaryBackupAvailable) {\n                const userSecondaryBackupOption = inputs.userSecondaryBackupOption || undefined;\n                const hasSecondaryBackupOptionChanged = rawSettings.queueId !== userSecondaryBackupOption;\n                return (\n                    (hasPrimaryBackupOptionChanged ||\n                        hasSecondaryBackupOptionChanged ||\n                        hasWaitForAgentChanged ||\n                        hasWaitSecondsChanged) &&\n                    hasValidWaitSeconds &&\n                    hasSelectedPrimaryOption\n                );\n            }\n            return (\n                (hasPrimaryBackupOptionChanged || hasWaitForAgentChanged || hasWaitSecondsChanged) &&\n                hasValidWaitSeconds &&\n                hasSelectedPrimaryOption\n            );\n        }\n    ),\n    disableSave: not('enableSave'),\n\n    userDesiredSettings: computed(\n        'directRoutingInputs.userBackupTimeUnitsDays',\n        'directRoutingInputs.userBackupTimeUnitsHours',\n        'directRoutingInputs.userBackupTimeUnitsMinutes',\n        'directRoutingInputs.waitForVipAgent',\n        'directRoutingInputs.userPrimaryBackup',\n        'directRoutingInputs.userPrimaryBackupOption',\n        'directRoutingInputs.userSecondaryBackupOption',\n        ///\n        function () {\n            const waitSeconds = this.waitSecondsCalculated;\n            const userPrimaryBackup = this.get('directRoutingInputs.userPrimaryBackup');\n            const userPrimaryBackupOption = this.get('directRoutingInputs.userPrimaryBackupOption');\n            const userSecondaryBackupOption = this.get('directRoutingInputs.userSecondaryBackupOption') || null;\n            return {\n                waitForVipAgent: this.get('directRoutingInputs.waitForVipAgent'),\n                agentWaitSeconds: this.invalidWaitSeconds ? SECONDS : waitSeconds,\n                userId: userPrimaryBackup === 'USER' ? userPrimaryBackupOption : null,\n                queueId: userPrimaryBackup === 'QUEUE' ? userPrimaryBackupOption : userSecondaryBackupOption\n            };\n        }\n    ),\n\n    hasBackedUpUsers: computed('directRoutingInputs.backedUpUsers', function () {\n        const backedUpUsers = this.get('directRoutingInputs.backedUpUsers');\n        return backedUpUsers && backedUpUsers.length > 0;\n    }),\n\n    showSkipTimeout: bool('directRoutingInputs.userPrimaryBackup'),\n\n    showBackupRoutingOptionUsers: bool('backupRoutingOptionChoices.users.length'),\n\n    showBackupRoutingOptionQueues: bool('backupRoutingOptionChoices.queues.length'),\n\n    hasSelectedRoutingOptionUser: bool('selectedRoutingOptionUser'),\n\n    skipTimeout: not('directRoutingInputs.waitForVipAgent'),\n\n    canClearSettings: bool('directRouting.canDeleteOwnSettings'),\n\n    cannotEditSettings: computed(\n        'directRouting.canEditOwnSettings',\n        ///\n        function () {\n            return !this.directRouting.get('canEditOwnSettings');\n        }\n    ),\n\n    disableClearSettings: computed(\n        'directRouting.ownSettings',\n        'cannotEditSettings',\n        ///\n        function () {\n            return !this.get('directRouting.ownSettings') || this.cannotEditSettings;\n        }\n    ),\n\n    showSecondaryBackup: computed(\n        'directRoutingInputs.userPrimaryBackup',\n        ///\n        function () {\n            return this.directRoutingInputs.userPrimaryBackup && this.directRoutingInputs.userPrimaryBackup !== 'QUEUE';\n        }\n    ),\n\n    selectedPrimaryBackup: computed(\n        'directRoutingInputs.userPrimaryBackup',\n        ///\n        function () {\n            const primaryBackupOptions = this.primaryBackupOptions;\n            const userPrimaryBackup = this.get('directRoutingInputs.userPrimaryBackup');\n            if (primaryBackupOptions && userPrimaryBackup) {\n                return primaryBackupOptions.find(o => o.value === userPrimaryBackup);\n            }\n            return {};\n        }\n    ),\n\n    async searchBackupRoutingChoices(searchInfo) {\n        const selectedId = [];\n        const searchBackupType = searchInfo.backupType;\n        const searchDetail = searchInfo.searchDetail;\n        if (this.get('directRoutingInputs.userPrimaryBackupOption')) {\n            selectedId.push(this.get('directRoutingInputs.userPrimaryBackupOption'));\n        }\n        try {\n            if (!searchDetail || searchDetail.length < 2) {\n                this.set(`backupRoutingOptionChoices.${searchBackupType}`, []);\n                return;\n            }\n            this.set(\n                `backupRoutingOptionChoices.${searchBackupType}`,\n                this._modifiedRoutingOptionChoices(\n                    await this.directRouting.getDirectRoutingEntities(searchDetail, selectedId, searchBackupType)\n                )\n            );\n        } catch (error) {\n            this.logger.error('component/preferences-direct-routing: searchBackupRoutingChoices failed, error: ', {\n                error\n            });\n            // show toast error message\n            const title = this.intl.t('preferences.direct-routing.searchError.title');\n            const message = this.intl.t('preferences.direct-routing.searchError.message');\n            this.notification.error(title, message);\n        }\n    },\n\n    async clearSettings() {\n        try {\n            this.set('loading', true);\n            const newSettings = await this.directRouting.deleteOwnSettings();\n            run(() => {\n                this.processDirectRoutingSettings(newSettings);\n            });\n            const title = this.intl.t('preferences.direct-routing.clearSettingsModal.clearSuccess.title');\n            const message = this.intl.t('preferences.direct-routing.clearSettingsModal.clearSuccess.message');\n            this.notification.success(title, message, { hideAfter: 8 });\n        } catch (err) {\n            this.logger.error('component/preferences-direct-routing: clearSettings failed, error: ', {\n                err\n            });\n            // show a error toast\n            const title = this.intl.t('preferences.direct-routing.clearSettingsModal.clearError.title');\n            const message = this.intl.t('preferences.direct-routing.clearSettingsModal.clearError.message');\n            this.notification.error(title, message);\n        } finally {\n            this.set('loading', false);\n        }\n    },\n\n    actions: {\n        selectWaitForVipAgent(event) {\n            this.set('directRoutingInputs.waitForVipAgent', !event.target.checked);\n        },\n\n        selectPrimaryBackup(event) {\n            if (this.primaryBackupOptions.length > 1) {\n                this.set('directRoutingInputs.userPrimaryBackupOption', null);\n                this.set('directRoutingInputs.userSecondaryBackupOption', '');\n            }\n            this.set('directRoutingInputs.userPrimaryBackup', event.target.value);\n            this.set('selectedRoutingOptionUser', null);\n            this.set('selectedRoutingOptionQueue', null);\n        },\n\n        selectPrimaryBackupOption(primaryBackupOption) {\n            this.set('directRoutingInputs.userPrimaryBackupOption', primaryBackupOption.id);\n            if (this.get('directRoutingInputs.userPrimaryBackup') === 'USER') {\n                this.set('selectedRoutingOptionUser', primaryBackupOption);\n            } else {\n                this.set('selectedRoutingOptionQueue', primaryBackupOption);\n            }\n        },\n\n        searchRoutingOptions(searchBackupType, event) {\n            const userIsInputing = event.type !== 'focus';\n            const debounceTimer = userIsInputing ? 500 : 0;\n            const primaryBackup = this.get('directRoutingInputs.userPrimaryBackup');\n            const searchDetail = event.target.value;\n            const blankQueueSearch = searchBackupType === 'queues' && !searchDetail;\n            if (blankQueueSearch) {\n                this.set('selectedRoutingOptionQueue', null);\n                if (primaryBackup === 'USER') {\n                    this.set('directRoutingInputs.userSecondaryBackupOption', '');\n                }\n                if (primaryBackup === 'QUEUE') {\n                    this.set('directRoutingInputs.userPrimaryBackupOption', '');\n                }\n            }\n            debounce(\n                this,\n                this.searchBackupRoutingChoices,\n                { searchDetail: searchDetail, backupType: searchBackupType },\n                debounceTimer\n            );\n        },\n\n        hideBackupRoutingChoicesDropDown(event) {\n            const userOptionWasClicked = event.relatedTarget.getAttribute('id') === 'backupRoutingChoicesDropDown';\n            const preferenceOptionWasClicked = event.relatedTarget.localName === 'a';\n            const debounceTimer = userOptionWasClicked || preferenceOptionWasClicked ? 0 : 170;\n            debounce(\n                this,\n                () => {\n                    if (!this.isDestroyed || !this.isDestroying) {\n                        this.set('backupRoutingOptionChoices.users', []);\n                        this.set('backupRoutingOptionChoices.queues', []);\n                    }\n                },\n                debounceTimer\n            );\n        },\n\n        selectSecondaryBackupOption(secondaryBackupOption) {\n            this.set('directRoutingInputs.userSecondaryBackupOption', secondaryBackupOption.id);\n            this.set('selectedRoutingOptionQueue', secondaryBackupOption);\n        },\n\n        editBackupTimeUnits(timeUnit, event) {\n            this.set(\n                timeUnit === 'days'\n                    ? 'directRoutingInputs.userBackupTimeUnitsDays'\n                    : timeUnit === 'hours'\n                    ? 'directRoutingInputs.userBackupTimeUnitsHours'\n                    : 'directRoutingInputs.userBackupTimeUnitsMinutes',\n                event.target.value\n            );\n        },\n\n        async showClearSettingsModal() {\n            const alerting = this.alerting;\n            const intl = this.intl;\n            const title = intl.safestring('preferences.direct-routing.clearSettingsModal.headerText').toString();\n            const content = intl.safestring('preferences.direct-routing.clearSettingsModal.message').toString();\n            const positiveLabel = intl\n                .safestring('preferences.direct-routing.clearSettingsModal.confirmText')\n                .toString();\n            const negativeLabel = intl\n                .safestring('preferences.direct-routing.clearSettingsModal.cancelText')\n                .toString();\n\n            const clearSettingsModal = {\n                title: title,\n                content: content,\n                size: 'small',\n                buttons: {\n                    positive: {\n                        id: 'confirm',\n                        label: positiveLabel\n                    },\n                    negative: {\n                        id: 'cancel',\n                        label: negativeLabel\n                    }\n                }\n            };\n            const modalReturn = await alerting.pushModal(clearSettingsModal);\n            if (modalReturn.buttonId === 'confirm') {\n                this.clearSettings();\n            } else if (modalReturn.buttonId === 'cancel') {\n                // do nothing\n            }\n        },\n\n        async saveChanges() {\n            const userDesiredSettings = this.userDesiredSettings;\n            try {\n                this.set('loading', true);\n                const newSettings = await this.directRouting.updateOwnSettings({\n                    waitForAgent: userDesiredSettings.waitForVipAgent,\n                    agentWaitSeconds: userDesiredSettings.agentWaitSeconds,\n                    userId: userDesiredSettings.userId,\n                    queueId: userDesiredSettings.queueId\n                });\n                run(() => {\n                    this.processDirectRoutingSettings(newSettings);\n                });\n                const title = this.intl.t('preferences.direct-routing.saveSuccess.title');\n                const message = this.intl.t('preferences.direct-routing.saveSuccess.message');\n                this.notification.success(title, message, { hideAfter: 8 });\n            } catch (err) {\n                this.logger.error('component/preferences-direct-routing: saveChanges failed, error: ', { err });\n                // show a error toast\n                const title = this.intl.t('preferences.direct-routing.saveError.title');\n                const message = this.intl.t('preferences.direct-routing.saveError.message');\n                this.notification.error(title, message);\n            } finally {\n                this.set('loading', false);\n            }\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"wXeMuLad\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[10,2],[14,0,\\\"text-center\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,2],[\\\"common.loading\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"    \\\"],[10,\\\"h4\\\"],[12],[1,[28,[35,2],[\\\"preferences.direct-routing.header\\\"],null]],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"settings-preference\\\"],[14,\\\"data-t\\\",\\\"directRoutingDescription\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,3],[[[1,\\\"            \\\"],[10,2],[12],[1,[28,[35,2],[\\\"preferences.direct-routing.cannot-edit-settings\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[10,2],[12],[1,[28,[35,2],[\\\"preferences.direct-routing.description\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,4],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"settings-header-text\\\"],[12],[1,\\\" \\\"],[1,[28,[35,2],[\\\"preferences.direct-routing.backed-up-user-list\\\"],null]],[1,\\\" \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,\\\"data-t\\\",\\\"backedUpUsers\\\"],[14,0,\\\"settings-backedup-user-list\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,6],[[28,[37,6],[[33,7,[\\\"backedUpUsers\\\"]]],null]],null],null,[[[1,\\\"                \\\"],[10,0],[14,0,\\\"backedup-user\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"backup-user-image\\\"],[12],[1,\\\"\\\\n\\\"],[6,[39,8],null,[[\\\"entity\\\",\\\"showPresence\\\",\\\"enableMiniCard\\\"],[[30,1],true,false]],[[\\\"default\\\"],[[[[1,\\\"                            \\\"],[1,[28,[35,9],null,[[\\\"entity\\\"],[[30,1]]]]],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"backup-user-info\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,2],[14,0,\\\"backup-user-name\\\"],[12],[1,[30,1,[\\\"name\\\"]]],[13],[1,\\\"\\\\n                        \\\"],[10,1],[14,0,\\\"backup-user-presence-label\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[30,1,[\\\"presenceLabel\\\"]]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[10,0],[14,\\\"data-t\\\",\\\"backupRoutingOptions\\\"],[14,0,\\\"primaryBackupOptions\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"settings-header-text\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,2],[\\\"preferences.direct-routing.primary-backup-routing-options-title\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"gux-dropdown\\\"],[15,2,[33,7,[\\\"userPrimaryBackup\\\"]]],[15,\\\"placeholder\\\",[29,[[28,[37,2],[\\\"preferences.direct-routing.primary-backup-routing-option-placeholder-text\\\"],null]]]],[14,\\\"filterable\\\",\\\"true\\\"],[15,\\\"onchange\\\",[28,[37,10],[[30,0],\\\"selectPrimaryBackup\\\"],null]],[15,\\\"disabled\\\",[29,[[36,3]]]],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-listbox\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,6],[[28,[37,6],[[33,11]],null]],null],null,[[[1,\\\"                    \\\"],[10,\\\"gux-option\\\"],[15,2,[30,2,[\\\"value\\\"]]],[12],[1,[30,2,[\\\"label\\\"]]],[13],[1,\\\"\\\\n\\\"]],[2]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,\\\"data-t\\\",\\\"backupRoutingChoices\\\"],[14,0,\\\"primaryBackupChoices\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,7,[\\\"userPrimaryBackup\\\"]],[[[41,[28,[37,12],[\\\"QUEUE\\\",[33,7,[\\\"userPrimaryBackup\\\"]]],null],[[[1,\\\"                \\\"],[10,\\\"gux-form-field-search\\\"],[15,\\\"oninput\\\",[28,[37,10],[[30,0],\\\"searchRoutingOptions\\\",\\\"queues\\\"],null]],[14,\\\"label-position\\\",\\\"above\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,3],[[[1,\\\"                        \\\"],[10,\\\"input\\\"],[14,1,\\\"searchPrimaryQueues\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,\\\"placeholder\\\",[29,[[28,[37,2],[\\\"preferences.direct-routing.primary-backup-queue-placeholder-text\\\"],null]]]],[15,2,[33,13,[\\\"name\\\"]]],[14,\\\"disabled\\\",\\\"\\\"],[14,4,\\\"search\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,\\\"input\\\"],[14,1,\\\"searchPrimaryQueues\\\"],[15,\\\"onfocus\\\",[28,[37,10],[[30,0],\\\"searchRoutingOptions\\\",\\\"queues\\\"],null]],[15,\\\"onblur\\\",[28,[37,10],[[30,0],\\\"hideBackupRoutingChoicesDropDown\\\"],null]],[14,\\\"slot\\\",\\\"input\\\"],[15,\\\"placeholder\\\",[29,[[28,[37,2],[\\\"preferences.direct-routing.primary-backup-queue-placeholder-text\\\"],null]]]],[15,2,[33,13,[\\\"name\\\"]]],[14,\\\"autocomplete\\\",\\\"off\\\"],[14,4,\\\"search\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                    \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"searchPrimaryQueues\\\"],[14,\\\"slot\\\",\\\"label\\\"],[12],[1,[33,14,[\\\"label\\\"]]],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,15],[[[1,\\\"                    \\\"],[10,\\\"gux-listbox\\\"],[14,1,\\\"backupRoutingChoicesDropDown\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,6],[[28,[37,6],[[33,16,[\\\"queues\\\"]]],null]],null],null,[[[1,\\\"                            \\\"],[10,\\\"gux-option\\\"],[15,2,[30,3,[\\\"id\\\"]]],[15,\\\"onmousedown\\\",[28,[37,10],[[30,0],\\\"selectPrimaryBackupOption\\\",[30,3]],null]],[12],[1,\\\"\\\\n                                \\\"],[1,[30,3,[\\\"name\\\"]]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[3]],null],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null],[41,[28,[37,12],[\\\"USER\\\",[33,7,[\\\"userPrimaryBackup\\\"]]],null],[[[1,\\\"                \\\"],[10,\\\"gux-form-field-search\\\"],[15,\\\"oninput\\\",[28,[37,10],[[30,0],\\\"searchRoutingOptions\\\",\\\"users\\\"],null]],[14,\\\"label-position\\\",\\\"above\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,3],[[[1,\\\"                        \\\"],[10,\\\"input\\\"],[14,1,\\\"searchPrimaryUsers\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,\\\"placeholder\\\",[29,[[28,[37,2],[\\\"preferences.direct-routing.primary-backup-user-placeholder-text\\\"],null]]]],[15,2,[33,17,[\\\"name\\\"]]],[14,\\\"disabled\\\",\\\"\\\"],[14,4,\\\"search\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,\\\"input\\\"],[14,1,\\\"searchPrimaryUsers\\\"],[15,\\\"onfocus\\\",[28,[37,10],[[30,0],\\\"searchRoutingOptions\\\",\\\"users\\\"],null]],[15,\\\"onblur\\\",[28,[37,10],[[30,0],\\\"hideBackupRoutingChoicesDropDown\\\"],null]],[14,\\\"slot\\\",\\\"input\\\"],[15,\\\"placeholder\\\",[29,[[28,[37,2],[\\\"preferences.direct-routing.primary-backup-user-placeholder-text\\\"],null]]]],[15,2,[33,17,[\\\"name\\\"]]],[14,\\\"autocomplete\\\",\\\"off\\\"],[14,4,\\\"search\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                    \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"searchPrimaryUsers\\\"],[14,\\\"slot\\\",\\\"label\\\"],[12],[1,[33,14,[\\\"label\\\"]]],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,18],[[[1,\\\"                    \\\"],[10,\\\"gux-listbox\\\"],[14,1,\\\"backupRoutingChoicesDropDown\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,6],[[28,[37,6],[[33,16,[\\\"users\\\"]]],null]],null],null,[[[1,\\\"                            \\\"],[10,\\\"gux-option\\\"],[15,2,[30,4,[\\\"id\\\"]]],[15,\\\"onmousedown\\\",[28,[37,10],[[30,0],\\\"selectPrimaryBackupOption\\\",[30,4]],null]],[12],[1,\\\"\\\\n                                \\\"],[1,[30,4,[\\\"name\\\"]]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[4]],null],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,19],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"selected-primary-backup-user\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,0],[14,0,\\\"user-image\\\"],[12],[1,\\\"\\\\n                            \\\"],[6,[39,8],null,[[\\\"entity\\\",\\\"showPresence\\\",\\\"enableMiniCard\\\"],[[33,17],true,false]],[[\\\"default\\\"],[[[],[]]]]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                        \\\"],[10,0],[14,0,\\\"user-info\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,2],[14,0,\\\"user-name\\\"],[12],[1,[33,17,[\\\"name\\\"]]],[13],[1,\\\"\\\\n                            \\\"],[10,1],[14,0,\\\"user-presence-label\\\"],[12],[1,\\\"\\\\n                                \\\"],[1,[33,17,[\\\"presenceLabel\\\"]]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,20],[[[1,\\\"        \\\"],[10,0],[14,\\\"data-t\\\",\\\"secondaryBackupOptions\\\"],[14,0,\\\"secondaryBackupOptions\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-form-field-search\\\"],[15,\\\"oninput\\\",[28,[37,10],[[30,0],\\\"searchRoutingOptions\\\",\\\"queues\\\"],null]],[14,\\\"label-position\\\",\\\"above\\\"],[14,\\\"data-t\\\",\\\"secondaryBackupOptions\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,3],[[[1,\\\"                    \\\"],[10,\\\"input\\\"],[14,1,\\\"searchSecondaryQueues\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,\\\"placeholder\\\",[29,[[28,[37,2],[\\\"preferences.direct-routing.secondary-backup-routing-option-placeholder-text\\\"],null]]]],[15,2,[33,13,[\\\"name\\\"]]],[14,\\\"disabled\\\",\\\"\\\"],[14,4,\\\"search\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,\\\"input\\\"],[14,1,\\\"searchSecondaryQueues\\\"],[15,\\\"onfocus\\\",[28,[37,10],[[30,0],\\\"searchRoutingOptions\\\",\\\"queues\\\"],null]],[15,\\\"onblur\\\",[28,[37,10],[[30,0],\\\"hideBackupRoutingChoicesDropDown\\\"],null]],[14,\\\"slot\\\",\\\"input\\\"],[15,\\\"placeholder\\\",[29,[[28,[37,2],[\\\"preferences.direct-routing.secondary-backup-routing-option-placeholder-text\\\"],null]]]],[15,2,[33,13,[\\\"name\\\"]]],[14,\\\"autocomplete\\\",\\\"off\\\"],[14,4,\\\"search\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"searchSecondaryQueues\\\"],[14,\\\"slot\\\",\\\"label\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,2],[\\\"preferences.direct-routing.secondary-backup-routing-options-title\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,15],[[[1,\\\"            \\\"],[10,\\\"gux-listbox\\\"],[14,1,\\\"backupRoutingChoicesDropDown\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,6],[[28,[37,6],[[33,16,[\\\"queues\\\"]]],null]],null],null,[[[1,\\\"                    \\\"],[10,\\\"gux-option\\\"],[15,2,[30,5,[\\\"id\\\"]]],[15,\\\"onmousedown\\\",[28,[37,10],[[30,0],\\\"selectSecondaryBackupOption\\\",[30,5]],null]],[12],[1,\\\"\\\\n                        \\\"],[1,[30,5,[\\\"name\\\"]]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[5]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null],[41,[33,21],[[[1,\\\"        \\\"],[10,0],[14,\\\"data-t\\\",\\\"skipTimeoutCheckbox\\\"],[14,0,\\\"skipTimeoutCheckbox\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-form-field\\\"],[14,\\\"label-position\\\",\\\"beside\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,3],[[[1,\\\"                    \\\"],[10,\\\"input\\\"],[14,1,\\\"directRoutingWaitCheckbox\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,\\\"checked\\\",[36,22]],[15,\\\"onchange\\\",[28,[37,10],[[30,0],\\\"selectWaitForVipAgent\\\"],null]],[14,\\\"disabled\\\",\\\"\\\"],[14,4,\\\"checkbox\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,\\\"input\\\"],[14,1,\\\"directRoutingWaitCheckbox\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,\\\"checked\\\",[36,22]],[15,\\\"onchange\\\",[28,[37,10],[[30,0],\\\"selectWaitForVipAgent\\\"],null]],[14,4,\\\"checkbox\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[14,\\\"for\\\",\\\"directRoutingWaitCheckbox\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,2],[\\\"preferences.direct-routing.reassign-to-backup-text\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[51,[33,22]],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"settings-header-text\\\"],[12],[1,\\\" \\\"],[1,[28,[35,2],[\\\"preferences.direct-routing.backup-time-options-title\\\"],null]],[1,\\\" \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"go-to-backup\\\"],[14,\\\"data-t\\\",\\\"backupTimeOptions\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,3],[[[1,\\\"                \\\"],[10,\\\"gux-form-field\\\"],[14,\\\"label-position\\\",\\\"beside\\\"],[14,0,\\\"backupTimeForm\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"input\\\"],[14,1,\\\"directRoutingDays\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,2,[33,7,[\\\"userBackupTimeUnitsDays\\\"]]],[14,\\\"min\\\",\\\"0\\\"],[14,\\\"oninput\\\",\\\"this.value|=0\\\"],[15,\\\"onchange\\\",[28,[37,10],[[30,0],\\\"editBackupTimeUnits\\\",[33,24,[\\\"days\\\",\\\"value\\\"]]],null]],[14,\\\"disabled\\\",\\\"\\\"],[14,4,\\\"number\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"directRoutingDays\\\"],[14,\\\"slot\\\",\\\"label\\\"],[14,0,\\\"dateLabel\\\"],[12],[1,[33,24,[\\\"days\\\",\\\"label\\\"]]],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-form-field\\\"],[14,\\\"label-position\\\",\\\"beside\\\"],[14,0,\\\"backupTimeForm\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"input\\\"],[14,1,\\\"directRoutingHours\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,2,[33,7,[\\\"userBackupTimeUnitsHours\\\"]]],[14,\\\"min\\\",\\\"0\\\"],[14,\\\"oninput\\\",\\\"this.value|=0\\\"],[15,\\\"onchange\\\",[28,[37,10],[[30,0],\\\"editBackupTimeUnits\\\",[33,24,[\\\"hours\\\",\\\"value\\\"]]],null]],[14,\\\"disabled\\\",\\\"\\\"],[14,4,\\\"number\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"directRoutingHours\\\"],[14,\\\"slot\\\",\\\"label\\\"],[14,0,\\\"dateLabel\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[33,24,[\\\"hours\\\",\\\"label\\\"]]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-form-field\\\"],[14,\\\"label-position\\\",\\\"beside\\\"],[14,0,\\\"backupTimeForm\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"input\\\"],[14,1,\\\"directRoutingMins\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,2,[33,7,[\\\"userBackupTimeUnitsMinutes\\\"]]],[14,\\\"min\\\",\\\"0\\\"],[14,\\\"oninput\\\",\\\"this.value|=0\\\"],[15,\\\"onchange\\\",[28,[37,10],[[30,0],\\\"editBackupTimeUnits\\\",[33,24,[\\\"minutes\\\",\\\"value\\\"]]],null]],[14,\\\"disabled\\\",\\\"\\\"],[14,4,\\\"number\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"directRoutingMins\\\"],[14,\\\"slot\\\",\\\"label\\\"],[14,0,\\\"dateLabel\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[33,24,[\\\"minutes\\\",\\\"label\\\"]]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"wait-time-input\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-form-field\\\"],[14,\\\"label-position\\\",\\\"beside\\\"],[14,0,\\\"backupTimeForm\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"input\\\"],[14,1,\\\"directRoutingDays\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,2,[33,7,[\\\"userBackupTimeUnitsDays\\\"]]],[14,\\\"min\\\",\\\"0\\\"],[14,\\\"oninput\\\",\\\"this.value|=0\\\"],[15,\\\"onchange\\\",[28,[37,10],[[30,0],\\\"editBackupTimeUnits\\\",[33,24,[\\\"days\\\",\\\"value\\\"]]],null]],[14,4,\\\"number\\\"],[12],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"directRoutingDays\\\"],[14,\\\"slot\\\",\\\"label\\\"],[14,0,\\\"dateLabel\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[33,24,[\\\"days\\\",\\\"label\\\"]]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"wait-time-input\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-form-field\\\"],[14,\\\"label-position\\\",\\\"beside\\\"],[14,0,\\\"backupTimeForm\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"input\\\"],[14,1,\\\"directRoutingHours\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,2,[33,7,[\\\"userBackupTimeUnitsHours\\\"]]],[14,\\\"min\\\",\\\"0\\\"],[14,\\\"oninput\\\",\\\"this.value|=0\\\"],[15,\\\"onchange\\\",[28,[37,10],[[30,0],\\\"editBackupTimeUnits\\\",[33,24,[\\\"hours\\\",\\\"value\\\"]]],null]],[14,4,\\\"number\\\"],[12],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"directRoutingHours\\\"],[14,\\\"slot\\\",\\\"label\\\"],[14,0,\\\"dateLabel\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[33,24,[\\\"hours\\\",\\\"label\\\"]]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"wait-time-input\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-form-field\\\"],[14,\\\"label-position\\\",\\\"beside\\\"],[14,0,\\\"backupTimeForm\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"input\\\"],[14,1,\\\"directRoutingMins\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,2,[33,7,[\\\"userBackupTimeUnitsMinutes\\\"]]],[14,\\\"min\\\",\\\"0\\\"],[14,\\\"oninput\\\",\\\"this.value|=0\\\"],[15,\\\"onchange\\\",[28,[37,10],[[30,0],\\\"editBackupTimeUnits\\\",[33,24,[\\\"minutes\\\",\\\"value\\\"]]],null]],[14,4,\\\"number\\\"],[12],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"directRoutingMins\\\"],[14,\\\"slot\\\",\\\"label\\\"],[14,0,\\\"dateLabel\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[33,24,[\\\"minutes\\\",\\\"label\\\"]]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,25],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"wait-time-error\\\"],[12],[1,\\\"\\\\n                \\\"],[10,1],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"],[41,[33,26],[[[1,\\\"                        \\\"],[1,[28,[35,2],[\\\"preferences.direct-routing.waitTimeMinError\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[1,[28,[35,2],[\\\"preferences.direct-routing.waitTimeMaxError\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null],[41,[33,27],[[[1,\\\"        \\\"],[10,\\\"gux-button\\\"],[14,0,\\\"clearBtn\\\"],[14,\\\"data-t\\\",\\\"clearSettingsBtn\\\"],[14,\\\"accent\\\",\\\"ghost\\\"],[15,\\\"onclick\\\",[28,[37,10],[[30,0],\\\"showClearSettingsModal\\\"],null]],[15,\\\"disabled\\\",[29,[[36,28]]]],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,2],[\\\"preferences.direct-routing.clear-btn-text\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[10,\\\"gux-button\\\"],[14,0,\\\"saveBtn\\\"],[14,\\\"data-t\\\",\\\"directRoutingSaveBtn\\\"],[14,\\\"accent\\\",\\\"primary\\\"],[15,\\\"onclick\\\",[28,[37,10],[[30,0],\\\"saveChanges\\\"],null]],[15,\\\"disabled\\\",[29,[[36,29]]]],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,2],[\\\"preferences.direct-routing.save-btn-text\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[\\\"backupUser\\\",\\\"option\\\",\\\"choice\\\",\\\"choice\\\",\\\"choice\\\"],false,[\\\"if\\\",\\\"loading\\\",\\\"t\\\",\\\"cannotEditSettings\\\",\\\"hasBackedUpUsers\\\",\\\"each\\\",\\\"-track-array\\\",\\\"directRoutingInputs\\\",\\\"entity-image\\\",\\\"integration-badges\\\",\\\"action\\\",\\\"primaryBackupOptions\\\",\\\"eq\\\",\\\"selectedRoutingOptionQueue\\\",\\\"selectedPrimaryBackup\\\",\\\"showBackupRoutingOptionQueues\\\",\\\"backupRoutingOptionChoices\\\",\\\"selectedRoutingOptionUser\\\",\\\"showBackupRoutingOptionUsers\\\",\\\"hasSelectedRoutingOptionUser\\\",\\\"showSecondaryBackup\\\",\\\"showSkipTimeout\\\",\\\"skipTimeout\\\",\\\"unless\\\",\\\"backupTimeUnits\\\",\\\"invalidWaitSeconds\\\",\\\"invalidWaitSecondsMin\\\",\\\"canClearSettings\\\",\\\"disableClearSettings\\\",\\\"disableSave\\\"]]\",\"moduleName\":\"web-directory/components/preferences-direct-routing/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport { reads } from '@ember/object/computed';\nimport { on } from '@ember/object/evented';\nimport { observer, computed } from '@ember/object';\nimport Component from '@ember/component';\n\nexport default Component.extend({\n    application: service(),\n    session: service(),\n    geolocation: service(),\n\n    checkForUpdates: true,\n    startOnLogin: false,\n    allowGeolocation: false,\n    orgHasGeolocation: reads('geolocation.isEnabled'),\n    downloadDirectory: '',\n\n    isMac: false,\n    isWindows: false,\n\n    //Array of additional preferences supported by the desktop app\n    //Possible values:\n    //   downloadDirectory\n    additionalPreferences: [],\n\n    loadPreferences: on('init', function () {\n        this.set('isMac', this.get('application.hostedContext').isMac());\n        this.set('isWindows', this.get('application.hostedContext').isWindows());\n        this.set('additionalPreferences', this.get('application.hostedContext').getAdditionalPreferences());\n\n        const request = {\n            cmd: 'getPreferences',\n            prefs: this.prefNames()\n        };\n        this.get('application.hostedContext')\n            .requestDesktopPromise(request)\n            .then(prefs => {\n                this.set('checkForUpdates', prefs.notification_checkForUpdates);\n                this.set('startOnLogin', prefs.notification_autoStartOnLogin);\n                this.set('allowGeolocation', prefs.permission_geolocation);\n\n                if (this.hasDownloadDirectory) {\n                    this.set('downloadDirectory', prefs.download_directory);\n                }\n\n                this.shouldSetDesktopPreferences = true;\n            });\n    }),\n\n    hasDownloadDirectory: computed('additionalPreferences', function () {\n        return this.additionalPreferences.includes('downloadDirectory');\n    }),\n\n    prefNames() {\n        const names = ['permission_geolocation'];\n        if (this.isMac) {\n            names.push('notification_checkForUpdates');\n        }\n        if (this.isWindows) {\n            names.push('notification_autoStartOnLogin');\n        }\n\n        if (this.hasDownloadDirectory) {\n            names.push('download_directory');\n        }\n        return names;\n    },\n\n    prefDict() {\n        const dict = {\n            permission_geolocation: this.allowGeolocation\n        };\n        if (this.isMac) {\n            dict.notification_checkForUpdates = this.checkForUpdates;\n        }\n        if (this.isWindows) {\n            dict.notification_autoStartOnLogin = this.startOnLogin;\n        }\n\n        if (this.hasDownloadDirectory) {\n            dict.download_directory = this.downloadDirectory;\n        }\n        return dict;\n    },\n\n    changeDesktopPreferences: observer(\n        'checkForUpdates',\n        'startOnLogin',\n        'allowGeolocation',\n        'downloadDirectory',\n        function () {\n            if (!this.shouldSetDesktopPreferences) {\n                return;\n            }\n            const request = {\n                cmd: 'setPreferences',\n                prefs: this.prefDict()\n            };\n            this.get('application.hostedContext')\n                .requestDesktopPromise(request)\n                .then(() => {\n                    if (this.isWindows) {\n                        if (this.allowGeolocation && !this.get('geolocation.isStarted')) {\n                            this.geolocation.start();\n                        } else if (!this.allowGeolocation && this.get('geolocation.isStarted')) {\n                            this.geolocation.stop();\n                        }\n                    }\n                });\n        }\n    ),\n\n    actions: {\n        toggleCheckForUpdates() {\n            this.toggleProperty('checkForUpdates');\n        },\n\n        toggleStartOnLogin() {\n            this.toggleProperty('startOnLogin');\n        },\n\n        toggleAllowGeolocation() {\n            this.toggleProperty('allowGeolocation');\n        },\n\n        browseForDownloadDirectory() {\n            return this.get('application.hostedContext')\n                .requestDesktopPromise({\n                    cmd: 'browseForDownloadDirectory'\n                })\n                .then(val => {\n                    if (val && val.newDirectory && val.newDirectory.length > 0) {\n                        this.set('downloadDirectory', val.newDirectory);\n                    }\n                });\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"LHt/a9XY\",\"block\":\"[[[10,0],[14,0,\\\"settings-preference\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"settings-header-text\\\"],[12],[1,[28,[35,0],[\\\"preferences.tabs.general\\\"],null]],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,2],[[[1,\\\"        \\\"],[10,\\\"gux-form-field-checkbox\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"input\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,1,[29,[[36,3],\\\"-automatically-check-updates\\\"]]],[14,3,\\\"automatically-check-updates\\\"],[15,\\\"checked\\\",[36,4]],[15,\\\"onchange\\\",[28,[37,5],[[30,0],\\\"toggleCheckForUpdates\\\"],null]],[14,4,\\\"checkbox\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[15,\\\"for\\\",[29,[[36,3],\\\"-automatically-check-updates\\\"]]],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,0],[\\\"preferences.general.automaticallyCheckForUpdates\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,6],[[[1,\\\"        \\\"],[10,\\\"gux-form-field-checkbox\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"input\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,1,[29,[[36,3],\\\"-start-on-login\\\"]]],[14,3,\\\"start-on-login\\\"],[15,\\\"checked\\\",[36,7]],[15,\\\"onchange\\\",[28,[37,5],[[30,0],\\\"toggleStartOnLogin\\\"],null]],[14,4,\\\"checkbox\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[15,\\\"for\\\",[29,[[36,3],\\\"-start-on-login\\\"]]],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,0],[\\\"preferences.general.launchOnStartup\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,8],[[[1,\\\"            \\\"],[10,\\\"gux-form-field-checkbox\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"input\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,1,[29,[[36,3],\\\"-allow-geolocation\\\"]]],[14,3,\\\"allow-geolocation\\\"],[15,\\\"checked\\\",[36,9]],[15,\\\"onchange\\\",[28,[37,5],[[30,0],\\\"toggleAllowGeolocation\\\"],null]],[14,4,\\\"checkbox\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[15,\\\"for\\\",[29,[[36,3],\\\"-allow-geolocation\\\"]]],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,0],[\\\"preferences.general.allowGeolocation\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,10],[[[1,\\\"        \\\"],[10,\\\"label\\\"],[14,0,\\\"setting-label\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,0],[\\\"preferences.general.downloadLocation\\\"],null]],[10,\\\"br\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[1,[28,[35,11],null,[[\\\"type\\\",\\\"readonly\\\",\\\"class\\\",\\\"value\\\"],[\\\"text\\\",\\\"true\\\",\\\"form-control\\\",[33,12]]]]],[1,\\\"\\\\n            \\\"],[11,3],[24,6,\\\"#\\\"],[4,[38,5],[[30,0],\\\"browseForDownloadDirectory\\\"],null],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,0],[\\\"preferences.general.change\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13]],[],false,[\\\"t\\\",\\\"if\\\",\\\"isMac\\\",\\\"elementId\\\",\\\"checkForUpdates\\\",\\\"action\\\",\\\"isWindows\\\",\\\"startOnLogin\\\",\\\"orgHasGeolocation\\\",\\\"allowGeolocation\\\",\\\"hasDownloadDirectory\\\",\\\"input\\\",\\\"downloadDirectory\\\"]]\",\"moduleName\":\"web-directory/components/preferences-general/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport { computed } from '@ember/object';\nimport Component from '@ember/component';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['language-preferences'],\n\n    session: service(),\n    intl: service(),\n\n    selection: null,\n    applyFailed: false,\n\n    actions: {\n        selectLanguage(locale) {\n            if (locale === this.selection) {\n                return;\n            }\n            if (locale === this.get('intl.isoLocale')) {\n                this.set('selection', null);\n                return;\n            }\n            this.set('selection', locale);\n        },\n        applyAndReload() {\n            const intl = this.intl;\n            const locale = this.selection;\n            if (!locale || locale === intl.get('isoLocale')) {\n                return;\n            }\n            intl.setPreferredLanguage(locale)\n                .then(() => {\n                    this.set('applyFailed', false);\n                    window.location.reload();\n                })\n                .catch(reason => {\n                    this.set('applyFailed', true);\n                    this.logger.error('setting preferred language failed', { error: reason });\n                });\n        }\n    },\n\n    languages: computed('intl.{languages,isoLocale,supportedLocales}', 'selection', function () {\n        const intl = this.intl;\n        const current = intl.get('isoLocale');\n        const selected = this.selection || current;\n        const supportedLocales = intl.get('supportedLocales');\n        const languages = intl.get('languages');\n\n        return supportedLocales\n            .map(locale => {\n                return {\n                    locale,\n                    display: languages[locale],\n                    selected: locale === selected,\n                    current: locale === current\n                };\n            })\n            .sort(function (a, b) {\n                return a.display.localeCompare(b.display);\n            });\n    }),\n\n    canApplyAndReload: computed('intl.isoLocale', 'selection', function () {\n        const selection = this.selection;\n        const isoLocale = this.get('intl.isoLocale');\n        return selection && selection !== isoLocale;\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"KQu2Cb2K\",\"block\":\"[[[10,0],[14,0,\\\"loading-container\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"settings-preference\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"label\\\"],[14,0,\\\"settings-header-text\\\"],[12],[1,[28,[35,0],[\\\"preferences.language.header\\\"],null]],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"languages\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,2],[[28,[37,2],[[33,3]],null]],null],null,[[[1,\\\"                \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"language a11y-no-link-style\\\"],[16,\\\"lang\\\",[29,[[30,1,[\\\"locale\\\"]]]]],[4,[38,4],[[30,0],\\\"selectLanguage\\\",[30,1,[\\\"locale\\\"]]],[[\\\"on\\\"],[\\\"click\\\"]]],[12],[1,\\\"\\\\n                    \\\"],[10,1],[14,0,\\\"language-state\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,1,[\\\"current\\\"]],[[[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/check-circle\\\"],[14,0,\\\"language--current\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                            \\\"],[10,1],[14,0,\\\"sr-only\\\"],[12],[1,[28,[35,0],[\\\"preferences.language.current\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[30,1,[\\\"selected\\\"]],[[[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/circle\\\"],[14,0,\\\"language--selected\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                            \\\"],[10,1],[14,0,\\\"sr-only\\\"],[12],[1,[28,[35,0],[\\\"preferences.language.selected\\\"],null]],[13],[1,\\\"\\\\n                        \\\"]],[]],null]],[]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,1],[14,0,\\\"language-text\\\"],[12],[1,[30,1,[\\\"display\\\"]]],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"settings-preference\\\"],[12],[1,\\\"\\\\n        \\\"],[10,2],[12],[1,[28,[35,0],[\\\"preferences.language.notice\\\"],null]],[13],[1,\\\"\\\\n\\\"],[41,[33,6],[[[1,\\\"            \\\"],[10,2],[14,0,\\\"apply-failure\\\"],[12],[1,[28,[35,0],[\\\"preferences.language.failure\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-purecloud btn-success\\\"],[16,\\\"disabled\\\",[28,[37,7],[[33,8]],null]],[24,4,\\\"button\\\"],[4,[38,4],[[30,0],\\\"applyAndReload\\\"],[[\\\"on\\\"],[\\\"click\\\"]]],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,0],[\\\"preferences.language.apply\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[\\\"language\\\"],false,[\\\"t\\\",\\\"each\\\",\\\"-track-array\\\",\\\"languages\\\",\\\"action\\\",\\\"if\\\",\\\"applyFailed\\\",\\\"not\\\",\\\"canApplyAndReload\\\"]]\",\"moduleName\":\"web-directory/components/preferences-language/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport { reads } from '@ember/object/computed';\nimport { on } from '@ember/object/evented';\nimport { observer, computed, set } from '@ember/object';\nimport Component from '@ember/component';\nimport _ from 'lodash';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['preferences-notifications-desktop'],\n\n    intl: service(),\n    chat: service(),\n    application: service(),\n    preferences: service(),\n    session: service(),\n    settings: service(),\n    webrtcSettings: service(),\n\n    shouldSetDesktopPreferences: false,\n    showCheckBrowser: false,\n\n    hidePlaySound: false,\n    hideSoundSelector: false,\n\n    playSound: true,\n    soundName: 'PureCloud Notification',\n    shouldShowBrowseForSound: false,\n    bounceDockIcon: 1,\n    showToast: true,\n    flashTaskbar: true,\n\n    showGroupNotifications: false,\n    notificationPrompt: true,\n\n    soundOptions: [],\n\n    isMac: false,\n    isWindows: false,\n\n    useDesktopGroupNotificationSetting: false,\n\n    disableProfileNotifications: reads('webrtcSettings.settings.directorySettings.disableProfileNotifications'),\n\n    bounceDockIconOptions: computed(function () {\n        const intl = this.intl;\n        return [\n            {\n                value: 0,\n                label: intl.safestring('preferences.notifications.dockBounceNone').toString()\n            },\n            {\n                value: 1,\n                label: intl.safestring('preferences.notifications.dockBounceOnce').toString()\n            },\n            {\n                value: 2,\n                label: intl.safestring('preferences.notifications.dockBounceContinually').toString()\n            }\n        ];\n    }),\n\n    loadPreferences: on('init', function () {\n        this.isMac = this.get('application.hostedContext').isMac();\n        this.isWindows = this.get('application.hostedContext').isWindows();\n\n        this.get('application.hostedContext')\n            .requestDesktopPromise({\n                cmd: 'getSoundList'\n            })\n            .then(val => {\n                this.set('soundOptions', val);\n            });\n\n        this.get('application.hostedContext')\n            .requestDesktopPromise({\n                cmd: 'getPreferences',\n                prefs: this.prefNames()\n            })\n            .then((prefs = {}) => {\n                this.set('playSound', prefs.notification_playSound);\n                this.set('soundName', prefs.notification_soundName);\n                this.set('bounceDockIcon', prefs.notification_bounceDockIcon);\n                this.set('showToast', prefs.notification_showToast);\n                this.set('flashTaskbar', prefs.notification_flashTaskbar);\n\n                if (this.useDesktopGroupNotificationSetting) {\n                    this.set('showGroupNotifications', prefs.notification_showGroupNotifications);\n                }\n\n                this.shouldSetDesktopPreferences = true;\n            });\n\n        if (!this.useDesktopGroupNotificationSetting) {\n            this.preferences.getPreference('notifications.global').then((prefs = {}) => {\n                this.set('showGroupNotifications', prefs.showGroupNotifications);\n                this.set('notificationPrompt', prefs.notificationPrompt);\n            });\n        }\n    }),\n\n    prefNames() {\n        const prefs = ['notification_playSound', 'notification_soundName', 'notification_showToast'];\n        if (this.isMac) {\n            prefs.push('notification_bounceDockIcon');\n        }\n        if (this.isWindows) {\n            prefs.push('notification_flashTaskbar');\n        }\n        return prefs;\n    },\n\n    prefDict() {\n        const prefs = {\n            notification_playSound: this.playSound,\n            notification_soundName: this.soundName,\n            notification_showToast: this.showToast\n        };\n\n        if (this.useDesktopGroupNotificationSetting) {\n            prefs.notification_showGroupNotifications = this.showGroupNotifications;\n        }\n\n        if (this.isMac) {\n            prefs.notification_bounceDockIcon = this.bounceDockIcon;\n        }\n        if (this.isWindows) {\n            prefs.notification_flashTaskbar = this.flashTaskbar;\n        }\n        return prefs;\n    },\n\n    modifySoundOptions(val) {\n        const opts = this.soundOptions;\n        let custom = _.find(opts, function (opt) {\n            return opt.value === 'Custom';\n        });\n        if (custom !== null) {\n            set(custom, 'label', val);\n        }\n    },\n\n    changeDesktopPreferences: observer(\n        'playSound',\n        'soundName',\n        'bounceDockIcon',\n        'showToast',\n        'flashTaskbar',\n        'notificationPrompt',\n        function () {\n            this.saveNotifyChange();\n            if (this.showToast) {\n                this.set('hidePlaySound', false);\n            } else {\n                this.set('hidePlaySound', true);\n            }\n            if (this.playSound) {\n                this.set('hideSoundSelector', false);\n            } else {\n                this.set('hideSoundSelector', true);\n            }\n            if (this.isWindows) {\n                this.set('shouldShowBrowseForSound', this.soundName === 'Custom');\n            }\n            if (this.shouldSetDesktopPreferences) {\n                this.get('application.hostedContext').requestDesktopPromise({\n                    cmd: 'setPreferences',\n                    prefs: this.prefDict()\n                });\n            }\n        }\n    ),\n\n    saveNotifyChange() {\n        if (this.notificationPrompt) {\n            // Feature detection: only access Notification API if it exists\n            if (typeof window.Notification !== 'undefined') {\n                try {\n                    const permission = Notification.permission;\n                    if (window.Notify && (permission === 'denied' || permission === 'default')) {\n                        window.Notify.requestPermission();\n                    }\n                } catch (e) {\n                    // Log error but don't prevent preference saving\n                    this.logger.error('Error checking notification permission', { error: e });\n                }\n            }\n        }\n        const preferences = this.preferences;\n        return preferences.getPreference('notifications.global').then((prefs = {}) => {\n            prefs.notificationPrompt = this.notificationPrompt;\n            return preferences.setPreference('notifications.global', prefs);\n        });\n    },\n\n    changeGroupNotificationPreference: observer('showGroupNotifications', function () {\n        if (!this.useDesktopGroupNotificationSetting) {\n            const preferences = this.preferences;\n            preferences.getPreference('notifications.global').then((prefs = {}) => {\n                prefs.showGroupNotifications = this.showGroupNotifications;\n                preferences.setPreference('notifications.global', prefs);\n            });\n        }\n    }),\n\n    actions: {\n        togglePlaySound() {\n            this.toggleProperty('playSound');\n        },\n\n        toggleShowToast() {\n            this.toggleProperty('showToast');\n        },\n\n        toggleShowGroupNotifications() {\n            this.toggleProperty('showGroupNotifications');\n        },\n\n        toggleFlashTaskbar() {\n            this.toggleProperty('flashTaskbar');\n        },\n\n        toggleNotificationPrompt() {\n            this.toggleProperty('notificationPrompt');\n        },\n\n        chooseSound(e) {\n            let value = e.target.value;\n            this.set('soundName', value);\n            this.modifySoundOptions(value);\n        },\n\n        chooseBounceDockIcon(e) {\n            let value = e.target.value;\n            this.set('bounceDockIcon', value);\n        },\n\n        browseForSound() {\n            return this.get('application.hostedContext')\n                .requestDesktopPromise({\n                    cmd: 'browseForSound'\n                })\n                .then(val => {\n                    this.modifySoundOptions(val.newCustomLabel);\n                });\n        },\n\n        playSoundSample() {\n            this.get('application.hostedContext').requestDesktopPromise({\n                cmd: 'playSound',\n                soundName: this.soundName\n            });\n        },\n\n        sendTestNotification() {\n            this.chat.sendTestNotification();\n        },\n\n        changeProfileNotificationSetting() {\n            this.toggleProperty('disableProfileNotifications');\n            this.webrtcSettings.updateSetting(\n                'directorySettings.disableProfileNotifications',\n                this.disableProfileNotifications\n            );\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"2WcYqioP\",\"block\":\"[[[10,0],[14,0,\\\"settings-preference\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"settings-header-text\\\"],[12],[1,[28,[35,0],[\\\"chat.roster.settings.notifications\\\"],null]],[13],[1,\\\"\\\\n    \\\"],[10,\\\"gux-form-field-checkbox\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"input\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,1,[29,[[36,1],\\\"-enable-notifications\\\"]]],[14,3,\\\"enable-notifications\\\"],[15,\\\"checked\\\",[36,2]],[15,\\\"onchange\\\",[28,[37,3],[[30,0],\\\"toggleShowToast\\\"],null]],[14,4,\\\"checkbox\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[15,\\\"for\\\",[29,[[36,1],\\\"-enable-notifications\\\"]]],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,0],[\\\"preferences.notifications.enable\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,\\\"label\\\"],[15,0,[29,[\\\"sub-label \\\",[52,[51,[33,2]],\\\"hide\\\"]]]],[12],[1,[28,[35,0],[\\\"preferences.chat.desktopNotificationsWarning\\\"],null]],[13],[1,\\\"\\\\n    \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link btn-xs\\\"],[24,4,\\\"button\\\"],[4,[38,3],[[30,0],\\\"sendTestNotification\\\"],null],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,0],[\\\"preferences.notifications.testNotification\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"settings-preference\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"gux-form-field-checkbox\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"input\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,1,[29,[[36,1],\\\"-show-profile-notifications\\\"]]],[14,3,\\\"show-profile-notifications\\\"],[15,\\\"checked\\\",[28,[37,5],[[33,6]],null]],[15,\\\"onchange\\\",[28,[37,3],[[30,0],\\\"changeProfileNotificationSetting\\\"],null]],[14,4,\\\"checkbox\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[15,\\\"for\\\",[29,[[36,1],\\\"-show-profile-notifications\\\"]]],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,0],[\\\"preferences.notifications.showDeviceProfileNotifications\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[15,0,[29,[\\\"settings-preference \\\",[52,[51,[33,2]],\\\"hide\\\"]]]],[12],[1,\\\"\\\\n    \\\"],[10,\\\"gux-form-field-checkbox\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"input\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,1,[29,[[36,1],\\\"-show-group-notifications\\\"]]],[14,3,\\\"show-group-notifications\\\"],[15,\\\"checked\\\",[36,7]],[15,\\\"onchange\\\",[28,[37,3],[[30,0],\\\"toggleShowGroupNotifications\\\"],null]],[14,4,\\\"checkbox\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[15,\\\"for\\\",[29,[[36,1],\\\"-show-group-notifications\\\"]]],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,0],[\\\"preferences.chat.showGroupNotifications\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,\\\"label\\\"],[14,0,\\\"sub-label\\\"],[12],[1,[28,[35,0],[\\\"preferences.chat.showGroupNotificationHelpText\\\"],null]],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"settings-preference\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"gux-form-field-checkbox\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"input\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,1,[29,[[36,1],\\\"-play-sound\\\"]]],[14,3,\\\"play-sound\\\"],[15,\\\"checked\\\",[36,8]],[15,\\\"onchange\\\",[28,[37,3],[[30,0],\\\"togglePlaySound\\\"],null]],[14,4,\\\"checkbox\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[15,\\\"for\\\",[29,[[36,1],\\\"-play-sound\\\"]]],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,0],[\\\"preferences.notifications.playSound\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[15,0,[29,[\\\"settings-preference play-sound-preference-container \\\",[52,[33,10],\\\"hide\\\"]]]],[12],[1,\\\"\\\\n    \\\"],[10,\\\"gux-form-field-dropdown\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-dropdown\\\"],[15,\\\"onchange\\\",[28,[37,3],[[30,0],\\\"chooseSound\\\"],null]],[15,1,[29,[[36,1],\\\"-sound-dropdown\\\"]]],[15,2,[36,11]],[14,3,\\\"sound-dropdown\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-listbox\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,13],[[28,[37,13],[[33,14]],null]],null],null,[[[1,\\\"                    \\\"],[10,\\\"gux-option\\\"],[15,2,[30,1,[\\\"value\\\"]]],[12],[1,[30,1,[\\\"label\\\"]]],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[12],[1,[28,[35,0],[\\\"preferences.notifications.soundToPlay\\\"],null]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,\\\"button\\\"],[14,1,\\\"sound-play\\\"],[15,\\\"aria-label\\\",[28,[37,0],[\\\"preferences.sound.playSound\\\"],null]],[14,0,\\\"btn btn-link\\\"],[15,\\\"onclick\\\",[28,[37,3],[[30,0],\\\"playSoundSample\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"play-sound-icon\\\"],[14,\\\"icon-name\\\",\\\"control-play\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"placement\\\",\\\"right\\\"],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,[28,[35,0],[\\\"preferences.sound.playSound\\\"],null]],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,15],[[[1,\\\"        \\\"],[11,3],[24,6,\\\"#\\\"],[4,[38,3],[[30,0],\\\"browseForSound\\\"],null],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,0],[\\\"preferences.notifications.browseForSound\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[51,[33,16]],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"settings-preference\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-form-field-checkbox\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"input\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,1,[29,[[36,1],\\\"-show-enable-notifications-prompt\\\"]]],[14,3,\\\"show-enable-notifications-prompt\\\"],[15,\\\"checked\\\",[36,16]],[15,\\\"onchange\\\",[28,[37,3],[[30,0],\\\"toggleNotificationPrompt\\\"],null]],[14,4,\\\"checkbox\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[15,\\\"for\\\",[29,[[36,1],\\\"-show-enable-notifications-prompt\\\"]]],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,0],[\\\"preferences.notifications.prompt\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,17],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"settings-preference\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-form-field-dropdown\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-dropdown\\\"],[15,\\\"onchange\\\",[28,[37,3],[[30,0],\\\"chooseBounceDockIcon\\\"],null]],[15,1,[29,[[36,1],\\\"-bounce-dropdown\\\"]]],[15,2,[36,18]],[14,3,\\\"sound-dropdown\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-listbox\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,13],[[28,[37,13],[[33,19]],null]],null],null,[[[1,\\\"                        \\\"],[10,\\\"gux-option\\\"],[15,2,[30,2,[\\\"value\\\"]]],[12],[1,[30,2,[\\\"label\\\"]]],[13],[1,\\\"\\\\n\\\"]],[2]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[12],[1,[28,[35,0],[\\\"preferences.notifications.bounceDockIcon\\\"],null]],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,20],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"settings-preference\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-form-field-checkbox\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"input\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,1,[29,[[36,1],\\\"-flash-taskbar\\\"]]],[14,3,\\\"flash-taskbar\\\"],[15,\\\"checked\\\",[36,21]],[15,\\\"onchange\\\",[28,[37,3],[[30,0],\\\"toggleFlashTaskbar\\\"],null]],[14,4,\\\"checkbox\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[15,\\\"for\\\",[29,[[36,1],\\\"-flash-taskbar\\\"]]],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,0],[\\\"preferences.notifications.flashTaskbar\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"soundOption\\\",\\\"dockIconOption\\\"],false,[\\\"t\\\",\\\"elementId\\\",\\\"showToast\\\",\\\"action\\\",\\\"unless\\\",\\\"not\\\",\\\"disableProfileNotifications\\\",\\\"showGroupNotifications\\\",\\\"playSound\\\",\\\"if\\\",\\\"hideSoundSelector\\\",\\\"soundName\\\",\\\"each\\\",\\\"-track-array\\\",\\\"soundOptions\\\",\\\"shouldShowBrowseForSound\\\",\\\"notificationPrompt\\\",\\\"isMac\\\",\\\"bounceDockIcon\\\",\\\"bounceDockIconOptions\\\",\\\"isWindows\\\",\\\"flashTaskbar\\\"]]\",\"moduleName\":\"web-directory/components/preferences-notifications-desktop/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport { scheduleOnce } from '@ember/runloop';\nimport { reads } from '@ember/object/computed';\nimport Component from '@ember/component';\n\nfunction preferenceDefaults() {\n    return {\n        notify: false,\n        notificationPrompt: true,\n        showGroupNotifications: false\n    };\n}\n\nexport default Component.extend({\n    classNames: ['preferences-notifications'],\n\n    chat: service(),\n    application: service(),\n    preferences: service(),\n    permissions: service(),\n    settings: service(),\n    session: service(),\n    webrtcSettings: service(),\n\n    canViewChat: reads('permissions.canViewBusinessChat'),\n\n    disableProfileNotifications: reads('webrtcSettings.settings.directorySettings.disableProfileNotifications'),\n    showCheckBrowser: false,\n    hideSoundSelector: false,\n\n    loading: false,\n\n    actions: {\n        sendTestNotification() {\n            this.chat.sendTestNotification();\n        },\n\n        changeSetting(key) {\n            this.toggleProperty(key);\n            if (key === 'showGroupNotifications') {\n                return this.saveGroupNotifyChange();\n            } else {\n                return this.saveNotifyChange();\n            }\n        },\n\n        changeProfileNotificationSetting() {\n            this.toggleProperty('disableProfileNotifications');\n            this.webrtcSettings.updateSetting(\n                'directorySettings.disableProfileNotifications',\n                this.disableProfileNotifications\n            );\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n\n        this.set('loading', true);\n        this.loadPreferences().then(() => {\n            scheduleOnce('afterRender', () => {\n                this.set('loading', false);\n            });\n        });\n    },\n\n    loadPreferences() {\n        return this.preferences.getPreference('notifications.global').then((preferences = preferenceDefaults()) => {\n            this.setProperties(preferences);\n        });\n    },\n\n    saveNotifyChange() {\n        const preferences = this.preferences;\n        const permission = Notification.permission;\n        const notify = this.notify;\n        const notificationPreferences = this.getProperties(['notify', 'notificationPrompt', 'showGroupNotifications']);\n\n        if (notify && (permission === 'denied' || permission === 'default')) {\n            window.Notify.requestPermission();\n            this.set('showCheckBrowser', true);\n        } else {\n            this.set('showCheckBrowser', false);\n        }\n\n        return preferences.getPreference('notifications.global').then((prefs = {}) => {\n            prefs = Object.assign({}, prefs, notificationPreferences);\n            return preferences.setPreference('notifications.global', prefs);\n        });\n    },\n\n    saveGroupNotifyChange() {\n        if (!this.notify) {\n            this.set('showGroupNotifications', false);\n        }\n        const preferences = this.preferences;\n        return preferences.getPreference('notifications.global').then((prefs = {}) => {\n            prefs.showGroupNotifications = this.showGroupNotifications;\n            return preferences.setPreference('notifications.global', prefs);\n        });\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"avo2qdS4\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[10,2],[14,0,\\\"text-center\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,2],[\\\"common.loading\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"    \\\"],[1,[28,[35,3],null,[[\\\"headerKey\\\",\\\"labelKey\\\",\\\"subLabelKey\\\",\\\"type\\\",\\\"value\\\",\\\"extraClassNames\\\",\\\"setPreference\\\",\\\"subLabelAction\\\"],[\\\"preferences.notifications.header\\\",\\\"preferences.notifications.enable\\\",\\\"preferences.notifications.testNotification\\\",\\\"checkbox\\\",[33,4],\\\"enable-notification\\\",[28,[37,5],[[30,0],\\\"changeSetting\\\",\\\"notify\\\"],null],[28,[37,5],[[30,0],\\\"sendTestNotification\\\"],null]]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[33,6],[[[1,\\\"        \\\"],[1,[28,[35,3],null,[[\\\"headerKey\\\",\\\"labelKey\\\",\\\"type\\\",\\\"value\\\",\\\"extraClassNames\\\",\\\"allowCheckboxDisable\\\",\\\"setPreference\\\"],[\\\"preferences.email.header\\\",\\\"preferences.email.label\\\",\\\"checkbox\\\",[33,7],\\\"email-notifications\\\",true,[28,[37,5],[[30,0],\\\"changeEmailNotificationSetting\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n    \\\"],[10,0],[15,0,[29,[[52,[51,[33,9]],\\\"hidden\\\"],\\\" check-browser alert alert-warning\\\"]]],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,2],[\\\"preferences.notifications.checkBrowser\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,10],[[[1,\\\"        \\\"],[1,[28,[35,3],null,[[\\\"class\\\",\\\"labelKey\\\",\\\"subLabelKey\\\",\\\"type\\\",\\\"value\\\",\\\"extraClassNames\\\",\\\"setPreference\\\"],[[52,[51,[33,4]],\\\"hidden\\\"],\\\"preferences.chat.showGroupNotifications\\\",\\\"preferences.chat.showGroupNotificationHelpText\\\",\\\"checkbox\\\",[33,11],\\\"show-group-notifications\\\",[28,[37,5],[[30,0],\\\"changeSetting\\\",\\\"showGroupNotifications\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[51,[33,12]],[[[1,\\\"        \\\"],[1,[28,[35,3],null,[[\\\"labelKey\\\",\\\"type\\\",\\\"value\\\",\\\"extraClassNames\\\",\\\"setPreference\\\"],[\\\"preferences.notifications.prompt\\\",\\\"checkbox\\\",[33,13],\\\"show-prompt\\\",[28,[37,5],[[30,0],\\\"changeSetting\\\",\\\"notificationPrompt\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[1,[28,[35,3],null,[[\\\"labelKey\\\",\\\"type\\\",\\\"value\\\",\\\"extraClassNames\\\",\\\"setPreference\\\"],[\\\"preferences.notifications.showDeviceProfileNotifications\\\",\\\"checkbox\\\",[28,[37,14],[[33,15]],null],\\\"profile-notification\\\",[28,[37,5],[[30,0],\\\"changeProfileNotificationSetting\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]]]],[],false,[\\\"if\\\",\\\"loading\\\",\\\"t\\\",\\\"preference-setting\\\",\\\"notify\\\",\\\"action\\\",\\\"showEmailNotificationSetting\\\",\\\"sendEmailNotifications\\\",\\\"unless\\\",\\\"showCheckBrowser\\\",\\\"canViewChat\\\",\\\"showGroupNotifications\\\",\\\"notificationPrompt\\\",\\\"showNotificationPrompt\\\",\\\"not\\\",\\\"disableProfileNotifications\\\"]]\",\"moduleName\":\"web-directory/components/preferences-notifications/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport { reads } from '@ember/object/computed';\nimport Component from '@ember/component';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['video-preferences'],\n\n    webrtcSettings: service(),\n    session: service(),\n\n    settings: reads('webrtcSettings.settings'),\n\n    updateSettings() {\n        this.webrtcSettings.updateSettings(this.settings);\n    },\n\n    actions: {\n        toggleMic(ev) {\n            if (ev.key && ev.key !== 'Enter' && ev.key !== ' ') {\n                return;\n            }\n            this.toggleProperty('settings.voltSettings.startMicMuted');\n            this.updateSettings();\n            this.logger.info('Video join settings have changed: ', this.get('settings.voltSettings'));\n        },\n        toggleCamera(ev) {\n            if (ev.key && ev.key !== 'Enter' && ev.key !== ' ') {\n                return;\n            }\n            this.toggleProperty('settings.voltSettings.startCameraMuted');\n            this.updateSettings();\n            this.logger.info('Video join settings have changed: ', this.get('settings.voltSettings'));\n        },\n\n        togglePrejoin(ev) {\n            if (ev.key && ev.key !== 'Enter' && ev.key !== ' ') {\n                return;\n            }\n            this.toggleProperty('settings.voltSettings.skipPrejoin');\n            this.updateSettings();\n            this.logger.info('Video join settings have changed: ', this.get('settings.voltSettings'));\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"OqUaFQ/L\",\"block\":\"[[[10,0],[12],[1,\\\"\\\\n    \\\"],[10,\\\"h4\\\"],[12],[1,[28,[35,0],[\\\"preferences.video.header\\\"],null]],[13],[1,\\\"\\\\n    \\\"],[10,\\\"gux-toggle\\\"],[14,1,\\\"video-pref-mic\\\"],[15,\\\"onclick\\\",[28,[37,1],[[30,0],\\\"toggleMic\\\"],null]],[15,\\\"onkeydown\\\",[28,[37,1],[[30,0],\\\"toggleMic\\\"],null]],[15,\\\"checked\\\",[33,2,[\\\"voltSettings\\\",\\\"startMicMuted\\\"]]],[15,\\\"checked-label\\\",[28,[37,0],[\\\"preferences.video.startMicMutedOn\\\"],null]],[15,\\\"unchecked-label\\\",[28,[37,0],[\\\"preferences.video.startMicMutedOff\\\"],null]],[14,\\\"label-position\\\",\\\"right\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[10,\\\"gux-toggle\\\"],[14,1,\\\"video-pref-camera\\\"],[15,\\\"onclick\\\",[28,[37,1],[[30,0],\\\"toggleCamera\\\"],null]],[15,\\\"onkeydown\\\",[28,[37,1],[[30,0],\\\"toggleCamera\\\"],null]],[15,\\\"checked\\\",[33,2,[\\\"voltSettings\\\",\\\"startCameraMuted\\\"]]],[15,\\\"checked-label\\\",[28,[37,0],[\\\"preferences.video.startCameraMutedOn\\\"],null]],[15,\\\"unchecked-label\\\",[28,[37,0],[\\\"preferences.video.startCameraMutedOff\\\"],null]],[14,\\\"label-position\\\",\\\"right\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[10,\\\"gux-toggle\\\"],[14,1,\\\"video-pref-prejoin\\\"],[15,\\\"onclick\\\",[28,[37,1],[[30,0],\\\"togglePrejoin\\\"],null]],[15,\\\"onkeydown\\\",[28,[37,1],[[30,0],\\\"togglePrejoin\\\"],null]],[15,\\\"checked\\\",[33,2,[\\\"voltSettings\\\",\\\"skipPrejoin\\\"]]],[15,\\\"checked-label\\\",[28,[37,0],[\\\"preferences.video.skipPrejoinOn\\\"],null]],[15,\\\"unchecked-label\\\",[28,[37,0],[\\\"preferences.video.skipPrejoinOff\\\"],null]],[14,\\\"label-position\\\",\\\"right\\\"],[12],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"t\\\",\\\"action\\\",\\\"settings\\\"]]\",\"moduleName\":\"web-directory/components/preferences-video/template.hbs\",\"isStrictMode\":false});","import { run } from '@ember/runloop';\nimport Component from '@ember/component';\nimport $ from 'jquery';\nimport layout from './template';\n\nconst UP_KEYCODE = 38;\nconst DOWN_KEYCODE = 40;\nconst ESC_KEYCODE = 27;\nconst SPACE_KEYCODE = 32;\nconst ENTER_KEYCODE = 13;\nconst TAB_KEYCODE = 9;\n\nconst getParent = $this => {\n    var selector = $this.attr('data-target');\n    if (!selector) {\n        selector = $this.attr('href');\n        selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, ''); // strip for ie7\n    }\n    var $parent = selector && $(selector);\n    return $parent && $parent.length ? $parent : $this.parent();\n};\n\nexport default Component.extend({\n    classNames: ['dropdown-menu-view'],\n    classNameBindings: ['requireMediaHelper:disabled'],\n\n    /**\n     * @Attribute\n     *\n     * Attribute that can be optionally passed in to determine if media helper\n     * is required and thus if certain elements should be disabled\n     */\n    requireMediaHelper: false,\n    layout: layout,\n    showMenu: false,\n\n    actions: {\n        toggleMenu(event) {\n            if (this.requireMediaHelper) {\n                event.preventDefault();\n                return;\n            }\n\n            this.toggleProperty('showMenu');\n        }\n    },\n\n    didInsertElement() {\n        const id = this.elementId;\n        $(window).on(`click.${id}`, event => {\n            run(() => {\n                const target = $(event.target);\n                const parents = target.parents('.dropdown-menu-view');\n                const targetOutside = !parents.length || id !== parents.attr('id');\n                const targetInput = target.parent('.input').length;\n                const listItem = target.prop('tagName') === 'LI' || target.prop('tagName') === 'A';\n                if (targetOutside || targetInput || listItem) {\n                    this.set('showMenu', false);\n                }\n            });\n        });\n        $('#' + id).on(`keydown.${id}`, event => {\n            run(() => {\n                var regxp = new RegExp(`${ESC_KEYCODE}|${SPACE_KEYCODE}|${ENTER_KEYCODE}`);\n                if (!regxp.test(event.which)) {\n                    return;\n                }\n\n                event.stopPropagation();\n                event.preventDefault();\n\n                var $this = $(event.target).closest('.dropdown-menu-view');\n\n                if ($this.is('.disabled, :disabled')) {\n                    return;\n                }\n                var $parent = getParent($this);\n                var isActive = this.showMenu;\n\n                if ((!isActive && event.which !== ESC_KEYCODE) || (isActive && event.which === ESC_KEYCODE)) {\n                    if (event.which === ESC_KEYCODE) {\n                        $parent.find('.btn-toggle').trigger('focus');\n                        return this.set('showMenu', false);\n                    }\n                    return this.set('showMenu', true);\n                }\n                var desc = ' li > *';\n                var $items = $parent.find('.dropdown-menu' + desc);\n\n                if (!$items.length) {\n                    return;\n                }\n\n                var index = $items.index(event.target);\n\n                if (isActive && (event.which === ENTER_KEYCODE || event.which === SPACE_KEYCODE)) {\n                    setTimeout(() => {\n                        $items.eq(index).trigger('click');\n                    });\n                    $parent.find('.btn-toggle').trigger('focus');\n                }\n            });\n        });\n        $(`#${id}`).on(`keydown.${id}`, event => {\n            run(() => {\n                // Only react to directional changes in the list\n                if (![TAB_KEYCODE, UP_KEYCODE, DOWN_KEYCODE].includes(event.which)) {\n                    return;\n                }\n\n                var $this = $(event.target).closest('.dropdown-menu-view');\n\n                if ($this.is('.disabled, :disabled')) {\n                    return;\n                }\n                var $parent = getParent($this);\n                var isActive = this.showMenu;\n\n                var $items = $parent.find('.dropdown-menu li > *');\n\n                if (!$items.length || !isActive) {\n                    return;\n                }\n\n                let index = $items.index(event.target);\n                const firstIndex = 0;\n                const lastIndex = $items.length - 1;\n\n                // If the the dropdown menu is not already focused - don't focus trap it\n                if (index === -1) {\n                    return;\n                }\n\n                event.stopPropagation();\n                event.preventDefault();\n\n                if (event.which === UP_KEYCODE || (event.which === TAB_KEYCODE && event.shiftKey)) {\n                    if (index === firstIndex) {\n                        index = lastIndex;\n                    } else {\n                        index--;\n                    }\n                }\n\n                if (event.which === DOWN_KEYCODE || (event.which === TAB_KEYCODE && !event.shiftKey)) {\n                    if (index === lastIndex) {\n                        index = firstIndex;\n                    } else {\n                        index++;\n                    }\n                }\n\n                $items.eq(index).trigger('focus');\n            });\n        });\n    },\n\n    willDestroyElement() {\n        $(window).off(`.${this.elementId}`);\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"dfFnDjSy\",\"block\":\"[[[11,\\\"button\\\"],[24,0,\\\"btn btn-toggle profile-dropdown-toggle\\\"],[24,4,\\\"button\\\"],[4,[38,0],[[30,0],[28,[37,0],[[30,0],\\\"toggleMenu\\\"],null]],[[\\\"bubbles\\\"],[false]]],[12],[1,\\\"\\\\n    \\\"],[10,0],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"svg-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/mixer\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[1,[34,1]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,3],[[[1,\\\"        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"chevron-small-up\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"chevron-small-down\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[13],[1,\\\"\\\\n\\\\n\\\"],[10,\\\"ul\\\"],[15,0,[29,[\\\"dropdown-menu list-unstyled \\\",[52,[33,3],\\\"show\\\"]]]],[12],[1,\\\"\\\\n    \\\"],[18,1,null],[1,\\\"\\\\n\\\"],[13]],[\\\"&default\\\"],false,[\\\"action\\\",\\\"title\\\",\\\"if\\\",\\\"showMenu\\\",\\\"yield\\\"]]\",\"moduleName\":\"web-directory/components/profile-dropdown-menu/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport { reads, or, not } from '@ember/object/computed';\nimport Component from '@ember/component';\nimport { observer, computed, get } from '@ember/object';\nimport { later, cancel } from '@ember/runloop';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport layout from './template';\nimport uuid from 'web-directory/utils/uuid';\nimport AutoSaveDevicesMixin from 'web-directory/mixins/webrtc-service/auto-save-devices';\n\nexport default Component.extend(LoggerMixin, AutoSaveDevicesMixin, {\n    layout: layout,\n    classNameBindings: [':profile-selection-v2'],\n\n    deviceProfilesV2: service(),\n    webrtcSdkService: service('webrtcSdk'),\n    webrtcSettings: service(),\n    settings: service(),\n    intl: service(),\n    phone: service(),\n    application: service(),\n    streaming: service(),\n    session: service(),\n\n    profileCopy: {},\n    showEditPart: false,\n\n    alertingLeaderEnabled: computed(\n        'session.features.CHAT-3526_enableAlertingLeaderPublicApi',\n        'streaming.alertingLeader.voice.configured',\n        function () {\n            return (\n                this.get('session.features.CHAT-3526_enableAlertingLeaderPublicApi') &&\n                this.get('streaming.alertingLeader.voice.configured')\n            );\n        }\n    ),\n    alertingLeaderStatus: computed('streaming.alertingLeader.voice.alerting', function () {\n        if (this.get('streaming.alertingLeader.voice.alerting')) {\n            return { status: 'Primary', accent: 'success' };\n        } else {\n            return { status: 'Standby', accent: 'warning' };\n        }\n    }),\n    showAlertingLeaderButton: computed('streaming.alertingLeader.voice.alerting', function () {\n        return !this.get('streaming.alertingLeader.voice.alerting');\n    }),\n    _handleAlertingLeaderChange: observer('streaming.alertingLeader.voice.alerting', function () {\n        this.set('settingAlertingLeader', false);\n    }),\n\n    audio: true,\n    isReadOnly: false,\n    video: true,\n    troubleshoot: true,\n    outputDevice: true,\n    tempProfileId: null,\n    previousHeadsetState: '',\n\n    profiles: reads('deviceProfilesV2.profiles'),\n    selectedProfileId: reads('deviceProfilesV2.selectedProfileId'),\n    defaultProfileId: reads('webrtcSettings.settings.directorySettings.defaultProfileId'),\n    isDefaultProfile: computed('defaultProfileId', 'profileCopy', function () {\n        return this.get('profileCopy.id') === this.defaultProfileId;\n    }),\n    mediaState: reads('deviceProfilesV2.mediaState'),\n    cameras: reads('mediaState.videoDevices'),\n    microphones: reads('mediaState.audioDevices'),\n    outputDevices: reads('mediaState.outputDevices'),\n    requireMediaHelper: computed('phone.station.webRtcRequireMediaHelper', 'application.mediaHelperMode', function () {\n        return this.get('phone.station.webRtcRequireMediaHelper') && !this.get('application.mediaHelperMode');\n    }),\n    disableDeviceVolumes: computed('requireMediaHelper', 'hasDevices', function () {\n        return this.requireMediaHelper && !this.hasDevices;\n    }),\n\n    alternativeClientInUse: computed('webrtcSdkService.headsetState', function () {\n        return this.get('webrtcSdkService.headsetState') === 'alternativeClient';\n    }),\n\n    negotiatingCallControls: computed('webrtcSdkService.headsetState', function () {\n        return this.get('webrtcSdkService.headsetState') === 'negotiating';\n    }),\n\n    headsetConnectionStatus: computed(\n        'webrtcSdkService.headsetState',\n        'showAlertingLeaderButton',\n        'alertingLeaderEnabled',\n        function () {\n            if (this.alertingLeaderEnabled && this.showAlertingLeaderButton) {\n                return false;\n            }\n\n            const headsetState = this.get('webrtcSdkService.headsetState');\n            switch (headsetState) {\n                case 'running':\n                case 'checking':\n                case 'notRunning':\n                    return this.intl.t(`deviceProfiles.headsets.connectionStatus.${headsetState}`);\n                case 'alternativeClient':\n                case 'negotiating':\n                    if (this.alertingLeaderEnabled) {\n                        if (headsetState === 'negotiating' && this.previousHeadsetState) {\n                            return this.intl.t(`deviceProfiles.headsets.connectionStatus.${this.previousHeadsetState}`);\n                        }\n                        return false;\n                    }\n                    return this.intl.t(`deviceProfiles.headsets.orchestrationStatus.${headsetState}`);\n                default:\n                    return false;\n            }\n        }\n    ),\n\n    preservePreviousHeadsetState: observer('webrtcSdkService.headsetState', function () {\n        const headsetState = this.get('webrtcSdkService.headsetState');\n        if (['running', 'checking', 'notRunning'].includes(headsetState)) {\n            this.set('previousHeadsetState', headsetState);\n        }\n    }),\n\n    showHeadsetStatus: computed('headsetConnectionStatus', 'useSdk', function () {\n        return this.useSdk && this.headsetConnectionStatus;\n    }),\n\n    showHeadsetOrchestration: computed('webrtcSdkService.headsetState', 'alertingLeaderEnabled', function () {\n        return (\n            ['alternativeClient', 'negotiating'].includes(this.get('webrtcSdkService.headsetState')) &&\n            !this.alertingLeaderEnabled\n        );\n    }),\n\n    showRetry: computed('webrtcSdkService.headsetState', 'previousHeadsetState', function () {\n        return this.get('webrtcSdkService.headsetState') === 'notRunning' || this.previousHeadsetState === 'notRunning';\n    }),\n\n    selectedProfile: computed('deviceProfilesV2.selectedProfileId', function () {\n        return this.profiles.find(p => p.id === this.selectedProfileId);\n    }),\n\n    selectedProfileName: computed('selectedProfile', function () {\n        const profile = this.selectedProfile;\n        if (profile) {\n            return get(profile, 'name');\n        }\n\n        return this.intl.t('deviceProfiles.useComputerSettings');\n    }),\n\n    canEditProfile: or('selectedProfileId'),\n\n    defaultConfig: computed('mediaState', function () {\n        /* Browsers don't have the same standardization for identifying system defaults or even naming devices. Chrome uses 'default' as the deviceId but Firefox has no real identifier. If we don't find a match for 'default' deviceId, just grab the first device in the array. */\n        return {\n            camera: this.get('mediaState.videoDevices')[0],\n            microphone:\n                this.get('mediaState.audioDevices').find(d => d.deviceId === 'default') ||\n                this.get('mediaState.audioDevices')[0],\n            outputDevice:\n                this.get('mediaState.outputDevices').find(d => d.deviceId === 'default') ||\n                this.get('mediaState.outputDevices')[0],\n            notificationDevice:\n                this.get('mediaState.outputDevices').find(d => d.deviceId === 'default') ||\n                this.get('mediaState.outputDevices')[0],\n            validWithoutCamera: true\n        };\n    }),\n\n    hasDevices: reads('mediaState.devices.length'),\n    hasCamera: reads('mediaState.hasCameraPermissions'),\n    hasMic: reads('mediaState.hasMicPermissions'),\n    useSdk: reads('webrtcSdkService.useSdk'),\n\n    showTroubleshoot: computed('troubleshoot', function () {\n        return this.troubleshoot && typeof this.attrs.openTroubleshoot === 'function';\n    }),\n\n    displayingTroubleshooter: false,\n\n    nameInputError: not('profileCopy.name'),\n\n    init() {\n        this._super(...arguments);\n        this.deviceProfilesV2.on('showProfileSelection', () => this.send('createNewProfile'));\n\n        if (this.video) {\n            this.webrtcSdkService.ensureVideoPermissions();\n        }\n    },\n\n    _onShowEditPartChanged: observer('showEditPart', function () {\n        this._focusTimer = later(this, function () {\n            if (this.get('showEditPart')) {\n                this.$('input:first').focus();\n            } else {\n                this.$('button:first').focus();\n            }\n        });\n    }),\n\n    _setFocus() {\n        this._focusTimer = later(this, function () {\n            if (this.get('showEditPart')) {\n                this.$('input:first').focus();\n            } else {\n                this.$('button:first').focus();\n            }\n        });\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        cancel(this._focusTimer);\n    },\n\n    setDefaultProfile() {\n        const defaultProfileId = this.get('tempProfile.default') ? this.get('tempProfile.id') : '';\n        if (!defaultProfileId && !this.isDefaultProfile) {\n            return;\n        }\n        this.webrtcSettings.updateSetting('directorySettings.defaultProfileId', defaultProfileId);\n    },\n\n    actions: {\n        openTroubleshoot(event) {\n            if (this.requireMediaHelper) {\n                event.preventDefault();\n                return;\n            }\n\n            if (typeof this.attrs.openTroubleshoot === 'function') {\n                this.toggleProperty('displayingTroubleshooter');\n                this.attrs.openTroubleshoot();\n            }\n        },\n\n        showEditProfile(event) {\n            if (this.requireMediaHelper) {\n                event.preventDefault();\n                return;\n            }\n\n            const selectedProfile = this.get('deviceProfilesV2.profiles').find(p => p.id === this.selectedProfileId);\n            this.set('profileCopy', Object.assign({}, selectedProfile));\n            this.set('showEditPart', true);\n            this._setFocus();\n        },\n\n        cancelProfileEdit() {\n            this.set('showEditPart', false);\n            this._setFocus();\n        },\n\n        async saveProfileEdit() {\n            if (this.nameInputError) {\n                return;\n            }\n\n            await this.deviceProfilesV2.saveAndSelectProfile(this.profileCopy);\n            this.notifyPropertyChange('selectedProfile');\n            this.setDefaultProfile();\n            this.set('showEditPart', false);\n            this._setFocus();\n        },\n\n        useComputerSettings() {\n            this.deviceProfilesV2.setProfile('');\n        },\n\n        createNewProfile() {\n            const deviceConfig = this.defaultConfig;\n            const recentlyAddedDevices = this.get('deviceProfilesV2.recentlyConnectedDevices');\n\n            if (recentlyAddedDevices) {\n                if (recentlyAddedDevices.camera) {\n                    deviceConfig.camera = recentlyAddedDevices.camera;\n                }\n                if (recentlyAddedDevices.microphone) {\n                    deviceConfig.microphone = recentlyAddedDevices.microphone;\n                }\n                if (recentlyAddedDevices.outputDevice) {\n                    deviceConfig.outputDevice = recentlyAddedDevices.outputDevice;\n                    deviceConfig.notificationDevice = recentlyAddedDevices.outputDevice;\n                }\n                this.deviceProfilesV2.clearRecentlyConnectedDevices();\n            }\n\n            this.set('profileCopy', Object.assign({ id: uuid.generate() }, deviceConfig));\n            this.set('showEditPart', true);\n            this._setFocus();\n        },\n\n        deleteProfile(profileId) {\n            this.deviceProfilesV2.deleteProfile(profileId);\n        },\n\n        changeProfile(profile) {\n            if (!profile.canBeSelected) {\n                return;\n            }\n\n            this.deviceProfilesV2.setProfile(profile.id);\n\n            this._focusTimer = later(this, function () {\n                this.$('button:first').focus();\n            });\n        },\n\n        changeCamera(event) {\n            this.set(\n                'profileCopy.camera',\n                this.cameras.find(d => d.deviceId === event.target.value)\n            );\n        },\n\n        changeMicrophone(event) {\n            this.set(\n                'profileCopy.microphone',\n                this.microphones.find(d => d.deviceId === event.target.value)\n            );\n        },\n\n        changeOutputDevice(event) {\n            this.set(\n                'profileCopy.outputDevice',\n                this.outputDevices.find(d => d.deviceId === event.target.value)\n            );\n\n            this.set(\n                'profileCopy.notificationDevice',\n                this.outputDevices.find(d => d.deviceId === event.target.value)\n            );\n        },\n\n        changeNotificationDevice(event) {\n            this.set(\n                'profileCopy.notificationDevice',\n                this.outputDevices.find(d => d.deviceId === event.target.value)\n            );\n        },\n\n        openSoundPreferences(event) {\n            if (this.disableDeviceVolumes) {\n                event.preventDefault();\n                return;\n            }\n\n            this.settings.openSoundPreference();\n        },\n\n        retryConnection() {\n            this.get('webrtcSdkService.sdk.headset').retryConnection(this.get('selectedProfile.microphone.label'));\n        },\n\n        setUseHeadsets() {\n            this.webrtcSdkService.setUseHeadsets();\n        },\n\n        setAlertingLeader() {\n            this.set('settingAlertingLeader', true);\n            this.get('streaming.streamingClientInstance.alertingLeader').claimAlertingLeader();\n        },\n\n        changeTempProfile(event) {\n            this.set('tempProfile', { id: this.get('profileCopy.id'), default: event.target.checked });\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"ZVkpMaPx\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"device-selection\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,2],[[[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"svg-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/mixer\\\"],[15,\\\"screenreader-text\\\",[28,[37,3],[\\\"deviceProfiles.profileNameLabel\\\"],null]],[12],[13],[1,\\\"\\\\n            \\\"],[1,[28,[35,4],null,[[\\\"placeholder\\\",\\\"value\\\",\\\"id\\\",\\\"class\\\"],[[28,[37,3],[\\\"deviceProfiles.profileNameLabel\\\"],null],[33,5,[\\\"name\\\"]],\\\"profile-name-intput\\\",[28,[37,6],[\\\"form-control\\\",\\\" \\\",[52,[33,7],\\\"profile-name-error\\\"]],null]]]]],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"default-profile-wrapper\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"input\\\"],[14,3,\\\"default-profile-checkbox\\\"],[14,1,\\\"default-profile-checkbox\\\"],[15,\\\"checked\\\",[36,8]],[15,\\\"onchange\\\",[28,[37,9],[[30,0],\\\"changeTempProfile\\\"],[[\\\"on\\\"],[\\\"change\\\"]]]],[14,4,\\\"checkbox\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"default-profile-checkbox\\\"],[14,1,\\\"default-profile-label\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,3],[\\\"deviceProfiles.defaultProfile\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,10],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"entry-row\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"entry-label\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"label\\\"],[15,\\\"for\\\",[29,[[28,[37,6],[[33,11],\\\"-camera-select\\\"],null]]]],[12],[1,\\\"\\\\n                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/video\\\"],[15,\\\"title\\\",[29,[[28,[37,3],[\\\"deviceProfiles.cameraSelect\\\"],null]]]],[15,\\\"screenreader-text\\\",[28,[37,3],[\\\"deviceProfiles.videoSource\\\"],null]],[12],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"entry-values\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,12],[[[1,\\\"                            \\\"],[10,\\\"select\\\"],[15,1,[29,[[28,[37,6],[[33,11],\\\"-camera-select\\\"],null]]]],[15,\\\"onchange\\\",[28,[37,9],[[30,0],\\\"changeCamera\\\"],[[\\\"on\\\"],[\\\"change\\\"]]]],[14,0,\\\"form-control camera-select\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,14],[[28,[37,14],[[33,15]],null]],null],null,[[[1,\\\"                                    \\\"],[10,\\\"option\\\"],[15,2,[29,[[30,1,[\\\"deviceId\\\"]]]]],[15,\\\"selected\\\",[52,[28,[37,16],[[33,5,[\\\"camera\\\",\\\"deviceId\\\"]],[30,1,[\\\"deviceId\\\"]]],null],\\\"selected\\\"]],[12],[1,\\\"\\\\n                                        \\\"],[1,[30,1,[\\\"label\\\"]]],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[10,1],[12],[1,[28,[35,3],[\\\"deviceProfiles.noCameraDetected\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"profile-camera-option\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,4],null,[[\\\"type\\\",\\\"name\\\",\\\"checked\\\",\\\"id\\\"],[\\\"checkbox\\\",\\\"validWithoutCamera\\\",[33,5,[\\\"validWithoutCamera\\\"]],\\\"valid-without-camera\\\"]]]],[1,\\\"\\\\n                    \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"valid-without-camera\\\"],[12],[1,[28,[35,3],[\\\"deviceProfiles.profileValidWithoutCamera\\\"],null]],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,17],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"entry-row\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"entry-label\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"label\\\"],[15,\\\"for\\\",[29,[[28,[37,6],[[33,11],\\\"-microphone-select\\\"],null]]]],[12],[1,\\\"\\\\n                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/mic\\\"],[15,\\\"title\\\",[29,[[28,[37,3],[\\\"deviceProfiles.microphoneSelect\\\"],null]]]],[15,\\\"screenreader-text\\\",[28,[37,3],[\\\"deviceProfiles.audioSource\\\"],null]],[12],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"entry-values\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,18,[\\\"hasMic\\\"]],[[[1,\\\"                            \\\"],[10,\\\"select\\\"],[15,1,[29,[[28,[37,6],[[33,11],\\\"-microphone-select\\\"],null]]]],[15,\\\"onchange\\\",[28,[37,9],[[30,0],\\\"changeMicrophone\\\"],[[\\\"on\\\"],[\\\"change\\\"]]]],[14,0,\\\"form-control microphone-select\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,14],[[28,[37,14],[[33,19]],null]],null],null,[[[1,\\\"                                    \\\"],[10,\\\"option\\\"],[15,2,[29,[[30,2,[\\\"deviceId\\\"]]]]],[15,\\\"selected\\\",[52,[28,[37,16],[[33,5,[\\\"microphone\\\",\\\"deviceId\\\"]],[30,2,[\\\"deviceId\\\"]]],null],\\\"selected\\\"]],[12],[1,\\\"\\\\n                                        \\\"],[1,[30,2,[\\\"displayLabel\\\"]]],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n\\\"]],[2]],null],[1,\\\"                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                            \\\"],[10,1],[12],[1,[28,[35,3],[\\\"deviceProfiles.noMicrophoneDetected\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[10,0],[14,0,\\\"entry-row\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"entry-label audio-selection\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"label\\\"],[15,\\\"for\\\",[29,[[28,[37,6],[[33,11],\\\"-outputDevice-select\\\"],null]]]],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/volume-up\\\"],[15,\\\"title\\\",[29,[[28,[37,3],[\\\"deviceProfiles.outputSelect\\\"],null]]]],[15,\\\"screenreader-text\\\",[28,[37,3],[\\\"deviceProfiles.audioDestination\\\"],null]],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"entry-values\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,18,[\\\"hasOutputDeviceSupport\\\"]],[[[1,\\\"                        \\\"],[10,\\\"select\\\"],[15,1,[29,[[28,[37,6],[[33,11],\\\"-speakers-select\\\"],null]]]],[15,\\\"onchange\\\",[28,[37,9],[[30,0],\\\"changeOutputDevice\\\"],[[\\\"on\\\"],[\\\"change\\\"]]]],[14,0,\\\"form-control speakers-select\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,14],[[28,[37,14],[[33,20]],null]],null],null,[[[1,\\\"                                \\\"],[10,\\\"option\\\"],[15,2,[29,[[30,3,[\\\"deviceId\\\"]]]]],[15,\\\"selected\\\",[52,[28,[37,16],[[33,5,[\\\"outputDevice\\\",\\\"deviceId\\\"]],[30,3,[\\\"deviceId\\\"]]],null],\\\"selected\\\"]],[12],[1,\\\"\\\\n                                    \\\"],[1,[30,3,[\\\"displayLabel\\\"]]],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n\\\"]],[3]],null],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,1],[14,0,\\\"system-default-message\\\"],[12],[1,[28,[35,3],[\\\"deviceProfiles.outputDeviceSystemDefault\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"entry-row\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"entry-label audio-selection\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"label\\\"],[15,\\\"for\\\",[29,[[28,[37,6],[[33,11],\\\"-outputDevice-select\\\"],null]]]],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"svg-dropdown-icon\\\"],[14,\\\"icon-name\\\",\\\"bell\\\"],[15,\\\"screenreader-text\\\",[28,[37,3],[\\\"deviceProfiles.notificationSelect\\\"],null]],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"entry-values\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,20,[\\\"length\\\"]],[[[1,\\\"                        \\\"],[10,\\\"select\\\"],[15,1,[29,[[28,[37,6],[[33,11],\\\"-notification-select\\\"],null]]]],[15,\\\"onchange\\\",[28,[37,9],[[30,0],\\\"changeNotificationDevice\\\"],[[\\\"on\\\"],[\\\"change\\\"]]]],[14,0,\\\"form-control speakers-select\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,14],[[28,[37,14],[[33,20]],null]],null],null,[[[1,\\\"                                \\\"],[10,\\\"option\\\"],[15,2,[29,[[30,4,[\\\"deviceId\\\"]]]]],[15,\\\"selected\\\",[52,[28,[37,16],[[33,5,[\\\"notificationDevice\\\",\\\"deviceId\\\"]],[30,4,[\\\"deviceId\\\"]]],null],\\\"selected\\\"]],[12],[1,\\\"\\\\n                                    \\\"],[1,[30,4,[\\\"displayLabel\\\"]]],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n\\\"]],[4]],null],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[10,1],[14,0,\\\"system-default-message\\\"],[12],[1,[28,[35,3],[\\\"deviceProfiles.outputDeviceSystemDefault\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"edit-profile-buttons\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[12],[1,\\\"\\\\n                    \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-primary\\\"],[16,\\\"title\\\",[29,[[28,[37,3],[\\\"deviceProfiles.saveLabel\\\"],null]]]],[16,\\\"disabled\\\",[36,7]],[24,1,\\\"save-profile\\\"],[24,4,\\\"button\\\"],[4,[38,9],[[30,0],\\\"saveProfileEdit\\\"],null],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,3],[\\\"deviceProfiles.saveLabel\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link\\\"],[16,\\\"title\\\",[29,[[28,[37,3],[\\\"deviceProfiles.cancelLabel\\\"],null]]]],[24,4,\\\"button\\\"],[4,[38,9],[[30,0],\\\"cancelProfileEdit\\\"],null],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,3],[\\\"deviceProfiles.cancelLabel\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"browser-settings-message\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,3],[\\\"deviceProfiles.browserMediaSettings\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,21],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"entry-row profile-selector\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"entry-label\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"label\\\"],[15,\\\"for\\\",[29,[[28,[37,6],[[33,11],\\\"-profile-select\\\"],null]]]],[15,\\\"aria-label\\\",[28,[37,3],[\\\"deviceProfiles.profiles\\\"],null]],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"entry-values\\\"],[12],[1,\\\"\\\\n\\\"],[6,[39,22],null,[[\\\"title\\\",\\\"requireMediaHelper\\\",\\\"id\\\"],[[33,23],[33,24],[28,[37,6],[[33,11],\\\"-profile-select1\\\"],null]]],[[\\\"default\\\"],[[[[42,[28,[37,14],[[28,[37,14],[[33,25]],null]],null],null,[[[1,\\\"                        \\\"],[10,\\\"li\\\"],[15,0,[29,[\\\"profile-option \\\",[52,[51,[30,5,[\\\"canBeSelected\\\"]]],\\\"disabled\\\"]]]],[12],[1,\\\"\\\\n                            \\\"],[11,3],[24,\\\"role\\\",\\\"menuitem\\\"],[24,\\\"tabindex\\\",\\\"0\\\"],[24,6,\\\"javascript:void(0)\\\"],[4,[38,9],[[30,0],\\\"changeProfile\\\",[30,5]],null],[12],[1,\\\"\\\\n                                \\\"],[1,[30,5,[\\\"name\\\"]]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"],[41,[51,[33,27]],[[[1,\\\"                                \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-delete\\\"],[16,\\\"title\\\",[29,[[28,[37,3],[\\\"deviceProfiles.removeProfile\\\"],null]]]],[16,\\\"aria-label\\\",[28,[37,3],[\\\"deviceProfiles.removeProfile\\\"],null]],[24,4,\\\"button\\\"],[4,[38,9],[[30,0],\\\"deleteProfile\\\",[30,5,[\\\"id\\\"]]],[[\\\"bubbles\\\"],[false]]],[12],[1,\\\"\\\\n                                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/close-circle\\\"],[15,\\\"screenreader-text\\\",[28,[37,3],[\\\"deviceProfiles.removeProfile\\\"],null]],[12],[13],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n\\\"]],[5]],null],[1,\\\"                    \\\"],[10,\\\"li\\\"],[14,0,\\\"profile-option\\\"],[12],[1,\\\"\\\\n                        \\\"],[11,3],[24,\\\"role\\\",\\\"menuitem\\\"],[24,\\\"tabindex\\\",\\\"0\\\"],[24,6,\\\"javascript:void(0)\\\"],[4,[38,9],[[30,0],\\\"useComputerSettings\\\"],null],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,3],[\\\"deviceProfiles.useComputerSettings\\\"],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"],[41,[51,[33,27]],[[[1,\\\"                        \\\"],[10,\\\"li\\\"],[14,0,\\\"divider\\\"],[12],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"li\\\"],[14,0,\\\"profile-option\\\"],[12],[1,\\\"\\\\n                            \\\"],[11,3],[24,\\\"role\\\",\\\"menuitem\\\"],[24,\\\"tabindex\\\",\\\"0\\\"],[24,6,\\\"javascript:void(0)\\\"],[4,[38,9],[[30,0],\\\"createNewProfile\\\"],null],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,3],[\\\"deviceProfiles.newProfile\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"],[41,[51,[33,27]],[[[41,[33,28],[[[1,\\\"                    \\\"],[10,0],[15,0,[29,[\\\"entry-action \\\",[52,[33,24],\\\"disabled\\\"]]]],[12],[1,\\\"\\\\n                        \\\"],[11,\\\"button\\\"],[24,1,\\\"edit-profile-btn\\\"],[16,\\\"aria-disabled\\\",[36,24]],[16,\\\"aria-label\\\",[28,[37,3],[\\\"deviceProfiles.editProfile\\\"],null]],[16,\\\"title\\\",[29,[[28,[37,3],[\\\"deviceProfiles.editProfile\\\"],null]]]],[24,0,\\\"btn btn-edit\\\"],[24,4,\\\"button\\\"],[4,[38,9],[[30,0],\\\"showEditProfile\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                            \\\"],[10,\\\"i\\\"],[14,0,\\\"pc pc-pencil\\\"],[12],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null],[41,[33,24],[[[1,\\\"                \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[28,[37,6],[[33,11],\\\"-profile-select1\\\"],null]]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,3],[\\\"deviceProfiles.requireMediaHelper\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"mic-permission-missing\\\"],[12],[1,[28,[35,3],[\\\"purecloud.station.micPermissionMissing\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]]]],[]]],[41,[33,29],[[[41,[33,30],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"status-info\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"alternative-client\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[34,31]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"take-call-control-wrapper\\\"],[12],[1,\\\"\\\\n            \\\"],[11,\\\"button\\\"],[24,0,\\\"take-call-control-button\\\"],[16,\\\"aria-disabled\\\",[36,32]],[16,\\\"disabled\\\",[36,32]],[24,4,\\\"button\\\"],[4,[38,9],[[30,0],\\\"setUseHeadsets\\\"],null],[12],[1,\\\"\\\\n\\\"],[41,[33,33],[[[1,\\\"                    \\\"],[1,[28,[35,3],[\\\"deviceProfiles.headsets.orchestrationStatus.takeCallControlsButton\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"spinner-wrapper\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,0],[14,0,\\\"spinner\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"status-info\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"status-label\\\"],[12],[1,[28,[35,3],[\\\"deviceProfiles.headsets.label\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"status-value\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,34,[\\\"isConnecting\\\"]],[[[1,\\\"                    \\\"],[10,1],[14,0,\\\"headset-status-loading\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"status-text\\\"],[12],[1,[34,31]],[13],[1,\\\"\\\\n\\\"],[41,[33,35],[[[1,\\\"                    \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link pc pc-reload\\\"],[16,1,[29,[[36,11],\\\"-retry-btn\\\"]]],[24,4,\\\"button\\\"],[4,[38,9],[[30,0],\\\"retryConnection\\\"],null],[12],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,11],\\\"-retry-btn\\\"]]],[14,\\\"placement\\\",\\\"bottom\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,3],[\\\"deviceProfiles.headsets.retryTooltip\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[]],null],[41,[33,36],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"call-controls-subheader\\\"],[12],[1,[28,[35,3],[\\\"deviceProfiles.alertingLeader.header\\\"],null]],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"status-info\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-status-indicator-beta\\\"],[15,\\\"accent\\\",[33,37,[\\\"accent\\\"]]],[12],[1,\\\"\\\\n            \\\"],[10,1],[12],[1,[28,[35,3],[\\\"deviceProfiles.alertingLeader.status\\\"],[[\\\"status\\\"],[[33,37,[\\\"status\\\"]]]]]],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,38],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"set-alerting-priority-wrapper\\\"],[12],[1,\\\"\\\\n                \\\"],[11,\\\"button\\\"],[24,0,\\\"set-alerting-priority-button\\\"],[16,\\\"aria-disabled\\\",[36,39]],[16,\\\"disabled\\\",[36,39]],[24,4,\\\"button\\\"],[4,[38,9],[[30,0],\\\"setAlertingLeader\\\"],null],[12],[1,\\\"\\\\n\\\"],[41,[33,39],[[[1,\\\"                        \\\"],[10,\\\"gux-radial-loading\\\"],[14,\\\"context\\\",\\\"input\\\"],[14,\\\"screenreader-text\\\",\\\"Loading...\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[1,[28,[35,3],[\\\"deviceProfiles.alertingLeader.makePrimaryButton\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[10,0],[14,0,\\\"call-controls-subheader\\\"],[12],[1,[28,[35,3],[\\\"followMe.additionalActions\\\"],null]],[13],[1,\\\"\\\\n\\\"],[41,[33,40],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"entry-row troubleshoot\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"profile-footer-links\\\"],[12],[1,\\\"\\\\n            \\\"],[10,1],[15,0,[29,[[52,[33,41],\\\"disabled\\\"]]]],[12],[1,\\\"\\\\n                \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link volume-link\\\"],[16,1,[29,[[36,11],\\\"-volume-btn\\\"]]],[16,\\\"aria-disabled\\\",[36,41]],[24,4,\\\"button\\\"],[4,[38,9],[[30,0],\\\"openSoundPreferences\\\"],null],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,3],[\\\"deviceProfiles.deviceVolumes\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,41],[[[1,\\\"                    \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,11],\\\"-volume-btn\\\"]]],[14,\\\"placement\\\",\\\"bottom\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,3],[\\\"deviceProfiles.requireMediaHelper\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,1],[15,0,[29,[[52,[33,24],\\\"disabled\\\"]]]],[12],[1,\\\"\\\\n                \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link troubleshoot-link\\\"],[16,1,[29,[[36,11],\\\"-troubleshoot-btn\\\"]]],[16,\\\"aria-disabled\\\",[36,24]],[24,4,\\\"button\\\"],[4,[38,9],[[30,0],\\\"openTroubleshoot\\\"],null],[12],[1,\\\"\\\\n\\\"],[41,[33,42],[[[1,\\\"                        \\\"],[1,[28,[35,3],[\\\"deviceProfiles.endTroubleshoot\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[1,[28,[35,3],[\\\"deviceProfiles.troubleshoot\\\"],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,24],[[[1,\\\"                    \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,11],\\\"-troubleshoot-btn\\\"]]],[14,\\\"placement\\\",\\\"bottom\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,3],[\\\"deviceProfiles.requireMediaHelper\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"camera\\\",\\\"microphone\\\",\\\"outputDevice\\\",\\\"outputDevice\\\",\\\"profile\\\"],false,[\\\"if\\\",\\\"showEditPart\\\",\\\"hasDevices\\\",\\\"t\\\",\\\"input\\\",\\\"profileCopy\\\",\\\"concat\\\",\\\"nameInputError\\\",\\\"isDefaultProfile\\\",\\\"action\\\",\\\"video\\\",\\\"elementId\\\",\\\"hasCamera\\\",\\\"each\\\",\\\"-track-array\\\",\\\"cameras\\\",\\\"eq\\\",\\\"audio\\\",\\\"mediaState\\\",\\\"microphones\\\",\\\"outputDevices\\\",\\\"hasMic\\\",\\\"profile-dropdown-menu\\\",\\\"selectedProfileName\\\",\\\"requireMediaHelper\\\",\\\"profiles\\\",\\\"unless\\\",\\\"isReadOnly\\\",\\\"canEditProfile\\\",\\\"showHeadsetStatus\\\",\\\"showHeadsetOrchestration\\\",\\\"headsetConnectionStatus\\\",\\\"negotiatingCallControls\\\",\\\"alternativeClientInUse\\\",\\\"selectedVendor\\\",\\\"showRetry\\\",\\\"alertingLeaderEnabled\\\",\\\"alertingLeaderStatus\\\",\\\"showAlertingLeaderButton\\\",\\\"settingAlertingLeader\\\",\\\"showTroubleshoot\\\",\\\"disableDeviceVolumes\\\",\\\"displayingTroubleshooter\\\"]]\",\"moduleName\":\"web-directory/components/profile-selection-v2/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { htmlSafe } from '@ember/template';\nimport layout from './template';\n\nexport default Component.extend({\n    // config\n    layout,\n    classNames: ['progress-underlay-container'],\n\n    init() {\n        this._super(...arguments);\n        this._width = 0;\n    },\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n        const newWidth = String(this.width);\n        const oldWidth = String(this._width);\n        if (oldWidth !== newWidth) {\n            this.updateWidth(newWidth);\n            this.set('_width', newWidth);\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        const width = this._width;\n        this.updateWidth(width);\n    },\n\n    updateWidth(percentageWidth) {\n        const $underlay = this.$('.progress-underlay');\n\n        if ($underlay) {\n            percentageWidth = Number(percentageWidth);\n            const isFiniteNumber = !isNaN(percentageWidth) && isFinite(percentageWidth);\n            const isPositivePercentage = isFiniteNumber && this.inRange(percentageWidth, 0, 101);\n\n            let updatedWidth;\n            if (isPositivePercentage) {\n                updatedWidth = `${percentageWidth}%`;\n            } else {\n                updatedWidth = '0%';\n            }\n\n            $underlay.width(htmlSafe(updatedWidth));\n        }\n    },\n\n    inRange(num, init, final) {\n        if (final === undefined) {\n            final = init;\n            init = 0;\n        }\n\n        return num >= Math.min(init, final) && num < Math.max(init, final);\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"N8x9JaFb\",\"block\":\"[[[18,1,null],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"progress-underlay\\\"],[12],[13],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"duration-underlay\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[\\\"&default\\\"],false,[\\\"yield\\\"]]\",\"moduleName\":\"web-directory/components/progress-underlay/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport { computed } from '@ember/object';\nimport Component from '@ember/component';\n\nimport { PUBLIC_ENVS } from '../../utils/net';\n\nexport default Component.extend({\n    classNames: ['panel', 'region-chooser'],\n\n    /**\n     * Region chooser component for desktop app region selection.\n     * Handles locale-based default region, region listing, and region submission.\n     * Consolidates logic formerly split between the region-chooser controller and component.\n     */\n    intl: service(),\n    application: service(),\n\n    /**\n     * @attribute\n     * The currently selected desktop region ID\n     */\n    desktopRegionId: null,\n\n    init() {\n        this._super(...arguments);\n\n        if (!this.desktopRegionId) {\n            this._setDefaultRegion();\n        }\n    },\n\n    /**\n     * Sets the default region based on the user's system locale.\n     */\n    _setDefaultRegion() {\n        let defaultDesktopRegionId = 'global';\n\n        const locale = this.get('intl.systemLocale') || '';\n        if (locale.includes('au')) {\n            defaultDesktopRegionId = 'au';\n        } else if (locale.includes('ja') || locale.includes('zh')) {\n            defaultDesktopRegionId = 'jp';\n        }\n\n        const matchingEnv = PUBLIC_ENVS.find(env => env.desktopId === defaultDesktopRegionId);\n        this.set('desktopRegionId', matchingEnv ? defaultDesktopRegionId : PUBLIC_ENVS[0].desktopId);\n    },\n\n    regions: computed('intl.locale', 'intl.loaded', function () {\n        const intlService = this.intl;\n        const isTranslatable = key => intlService.get('loaded') && intlService.exists(key);\n\n        // Attempt to translate and sort the regions\n        return PUBLIC_ENVS.map(({ id, desktopId, translationKey, envStatus }) => ({\n            desktopId,\n            label: `${isTranslatable(translationKey) ? intlService.t(translationKey) : id}${\n                envStatus === 'beta' ? intlService.t('components.region.betaSuffix') : ''\n            }`\n        })).sort((env1, env2) => env1.label.localeCompare(env2.label));\n    }),\n\n    actions: {\n        setRegionId(e) {\n            const regionId = e.target.value;\n            this.set('desktopRegionId', regionId);\n        },\n\n        chooseRegion() {\n            const context = this.get('application.hostedContext');\n            if (context.isHosted()) {\n                context.sendRegionToDesktop(this.desktopRegionId);\n            }\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"U2EE/Zp5\",\"block\":\"[[[10,\\\"label\\\"],[14,\\\"for\\\",\\\"region-chooser-dropdown\\\"],[12],[1,\\\"\\\\n    \\\"],[1,[28,[35,0],[\\\"components.region.choose\\\"],null]],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[14,0,\\\"extra\\\"],[12],[1,\\\"\\\\n    \\\"],[1,[28,[35,0],[\\\"components.region.extraNote\\\"],null]],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,\\\"gux-dropdown\\\"],[14,1,\\\"region-chooser-dropdown\\\"],[14,\\\"classNames\\\",\\\"form-control\\\"],[15,2,[36,1]],[15,\\\"onchange\\\",[28,[37,2],[[30,0],\\\"setRegionId\\\"],null]],[12],[1,\\\"\\\\n    \\\"],[10,\\\"gux-listbox\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,4],[[28,[37,4],[[33,5]],null]],null],null,[[[1,\\\"            \\\"],[10,\\\"gux-option\\\"],[15,2,[30,1,[\\\"desktopId\\\"]]],[15,\\\"selected\\\",[52,[28,[37,7],[[30,1,[\\\"desktopId\\\"]],[33,1]],null],\\\"true\\\"]],[12],[1,\\\"\\\\n                \\\"],[1,[30,1,[\\\"label\\\"]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"submit\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"gux-button\\\"],[14,\\\"accent\\\",\\\"primary\\\"],[15,\\\"onclick\\\",[28,[37,2],[[30,0],\\\"chooseRegion\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,0],[\\\"common.choose\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[\\\"region\\\"],false,[\\\"t\\\",\\\"desktopRegionId\\\",\\\"action\\\",\\\"each\\\",\\\"-track-array\\\",\\\"regions\\\",\\\"if\\\",\\\"eq\\\"]]\",\"moduleName\":\"web-directory/components/region-chooser/template.hbs\",\"isStrictMode\":false});","import { on } from '@ember/object/evented';\nimport { observer } from '@ember/object';\nimport Component from '@ember/component';\n\nexport default Component.extend({\n    classNameBindings: [':resizable-content', 'minimized:minimized:maximized'],\n\n    isMouseDown: false,\n    minimized: true,\n\n    minHeight: 0,\n    maxHeight: null,\n    actions: {\n        toggleSize() {\n            this.toggleProperty('minimized');\n        }\n    },\n\n    attachCurrentHeight: on('didInsertElement', function () {\n        this.element.style.minHeight = this.minHeight;\n    }),\n\n    minimizedChanged: observer('minimized', function () {\n        if (this.minimized) {\n            this.element.style.minHeight = this.minHeight;\n        } else {\n            let maxHeight = this.maxHeight;\n            if (!maxHeight) {\n                maxHeight = 'calc(100% - 8px)';\n                this.set('maxHeight', maxHeight);\n            }\n            this.element.style.minHeight = maxHeight;\n        }\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"jCK3OCj2\",\"block\":\"[[[18,1,null],[1,\\\"\\\\n\\\\n\\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"resize-handle btn btn-purecloud\\\"],[4,[38,1],[[30,0],\\\"toggleSize\\\"],null],[12],[1,\\\"\\\\n\\\"],[41,[33,3],[[[1,\\\"        \\\"],[10,1],[14,0,\\\"sr-only\\\"],[12],[1,[28,[35,4],[\\\"common.expand\\\"],null]],[13],[1,\\\"\\\\n        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"arrow-solid-down\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"arrow-solid-down\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"arrow-solid-down\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[10,1],[14,0,\\\"sr-only\\\"],[12],[1,[28,[35,4],[\\\"common.collapse\\\"],null]],[13],[1,\\\"\\\\n        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"arrow-solid-up\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"arrow-solid-up\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"arrow-solid-up\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[13]],[\\\"&default\\\"],false,[\\\"yield\\\",\\\"action\\\",\\\"if\\\",\\\"minimized\\\",\\\"t\\\"]]\",\"moduleName\":\"web-directory/components/resizable-content/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport Component from '@ember/component';\nimport { run } from '@ember/runloop';\nimport { computed, get } from '@ember/object';\nimport Clipboard from 'clipboard';\n\nexport default Component.extend({\n    classNames: ['resource-center-search-v2'],\n\n    search: service(),\n    intl: service(),\n    logger: service('stash-logger'),\n\n    searchQuery: null,\n    searchResults: null,\n    shareBtn: null,\n    embedResults: false,\n\n    hasSearched: computed('searchResults', function () {\n        return this.searchResults !== null;\n    }),\n\n    embedConfig: computed('selectedHelpPage', function () {\n        if (this.selectedHelpPage) {\n            return {\n                id: 'help-panel-embed-feedback',\n                url: `${this.selectedHelpPage}?theme=simplified`,\n                title: 'components.embeddedAppTitles.helpFeedback',\n                sandbox: ['allow-same-origin', 'allow-scripts', 'allow-popups'],\n                permissionsPolicy: ['clipboard-write']\n            };\n        }\n        return null;\n    }),\n\n    _searchHelp() {\n        const query = this.searchQuery;\n        if (!query) {\n            return;\n        }\n\n        this.set('selectedHelpPage', null);\n\n        const data = {\n            pageNumber: 1,\n            pageSize: 10,\n            query: [\n                {\n                    type: 'SIMPLE',\n                    value: query,\n                    fields: ['title', 'content']\n                }\n            ],\n            types: [\n                'resource_articles',\n                'resource_pages',\n                'resource_faqs',\n                'resource_glossary',\n                'resource_partners',\n                'resource_releasenotes',\n                'resource_videos'\n            ],\n            returnFields: ['ALL_FIELDS']\n        };\n        return this.search\n            .searchDocumentation(data)\n            .then(data => {\n                const results = data.results;\n                const models = this.search.modelResults(results);\n                this.set('searchResults', models);\n            })\n            .catch(err => {\n                this.set('searchResults', []);\n                this.logger.error('Help Search Error:', { error: err });\n            });\n    },\n\n    _setUpShareBtn() {\n        let shareBtn;\n        let getShareURL = () => {\n            return run(() => {\n                if (this.selectedHelpPage) {\n                    return this.selectedHelpPage;\n                }\n                return '';\n            });\n        };\n\n        shareBtn = new Clipboard('.share-help', { text: getShareURL });\n        shareBtn.on('success', () => {\n            const message = this.intl.safestring('notification.help.copyUrlSimple').toString();\n            run(() => this.notification.info(null, message));\n        });\n\n        this.set('shareBtn', shareBtn);\n    },\n\n    actions: {\n        searchHelp() {\n            this._timers.push(run.debounce(this, this._searchHelp, 500));\n        },\n        loadHelpResult(model) {\n            this.set('selectedHelpPage', get(model, 'link'));\n        },\n        backToResults() {\n            this.set('selectedHelpPage', null);\n        },\n        clearInput() {\n            this.set('searchQuery', null);\n            this.set('searchResults', null);\n        },\n        contact() {\n            this.attrs.contact();\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.set('_timers', []);\n        if (this.embedResults) {\n            this._setUpShareBtn();\n        }\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this._timers.forEach(item => run.cancel(item));\n        if (this.shareBtn) {\n            this.shareBtn.destroy();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"wMjT0Y2o\",\"block\":\"[[[10,0],[14,0,\\\"search-help-header\\\"],[12],[1,\\\"\\\\n\\\\n\\\"],[41,[51,[33,1]],[[[1,\\\"        \\\"],[10,\\\"h2\\\"],[15,\\\"for\\\",[29,[[36,2],\\\"-help-search\\\"]]],[12],[1,[28,[35,3],[\\\"help.feedbackHelp\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"search-help-input\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,4],null,[[\\\"type\\\",\\\"id\\\",\\\"class\\\",\\\"value\\\",\\\"placeholder\\\",\\\"key-press\\\"],[\\\"text\\\",[28,[37,5],[[33,2],\\\"-help-search\\\"],null],\\\"form-control\\\",[33,6],[28,[37,3],[\\\"help.search\\\"],null],[28,[37,7],[[30,0],\\\"searchHelp\\\"],null]]]]],[1,\\\"\\\\n\\\\n        \\\"],[10,1],[15,0,[29,[\\\"search-icon \\\",[52,[33,6],\\\"hidden\\\"]]]],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"svg-icon\\\"],[14,\\\"icon-name\\\",\\\"search\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[11,\\\"button\\\"],[16,0,[29,[\\\"clear-search-icon \\\",[52,[33,6],\\\"\\\",\\\"hidden\\\"]]]],[16,\\\"aria-label\\\",[28,[37,3],[\\\"common.clear\\\"],null]],[24,4,\\\"button\\\"],[4,[38,7],[[30,0],\\\"clearInput\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"svg-icon\\\"],[14,\\\"icon-name\\\",\\\"close-circle\\\"],[15,\\\"screenreader-text\\\",[28,[37,3],[\\\"common.clear\\\"],null]],[12],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,9],[[33,10],[33,1]],null],[[[1,\\\"        \\\"],[11,3],[24,0,\\\"btn btn-link back-results\\\"],[24,6,\\\"#\\\"],[4,[38,7],[[30,0],\\\"backToResults\\\"],null],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/arrow-left\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,[28,[35,3],[\\\"help.searchBack\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,3],[14,0,\\\"btn btn-link pop-out\\\"],[15,6,[29,[[36,10]]]],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"window-drag-out\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,[28,[35,3],[\\\"common.popout\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,1],[[[1,\\\"        \\\"],[10,\\\"button\\\"],[15,0,[29,[\\\"btn btn-link share-help \\\",[52,[51,[33,10]],\\\"hidden\\\"]]]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"custom/share-regular\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,[28,[35,3],[\\\"common.share\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,9],[[33,1],[33,10],[33,11]],null],[[[1,\\\"    \\\"],[1,[28,[35,12],null,[[\\\"appConfig\\\"],[[33,11]]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,13],[[[1,\\\"    \\\"],[10,\\\"ul\\\"],[14,0,\\\"help-search-results\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,15],[[28,[37,15],[[33,16]],null]],null],null,[[[1,\\\"            \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,1],[[[1,\\\"                    \\\"],[11,3],[24,6,\\\"#\\\"],[4,[38,7],[[30,0],\\\"loadHelpResult\\\",[30,1]],null],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"help-type\\\"],[15,\\\"icon-name\\\",[28,[37,17],[[30,1,[\\\"type\\\"]]],null]],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,[28,[35,18],[[30,1,[\\\"title\\\"]]],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,3],[15,6,[29,[[30,1,[\\\"link\\\"]]]]],[14,\\\"target\\\",\\\"_blank\\\"],[14,\\\"rel\\\",\\\"noopener noreferrer\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"help-type\\\"],[15,\\\"icon-name\\\",[28,[37,17],[[30,1,[\\\"type\\\"]]],null]],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,[28,[35,18],[[30,1,[\\\"title\\\"]]],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"no-search-results\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"svg-icon\\\"],[14,\\\"icon-name\\\",\\\"search\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[1,[28,[35,3],[\\\"search.noResultsLonger\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]],[1,\\\"\\\\n\\\"],[41,[28,[37,9],[[28,[37,19],[[33,1]],null],[33,13]],null],[[[1,\\\"    \\\"],[10,2],[14,0,\\\"more-help-option\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,3],[\\\"help.moreHelp\\\"],null]],[1,\\\"\\\\n        \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"btn btn-flat btn-lg contact\\\"],[4,[38,7],[[30,0],\\\"contact\\\"],null],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,3],[\\\"help.contact\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"result\\\"],false,[\\\"unless\\\",\\\"embedResults\\\",\\\"elementId\\\",\\\"t\\\",\\\"input\\\",\\\"concat\\\",\\\"searchQuery\\\",\\\"action\\\",\\\"if\\\",\\\"and\\\",\\\"selectedHelpPage\\\",\\\"embedConfig\\\",\\\"app-embed\\\",\\\"hasSearched\\\",\\\"each\\\",\\\"-track-array\\\",\\\"searchResults\\\",\\\"help-article-icon\\\",\\\"html-safe\\\",\\\"not\\\"]]\",\"moduleName\":\"web-directory/components/resource-center-search-v2/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { Maybe } from 'web-directory/types';\nimport { RovingTabIndex } from 'web-directory/utils/roving-tabindex';\n\n/**\n * RovingTabIndexList component provides keyboard navigation for lists in popovers.\n *\n * This component wraps a list and manages roving tabindex behavior, allowing users\n * to navigate through list items using arrow keys.\n *\n * @example\n * {{#roving-tabindex-list\n *   type=\"vertical\"\n *   loop=true\n *   containerClass=\"my-list\"\n *   role=\"listbox\"\n * }}\n *   {{#each items as |item|}}\n *     <li role=\"option\" tabindex=\"0\">\n *       {{item.name}}\n *     </li>\n *   {{/each}}\n * {{/roving-tabindex-list}}\n */\nexport default Component.extend({\n    classNameBindings: ['containerClass'] as const,\n\n    attributeBindings: ['role', 'ariaLabelledby:aria-labelledby', 'tabindex'] as const,\n\n    /**\n     * Tag name for the container element (e.g., 'ul', 'ol', 'div')\n     */\n    tagName: 'ul' as const,\n\n    /**\n     * @attribute\n     * CSS class name(s) to apply to the container element\n     */\n    containerClass: '',\n\n    /**\n     * @attribute\n     * ARIA role for the container element (e.g., 'listbox', 'menu', 'radiogroup')\n     */\n    role: 'listbox',\n\n    /**\n     * @attribute\n     * ARIA label for the container\n     */\n    ariaLabelledby: undefined as Maybe<string>,\n\n    /**\n     * @attribute\n     * Navigation type: 'horizontal', 'vertical', or 'both'\n     */\n    type: 'vertical' as 'horizontal' | 'vertical' | 'both',\n\n    /**\n     * @attribute\n     * Whether to loop navigation (wrap around at ends)\n     */\n    loop: true,\n\n    /**\n     * @attribute\n     * Whether roving tabindex is enabled\n     */\n    enabled: true,\n\n    /**\n     * @attribute\n     * Whether to manage tabindex values (roving behavior)\n     */\n    roving: true,\n\n    /**\n     * @attribute\n     * tabindex attribute\n     */\n    tabindex: '-1',\n\n    /**\n     * RovingTabIndex instance\n     */\n    _rovingTabIndex: null as Maybe<RovingTabIndex>,\n\n    didInsertElement() {\n        this._super(...arguments);\n        this._initializeRovingTabIndex();\n    },\n\n    willDestroyElement() {\n        this._cleanupRovingTabIndex();\n        this._super(...arguments);\n    },\n\n    /**\n     * Initialize the RovingTabIndex instance\n     */\n    _initializeRovingTabIndex() {\n        const existingInstance = this.get('_rovingTabIndex');\n        if (existingInstance) {\n            existingInstance.refresh();\n            return;\n        }\n\n        const container = this.element as HTMLElement;\n        if (!container) return;\n\n        const rovingTabIndex = new RovingTabIndex(container, {\n            type: this.get('type'),\n            loop: this.get('loop'),\n            enabled: this.get('enabled'),\n            roving: this.get('roving')\n        });\n\n        this.set('_rovingTabIndex', rovingTabIndex);\n    },\n\n    /**\n     * Clean up the RovingTabIndex instance\n     */\n    _cleanupRovingTabIndex() {\n        const rovingTabIndex = this.get('_rovingTabIndex');\n        if (rovingTabIndex) {\n            rovingTabIndex.destroy();\n            this.set('_rovingTabIndex', null);\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"HJjm4r83\",\"block\":\"[[[18,1,null]],[\\\"&default\\\"],false,[\\\"yield\\\"]]\",\"moduleName\":\"web-directory/components/roving-tabindex-list/template.hbs\",\"isStrictMode\":false});","import { inject } from '@ember/service';\nimport Component from '@ember/component';\n\n/**\n * A simple component for wrapping top-level route outlets\n *\n * This component provides a `simple-outlet-view`, current route, and other high-level\n * marker classes as well as basic style resets.  Further styling/customization is left to\n * external styling or the yielded content.\n */\nexport default Component.extend({\n    classNameBindings: [\n        ':simple-outlet-view',\n        'session.authInProgress:authenticating:',\n        'session.isAuthenticated:authenticated:unauthenticated',\n        'session.hasAppAccess:authorized:unauthorized',\n        'application.errorState:application-error',\n        'session.logoutInProgress:logging-out:',\n        'application.currentRouteClass'\n    ],\n\n    application: inject('application'),\n    session: inject('session')\n});\n","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { isValidEmailAddress } from 'web-directory/utils/email';\nimport { Maybe } from 'web-directory/types';\nimport { warnClosureAction } from 'web-directory/utils/acd';\nimport { inject } from '@ember/service';\n\nexport default Component.extend({\n    classNames: ['single-select-target-dropdown'],\n    classNameBindings: ['hideTargetDropdown:hide-target-dropdown', 'isSmall:single-select-target-dropdown--small'],\n\n    /**\n     * Logger service for console logs, warns, and errors that are intended to keep\n     */\n    logger: inject('stashLogger'),\n\n    /**\n     * `true` if the input should be autofocused once it has rendered in the dom\n     */\n    autofocus: false,\n\n    /**\n     * @attribute\n     *\n     * The currently authenticated user information\n     */\n    authUser: null,\n\n    /**\n     * @attribute\n     *\n     * the size of the input dropdown\n     */\n    size: 'medium' as 'medium' | 'small',\n\n    isSmall: computed('size', function () {\n        return this.get('size') === 'small';\n    }),\n\n    /**\n     * @attribute\n     *\n     * the type of interaction this is in context of\n     */\n    interactionType: null as Maybe<string>,\n\n    /**\n     * @attribute\n     *\n     * The placeholder text shown on the input. This value needs to be translated\n     * before passing into this component.\n     */\n    placeholder: null,\n\n    /**\n     * @attribute\n     *\n     * The clearTranslation is aria text shown on the input clear button.\n     * This value needs to be translated before passing into this component.\n     */\n    clearTranslation: null,\n\n    /**\n     * @attribute\n     *\n     * the filters to be included in this target selector\n     */\n    includeFilters: [] as string[],\n\n    /**\n     * @attribute\n     *\n     * the filters to be excluded in this target selector\n     */\n    excludeFilters: [] as string[],\n\n    /**\n     * @attribute\n     *\n     * UC conversation has participants\n     */\n    conversationHasActiveParticipants: false,\n\n    /**\n     * @attribute\n     *\n     * The currently selected value of the component. This value should be passed\n     * in and stored by the parent. We do not want to mutate this value from within the\n     * component itself.\n     */\n    value: null as Maybe<any>,\n\n    /**\n     * @attribute this value can be mutated within this component\n     *\n     * @example 2-way data binding\n     * searchValue=(mut searchValue)\n     *\n     * the value of the main input. if updated by parent, it will automatically up the input\n     * in the template and will search once input has been focused.\n     */\n    searchValue: '' as string,\n\n    /**\n     * `true` if the target dropdown is open\n     */\n    open: false,\n\n    /**\n     * this value is to know if the input that shouldn't allow enter behaviour\n     */\n    disableInputEnter: false,\n\n    /**\n     * @attribute\n     *\n     * `true` if the target dropdown logic should be supressed and the dropdown be hidden.\n     */\n    hideTargetDropdown: false,\n\n    /**\n     * A mock interaction object to set the type of for target selection context\n     */\n    mockInteraction: computed('interactionType', function () {\n        return {\n            type: this.get('interactionType')\n        };\n    }),\n\n    /**\n     * @attribute\n     * Allows user to transfer call to another user's voicemail\n     */\n    showDirectTransferToVoicemailDropdown: false,\n\n    /**\n     * Invoked when the element has been inserted into the DOM\n     */\n    didInsertElement() {\n        this._super(...arguments);\n        this.hideOnFocusOut();\n        if (!this.get('hideTargetDropdown')) {\n            this.hideOnClickOutside(this.element);\n        }\n\n        if (this.get('autofocus')) {\n            setTimeout(() => {\n                const input = this.getInput();\n                if (input) {\n                    input.focus();\n                }\n            }, 100);\n        }\n    },\n\n    /**\n     * Invoked when the component has been destroyed\n     */\n    willDestroyElement() {\n        this._super(...arguments);\n        document.removeEventListener('click', this.outsideClickListener);\n        this.element.removeEventListener('focusout', this.focusOutListener);\n    },\n\n    /**\n     * reference to the listener for when the element has been clicked outside of.\n     */\n    outsideClickListener: (event: any) => console.warn('The outside click listener has not been set', event),\n\n    /**\n     * reference to the listener for when the element has been focused outside of.\n     */\n    focusOutListener: (event: any) => console.warn('The outside focus listener has not been set', event),\n\n    /**\n     * Listeners to determine if the user has clicked outside of the element being\n     * passed through. If the element has been clicked outside of, then the dropdown\n     * will close.\n     *\n     * @param element the element to check against\n     */\n    hideOnClickOutside(element: Element) {\n        if (element) {\n            try {\n                this.outsideClickListener = (event: any) => {\n                    if (!element.contains(event.target)) {\n                        this.set('open', false);\n                    }\n                };\n                document.addEventListener('click', this.outsideClickListener);\n            } catch (error) {\n                console.error('There was an issue setting up the click handler', error);\n            }\n        }\n    },\n\n    hideOnFocusOut() {\n        try {\n            this.focusOutListener = (event: any) => {\n                const ignoredElements = [document.querySelector('.call-controls-panels')];\n                if (event.relatedTarget === null || ignoredElements.includes(event.relatedTarget)) {\n                    return;\n                }\n                if (!this.element.contains(event.relatedTarget)) {\n                    this.set('open', false);\n                }\n            };\n            this.element.addEventListener('focusout', this.focusOutListener);\n        } catch (error) {\n            this.get('logger').error('There was an issue setting up the focusout handler', { error });\n        }\n    },\n\n    /**\n     * Gets reference to the input. Due to the input reference changing when values\n     * are selected (because of #if helper), we should fetch it every time to make sure\n     * we have the most up to date one.\n     */\n    getInput(): HTMLInputElement | undefined {\n        const input = document.querySelector(`input#${this.elementId}`) as HTMLInputElement;\n        return input || undefined;\n    },\n\n    /**\n     * Resets the search facet of the component back to it's initial state.\n     */\n    resetSearch() {\n        const input = this.getInput();\n        if (input) {\n            input.value = '';\n        }\n        this.updateSearch('');\n    },\n\n    /**\n     * Updates the `searchValue` property and any other additional logic that may need\n     * to go along with that in one isolated place.\n     *\n     * @param value the value to update the search property with\n     */\n    updateSearch(value: string) {\n        this.set('searchValue', value);\n        this.set('open', !!value);\n    },\n\n    /**\n     * Clears the currently selected value in the component and refocuses on the input\n     * after a quick delay. We need to give the template a moment to render the input\n     * back before trying to focus back into it.\n     */\n    clearSelection() {\n        this.targetSelected(null);\n        setTimeout(() => {\n            const input = this.getInput();\n            if (input) {\n                input.focus();\n            }\n        }, 0);\n    },\n\n    /**\n     * Invoked when the user presses the enter key while focused in the input element.\n     * We check to see if the current search value is a valid value to be added as a raw\n     * tag.\n     */\n    onInputEnter() {\n        // if the input is a queue suppress enter behavior of the search bar\n        if (this.get('disableInputEnter')) return;\n\n        const searchValue = this.get('searchValue');\n        switch (this.get('interactionType')) {\n            case 'email':\n                if (isValidEmailAddress(searchValue)) {\n                    this.targetSelected({ email: searchValue });\n                    this.resetSearch();\n                }\n                break;\n            default:\n                if (searchValue.trim()) {\n                    this.targetSelected({ phoneNumber: searchValue });\n                    this.resetSearch();\n                }\n                break;\n        }\n    },\n\n    /**\n     * @attribute\n     * Method passed as a prop. If not passed, we warn.\n     * @param data\n     */\n    transferToVoicemailClick(data: any) {\n        warnClosureAction('transferToVoicemailClick', data);\n    },\n\n    /**\n     * @action passed from the parent\n     *\n     * Handles the selection of a target\n     *\n     * @param target the selected data corresponding to the target\n     */\n    targetSelected: (target: any) => warnClosureAction('targetSelected', target),\n\n    actions: {\n        /**\n         * Invoked when the user inputs data into the main input of the component.\n         *\n         * @param event the event data provided by the input\n         */\n        onInputChange(event: InputEvent) {\n            const { value } = event.target as any;\n            this.updateSearch(value);\n        },\n\n        /**\n         * Invoked whenever the user presses down a key on the main input of this component.\n         *\n         * @param event data corresponding to the keypress\n         */\n        onKeypress(event: KeyboardEvent) {\n            if (event.key === 'Enter') {\n                // prevents the first row of the target dropdown from selecting in this context\n                event.preventDefault();\n                this.onInputEnter();\n            }\n        },\n\n        /**\n         * Invoked when the user selects data from within the target selector component\n         *\n         * @param target the data that was selected\n         */\n        onTargetSelected(target: any) {\n            this.set('open', false);\n            this.targetSelected(target);\n            this.resetSearch();\n        },\n\n        onTransferToVoicemail(data: any) {\n            this.transferToVoicemailClick(data);\n        },\n\n        /**\n         * Clears the currently selected item and resets the input\n         */\n        onClearSelection() {\n            this.clearSelection();\n        },\n\n        /**\n         * Invoked when the user focused the input\n         */\n        onInputFocus() {\n            if (this.get('searchValue')) {\n                this.set('open', true);\n            }\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"/vAWvSQy\",\"block\":\"[[[41,[51,[33,1]],[[[1,\\\"    \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"search-icon\\\"],[14,\\\"icon-name\\\",\\\"search\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,3],[[[1,\\\"    \\\"],[10,0],[15,0,[29,[\\\"selected-target-value form-control \\\",[36,4]]]],[12],[1,\\\"\\\\n        \\\"],[10,2],[12],[1,\\\"\\\\n            \\\"],[1,[33,3,[\\\"name\\\"]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"button\\\"],[14,0,\\\"clear\\\"],[15,\\\"aria-label\\\",[52,[33,5],[33,5],[28,[37,6],[\\\"common.clearInput\\\"],null]]],[15,\\\"onclick\\\",[28,[37,7],[[30,0],\\\"onClearSelection\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"close\\\"],[15,\\\"screenreader-text\\\",[52,[33,5],[33,5],[28,[37,6],[\\\"common.clearInput\\\"],null]]],[12],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"    \\\"],[10,\\\"label\\\"],[15,\\\"for\\\",[30,0,[\\\"elementId\\\"]]],[14,0,\\\"sr-only\\\"],[12],[1,[34,8]],[13],[1,\\\"\\\\n    \\\"],[10,\\\"input\\\"],[15,1,[30,0,[\\\"elementId\\\"]]],[15,0,[29,[\\\"form-control purecloud-input target-input \\\",[36,4]]]],[15,2,[36,9]],[15,\\\"oninput\\\",[28,[37,7],[[30,0],\\\"onInputChange\\\"],null]],[15,\\\"onfocus\\\",[28,[37,7],[[30,0],\\\"onInputFocus\\\"],null]],[15,\\\"onkeypress\\\",[28,[37,7],[[30,0],\\\"onKeypress\\\"],null]],[15,\\\"placeholder\\\",[36,8]],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"\\\\n\\\"],[41,[28,[37,10],[[33,11],[28,[37,12],[[33,1]],null]],null],[[[1,\\\"    \\\"],[1,[28,[35,13],null,[[\\\"authUser\\\",\\\"interaction\\\",\\\"hideHeader\\\",\\\"searchValue\\\",\\\"excludeFilters\\\",\\\"includeFilters\\\",\\\"allowRawInputSelection\\\",\\\"actionSelected\\\",\\\"myQueuesOnly\\\",\\\"showDirectTransferToVoicemailDropdown\\\",\\\"conversationHasActiveParticipants\\\",\\\"transferToVoicemailClick\\\"],[[33,14],[33,15],true,[33,9],[33,16],[33,17],false,[28,[37,7],[[30,0],\\\"onTargetSelected\\\"],null],[33,18],[33,19],[33,20],[28,[37,7],[[30,0],\\\"onTransferToVoicemail\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]],null]],[],false,[\\\"unless\\\",\\\"hideTargetDropdown\\\",\\\"if\\\",\\\"value\\\",\\\"supplementalClasses\\\",\\\"clearTranslation\\\",\\\"t\\\",\\\"action\\\",\\\"placeholder\\\",\\\"searchValue\\\",\\\"and\\\",\\\"open\\\",\\\"not\\\",\\\"target-dropdown\\\",\\\"authUser\\\",\\\"mockInteraction\\\",\\\"excludeFilters\\\",\\\"includeFilters\\\",\\\"myQueuesOnly\\\",\\\"showDirectTransferToVoicemailDropdown\\\",\\\"conversationHasActiveParticipants\\\"]]\",\"moduleName\":\"web-directory/components/single-select-target-dropdown/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport { computed, get } from '@ember/object';\nimport Component from '@ember/component';\nimport EntityControllerMixin from '../../mixins/entity-controller';\n\nconst SkillGroupProfileComponent = Component.extend(EntityControllerMixin, {\n    classNames: ['skillgroup-profile', 'entity'],\n    classNameBindings: ['chatEnabled'],\n\n    alerting: service(),\n    notification: service(),\n    permissions: service(),\n    session: service(),\n\n    isShowingGeneralModal: false,\n    modalName: '',\n    modalDescription: '',\n    activeTab: 'members',\n    showDropdown: false,\n\n    canEditSkillGroup: computed(\n        'session.user.isTrustee',\n        'session.person.namedPermissions',\n        'permissions.canEditSkillGroups',\n        function () {\n            if (this.get('session.user.isTrustee')) {\n                return this.get('permissions.canEditSkillGroups');\n            }\n            const person = this.get('session.person');\n            const permissions = person.get('namedPermissions');\n            return (\n                permissions.includes('admin') ||\n                permissions.includes('group_administration') ||\n                this.get('permissions.canEditSkillGroups')\n            );\n        }\n    ),\n\n    membershipHeader: computed('model.memberCount', function () {\n        const count = this.get('model.memberCount');\n        return this.intl.t('groups.membershipWithCount', { count });\n    }),\n\n    actions: {\n        selectTab(tab) {\n            this.set('activeTab', tab);\n        },\n\n        editGeneralInfo() {\n            this.set('showDropdown', false);\n            this.set('modalName', this.get('model.name'));\n            this.set('modalDescription', this.get('model.description'));\n            this.set('isShowingGeneralModal', true);\n        },\n\n        updateGeneralField(fieldName, event) {\n            const value = get(event, 'target.value');\n            this.updateField(fieldName, value);\n        },\n\n        confirmGeneral() {\n            const notification = this.notification;\n            const group = this.model;\n            group.set('name', this.modalName);\n            group.set('description', this.modalDescription);\n            group\n                .save()\n                .then(data => {\n                    console.debug('SKILLGROUP-PROFILE: group saved', { data });\n                    this.reset();\n                    group.reload().then(() => {\n                        // profile isn't rerendered on a save here, so manually reload membership\n                        group.loadMembership();\n                    });\n\n                    const title = group.get('name');\n                    const message = this.intl.safestring('skillgroups.general.saved').toString();\n                    notification.info(title, message, {\n                        forceBrowserNotification: true,\n                        hideAfter: 5\n                    });\n                })\n                .catch(e => {\n                    console.error('skillgroup save failed', { error: e });\n                    const title = group.get('name');\n                    let message = this.intl.safestring('notification.group.saveError').toString();\n                    if (e.payload.message == `group named [${title}] already exists`) {\n                        message = this.intl.safestring('skillgroups.createError.duplicate').toString();\n                    }\n                    notification.error(title, message, {\n                        forceBrowserNotification: true\n                    });\n\n                    this.reset();\n                    group.reload().then(() => {\n                        group.rollbackAttributes();\n                    });\n                });\n        },\n\n        cancelGeneral() {\n            this.model.reload();\n            this.set('isShowingGeneralModal', false);\n        },\n\n        async deleteGroup() {\n            this.set('showDropdown', false);\n            const intl = this.get('intl');\n            const name = this.get('model.name');\n            const result = await this.get('alerting').pushModal({\n                title: intl.t('groups.admin.deleteHeader', { name }).toString(),\n                content: intl.safestring('skillgroups.deleteConfirmation').toString(),\n                size: 'medium',\n                buttons: {\n                    positive: { label: intl.safestring('common.confirm').toString(), id: 'confirm' },\n                    negative: { label: intl.safestring('common.cancel').toString(), id: 'cancel' }\n                }\n            });\n            if (result.type === 'buttonClicked' && result.buttonId === 'confirm') {\n                this.send('confirmDelete');\n            }\n        },\n\n        confirmDelete() {\n            const notification = this.notification;\n            const model = this.model;\n\n            model\n                .delete()\n                .then(() => {\n                    console.debug('SKILLGROUP-PROFILE: Deleted skillgroup: ', { model });\n                    const title = model.get('name');\n                    const message = this.intl.safestring('notification.group.deleting').toString();\n                    notification.info(title, message, {\n                        icon: '',\n                        hideAfter: 8\n                    });\n                    this.reset();\n                    window.history.back();\n                })\n                .catch(e => {\n                    console.error('SKILLGROUP-PROFILE: Error deleting skillgroup', {\n                        error: e\n                    });\n\n                    const title = model.get('name');\n                    const message = this.intl.safestring('notification.group.deleteError').toString();\n                    notification.error(title, message, {\n                        icon: ''\n                    });\n                    this.reset();\n                });\n        }\n    },\n\n    reset() {\n        this.set('isShowingGeneralModal', false);\n    }\n});\nexport default SkillGroupProfileComponent;\n","import { inject as service } from '@ember/service';\nimport { throttle } from '@ember/runloop';\nimport Component from '@ember/component';\nimport { computed } from '@ember/object';\n\nexport default Component.extend({\n    ajax: service(),\n    application: service(),\n    intl: service(),\n    logger: service('stash-logger'),\n    notification: service(),\n    panel: service('side-panel'),\n    permissions: service(),\n\n    searchQuery: '',\n\n    skillgroup: null,\n    currentDivisions: [],\n    selectedDivisions: {},\n\n    selectAll: false,\n\n    currentPage: 1,\n    pageSize: 25,\n    totalDivisions: 0,\n    divisions: [],\n\n    confirmText: computed('intl', function () {\n        return this.intl.t('common.confirm');\n    }),\n    cancelText: computed('intl', function () {\n        return this.intl.t('common.cancel');\n    }),\n    searchPlaceholder: computed('intl', function () {\n        return this.intl.t('groups.modal.search');\n    }),\n    canSelectAll: computed('permissions', function () {\n        this.permissions.validateDonutPermission('routing:skillgroups:add:*');\n    }),\n\n    didInsertElement() {\n        this.initListeners();\n        this.initCurrentDivisions();\n        this.getDivisions();\n        this.set('selectAll', this.get('skillgroup.memberDivisions').mapBy('id').indexOf('*') >= 0);\n        return this._super(...arguments);\n    },\n\n    willDestroyElement() {\n        this.$().off(`.${this.elementId}`);\n        return this._super(...arguments);\n    },\n\n    initListeners() {\n        this.$().on('guxpaginationchange', this.handlePaginationChange.bind(this));\n        this.$().on('guxselectionchanged', this.handleSelections.bind(this));\n        this.$().on('input', this.handleSearch.bind(this));\n        this.$().on('change', this.handleSelections.bind(this));\n    },\n\n    initCurrentDivisions() {\n        const skillgroup = this.params[0];\n        this.set('skillgroup', skillgroup);\n        this.set('currentDivisions', skillgroup.get('memberDivisions').mapBy('id'));\n    },\n\n    getDivisions() {\n        throttle(\n            this,\n            () => {\n                const data = {\n                    pageSize: this.pageSize,\n                    pageNumber: this.currentPage,\n                    permission: 'routing:skillgroup:add'\n                };\n                const request = this.ajax.ajaxGet(\n                    this.application.pcV2Uri('api/v2/authorization/divisionspermitted/paged/me'),\n                    {\n                        data\n                    }\n                );\n                return request\n                    .then(results => {\n                        results.entities.forEach(div => {\n                            if (this.currentDivisions.indexOf(div.id) >= 0) {\n                                div.added = true;\n                                if (div.id === this.get('skillgroup.division.id')) {\n                                    div.permanent = true;\n                                }\n                            } else {\n                                div.added = false;\n                            }\n                        });\n                        this.set('divisions', results.entities);\n                        this.set('totalDivisions', results.total || 0);\n                    })\n                    .catch(error => {\n                        this.logger.error('Error fetching divisions in skillgroup division picker', {\n                            error\n                        });\n                        const title = this.intl.t('skillgroups.divisionPicker.divisionFetchErrorTitle');\n                        const message = this.intl.t('skillgroups.divisionPicker.divisionFetchErrorMessage');\n                        this.notification.error(title, message);\n                    });\n            },\n            500\n        );\n    },\n\n    handlePaginationChange(event) {\n        this.setProperties({\n            currentPage: event.detail.currentPage,\n            pageSize: event.detail.itemsPerPage\n        });\n        this.getDivisions();\n    },\n\n    handleSelections(event) {\n        if (event.detail) {\n            this.set('selectedDivisions', event.detail.selectedRowIds);\n        } else if (event.target.name === 'select-all') {\n            this.set('selectAll', event.target.checked);\n        }\n    },\n\n    handleSearch(event) {\n        if (typeof event.detail === 'string') {\n            this.set('searchQuery', event.detail);\n            this.getDivisions();\n        }\n    },\n\n    actions: {\n        saveDivisions() {\n            let addDivisionIds = [];\n            let removeDivisionIds = [];\n            if (this.selectAll && !this.divisions.findBy('index', '*')) {\n                addDivisionIds = ['*'];\n            } else if (!this.selectAll && this.divisions.findBy('index', '*')) {\n                removeDivisionIds = ['*'];\n            }\n\n            this.divisions.forEach(div => {\n                if (div.added && this.selectedDivisions.indexOf(div.id) < 0) {\n                    removeDivisionIds.push(div.id);\n                } else if (!div.added && this.selectedDivisions.indexOf(div.id) >= 0) {\n                    addDivisionIds.push(div.id);\n                }\n            });\n\n            const path = `api/v2/routing/skillgroups/${this.get('skillgroup.id')}/members/divisions`;\n            const url = this.application.pcV2Uri(path);\n            const data = { addDivisionIds, removeDivisionIds };\n            this.ajax\n                .post(url, { data })\n                .then(() => {\n                    this.notification.info(\n                        this.intl.t('skillgroups.divisionPicker.saveTitle'),\n                        this.intl.t('skillgroups.divisionPicker.saveMessage')\n                    );\n                    this.skillgroup.reload();\n                    this.panel.resetSidePanel();\n                })\n                .catch(error => {\n                    this.logger.error('Error saving memberDivisions to skillgroup', {\n                        error\n                    });\n                    let title = this.intl.t('skillgroups.divisionPicker.saveErrorTitle');\n                    let message = this.intl.t('skillgroups.divisionPicker.saveErrorMessage');\n\n                    if (\n                        error.status === 400 &&\n                        error.payload.message === 'group memberDivisions count exceeds the limit of 50'\n                    ) {\n                        message = this.intl.t('skillgroups.divisionPicker.tooManyDivisions');\n                    }\n\n                    this.notification.error(title, message);\n                });\n        },\n\n        cancel() {\n            this.panel.resetSidePanel();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"LyK7DdzG\",\"block\":\"[[[10,0],[14,0,\\\"picker-panel\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"add-divisions-header\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"header-text\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,0],[\\\"skillgroups.divisionPicker.header\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"add-divisions-content\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"search-bar\\\"],[12],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"divisions-list\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-table\\\"],[14,\\\"object-table\\\",\\\"\\\"],[14,\\\"selectable-rows\\\",\\\"\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"table\\\"],[14,\\\"slot\\\",\\\"data\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"thead\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,\\\"th\\\"],[12],[10,\\\"gux-all-row-select\\\"],[12],[13],[13],[1,\\\"\\\\n                            \\\"],[10,\\\"th\\\"],[14,\\\"data-column-name\\\",\\\"name\\\"],[12],[1,[28,[35,0],[\\\"skillgroups.general.name\\\"],null]],[13],[1,\\\"\\\\n                            \\\"],[10,\\\"th\\\"],[14,\\\"data-column-name\\\",\\\"description\\\"],[12],[1,[28,[35,0],[\\\"skillgroups.general.description\\\"],null]],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"tbody\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,2],[[28,[37,2],[[33,3]],null]],null],null,[[[1,\\\"                            \\\"],[10,\\\"tr\\\"],[15,\\\"data-row-id\\\",[30,1,[\\\"id\\\"]]],[15,\\\"data-test-id\\\",[30,1,[\\\"name\\\"]]],[12],[1,\\\"\\\\n                                \\\"],[10,\\\"td\\\"],[12],[1,\\\"\\\\n                                    \\\"],[10,\\\"gux-row-select\\\"],[15,2,[29,[[30,1,[\\\"added\\\"]]]]],[15,\\\"disabled\\\",[29,[[30,1,[\\\"permanent\\\"]]]]],[15,\\\"selected\\\",[29,[[30,1,[\\\"added\\\"]]]]],[12],[13],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n                                \\\"],[10,\\\"td\\\"],[12],[1,[30,1,[\\\"name\\\"]]],[13],[1,\\\"\\\\n                                \\\"],[10,\\\"td\\\"],[14,0,\\\"description-cell\\\"],[12],[1,[30,1,[\\\"description\\\"]]],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"divisions-pagination\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-pagination-legacy\\\"],[14,0,\\\"divisions-gux-paginator\\\"],[15,\\\"current-page\\\",[36,4]],[15,\\\"total-items\\\",[36,5]],[15,\\\"items-per-page\\\",[36,6]],[12],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"add-divisions-footer\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"footer-checkboxes\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,8],[[[1,\\\"                \\\"],[10,\\\"gux-form-field-checkbox\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"input\\\"],[14,\\\"slot\\\",\\\"input\\\"],[15,1,[29,[[36,9],\\\"-select-all\\\"]]],[14,3,\\\"select-all\\\"],[15,\\\"checked\\\",[36,10]],[14,4,\\\"checkbox\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"label\\\"],[14,\\\"slot\\\",\\\"label\\\"],[15,\\\"for\\\",[29,[[36,9],\\\"-select-all\\\"]]],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,0],[\\\"skillgroups.divisionPicker.selectAll\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[14,0,\\\"footer-buttons\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-button\\\"],[15,\\\"gux-title\\\",[29,[[36,11]]]],[14,\\\"accent\\\",\\\"primary\\\"],[15,\\\"disabled\\\",[36,12]],[15,\\\"onclick\\\",[28,[37,13],[[30,0],\\\"saveDivisions\\\"],null]],[14,\\\"role\\\",\\\"button\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[34,11]],[1,\\\"\\\\n\\\\n\\\"],[41,[33,14],[[[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"gux-button\\\"],[15,\\\"gux-title\\\",[29,[[36,15]]]],[14,\\\"accent\\\",\\\"secondary\\\"],[15,\\\"onclick\\\",[28,[37,13],[[30,0],\\\"cancel\\\"],null]],[14,\\\"role\\\",\\\"button\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[34,15]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[\\\"division\\\"],false,[\\\"t\\\",\\\"each\\\",\\\"-track-array\\\",\\\"divisions\\\",\\\"currentPage\\\",\\\"totalDivisions\\\",\\\"pageSize\\\",\\\"if\\\",\\\"canSelectAll\\\",\\\"elementId\\\",\\\"selectAll\\\",\\\"confirmText\\\",\\\"confirmDisabled\\\",\\\"action\\\",\\\"loading\\\",\\\"cancelText\\\"]]\",\"moduleName\":\"web-directory/components/skillgroup-profile/division-picker/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport { A } from '@ember/array';\nimport { computed, set } from '@ember/object';\nimport Component from '@ember/component';\n\nexport default Component.extend({\n    classNames: ['group-acd-expressions'],\n\n    alerting: service(),\n    application: service(),\n    ajax: service(),\n    intl: service(),\n    logger: service('stash-logger'),\n    notification: service(),\n\n    group: null,\n    showSaveModal: false,\n    loading: false,\n    previewValue: null,\n    previewUrl: null,\n\n    expressionDisplay: computed('group.expression.@each.{display,operation}', function () {\n        const conditions = this.get('group.expression');\n        let display = '';\n        let valid = true;\n\n        if (!conditions && conditions.length === 0) {\n            return this.intl.t('groups.expressions.empty');\n        }\n\n        conditions.forEach((con, index) => {\n            if (con.display === null || con.display === undefined) {\n                valid = false;\n                return;\n            }\n\n            if (index !== 0) {\n                display += ` ${this.intl.t(`groups.expressions.${con.operation.toLowerCase()}`)} `;\n            }\n            display += con.display;\n        });\n\n        const empty = display.replace(/[()]/g, '').trim().length === 0;\n        if (empty) {\n            display = this.intl.t('groups.expressions.empty');\n        } else if (!valid) {\n            display = this.intl.t('groups.expressions.invalid');\n        }\n\n        return display;\n    }),\n\n    saveDisabled: computed('group.expression.@each.display', 'loading', function () {\n        const invalid =\n            this.get('group.expression').filter(condition => {\n                return !condition.display;\n            }).length > 0;\n        const empty = this.get('group.expression').length == 0;\n        const loading = this.loading;\n        return invalid || empty || loading;\n    }),\n\n    maximumExpressions: computed('group.expression.@each', function () {\n        return this.get('group.expression.length') >= 10;\n    }),\n\n    numberPreview: computed('previewValue', function () {\n        return isNaN(this.previewValue) ? this.intl.t('purecloud.unknown') : this.previewValue;\n    }),\n\n    actions: {\n        selectTab(tab) {\n            this.selectTab(tab);\n        },\n        addCondition() {\n            if (this.get('group.expression') && this.get('group.expression').length > 0) {\n                let exp = this.get('group.expression');\n                exp.forEach(condition => {\n                    set(condition, 'lastCondition', false);\n                    if (condition.operation === null) {\n                        set(condition, 'operation', 'And');\n                    }\n                });\n                exp.pushObject({\n                    lastCondition: true,\n                    operation: 'And',\n                    display: null,\n                    rules: [\n                        {\n                            skill: null,\n                            comparator: null,\n                            proficiency: null,\n                            operation: 'And',\n                            lastRule: true\n                        }\n                    ]\n                });\n                set(exp, 'lastObject.lastCondition', true);\n            } else {\n                this.set('group.expression', [\n                    {\n                        lastCondition: true,\n                        operation: 'And',\n                        display: null,\n                        rules: [\n                            {\n                                skill: null,\n                                comparator: null,\n                                proficiency: null,\n                                operation: 'And',\n                                lastRule: true\n                            }\n                        ]\n                    }\n                ]);\n            }\n        },\n        removeCondition(index) {\n            let exp = this.get('group.expression');\n\n            if (exp.length === 1) {\n                this.set('group.expression', []);\n            } else {\n                A(exp).removeAt(index);\n                exp.forEach(condition => {\n                    set(condition, 'lastCondition', false);\n                });\n                exp.set('lastObject.lastCondition', true);\n                this.set('group.expression', exp);\n            }\n        },\n        conditionOperation(condition, op) {\n            set(condition, 'operation', op);\n        },\n        save() {\n            this.set('loading', true);\n            const skillConditions = this.prepareExpression(this.get('group.expression'));\n\n            let group = this.group;\n            group.set('skillConditions', skillConditions);\n            group\n                .save()\n                .then(() => {\n                    this.notification.info(\n                        this.intl.t('groups.expressions.saveTitle'),\n                        this.intl.t('groups.expressions.saveMessage')\n                    );\n                    this.reset();\n                })\n                .catch(error => {\n                    let title = this.intl.t('groups.expressions.saveErrorTitle');\n                    let message = this.intl.t('groups.expressions.saveErrorMessage');\n\n                    if (\n                        error.status === 403 &&\n                        (error.payload.code === 'missing.permissions' || error.payload.code === 'forbidden')\n                    ) {\n                        message = this.intl.t('groups.expressions.editPermissionsErrorMessage');\n                    }\n\n                    this.notification.error(title, message);\n                    this.logger.error('Error trying to save dynamic expression to group', {\n                        error\n                    });\n                    group.reload().then(() => {\n                        group.rollbackAttributes();\n                    });\n                    this.reset();\n                });\n        },\n        async openCancelModal() {\n            const intl = this.get('intl');\n            const result = await this.get('alerting').pushModal({\n                title: intl.safestring('common.cancel').toString(),\n                content: intl.safestring('groups.expressions.cancelDisclaimer').toString(),\n                size: 'medium',\n                buttons: {\n                    positive: { label: intl.safestring('common.confirm').toString(), id: 'confirm' },\n                    negative: { label: intl.safestring('common.cancel').toString(), id: 'cancel' }\n                }\n            });\n            if (result.type === 'buttonClicked' && result.buttonId === 'confirm') {\n                this.send('cancel');\n            }\n        },\n        closeCancelModal() {\n            // no-op: modal handled by alerting service\n        },\n        cancel() {\n            this.set('showCancelModal', false);\n            const group = this.group;\n            group.reload().then(() => {\n                group.rollbackAttributes();\n            });\n            this.selectTab('members');\n        },\n        closeSaveModal() {\n            this.reset();\n        }\n    },\n\n    reset() {\n        this.set('previewValue', null);\n        this.set('previewUrl', null);\n        this.set('showSaveModal', false);\n        this.group.reload();\n        this.selectTab('members');\n    },\n\n    prepareExpression(input) {\n        let output = [];\n\n        input.forEach(con => {\n            let parent = null;\n            let save = {\n                routingSkillConditions: [],\n                languageSkillConditions: []\n            };\n\n            con.rules.forEach((rule, index) => {\n                const skillPropName =\n                    rule.skill.type == 'routing' ? 'routingSkillConditions' : 'languageSkillConditions';\n                const ruleType = rule.skill.type == 'routing' ? 'routingSkill' : 'languageSkill';\n\n                if (index === 0) {\n                    let newObj = {\n                        comparator: rule.comparator.value,\n                        proficiency: rule.proficiency.value,\n                        childConditions: []\n                    };\n                    newObj[ruleType] = rule.skill.name;\n                    parent = newObj;\n\n                    save[skillPropName].pushObject(newObj);\n                    save.operation = con.operation;\n                } else {\n                    // we're adding this skill as a childCondition\n                    let newCondition = {\n                        operation: rule.operation,\n                        routingSkillConditions: [],\n                        languageSkillConditions: []\n                    };\n\n                    let newObj = {\n                        comparator: rule.comparator.value,\n                        proficiency: rule.proficiency.value\n                    };\n                    newObj[ruleType] = rule.skill.name;\n                    newCondition[skillPropName].pushObject(newObj);\n\n                    parent.childConditions.pushObject(newCondition);\n                }\n            });\n\n            output.pushObject(save);\n        });\n\n        return output;\n    }\n});\n","import { inject as service } from '@ember/service';\nimport { A } from '@ember/array';\nimport { scheduleOnce } from '@ember/runloop';\nimport Component from '@ember/component';\nimport { computed, observer, set } from '@ember/object';\n\nexport default Component.extend({\n    classNames: ['condition-display'],\n\n    intl: service(),\n\n    comparators: null,\n    values: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.set('values', [\n            { name: '0', value: 0 },\n            { name: '1', value: 1 },\n            { name: '2', value: 2 },\n            { name: '3', value: 3 },\n            { name: '4', value: 4 },\n            { name: '5', value: 5 }\n        ]);\n\n        this.set('operators', {\n            Not: 'Not',\n            And: 'And',\n            Or: 'Or'\n        });\n\n        this.set('comparators', [\n            {\n                label: 'equals (==)',\n                value: 'EqualTo',\n                class: 'equalto',\n                op: '=='\n            },\n            {\n                label: 'not equals (!=)',\n                value: 'NotEqualTo',\n                class: 'notequalto',\n                op: '!='\n            },\n            {\n                label: 'greater than (>)',\n                value: 'GreaterThan',\n                class: 'greaterthan',\n                op: '>'\n            },\n            {\n                label: 'greater than or equal to (>=)',\n                value: 'GreaterThanOrEqualTo',\n                class: 'greaterthanorequalto',\n                op: '>='\n            },\n            {\n                label: 'less than (<)',\n                value: 'LessThan',\n                class: 'lessthan',\n                op: '<'\n            },\n            {\n                label: 'less than or equal to (<=)',\n                value: 'LessThanOrEqualTo',\n                class: 'lessthanorequalto',\n                op: '<='\n            }\n        ]);\n\n        scheduleOnce('afterRender', this, () => {\n            this.get('condition.rules').forEach(rule => {\n                //check to see if we're starting fresh\n                if (rule.comparator === null) {\n                    return;\n                }\n\n                //set comparators to proper objects\n                const compPlace = this.comparators.mapBy('op').indexOf(rule.comparator.op);\n\n                if (compPlace >= 0) {\n                    set(rule, 'comparator', this.comparators[compPlace]);\n                } else {\n                    set(rule, 'comparator', null);\n                }\n\n                if (!isNaN(rule.proficiency.value)) {\n                    set(rule, 'proficiency', this.values[rule.proficiency.value]);\n                }\n            });\n\n            this.set('condition.display', this.display());\n        });\n    },\n    maximumConditions: computed('condition.rules.length', function () {\n        return this.get('condition.rules.length') >= 10;\n    }),\n\n    updateConditionDisplay: observer(\n        'condition',\n        'condition.rules.@each.{skill,comparator,proficiency,operation,lastRule}',\n        function () {\n            this.set('condition.display', this.display());\n            this.set('condition.length', this.get('condition.rules').length);\n        }\n    ),\n\n    actions: {\n        addRule() {\n            let rules = this.condition.rules;\n            rules.forEach(rule => {\n                set(rule, 'lastRule', false);\n            });\n            rules.pushObject({\n                skill: null,\n                comparator: null,\n                proficiency: null,\n                operation: 'And',\n                lastRule: true\n            });\n        },\n        removeRule(index) {\n            let con = this.condition.rules;\n            A(con).removeAt(index);\n            con.forEach(rule => {\n                set(rule, 'lastRule', false);\n            });\n            con.set('lastObject.lastRule', true);\n            this.set('condition.rules', con);\n        },\n        ruleOperation(rule, op) {\n            set(rule, 'operation', op);\n        },\n        skillChanged(rule, skill, e) {\n            let value = e.target.value;\n            if (value) {\n                if (skill === 'comparator') {\n                    const match = this.comparators.findBy('value', value);\n                    set(rule, skill, match || value);\n                } else if (skill === 'proficiency') {\n                    const match = this.values.findBy('value', Number(value));\n                    set(rule, skill, match || value);\n                } else {\n                    set(rule, skill, value);\n                }\n            }\n        }\n    },\n\n    /**\n     * TODO: Remove these functions from component level and make reusable util.\n     */\n    display() {\n        const rules = this.get('condition.rules');\n        let display = '(';\n        let valid = true;\n\n        for (const rule of rules) {\n            // if a rule is not valid then break the rest of the for-loop and set the valid to `false`\n            const hasEmptyFields = !rule.skill || !rule.comparator || !rule.proficiency;\n            if (hasEmptyFields) {\n                valid = false;\n                return;\n            }\n\n            if (rule !== rules[0]) {\n                display += `${this.intl.t(`groups.expressions.${rule.operation.toLowerCase()}`)} `;\n            }\n\n            display += `${rule.skill.name} ${rule.comparator.op} ${rule.proficiency.value}`;\n\n            if (rule.lastRule) {\n                display += ')';\n            } else {\n                display += ' ';\n            }\n        }\n\n        return valid ? display : null;\n    }\n});\n","import { inject as service } from '@ember/service';\nimport { run, debounce } from '@ember/runloop';\nimport $ from 'jquery';\nimport { computed } from '@ember/object';\nimport Component from '@ember/component';\nimport _ from 'lodash';\n\nexport default Component.extend({\n    classNames: ['skill-search'],\n\n    application: service(),\n    ajax: service(),\n    intl: service(),\n    logger: service('stash-logger'),\n\n    skillResults: null,\n    languageResults: null,\n    showSearchResults: false,\n    searchvalue: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.set('skillResults', []);\n        this.set('languageResults', []);\n    },\n\n    results: computed('skillResults', 'languageResults', function () {\n        return this.skillResults.concat(this.languageResults);\n    }),\n\n    placeHolder: computed('skill', function () {\n        return this.skill ? this.get('skill.name') : this.intl.t('groups.expressions.defaultSkill');\n    }),\n\n    skillSelected: computed('skill', function () {\n        return !!this.skill;\n    }),\n\n    actions: {\n        select(result) {\n            this.set('skill', result);\n            this.reset();\n        },\n        clearSearch() {\n            this.reset();\n        },\n        searchInputUpdated(event) {\n            this.set('searchValue', event.target.value);\n            this.updateSearchOnChange(event.target.value);\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.attachOutsideHandler();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.removeOutsideHandler();\n    },\n\n    attachOutsideHandler() {\n        $(window).on(`click.${this.elementId}`, event => {\n            run(() => {\n                if (this.dismissed) {\n                    return;\n                }\n                const target = $(event.target);\n                if (!target.parents('.skill-search').length) {\n                    this.reset();\n                }\n            });\n        });\n    },\n\n    removeOutsideHandler() {\n        $(window).off(`.${this.elementId}`);\n    },\n\n    reset() {\n        this.set('showSearchResults', false);\n        this.set('searchValue', null);\n        this.set('languageResults', []);\n        this.set('skillResults', []);\n    },\n\n    updateSearchOnChange(query) {\n        if (!_.isEmpty(query)) {\n            debounce(this, this.runSearch, query.toLowerCase(), 250);\n        } else {\n            this.reset();\n        }\n    },\n\n    runSearch(query) {\n        this.set('showSearchResults', true);\n        this.languageSearch(query);\n        this.skillSearch(query);\n    },\n\n    skillSearch(query) {\n        const url = this.application.pcV2Uri(`api/v2/routing/skills`);\n        this.ajax\n            .ajaxGet(url, {\n                data: {\n                    name: query\n                },\n                retry: true\n            })\n            .then(res => {\n                let skills = res.entities;\n                skills.forEach(skl => {\n                    skl.type = 'routing';\n                    skl.class = skl.name.toLowerCase().replaceAll(' ', '_');\n                });\n                this.set('skillResults', skills);\n            })\n            .catch(error => {\n                // uhhhh\n                this.logger.error('Error trying to fetch routing skills', {\n                    error\n                });\n                this.set('skillResults', []);\n            });\n    },\n\n    languageSearch(query) {\n        const url = this.application.pcV2Uri(`api/v2/routing/languages`);\n        this.ajax\n            .ajaxGet(url, {\n                data: {\n                    name: query\n                },\n                retry: true\n            })\n            .then(res => {\n                let langs = res.entities;\n                langs.forEach(lang => {\n                    lang.type = 'language';\n                    lang.class = lang.name.toLowerCase().replaceAll(' ', '_');\n                });\n                this.set('languageResults', langs);\n            })\n            .catch(error => {\n                // uhhhh\n                this.logger.error('Error trying to fetch routing languages', {\n                    error\n                });\n                this.set('languageResults', []);\n            });\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"tOj8TADR\",\"block\":\"[[[41,[33,1],[[[1,\\\"    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,2],[[[1,\\\"        \\\"],[11,\\\"button\\\"],[24,0,\\\"close-button clickable\\\"],[16,\\\"aria-label\\\",[28,[37,3],[\\\"common.clearInput\\\"],null]],[24,4,\\\"button\\\"],[4,[38,4],[[30,0],\\\"clearSearch\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"close-circle\\\"],[15,\\\"screenreader-text\\\",[28,[37,3],[\\\"common.clearInput\\\"],null]],[12],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"search\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]]],[]]],[1,\\\"\\\\n\\\"],[10,\\\"label\\\"],[14,0,\\\"hidden\\\"],[15,\\\"for\\\",[29,[[36,5],\\\"-skills-search\\\"]]],[12],[1,[28,[35,3],[\\\"groups.expressions.searchSkill\\\"],null]],[13],[1,\\\"\\\\n\\\"],[10,\\\"input\\\"],[15,1,[29,[[36,5],\\\"-skills-search\\\"]]],[15,0,[29,[\\\"form-control purecloud-input \\\",[52,[33,6],\\\"selected\\\"]]]],[15,2,[29,[[36,2]]]],[15,\\\"placeholder\\\",[29,[[36,7]]]],[15,\\\"oninput\\\",[28,[37,4],[[30,0],\\\"searchInputUpdated\\\"],[[\\\"on\\\"],[\\\"input\\\"]]]],[12],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,8],[[[1,\\\"    \\\"],[10,\\\"ul\\\"],[14,0,\\\"search-results show dropdown-menu\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"results-content\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,10],[[28,[37,10],[[33,11]],null]],null],null,[[[1,\\\"                \\\"],[11,\\\"li\\\"],[16,0,[29,[\\\"clearfix \\\",[30,1,[\\\"class\\\"]],\\\" \\\",[30,1,[\\\"type\\\"]]]]],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[4,[38,4],[[30,0],\\\"select\\\",[30,1]],null],[12],[1,\\\"\\\\n                    \\\"],[10,2],[14,0,\\\"name\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[30,1,[\\\"name\\\"]]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],[[[1,\\\"                \\\"],[10,2],[14,0,\\\"text-center\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,3],[\\\"groups.expressions.noResults\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"result\\\"],false,[\\\"if\\\",\\\"loading\\\",\\\"searchValue\\\",\\\"t\\\",\\\"action\\\",\\\"elementId\\\",\\\"skillSelected\\\",\\\"placeHolder\\\",\\\"showSearchResults\\\",\\\"each\\\",\\\"-track-array\\\",\\\"results\\\"]]\",\"moduleName\":\"web-directory/components/skillgroup-profile/dynamic-rules/condition-display/skill-search/template.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"Pl5FFlmK\",\"block\":\"[[[42,[28,[37,1],[[28,[37,1],[[33,2,[\\\"rules\\\"]]],null]],null],null,[[[1,\\\"    \\\"],[10,0],[14,0,\\\"rule\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,4],[[28,[37,5],[[30,2],0],null]],null],[[[1,\\\"            \\\"],[10,0],[15,0,[29,[\\\"rule-and-or \\\",[30,1,[\\\"operation\\\"]]]]],[12],[1,\\\"\\\\n                \\\"],[11,0],[24,0,\\\"and-button\\\"],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[4,[38,6],[[30,0],\\\"ruleOperation\\\",[30,1],\\\"And\\\"],null],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,7],[\\\"groups.expressions.and\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[11,0],[24,0,\\\"or-button\\\"],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[4,[38,6],[[30,0],\\\"ruleOperation\\\",[30,1],\\\"Or\\\"],null],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,7],[\\\"groups.expressions.or\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[11,0],[24,0,\\\"not-button\\\"],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[4,[38,6],[[30,0],\\\"ruleOperation\\\",[30,1],\\\"Not\\\"],null],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,7],[\\\"groups.expressions.not\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"rule-spacer\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[10,0],[14,0,\\\"skill-name\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,8],null,[[\\\"skill\\\"],[[30,1,[\\\"skill\\\"]]]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[14,0,\\\"skill-comparator\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-form-field-dropdown\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-dropdown\\\"],[15,\\\"onchange\\\",[28,[37,6],[[30,0],\\\"skillChanged\\\",[30,1],\\\"comparator\\\"],null]],[15,2,[30,1,[\\\"comparator\\\",\\\"value\\\"]]],[14,3,\\\"skill-comparator\\\"],[14,0,\\\"comparator-dropdown\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-listbox\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,1],[[28,[37,1],[[33,9]],null]],null],null,[[[1,\\\"                            \\\"],[10,\\\"gux-option\\\"],[15,0,[30,3,[\\\"class\\\"]]],[15,2,[30,3,[\\\"value\\\"]]],[12],[1,[30,3,[\\\"label\\\"]]],[13],[1,\\\"\\\\n\\\"]],[3]],null],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[14,0,\\\"skill-proficiency\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-form-field-dropdown\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-dropdown\\\"],[15,\\\"onchange\\\",[28,[37,6],[[30,0],\\\"skillChanged\\\",[30,1],\\\"proficiency\\\"],null]],[15,2,[30,1,[\\\"proficiency\\\",\\\"value\\\"]]],[14,3,\\\"skill-proficiency\\\"],[14,0,\\\"proficiency-dropdown\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-listbox\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,1],[[28,[37,1],[[33,10]],null]],null],null,[[[1,\\\"                            \\\"],[10,\\\"gux-option\\\"],[15,0,[30,4,[\\\"value\\\"]]],[15,2,[30,4,[\\\"value\\\"]]],[12],[1,[30,4,[\\\"name\\\"]]],[13],[1,\\\"\\\\n\\\"]],[4]],null],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"],[41,[51,[28,[37,5],[[33,2,[\\\"rules\\\",\\\"length\\\"]],1],null]],[[[1,\\\"            \\\"],[11,\\\"button\\\"],[24,0,\\\"remove-rule\\\"],[16,\\\"aria-label\\\",[28,[37,7],[\\\"common.remove\\\"],null]],[24,4,\\\"button\\\"],[4,[38,6],[[30,0],\\\"removeRule\\\",[30,2]],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"subtract\\\"],[15,\\\"screenreader-text\\\",[28,[37,7],[\\\"common.remove\\\"],null]],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[30,1,[\\\"lastRule\\\"]],[[[41,[51,[33,12]],[[[1,\\\"                \\\"],[11,\\\"button\\\"],[24,0,\\\"add-rule\\\"],[16,\\\"aria-label\\\",[28,[37,7],[\\\"common.add\\\"],null]],[24,4,\\\"button\\\"],[4,[38,6],[[30,0],\\\"addRule\\\",[33,13]],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"add\\\"],[15,\\\"screenreader-text\\\",[28,[37,7],[\\\"common.add\\\"],null]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"]],[1,2]],null]],[\\\"rule\\\",\\\"rIndex\\\",\\\"op\\\",\\\"val\\\"],false,[\\\"each\\\",\\\"-track-array\\\",\\\"condition\\\",\\\"if\\\",\\\"not\\\",\\\"eq\\\",\\\"action\\\",\\\"t\\\",\\\"skillgroup-profile/dynamic-rules/condition-display/skill-search\\\",\\\"comparators\\\",\\\"values\\\",\\\"unless\\\",\\\"maximumConditions\\\",\\\"cIndex\\\"]]\",\"moduleName\":\"web-directory/components/skillgroup-profile/dynamic-rules/condition-display/template.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"HW1YOtCC\",\"block\":\"[[[10,0],[14,0,\\\"dynamic-expression-builder\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"title-section\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"title\\\"],[12],[1,\\\"\\\\n            \\\"],[11,\\\"button\\\"],[16,\\\"aria-label\\\",[28,[37,0],[\\\"common.back\\\"],null]],[24,4,\\\"button\\\"],[4,[38,1],[[30,0],\\\"selectTab\\\",\\\"members\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"arrow-left\\\"],[15,\\\"screenreader-text\\\",[28,[37,0],[\\\"common.back\\\"],null]],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"h1\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,0],[\\\"groups.expressions.title\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[14,0,\\\"subtitle\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,0],[\\\"groups.expressions.subtitle\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[14,0,\\\"expression-preview\\\"],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"expression-display\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[34,2]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"condition-builder\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,4],[[28,[37,4],[[33,5,[\\\"expression\\\"]]],null]],null],null,[[[1,\\\"            \\\"],[10,0],[14,0,\\\"condition\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,7],[[28,[37,8],[[30,2],0],null]],null],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"condition-header-line\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,0],[14,0,\\\"spacer\\\"],[12],[13],[1,\\\"\\\\n                        \\\"],[10,0],[15,0,[29,[\\\"condition-operation \\\",[30,1,[\\\"operation\\\"]]]]],[12],[1,\\\"\\\\n                            \\\"],[11,0],[24,0,\\\"and-button\\\"],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[4,[38,1],[[30,0],\\\"conditionOperation\\\",[30,1],\\\"And\\\"],null],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,0],[\\\"groups.expressions.and\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                            \\\"],[11,0],[24,0,\\\"or-button\\\"],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[4,[38,1],[[30,0],\\\"conditionOperation\\\",[30,1],\\\"Or\\\"],null],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,0],[\\\"groups.expressions.or\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                            \\\"],[11,0],[24,0,\\\"not-button\\\"],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[4,[38,1],[[30,0],\\\"conditionOperation\\\",[30,1],\\\"Not\\\"],null],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,0],[\\\"groups.expressions.not\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                        \\\"],[10,0],[14,0,\\\"spacer\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"condition-header\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,0],[\\\"groups.expressions.condition\\\"],[[\\\"index\\\",\\\"display\\\"],[[28,[37,9],[[30,2],1],null],[28,[37,10],[[30,1,[\\\"display\\\"]],\\\"\\\"],null]]]]],[1,\\\"\\\\n                    \\\"],[11,0],[24,0,\\\"remove-condition\\\"],[24,\\\"tabindex\\\",\\\"0\\\"],[24,\\\"role\\\",\\\"button\\\"],[4,[38,1],[[30,0],\\\"removeCondition\\\",[30,2]],null],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,0],[\\\"groups.expressions.removeCondition\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\\n                \\\"],[10,0],[14,0,\\\"condition-rules\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,11],null,[[\\\"condition\\\",\\\"group\\\"],[[30,1],[33,5]]]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[30,1,[\\\"lastCondition\\\"]],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"condition-footer-line\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,0],[14,0,\\\"spacer\\\"],[12],[13],[1,\\\"\\\\n\\\"],[41,[51,[33,13]],[[[1,\\\"                            \\\"],[10,0],[14,0,\\\"footer-actions\\\"],[12],[1,\\\"\\\\n                                \\\"],[11,\\\"button\\\"],[24,0,\\\"add-condition\\\"],[16,\\\"aria-label\\\",[28,[37,0],[\\\"common.add\\\"],null]],[24,4,\\\"button\\\"],[4,[38,1],[[30,0],\\\"addCondition\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"add\\\"],[15,\\\"screenreader-text\\\",[28,[37,0],[\\\"common.add\\\"],null]],[12],[13],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                        \\\"],[10,0],[14,0,\\\"spacer\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"]],[1,2]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"first-condition-line\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"spacer\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"condition-action\\\"],[12],[1,\\\"\\\\n                    \\\"],[11,\\\"button\\\"],[24,0,\\\"add-condition\\\"],[16,\\\"aria-label\\\",[28,[37,0],[\\\"common.add\\\"],null]],[24,4,\\\"button\\\"],[4,[38,1],[[30,0],\\\"addCondition\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"add\\\"],[15,\\\"screenreader-text\\\",[28,[37,0],[\\\"common.add\\\"],null]],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"spacer\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"editing-footer\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-button\\\"],[15,\\\"gux-title\\\",[28,[37,0],[\\\"common.save\\\"],null]],[14,\\\"accent\\\",\\\"primary\\\"],[14,0,\\\"save-button\\\"],[15,\\\"disabled\\\",[36,14]],[15,\\\"onclick\\\",[28,[37,1],[[30,0],\\\"save\\\"],null]],[14,\\\"role\\\",\\\"button\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,0],[\\\"common.save\\\"],null]],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,10],[[33,5,[\\\"isSaving\\\"]],[33,15]],null],[[[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"gux-button\\\"],[15,\\\"gux-title\\\",[28,[37,0],[\\\"common.cancel\\\"],null]],[14,\\\"accent\\\",\\\"tertiary\\\"],[14,0,\\\"cancel-button\\\"],[15,\\\"disabled\\\",[36,16]],[15,\\\"onclick\\\",[28,[37,1],[[30,0],\\\"openCancelModal\\\"],null]],[14,\\\"role\\\",\\\"button\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,0],[\\\"common.cancel\\\"],null]],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,17],[[33,5,[\\\"isReloading\\\"]],[28,[37,7],[[33,15]],null]],null],[[[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,16],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"loading-screen\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"]],[\\\"condition\\\",\\\"cIndex\\\"],false,[\\\"t\\\",\\\"action\\\",\\\"expressionDisplay\\\",\\\"each\\\",\\\"-track-array\\\",\\\"group\\\",\\\"if\\\",\\\"not\\\",\\\"eq\\\",\\\"add\\\",\\\"or\\\",\\\"skillgroup-profile/dynamic-rules/condition-display\\\",\\\"unless\\\",\\\"maximumExpressions\\\",\\\"saveDisabled\\\",\\\"saving\\\",\\\"loading\\\",\\\"and\\\"]]\",\"moduleName\":\"web-directory/components/skillgroup-profile/dynamic-rules/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport $ from 'jquery';\nimport EmberObject, { computed } from '@ember/object';\nimport Component from '@ember/component';\n\nfunction memberEntityId(entity) {\n    if (entity == null) {\n        return null;\n    }\n    return typeof entity.get === 'function' ? entity.get('id') : entity.id;\n}\n\nfunction profilePlaceholder(entity) {\n    const id = memberEntityId(entity);\n    const nameFromMember =\n        entity && typeof entity.get === 'function'\n            ? entity.get('name')\n            : entity && entity.name != null\n            ? entity.name\n            : '';\n    return EmberObject.create({\n        id,\n        name: nameFromMember || '',\n        title: '',\n        images: null,\n        primaryContactInfo: null,\n        contactInfo: null\n    });\n}\n\nexport default Component.extend({\n    classNames: ['group-membership-entry'],\n\n    chat: service(),\n    intl: service(),\n    session: service(),\n    store: service(),\n    notification: service(),\n\n    attrs: {\n        person: null,\n        bulkPerson: null,\n        group: null,\n        membership: []\n    },\n\n    showChat: computed('isLoggedInUser', 'chat.enabled', function () {\n        return !this.isLoggedInUser && this.get('chat.enabled');\n    }),\n\n    isLoggedInUser: computed('person', 'session.person', function () {\n        const person = this.person;\n        const sessionPerson = this.get('session.person');\n        if (!person || typeof person.get !== 'function') {\n            return false;\n        }\n        return person.get('id') === sessionPerson.get('id');\n    }),\n\n    person: computed('entity', 'bulkPerson', function () {\n        const bulkPerson = this.bulkPerson;\n        if (bulkPerson) {\n            return bulkPerson;\n        }\n        const id = memberEntityId(this.entity);\n        if (id) {\n            const fromStore = this.store.peekRecord('person', id);\n            if (fromStore) {\n                return fromStore;\n            }\n        }\n        return profilePlaceholder(this.entity);\n    }),\n\n    click(event) {\n        const target = $(event.target);\n        if (target.is('.person-name')) {\n            this.bubbleAction({\n                action: 'transitionToEntityDetail',\n                actionContext: [this.person]\n            });\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"db394fSy\",\"block\":\"[[[10,0],[14,0,\\\"image\\\"],[12],[1,\\\"\\\\n\\\"],[6,[39,0],null,[[\\\"entity\\\",\\\"showPresence\\\",\\\"isLinkable\\\"],[[33,1],true,true]],[[\\\"default\\\"],[[[[1,\\\"        \\\"],[1,[28,[35,2],null,[[\\\"entity\\\"],[[33,1]]]]],[1,\\\"\\\\n\\\"]],[]]]]],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"information\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"person-name\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[33,1,[\\\"name\\\"]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"person-title\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[33,1,[\\\"title\\\"]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"member-contact\\\"],[12],[1,\\\"\\\\n    \\\"],[1,[28,[35,3],null,[[\\\"contact\\\",\\\"showChat\\\",\\\"showFavorite\\\",\\\"shouldTether\\\"],[[33,1],[33,4],false,false]]]],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"entity-image\\\",\\\"person\\\",\\\"integration-badges\\\",\\\"entity-contact\\\",\\\"showChat\\\"]]\",\"moduleName\":\"web-directory/components/skillgroup-profile/membership-entry/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport { reads } from '@ember/object/computed';\nimport { bind, scheduleOnce } from '@ember/runloop';\nimport { computed, observer } from '@ember/object';\nimport Component from '@ember/component';\nimport _ from 'lodash';\nimport { task, timeout } from 'ember-concurrency';\nimport JobMixin from '../../../mixins/job';\nimport PagingMixin from '../../../mixins/paging';\nimport LoggerMixin from '../../../mixins/logger';\nimport { BASE_PERSON } from '../../../models/person';\n\nfunction memberIds(membership) {\n    if (!membership || !membership.length) {\n        return [];\n    }\n    return _.uniq(\n        membership\n            .map(m => {\n                if (m == null) {\n                    return null;\n                }\n                return typeof m.get === 'function' ? m.get('id') : m.id;\n            })\n            .filter(Boolean)\n    );\n}\n\nexport default Component.extend(PagingMixin, JobMixin, LoggerMixin, {\n    classNames: ['group-membership-listing', 'content'],\n    classNameBindings: ['editing', 'hunt-groups'],\n\n    application: service(),\n    ajax: service(),\n    intl: service(),\n    session: service(),\n    notification: service(),\n    panel: service('side-panel'),\n    permissions: service(),\n    store: service(),\n\n    group: null,\n    membership: null,\n    peopleById: null,\n\n    init() {\n        this._super(...arguments);\n        this.set('peopleById', {});\n    },\n\n    onSkillGroupMembersPageLoaded: observer('group.nextMembersPage', function () {\n        if (this.isDestroyed || this.isDestroying || !this.group) {\n            return;\n        }\n        scheduleOnce('actions', this, '_enqueueLoadMemberProfiles');\n    }),\n\n    onGroupChange: observer('group.id', function () {\n        if (this.isDestroyed || this.isDestroying) {\n            return;\n        }\n        this.set('peopleById', {});\n    }),\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        this.$('.membership-listing').on(\n            'scroll',\n            bind(this, () => this.loadContentOnScroll.perform())\n        );\n        this.loadMoreMembersOnInit();\n    },\n\n    _enqueueLoadMemberProfiles() {\n        if (this.isDestroyed || this.isDestroying) {\n            return;\n        }\n        this.loadMemberProfilesTask.perform();\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n\n        this.$('.membership-listing').off('scroll');\n    },\n\n    actions: {\n        selectTab(tab) {\n            this.bubbleAction({\n                action: 'selectTab',\n                actionContext: tab\n            });\n        },\n\n        openDivisionPicker() {\n            this.panel.setProperties({\n                template: 'skillgroup-profile/division-picker',\n                templateProps: [this.group],\n                showHeader: true,\n                showFooter: false\n            });\n        },\n\n        removeDivision(id) {\n            const path = `api/v2/routing/skillgroups/${this.get('group.id')}/members/divisions`;\n            const url = this.application.pcV2Uri(path);\n            const data = { removeDivisionIds: [id] };\n            this.ajax\n                .post(url, { data })\n                .then(() => {\n                    this.group.reload();\n                    this.notification.info(\n                        this.intl.t('skillgroups.divisionPicker.saveTitle'),\n                        this.intl.t('skillgroups.divisionPicker.saveMessage')\n                    );\n                })\n                .catch(error => {\n                    this.logger.error('Error saving memberDivisions to skillgroup', {\n                        error\n                    });\n                    let title = this.intl.t('skillgroups.divisionPicker.saveErrorTitle');\n                    let message = this.intl.t('skillgroups.divisionPicker.saveErrorMessage');\n\n                    if (\n                        error.status === 403 &&\n                        (error.payload.code === 'missing.permissions' || error.payload.code === 'forbidden')\n                    ) {\n                        message = this.intl.t('groups.expressions.editPermissionsErrorMessage');\n                    }\n\n                    this.notification.error(title, message);\n                });\n        }\n    },\n\n    canEdit: computed(\n        'session.user.isTrustee',\n        'session.person.namedPermissions',\n        'permissions.canEditGroups',\n        function () {\n            if (this.get('session.user.isTrustee')) {\n                return this.get('permissions.canEditSkillGroups');\n            }\n            const person = this.get('session.person');\n            const permissions = person.get('namedPermissions');\n            return (\n                permissions.includes('admin') ||\n                permissions.includes('group_administration') ||\n                this.get('permissions.canEditSkillGroups')\n            );\n        }\n    ),\n\n    displayDivisions: computed('group.memberDivisions', function () {\n        const divisions = this.get('group.memberDivisions');\n        if (divisions && divisions.mapBy('id').indexOf('*') >= 0) {\n            return divisions.filterBy('id', '*');\n        }\n        return divisions;\n    }),\n\n    expressionDisplay: computed('group.expression', function () {\n        let output = '';\n        let expression = this.get('group.expression');\n        let invalid = false;\n\n        if (_.isEmpty(expression)) {\n            return this.intl.t('groups.expressions.empty');\n        }\n\n        expression.forEach((con, cIndex) => {\n            let display = '';\n            if (cIndex !== 0) display += ` ${this.intl.t(`groups.expressions.${con.operation.toLowerCase()}`)} `;\n            display += '(';\n\n            con.rules.forEach((rule, rIndex) => {\n                let valid = !!rule.skill && !!rule.comparator && !isNaN(rule.proficiency.value);\n                if (valid) {\n                    if (rIndex !== 0)\n                        display += ` ${this.intl.t(`groups.expressions.${rule.operation.toLowerCase()}`)} `;\n                    display += `${rule.skill.name} ${rule.comparator.op} ${rule.proficiency.value}`;\n                    if (rule.lastRule) {\n                        display += ')';\n                    }\n                } else {\n                    invalid = true;\n                }\n            });\n            output += display;\n        });\n\n        let empty = output.replaceAll('(', '').replaceAll(')', '').trim() === 0;\n\n        if (invalid) {\n            output = this.intl.t('groups.expressions.invalid');\n        } else if (empty) {\n            //has no valid rules\n            output = this.intl.t('groups.expressions.empty');\n        }\n        return output;\n    }),\n\n    membershipCount: reads('group.memberCount'),\n\n    membershipHeader: computed('membershipCount', 'membershipCount.isFulfilled', function () {\n        const count = this.get('membershipCount.content') || 0;\n        return this.intl.t('groups.membershipWithCount', { count });\n    }),\n\n    loadMoreMembersOnInit() {\n        let listingEl = this.$('.membership-listing');\n        if (!listingEl) {\n            return;\n        }\n\n        // Sometimes we've gotta load the second page depending on how much available screen\n        // space the user has. Otherwise they can't load more members!\n        let containerHeight = listingEl.height();\n        let heightPerEntry = 90;\n        if (containerHeight / heightPerEntry < this.get('membership.length')) {\n            return;\n        }\n\n        return this.loadContentOnScroll.perform();\n    },\n\n    loadContentOnScroll: task(function* () {\n        yield timeout(200);\n        const listing = this.$('.membership-listing');\n        const scroll = listing.scrollTop();\n        const height = listing.prop('scrollHeight') - listing.height();\n\n        if (height - scroll <= 500) {\n            this.group.loadMembership();\n        }\n        return;\n    }).drop(),\n\n    loadMemberProfilesTask: task(function* () {\n        const membership = this.membership;\n        const ids = memberIds(membership);\n        const prior = this.peopleById || {};\n        if (ids.length === 0) {\n            this.set('peopleById', {});\n            return;\n        }\n        const missingIds = ids.filter(id => !prior[id]);\n        if (missingIds.length === 0) {\n            return;\n        }\n        try {\n            const people = yield this.store.findMany('person', missingIds, BASE_PERSON);\n            const next = Object.assign({}, prior);\n            people.forEach(p => {\n                next[p.get('id')] = p;\n            });\n            this.set('peopleById', next);\n        } catch (error) {\n            this.logger.error('Error bulk-loading person profiles for skill group membership', {\n                error\n            });\n        }\n    })\n        .enqueue()\n        .maxConcurrency(1)\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"3GoKtbcp\",\"block\":\"[[[10,0],[14,0,\\\"headers\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"divisions-header\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"divisions-list-area\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"division label\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"name\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,0],[\\\"skillgroups.divisions.included\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"],[42,[28,[37,2],[[28,[37,2],[[33,3]],null]],null],null,[[[1,\\\"                \\\"],[10,0],[14,0,\\\"division\\\"],[15,\\\"data-test-id\\\",[30,1,[\\\"name\\\"]]],[12],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"name\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[30,1,[\\\"name\\\"]]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"],[41,[30,1,[\\\"deleteable\\\"]],[[[1,\\\"                        \\\"],[11,\\\"button\\\"],[24,0,\\\"division-remove\\\"],[16,\\\"aria-label\\\",[28,[37,0],[\\\"common.remove\\\"],null]],[24,4,\\\"button\\\"],[4,[38,5],[[30,0],\\\"removeDivision\\\",[30,1,[\\\"id\\\"]]],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"close\\\"],[15,\\\"screenreader-text\\\",[28,[37,0],[\\\"common.remove\\\"],null]],[12],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"edit-divisions\\\"],[12],[1,\\\"\\\\n            \\\"],[11,\\\"button\\\"],[24,0,\\\"btn add-division-button\\\"],[24,4,\\\"button\\\"],[4,[38,5],[[30,0],\\\"openDivisionPicker\\\"],null],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,0],[\\\"skillgroups.divisions.add\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"expression-display-header\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"expression-display\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[34,6]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,7],[[[1,\\\"            \\\"],[11,\\\"button\\\"],[24,0,\\\"btn show-dynamic-rules\\\"],[24,4,\\\"button\\\"],[4,[38,5],[[30,0],\\\"selectTab\\\",\\\"dynamicRules\\\"],null],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,0],[\\\"groups.expressions.edit\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"membership-listing\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,2],[[28,[37,2],[[33,8]],null]],null],null,[[[1,\\\"        \\\"],[10,0],[14,0,\\\"member\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,9],null,[[\\\"entity\\\",\\\"bulkPerson\\\",\\\"group\\\",\\\"membership\\\",\\\"deletePerson\\\"],[[30,2],[28,[37,10],[[33,11],[28,[37,10],[[30,2],\\\"id\\\"],null]],null],[33,12],[33,8],\\\"removePerson\\\"]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[2]],[[[1,\\\"        \\\"],[10,2],[14,0,\\\"text-center empty\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,0],[\\\"skillgroups.noMembers\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[13]],[\\\"division\\\",\\\"member\\\"],false,[\\\"t\\\",\\\"each\\\",\\\"-track-array\\\",\\\"displayDivisions\\\",\\\"if\\\",\\\"action\\\",\\\"expressionDisplay\\\",\\\"canEdit\\\",\\\"membership\\\",\\\"skillgroup-profile/membership-entry\\\",\\\"get\\\",\\\"peopleById\\\",\\\"group\\\"]]\",\"moduleName\":\"web-directory/components/skillgroup-profile/membership-listing/template.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"IR+/eDS5\",\"block\":\"[[[10,0],[14,0,\\\"container-fluid\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"left-rail\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,1],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"edit dropdown\\\"],[12],[1,\\\"\\\\n\\\"],[6,[39,2],null,[[\\\"showDropdown\\\",\\\"dropdownInfo\\\",\\\"attachOutsideClick\\\"],[[33,3],\\\"group-profile\\\",true]],[[\\\"default\\\"],[[[[1,\\\"                    \\\"],[10,\\\"button\\\"],[14,0,\\\"btn btn-link dropdown-link menu-selector\\\"],[14,6,\\\"#\\\"],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,4],[\\\"common.edit\\\"],null]],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"arrow-solid-down\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\\n                    \\\"],[10,\\\"ul\\\"],[15,0,[29,[\\\"dropdown-menu \\\",[52,[33,3],\\\"show\\\",\\\"hide\\\"]]]],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"li\\\"],[14,0,\\\"edit-general\\\"],[12],[1,\\\"\\\\n                            \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"edit-general\\\"],[4,[38,5],[[30,0],\\\"editGeneralInfo\\\"],null],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,4],[\\\"person.edit.generalInfo\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\\n                        \\\"],[10,\\\"li\\\"],[14,0,\\\"delete-group\\\"],[12],[1,\\\"\\\\n                            \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"delete-group text-danger\\\"],[4,[38,5],[[30,0],\\\"deleteGroup\\\"],null],[12],[1,\\\"\\\\n                                \\\"],[1,[28,[35,4],[\\\"groups.admin.delete\\\"],null]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"profile-picture\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,6],null,[[\\\"entity\\\",\\\"size\\\"],[[33,7],400]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[14,0,\\\"general\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"name\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[33,7,[\\\"name\\\"]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,0],[14,0,\\\"group-type\\\"],[12],[1,\\\"\\\\n\\\"],[41,[51,[33,9]],[[[1,\\\"                    \\\"],[10,\\\"i\\\"],[15,0,[29,[[36,10]]]],[12],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n                \\\"],[10,1],[14,0,\\\"groupType\\\"],[12],[1,[33,7,[\\\"groupType\\\"]]],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"hr\\\"],[12],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[14,0,\\\"description-contact-info\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"description\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,7,[\\\"description\\\"]],[[[1,\\\"                    \\\"],[1,[33,7,[\\\"description\\\"]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,1],[14,0,\\\"empty\\\"],[12],[1,[28,[35,4],[\\\"groups.noGroupDescription\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[1,\\\"    \\\"],[10,0],[14,0,\\\"right-rail tabsUI hunt-groups\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"        \\\"],[10,0],[14,0,\\\"button-tabs\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"flex-left\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"button\\\"],[14,0,\\\"btn-tab t-membership-tab active\\\"],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[34,11]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,12],[[33,13],\\\"members\\\"],null],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"membership-content\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"field-section tabsUI\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,14],null,[[\\\"group\\\",\\\"membership\\\"],[[33,7],[33,7,[\\\"membership\\\"]]]]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[1,[28,[35,15],null,[[\\\"group\\\",\\\"class\\\",\\\"selectTab\\\"],[[33,7],\\\"dynamic-rules\\\",[28,[37,5],[[30,0],\\\"selectTab\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,16],[[[6,[39,17],null,[[\\\"isOpen\\\",\\\"headerText\\\",\\\"confirm\\\",\\\"cancel\\\",\\\"size\\\"],[true,[28,[37,4],[\\\"skillgroups.general.title\\\"],null],[28,[37,5],[[30,0],\\\"confirmGeneral\\\"],null],[28,[37,5],[[30,0],\\\"cancelGeneral\\\"],null],\\\"medium\\\"]],[[\\\"default\\\"],[[[[1,\\\"        \\\"],[10,0],[14,0,\\\"field name\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[15,\\\"for\\\",[29,[[36,18],\\\"-skillgroups-name\\\"]]],[14,0,\\\"field-name skillgroup-name\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,4],[\\\"skillgroups.general.name\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[1,[28,[35,19],null,[[\\\"id\\\",\\\"classNames\\\",\\\"type\\\",\\\"value\\\",\\\"maxlength\\\"],[[28,[37,20],[[33,18],\\\"-skillgroups-name\\\"],null],\\\"form-control\\\",\\\"text\\\",[33,21],100]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"field description\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[15,\\\"for\\\",[29,[[36,18],\\\"-skillgroups-description\\\"]]],[14,0,\\\"field-name skillgroup-description\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,4],[\\\"skillgroups.general.description\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[1,[28,[35,22],null,[[\\\"id\\\",\\\"classNames\\\",\\\"value\\\",\\\"rows\\\",\\\"columns\\\",\\\"maxlength\\\"],[[28,[37,20],[[33,18],\\\"-skillgroups-description\\\"],null],\\\"form-control\\\",[33,23],3,100,512]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]]],[]],null]],[],false,[\\\"if\\\",\\\"canEditSkillGroup\\\",\\\"drop-down\\\",\\\"showDropdown\\\",\\\"t\\\",\\\"action\\\",\\\"entity-image\\\",\\\"model\\\",\\\"unless\\\",\\\"isEditing\\\",\\\"groupTypeIcon\\\",\\\"membershipHeader\\\",\\\"eq\\\",\\\"activeTab\\\",\\\"skillgroup-profile/membership-listing\\\",\\\"skillgroup-profile/dynamic-rules\\\",\\\"isShowingGeneralModal\\\",\\\"modal-gux\\\",\\\"elementId\\\",\\\"input\\\",\\\"concat\\\",\\\"modalName\\\",\\\"textarea\\\",\\\"modalDescription\\\"]]\",\"moduleName\":\"web-directory/components/skillgroup-profile/template.hbs\",\"isStrictMode\":false});","import { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@ember/component';\n\nexport default Component.extend({\n    large: false,\n    small: false,\n    lighten: false,\n    classNameBindings: ['large:snail-progress-lg', 'small:snail-progress-sm', 'lighten:snail-progress-light'],\n    classNames: ['snail-progress'],\n\n    clock: service(),\n\n    _activeSegment: -1,\n    activeSegment: computed('clock.second', function () {\n        // Consume clock.second to establish Glimmer autotracking (Ember 3.28 compatibility)\n        this.get('clock.second');\n        let result = this.incrementProperty('_activeSegment');\n        if (result > 2) {\n            result = 0;\n            this.set('_activeSegment', result);\n        }\n        return result;\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"+usk+UiG\",\"block\":\"[[[10,1],[15,0,[29,[\\\"wait-segment \\\",[52,[28,[37,1],[[33,2],0],null],\\\"active\\\"]]]],[12],[13],[1,\\\"\\\\n\\\"],[10,1],[15,0,[29,[\\\"wait-segment \\\",[52,[28,[37,1],[[33,2],1],null],\\\"active\\\"]]]],[12],[13],[1,\\\"\\\\n\\\"],[10,1],[15,0,[29,[\\\"wait-segment \\\",[52,[28,[37,1],[[33,2],2],null],\\\"active\\\"]]]],[12],[13]],[],false,[\\\"if\\\",\\\"eq\\\",\\\"activeSegment\\\"]]\",\"moduleName\":\"web-directory/components/snail-progress/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport { bool } from '@ember/object/computed';\nimport { A } from '@ember/array';\nimport $ from 'jquery';\nimport Component from '@ember/component';\nimport EmberObject, { computed, set, get } from '@ember/object';\nimport { run } from '@ember/runloop';\nimport uuid from 'uuid';\n\nconst STATIONS_URI = 'api/v2/stations';\n\nexport default Component.extend({\n    classNames: ['station-picker-v2'],\n\n    ajax: service(),\n    application: service(),\n    session: service(),\n    phone: service(),\n    store: service(),\n\n    throttleTime: 1000,\n    nextUri: null,\n    prefetchComplete: null,\n    stations: null,\n\n    currentRequest: null,\n    pageAttempts: 0,\n\n    init() {\n        this._super(...arguments);\n        this.prefetch();\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        run.cancel(this.throttleSearch);\n        $(this.scrollEventEl).off();\n    },\n\n    didRender() {\n        this._super(...arguments);\n        const $stationList = this.$('.station-list');\n        if ($stationList.length) {\n            this.attachScrollListener();\n        }\n        this.$('.search-for-stations').trigger('focus');\n    },\n\n    defaultStationNotCurrentStation: computed('defaultStation.id', 'station.id', function () {\n        const defaultStationId = this.get('defaultStation.id');\n        const currentStationId = this.get('station.id');\n        return defaultStationId !== currentStationId;\n    }),\n\n    defaultStationInUse: computed('defaultStation.associatedUser.id', 'session.person.guid', function () {\n        const defaultStationUserId = this.get('defaultStation.associatedUser.id');\n\n        return defaultStationUserId && defaultStationUserId !== this.get('session.person.guid');\n    }),\n\n    hasDefaultStation: bool('defaultStation.id'),\n\n    prefetch() {\n        return this._doFetch().then(() => {\n            this.set('prefetchComplete', true);\n        });\n    },\n\n    filterSearch() {\n        const searchValue = this.searchValue;\n        this._doFetch({ searchValue });\n    },\n\n    fetchNext() {\n        const uri = this.nextUri;\n        return this._doFetch({ uri, push: true });\n    },\n\n    _doFetch(opts) {\n        opts = opts || {};\n        let { searchValue, uri, push } = opts;\n        const baseUrl = this.application.pcV2Uri(STATIONS_URI);\n        const queryParams = new URLSearchParams();\n        let url;\n\n        if (this.get('session.features.TC-351')) {\n            queryParams.append('userSelectable', 'true');\n            if (searchValue) {\n                queryParams.append('name', searchValue);\n            }\n        } else if (searchValue) {\n            queryParams.append('name', `*${searchValue}*`);\n        }\n\n        // If we have a URI, we're refetching the next set of results and should use that URI instead of building one.\n        url = baseUrl + (!uri ? `?${queryParams.toString()}` : uri);\n\n        if (!push) {\n            this.set('stations', A());\n        }\n\n        // When the request resolves, if it doesn't match the current request, it means another request was made later,\n        // so we can ignore the resuls to ensure we don't override latest with previous query results\n        const currentRequest = uuid.v4();\n        this.set('currentRequest', currentRequest);\n\n        return this.ajax.request(url).then(response => {\n            let mappedEntities = [];\n            if (this.currentRequest !== currentRequest) {\n                console.debug('[station-picker]', 'Request cancelled, tossing results.');\n                return;\n            }\n\n            if (this.get('session.features.TC-351')) {\n                // We don't need to filter the results ourselves with TC-351\n                mappedEntities = response.entities;\n            } else {\n                mappedEntities = this._mapStations(response.entities);\n            }\n            this.setNextUri(response);\n            let stations = this.stations;\n\n            if (push) {\n                // Append the next set of results.\n                stations.pushObjects(mappedEntities);\n            } else {\n                this.set('stations', mappedEntities);\n            }\n\n            return this._maybeRefetch(mappedEntities);\n        });\n    },\n\n    // When results come back, we filter out webrtc stations that the user can't actually use, so we may end up with an empty page.\n    // If that happens, just fetch the next page automatically. Ensures we get at least one result on prefetch.\n    // Limit this to 3 attempts so we don't recurse indefinitely forever\n    _maybeRefetch(mappedEntities) {\n        const pageAttempts = this.pageAttempts;\n        if (pageAttempts < 3 && mappedEntities.length === 0) {\n            this.set('pageAttempts', pageAttempts + 1);\n            return this.fetchNext();\n        } else {\n            this.set('pageAttempts', 0);\n        }\n    },\n    _mapStations(entities) {\n        // this is not returning station models, so the webrtc property needs adapted\n        return entities\n            .filter(e => {\n                if (e.type !== 'inin_webrtc_softphone') {\n                    return true;\n                }\n                return e.lineAppearanceId === this.get('session.person.jid').replace('@', '+');\n            })\n            .map(e => {\n                let userId = e.userId;\n                if (userId) {\n                    this.store.find('person', userId).then(person => set(e, 'username', person.get('name')));\n                }\n                set(e, 'persistentConnection', e.webRtcPersistentEnabled);\n                const associated = e.status === 'ASSOCIATED' ? true : false;\n                set(e, 'associated', associated);\n                return e;\n            });\n    },\n\n    setNextUri(response) {\n        // The API will return the next URI, we just need to trim it.\n        if (response.nextUri) {\n            const nextUri = response.nextUri.match(/(\\?.*)$/)[1];\n            this.set('nextUri', nextUri);\n        } else {\n            this.set('nextUri', null);\n        }\n    },\n\n    shouldFetchNextBatch() {\n        let $el = this.$('.station-list');\n        const offset = 50;\n        const scrollHeight = $el.height() + $el.scrollTop();\n        const isNext = this.nextUri;\n        if ($el[0].scrollHeight - scrollHeight < offset && isNext) {\n            this.fetchNext();\n        }\n    },\n\n    attachScrollListener() {\n        let scrollEventEl = '.station-list';\n        let $el = this.$(scrollEventEl);\n        this.set('scrollEventEl', scrollEventEl);\n        return $el.on('scroll', () => {\n            run.throttle(this, 'shouldFetchNextBatch', 1000, false);\n        });\n    },\n\n    selectStation(station, ev) {\n        if (!station || station.associated) {\n            return false;\n        }\n        if (ev && ev.key && ev.key !== 'Enter' && ev.key !== ' ') {\n            return;\n        }\n\n        const stationId = get(station, 'id');\n        const uri = this.application.pcV2Uri(`/api/v2/stations/${stationId}`);\n        this.selectPhone(uri).then(() => {\n            this.closeStationPicker();\n        });\n    },\n\n    actions: {\n        closeStationPicker() {\n            this.closeStationPicker();\n        },\n\n        search() {\n            // TODO: handle other keyup events, down arrow, enter, and so on.\n            this.set('searchValue', this.$('.search-for-stations').val());\n            this.set('throttleSearch', run.throttle(this, 'filterSearch', this.throttleTime, false));\n        },\n\n        selectStation(station, ev) {\n            this.selectStation(station, ev);\n        },\n\n        useDefaultStation(e) {\n            e.preventDefault();\n            const station = EmberObject.create({\n                id: this.get('defaultStation.id'),\n                associated: this.defaultStationInUse\n            });\n\n            this.selectStation(station);\n        }\n    }\n}).reopenClass({ positionalParams: ['defaultStation', 'station'] });\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"OoEt1RYi\",\"block\":\"[[[10,0],[14,0,\\\"search-station-header\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"h3\\\"],[14,0,\\\"change-station-heading phone-label\\\"],[12],[1,[28,[35,0],[\\\"purecloud.station.change\\\"],null]],[13],[1,\\\"\\\\n    \\\"],[10,\\\"button\\\"],[14,0,\\\"btn btn-link close-station-picker\\\"],[15,\\\"title\\\",[28,[37,0],[\\\"common.close\\\"],null]],[15,\\\"onclick\\\",[28,[37,1],[[30,0],\\\"closeStationPicker\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"close-circle\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,\\\"form\\\"],[14,0,\\\"search-station-form\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"input\\\"],[14,0,\\\"form-control search-for-stations\\\"],[15,\\\"aria-label\\\",[29,[[28,[37,0],[\\\"components.stationSearch\\\"],null]]]],[15,\\\"placeholder\\\",[28,[37,0],[\\\"components.stationSearch\\\"],null]],[15,\\\"onkeyup\\\",[28,[37,1],[[30,0],\\\"search\\\"],null]],[14,4,\\\"text\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"search-icon\\\"],[14,\\\"icon-name\\\",\\\"search\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[41,[28,[37,3],[[33,4],[33,5]],null],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"pick-default-station\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,6],[[[1,\\\"                \\\"],[1,[28,[35,0],[\\\"purecloud.station.defaultStationInUse\\\"],[[\\\"station\\\"],[[28,[37,7],[[33,8,[\\\"defaultStationNamePromise\\\"]]],null]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                \\\"],[10,3],[14,6,\\\"#\\\"],[15,\\\"onclick\\\",[28,[37,1],[[30,0],\\\"useDefaultStation\\\"],null]],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,0],[\\\"purecloud.station.useDefaultStation\\\"],[[\\\"station\\\"],[[28,[37,7],[[33,8,[\\\"defaultStationNamePromise\\\"]]],null]]]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13],[1,\\\"\\\\n\\\"],[41,[33,9,[\\\"length\\\"]],[[[1,\\\"    \\\"],[10,\\\"ul\\\"],[14,0,\\\"station-list\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,11],[[28,[37,11],[[33,9]],null]],null],null,[[[1,\\\"            \\\"],[10,\\\"li\\\"],[15,\\\"aria-label\\\",[30,1,[\\\"name\\\"]]],[15,0,[29,[\\\"station\\\\n                    \\\",[52,[30,1,[\\\"associated\\\"]],\\\"station-associated\\\"],\\\"\\\\n                    \\\",[52,[30,1,[\\\"persistentConnection\\\"]],\\\"station-persistent\\\"]]]],[15,\\\"title\\\",[52,[30,1,[\\\"username\\\"]],[28,[37,0],[\\\"purecloud.station.inUseBy\\\"],[[\\\"name\\\"],[[30,1,[\\\"username\\\"]]]]]]],[15,\\\"onclick\\\",[28,[37,1],[[30,0],\\\"selectStation\\\",[30,1]],null]],[15,\\\"onkeydown\\\",[28,[37,1],[[30,0],\\\"selectStation\\\",[30,1]],null]],[14,\\\"tabindex\\\",\\\"0\\\"],[14,\\\"role\\\",\\\"button\\\"],[12],[1,\\\"\\\\n\\\\n                \\\"],[10,0],[14,0,\\\"left-side\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"persistent-call-icon\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,0],[14,0,\\\"phone-spinner\\\"],[12],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"navbar-icon\\\"],[14,\\\"icon-name\\\",\\\"phone\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"station-name\\\"],[12],[1,[30,1,[\\\"name\\\"]]],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"],[41,[30,1,[\\\"associated\\\"]],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"station-status\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,0],[\\\"purecloud.station.status.associated\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,12],[[[1,\\\"    \\\"],[10,1],[14,0,\\\"stations-results-empty\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"phone\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[10,2],[12],[1,[28,[35,0],[\\\"purecloud.station.noResults\\\"],null]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]]],[\\\"station\\\"],false,[\\\"t\\\",\\\"action\\\",\\\"if\\\",\\\"and\\\",\\\"defaultStationNotCurrentStation\\\",\\\"hasDefaultStation\\\",\\\"defaultStationInUse\\\",\\\"await\\\",\\\"phone\\\",\\\"stations\\\",\\\"each\\\",\\\"-track-array\\\",\\\"prefetchComplete\\\"]]\",\"moduleName\":\"web-directory/components/station-picker-v2/template.hbs\",\"isStrictMode\":false});","import { A } from '@ember/array';\nimport Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { warnClosureAction } from 'web-directory/utils/acd';\n\nexport type InputTag<T = any> = {\n    /**\n     * The text to display in the tag itself\n     */\n    text: string;\n    /**\n     * The underlying unique value to determine unique tags\n     */\n    value: string;\n    /**\n     * Additional data context that may need to be stored for use after component\n     */\n    data?: T;\n};\n\nexport default Component.extend({\n    classNames: ['tags-input', 'form-control', 'custom-input'] as const,\n    classNameBindings: ['isSmall:tags-input--small'],\n\n    /**\n     * @attribute\n     *\n     * the placeholder text shown on the input\n     */\n    placeholder: null,\n\n    /**\n     * @attribute\n     *\n     * autofocuses the main input if `true`\n     */\n    autofocus: false,\n\n    /**\n     * @attribute\n     *\n     * The value to render in the tag input as tags\n     */\n    value: A([] as InputTag[]),\n\n    /**\n     * @attribute\n     *\n     * the current value of the search input\n     */\n    searchValue: '',\n\n    /**\n     * @attribute\n     *\n     * class names passed in to be applied to the input tag\n     */\n    inputClasses: '',\n\n    /**\n     * @attribute\n     *\n     * `true` if the user is allowed to add tags that have the same value. This component will\n     * check against the current tags before firing an event to the parent to make sure there\n     * are not other tags that have the same value. It will prevent the event from emitting\n     * if it the value has already been added.\n     */\n    allowSameValueTags: false,\n\n    /**\n     * @attribute\n     *\n     * When a user adds a comma or pastes a string into the input that includes commas, this\n     * will allow the data to be quickly parsed and applied as tags in the input\n     */\n    allowCommaSeparatedParsing: false,\n\n    /**\n     * @attribute\n     *\n     * Applies the text as a label to the tag input for the screenreader.\n     */\n    label: null as string | null,\n\n    /**\n     * @attribute\n     * The size of the tags input\n     */\n    size: 'medium' as 'medium' | 'small',\n\n    isSmall: computed('size', function () {\n        return this.get('size') === 'small';\n    }),\n\n    /**\n     * Reference to the main input\n     */\n    inputRef: undefined as HTMLInputElement | undefined,\n\n    /**\n     * Essentially the value that we need to save in order to get the backspace\n     * hotkey working properly. `true` will allow the last tag to be focused if\n     * the user presses the Backspace key in an empty input. `false` prevents\n     * that from happening.\n     */\n    autofocusTag: false,\n\n    /**\n     * storage for previous search value\n     */\n    oldSearch: null as any,\n\n    /**\n     * Quick reference to the main input's id for querying\n     */\n    inputId: computed('elementId', function () {\n        return `${this.get('elementId')}TagsInput`;\n    }),\n\n    didUpdateAttrs() {\n        this._super(...arguments);\n        const searchValue = this.get('searchValue');\n        if (searchValue || this.get('oldSearch')) {\n            if (!searchValue && searchValue !== this.get('oldSearch')) {\n                this.set('autofocusTag', false);\n                // if the searchValue resets to empty, refocus the input for the user\n                this.focusInput();\n            }\n            this.set('oldSearch', searchValue);\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        const input = this.input();\n        if (input) {\n            input.addEventListener('keyup', this.keyupHandler.bind(this));\n            input.addEventListener('keydown', this.keydownHandler.bind(this));\n            input.addEventListener('input', this.inputHandler.bind(this));\n            input.addEventListener('focus', this.actionInputFocus.bind(this));\n\n            if (this.get('autofocus')) {\n                this.focusInput();\n            }\n\n            if (this.get('inputClasses')) {\n                input.classList.add(this.get('inputClasses'));\n            }\n        }\n    },\n\n    didDestroyElement() {\n        this._super(...arguments);\n        this.input()?.removeEventListener('keyup', this.keyupHandler.bind(this));\n        this.input()?.removeEventListener('keydown', this.keydownHandler.bind(this));\n        this.input()?.removeEventListener('input', this.inputHandler.bind(this));\n        this.input()?.removeEventListener('focus', this.actionInputFocus.bind(this));\n    },\n\n    /**\n     * Grabs a ref to the main input that is being rendered in this component\n     *\n     * @returns either the stored input ref, or the newly found input ref\n     */\n    input(): HTMLInputElement | undefined {\n        let ref = this.get('inputRef');\n        if (ref) {\n            return ref;\n        }\n\n        ref = document.getElementById(this.get('inputId')) as HTMLInputElement | undefined;\n        this.set('inputRef', ref);\n        return ref;\n    },\n\n    /**\n     * Handles the keyup based hotkeys that a user may use while navigating the tags input\n     *\n     * @param event The event emitted from the browser during the keyup event\n     */\n    keyupHandler(event: KeyboardEvent) {\n        if (event.key === 'Backspace') {\n            // we only want to focus a tag if there is NO value in the input.\n            // we want to make sure the input has been found first though.\n            if (this.input() && !this.input()?.value && this.get('autofocusTag')) {\n                const index = this.get('value').length - 1;\n                this.$(`.tag-remove-${index}`).trigger('focus');\n            }\n        }\n\n        // the user can only autofocus a tag if there is no input value.\n        this.set('autofocusTag', !this.input()?.value);\n    },\n\n    /**\n     * Sets the previous value property to the value at the moment pressing the keydown\n     * to set a saved moment to compare the keyup handler to so we know how to handle\n     * the Backspace event on an empty input.\n     *\n     * @param event The event emitted from the browser during the keydown event\n     */\n    keydownHandler(event: KeyboardEvent) {\n        // we want to prevent the user from rapidly deleting the keys while holding down a backspace or delete key\n        if (event.repeat) {\n            this.set('autofocusTag', false);\n        }\n\n        if (event.key === 'Enter') {\n            const value = this.input()?.value.trim();\n            // we only want to invoke the add if there is some sort of input\n            if (value) {\n                // if this component is in a form, without this it will submit the form which\n                // we don't want to do in this use case\n                event.preventDefault();\n\n                if (this.get('allowSameValueTags')) {\n                    this.actionAdd(value);\n                } else {\n                    const exists = this.get('value').find(item => item.value.trim() === value);\n                    if (!exists) {\n                        this.actionAdd(value);\n                    }\n                }\n            } else if (!event.repeat) {\n                this.actionSubmit();\n            }\n        }\n    },\n\n    /**\n     * Handles the users inputs into the main input element. We need to invoke the action\n     * to the parent (if listening), and also parse out a comma separated value if the component\n     * has been configured to do so.\n     * @param event the input event originating from the main html input element\n     */\n    inputHandler(event: Event) {\n        this.actionInputChange(event);\n\n        if (this.get('allowCommaSeparatedParsing')) {\n            const input = this.input();\n            if (input) {\n                const value = input.value.trim();\n                if (value.includes(',')) {\n                    const tags = value.split(',').reduce((arr: string[], current: string) => {\n                        const text = current.trim();\n                        if (text) {\n                            arr.push(text);\n                        }\n                        return arr;\n                    }, []);\n\n                    if (tags.length) {\n                        // we don't want to invoke the change in input if we are parsing the\n                        // input and automically adding the tags here instead.\n                        this.actionBulkAdd(tags);\n                    }\n                }\n            }\n        }\n    },\n\n    /**\n     * Resets the input back to an empty state\n     */\n    resetInput() {\n        const input = this.input();\n        if (input) {\n            input.value = '';\n            this.focusInput();\n        }\n    },\n\n    /**\n     * Quick action with 1 frame timeout to focus the main input\n     */\n    focusInput() {\n        setTimeout(() => this.input()?.focus(), 100);\n    },\n\n    /**\n     * Invoked when the user types while focused on the tag removal button. If the user\n     * presses the backspace button while focused, the tag will be signaled for removal.\n     * Due to the click handler already supporting \"enter\" key presses, we do not need\n     * to set that use case up here.\n     *\n     * @param index the index of the tag to signal for removal\n     * @param event the keyboard event to determine which key is pressed\n     */\n    _tagKeyUp(index: number, event: KeyboardEvent) {\n        // we want to delete a tag if the user presses the `Backspace` button\n        // in addition to the built in \"enter\" press that triggers the buttons click event\n        if (event.key === 'Backspace') {\n            this.actionRemove(index);\n            this.focusInput();\n        }\n    },\n\n    /**\n     * Initiates the signal of removal to the parent component to remove a tag at the index provided.\n     * This will trigger a refocus on the element to provide a seamless experience.\n     *\n     * @param index the index of the tag to remove\n     */\n    _removeTag(index: number) {\n        this.actionRemove(index);\n        this.set('autofocusTag', false);\n        this.focusInput();\n    },\n\n    /**\n     * @action\n     *\n     * Invoked when the user opts to remove a specific tag at an index\n     *\n     * @param index the index of the tag to remove\n     */\n    actionRemove: (index: number) => warnClosureAction('actionRemove', { index }),\n\n    /**\n     * @action\n     *\n     * Invoked when a user wants to add a single tag based on keyboard input\n     *\n     * @param value the value of the tag to emit to the parent\n     */\n    actionAdd: (value: string) => warnClosureAction('actionAdd', { value }),\n\n    /**\n     * @action\n     * @optional this isn't required since not all tag inputs require a submission handler\n     *\n     * Invoked when a user wants to submit the tags input value. This occurs when there\n     * is no value in the input and the user hits enter. If there is a value and the user\n     * hits enter, then the `actionAdd` event will be invoked.\n     */\n    actionSubmit: () => {},\n\n    /**\n     * @action\n     *\n     * Invoked when a user wants to add multiple tags based on keyboard input\n     *\n     * @param value the value of the tag to emit to the parent\n     */\n    actionBulkAdd: (value: string[]) => warnClosureAction('actionBulkAdd', { value }),\n\n    /**\n     * @action\n     * @optional\n     *\n     * An optional closure action to add additional logic to this component that should run\n     * when the main input has been focused. Defaults to a no-op\n     *\n     * Note: If not setupm we do not need to warn the user about the missing closure action\n     * since this is an optional feature of the component. It is not required for the component\n     * to function properly.\n     */\n    actionInputFocus: () => undefined,\n\n    /**\n     * @action\n     * @optional\n     *\n     * An optional closure action to add additional logic to this component that will be invoked\n     * when the main input has it's value changed. Defaults to a no-op.\n     *\n     * @param value the value of the input\n     */\n    actionInputChange: (_event: Event) => undefined,\n\n    actions: {\n        /**\n         * Invoked when the user clicks on the removal button tied to a corresponding tag. The index\n         * provided will be the tag that gets removed.\n         *\n         * @param index the index of the tag to remove\n         */\n        onRemoveTag(index: number) {\n            this._removeTag(index);\n        },\n\n        /**\n         * Invoked when the user uses the keyboard while focused on a tag remove button. We need this to\n         * affect the keyup event because if we use keydown, it will try and remove all of the tags very quickly\n         * whereas the keyup forces the user to release key first before we detect another removal\n         *\n         * @param index the index of the tag button being evented on\n         * @param event the browser event data\n         */\n        onTagKeyUp(index: number, event: KeyboardEvent) {\n            this._tagKeyUp(index, event);\n        }\n    }\n});\n","import Component from '@ember/component';\n\ntype Color = 'blue' | 'dark-blue' | 'gse-custom-accent-2';\n\nexport default Component.extend({\n    classNames: ['tags-input-label'] as const,\n    attributeBindings: ['color'] as const,\n\n    /**\n     * @attribute\n     * The main color of the tag\n     */\n    color: 'blue' as Color\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"c7VyZ4FW\",\"block\":\"[[[10,2],[15,0,[29,[\\\"tags-input__tag \\\",[52,[33,1],\\\"icon-tag\\\"]]]],[12],[1,\\\"\\\\n\\\"],[41,[33,1],[[[1,\\\"        \\\"],[18,1,null],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[10,\\\"gux-truncate\\\"],[14,\\\"max-lines\\\",\\\"1\\\"],[12],[1,\\\"\\\\n            \\\"],[18,1,null],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[13]],[\\\"&default\\\"],false,[\\\"if\\\",\\\"icon\\\",\\\"yield\\\"]]\",\"moduleName\":\"web-directory/components/tags-input/label/template.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"3b/9j7Es\",\"block\":\"[[[10,\\\"gux-icon\\\"],[14,0,\\\"tags-input__search-icon\\\"],[14,\\\"icon-name\\\",\\\"search\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\\n\\\"],[42,[28,[37,1],[[28,[37,1],[[33,2]],null]],null],null,[[[1,\\\"    \\\"],[10,0],[14,0,\\\"tags-input__tag\\\"],[14,\\\"removable\\\",\\\"true\\\"],[14,\\\"accent\\\",\\\"default\\\"],[12],[1,\\\"\\\\n        \\\"],[10,2],[14,0,\\\"tags-input__tag-text\\\"],[15,\\\"title\\\",[30,1,[\\\"text\\\"]]],[12],[1,\\\"\\\\n            \\\"],[1,[30,1,[\\\"text\\\"]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"button\\\"],[15,0,[29,[\\\"tags-input__tag-remove \\\",[28,[37,3],[\\\"tag-remove-\\\",[30,2]],null]]]],[15,\\\"onclick\\\",[28,[37,4],[[30,0],\\\"onRemoveTag\\\",[30,2]],null]],[15,\\\"onkeydown\\\",[28,[37,4],[[30,0],\\\"onTagKeyUp\\\",[30,2]],null]],[15,\\\"aria-label\\\",[28,[37,3],[[28,[37,5],[\\\"common.remove\\\"],null],\\\" \\\",[30,1,[\\\"text\\\"]]],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"tags-input__tag-remove-icon\\\"],[14,\\\"icon-name\\\",\\\"close\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[1,2]],null],[1,\\\"\\\\n\\\"],[10,\\\"label\\\"],[14,0,\\\"sr-only\\\"],[15,\\\"for\\\",[36,6]],[12],[1,\\\"\\\\n    \\\"],[1,[28,[35,5],[[33,7]],null]],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,\\\"input\\\"],[14,0,\\\"tags-input__input\\\"],[15,2,[36,8]],[15,1,[36,6]],[15,\\\"placeholder\\\",[36,9]],[14,4,\\\"text\\\"],[12],[13]],[\\\"tag\\\",\\\"index\\\"],false,[\\\"each\\\",\\\"-track-array\\\",\\\"value\\\",\\\"concat\\\",\\\"action\\\",\\\"t\\\",\\\"inputId\\\",\\\"label\\\",\\\"searchValue\\\",\\\"placeholder\\\"]]\",\"moduleName\":\"web-directory/components/tags-input/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed, get, set } from '@ember/object';\nimport { debounce, later, throttle } from '@ember/runloop';\nimport { inject } from '@ember/service';\nimport { GENESYS_SEARCH_TAB } from 'web-directory/services/phone-integrations';\nimport { Maybe } from 'web-directory/types';\nimport { warnClosureAction } from 'web-directory/utils/acd';\nimport LoggerMixin from '../../mixins/logger';\nimport { createBaseFilters, createExternalContactsFilter } from './data';\nimport { baseStoreConfig } from './data/filter-store-config.const';\nimport { FilterStoreConfig, FilterType, Filters, PaginationOptions } from './types';\n\n/**\n * The key used to store and retrieve the last filter selected so we can\n * save where the user last left off for ease\n */\nconst FILTER_KEY = 'interactions.conversationFilterKey';\n\n/**\n * The time spacing we would like to ensure when we throttle logic.\n * Mainly used for when the user interacts with the target-dropdown and we need\n * to make sure their selection doesn't get call twice in sucession.\n */\nconst ThrottleSpacing = 500;\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['target-dropdown'] as const,\n    classNameBindings: ['hideHeader:no-header', 'removeWrapperStyling:no-wrapper', 'removePadding'] as const,\n\n    session: inject('session'),\n\n    /**\n     * The store service to fetch data from\n     */\n    store: inject('store'),\n\n    /**\n     * The permissions to determine current user permissions with\n     */\n    permissions: inject('permissions'),\n\n    /**\n     * The preferences service to save the users filter preferences within this component\n     */\n    preferences: inject('preferences'),\n\n    /**\n     * Logger service for console logs, warns, and errors that are intended to keep\n     */\n    logger: inject('stashLogger'),\n\n    /**\n     * Used to fetch integration presence for users\n     */\n    integrationsPresenceSvc: inject('integrations-presence'),\n\n    /**\n     * @attribute\n     *\n     * The currently authenticated user\n     */\n    authUser: null,\n\n    /**\n     * @attribute\n     *\n     * The type of the current interaction this component is being used for if applicable\n     */\n    interaction: null as Maybe<any>,\n\n    /**\n     * @attribute\n     *\n     * All of the current participants apart of the conversation\n     */\n    participants: [],\n\n    /**\n     * @attribute\n     *\n     * Array of participant ids to compare available elements to\n     */\n    activeParticipantIds: [],\n\n    /**\n     * @attribute\n     *\n     * The integration key of the conversation.\n     */\n    integrationKey: GENESYS_SEARCH_TAB,\n\n    /**\n     * @attribute\n     *\n     * The header of the component\n     */\n    header: 'components.modal.header',\n\n    /**\n     * @attribute\n     *\n     * `true` if the back button should be shown instead of the header\n     */\n    showBack: false,\n\n    /**\n     * @attribute\n     *\n     * The translation key for the back button.\n     */\n    backText: 'components.modal.back',\n\n    /**\n     * @attribute\n     *\n     * `true` if the header should be hidden due to search values and context happening\n     * outside of the component. Main intent was for outbound conversations. This will\n     * hide the title and the search bar.\n     */\n    hideHeader: false,\n\n    /**\n     * @attribute\n     *\n     * Icon to show in the add button to the right of the search bar\n     */\n    addButtonIcon: 'add',\n\n    /**\n     * @attribute\n     *\n     * Tooltip text to show when hovering over the add button to the right of the search bar\n     */\n    addButtonTooltip: 'purecloud.acdInteraction.conversation.addToConversation',\n\n    /**\n     * @attribute\n     *\n     * `true` if we choose to fetch queues that the current user is member of only\n     */\n    myQueuesOnly: false,\n\n    /**\n     * @attribute\n     *\n     * Text to display in the search placeholder\n     */\n    searchPlaceholderText: 'purecloud.searchEntryWithQueueSentenceCase',\n\n    /**\n     * @attribute\n     *\n     * `true` if the user is able to add a target based on the raw input of the search bar.\n     * `false` will hide the \"add button\" as well as disable the ability to press \"enter\" on\n     * the searchbar.\n     */\n    allowRawInputSelection: true,\n\n    /**\n     * @attribute\n     *\n     * Indicates what filters should be active in this dropdown.\n     * If empty, it will allow all of the possible filters based on the\n     * base filters and any permission gated filters.\n     *\n     * Note: If both the `includeFilters` and `excludeFilters` have the same value(s),\n     * `excludeFilters` will take priority of the two configurations.\n     */\n    includeFilters: [] as FilterType[],\n\n    /**\n     * @attribute\n     *\n     * Indicates what filters should be excluded from this dropdown.\n     * This dropdown will show all of the filters from the include filters,\n     * unless listed in this `excludeFilters` array.\n     *\n     * Note: If both the `includeFilters` and `excludeFilters` contains the same value(s),\n     * `excludeFilters` will take priority of the two configurations.\n     */\n    excludeFilters: [] as FilterType[],\n\n    /**\n     * @attribute\n     *\n     * removes the styling applied to the component that makes it appear as it's own dropdown\n     * component such as the border, shadow, and arrows.\n     */\n    removeWrapperStyling: false,\n\n    /**\n     * @attribute\n     * `true` if this component needs to remove it's padding throughout the context. This  may\n     * need to be `true` if the container that is rendering it does not have built in padding.\n     *\n     * @note\n     * This component was initially built without gux context, when implementing it with a\n     * `gux-popover` component, we needed to remove the initial padding the component was once\n     * responsible for. However, there are renditions of the component that still require it to\n     * manage it's own padding.\n     */\n    removePadding: false,\n\n    /**\n     * @attribute\n     * Additional permissions that need to be appended to the auto-assigned permissions determined\n     * from the interaction type.\n     *\n     * @example digital consult requires an additional check for `internalMessaging` permissions\n     * on top of the basic permission tied to the digital conversation being consulted on.\n     */\n    additionalPermissions: [] as string[],\n\n    /**\n     * @attribute\n     * `true` if the permissions should be bypassed for the current user\n     */\n    bypassPermissions: false,\n\n    /**\n     * The current search input value\n     */\n    searchValue: '',\n\n    /**\n     * `true` if the search value is a valid number to call\n     */\n    searchValueIsValid: computed('searchValue', function () {\n        return !!this.get('searchValue').trim();\n    }),\n\n    /**\n     * `true` if user can search outside division\n     */\n    divisionAgnostic: computed.readOnly('permissions.canTargetQueueSearchOutsideOfDivision'),\n\n    // feature toggle for PURE-3835 division aware external contacts\n    acdExternalContactDivNameFT: computed.readOnly('session.features.PURE-3835'),\n\n    /**\n     * `true` if the digital consult feature flag is enabled\n     */\n    digitalConsultEnabled: computed.readOnly('session.features.PURE-5007_digitalConsult'),\n\n    /**\n     * @Attribute\n     * FT for warm conferencing feature\n     */\n    acdWarmConferencePhase1FT: computed.readOnly('session.features.PURE-7349_acdConferenceMS3-phase-1'),\n\n    /**\n     *\n     * @attribute\n     *\n     * Actual value is passed down to the target-dropdown component\n     */\n    conversationHasActiveParticipants: false,\n\n    /**\n     * `true` if the search bar has a value so we need to show the content\n     * We want to wait for the search debounce too before showing anything.\n     */\n    _showContent: false,\n\n    /**\n     * The currently active filter\n     */\n    activeFilter: 'all' as FilterType,\n\n    /**\n     * The available filters to render in the view\n     */\n    filters: {},\n\n    /**\n     * The current filter count that will display in the filter tab bar\n     */\n    filterCount: computed('filters', function () {\n        return Object.keys(this.get('filters')).length;\n    }),\n\n    /**\n     * The configurations for each filters store\n     */\n    storeConfig: baseStoreConfig,\n\n    /**\n     * The data available from the search and filters\n     */\n    searchResults: undefined,\n\n    /**\n     * The current total elements of data given the current filters and search\n     */\n    totalElements: computed('activeFilter', 'searchResults', function () {\n        const activeFilter: FilterType = this.get('activeFilter');\n        if (!activeFilter) {\n            return 0;\n        }\n\n        return this.get(`filters.${activeFilter}.totalElements`);\n    }),\n\n    /**\n     * @attribute\n     * Allows user to transfer call to another user's voicemail\n     */\n    showDirectTransferToVoicemailDropdown: false,\n\n    /**\n     * The current options of the results\n     */\n    pagination: {\n        pageNumber: 1,\n        pageSize: 10\n    } as PaginationOptions,\n\n    /**\n     * `true` if the infinite scroll should be disabled for any reason\n     */\n    disableInfiniteScroll: computed('activeFilter', 'searchResults', 'totalElements', function () {\n        const activeFilter: FilterType = this.get('activeFilter');\n        // the aggregate data of all the columns wouldn't organize correctly with infinite scroll\n        if (activeFilter === 'all') {\n            return true;\n        }\n\n        // if the current result count is equal to the total elements then we fetched them all\n        const searchResults = this.get('searchResults');\n        const totalElements = this.get('totalElements');\n        if (searchResults.length >= totalElements) {\n            return true;\n        }\n\n        return false;\n    }),\n\n    /**\n     * `true` if there is data loading in result of the infinite scrolling\n     */\n    infiniteScrollLoading: false,\n\n    /**\n     * storage for previous search value\n     */\n    oldSearch: null as any,\n\n    /**\n     * Array of permissions that are required for an agent/person to have in order to be\n     * selected in the dropdown based on the interaction currently selected\n     */\n    requiredPersonPermissions: computed(\n        'interaction.{type,subMessageType}',\n        'bypassPermissions',\n        'additionalPermissions',\n        function () {\n            const interaction = this.get('interaction');\n            if (!interaction || this.get('bypassPermissions')) return [];\n\n            const type = get(interaction, 'type');\n\n            const permissions: string[] = [];\n            switch (type) {\n                case 'email':\n                    permissions.push('conversation:email:accept');\n                    break;\n                case 'chat':\n                    permissions.push('conversation:webchat:accept');\n                    break;\n                case 'message':\n                    permissions.push('conversation:message:accept');\n\n                    const subType = get(interaction, 'subMessageType');\n                    if (subType === 'webmessaging') {\n                        permissions.push('conversation:webmessaging:accept');\n                    }\n                    break;\n                case 'call':\n                    permissions.push('conversation:call:accept');\n                    break;\n                case 'callback':\n                    permissions.push('conversation:callback:accept');\n                    break;\n            }\n\n            const additionalPermissions = this.get('additionalPermissions');\n            if (additionalPermissions?.length) {\n                permissions.push(...additionalPermissions);\n            }\n\n            return permissions;\n        }\n    ),\n\n    init() {\n        this._super(...arguments);\n        this.setFilters();\n\n        // If we do not have the header being shown, then we should show the content\n        if (this.get('hideHeader')) {\n            this.set('_showContent', true);\n        }\n    },\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n        const searchValue = this.get('searchValue');\n\n        if (searchValue && (!this.get('oldSearch') || searchValue !== this.get('oldSearch'))) {\n            debounce(this, this.fetchDataByFilter, 500);\n            this.set('oldSearch', searchValue);\n        }\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        // make sure to focus on the search bar when opening. sometimes the `autofocus` attr doesn't work\n        if (!this.get('hideHeader')) {\n            later(this, () => this.$('.search-container #searchInput')?.trigger('focus'), 100);\n        }\n    },\n\n    /**\n     * Determines if any additional filters can be added\n     */\n    async setFilters(this: any) {\n        const baseFilters = createBaseFilters();\n        const externalContactsFilter = createExternalContactsFilter();\n        let filters: Filters = {};\n\n        if (this.includeFilters.length > 0 || this.excludeFilters.length > 0) {\n            for (const [key, value] of Object.entries(baseFilters)) {\n                if (this.isFilterAvailable(key)) {\n                    filters[key as FilterType] = value;\n                }\n            }\n        } else {\n            filters = baseFilters;\n        }\n\n        const relatePermission: string = this.get('permissions.hasExternalContactsViewContactAccess');\n        if (relatePermission && this.isFilterAvailable(externalContactsFilter.value)) {\n            filters[externalContactsFilter.value] = externalContactsFilter;\n        }\n\n        this.set('filters', filters);\n\n        if (Object.keys(filters).length === 0) {\n            console.warn('No filters are available given the current configurations of the component');\n            this.set('activeFilter', null);\n        } else {\n            const savedFilter = await this.get('preferences').getPreference(FILTER_KEY);\n            if (savedFilter && this.filters[savedFilter]) {\n                this.set('activeFilter', savedFilter);\n            } else {\n                this.set('activeFilter', Object.keys(filters)[0]);\n            }\n        }\n    },\n\n    /**\n     * Determines if a filter key should be displayed in the dropdown based on the available filters configured\n     *\n     * @param key the filter type key to check against\n     * @returns boolean value depicting if the filter should be available\n     */\n    isFilterAvailable(key: FilterType) {\n        return (\n            (this.includeFilters.length === 0 || this.includeFilters.includes(key)) &&\n            !this.excludeFilters.includes(key)\n        );\n    },\n\n    /**\n     * Fetches the corresponding data to render based on user input\n     */\n    async fetchDataByFilter(this: any) {\n        if (this.get('isDestroyed') || this.get('isDestroying')) return;\n\n        const search: string = this.get('searchValue');\n        // we only want to show the content if there is a search value and AFTER the debounce\n        this.set('_showContent', !!search || this.get('hideHeader'));\n        this.set('searchResults', undefined);\n        this.resetInfiniteScroll();\n\n        const activeFilter: FilterType = this.get('activeFilter');\n\n        let allTotalElements = 0;\n        const allContent = [];\n\n        for (const key of Object.keys(this.filters)) {\n            // There isn't any data tied to 'all'. Instead we will take every other key\n            if (key === 'all') continue;\n\n            const config = this.get(`storeConfig.${key}`);\n            if (config && this.get('_showContent')) {\n                let pagination = null;\n                if (key === 'queue') {\n                    pagination = config.options(search, {\n                        divisionAgnostic: this.get('divisionAgnostic') ? true : false,\n                        myQueuesOnly: this.get('myQueuesOnly') ? true : false,\n                        workitemDivisionId: this.interaction.workitem?.division?.id\n                    });\n                } else {\n                    pagination = config.options(search);\n                }\n\n                const { totalElements, content } = await this.fetchData(key, config.store, pagination);\n\n                allTotalElements += totalElements;\n                if (activeFilter === 'all' || activeFilter === key) {\n                    // only set the pagination if we want to save it for infinite scroll\n                    this.set('pagination', pagination);\n\n                    if (content?.length > 0) {\n                        allContent.push(...content);\n                    }\n                }\n            } else {\n                // reset the total elements if we are not showing the content\n                this.set(`filters.${key}.totalElements`, 0);\n            }\n        }\n\n        if (this.get('filters.all')) {\n            this.set('filters.all.totalElements', allTotalElements);\n        }\n        this.set('searchResults', allContent.sort(this.sortSearchResults));\n    },\n\n    /**\n     * Reusable sorting function to sort any new search results that are fetched\n     */\n    sortSearchResults(a: any, b: any) {\n        const aName = get(a, 'name');\n        const bName = get(b, 'name');\n        if (aName > bName) return 1;\n        else if (aName < bName) return -1;\n        return 0;\n    },\n\n    /**\n     * Fetches the data corresponding to the information provided\n     * @param key The key to fetch the data for\n     * @param store The store collection to fetch the data from\n     * @param options Additional config to adjust the returned results\n     */\n    async fetchData(this: any, key: string, store: string, options: any) {\n        let totalElements = 0;\n        let content = [];\n\n        try {\n            const data = await this.get('store').query(store, options);\n            // Ember Data 3.28: RecordArray is directly iterable, not wrapped in .content\n            content = data.toArray ? data.toArray() : Array.from(data);\n\n            // Access meta from RecordArray\n            const meta = data.meta;\n            if (meta) {\n                totalElements = meta.total ?? meta.totalElements ?? meta.pageCount ?? 0;\n            }\n        } catch (error) {\n            this.get('logger').error('There was an issue fetching the data', error);\n            totalElements = 0;\n        }\n\n        this.set(`filters.${key}.totalElements`, totalElements);\n        if (key === 'user') {\n            const userIds = content.map((c: any) => c.id);\n            if (userIds.length > 0) {\n                let userResults = await this.get('store').findMany('person', userIds);\n                try {\n                    // if integration presence lookup fails, we still return the users\n                    userResults = await this.get('integrationsPresenceSvc').alterUsersWithIntegration(userResults);\n                } catch (error) {\n                    this.get('logger').error(\n                        '<target-dropdown> There was an issue fetching integration presence',\n                        error\n                    );\n                }\n                return {\n                    totalElements,\n                    content: [...userResults]\n                };\n            }\n        }\n\n        return {\n            totalElements,\n            content: content.map((c: any) => {\n                const record = c.getRecord ? c.getRecord() : c;\n                set(record, 'type', key);\n                return record;\n            })\n        };\n    },\n\n    /**\n     * @attribute\n     * Method passed as a prop. If not passed, we warn.\n     * @param data\n     */\n    transferToVoicemailClick(data: any) {\n        warnClosureAction('transferToVoicemailClick', data);\n    },\n\n    /**\n     * Fetches the next data with the corresponding active filters and options\n     */\n    async fetchNextData(this: any) {\n        if (this.get('infiniteScrollLoading')) return;\n        this.set('infiniteScrollLoading', true);\n\n        const nextContent: any[] = [];\n        const activeFilter: FilterType = this.get('activeFilter');\n        const config: FilterStoreConfig = this.get(`storeConfig.${activeFilter}`);\n\n        // we don't support infinite scroll for the `all` key\n        if (config) {\n            const pagination = this.get('pagination');\n            pagination.pageNumber++;\n            this.set('pagination', pagination);\n\n            const { content } = await this.fetchData(activeFilter, config.store, pagination);\n\n            if (content?.length > 0) {\n                nextContent.push(...content);\n            }\n\n            const currentResults = this.get('searchResults');\n            this.set('searchResults', [...currentResults, ...nextContent.sort(this.sortSearchResults)]);\n        }\n\n        this.set('infiniteScrollLoading', false);\n    },\n\n    /**\n     * Resets the infinite scroll properties\n     */\n    resetInfiniteScroll() {\n        this.set('pagination', {\n            pageNumber: 0,\n            pageSize: 0,\n            sortOrder: 'ASC'\n        });\n        this.set('infiniteScrollLoading', false);\n    },\n\n    /**\n     * @Action\n     * Closure action passed to the component to be invoked at the parent level\n     *\n     * @param {object} data The data selected by the user\n     */\n    actionSelected(data: any, integrationKey: string) {\n        this.get('logger').warn('Selected closure action has not been setup for this component', {\n            data,\n            integrationKey\n        });\n    },\n\n    /**\n     * @Action\n     * Closure action passed to the component to be invoked at the parent level\n     */\n    actionBack() {\n        this.get('logger').warn('Back closure action has not been set up for this component');\n    },\n\n    actions: {\n        /**\n         * Invoked when the user selects a contact in the list\n         * @param data The data that was selected\n         */\n        onDataRowSelected(data: any) {\n            throttle(this, this.actionSelected, data, this.get('integrationKey'), ThrottleSpacing);\n        },\n\n        /**\n         * Invoked when the user selects the back button if available\n         */\n        onBack() {\n            this.actionBack();\n        },\n\n        /**\n         * Invoked when the user opts to add just the raw number in the search input\n         */\n        onNumberSelected() {\n            throttle(\n                this,\n                this.actionSelected,\n                { phoneNumber: this.get('searchValue') },\n                this.get('integrationKey'),\n                ThrottleSpacing\n            );\n        },\n\n        /**\n         * Invoked when the user inputs into the search bar\n         * @param event The HTMLInputEvent\n         */\n        onSearchChange(event: any) {\n            this.set('searchValue', event.target?.value);\n            debounce(this, this.fetchDataByFilter, 500);\n        },\n\n        /**\n         * Invoked when the user selects the clear button in the search bar\n         */\n        onClearSearch(this: any) {\n            this.set('searchValue', '');\n            for (const key of Object.keys(this.get('filters'))) {\n                this.set(`filters.${key}.totalElements`, undefined);\n            }\n\n            this.fetchDataByFilter();\n            $('.target-dropdown #searchInput').trigger('focus');\n        },\n\n        /**\n         * Invoked when a filter option is selected and filters the\n         * @param value The new filter value to filter the data by\n         */\n        onFilterChange(this: any, value: string) {\n            this.set('activeFilter', value);\n            this.get('preferences').setPreference(FILTER_KEY, value);\n            this.fetchDataByFilter();\n\n            if (!this.get('searchValue')) {\n                $('.target-dropdown #searchInput').trigger('focus');\n            }\n        },\n\n        /**\n         * Invoked when the infinite scroll event has been emitted\n         */\n        onInfiniteScroll() {\n            this.fetchNextData();\n        }\n    }\n});\n","import { ConversationSummaryConfig } from '../types';\n\nexport const ConversationSummaryConfigData: ConversationSummaryConfig = {\n    call: {\n        icon: 'phone',\n        enabled: true\n    },\n    callback: {\n        icon: 'phone-callback',\n        enabled: true\n    },\n    chat: {\n        icon: 'chat',\n        enabled: true\n    },\n    email: {\n        icon: 'message-email',\n        enabled: true\n    },\n    message: {\n        icon: 'sms',\n        enabled: true\n    },\n    socialExpression: {\n        icon: 'web',\n        enabled: true\n    },\n    video: {\n        icon: 'video',\n        enabled: true\n    },\n    voice: {\n        icon: 'phone-voice',\n        enabled: true\n    }\n};\n","import { Filter, Filters } from '../types';\n\nexport const createBaseFilters = (): Filters => ({\n    all: {\n        icon: 'menu',\n        value: 'all',\n        label: 'purecloud.acdInteraction.conversation.allCount',\n        totalElements: undefined\n    },\n    user: {\n        icon: 'user',\n        value: 'user',\n        label: 'purecloud.acdInteraction.conversation.usersCount',\n        totalElements: undefined\n    },\n    queue: {\n        icon: 'timeline',\n        value: 'queue',\n        label: 'purecloud.acdInteraction.conversation.queuesCount',\n        totalElements: undefined\n    }\n});\n\nexport const createExternalContactsFilter = (): Filter => ({\n    icon: 'user-contact-id',\n    value: 'external',\n    label: 'purecloud.acdInteraction.conversation.externalContactsCount',\n    totalElements: undefined\n});\n","import { FilterStoreConfig } from '../types';\n\nconst searchAll = '*';\n\nexport const baseStoreConfig: { [key: string]: FilterStoreConfig } = {\n    user: {\n        store: 'public-api-user',\n        options: (search: string) => ({\n            query: search\n                ? [\n                      {\n                          value: search,\n                          type: 'QUERY_STRING'\n                      }\n                  ]\n                : undefined,\n            pageNumber: 1,\n            pageSize: 10,\n            sortBy: 'name',\n            sortOrder: 'ASC'\n        })\n    },\n    queue: {\n        store: 'queue',\n        options: (\n            search: string,\n            props: {\n                divisionAgnostic: boolean;\n                myQueuesOnly: boolean;\n                workitemDivisionId: string;\n            }\n        ) => ({\n            name: `**${search ? search : searchAll}**`,\n            pageNumber: 1,\n            pageSize: 10,\n            sortBy: 'name',\n            sortOrder: 'ASC',\n            ...props\n        })\n    },\n    external: {\n        store: 'externalcontacts/contact',\n        options: (search: string) => ({\n            pageNumber: 1,\n            pageSize: 10,\n            expandField: 'externalOrganization,division',\n            searchTerm: `${search}`\n        })\n    }\n};\n","export * from './filter-data.const';\nexport * from './filter-store-config.const';\nexport * from './conversation-summary-config.const';\n","import Component from '@ember/component';\nimport LoggerMixin from '../../../mixins/logger';\nimport { warnClosureAction } from 'web-directory/utils/acd';\nimport { Maybe } from 'web-directory/types';\nimport { computed } from '@ember/object';\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['interaction-conference-filter'],\n    classNameBindings: ['isActive:active'],\n\n    /**\n     * @attribute\n     *\n     * The name of the icon to display using `gux-icon`\n     */\n    icon: '',\n\n    /**\n     * @attribute\n     *\n     * The value that the filter emits when selected\n     */\n    value: '',\n\n    /**\n     * @attribute\n     *\n     * Additional text to identify the filter on hover of the button.\n     * If not provided then no label will be shown.\n     */\n    label: null as Maybe<string>,\n\n    /**\n     * @attribute\n     *\n     * The total amount of records corresponding to this filter\n     */\n    totalElements: 0,\n\n    /**\n     * @attribute\n     *\n     * `true` if this is the currently active filter\n     */\n    isActive: false,\n\n    /**\n     * The max number to be displayed in the filter counter\n     */\n    maxCount: 99,\n\n    tooltipId: computed('elementId', function () {\n        return `${this.get('elementId')}-target-dropdown-filter`;\n    }),\n\n    /**\n     * @action\n     *\n     * Closure action passed from parent\n     */\n    actionFilterChange: (value: string) => warnClosureAction('filterChange', value),\n\n    actions: {\n        /**\n         * Invoked with new value when filter has been selected\n         * @param value The value to emit\n         */\n        onFilterChange(value: string) {\n            this.actionFilterChange(value);\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"YeJVCoK9\",\"block\":\"[[[10,\\\"button\\\"],[15,1,[36,0]],[15,0,[29,[\\\"filter-button-\\\",[36,1]]]],[15,\\\"aria-label\\\",[36,2]],[15,\\\"onclick\\\",[28,[37,3],[[30,0],\\\"onFilterChange\\\",[33,1]],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"gux-icon\\\"],[15,\\\"icon-name\\\",[29,[[36,4]]]],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"record-count\\\"],[15,\\\"title\\\",[29,[[36,5]]]],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,7],[[33,5],[27]],null],[[[1,\\\"            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,8],[[33,5],[33,9]],null],[[[1,\\\"            \\\"],[10,2],[14,0,\\\"max-count\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,10],[\\\"purecloud.acdInteraction.conferencing.maxFilterCount\\\"],[[\\\"count\\\"],[[33,9]]]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[10,2],[14,0,\\\"count\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[34,5]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"]],[]]]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,2],[[[1,\\\"    \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[36,0]],[12],[1,\\\"\\\\n        \\\"],[1,[34,2]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[],false,[\\\"tooltipId\\\",\\\"value\\\",\\\"label\\\",\\\"action\\\",\\\"icon\\\",\\\"totalElements\\\",\\\"if\\\",\\\"eq\\\",\\\"gt\\\",\\\"maxCount\\\",\\\"t\\\"]]\",\"moduleName\":\"web-directory/components/target-dropdown/filter/template.hbs\",\"isStrictMode\":false});","import Ember from 'ember';\nimport { getOwner } from '@ember/application';\nimport Component from '@ember/component';\nimport { computed, set } from '@ember/object';\nimport { run } from '@ember/runloop';\nimport { inject } from '@ember/service';\nimport { Maybe } from 'web-directory/types';\nimport { warnClosureAction } from 'web-directory/utils/acd-ts';\nimport LoggerMixin from '../../../../mixins/logger';\nimport { ConversationSummaryType } from '../../types';\n\ntype ContactPointType = {\n    type: string;\n    address: string;\n    displayValue: string;\n    acceptsSMS?: boolean;\n    action: string;\n};\n\ninterface ExternalContact extends Ember.Object {\n    id: string;\n    schemaTitle?: string;\n}\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['data-row', 'external-contact-row'],\n\n    addressformat: inject('addressformat'),\n    intl: inject('intl'),\n    stashLogger: inject('stash-logger'),\n\n    /**\n     * @attribute\n     *\n     * The external contact data to base the data row information on\n     * TODO - this should be a real type\n     */\n    externalContact: null as Maybe<ExternalContact>,\n\n    /**\n     * @attribute\n     *\n     * `false` if the element cannot be interacted with\n     */\n    interactable: true as boolean,\n\n    /**\n     * @attribute\n     *\n     * The type of the current interaction this component is being used for if applicable\n     */\n    interactionType: null as Maybe<ConversationSummaryType>,\n\n    /**\n     * @attribute\n     *\n     * FT for external contact division labels\n     */\n    acdExternalContactDivNameFT: false,\n\n    /**\n     * `true` if the element should be rendered as readonly without any button click interactions. This should not affect the row's action buttons (e.g. \"Show Menu\"/\"View Profile\" buttons)\n     */\n    readOnly: computed(\n        'interactionType',\n        'showMoreMenu',\n        'emails.[]',\n        'email',\n        'phoneNumbers.[]',\n        'phoneNumberDisplay',\n        function (this: any) {\n            const type = this.get('interactionType') as ConversationSummaryType;\n            if (this.get('showMoreMenu')) return true;\n            switch (type) {\n                case 'email':\n                    return !this.get('email');\n                default:\n                    return !this.get('phoneNumberDisplay');\n            }\n        }\n    ),\n\n    /**\n     * The name of the external contact to display\n     */\n    name: computed.readOnly('externalContact.name'),\n\n    smsTooltipId: computed('elementId', function () {\n        return `${this.get('elementId')}-external-contact-row-accept-sms`;\n    }),\n\n    /**\n     * The external contacts schema title to display\n     */\n    schemaTitle: null as Maybe<string>,\n\n    /**\n     * The array of possible title options for an external contact. Defaults to 'External Contact' if neither are present.\n     */\n    titles: computed('schemaTitle', 'organizationName', function () {\n        const options = [];\n        const externalContact = this.get('intl').t('purecloud.acdInteraction.conferencing.external-contact');\n\n        if (this.get('schemaTitle')) options.push(this.get('schemaTitle'));\n        if (this.get('organizationName')) options.push(this.get('organizationName'));\n        options.push(externalContact);\n        return options;\n    }),\n\n    /**\n     * The first option for the title of an external contact\n     */\n    primaryTitle: computed('titles', function () {\n        if (this.get('titles').length) return this.get('titles')[0];\n    }),\n\n    /**\n     * The second title option (if applicable) of an external contact\n     */\n    secondaryTitle: computed('titles', function () {\n        return this.get('titles').length > 1 ? this.get('titles')[1] : null;\n    }),\n\n    /**\n     * The contacts formatted address\n     */\n    address: computed('externalContact.address', function () {\n        const address: any = this.get('externalContact.address');\n        const value = [];\n        if (address) {\n            if (address.address1) {\n                value.push(address.address1);\n            }\n            if (address.address2) {\n                value.push(address.address2);\n            }\n            if (address.city) {\n                value.push(address.city);\n            }\n            if (address.state || address.postalCode) {\n                value.push(`${address.state} ${address.postalCode}`.trim());\n            }\n            if (address.countryCode) {\n                value.push(address.countryCode);\n            }\n        }\n        return value.join(', ');\n    }),\n\n    /**\n     * The external contacts best determined phone number to use\n     */\n    phoneNumber: computed.readOnly('externalContact.bestPhoneNumber'),\n\n    /**\n     * the organization name of the external contact if one exists.\n     * Organization name should be displayed on the row as priority order #2, behind the EC label.\n     */\n    organizationName: computed.readOnly('externalContact.externalOrganization.name'),\n\n    divisionName: computed.readOnly('externalContact.division.name'),\n\n    /**\n     * The external contacts WhatsApp name or phone number\n     */\n    whatsAppIdDisplay: computed.or(\n        'externalContact.whatsAppId.displayName',\n        'externalContact.whatsAppId.phoneNumber.e164',\n        'externalContact.whatsAppId.phoneNumber.display'\n    ),\n\n    /**\n     * The external contacts best determined phone number to use\n     */\n    phoneNumberDisplay: computed(\n        'externalContact.bestPhoneNumberDisplay',\n        'externalContact.bestPhoneType',\n        function () {\n            const phoneNumber = this.get('externalContact.bestPhoneNumberDisplay');\n            const phoneType = this.get('externalContact.bestPhoneType');\n\n            if (phoneNumber && phoneType) {\n                return this.get('intl').t('purecloud.acdInteraction.phoneNumber', { phoneNumber, phoneType });\n            }\n        }\n    ),\n\n    /**\n     * The external contacts best determined email to use\n     */\n    email: computed.readOnly('externalContact.bestEmailAddress'),\n\n    /**\n     * Possible types of phoneNumbers based on the provided external contact\n     */\n    phoneTypes: computed('externalContact', function () {\n        const externalContact = this.get('externalContact');\n        return externalContact && externalContact.toJSON\n            ? Object.keys(externalContact.toJSON()).filter(modelKey => /.*Phone$|whatsAppId/.test(modelKey))\n            : [];\n    }),\n\n    /**\n     * Array of phoneNumbers that pertains to this contact\n     */\n    phoneNumbers: computed('externalContact', 'phoneTypes', function () {\n        return this.get('phoneTypes').reduce((acc: any[], type: any) => {\n            if (type === 'whatsAppId') {\n                if (this.get(`externalContact.${type}.phoneNumber.display`)) {\n                    const phoneTypeId = type + '-' + this.get(`externalContact.${type}.phoneNumber.e164`); //This needs to be unique for tooltips to work.\n                    acc.push({\n                        type: this.get('intl').t(`purecloud.acdInteraction.relate.channelTypes.whatsapp`),\n                        typeKey: type,\n                        phoneTypeId: phoneTypeId.replace(/\\s|\\+|#|\\./g, ''),\n                        number: this.get(`externalContact.${type}.phoneNumber.display`),\n                        e164: this.get(`externalContact.${type}.phoneNumber.e164`),\n                        acceptsSMS: this.get(`externalContact.${type}.phoneNumber.acceptsSMS`),\n                        canUseNonE164: type === 'otherPhone'\n                    });\n                }\n            } else {\n                if (type && this.get(`externalContact.${type}.display`)) {\n                    const phoneTypeId = type + '-' + this.get(`externalContact.${type}.e164`); //This needs to be unique for tooltips to work.\n                    acc.push({\n                        type: this.get('intl').t(`purecloud.acdInteraction.relate.phoneTypes.${type}`),\n                        typeKey: type,\n                        phoneTypeId: phoneTypeId.replace(/\\s|\\+|#|\\./g, ''),\n                        number: this.get(`externalContact.${type}.display`),\n                        e164: this.get(`externalContact.${type}.e164`),\n                        acceptsSMS: this.get(`externalContact.${type}.acceptsSMS`),\n                        canUseNonE164: type === 'otherPhone'\n                    });\n                }\n            }\n            return acc;\n        }, []);\n    }),\n\n    /**\n     * Possible types of emails based on the provided external contact\n     */\n    emailTypes: computed('externalContact', function () {\n        const externalContact: any = this.get('externalContact');\n        return externalContact && externalContact.toJSON\n            ? Object.keys(externalContact.toJSON()).filter(modelKey => /.*Email$/.test(modelKey))\n            : [];\n    }),\n\n    /**\n     * Array of emails that pertains to this contact\n     */\n    emails: computed('externalContact', 'emailTypes', function () {\n        return this.get('emailTypes').reduce((acc: any[], type: any) => {\n            if (type && this.get(`externalContact.${type}`)) {\n                acc.push({\n                    type: this.get('intl').t(`purecloud.acdInteraction.relate.emailTypes.${type}`),\n                    address: this.get(`externalContact.${type}`)\n                });\n            }\n            return acc;\n        }, []);\n    }),\n\n    /**\n     * `true` if the more menu should be displayed based on the contact information from the contact combined\n     * with the specific interaction type being handled\n     */\n    showMoreMenu: computed('interactionType', 'phoneNumbers', 'emails', function () {\n        const type = this.get('interactionType') as ConversationSummaryType;\n        switch (type) {\n            case 'email':\n                return this.get('emails.length') > 1;\n            default:\n                return this.get('phoneNumbers.length') > 1;\n        }\n    }),\n\n    /**\n     * Returns the best point of contact (phone number or email) for an external contact, if available.\n     */\n    bestContactPoint: computed('interactionType', 'email', 'phoneNumberDisplay', function () {\n        const type = this.get('interactionType') as ConversationSummaryType;\n        switch (type) {\n            case 'email':\n                return this.get('email');\n            default:\n                return this.get('phoneNumberDisplay');\n        }\n    }),\n\n    /**\n     * Returns translated text for when there is more than one point of contact for an external contact, but not for the selected interactionType. Used when the row is focused/hovered over.\n     */\n    noBestContactPointLabel: computed('interactionType', function () {\n        if (this.get('interactionType')) {\n            const translatedInteractionType = this.get('intl').t(`purecloud.${this.get('interactionType')}`);\n\n            return this.get('intl').t('purecloud.acdInteraction.noBestContactType', {\n                interactionType: translatedInteractionType.toLowerCase()\n            });\n        }\n        return this.get('intl').t('purecloud.acdInteraction.noBestContact');\n    }),\n\n    /**\n     * The label used to announce to screenreaders about the status of the contact points at a glance.\n     */\n    contactPointLabel: computed('bestContactPoint', 'noBestContactPointLabel', 'showMoreMenu', function () {\n        if (this.get('showMoreMenu')) {\n            return this.get('intl').t('purecloud.acdInteraction.multipleContactPoints');\n        } else if (this.get('bestContactPoint')) {\n            return this.get('bestContactPoint');\n        } else return this.get('noBestContactPointLabel');\n    }),\n\n    /**\n     * An array of contact points per interaction type. This is primarily used to generalize the data that goes into the showMoreMenu popover.\n     */\n    contactPoints: computed('interactionType', 'emails.[]', 'phoneNumbers.[]', 'smsTooltipId', function () {\n        const interactionType = this.get('interactionType') as ConversationSummaryType;\n        let contactPoints: ContactPointType[] = [];\n\n        if (interactionType === 'email') {\n            this.get('emails').forEach((email: any) => {\n                contactPoints.push({\n                    type: email?.type,\n                    displayValue: email?.address,\n                    address: email?.address,\n                    action: 'onEmailSelected'\n                });\n            });\n        } else {\n            this.get('phoneNumbers').forEach((phone: any) => {\n                const address = phone.e164 || phone.canUseNonE164 ? phone : null;\n                contactPoints.push({\n                    type: phone?.type,\n                    displayValue: phone?.number,\n                    address,\n                    action: 'onNumberSelected',\n                    acceptsSMS: phone?.acceptsSMS\n                });\n            });\n        }\n        return contactPoints;\n    }),\n\n    /**\n     * Returns the initials of the external contact computed by the model.\n     * We need to substring the first two characters because some characters\n     * won't compute correctly and will cause a long string of initials\n     */\n    initials: computed('externalContact.initials', function () {\n        return this.get('externalContact.initials')?.substring(0, 2);\n    }),\n\n    /**\n     * Possible reference to the anchor tag rendered in the details popover linking to the\n     * external contacts profile page\n     */\n    viewProfileLink: null as Maybe<HTMLAnchorElement>,\n\n    /**\n     * A controller to easily remove all of the event listeners from the component\n     */\n    abortController: new AbortController(),\n\n    init() {\n        this._super(...arguments);\n        this.fetchSchemaTitle();\n        this.set('abortController', new AbortController());\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        if (this.get('interactable') && !this.get('readOnly')) {\n            const { signal } = this.get('abortController');\n\n            // For valid HTML standardization and proper accessibility, the entire row cannot have interactable elements within one another. Therefore, elements such as \"Show More Menu\" buttons need to be excluded from the click behavior.\n            const infoElement = this.get('element').getElementsByClassName('contact-row-info')[0];\n\n            infoElement.addEventListener('click', this.actionSelected.bind(this), { signal });\n            // @ts-ignore\n            infoElement.addEventListener(\n                'keyup',\n                function (this: any, event: KeyboardEvent) {\n                    if (event.key === 'Enter') {\n                        this.actionSelected(this);\n                    }\n                }.bind(this),\n                { signal }\n            );\n        }\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.get('abortController').abort();\n    },\n\n    /**\n     * Fetches the schema title calculated from within the external contact model.\n     */\n    async fetchSchemaTitle(this: any) {\n        // Guard on schema.id (a plain string) rather than schemaTitle (a Promise, always truthy)\n        if (!this.get('externalContact.schema.id')) {\n            return;\n        }\n        try {\n            const title = await this.get('externalContact.schemaTitle');\n            run(() => this.set('schemaTitle', title || null));\n        } catch (error) {\n            this.get('stashLogger').error('External Contact Row: Schema title could not be fetched', {\n                remoteData: { error }\n            });\n        }\n    },\n\n    /**\n     * @action\n     * Closure action to be invoked when a data row has been selected\n     *\n     * @param data the data being passed after selected\n     */\n    actionSelected: () => warnClosureAction('actionSelected'),\n\n    /**\n     * @action\n     * Closure action to be invoked when a number has been selected to call from this component\n     *\n     * @param data the data needed to make the call\n     */\n    actionNumberSelected: (data: any) => warnClosureAction('actionNumberSelected', data),\n\n    /**\n     * @action\n     * Closure action to be invoked when an email has been selected from this component\n     *\n     * @param data the data needed to make the selection\n     */\n    actionEmailSelected: (data: any) => warnClosureAction('actionEmailSelected', data),\n\n    actions: {\n        /**\n         * Invoked when the user selects a phone number from the more menu\n         *\n         * @param phone The phone object selected\n         */\n        onNumberSelected(phone: any) {\n            const contact = this.get('externalContact');\n            const phoneNumber = phone.e164 || phone.number;\n            const phoneType = phone.type;\n            const phoneTypeKey = phone.typeKey;\n            // @ts-ignore\n            set(contact, 'phoneNumber', phoneNumber);\n            // @ts-ignore\n            set(contact, 'phoneType', phoneType);\n            // @ts-ignore\n            set(contact, 'phoneTypeKey', phoneTypeKey);\n            this.actionNumberSelected(contact);\n        },\n\n        /**\n         * Invoked when the user selects an email from the more menu\n         *\n         * @param email The email selected\n         */\n        onEmailSelected(email: string) {\n            const contact = this.get('externalContact');\n            // @ts-ignore\n            set(contact, 'email', email);\n\n            this.actionEmailSelected(contact);\n        },\n\n        /**\n         * Invoked when the 'View Full Profile' button is selected for an external contact\n         *\n         */\n        goToFullProfile() {\n            const externalContact = this.get('externalContact');\n            if (externalContact && externalContact.id) {\n                const router = getOwner(this).lookup('router:main');\n                const route = 'relate.contacts-ui-redirect';\n                if (router && router.transitionTo) {\n                    router.transitionTo(route, externalContact.id);\n                }\n            }\n            return false;\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"N1SDCMYU\",\"block\":\"[[[10,0],[14,\\\"role\\\",\\\"button\\\"],[15,\\\"aria-readonly\\\",[28,[37,0],[[33,1],[28,[37,2],[[33,3]],null]],null]],[15,\\\"readonly\\\",[28,[37,0],[[33,1],[28,[37,2],[[33,3]],null]],null]],[14,\\\"tabindex\\\",\\\"0\\\"],[15,0,[29,[\\\"contact-row-info \\\",[52,[33,5],\\\" multiple-contact-points\\\"]]]],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"contact-row-thumbnail\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,6],null,[[\\\"participant\\\",\\\"text\\\"],[[33,7],[33,8]]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[1,\\\"    \\\"],[10,0],[14,0,\\\"info\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,0],[[33,1],[28,[37,2],[[33,3]],null]],null],[[[1,\\\"            \\\"],[10,1],[14,0,\\\"sr-only\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,9],[\\\"purecloud.acdInteraction.noSelectionAllowed\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[10,0],[14,0,\\\"title-container\\\"],[12],[1,\\\"\\\\n            \\\"],[10,2],[14,0,\\\"title\\\"],[15,\\\"title\\\",[36,10]],[12],[1,\\\"\\\\n                \\\"],[1,[34,10]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[14,0,\\\"subtitle-container hoverable\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"            \\\"],[10,2],[15,\\\"aria-label\\\",[29,[[36,11]]]],[14,0,\\\"subtitle on-hover\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[34,12]],[1,\\\"\\\\n\\\"],[41,[33,13],[[[1,\\\"                    \\\"],[10,1],[14,0,\\\"divider\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[1,[34,13]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,2],[15,\\\"aria-label\\\",[29,[[36,14]]]],[14,0,\\\"subtitle on-hover\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[34,14]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[1,\\\"            \\\"],[10,2],[15,\\\"aria-label\\\",[29,[[36,11],\\\" \\\",[36,14]]]],[14,0,\\\"subtitle off-hover\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[34,12]],[1,\\\"\\\\n\\\"],[41,[33,13],[[[1,\\\"                    \\\"],[10,1],[14,0,\\\"divider\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[1,[34,13]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,15],[[33,16],[33,17]],null],[[[6,[39,18],null,null,[[\\\"default\\\"],[[[[1,\\\"                \\\"],[1,[34,17]],[1,\\\"\\\\n\\\"]],[]]]]]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,2],[[33,3]],null],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"subtitle-container\\\"],[12],[1,\\\"\\\\n                \\\"],[10,2],[14,0,\\\"subtitle\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\\n                    \\\"],[1,[28,[35,9],[\\\"purecloud.acdInteraction.permissions.userMissingPermissions.userInConversation\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,5],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"actions\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-context-menu\\\"],[15,1,[29,[[36,19],\\\"-external-contact-row-more-menu\\\"]]],[15,\\\"screenreader-text\\\",[29,[[28,[37,9],[\\\"purecloud.acdInteraction.showMoreMenuDetails\\\"],[[\\\"name\\\",\\\"primaryTitle\\\",\\\"secondaryTitle\\\"],[[33,10],[33,12],[33,13]]]]]]],[14,0,\\\"data-row-more-menu external-contact-row-more-menu\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,21],[[28,[37,21],[[33,22]],null]],null],null,[[[41,[30,1,[\\\"address\\\"]],[[[1,\\\"                    \\\"],[10,\\\"gux-list-item\\\"],[15,\\\"onclick\\\",[28,[37,23],[[30,0],[30,1,[\\\"action\\\"]],[30,1,[\\\"address\\\"]]],null]],[12],[1,\\\"\\\\n                        \\\"],[10,0],[14,0,\\\"contact-list-item\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,2],[14,0,\\\"contact-type\\\"],[12],[1,\\\"\\\\n                                \\\"],[1,[30,1,[\\\"type\\\"]]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                            \\\"],[10,0],[14,0,\\\"contact-container\\\"],[12],[1,\\\"\\\\n                                \\\"],[10,0],[14,0,\\\"contact contact-list-button\\\"],[12],[1,\\\"\\\\n                                    \\\"],[1,[30,1,[\\\"displayValue\\\"]]],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n\\\"],[41,[30,1,[\\\"acceptsSMS\\\"]],[[[1,\\\"                                    \\\"],[10,1],[14,0,\\\"accepts-sms\\\"],[15,\\\"aria-label\\\",[28,[37,9],[\\\"purecloud.acdInteraction.relate.acceptsSMS\\\"],null]],[12],[1,\\\"\\\\n                                        \\\"],[1,[28,[35,24],[\\\"(\\\",[28,[37,9],[\\\"purecloud.acdInteraction.relate.acceptsSMS\\\"],null],\\\")\\\"],null]],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,\\\"gux-list-item\\\"],[14,\\\"disabled\\\",\\\"\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,0],[14,0,\\\"contact-list-item\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,2],[14,0,\\\"contact-type\\\"],[12],[1,\\\"\\\\n                                \\\"],[1,[30,1,[\\\"type\\\"]]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                            \\\"],[10,2],[14,0,\\\"number\\\"],[12],[1,\\\"\\\\n                                \\\"],[1,[30,1,[\\\"displayValue\\\"]]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[1]],null],[1,\\\"            \\\"],[10,\\\"gux-list-item\\\"],[15,\\\"onClick\\\",[28,[37,23],[[30,0],\\\"goToFullProfile\\\"],null]],[14,0,\\\"view-full-profile\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"arrow-up-right\\\"],[15,\\\"screenreader-text\\\",[28,[37,9],[\\\"person.viewFullProfileLink\\\"],null]],[12],[13],[1,\\\"\\\\n                \\\"],[10,1],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,9],[\\\"person.viewFullProfile\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,1],[14,0,\\\"sr-only\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,9],[\\\"person.viewFullProfileLink\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"aria-hidden\\\",\\\"true\\\"],[15,1,[29,[[36,19],\\\"-external-contact-row-more-menu-tooltip\\\"]]],[15,\\\"for\\\",[29,[[36,19],\\\"-external-contact-row-more-menu\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,9],[\\\"purecloud.acdInteraction.showMoreMenu\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"actions\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-button-slot\\\"],[14,0,\\\"data-row-more-menu external-contact-row-more-menu view-full-profile\\\"],[15,1,[29,[[36,19],\\\"-view-full-profile-button\\\"]]],[14,\\\"icon-only\\\",\\\"\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"button\\\"],[14,\\\"role\\\",\\\"link\\\"],[15,\\\"aria-label\\\",[28,[37,9],[\\\"person.viewFullProfileLink\\\"],null]],[15,\\\"onclick\\\",[28,[37,23],[[30,0],\\\"goToFullProfile\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"arrow-up-right\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"aria-hidden\\\",\\\"true\\\"],[15,\\\"for\\\",[29,[[36,19],\\\"-view-full-profile-button\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,9],[\\\"person.viewFullProfile\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[\\\"contact\\\"],false,[\\\"or\\\",\\\"readOnly\\\",\\\"not\\\",\\\"interactable\\\",\\\"if\\\",\\\"showMoreMenu\\\",\\\"target-dropdown/thumbnail\\\",\\\"externalContact\\\",\\\"initials\\\",\\\"t\\\",\\\"name\\\",\\\"titles\\\",\\\"primaryTitle\\\",\\\"secondaryTitle\\\",\\\"contactPointLabel\\\",\\\"and\\\",\\\"acdExternalContactDivNameFT\\\",\\\"divisionName\\\",\\\"tags-input/label\\\",\\\"elementId\\\",\\\"each\\\",\\\"-track-array\\\",\\\"contactPoints\\\",\\\"action\\\",\\\"concat\\\"]]\",\"moduleName\":\"web-directory/components/target-dropdown/rows/external-contact-row/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport ComputedProperty from '@ember/object/computed';\nimport { inject } from '@ember/service';\nimport { Maybe } from 'web-directory/types';\nimport { warnClosureAction } from 'web-directory/utils/acd-ts';\nimport LoggerMixin from '../../../../mixins/logger';\nimport { ConversationSummaryConfigData } from '../../data';\nimport {\n    ConversationSummary,\n    ConversationSummaryData,\n    ConversationSummaryMetadata,\n    ConversationSummaryMetadataCounters,\n    ConversationSummaryType\n} from '../../types';\n\n/**\n * Map of common permissions with what their shortened translations should map to if\n * the user doesn't have the permission available.\n */\nconst UserMissingPermissionMessageMap: { [key: string]: string } = {\n    // Agent Routing\n    'routing:agent:onqueue': 'purecloud.acdInteraction.permissions.userMissingPermissions.noRoutingPermission',\n    // Internal Messaging\n    'conversation:internalMessaging:accept':\n        'purecloud.acdInteraction.permissions.userMissingPermissions.noInternalMessagingPermission'\n} as const;\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['data-row', 'person-row'],\n    classNameBindings: ['presence'],\n\n    intl: inject('intl'),\n    logger: inject('stashLogger'),\n\n    /**\n     * @Attribute\n     * 'show more' boolean\n     */\n    showMoreMenu: false as boolean,\n\n    /**\n     * @Attribute\n     *\n     * The person data to use\n     */\n    person: null as any,\n\n    /**\n     * @Attribute\n     *\n     * `false` if the element cannot be interacted with\n     */\n    interactable: true,\n\n    /**\n     * @attribute\n     * `true` if the current logged in user is the user in the row\n     */\n    isSelf: false,\n\n    /**\n     * @attribute\n     * `true` if the user in the row is already present in the conversation\n     */\n    isInConversation: false,\n\n    /**\n     * @Attribute\n     *\n     * The type of the current interaction this component is being used for if applicable\n     */\n    interactionType: null as Maybe<ConversationSummaryType>,\n\n    /**\n     * @Attribute\n     *\n     * Array of the permissions that are required for this person to be selected\n     * in whatever context this dropdown is in. The person needs to have ALL of the permissions\n     * that are included in this array. i.e This is treated as `&&` instead of `||`.\n     *\n     * Todo: Allow both '&&' and '||' logic for comparing permissions when the need arises\n     */\n    requiredPermissions: [] as string[],\n\n    /**\n     * @Attribute\n     *\n     * `true` if the row should be rendered as read only without button interactions\n     */\n    readOnly: false,\n\n    /**\n     * @attribute\n     * actual value passed from target-dropdown\n     */\n    showDirectTransferToVoicemailDropdown: false,\n\n    /**\n     * @attribute\n     *\n     * actual value passed from target-dropdown\n     */\n    conversationHasActiveParticipants: false,\n\n    /**\n     * @attribute\n     *\n     * `true` if the permission enhancement feature flag is enabled derived from Digital Consulting work\n     */\n    useEnhancedPermissions: false,\n\n    /**\n     * A controller to easily remove all of the event listeners from the component\n     */\n    abortController: new AbortController(),\n\n    /**\n     * Quick access map of all custom shortened permission messages to be shown to the authenticated user.\n     */\n    userMissingPermissionMessageMap: UserMissingPermissionMessageMap,\n\n    /**\n     * The string of shortened (enhanced) missing permissions to display when the person the user wants to select has missing permissions.\n     */\n    userMissingPermissionsText: computed(\n        'userMissingPermissionMessageMap',\n        'missingPermissions',\n        'interactionType',\n        'useEnhancedPermissions',\n        function () {\n            const map = this.get('userMissingPermissionMessageMap') || {};\n            const missingPermissions = this.get('missingPermissions') || [];\n            const strings: string[] = [];\n            if (this.get('useEnhancedPermissions')) {\n                missingPermissions.forEach((missing: any) => {\n                    if (map[missing]) {\n                        let str = this.get('intl').safestring(map[missing]).toString();\n                        strings.push(str);\n                    } else {\n                        const type = this.get('intl')\n                            .safestring(`purecloud.${this.get('interactionType')}`)\n                            .toString();\n                        strings.push(type);\n                    }\n                });\n            } else {\n                const type = this.get('intl')\n                    .safestring(`purecloud.${this.get('interactionType')}`)\n                    .toString();\n                return this.get('intl').t('purecloud.acdInteraction.permissions.noInteractionPermission', {\n                    type\n                });\n            }\n\n            return strings.join(', ');\n        }\n    ),\n\n    /**\n     * The screenreader text for when the person the user wants to select has (enhanced) missing permissions.\n     */\n    userMissingPermissionsLabel: computed('userMissingPermissionsText', function () {\n        const strings = this.get('userMissingPermissionsText');\n        const translationKey =\n            strings.length === 1\n                ? `purecloud.acdInteraction.permissions.userMissingPermissions.singular`\n                : `purecloud.acdInteraction.permissions.userMissingPermissions.plural`;\n        return this.get('intl').t(translationKey, { permissions: strings });\n    }),\n\n    /**\n     * `true` if the element is disabled\n     */\n    disabled: computed('readOnly', 'interactable', 'hasRequiredPermission', function () {\n        try {\n            return !this.get('readOnly') && (!this.get('interactable') || !this.get('hasRequiredPermission'));\n        } catch (error) {\n            this.get('logger').error('Person Row: There was an issue determining the disabled state', {\n                remoteData: { error }\n            });\n            return true;\n        }\n    }),\n\n    /**\n     * The computed name of the person being rendered\n     */\n    name: computed.readOnly('person.name') as ComputedProperty<string>,\n\n    /**\n     * The computed name of the person being rendered\n     */\n    title: computed.readOnly('person.title') as ComputedProperty<string>,\n\n    /**\n     * All of the permissions that this person has been given.\n     */\n    permissions: computed.readOnly('person.expands.authorization.permissions') as ComputedProperty<string[]>,\n\n    /**\n     * `true` if the person has to correct permissions to be selected in whatever context\n     * this dropdown is being used in. Depends on the `requiredPermissions` property.\n     */\n    missingPermissions: computed('requiredPermissions.[]', 'permissions', function () {\n        const requiredPermissions: Set<string> = new Set([...(this.get('requiredPermissions') ?? [])]);\n\n        try {\n            const permissions: string[] = this.get('permissions') ?? [];\n\n            // essentially if the user is an agent and can be on queue\n            const canAgentGoOnQueue = permissions.includes(`routing:agent:onqueue`);\n\n            // if user doesn't include the onqueue permission, then we don't need to check for the other permissions, they are good to go\n            // this is likely because the user is not an agent so the rules do not apply.\n            if (!canAgentGoOnQueue) return [];\n\n            let missingPermissions: string[] = [];\n            // if the user has no permissions, then all of the required permissions are missing\n            if (!permissions.length) {\n                missingPermissions = Array.from(requiredPermissions);\n            } else if (requiredPermissions.size) {\n                // cross reference with the users permissions against the required permissions and find the deltas\n                missingPermissions = Array.from(requiredPermissions).filter(p => !permissions.includes(p));\n            }\n\n            return missingPermissions;\n        } catch (error) {\n            this.get('logger').error('Person Row: There was an issue determining the \"missingPermissions\" value', {\n                remoteData: { error }\n            });\n            return requiredPermissions;\n        }\n    }) as ComputedProperty<string[]>,\n\n    /**\n     * Determines if the user has any missing permissions, and if none are detected then the user is determined\n     * to have the correct permissions in place.\n     */\n    hasRequiredPermission: computed(\n        'requiredPermissions.[]',\n        'permissions',\n        'missingPermissions',\n        'useEnhancedPermissions',\n        function () {\n            // we have more complex logic to determine the missing permissions, so we need to use the feature flag to determine if we should use it\n            if (this.get('useEnhancedPermissions')) {\n                const missing = this.get('missingPermissions');\n                return missing.length === 0;\n            }\n\n            // todo: remove the following once the feature flag is enabled and removed\n            try {\n                const requiredPermissions: string[] = this.get('requiredPermissions') ?? [];\n                const permissions: string[] = this.get('permissions') ?? [];\n                if (requiredPermissions.length && permissions.length) {\n                    const agentHasRequiredPermissions = requiredPermissions.every(required =>\n                        permissions.includes(required)\n                    );\n                    return agentHasRequiredPermissions || !permissions.includes(`routing:agent:onqueue`);\n                }\n                // If there are no requiredPermissions and the person has any permissions, then return `true`.\n                return !requiredPermissions.length && permissions.length;\n            } catch (error) {\n                this.get('logger').error(\n                    'Person Row: There was an issue determining the \"hasRequriedPermission\" value',\n                    { remoteData: { error } }\n                );\n                return false;\n            }\n        }\n    ) as ComputedProperty<boolean>,\n\n    /**\n     * Reference to the persons active conversations and intended to be displayed in the data row\n     */\n    conversationSummaryData: computed.readOnly(\n        'person.expands.conversationSummary'\n    ) as ComputedProperty<ConversationSummaryData>,\n\n    /**\n     * The persons active conversation summary data containing information for interaction icon display.\n     * Will filter out any keys not configured or disabled in the `ConversationSummaryConfigData`.\n     */\n    conversationSummary: computed('conversationSummaryData', function () {\n        try {\n            const summaryData = ConversationSummaryConfigData;\n            const keys = Object.keys(summaryData) as ConversationSummaryType[];\n            return keys.reduce((value: ConversationSummary[], key: ConversationSummaryType) => {\n                const data = summaryData[key];\n                if (data.enabled) {\n                    const summary: ConversationSummaryData = this.get('conversationSummaryData');\n                    const count: number = summary[key] ? this._getActiveCount(summary[key]) : 0;\n                    const translationKey =\n                        count === 1\n                            ? `purecloud.conversationSummary.${key}.singular`\n                            : `purecloud.conversationSummary.${key}.plural`;\n\n                    // Add check to exclude when count is zero\n                    if (count) {\n                        value.push({\n                            key,\n                            count,\n                            tooltip: this.get('intl').t(translationKey, { count }),\n                            ...data\n                        });\n                    }\n                }\n                return value;\n            }, []);\n        } catch (error) {\n            this.get('logger').error('Person Row: There was an issue determining the \"conversationSummary\" value', {\n                remoteData: { error }\n            });\n            return [];\n        }\n    }) as ComputedProperty<ConversationSummary>,\n\n    /**\n     * The persons current presence in the app. Dictates if they are offline, available, away, etc\n     */\n    presence: computed.readOnly('person.activityPresence') as ComputedProperty<string>,\n\n    /**\n     * The label for the title of the user, if applicable. Defaults to \"User\".\n     */\n    titleLabel: computed('hasRequiredPermission', 'title', function () {\n        return this.get('hasRequiredPermission') && this.get('title')\n            ? this.get('title')\n            : this.get('intl').safestring('purecloud.acdInteraction.conferencing.user');\n    }),\n\n    /**\n     * The screenreader text for the presence (and secondary) label\n     */\n    presenceLabelText: computed('presenceLabel', 'secondaryPresenceLabel', function () {\n        const presenceLabel = this.get('presenceLabel');\n        const secondaryPresenceLabel = this.get('secondaryPresenceLabel');\n        if (presenceLabel) {\n            if (secondaryPresenceLabel) {\n                return this.get('intl').t('purecloud.acdInteraction.conferencing.presence', {\n                    secondary: secondaryPresenceLabel,\n                    primary: presenceLabel\n                });\n            } else {\n                return presenceLabel;\n            }\n        }\n        return null;\n    }),\n\n    /**\n     * The label to display on the row depicting the users current presence\n     */\n    presenceLabel: computed('person.presenceLabel', function () {\n        try {\n            const primary = this.get('person.presenceLabel') as string;\n            return primary ?? null;\n        } catch (error) {\n            this.get('logger').error('Person Row: There was an issue determining the \"presenceLabel\" value', {\n                remoteData: { error }\n            });\n            return null;\n        }\n    }) as ComputedProperty<Maybe<string>>,\n\n    /**\n     * The sub presence label displaying for the user.\n     * if null or undefined then we will only display the primary `presenceLabel`\n     */\n    secondaryPresenceLabel: computed('person.secondaryPresenceLabel', 'presenceLabel', function () {\n        try {\n            const secondary = this.get('person.secondaryPresenceLabel') as string;\n            return secondary != null && secondary !== this.get('presenceLabel') ? secondary : null;\n        } catch (error) {\n            this.get('logger').error('Person Row: There was an issue determining the \"secondaryPresenceLabel\" value', {\n                remoteData: { error }\n            });\n            return null;\n        }\n    }) as ComputedProperty<Maybe<string>>,\n\n    summaryTooltipId: computed('elementId', function () {\n        return `${this.get('elementId')}-person-row-summary`;\n    }),\n\n    init() {\n        this._super(...arguments);\n        this.set('abortController', new AbortController());\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        if (this.get('interactable') && !this.get('readOnly') && !this.get('disabled') && !this.get('showMoreMenu')) {\n            const { signal } = this.get('abortController');\n\n            // For valid HTML standardization and proper accessibility, the entire row cannot have interactable elements within one another. Therefore, elements such as \"Show More Menu\" buttons need to be excluded from the click behavior.\n            const infoElement = this.get('element').getElementsByClassName('contact-row-info')[0];\n\n            infoElement.addEventListener('click', this.actionSelected.bind(this), { signal });\n            // @ts-ignore\n            infoElement.addEventListener(\n                'keyup',\n                function (this: any, event: KeyboardEvent) {\n                    if (event.key === 'Enter') {\n                        this.actionSelected(this);\n                    }\n                }.bind(this),\n                { signal }\n            );\n        }\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.get('abortController').abort();\n    },\n\n    /**\n     * Fetches the total number of active interactions pertaining to the provided conversation summary metadata.\n     *\n     * @param summary The conversation summary metadata to check against\n     * @returns A number equaling the active interactions\n     */\n    _getActiveCount(summary: ConversationSummaryMetadata): number {\n        try {\n            return Object.values(summary).reduce(\n                (accumulator: number, currentValue: ConversationSummaryMetadataCounters) =>\n                    accumulator + Object.values(currentValue).reduce((acc: number, curr: number) => acc + curr, 0),\n                0\n            );\n        } catch (error) {\n            this.get('logger').error('Person Row: There was an issue determining the \"_getActiveCount\" value', {\n                remoteData: { error }\n            });\n            return 0;\n        }\n    },\n\n    /**\n     * @action\n     * Method passed as a prop. If not passed, we warn.\n     *\n     * @param data\n     */\n    transferToVoicemailClick: (data: any) => warnClosureAction('transferToVoicemailClick', data),\n\n    /**\n     * @action\n     * Closure action to be invoked when a data row has been selected\n     *\n     * @param data the data being passed after selected\n     */\n    actionSelected: () => warnClosureAction('actionSelected'),\n\n    actions: {\n        /**\n         * Invoked when the user selects to transfer call to voicemail of selected user\n         *\n         * @param data Participant data of selcted user\n         * transferToVoicemailClick is passed as a prop from acd-interactions-panel/interaction/component.js(agent transfer) or /conversation-controls/component.js(regular calls)\n         */\n        invokeTransferToVoicemail(data: any) {\n            this.transferToVoicemailClick(data);\n        },\n\n        preventDefault(event: MouseEvent) {\n            event.preventDefault();\n            event.stopPropagation();\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"cA6bcaE7\",\"block\":\"[[[10,0],[14,\\\"role\\\",\\\"button\\\"],[15,\\\"aria-readonly\\\",[36,0]],[15,\\\"readonly\\\",[36,1]],[14,\\\"tabindex\\\",\\\"0\\\"],[14,0,\\\"contact-row-info\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"contact-row-thumbnail\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,2],null,[[\\\"participant\\\",\\\"iconName\\\",\\\"showIndicator\\\"],[[33,3],\\\"user\\\",[33,4]]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"info\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,1],[[[1,\\\"            \\\"],[10,1],[14,0,\\\"sr-only\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,6],[\\\"purecloud.acdInteraction.noSelectionAllowed\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[10,0],[14,0,\\\"title-container\\\"],[12],[1,\\\"\\\\n            \\\"],[10,2],[14,0,\\\"title\\\"],[15,\\\"title\\\",[36,7]],[12],[1,\\\"\\\\n                \\\"],[1,[34,7]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[1,[28,[35,8],null,[[\\\"entity\\\",\\\"size\\\"],[[33,3],\\\"small\\\"]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[14,0,\\\"subtitle-container\\\"],[12],[1,\\\"\\\\n            \\\"],[10,2],[14,0,\\\"subtitle\\\"],[15,\\\"aria-label\\\",[29,[[52,[33,9],[33,9]],\\\" \\\",[36,10]]]],[12],[1,\\\"\\\\n\\\"],[41,[33,11],[[[1,\\\"                    \\\"],[1,[34,9]],[1,\\\"\\\\n                    \\\"],[10,1],[14,0,\\\"divider\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                \\\"],[1,[34,10]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,12],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"subtitle-container\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"subtitle summary-data-container\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,14],[[28,[37,14],[[33,12]],null]],null],null,[[[41,[30,2],[[[1,\\\"                            \\\"],[10,1],[14,0,\\\"divider\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                        \\\"],[1,[30,1,[\\\"tooltip\\\"]]],[1,\\\"\\\\n\\\"]],[1,2]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,15],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"subtitle-container hoverable\\\"],[12],[1,\\\"\\\\n                \\\"],[10,2],[14,0,\\\"subtitle off-hover\\\"],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[1,[28,[35,6],[\\\"purecloud.acdInteraction.permissions.userMissingPermissions.default\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,2],[14,0,\\\"subtitle on-hover\\\"],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[1,[34,16]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,1],[14,0,\\\"sr-only\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[34,17]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,18],[[33,19]],null],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"subtitle-container\\\"],[12],[1,\\\"\\\\n                \\\"],[10,2],[14,0,\\\"subtitle\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"],[41,[33,20],[[[1,\\\"                        \\\"],[1,[28,[35,6],[\\\"purecloud.acdInteraction.permissions.userMissingPermissions.selfContact\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,21],[[[1,\\\"                        \\\"],[1,[28,[35,6],[\\\"purecloud.acdInteraction.permissions.userMissingPermissions.userInConversation\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                        \\\"],[1,[28,[35,6],[\\\"purecloud.acdInteraction.permissions.userMissingPermissions.notSelectable\\\"],null]],[1,\\\"\\\\n                    \\\"]],[]]]],[]]],[1,\\\"                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"]],[]],null]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,22],[[33,23],[33,24]],null],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"actions\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"gux-button\\\"],[14,\\\"role\\\",\\\"button\\\"],[15,1,[29,[[36,25],\\\"-transfer-to-voicemail-button\\\"]]],[15,\\\"aria-label\\\",[29,[[28,[37,6],[\\\"purecloud.acdInteraction.voicemail.transferToVoicemail\\\"],null]]]],[14,0,\\\"data-row-more-menu person-row-more-menu\\\"],[15,\\\"onclick\\\",[28,[37,26],[[30,0],\\\"invokeTransferToVoicemail\\\",[33,3]],null]],[15,\\\"disabled\\\",[36,1]],[12],[1,\\\"\\\\n            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"voicemail\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"aria-hidden\\\",\\\"true\\\"],[15,\\\"for\\\",[29,[[36,25],\\\"-transfer-to-voicemail-button\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,6],[\\\"purecloud.acdInteraction.voicemail.transferToVoicemail\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"    \\\"],[18,3,null],[1,\\\"\\\\n\\\"]],[]]]],[\\\"data\\\",\\\"index\\\",\\\"&default\\\"],false,[\\\"readOnly\\\",\\\"disabled\\\",\\\"target-dropdown/thumbnail\\\",\\\"person\\\",\\\"presence\\\",\\\"if\\\",\\\"t\\\",\\\"name\\\",\\\"integration-badges\\\",\\\"presenceLabelText\\\",\\\"titleLabel\\\",\\\"presenceLabel\\\",\\\"conversationSummary\\\",\\\"each\\\",\\\"-track-array\\\",\\\"missingPermissions\\\",\\\"userMissingPermissionsText\\\",\\\"userMissingPermissionsLabel\\\",\\\"not\\\",\\\"interactable\\\",\\\"isSelf\\\",\\\"isInConversation\\\",\\\"and\\\",\\\"showDirectTransferToVoicemailDropdown\\\",\\\"conversationHasActiveParticipants\\\",\\\"elementId\\\",\\\"action\\\",\\\"yield\\\"]]\",\"moduleName\":\"web-directory/components/target-dropdown/rows/person-row/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport { inject } from '@ember/service';\nimport { Maybe } from 'web-directory/types';\nimport { warnClosureAction } from 'web-directory/utils/acd-ts';\nimport LoggerMixin from '../../../../mixins/logger';\nimport { generateCurrentInterval } from '../../../../utils/dates';\nimport { ConversationSummaryConfigData } from '../../data';\nimport {\n    ConversationSummaryType,\n    QueueDetail,\n    QueueDetailData,\n    QueueDetailMetricType,\n    QueueDetailQualifierType,\n    QueueDetails,\n    QueueObservationsData,\n    QueueWaitTime\n} from '../../types';\n\n/**\n * Time to wait until we should fetch the data again\n * Arbitrary value, subject to change.\n */\nconst WAIT_TIME = 1000 * 30; // 30 seconds\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['data-row', 'queue-row'],\n\n    engageAnalyticsService: inject('engageanalytics'),\n    queueService: inject('queue'),\n    logger: inject('stash-logger'),\n    intl: inject('intl'),\n\n    /**\n     * @Attribute\n     *\n     * The queue data to use\n     */\n    queue: null,\n\n    /**\n     * @Attribute\n     *\n     * `true` if the element cannot be interacted with\n     */\n    interactable: true,\n\n    /**\n     * @Attribute\n     *\n     * The type of the current interaction this component is being used for if applicable\n     */\n    interactionType: null as Maybe<ConversationSummaryType>,\n\n    /**\n     * @Attribute\n     *\n     * `true` if the row should be rendered as read only without button interactions\n     */\n    readOnly: false,\n\n    /**\n     * A controller to easily remove all of the event listeners from the component\n     */\n    abortController: new AbortController(),\n\n    /**\n     * The name of the queue to be rendered in the row\n     */\n    name: computed.reads('queue.name'),\n\n    /**\n     * Additional details pertaining to this queue. If null then it's likely\n     * that the user has not hovered over the information yet. Details should\n     * not populate until the user hovers and then after a small delay it will show the data\n     */\n    queueDetails: null as Maybe<QueueDetails>,\n\n    /**\n     * `true` if there was an error thrown with the queue details fetch\n     */\n    queueDetailsError: false,\n\n    /**\n     * An array summarizing all of the available queue details formatted for rendering\n     * purposes.\n     */\n    queueDetailSummary: computed('queueDetails', function () {\n        const details = this.get('queueDetails') as QueueDetails;\n        if (!details) {\n            return [];\n        }\n\n        const keys = Object.keys(details) as ConversationSummaryType[];\n        return keys.reduce((acc: QueueDetail[], key: ConversationSummaryType) => {\n            const detail = details[key];\n            // only show the details if `waitingCount` is not 0\n            if (detail.waitingCount) {\n                acc.push({\n                    key,\n                    ...detail\n                });\n            }\n            return acc;\n        }, []);\n    }),\n\n    /**\n     * Milliseconds of the last time the details were fetched. If time elapsed is greater than\n     * the static `WAIT_TIME` value above, then we will want to refetch the details for the queue\n     */\n    lastDetailFetch: null as Maybe<number>,\n\n    /**\n     * `true` if the queue details are not set, so we can infer that they are being loaded\n     */\n    loadingQueueDetails: computed.not('queueDetails'),\n\n    /**\n     * The amount of agents that are currently on queue\n     */\n    onQueueCount: 0,\n\n    /**\n     * The amount of agents that are currently idling\n     */\n    idleCount: 0,\n\n    /**\n     * Returns the best wait time to display based on the interaction in context\n     *\n     * @param times array of times to iterates through to find the best for\n     * @returns estimated wait time in seconds\n     */\n    estimatedWaitTime: computed('queueDetails', 'interactionType', function () {\n        const details = this.getBestDetails();\n        const time = details?.waitTime?.estimatedWaitTimeSeconds ?? -1;\n\n        // Time can return as `-1` meaning that the waitTime cannot be determined.\n        if (time >= 0) {\n            // Convert from sec to h/m/s\n            const totalSeconds = time;\n            const hours = Math.floor(totalSeconds / 3600);\n            const minutes = Math.floor((totalSeconds % 3600) / 60);\n            const seconds = totalSeconds % 60;\n            // `toString` for translations\n            const params = {\n                hours: hours.toString(),\n                minutes: minutes.toString(),\n                seconds: seconds.toString()\n            };\n\n            return {\n                // Check it as a number for quick truthy check (0 === false)\n                key: Number(params.hours)\n                    ? 'purecloud.analytics.estimatedWait.hoursMinutesSeconds'\n                    : Number(params.minutes)\n                    ? 'purecloud.analytics.estimatedWait.minutesSeconds'\n                    : 'purecloud.analytics.estimatedWait.seconds',\n                params\n            };\n        }\n\n        return null;\n    }),\n\n    /**\n     * The string used for the estimated wait time or lack thereof\n     * */\n    estimatedWaitTimeLabel: computed('estimatedWaitTime', function () {\n        if (this.get('estimatedWaitTime')) {\n            const key = this.get('estimatedWaitTime').key;\n            const hours = this.get('estimatedWaitTime').params.hours;\n            const minutes = this.get('estimatedWaitTime').params.minutes;\n            const seconds = this.get('estimatedWaitTime').params.seconds;\n            return this.get('intl').t(key, { hours, minutes, seconds });\n        }\n        return this.get('intl').safestring('purecloud.entity.queueDetails.estimatedWaitNotAvailable');\n    }),\n\n    /**\n     * The string used for the available agent(s) count.\n     */\n    availableAgentsCountLabel: computed('idleCount', 'onQueueCount', function () {\n        return this.get('intl').t('purecloud.entity.queueDetails.availableAgentsCount', {\n            available: this.get('idleCount').toString(),\n            total: this.get('onQueueCount').toString()\n        });\n    }),\n\n    init() {\n        this._super(...arguments);\n        this.set('abortController', new AbortController());\n    },\n\n    didInsertElement() {\n        this._super(...arguments);\n        this.fetchData();\n        if (this.get('interactable') && !this.get('readOnly')) {\n            const { signal } = this.get('abortController');\n            // For valid HTML standardization and proper accessibility, the entire row cannot have interactable elements within one another. Therefore, elements such as \"Show More Menu\" buttons need to be excluded from the click behavior.\n            const infoElement = this.get('element').getElementsByClassName('contact-row-info')[0];\n\n            infoElement.addEventListener('click', this.actionSelected.bind(this), { signal });\n            // @ts-ignore\n            infoElement.addEventListener(\n                'keyup',\n                function (this: any, event: KeyboardEvent) {\n                    if (event.key === 'Enter') {\n                        this.actionSelected(this);\n                    }\n                }.bind(this),\n                { signal }\n            );\n        }\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.get('abortController').abort();\n    },\n\n    /**\n     * Determines what the best details are based on the current interaction type, or\n     * from data\n     *\n     * @returns details object\n     */\n    getBestDetails(): Maybe<QueueDetail> {\n        const type = this.get('interactionType') as ConversationSummaryType;\n        const queueDetails = this.get('queueDetails') as QueueDetails;\n        const detail = queueDetails && type ? queueDetails[type] : null;\n        if (detail) {\n            return detail;\n        }\n\n        return Object.values(queueDetails).find((d: QueueDetail) => d.waitTime?.formula === 'BEST');\n    },\n\n    /**\n     * Fetches all of the additional queue information and statistics needed for the popover\n     * display.\n     */\n    async fetchData() {\n        const lastDetailFetch = this.get('lastDetailFetch');\n        const shouldUpdate = !this.get('queueDetails') || (lastDetailFetch && Date.now() - lastDetailFetch > WAIT_TIME);\n        this.set('queueDetailsError', false);\n\n        if (shouldUpdate) {\n            const interval = generateCurrentInterval();\n            // @ts-ignore\n            const id = this.get('queue.id');\n\n            if (id) {\n                try {\n                    const keys = new Set<ConversationSummaryType>();\n                    const joinedData: QueueObservationsData[] = await this.get(\n                        'engageAnalyticsService'\n                    ).getQueueObservations([id], interval, {\n                        metrics: ['oOnQueueUsers', 'oWaiting']\n                    });\n\n                    const waitTimeMap = new Map<ConversationSummaryType, QueueWaitTime>();\n                    // TODO - determin if prop is missing or if type should be optional\n                    // @ts-ignore\n                    (await this.get('queueService').getQueueEstimatedWaitTime(id))?.results.forEach(\n                        (data: QueueWaitTime) => {\n                            const key = this.determineWaitTimeIntentKey(data.intent);\n                            keys.add(key);\n                            waitTimeMap.set(key, data);\n                        }\n                    );\n\n                    const joinedDataMap = new Map<ConversationSummaryType, QueueDetailData[]>();\n                    joinedData.forEach(value => {\n                        const mediaType = value.group.mediaType;\n                        // Normalize voice → call (analytics API returns 'voice'); keep null/undefined as 'call'\n                        // per previous logic (untyped row = call). Aligns with translations, icons, wait time keys.\n                        const normalizedType: ConversationSummaryType =\n                            mediaType === 'voice' ? 'call' : mediaType ?? 'call';\n                        keys.add(normalizedType);\n                        const existing = joinedDataMap.get(normalizedType) ?? [];\n                        // This is a workaround to handle the inconsistent types for 'data' in the joinedData array\n                        const incoming = Array.isArray(value?.data) ? value.data : [];\n                        joinedDataMap.set(normalizedType, [...existing, ...incoming]);\n                    });\n\n                    let onQueueCount = 0;\n                    let idleCount = 0;\n                    let queueDetails = this.get('queueDetails') as QueueDetails;\n                    keys.forEach(key => {\n                        const data = joinedDataMap.get(key);\n                        if (data) {\n                            onQueueCount += this.getOnQueueCount(data);\n                            idleCount += this.getOnQueueCount(data, 'IDLE');\n                        }\n\n                        queueDetails = {\n                            ...queueDetails,\n                            [key]: {\n                                data: data,\n                                icon: ConversationSummaryConfigData[key]?.icon,\n                                // @ts-ignore\n                                waitingCount: data ? this.getMetricCount(data, 'oWaiting') : 0,\n                                waitTime: waitTimeMap.get(key)\n                            }\n                        };\n                    });\n\n                    if (!this.isDestroyed && !this.isDestroying) {\n                        this.set('lastDetailFetch', new Date().getTime());\n                        this.set('queueDetails', queueDetails);\n                        this.set('onQueueCount', onQueueCount);\n                        this.set('idleCount', idleCount);\n                    }\n                } catch (error) {\n                    if (!this.isDestroyed && !this.isDestroying) {\n                        this.set('queueDetailsError', true);\n                    }\n                    this.get('logger').error('There was an issue fetching the queues details', { error });\n                }\n            }\n        }\n    },\n\n    /**\n     * For some reason the video intent key is set to an inconsistent value so we need\n     * to check if the keys are inconsistent and return the consistent value for easy\n     * indexing. The intent is typically an uppercase version of the `ConversationSummaryType`.\n     *\n     * @param intent the intent key lining up with the conversation types\n     * @returns the key to use for our conversation types\n     */\n    determineWaitTimeIntentKey(intent: string): ConversationSummaryType {\n        switch (intent) {\n            case 'VIDEOCOMM':\n                return 'video';\n            default:\n                return intent.toLowerCase() as ConversationSummaryType;\n        }\n    },\n\n    /**\n     * Determines what the current on queue count is for this queue being viewed.\n     *\n     * @param mediaGroups The media groups to iterate through\n     * @param status optional status to further specify the data\n     * @returns number value depicting how many users are currently on queue for this queue\n     */\n    getOnQueueCount(groupData: QueueDetailData[], status?: QueueDetailQualifierType): number {\n        return groupData.reduce((total: number, data: QueueDetailData) => {\n            if (this.hasOnQueueUsers(data, status) && typeof data.stats?.count === 'number') {\n                return total + data.stats?.count;\n            }\n            return total;\n        }, 0);\n    },\n\n    /**\n     *\n     * @param data The data contain specific metrics to check against\n     * @param status optional status provided to further specify the data\n     * @returns boolean value depicting if the data is determined to have users on queue\n     */\n    hasOnQueueUsers(data: QueueDetailData, status?: QueueDetailQualifierType): boolean {\n        if (status) {\n            return data.metric === 'oOnQueueUsers' && data.qualifier === status;\n        }\n        return data.metric === 'oOnQueueUsers';\n    },\n\n    /**\n     * Looks for the data corresponding to the specific metric type and returns its\n     * count\n     *\n     * @param data The array of metric data to check against\n     * @param metric The metric being indexed\n     * @returns The current count of the corresponding metric being checked\n     */\n    getMetricCount(data: QueueDetailData[], metric: QueueDetailMetricType): number {\n        const metricData = data?.find((v: any) => v.metric === metric);\n        return metricData?.stats.count ?? 0;\n    },\n\n    /**\n     * @action\n     * Closure action to be invoked when a data row has been selected\n     *\n     * @param data the data being passed after selected\n     */\n    actionSelected: () => warnClosureAction('actionSelected')\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"tTn717K3\",\"block\":\"[[[10,0],[14,\\\"role\\\",\\\"button\\\"],[15,\\\"aria-readonly\\\",[36,0]],[15,\\\"readonly\\\",[36,0]],[14,\\\"tabindex\\\",\\\"0\\\"],[14,0,\\\"contact-row-info\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"contact-row-thumbnail\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,1],null,[[\\\"participant\\\",\\\"iconName\\\"],[[33,2],\\\"timeline\\\"]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"info\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,0],[[[1,\\\"            \\\"],[10,1],[14,0,\\\"sr-only\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,4],[\\\"purecloud.acdInteraction.noSelectionAllowed\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[10,0],[14,0,\\\"title-container\\\"],[12],[1,\\\"\\\\n            \\\"],[10,2],[14,0,\\\"title\\\"],[15,\\\"title\\\",[36,5]],[12],[1,\\\"\\\\n                \\\"],[1,[34,5]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"subtitle-container hoverable\\\"],[12],[1,\\\"\\\\n            \\\"],[10,2],[14,0,\\\"subtitle\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,4],[\\\"purecloud.acdInteraction.conferencing.queue\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,6],[[[1,\\\"                \\\"],[10,2],[14,0,\\\"subtitle\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"alert-warning-triangle\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                    \\\"],[1,[28,[35,4],[\\\"purecloud.entity.queueDetails.errorSimplified\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,7],[[[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,8,[\\\"length\\\"]],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"subtitle summary-data-container\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,10],[[28,[37,10],[[33,8]],null]],null],null,[[[41,[30,2],[[[1,\\\"                                \\\"],[10,1],[14,0,\\\"divider\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[28,[37,11],[[30,1,[\\\"waitingCount\\\"]],1],null],[[[1,\\\"                                \\\"],[1,[28,[35,4],[[28,[37,12],[\\\"purecloud.conversationSummary.\\\",[30,1,[\\\"key\\\"]],\\\".singular\\\"],null]],[[\\\"count\\\"],[[30,1,[\\\"waitingCount\\\"]]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                \\\"],[1,[28,[35,4],[[28,[37,12],[\\\"purecloud.conversationSummary.\\\",[30,1,[\\\"key\\\"]],\\\".plural\\\"],null]],[[\\\"count\\\"],[[30,1,[\\\"waitingCount\\\"]]]]]],[1,\\\"\\\\n\\\"]],[]]]],[1,2]],null],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n                \\\"],[10,2],[14,0,\\\"subtitle off-hover\\\"],[15,\\\"aria-label\\\",[29,[[36,13],\\\" \\\",[36,14]]]],[12],[1,\\\"\\\\n                    \\\"],[1,[34,13]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,2],[14,0,\\\"subtitle on-hover\\\"],[15,\\\"aria-label\\\",[29,[[36,13],\\\" \\\",[36,14]]]],[12],[1,\\\"\\\\n                    \\\"],[1,[34,14]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"]],[]]]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[\\\"data\\\",\\\"index\\\"],false,[\\\"readOnly\\\",\\\"target-dropdown/thumbnail\\\",\\\"queue\\\",\\\"if\\\",\\\"t\\\",\\\"name\\\",\\\"queueDetailsError\\\",\\\"loadingQueueDetails\\\",\\\"queueDetailSummary\\\",\\\"each\\\",\\\"-track-array\\\",\\\"eq\\\",\\\"concat\\\",\\\"availableAgentsCountLabel\\\",\\\"estimatedWaitTimeLabel\\\"]]\",\"moduleName\":\"web-directory/components/target-dropdown/rows/queue-row/template.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"cCchwoYr\",\"block\":\"[[[41,[51,[33,1]],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"dropdown-header\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,3],[[[1,\\\"            \\\"],[10,\\\"button\\\"],[14,\\\"popover-action\\\",\\\"prevent\\\"],[14,0,\\\"back\\\"],[15,\\\"onclick\\\",[28,[37,4],[[30,0],\\\"onBack\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"arrow-left\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[1,[28,[35,5],[[33,6]],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,7],[[33,8]],null],[[[1,\\\"            \\\"],[10,\\\"h2\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,5],[[33,9]],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"]],[]],null]],[]]],[41,[28,[37,10],[[33,8],[33,9]],null],[[[1,\\\"            \\\"],[10,\\\"h2\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,5],[[33,9]],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"actions\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"search-container\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"search-icon\\\"],[14,\\\"icon-name\\\",\\\"search\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[10,\\\"input\\\"],[14,1,\\\"searchInput\\\"],[15,\\\"placeholder\\\",[29,[[28,[37,5],[[33,11]],null]]]],[14,\\\"autofocus\\\",\\\"\\\"],[15,2,[29,[[36,12]]]],[15,\\\"oninput\\\",[28,[37,4],[[30,0],\\\"onSearchChange\\\"],null]],[14,4,\\\"text\\\"],[12],[13],[1,\\\"\\\\n\\\\n                \\\"],[10,0],[14,0,\\\"search-actions\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,13],[[33,12],\\\"\\\"],null],[[[1,\\\"                        \\\"],[10,\\\"button\\\"],[14,\\\"popover-action\\\",\\\"prevent\\\"],[14,0,\\\"clear-button\\\"],[15,\\\"aria-label\\\",[28,[37,5],[\\\"common.clear\\\"],null]],[15,\\\"onclick\\\",[28,[37,4],[[30,0],\\\"onClearSearch\\\"],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"close\\\"],[15,\\\"screenreader-text\\\",[28,[37,5],[\\\"common.clear\\\"],null]],[12],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,10],[[33,14],[33,15]],null],[[[1,\\\"                \\\"],[10,\\\"button\\\"],[14,1,\\\"target-dropdown-add-button\\\"],[14,0,\\\"add-button\\\"],[15,\\\"onclick\\\",[28,[37,4],[[30,0],\\\"onNumberSelected\\\"],null]],[15,\\\"aria-label\\\",[28,[37,5],[[33,16]],null]],[14,4,\\\"button\\\"],[12],[1,\\\"\\\\n\\\"],[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[15,\\\"icon-name\\\",[36,17]],[15,\\\"screenreader-text\\\",[28,[37,5],[[33,16]],null]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[14,\\\"for\\\",\\\"target-dropdown-add-button\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,5],[[33,16]],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,18],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"filter-container\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"filter-wrapper\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,20],[[33,21]],null],null,[[[41,[28,[37,22],[[33,23],1],null],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"single-filter-container\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"gux-icon\\\"],[15,\\\"icon-name\\\",[29,[[30,1,[\\\"icon\\\"]]]]],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                        \\\"],[10,2],[12],[1,\\\"\\\\n\\\"],[1,\\\"                            \\\"],[1,[28,[35,5],[[30,1,[\\\"label\\\"]]],[[\\\"count\\\"],[[52,[28,[37,22],[[30,1,[\\\"totalElements\\\"]],[27]],null],\\\"-\\\",[28,[37,24],[\\\"\\\",[30,1,[\\\"totalElements\\\"]]],null]]]]]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[1,[28,[35,25],null,[[\\\"isActive\\\",\\\"icon\\\",\\\"value\\\",\\\"label\\\",\\\"totalElements\\\",\\\"actionFilterChange\\\"],[[28,[37,22],[[33,26],[30,1,[\\\"value\\\"]]],null],[30,1,[\\\"icon\\\"]],[30,1,[\\\"value\\\"]],[28,[37,5],[[30,1,[\\\"label\\\"]]],[[\\\"count\\\"],[[52,[28,[37,22],[[30,1,[\\\"totalElements\\\"]],[27]],null],\\\"-\\\",[28,[37,24],[\\\"\\\",[30,1,[\\\"totalElements\\\"]]],null]]]]],[30,1,[\\\"totalElements\\\"]],[28,[37,4],[[30,0],\\\"onFilterChange\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]]]],[1,2]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"content\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,22],[[33,27],[27]],null],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"message-wrapper\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin target-dropdown-loader\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,22],[[33,27,[\\\"length\\\"]],0],null],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"message-wrapper\\\"],[12],[1,\\\"\\\\n                \\\"],[10,2],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,5],[\\\"components.entitySearch.noResults\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[6,[39,28],null,[[\\\"disabled\\\",\\\"loading\\\",\\\"infiniteScroll\\\"],[[33,29],[33,30],[28,[37,4],[[30,0],\\\"onInfiniteScroll\\\"],null]]],[[\\\"default\\\"],[[[[42,[28,[37,31],[[28,[37,31],[[33,27]],null]],null],null,[[[41,[28,[37,22],[[30,3,[\\\"type\\\"]],\\\"queue\\\"],null],[[[1,\\\"                        \\\"],[1,[28,[35,32],null,[[\\\"queue\\\",\\\"interactionType\\\",\\\"interactable\\\",\\\"actionSelected\\\"],[[30,3],[33,33,[\\\"type\\\"]],[28,[37,10],[[28,[37,13],[[30,3,[\\\"id\\\"]],[33,34,[\\\"id\\\"]]],null],[28,[37,7],[[28,[37,35],[[33,36],[30,3,[\\\"id\\\"]]],null]],null]],null],[28,[37,4],[[30,0],\\\"onDataRowSelected\\\",[30,3]],null]]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,22],[[30,3,[\\\"type\\\"]],\\\"person\\\"],null],[[[1,\\\"                        \\\"],[1,[28,[35,37],null,[[\\\"person\\\",\\\"requiredPermissions\\\",\\\"interactionType\\\",\\\"interactable\\\",\\\"isSelf\\\",\\\"isInConversation\\\",\\\"actionSelected\\\",\\\"showDirectTransferToVoicemailDropdown\\\",\\\"conversationHasActiveParticipants\\\",\\\"transferToVoicemailClick\\\",\\\"useEnhancedPermissions\\\"],[[30,3],[33,38],[33,33,[\\\"type\\\"]],[28,[37,10],[[28,[37,13],[[30,3,[\\\"id\\\"]],[33,34,[\\\"id\\\"]]],null],[28,[37,7],[[28,[37,35],[[33,36],[30,3,[\\\"id\\\"]]],null]],null]],null],[28,[37,22],[[30,3,[\\\"id\\\"]],[33,34,[\\\"id\\\"]]],null],[28,[37,35],[[33,36],[30,3,[\\\"id\\\"]]],null],[28,[37,4],[[30,0],\\\"onDataRowSelected\\\",[30,3]],null],[33,39],[33,40],[33,41],[33,42]]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,22],[[30,3,[\\\"type\\\"]],\\\"external\\\"],null],[[[1,\\\"                        \\\"],[1,[28,[35,43],null,[[\\\"externalContact\\\",\\\"interactionType\\\",\\\"actionNumberSelected\\\",\\\"actionEmailSelected\\\",\\\"actionSelected\\\",\\\"interactable\\\",\\\"acdExternalContactDivNameFT\\\"],[[30,3],[33,33,[\\\"type\\\"]],[28,[37,4],[[30,0],\\\"onDataRowSelected\\\"],null],[28,[37,4],[[30,0],\\\"onDataRowSelected\\\"],null],[28,[37,4],[[30,0],\\\"onDataRowSelected\\\",[30,3]],null],[28,[37,10],[[28,[37,13],[[30,3,[\\\"id\\\"]],[33,34,[\\\"id\\\"]]],null],[28,[37,7],[[28,[37,35],[[33,36],[30,3,[\\\"id\\\"]]],null]],null]],null],[33,44]]]]],[1,\\\"\\\\n                    \\\"]],[]],null]],[]]]],[]]]],[3]],null]],[]]]]],[1,\\\"        \\\"]],[]]]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"footer\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"footer-container\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,10],[[28,[37,13],[[33,45],[27]],null],[28,[37,13],[[33,27],[27]],null]],null],[[[1,\\\"                \\\"],[10,2],[14,\\\"role\\\",\\\"alert\\\"],[14,\\\"aria-live\\\",\\\"assertive\\\"],[14,\\\"aria-atomic\\\",\\\"true\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,5],[\\\"purecloud.acdInteraction.conversation.searchResults\\\"],[[\\\"count\\\",\\\"total\\\"],[[28,[37,24],[\\\"\\\",[33,27,[\\\"length\\\"]]],null],[28,[37,24],[\\\"\\\",[33,45]],null]]]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin target-dropdown-loader\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"filter\\\",\\\"key\\\",\\\"data\\\"],false,[\\\"unless\\\",\\\"hideHeader\\\",\\\"if\\\",\\\"showBack\\\",\\\"action\\\",\\\"t\\\",\\\"backText\\\",\\\"not\\\",\\\"acdWarmConferencePhase1FT\\\",\\\"header\\\",\\\"and\\\",\\\"searchPlaceholderText\\\",\\\"searchValue\\\",\\\"not-eq\\\",\\\"allowRawInputSelection\\\",\\\"searchValueIsValid\\\",\\\"addButtonTooltip\\\",\\\"addButtonIcon\\\",\\\"_showContent\\\",\\\"each\\\",\\\"-each-in\\\",\\\"filters\\\",\\\"eq\\\",\\\"filterCount\\\",\\\"concat\\\",\\\"target-dropdown/filter\\\",\\\"activeFilter\\\",\\\"searchResults\\\",\\\"infinite-scroll\\\",\\\"disableInfiniteScroll\\\",\\\"infiniteScrollLoading\\\",\\\"-track-array\\\",\\\"target-dropdown/rows/queue-row\\\",\\\"interaction\\\",\\\"authUser\\\",\\\"array-contains\\\",\\\"activeParticipantIds\\\",\\\"target-dropdown/rows/person-row\\\",\\\"requiredPersonPermissions\\\",\\\"showDirectTransferToVoicemailDropdown\\\",\\\"conversationHasActiveParticipants\\\",\\\"transferToVoicemailClick\\\",\\\"digitalConsultEnabled\\\",\\\"target-dropdown/rows/external-contact-row\\\",\\\"acdExternalContactDivNameFT\\\",\\\"totalElements\\\"]]\",\"moduleName\":\"web-directory/components/target-dropdown/template.hbs\",\"isStrictMode\":false});","import Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport LoggerMixin from '../../../mixins/logger';\n\ntype ProfileImage = {\n    uri?: string;\n    resolution?: string;\n};\n\nexport default Component.extend(LoggerMixin, {\n    classNames: ['conversation-thumbnail'],\n\n    /**\n     * The participant whose thumbnail should be shown\n     */\n    participant: null,\n    /**\n     * @optional\n     * The name of the icon to display in an empty thumbnail\n     */\n    iconName: null,\n    /**\n     * @optional\n     * The text to display in the thumbnail\n     */\n    text: null,\n    /**\n     * The color of the indicator to show in the bottom right of the thumbnail.\n     * Typically used to show a users current presence\n     */\n    showIndicator: false,\n\n    /**\n     * Returns a formatted thumbnail style to apply to the thumbnail if applicable\n     */\n    thumbnailStyle: computed('participant.images', function () {\n        const profiles = this.get('participant.images.profile');\n        // if no profiles to take images from then return\n        if (!profiles) {\n            return;\n        }\n\n        const images: ProfileImage[] = [];\n        for (const [resolution, uri] of Object.entries<string>(profiles[0].ref)) {\n            images.push({\n                uri,\n                resolution\n            });\n        }\n\n        /**\n         * Find the smallest resolution since these are small views.\n         * Todo: make the resolution configurable on the component for larger thumbnails if needed\n         */\n        const img = images.reduce((a: ProfileImage, b: ProfileImage) => {\n            const aResolution = a.resolution?.replace('x', '');\n            const bResolution = b.resolution?.replace('x', '');\n\n            if (aResolution && bResolution) {\n                if (Number.isNaN(+aResolution)) {\n                    return b;\n                } else if (Number.isNaN(+bResolution)) {\n                    return a;\n                }\n                return +aResolution <= +bResolution ? a : b;\n            }\n            return !!a.uri ? a : b;\n        }, {});\n\n        return img?.uri ? `background-image: url(${img.uri})` : null;\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"0NE4nNzQ\",\"block\":\"[[[10,0],[14,0,\\\"thumbnail-wrapper\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"thumbnail-image\\\"],[15,5,[36,0]],[12],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[37,2],[[33,3],null],null],[[[1,\\\"    \\\"],[10,\\\"gux-icon\\\"],[15,\\\"icon-name\\\",[36,3]],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,2],[[33,4],null],null],[[[1,\\\"    \\\"],[10,2],[14,0,\\\"thumbnail-text\\\"],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,[34,4]],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]],[1,\\\"\\\\n\\\"],[41,[33,5],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"indicator\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],null]],[],false,[\\\"thumbnailStyle\\\",\\\"if\\\",\\\"not-eq\\\",\\\"iconName\\\",\\\"text\\\",\\\"showIndicator\\\"]]\",\"moduleName\":\"web-directory/components/target-dropdown/thumbnail/template.hbs\",\"isStrictMode\":false});","export * from './filter-store-config.type';\nexport * from './filter.type';\nexport * from './pagination-options.type';\nexport * from './conversation-summary.type';\nexport * from './queue-details.type';\n","import { ConversationSummaryType } from './conversation-summary.type';\n\nexport const QueueDetailMetric = ['oWaiting', 'oOnQueueUsers'] as const;\nexport type QueueDetailMetricType = (typeof QueueDetailMetric)[number];\n\nexport const QueueDetailQualifier = ['NOT_RESPONDING', 'IDLE', 'INTERACTING'] as const;\nexport type QueueDetailQualifierType = (typeof QueueDetailQualifier)[number];\n\nexport const QueueWaitTimeFormula = ['BEST'] as const;\nexport type QueueWaitTimeFormulaType = (typeof QueueWaitTimeFormula)[number];\n\nexport type QueueWaitTime = {\n    /**\n     * The interaction type that this queue wait time is pertaining to\n     */\n    intent: string;\n    /**\n     * Formula depicting if this wait time value is considered the BEST value\n     */\n    formula: QueueWaitTimeFormulaType;\n    /**\n     * The average amount of seconds to wait on queue for\n     */\n    estimatedWaitTimeSeconds: number;\n};\n\nexport type QueueObservationsData = {\n    /**\n     * Corresponding statistical data regarding this queue's media group\n     */\n    data: QueueDetailData[];\n    /**\n     * Grouping of general data regarding this queue data\n     */\n    group: {\n        /**\n         * The id of the queue in question\n         */\n        queueId: string;\n        /**\n         * The media type that this observation data is pertaining to\n         */\n        mediaType?: ConversationSummaryType;\n    };\n};\n\nexport type QueueDetailDataStats = {\n    /**\n     * The amount of agents currently available\n     */\n    count: number;\n};\n\nexport type QueueDetailData = {\n    /**\n     * The metric of the data being tracked\n     */\n    metric: QueueDetailMetricType;\n    /**\n     * The additional stats that correspond to the metric\n     */\n    stats: QueueDetailDataStats;\n    /**\n     * The qualifier for this detail data\n     */\n    qualifier?: QueueDetailQualifierType;\n};\n\nexport type QueueDetail = {\n    /**\n     * Information pertaining to this queue details wait time\n     */\n    waitTime: QueueWaitTime;\n    /**\n     * The amount of media interactions are waiting to be answered on\n     * the corresponding queue\n     */\n    waitingCount: number;\n    /**\n     * Corresponding statistical data regarding this queue\n     */\n    data: QueueDetailData[];\n    /**\n     * The icon to visually represent this specific set of queue details\n     */\n    icon: string;\n    /**\n     * @Optional\n     * The key to easily index the queue details.\n     */\n    key?: ConversationSummaryType;\n};\n\nexport type QueueDetails = { [key in ConversationSummaryType]: QueueDetail };\n","import { inject as service } from '@ember/service';\nimport { computed } from '@ember/object';\nimport Component from '@ember/component';\nimport layout from './template';\n\nconst MINUTE = 1000 * 60;\nconst HOUR = MINUTE * 60;\nconst DAY = HOUR * 24;\n\nexport default Component.extend({\n    classNames: ['time-elapsed'],\n    tagName: 'span',\n    layout,\n\n    clock: service(),\n    intl: service(),\n\n    timeSince: null,\n\n    _calculateElapsedTime(durationInMs) {\n        durationInMs = durationInMs > 0 ? durationInMs : 0; // Do not show negative durations.\n\n        const totalHours = Math.floor(durationInMs / HOUR);\n        const days = Math.floor(totalHours / 24);\n        const hours = totalHours % 24;\n        const minutes = Math.floor((durationInMs % HOUR) / MINUTE);\n\n        if (days) {\n            if (hours) {\n                return this.intl.t('components.timeElapsed.detail.daysHours', {\n                    days: days,\n                    hours: hours\n                });\n            }\n            return this.intl.t('components.timeElapsed.detail.days', {\n                days: days\n            });\n        } else if (hours) {\n            if (minutes) {\n                return this.intl.t('components.timeElapsed.detail.hoursMinutes', {\n                    hours: hours,\n                    minutes: minutes\n                });\n            }\n            return this.intl.t('components.timeElapsed.detail.hours', {\n                hours: hours\n            });\n        }\n\n        return this.intl.t('components.timeElapsed.detail.minutes', {\n            minutes: minutes || '0'\n        });\n    },\n\n    _formatDuration: function () {\n        const timeSince = this.get('timeSince');\n        if (!timeSince) {\n            return '';\n        }\n        const parsed = new Date(timeSince).getTime();\n        if (isNaN(parsed)) {\n            return '';\n        }\n        const msSince = Date.now() - parsed;\n        let unit, cnt;\n\n        if (msSince > DAY) {\n            unit = 'days';\n        } else if (msSince > HOUR) {\n            unit = 'hours';\n        } else if (msSince > MINUTE) {\n            unit = 'minutes';\n        } else {\n            return this.intl.t('components.timeElapsed.now');\n        }\n\n        if (unit === 'days') {\n            cnt = Math.floor(msSince / DAY);\n        } else if (unit === 'hours') {\n            cnt = Math.floor(msSince / HOUR);\n        } else {\n            cnt = Math.floor(msSince / MINUTE);\n        }\n\n        if (cnt < 2) {\n            return this.intl.t(`components.timeElapsed.singular.${unit}`);\n        }\n\n        return this.intl.t(`components.timeElapsed.plural.${unit}`, { count: cnt });\n    },\n\n    tickingDuration: computed('timeSince', 'clock.second', function () {\n        //Touch clock.second to keep Glimmer tracking alive\n        this.get('clock.second');\n        return this._formatDuration();\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"qOEJbq5Z\",\"block\":\"[[[10,1],[12],[1,[34,0]],[13]],[],false,[\\\"tickingDuration\\\"]]\",\"moduleName\":\"web-directory/components/time-elapsed/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport Component from '@ember/component';\nimport { computed, get } from '@ember/object';\nimport _ from 'lodash';\n\nconst CHAT_TYPE_MESSAGES = ['mention', 'direct-message', 'room-message'];\n\nexport default Component.extend({\n    classNames: ['timeline-stream'],\n\n    intl: service(),\n    timeline: service(),\n    permissions: service(),\n\n    actions: {\n        markAllRead() {\n            this.timeline.markAllRead();\n        },\n\n        clearAllEvents() {\n            this.timeline.clearAllEvents();\n        }\n    },\n\n    newEvents: computed('timeline.events.@each.acknowledged', 'permissions.canViewBusinessChat', function () {\n        let eventList = null;\n        if (this.get('permissions.canViewBusinessChat')) {\n            eventList = this.get('timeline.events');\n        } else {\n            eventList = this.get('timeline.events').filter(entity => {\n                if (!CHAT_TYPE_MESSAGES.includes(get(entity, 'type'))) {\n                    return true;\n                }\n            });\n        }\n\n        return _.reduce(\n            eventList,\n            function (count, event) {\n                return event.get('acknowledged') ? count : count + 1;\n            },\n            0\n        );\n    }),\n\n    allAcknowledged: computed('timeline.events.@each.acknowledged', function () {\n        const events = this.get('timeline.events');\n        if (!events.length) {\n            return false;\n        }\n        let count = _.reduce(events, (count, event) => (event.get('acknowledged') ? count : count + 1), 0);\n\n        return count === 0;\n    }),\n\n    updateString: computed('newEvents', function () {\n        const intl = this.intl;\n        var count = this.newEvents;\n        var args = { count: count };\n        if (count === 1) {\n            return intl.t('timeline.updateCounter.single', args);\n        } else {\n            return intl.t('timeline.updateCounter.plural', args);\n        }\n    }),\n\n    timelineSortedEvents: computed('permissions.canViewBusinessChat', 'timeline.sortedEvents.[]', function () {\n        if (!this.get('permissions.canViewBusinessChat')) {\n            return this.get('timeline.sortedEvents').filter(entity => {\n                if (!CHAT_TYPE_MESSAGES.includes(get(entity, 'type'))) {\n                    return true;\n                }\n            });\n        } else {\n            return this.get('timeline.sortedEvents');\n        }\n    })\n});\n","import { computed, observer } from '@ember/object';\nimport { scheduleOnce } from '@ember/runloop';\nimport { on } from '@ember/object/evented';\nimport { reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport RendererBase from '../renderer-component-base';\nimport { emojifyDom } from 'web-directory/utils/emoji';\n\nconst DirectMessageRenderer = RendererBase.extend({\n    classNameBindings: [':timeline-event', ':direct-message-timeline-event', 'acknowledged'],\n\n    intl: service(),\n    chat: service(),\n    sidebar: service(),\n    commandNav: service('command-nav'),\n    session: service(),\n    permissions: service(),\n\n    canViewChat: reads('permissions.canViewBusinessChat'),\n    entity: null,\n    fromPerson: reads('entity.from'),\n    messages: reads('entity.messages'),\n\n    runEmojify: on(\n        'didInsertElement',\n        observer('messages.length', function () {\n            scheduleOnce('afterRender', this, function () {\n                var contentTag = this.$();\n                if (contentTag.length > 0) {\n                    emojifyDom(contentTag[0]);\n                }\n            });\n        })\n    ),\n\n    description: computed('messages.length', function () {\n        const count = this.get('messages.length');\n        const intl = this.intl;\n\n        if (count === 1) {\n            return intl.safestring('timeline.direct.description-singular');\n        } else {\n            return intl.safestring('timeline.direct.description-plural', { count });\n        }\n    }),\n\n    click() {\n        this._super();\n        const jid = this.get('fromPerson.jid');\n\n        this.chat.openRoom(jid);\n\n        if (this.get('session.useNewNav')) {\n            this.commandNav.selectPanel('chats');\n        } else {\n            this.sidebar.openPanel('conversations');\n        }\n    }\n});\n\nexport default DirectMessageRenderer;\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"QYD/hDFp\",\"block\":\"[[[10,0],[14,0,\\\"header\\\"],[12],[1,\\\"\\\\n\\\"],[6,[39,0],null,[[\\\"entity\\\",\\\"enableMiniCard\\\",\\\"size\\\",\\\"isLinkable\\\",\\\"canViewChat\\\",\\\"showPresence\\\"],[[33,1],true,48,true,[33,2],true]],[[\\\"default\\\"],[[[[1,\\\"        \\\"],[1,[28,[35,3],null,[[\\\"entity\\\"],[[33,1]]]]],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"title\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"primary\\\"],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"from\\\"],[12],[1,[33,1,[\\\"name\\\"]]],[13],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"description\\\"],[12],[1,[34,4]],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"secondary\\\"],[12],[1,[34,5]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[41,[51,[33,7]],[[[42,[28,[37,9],[[28,[37,9],[[33,10]],null]],null],null,[[[6,[39,11],null,null,[[\\\"default\\\"],[[[[1,\\\"            \\\"],[2,[30,1,[\\\"messageBody\\\"]]],[1,\\\"\\\\n\\\"]],[]]]]]],[1]],null]],[]],null]],[\\\"message\\\"],false,[\\\"entity-image\\\",\\\"fromPerson\\\",\\\"canViewChat\\\",\\\"integration-badges\\\",\\\"description\\\",\\\"timeDisplay\\\",\\\"unless\\\",\\\"acknowledged\\\",\\\"each\\\",\\\"-track-array\\\",\\\"messages\\\",\\\"emoji-dom\\\"]]\",\"moduleName\":\"web-directory/components/timeline-stream/direct-message-renderer/template.hbs\",\"isStrictMode\":false});","import { computed } from '@ember/object';\nimport { reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport RendererBase from '../renderer-component-base';\n\nconst TimelineMentionRenderer = RendererBase.extend({\n    classNameBindings: [':timeline-event', ':mention-timeline-event', 'acknowledged'],\n\n    chat: service(),\n    sidebar: service(),\n    commandNav: service('command-nav'),\n    session: service(),\n\n    entity: null,\n    message: reads('entity.message'),\n    fromPerson: reads('entity.message.chatUser'),\n    room: reads('entity.message.room'),\n\n    roomSubject: computed('entity.message', function () {\n        const message = this.get('entity.message');\n        if (message) {\n            return message.roomName;\n        }\n\n        const roomName = this.get('entity.message.room.subject');\n        return roomName;\n    }),\n\n    click() {\n        this._super();\n\n        const room = this.room;\n        const jid = room.get('jid');\n        this.chat.openRoom(jid);\n\n        if (this.get('session.useNewNav')) {\n            this.commandNav.selectPanel('chats');\n        } else {\n            this.sidebar.openPanel('conversations');\n        }\n    }\n});\n\nexport default TimelineMentionRenderer;\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"nKHs01f7\",\"block\":\"[[[10,0],[14,0,\\\"header\\\"],[12],[1,\\\"\\\\n\\\"],[6,[39,0],null,[[\\\"entity\\\",\\\"enableMiniCard\\\",\\\"size\\\",\\\"isLinkable\\\",\\\"showPresence\\\"],[[33,1],true,48,true,true]],[[\\\"default\\\"],[[[[1,\\\"        \\\"],[1,[28,[35,2],null,[[\\\"entity\\\"],[[33,1]]]]],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"title\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"primary\\\"],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"from\\\"],[12],[1,[33,1,[\\\"name\\\"]]],[13],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"description\\\"],[12],[1,[28,[35,3],[\\\"timeline.mention.description\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"room\\\"],[12],[1,[28,[35,4],[[33,5]],null]],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"secondary\\\"],[12],[1,[34,6]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[51,[33,8]],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"widgets-default\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"message-container\\\"],[12],[1,\\\"\\\\n\\\"],[6,[39,9],null,null,[[\\\"default\\\"],[[[[1,\\\"                \\\"],[2,[33,10,[\\\"messageBody\\\"]]],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[],false,[\\\"entity-image\\\",\\\"fromPerson\\\",\\\"integration-badges\\\",\\\"t\\\",\\\"emoji-text\\\",\\\"roomSubject\\\",\\\"timeDisplay\\\",\\\"unless\\\",\\\"acknowledged\\\",\\\"emoji-dom\\\",\\\"message\\\"]]\",\"moduleName\":\"web-directory/components/timeline-stream/mention-renderer/template.hbs\",\"isStrictMode\":false});","import { resolve } from 'rsvp';\nimport { computed } from '@ember/object';\nimport { reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport _ from 'lodash';\nimport RendererBase from '../renderer-component-base';\n\nconst MissedCallRenderer = RendererBase.extend({\n    classNameBindings: [':timeline-event', ':missed-call-timeline-event', 'acknowledged'],\n\n    intl: service(),\n    phone: service('phone'),\n    chat: service('chat'),\n    addressformat: service(),\n    permissions: service(),\n    store: service(),\n\n    canViewChat: reads('permissions.canViewBusinessChat'),\n    call: reads('entity.call'),\n    voicemail: null,\n    showVoicemail: false,\n    phoneNumber: null,\n    otherPartyGuid: null,\n    caller: null,\n    callText: computed('caller', function () {\n        const person = this.caller;\n        if (person) {\n            if (this.showVoicemail) {\n                return this.intl.t('timeline.missedCall.voicemailFrom', { person });\n            }\n            return this.intl.t('timeline.missedCall.callFrom', { person });\n        }\n        return this.intl.t('timeline.missedCall.missed');\n    }),\n\n    actions: {\n        makeCall: function () {\n            this.phone.makeCall(this.phoneNumber);\n        }\n    },\n\n    didReceiveAttrs() {\n        this._super(...arguments);\n        this.setCaller();\n    },\n\n    init() {\n        this._super(...arguments);\n        this.setCaller();\n    },\n\n    person: computed('otherPartyGuid', function () {\n        if (this.otherPartyGuid) {\n            return this.store.findRecord('person', this.otherPartyGuid);\n        }\n        return resolve();\n    }),\n\n    setCaller() {\n        if (this.voicemail) {\n            //is a voicemail recording\n            const caller = this.get('voicemail.callerAddress') || this.get('voicemail.callerName');\n            this.set('showVoicemail', true);\n            this.set('caller', caller);\n        }\n\n        //is a missed call with no voicemail\n        const callObject = this.call;\n        const otherParty = callObject && (callObject.get('initiator') || _.last(callObject.get('otherParties')));\n        if (!otherParty) {\n            return resolve();\n        }\n        let number = otherParty.ani;\n        if (!number) {\n            number = otherParty.dnis;\n        }\n        this.set('phoneNumber', number);\n        const otherPartyUserId = otherParty.userId\n            ? otherParty.userId\n            : otherParty.user && otherParty.user.id\n            ? otherParty.user.id\n            : null;\n        if (otherPartyUserId) {\n            this.set('otherPartyGuid', otherPartyUserId);\n            return this.store.find('person', otherPartyUserId).then(result => {\n                this.set('caller', result.get('name'));\n            });\n        } else if (otherParty.purpose.toLowerCase() === 'external') {\n            try {\n                const caller = this.addressformat.formatAddressForDisplay(number);\n                this.set('caller', caller);\n            } catch (error) {\n                console.warn('invalid phone number');\n                this.set('caller', null);\n            }\n        } else if (otherParty.purpose.toLowerCase() === 'user') {\n            const caller = this.addressformat.formatAddressForDisplay(number);\n            this.set('caller', caller);\n        } else {\n            this.set('caller', number);\n        }\n        return resolve();\n    }\n});\n\nexport default MissedCallRenderer;\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"qx+Of+BX\",\"block\":\"[[[10,0],[14,0,\\\"header\\\"],[12],[1,\\\"\\\\n\\\"],[6,[39,0],null,[[\\\"canViewChat\\\",\\\"entity\\\",\\\"showPresence\\\",\\\"enableMiniCard\\\"],[[33,1],[28,[37,2],[[33,3]],null],true,true]],[[\\\"default\\\"],[[[[1,\\\"        \\\"],[1,[28,[35,4],null,[[\\\"entity\\\"],[[28,[37,2],[[33,3]],null]]]]],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"    \\\"],[10,0],[14,0,\\\"title\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"primary\\\"],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"description\\\"],[12],[2,[36,5]],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"secondary\\\"],[12],[1,[34,6]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,8],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"btn-group callback\\\"],[12],[1,\\\"\\\\n            \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-purecloud btn-phone timeline-callback\\\"],[16,\\\"aria-label\\\",[28,[37,9],[\\\"components.inbox.actions.call\\\"],null]],[24,4,\\\"button\\\"],[4,[38,10],[[30,0],\\\"makeCall\\\"],null],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/phone\\\"],[15,\\\"screenreader-text\\\",[28,[37,9],[\\\"components.inbox.actions.call\\\"],null]],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"missed-call-content\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[37,11],[[33,12],[33,13,[\\\"voicemail\\\"]]],null],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"recording\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,14],null,[[\\\"source\\\"],[[33,15,[\\\"audioSource\\\"]]]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13]],[],false,[\\\"entity-image\\\",\\\"canViewChat\\\",\\\"await\\\",\\\"person\\\",\\\"integration-badges\\\",\\\"callText\\\",\\\"timeDisplay\\\",\\\"if\\\",\\\"phoneNumber\\\",\\\"t\\\",\\\"action\\\",\\\"and\\\",\\\"showVoicemail\\\",\\\"entity\\\",\\\"audio-player\\\",\\\"voicemail\\\"]]\",\"moduleName\":\"web-directory/components/timeline-stream/missed-call-renderer/template.hbs\",\"isStrictMode\":false});","import { later } from '@ember/runloop';\nimport { on } from '@ember/object/evented';\nimport { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Component from '@ember/component';\nimport { formatDateForDisplay, formatTimeForDisplay } from 'web-directory/utils/date-time';\nimport { Intl as SparkIntl } from 'genesys-spark';\nimport { reads } from '@ember/object/computed';\n\n// Milliseconds in one hour (1000ms * 60s * 60min)\nconst HOUR = 1000 * 60 * 60;\n\n/**\n * Produces a calendar-style string similar to moment's .calendar() output.\n * e.g. \"Today at 2:30 PM\", \"Yesterday at 2:30 PM\", \"Monday at 2:30 PM\", \"1/22/25 2:30 PM\"\n */\nfunction formatCalendar(date: Date, intl: any): string {\n    const now = new Date();\n    const d = new Date(date);\n    const time = formatTimeForDisplay(d.toISOString(), 'short');\n\n    if (d.toDateString() === now.toDateString()) {\n        return intl.t('timeline.calendar.todayAt', { time });\n    }\n\n    const yesterday = new Date(now);\n    yesterday.setDate(now.getDate() - 1);\n    if (d.toDateString() === yesterday.toDateString()) {\n        return intl.t('timeline.calendar.yesterdayAt', { time });\n    }\n\n    const sixDaysAgo = new Date(now);\n    sixDaysAgo.setDate(now.getDate() - 6);\n    sixDaysAgo.setHours(0, 0, 0, 0);\n    if (d >= sixDaysAgo) {\n        const weekday = SparkIntl.dateTimeFormat({ weekday: 'long' }).format(d);\n        return intl.t('timeline.calendar.weekdayAt', { weekday, time });\n    }\n\n    return `${formatDateForDisplay(d.toISOString(), 'short')} ${time}`;\n}\n\n/**\n * Base component for timeline stream event renderers.\n * Provides common time display formatting and click-to-acknowledge behavior.\n */\nconst RendererComponentBase = Component.extend({\n    intl: service() as any,\n    timeline: service('timeline') as any,\n\n    acknowledged: reads('entity.acknowledged'),\n    timeAt: reads('entity.timeAt'),\n\n    timeDisplay: computed('timeAt', function (this: any): string {\n        const timeAt = this.get('timeAt');\n        const d = new Date(timeAt);\n        return formatCalendar(d, this.get('intl'));\n    }),\n\n    updateTimeDisplay: on('init', function (this: any) {\n        later(\n            this,\n            function (this: any) {\n                this.notifyPropertyChange('timeAt');\n                this.updateTimeDisplay();\n            },\n            HOUR\n        );\n    }),\n\n    click(this: any) {\n        this.set('entity.acknowledged', true);\n        this.get('timeline').markEventAcknowledged(this.get('entity'));\n    }\n});\n\nexport default RendererComponentBase;\n","import { computed } from '@ember/object';\nimport { reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport RendererBase from '../renderer-component-base';\n\nconst RoomMessageRenderer = RendererBase.extend({\n    classNameBindings: [':timeline-event', ':room-message-timeline-event', 'acknowledged'],\n\n    intl: service(),\n    chat: service(),\n    sidebar: service(),\n    commandNav: service('command-nav'),\n    session: service(),\n\n    entity: null,\n    room: reads('entity.room'),\n    messages: reads('entity.messages'),\n\n    description: computed('messages.length', function () {\n        const intl = this.intl;\n        const count = this.get('messages.length');\n\n        if (count === 1) {\n            return intl.safestring('timeline.room.description-singular');\n        } else {\n            return intl.safestring('timeline.room.description-plural', { count });\n        }\n    }),\n\n    roomSubject: computed('entity.messages', 'entity.room', function () {\n        const messages = this.get('entity.messages');\n\n        if (messages && messages[0]) {\n            return messages[0].roomName;\n        }\n\n        const roomSubj = this.get('entity.room.subject');\n\n        return roomSubj;\n    }),\n\n    click() {\n        this._super();\n\n        if (this.get('entity.eventKey') === 'supervisorassistance' && !this.get('session.useNewNav')) {\n            this.sidebar.openPanel('agentAssistance');\n        } else {\n            const room = this.room;\n            const jid = room.get('jid');\n            this.chat.openRoom(jid);\n\n            if (this.get('session.useNewNav')) {\n                this.commandNav.selectPanel('chats');\n            } else {\n                this.sidebar.openPanel('conversations');\n            }\n        }\n    }\n});\n\nexport default RoomMessageRenderer;\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"iNEHimSj\",\"block\":\"[[[10,0],[14,0,\\\"header\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,1,[\\\"group\\\"]],[[[1,\\\"        \\\"],[1,[28,[35,2],null,[[\\\"entity\\\",\\\"enableMiniCard\\\",\\\"size\\\",\\\"isLinkable\\\",\\\"showPresence\\\"],[[33,1,[\\\"group\\\"]],true,48,true,true]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"title\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"primary\\\"],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"description\\\"],[12],[1,[34,3]],[13],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"room\\\"],[12],[1,[28,[35,4],[[33,5]],null]],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"secondary\\\"],[12],[1,[34,6]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"if\\\",\\\"room\\\",\\\"entity-image\\\",\\\"description\\\",\\\"emoji-text\\\",\\\"roomSubject\\\",\\\"timeDisplay\\\"]]\",\"moduleName\":\"web-directory/components/timeline-stream/room-message-renderer/template.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"EAxQBIJ4\",\"block\":\"[[[10,0],[14,0,\\\"panel panel-default\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"panel-heading\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,1],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"pull-right\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"h3\\\"],[14,0,\\\"panel-title\\\"],[12],[1,[34,2]],[13],[1,\\\"\\\\n                \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-purecloud btn-read-all\\\"],[16,\\\"aria-label\\\",[28,[37,3],[\\\"timeline.markAll\\\"],null]],[16,1,[29,[[36,4],\\\"-mark-all-read\\\"]]],[24,4,\\\"button\\\"],[4,[38,5],[[30,0],\\\"markAllRead\\\"],null],[12],[1,\\\"\\\\n\\\"],[1,\\\"                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"inspect-disable\\\"],[15,\\\"screenreader-text\\\",[28,[37,3],[\\\"timeline.markAll\\\"],null]],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,4],\\\"-mark-all-read\\\"]]],[14,\\\"placement\\\",\\\"top\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,3],[\\\"timeline.markAll\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,6],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"pull-right\\\"],[12],[1,\\\"\\\\n                \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-purecloud btn-read-all\\\"],[24,4,\\\"button\\\"],[4,[38,5],[[30,0],\\\"clearAllEvents\\\"],null],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,3],[\\\"timeline.clearAll\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n        \\\"],[10,\\\"h3\\\"],[14,0,\\\"panel-title\\\"],[12],[1,[28,[35,3],[\\\"timeline.title\\\"],null]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"panel-body\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,8],[[28,[37,8],[[33,9]],null]],null],null,[[[1,\\\"            \\\"],[10,0],[14,0,\\\"timeline-row\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,10],null,[[\\\"entity\\\"],[[30,1]]]]],[1,\\\"\\\\n                \\\"],[46,[30,1,[\\\"renderer\\\"]],null,[[\\\"entity\\\",\\\"voicemail\\\"],[[30,1],[30,1,[\\\"voicemail\\\"]]]],null],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"no-events\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/clock\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[10,1],[14,0,\\\"message\\\"],[12],[1,[28,[35,3],[\\\"timeline.no-activity\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[\\\"entity\\\"],false,[\\\"if\\\",\\\"newEvents\\\",\\\"updateString\\\",\\\"t\\\",\\\"elementId\\\",\\\"action\\\",\\\"allAcknowledged\\\",\\\"each\\\",\\\"-track-array\\\",\\\"timelineSortedEvents\\\",\\\"timeline-stream/time-ago-indicator\\\",\\\"component\\\"]]\",\"moduleName\":\"web-directory/components/timeline-stream/template.hbs\",\"isStrictMode\":false});","import { computed } from '@ember/object';\nimport Component from '@ember/component';\nimport { formatTimeForDisplay, formatDateForDisplay } from 'web-directory/utils/date-time';\nimport { Intl as SparkIntl } from 'genesys-spark';\n\ntype EventType = 'mention' | 'direct-message' | 'room-message' | 'missed-call';\n\nconst eventTypeIcons: Record<EventType, string> = {\n    mention: '<gux-icon icon-name=\"fa/at-regular\" decorative=\"true\"></gux-icon>',\n    'direct-message': '<gux-icon icon-name=\"legacy/chat\" decorative=\"true\"></gux-icon>',\n    'room-message': '<gux-icon icon-name=\"legacy/ic-group\" decorative=\"true\"></gux-icon>',\n    'missed-call': '<gux-icon icon-name=\"legacy/phone\" decorative=\"true\"></gux-icon>'\n};\n\n/**\n * Displays a relative time indicator for timeline stream events.\n * Shows time-only for today, weekday+time for the past week, or date+time for older events.\n *\n * @attribute entity - The timeline event entity containing `type` and `timeAt` properties\n */\nexport default Component.extend({\n    classNames: ['timeline-time-ago-indicator'],\n\n    entity: null,\n    dateDisplay: null as string | null,\n\n    icon: computed('entity.type', function (this: any): string {\n        const type = this.get('entity.type') as EventType;\n        return eventTypeIcons[type] || ' ';\n    }),\n\n    timeDisplay: computed('entity.timeAt', function (this: any): string {\n        const timeAt = this.get('entity.timeAt');\n        const now = new Date();\n        const date = new Date(timeAt);\n\n        // Calendar-day comparison — matches renderer-component-base's formatCalendar boundaries\n        const isToday = date.toDateString() === now.toDateString();\n\n        const yesterday = new Date(now);\n        yesterday.setDate(now.getDate() - 1);\n        // Compare calendar days, not elapsed ms, to avoid midnight boundary mismatches\n        const isYesterday = date.toDateString() === yesterday.toDateString();\n\n        // Midnight-anchored so partial days at the boundary are handled correctly\n        const sixDaysAgo = new Date(now);\n        sixDaysAgo.setDate(now.getDate() - 6);\n        sixDaysAgo.setHours(0, 0, 0, 0);\n        const isWithinWeek = date >= sixDaysAgo;\n\n        if (isToday) {\n            return formatTimeForDisplay(date.toISOString(), 'short');\n        } else if (isYesterday || isWithinWeek) {\n            // Compact weekday format for the indicator column (card shows verbose \"Yesterday at...\")\n            return SparkIntl.dateTimeFormat({ weekday: 'short', hour: 'numeric', minute: 'numeric' }).format(date);\n        } else {\n            this.set('dateDisplay', formatDateForDisplay(date.toISOString(), 'short'));\n            return formatTimeForDisplay(date.toISOString(), 'short');\n        }\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"A9Lg/g2S\",\"block\":\"[[[10,0],[15,0,[29,[\\\"event-type-icon \\\",[33,0,[\\\"type\\\"]]]]],[12],[2,[36,1]],[13],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"time-ago date\\\"],[12],[1,[34,2]],[13],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"time-ago\\\"],[12],[1,[34,3]],[13]],[],false,[\\\"entity\\\",\\\"icon\\\",\\\"dateDisplay\\\",\\\"timeDisplay\\\"]]\",\"moduleName\":\"web-directory/components/timeline-stream/time-ago-indicator/template.hbs\",\"isStrictMode\":false});","import EmberObject, { computed } from '@ember/object';\nimport Component from '@ember/component';\nimport { typeOf } from '@ember/utils';\nimport _ from 'lodash';\n\nlet ToggleItem = EmberObject.extend({\n    isSelected: computed('itemConfig.id', 'selection.[]', {\n        get() {\n            return this.selection.includes(this.get('itemConfig.id'));\n        },\n\n        set(_, active) {\n            let selection = this.selection;\n            let selected = selection.includes(this.get('itemConfig.id'));\n            let onchange = this.onchange;\n            let onclick = this.get('itemConfig.onclick');\n\n            if (onclick) {\n                onclick();\n            }\n\n            if (onchange) {\n                let updated = selection.slice();\n                let operation;\n                if (active && !selected) {\n                    operation = 'selected';\n                    updated.addObject(this.get('itemConfig.id'));\n                } else if (!active && selected) {\n                    operation = 'deselected';\n                    updated.removeObject(this.get('itemConfig.id'));\n                }\n\n                onchange(updated, this.get('itemConfig.id'), operation);\n            }\n            /*\n                Clicking a Toggle Item causes this set function to be called and the onclick and/or onchange events to be triggered.\n                Only the selection attribute can modify which Toggle Items are currently active.\n            */\n            return !active;\n        }\n    })\n});\n\nexport default Component.extend({\n    classNames: ['toggle-item-container'],\n    attributeBindings: ['role:role'],\n    role: 'tablist',\n    toggleItems: computed('toggleItemConfigs.[]', 'selection', function () {\n        let selection = _.flatten([this.selection]);\n        let onchange = this.onchange;\n        let toggleItemConfigs = this.toggleItemConfigs || [];\n\n        let toggleItems = [];\n        toggleItemConfigs.reduce((validItems, currItem) => {\n            if (validateToggleItemFormat(currItem)) {\n                currItem.assets = {};\n                currItem.assets.icon = currItem.icon;\n                validItems.push(\n                    ToggleItem.create({\n                        itemConfig: currItem,\n                        selection: selection,\n                        onchange: onchange\n                    })\n                );\n            }\n\n            return validItems;\n        }, toggleItems);\n\n        return toggleItems;\n    }),\n\n    clicked(index) {\n        let toggleItem = this.toggleItems[index];\n        let isSelected = toggleItem.get('isSelected');\n        toggleItem.set('isSelected', !isSelected);\n    }\n});\n\nfunction validateToggleItemFormat(item) {\n    if (typeOf(item) !== 'instance' || item.id === '' || (item.onclick && typeOf(item.onclick) !== 'function')) {\n        return false;\n    }\n\n    return true;\n}\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"eA3YkIyH\",\"block\":\"[[[42,[28,[37,1],[[28,[37,1],[[33,2]],null]],null],\\\"itemConfig.id\\\",[[[41,[48,[30,3]],[[[1,\\\"        \\\"],[18,3,[[28,[37,6],null,[[\\\"itemConfig\\\",\\\"isSelected\\\",\\\"showTab\\\",\\\"attentionStarburst\\\",\\\"index\\\"],[[30,1,[\\\"itemConfig\\\"]],[30,1,[\\\"isSelected\\\"]],[30,1,[\\\"itemConfig\\\",\\\"showTab\\\"]],[28,[37,7],[[33,8],[30,1,[\\\"itemConfig\\\",\\\"id\\\"]]],null],[30,2]]]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[30,1,[\\\"itemConfig\\\",\\\"showTab\\\"]],[[[1,\\\"            \\\"],[1,[28,[35,9],null,[[\\\"itemConfig\\\",\\\"activeTab\\\",\\\"click\\\",\\\"attentionStarburst\\\"],[[30,1,[\\\"itemConfig\\\"]],[30,1,[\\\"isSelected\\\"]],[28,[37,10],[[30,0],[33,11],[30,2]],null],[28,[37,7],[[33,8],[30,1,[\\\"itemConfig\\\",\\\"id\\\"]]],null]]]]],[1,\\\"\\\\n\\\"]],[]],null]],[]]]],[1,2]],null]],[\\\"toggleItem\\\",\\\"index\\\",\\\"&default\\\"],false,[\\\"each\\\",\\\"-track-array\\\",\\\"toggleItems\\\",\\\"if\\\",\\\"has-block\\\",\\\"yield\\\",\\\"hash\\\",\\\"get\\\",\\\"attentionStarburst\\\",\\\"toggle-item\\\",\\\"action\\\",\\\"clicked\\\"]]\",\"moduleName\":\"web-directory/components/toggle-item-bar/template.hbs\",\"isStrictMode\":false});","import { computed } from '@ember/object';\nimport Component from '@ember/component';\n\nexport default Component.extend({\n    tagName: 'button',\n    classNames: ['enabled', 'toggle-item', 'btn', 'btn-link'],\n    classNameBindings: ['activeTab:active', 'idClassName', 'itemConfig.supplementalClassNames'],\n    attributeBindings: [\n        'itemConfig.disabled:disabled',\n        'role:role',\n        'itemConfig.name:aria-label',\n        'ariaExpanded:aria-expanded'\n    ],\n    role: 'tab',\n    ariaExpanded: computed('activeTab', function () {\n        return this.activeTab ? 'true' : 'false';\n    }),\n    idClassName: computed('itemConfig.id', function () {\n        return `toggleItem-${this.get('itemConfig.id')}`;\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"t6SnB5kD\",\"block\":\"[[[1,[28,[35,0],null,[[\\\"app\\\",\\\"imgType\\\",\\\"titleMode\\\"],[[33,1],\\\"icon\\\",\\\"none\\\"]]]],[1,\\\"\\\\n\\\"],[41,[33,3],[[[1,\\\"    \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"unread-badge icon-certificate\\\"],[14,\\\"icon-name\\\",\\\"notification\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[33,1,[\\\"name\\\"]],[[[1,\\\"    \\\"],[10,\\\"gux-tooltip\\\"],[15,\\\"for\\\",[29,[[36,4]]]],[14,\\\"placement\\\",\\\"bottom-start\\\"],[12],[1,\\\"\\\\n        \\\"],[10,1],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,[33,1,[\\\"name\\\"]]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[],false,[\\\"app-img\\\",\\\"itemConfig\\\",\\\"if\\\",\\\"attentionStarburst\\\",\\\"emberId\\\"]]\",\"moduleName\":\"web-directory/components/toggle-item/template.hbs\",\"isStrictMode\":false});","import { scheduleOnce } from '@ember/runloop';\nimport { on } from '@ember/object/evented';\nimport Component from '@ember/component';\nimport layout from './template';\n\nexport default Component.extend({\n    layout,\n    classNames: ['toggle-switch-container'],\n    classNameBindings: ['check:toggled-on:toggled-off', 'disabled'],\n\n    check: false,\n    disabled: false,\n    tooltip: null,\n    dataOn: 'purecloud-components.toggle.on',\n    dataOff: 'purecloud-components.toggle.off',\n    toggleParam: null, // for reference with actions\n    entity: null,\n\n    actions: {\n        toggleRoomMute() {\n            if (this.disabled) {\n                return;\n            }\n\n            if (this.toggle) {\n                this.sendAction('toggle', this.toggleParam, this.entity);\n            } else {\n                this.sendAction('toggleRoomMute', this.toggleParam, this.entity);\n            }\n        }\n    },\n\n    adjustWidth: on('didInsertElement', function () {\n        scheduleOnce('afterRender', this, function () {\n            let label = this.$('span.off-screen');\n            let width = label.width();\n            this.$().width(width + 38);\n        });\n    })\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"b4q2Qh/+\",\"block\":\"[[[11,\\\"label\\\"],[24,0,\\\"toggle-switch\\\"],[16,\\\"title\\\",[29,[[52,[33,1],[28,[37,2],[[33,3]],null],[28,[37,2],[[33,4]],null]]]]],[4,[38,5],[[30,0],\\\"toggleRoomMute\\\"],null],[12],[1,\\\"\\\\n    \\\"],[1,[28,[35,6],null,[[\\\"type\\\",\\\"class\\\",\\\"checked\\\",\\\"disabled\\\"],[\\\"checkbox\\\",\\\"switch-input\\\",[33,1],[33,7]]]]],[1,\\\"\\\\n    \\\"],[10,1],[14,0,\\\"label\\\"],[15,\\\"data-on\\\",[29,[[28,[37,2],[[33,3]],null]]]],[15,\\\"data-off\\\",[29,[[28,[37,2],[[33,4]],null]]]],[12],[13],[1,\\\"\\\\n    \\\"],[10,1],[14,0,\\\"toggle\\\"],[12],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,1],[14,0,\\\"off-screen\\\"],[12],[1,[28,[35,2],[[33,4]],null]],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"if\\\",\\\"check\\\",\\\"t\\\",\\\"dataOn\\\",\\\"dataOff\\\",\\\"action\\\",\\\"input\\\",\\\"disabled\\\"]]\",\"moduleName\":\"web-directory/components/toggle-switch/template.hbs\",\"isStrictMode\":false});","import config from '../config/environment';\nimport TooltipOnElement from 'ember-tooltips/components/tooltip-on-element';\n\nlet _didUpdateTimeoutLength = config.environment === 'test' ? 0 : 1000;\n\nexport default TooltipOnElement.extend({ _didUpdateTimeoutLength });\n","import { bind } from '@ember/runloop';\nimport Component from '@ember/component';\nimport { computed } from '@ember/object';\nimport layout from './template';\n\nexport default Component.extend({\n    layout,\n    didRender() {\n        this._super(...arguments);\n        this._handleWindowClickBound = bind(this, this.handleWindowClickEvent);\n        window.addEventListener('click', this._handleWindowClickBound);\n    },\n    willDestroy() {\n        this._super(...arguments);\n        if (this._handleWindowClickBound) {\n            window.removeEventListener('click', this._handleWindowClickBound);\n        }\n    },\n\n    backgroundColorClass: computed('theme', function () {\n        const theme = this.theme || 'light';\n        return `audio-playback-channel-volume--${theme}`;\n    }),\n\n    markerPositionClass: computed('markerPosition', function () {\n        return `audio-playback-channel-volume--marker-${this.markerPosition}`;\n    }),\n\n    handleWindowClickEvent(event) {\n        if (this.isDestroyed || this.isDestroying) {\n            return;\n        }\n\n        const target = event.target;\n\n        if (\n            target &&\n            (target.closest(`#${this.elementId}`) || target.closest(this.toggleButtonSelector))\n            // eslint-disable-next-line no-empty\n        ) {\n        } else {\n            this.set('shouldShow', false);\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"oRmobV9h\",\"block\":\"[[[10,0],[15,0,[29,[\\\"audio-playback-channel-volume \\\",[52,[33,1],\\\"visible\\\"],\\\" \\\",[36,2],\\\" \\\",[36,3]]]],[12],[1,\\\"\\\\n    \\\"],[10,\\\"label\\\"],[14,0,\\\"sr-only\\\"],[15,\\\"for\\\",[29,[[28,[37,4],[[33,5],\\\"-volume-input\\\"],null]]]],[12],[1,[28,[35,6],[\\\"audioPlayer.volume\\\"],null]],[13],[1,\\\"\\\\n    \\\"],[1,[28,[35,7],null,[[\\\"class\\\",\\\"type\\\",\\\"id\\\",\\\"min\\\",\\\"max\\\",\\\"step\\\",\\\"value\\\"],[\\\"audio-playback-channel-volume__input\\\",\\\"range\\\",[28,[37,4],[[33,5],\\\"-volume-input\\\"],null],0,1,0.01,[33,8]]]]],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"if\\\",\\\"shouldShow\\\",\\\"backgroundColorClass\\\",\\\"markerPositionClass\\\",\\\"concat\\\",\\\"elementId\\\",\\\"t\\\",\\\"input\\\",\\\"volume\\\"]]\",\"moduleName\":\"web-directory/components/volume-input/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport { reads } from '@ember/object/computed';\nimport { computed } from '@ember/object';\nimport Component from '@ember/component';\nimport layout from './template';\n\nexport default Component.extend({\n    layout,\n\n    webrtc: service(),\n    logger: service('stash-logger'),\n    intl: reads('webrtc.intl'),\n\n    showModal: false,\n    debugInfos: reads('webrtc.debugInfos'),\n    recording: reads('webrtc.recording'),\n    application: reads('webrtc.application'),\n    clientInfo: reads('webrtc.clientInfo'),\n\n    canExportRecording: computed('recording', function () {\n        return !this.recording && this.get('webrtc.snapshots.length');\n    }),\n\n    request(data) {\n        return {\n            topic: 'Webrtc Debug Report',\n            description: 'Snapshot(s) of current webrtc call state',\n            data: {\n                userAgent: navigator.userAgent,\n                clientJid: this.get('session.person.jid'),\n                clientLocation: window.location.toString(),\n                clientTimestamp: new Date().toISOString(),\n                clientOrgName: this.get('application.orgName'),\n                clientLocale: this.get('intl.isoLocale'),\n                clientType: this.get('application.hostedContext') ? 'Desktop' : 'Browser',\n                clientVersion: this.get('application.semver'),\n                clientLogs: data\n            }\n        };\n    },\n\n    actions: {\n        closeModal() {\n            this.set('webrtc.showDebugModal', false);\n        },\n\n        toggleInfo(conversationInfo) {\n            conversationInfo.toggleProperty('collapsed');\n        },\n\n        rerollColor(participant) {\n            this.webrtc.rerollParticipantColor(participant);\n        },\n\n        exportSnapshot() {\n            const snapshot = this.webrtc.createSnapshot();\n            this.application.sendDiagnostics(this.request(snapshot)).catch(err => {\n                this.get('logger').error('Error submitting report', err);\n            });\n        },\n\n        toggleRecording() {\n            this.toggleProperty('recording');\n        },\n\n        exportRecording() {\n            this.application.sendDiagnostics(this.request(this.get('webrtc.snapshots'))).catch(err => {\n                this.get('logger').error('Error submitting report', err);\n            });\n        }\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"WsDDwaNX\",\"block\":\"[[[10,0],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,1],[[28,[37,1],[[33,2]],null]],null],null,[[[1,\\\"        \\\"],[10,0],[14,0,\\\"header\\\"],[12],[1,\\\"\\\\n            \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"conversation-toggle\\\"],[4,[38,3],[[30,0],\\\"toggleInfo\\\",[30,1]],null],[12],[1,\\\"\\\\n                \\\"],[10,\\\"gux-icon\\\"],[15,\\\"icon-name\\\",[52,[30,1,[\\\"collapsed\\\"]],\\\"legacy/chevron-right\\\",\\\"legacy/chevron-down\\\"]],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[10,0],[12],[1,\\\"\\\\n                    \\\"],[10,0],[12],[1,[30,1,[\\\"webrtcConversation\\\",\\\"room\\\",\\\"rawSubject\\\"]]],[13],[1,\\\"\\\\n                    \\\"],[10,0],[12],[1,\\\"jid: \\\"],[1,[30,1,[\\\"webrtcConversation\\\",\\\"jid\\\"]]],[13],[1,\\\"\\\\n\\\"],[41,[30,1,[\\\"webrtcConversation\\\",\\\"conversationId\\\"]],[[[1,\\\"                        \\\"],[10,0],[12],[1,\\\"conversationId: \\\"],[1,[30,1,[\\\"webrtcConversation\\\",\\\"conversationId\\\"]]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"],[41,[51,[30,1,[\\\"collapsed\\\"]]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"debug-info\\\"],[12],[1,\\\"\\\\n\\\"],[41,[51,[30,1,[\\\"isSoftphone\\\"]]],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"debug-info-stats\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,0],[12],[1,\\\"Client Info: \\\"],[10,\\\"strong\\\"],[12],[1,[34,6]],[13],[13],[1,\\\"\\\\n                        \\\"],[10,0],[12],[1,\\\"\\\\n                            \\\"],[10,\\\"h4\\\"],[12],[1,\\\"Participants\\\"],[13],[1,\\\"\\\\n                            \\\"],[10,\\\"table\\\"],[14,0,\\\"table table-condensed\\\"],[12],[1,\\\"\\\\n                                \\\"],[10,\\\"thead\\\"],[12],[1,\\\"\\\\n                                    \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n                                        \\\"],[10,\\\"th\\\"],[12],[1,\\\"name\\\"],[13],[1,\\\"\\\\n                                        \\\"],[10,\\\"th\\\"],[12],[1,\\\"id\\\"],[13],[1,\\\"\\\\n                                        \\\"],[10,\\\"th\\\"],[12],[13],[1,\\\"\\\\n                                        \\\"],[10,\\\"th\\\"],[12],[1,\\\"inLastN\\\"],[13],[1,\\\"\\\\n                                        \\\"],[10,\\\"th\\\"],[12],[1,\\\"videoMuted\\\"],[13],[1,\\\"\\\\n                                        \\\"],[10,\\\"th\\\"],[12],[1,\\\"audioMuted\\\"],[13],[1,\\\"\\\\n                                        \\\"],[10,\\\"th\\\"],[12],[1,\\\"local\\\"],[13],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n                                \\\"],[10,\\\"tbody\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,1],[[28,[37,1],[[30,1,[\\\"webrtcConversation\\\",\\\"participants\\\"]]],null]],null],null,[[[1,\\\"                                        \\\"],[10,\\\"tr\\\"],[15,5,[29,[\\\"color: \\\",[30,2,[\\\"colorHex\\\"]]]]],[12],[1,\\\"\\\\n                                            \\\"],[10,\\\"td\\\"],[12],[1,[30,2,[\\\"person\\\",\\\"name\\\"]]],[13],[1,\\\"\\\\n                                            \\\"],[10,\\\"td\\\"],[12],[1,\\\"\\\\n                                                \\\"],[10,0],[12],[1,[30,2,[\\\"person\\\",\\\"id\\\"]]],[13],[1,\\\"\\\\n                                                \\\"],[10,0],[12],[1,[30,2,[\\\"pcParticipant\\\",\\\"id\\\"]]],[13],[1,\\\"\\\\n                                            \\\"],[13],[1,\\\"\\\\n                                            \\\"],[10,\\\"td\\\"],[12],[1,\\\"\\\\n                                                \\\"],[11,\\\"button\\\"],[24,0,\\\"btn reroll-btn\\\"],[24,4,\\\"button\\\"],[4,[38,3],[[30,0],\\\"rerollColor\\\",[30,2]],null],[12],[1,\\\"\\\\n                                                    New Color\\\\n                                                \\\"],[13],[1,\\\"\\\\n                                            \\\"],[13],[1,\\\"\\\\n                                            \\\"],[10,\\\"td\\\"],[12],[1,[30,2,[\\\"inLastN\\\"]]],[13],[1,\\\"\\\\n                                            \\\"],[10,\\\"td\\\"],[12],[1,[30,2,[\\\"videoMuted\\\"]]],[13],[1,\\\"\\\\n                                            \\\"],[10,\\\"td\\\"],[12],[1,[30,2,[\\\"audioMuted\\\"]]],[13],[1,\\\"\\\\n                                            \\\"],[10,\\\"td\\\"],[12],[1,[30,2,[\\\"local\\\"]]],[13],[1,\\\"\\\\n                                        \\\"],[13],[1,\\\"\\\\n\\\"]],[2]],null],[1,\\\"                                \\\"],[13],[1,\\\"\\\\n\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                        \\\"],[10,0],[14,0,\\\"section\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,\\\"h4\\\"],[12],[1,\\\"Sessions\\\"],[13],[1,\\\"\\\\n                            \\\"],[10,\\\"table\\\"],[14,0,\\\"table table-condensed\\\"],[12],[1,\\\"\\\\n                                \\\"],[10,\\\"thead\\\"],[12],[1,\\\"\\\\n                                    \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n                                        \\\"],[10,\\\"th\\\"],[12],[1,\\\"sid\\\"],[13],[1,\\\"\\\\n                                        \\\"],[10,\\\"th\\\"],[12],[1,\\\"peer\\\"],[13],[1,\\\"\\\\n                                        \\\"],[10,\\\"th\\\"],[12],[1,\\\"isInitiator\\\"],[13],[1,\\\"\\\\n                                        \\\"],[10,\\\"th\\\"],[12],[1,\\\"connectionState\\\"],[13],[1,\\\"\\\\n                                        \\\"],[10,\\\"th\\\"],[12],[1,\\\"sessionState\\\"],[13],[1,\\\"\\\\n                                        \\\"],[10,\\\"th\\\"],[12],[1,\\\"ended\\\"],[13],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n                                \\\"],[10,\\\"tbody\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,1],[[28,[37,1],[[30,1,[\\\"sessionInfos\\\"]]],null]],null],null,[[[1,\\\"                                        \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n                                            \\\"],[10,\\\"td\\\"],[12],[1,[30,3,[\\\"sid\\\"]]],[13],[1,\\\"\\\\n                                            \\\"],[10,\\\"td\\\"],[12],[1,[30,3,[\\\"peerID\\\"]]],[13],[1,\\\"\\\\n                                            \\\"],[10,\\\"td\\\"],[12],[1,[30,3,[\\\"isInitiator\\\"]]],[13],[1,\\\"\\\\n                                            \\\"],[10,\\\"td\\\"],[12],[1,[30,3,[\\\"connectionState\\\"]]],[13],[1,\\\"\\\\n                                            \\\"],[10,\\\"td\\\"],[12],[1,[30,3,[\\\"state\\\"]]],[13],[1,\\\"\\\\n                                            \\\"],[10,\\\"td\\\"],[12],[1,[30,3,[\\\"ended\\\"]]],[13],[1,\\\"\\\\n                                        \\\"],[13],[1,\\\"\\\\n\\\"]],[3]],null],[1,\\\"                                \\\"],[13],[1,\\\"\\\\n\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                        \\\"],[10,0],[14,0,\\\"section\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,\\\"h4\\\"],[12],[1,\\\"Streams\\\"],[13],[1,\\\"\\\\n                            \\\"],[10,\\\"table\\\"],[14,0,\\\"table table-condensed\\\"],[12],[1,\\\"\\\\n                                \\\"],[10,\\\"thead\\\"],[12],[1,\\\"\\\\n                                    \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n                                        \\\"],[10,\\\"th\\\"],[12],[1,\\\"streamId\\\"],[13],[1,\\\"\\\\n                                        \\\"],[10,\\\"th\\\"],[12],[1,\\\"session\\\"],[13],[1,\\\"\\\\n                                        \\\"],[10,\\\"th\\\"],[12],[1,\\\"active\\\"],[13],[1,\\\"\\\\n                                        \\\"],[10,\\\"th\\\"],[12],[1,\\\"hasVideo\\\"],[13],[1,\\\"\\\\n                                        \\\"],[10,\\\"th\\\"],[12],[1,\\\"hasAudio\\\"],[13],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n                                \\\"],[10,\\\"tbody\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,1],[[28,[37,1],[[30,1,[\\\"streamInfos\\\"]]],null]],null],null,[[[1,\\\"                                        \\\"],[10,\\\"tr\\\"],[15,5,[29,[\\\"color: \\\",[30,4,[\\\"participant\\\",\\\"colorHex\\\"]]]]],[12],[1,\\\"\\\\n                                            \\\"],[10,\\\"td\\\"],[12],[1,[30,4,[\\\"streamId\\\"]]],[13],[1,\\\"\\\\n                                            \\\"],[10,\\\"td\\\"],[12],[1,[30,4,[\\\"sid\\\"]]],[13],[1,\\\"\\\\n                                            \\\"],[10,\\\"td\\\"],[12],[1,[30,4,[\\\"active\\\"]]],[13],[1,\\\"\\\\n                                            \\\"],[10,\\\"td\\\"],[12],[1,[30,4,[\\\"hasVideo\\\"]]],[13],[1,\\\"\\\\n                                            \\\"],[10,\\\"td\\\"],[12],[1,[30,4,[\\\"hasAudio\\\"]]],[13],[1,\\\"\\\\n                                        \\\"],[13],[1,\\\"\\\\n\\\"]],[4]],null],[1,\\\"                                \\\"],[13],[1,\\\"\\\\n\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                        \\\"],[10,0],[14,0,\\\"section\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,\\\"h4\\\"],[12],[1,\\\"Tracks\\\"],[13],[1,\\\"\\\\n                            \\\"],[10,\\\"table\\\"],[14,0,\\\"table table-condensed\\\"],[12],[1,\\\"\\\\n                                \\\"],[10,\\\"thead\\\"],[12],[1,\\\"\\\\n                                    \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n                                        \\\"],[10,\\\"th\\\"],[12],[1,\\\"trackInfo\\\"],[13],[1,\\\"\\\\n                                        \\\"],[10,\\\"th\\\"],[12],[1,\\\"kind\\\"],[13],[1,\\\"\\\\n                                        \\\"],[10,\\\"th\\\"],[12],[1,\\\"activelyReceiving\\\"],[13],[1,\\\"\\\\n                                        \\\"],[10,\\\"th\\\"],[12],[1,\\\"bytesReceived\\\"],[13],[1,\\\"\\\\n                                        \\\"],[10,\\\"th\\\"],[12],[1,\\\"enabled\\\"],[13],[1,\\\"\\\\n                                        \\\"],[10,\\\"th\\\"],[12],[1,\\\"muted\\\"],[13],[1,\\\"\\\\n                                        \\\"],[10,\\\"th\\\"],[12],[1,\\\"state\\\"],[13],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n                                \\\"],[13],[1,\\\"\\\\n                                \\\"],[10,\\\"tbody\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,1],[[28,[37,1],[[30,1,[\\\"streamInfos\\\"]]],null]],null],null,[[[42,[28,[37,1],[[28,[37,1],[[30,5,[\\\"trackInfos\\\"]]],null]],null],null,[[[1,\\\"                                            \\\"],[10,\\\"tr\\\"],[15,5,[29,[\\\"color: \\\",[30,5,[\\\"participant\\\",\\\"colorHex\\\"]]]]],[12],[1,\\\"\\\\n                                                \\\"],[10,\\\"td\\\"],[12],[1,\\\"\\\\n                                                    \\\"],[10,0],[12],[1,\\\"id: \\\"],[1,[30,6,[\\\"trackId\\\"]]],[13],[1,\\\"\\\\n                                                    \\\"],[10,0],[12],[1,\\\"streamId: \\\"],[1,[30,5,[\\\"streamId\\\"]]],[13],[1,\\\"\\\\n                                                    \\\"],[10,0],[12],[1,\\\"sid: \\\"],[1,[30,5,[\\\"sid\\\"]]],[13],[1,\\\"\\\\n                                                \\\"],[13],[1,\\\"\\\\n                                                \\\"],[10,\\\"td\\\"],[12],[1,[30,6,[\\\"kind\\\"]]],[13],[1,\\\"\\\\n                                                \\\"],[10,\\\"td\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,6,[\\\"local\\\"]],[[[1,\\\"                                                        n/a\\\\n\\\"]],[]],[[[41,[30,6,[\\\"activelyReceiving\\\"]],[[[1,\\\"                                                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/play\\\"],[14,0,\\\"green\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                                            \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/stop\\\"],[14,0,\\\"red\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[]]]],[]]],[1,\\\"                                                \\\"],[13],[1,\\\"\\\\n                                                \\\"],[10,\\\"td\\\"],[12],[1,[52,[30,6,[\\\"local\\\"]],\\\"n/a\\\",[30,6,[\\\"bytesReceived\\\"]]]],[13],[1,\\\"\\\\n                                                \\\"],[10,\\\"td\\\"],[12],[1,[30,6,[\\\"enabled\\\"]]],[13],[1,\\\"\\\\n                                                \\\"],[10,\\\"td\\\"],[12],[1,[30,6,[\\\"muted\\\"]]],[13],[1,\\\"\\\\n                                                \\\"],[10,\\\"td\\\"],[12],[1,[30,6,[\\\"state\\\"]]],[13],[1,\\\"\\\\n                                            \\\"],[13],[1,\\\"\\\\n\\\"]],[6]],null]],[5]],null],[1,\\\"                                \\\"],[13],[1,\\\"\\\\n\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                        \\\"],[10,0],[14,0,\\\"section\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,\\\"h4\\\"],[12],[1,\\\"Raw Speakers\\\"],[13],[1,\\\"\\\\n                            \\\"],[10,0],[14,0,\\\"talkers-section\\\"],[12],[1,\\\"\\\\n                                \\\"],[1,[30,1,[\\\"webrtcConversation\\\",\\\"rawSpeakers\\\"]]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                        \\\"],[10,0],[14,0,\\\"section\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,\\\"h4\\\"],[12],[1,\\\"Track Owners\\\"],[13],[1,\\\"\\\\n                            \\\"],[10,0],[14,0,\\\"talkers-section\\\"],[12],[1,\\\"\\\\n                                \\\"],[1,[30,1,[\\\"webrtcConversation\\\",\\\"trackOwners\\\"]]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                        \\\"],[10,0],[12],[1,\\\"\\\\n                            \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-primary\\\"],[24,4,\\\"button\\\"],[4,[38,3],[[30,0],\\\"exportSnapshot\\\"],null],[12],[1,\\\"Report Snapshot\\\"],[13],[1,\\\"\\\\n                            \\\"],[11,\\\"button\\\"],[16,0,[29,[\\\"btn \\\",[52,[33,7],\\\"btn-danger\\\",\\\"btn-default\\\"]]]],[24,4,\\\"button\\\"],[4,[38,3],[[30,0],\\\"toggleRecording\\\"],null],[12],[1,\\\"\\\\n                                \\\"],[1,[52,[33,7],\\\"Stop Recording\\\",\\\"Start Recording\\\"]],[1,\\\"\\\\n                            \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,8],[[[1,\\\"                                \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-primary\\\"],[24,4,\\\"button\\\"],[4,[38,3],[[30,0],\\\"exportRecording\\\"],null],[12],[1,\\\"\\\\n                                    Report Recording\\\\n                                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                    \\\"],[10,0],[12],[1,\\\"Stats currently not supported for softphone\\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"]],[1]],null],[41,[51,[33,2,[\\\"length\\\"]]],[[[1,\\\"        No conversations to show\\\\n\\\"]],[]],null],[13]],[\\\"conversationInfo\\\",\\\"p\\\",\\\"s\\\",\\\"st\\\",\\\"st\\\",\\\"t\\\"],false,[\\\"each\\\",\\\"-track-array\\\",\\\"debugInfos\\\",\\\"action\\\",\\\"if\\\",\\\"unless\\\",\\\"clientInfo\\\",\\\"recording\\\",\\\"canExportRecording\\\"]]\",\"moduleName\":\"web-directory/components/webrtc-debug-modal/template.hbs\",\"isStrictMode\":false});","import { inject as service } from '@ember/service';\nimport Component from '@ember/component';\nimport layout from './template';\n\nexport default Component.extend({\n    layout,\n\n    webrtc: service()\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"ThlNNOHK\",\"block\":\"[[[41,[51,[33,1,[\\\"audioCallCapable\\\"]]],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"webrtc-issues webrtc-not-supported\\\"],[12],[1,[28,[35,2],[\\\"ewc.station.notCapable\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,1,[\\\"audioCallCapable\\\"]],[[[41,[51,[28,[37,4],[[33,1,[\\\"hasMicPermission\\\"]],[33,1,[\\\"hasMicrophone\\\"]]],null]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"webrtc-issues cannot-share-audio\\\"],[12],[1,[28,[35,2],[\\\"ewc.station.sharingAudioError\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[51,[33,1,[\\\"hasMicPermission\\\"]]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"webrtc-issues no-mic-permission\\\"],[12],[1,[28,[35,2],[\\\"ewc.station.noMicPermission\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[51,[33,1,[\\\"hasMicrophone\\\"]]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"webrtc-issues no-microphone-dected\\\"],[12],[1,[28,[35,2],[\\\"ewc.station.noMicrophoneDetected\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null]],[]]]],[],false,[\\\"unless\\\",\\\"webrtc\\\",\\\"t\\\",\\\"if\\\",\\\"and\\\"]]\",\"moduleName\":\"web-directory/components/webrtc-issues/template.hbs\",\"isStrictMode\":false});","/* global MediaStream */\nimport { inject as service } from '@ember/service';\n\nimport { reads } from '@ember/object/computed';\nimport Component from '@ember/component';\nimport { observer } from '@ember/object';\nimport { run } from '@ember/runloop';\nimport layout from './template';\n\nexport default Component.extend({\n    layout,\n\n    webrtc: service(),\n    deviceProfilesV2: service(),\n    ring: reads('webrtc.ring'),\n    conversation: null,\n\n    /**\n     * on init we need to attach the media streams\n     */\n    init() {\n        this._super(...arguments);\n\n        this.webrtc.on('defaultDeviceChange', this, this.handleDeviceChange);\n        this.deviceProfilesV2.on('profileDevicesChanged', this, this.handleDeviceChange);\n\n        this.ring.on('callVolumeChange', this, this.handleVolumeChange);\n\n        this.conversation.on('peerStreamAdded', this, this.attachMediaStreams);\n        this._sessionsListener();\n    },\n\n    // TODO: is this necessary? @Jeff?\n    // eslint-disable-next-line ember/no-observers\n    _sessionsListener: observer('conversation.sessions.[]', function () {\n        if (this.get('conversation.sessions.length')) {\n            this.attachMediaStreams();\n        }\n    }),\n\n    getAudioElement(session) {\n        return this.$(`.${session.sid}`)[0];\n    },\n\n    createStreamWithTrack(track) {\n        const stream = new MediaStream();\n        stream.addTrack(track);\n        return stream;\n    },\n\n    attachMediaStreams() {\n        this.get('conversation.sessions').forEach(session => {\n            run.scheduleOnce('afterRender', this, () => {\n                let stream = session.streams.length ? session.streams[0] : null;\n\n                // prefer tracks\n                const receiver = session.pc.getReceivers().find(r => r.track);\n                if (receiver) {\n                    stream = this.createStreamWithTrack(receiver.track);\n                }\n\n                if (stream) {\n                    const audioEl = this.getAudioElement(session);\n\n                    audioEl.volume = this.get('ring.callVolume') / 100;\n                    this.webrtc.setDefaultOutputDevice(audioEl);\n                    audioEl.srcObject = stream;\n                }\n            });\n        });\n    },\n\n    handleDeviceChange(devices) {\n        const webrtc = this.webrtc;\n\n        if (this.get('conversation.sessions.length') === 0) {\n            return;\n        }\n\n        if (devices.outputDevice) {\n            const $audios = this.$('audio');\n            $audios &&\n                $audios.each((index, audioEl) => {\n                    if (audioEl) {\n                        webrtc.setDefaultOutputDevice(audioEl);\n                    }\n                });\n        }\n        if (devices.microphone) {\n            webrtc.createMedia({ requestVideo: false }).then(media => {\n                this.conversation.setLocalMedia(media);\n            });\n        }\n    },\n\n    handleVolumeChange(volume) {\n        if (volume) {\n            const $audios = this.$('audio');\n            $audios &&\n                $audios.each((index, audioEl) => {\n                    if (audioEl) {\n                        audioEl.volume = volume / 100;\n                    }\n                });\n        }\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this.conversation.off('peerStreamAdded', this, this.attachMediaStreams);\n        this.webrtc.off('defaultDeviceChange', this, this.handleDeviceChange);\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"72sI6RPx\",\"block\":\"[[[10,0],[14,0,\\\"hide\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[37,1],[[28,[37,1],[[33,2,[\\\"sessions\\\"]]],null]],null],null,[[[1,\\\"        \\\"],[10,\\\"audio\\\"],[15,0,[29,[\\\"softphone peer-stream \\\",[30,1,[\\\"sid\\\"]]]]],[14,\\\"autoplay\\\",\\\"autoplay\\\"],[12],[13],[1,\\\"\\\\n\\\"]],[1]],null],[13]],[\\\"session\\\"],false,[\\\"each\\\",\\\"-track-array\\\",\\\"conversation\\\"]]\",\"moduleName\":\"web-directory/components/webrtc-softphone-audio/template.hbs\",\"isStrictMode\":false});","import FrameRouter from 'web-directory/components/frame-router/component';\nimport { FrameRouterElement } from 'iframe-coordinator';\nimport { observer } from '@ember/object';\nimport { task } from 'ember-concurrency';\nimport { sendTokenToClients } from '@purecloud/pc-ui-auth/dist/host';\n\nconst WEBRTC_TROUBLESHOOTER_CLIENT_ID = 'webrtc-troubleshooter';\nconst WEBRTC_TROUBLESHOOTER_ROUTE = '/webrtc-troubleshooter';\nconst WEBRTC_TROUBLESHOOTER_APP_PATH = '/webrtc-troubleshooter/#/';\nconst WEBRTC_TROUBLESHOOTER_ALLOW = 'microphone; camera; autoplay';\n\nexport default FrameRouter.extend({\n    classNames: ['webrtc-troubleshooter-frame-router'],\n    route: WEBRTC_TROUBLESHOOTER_ROUTE,\n\n    /**\n     * Configure the frame-router element with the troubleshooter client\n     * registration + environmental data. Overrides the base implementation so\n     * none of the collaborate-specific wiring (toasts, etc.) runs.\n     */\n    setupFrames: task(function* (this: any) {\n        const locale = this.get('intl.isoLocale');\n        this.sendCurrentToken();\n\n        const localeQuery = locale ? `?locale=${encodeURIComponent(locale)}` : '';\n        const url = `${window.location.origin}${WEBRTC_TROUBLESHOOTER_APP_PATH}${localeQuery}`;\n\n        (this.element as FrameRouterElement).clientConfig = {\n            clients: {\n                [WEBRTC_TROUBLESHOOTER_CLIENT_ID]: {\n                    url,\n                    assignedRoute: WEBRTC_TROUBLESHOOTER_ROUTE,\n                    allow: WEBRTC_TROUBLESHOOTER_ALLOW,\n                    defaultTitle: 'WebRTC Troubleshooter'\n                }\n            },\n            envData: {\n                locale,\n                hostRootUrl: window.location.origin\n            }\n        };\n\n        yield;\n    }),\n\n    /** Write the current host auth token to storage for the iframe client. */\n    sendCurrentToken(this: any) {\n        const token = this.get('session.accessToken');\n        if (token) {\n            sendTokenToClients(token);\n        }\n    },\n\n    reSendTokenOnRefresh: observer('session.accessToken', function (this: any) {\n        this.sendCurrentToken();\n    })\n});\n","import Controller from '@ember/controller';\n\nexport default Controller.extend({\n    queryParams: ['path'],\n    path: ''\n});\n","import { once } from '@ember/runloop';\nimport { observer, computed } from '@ember/object';\nimport { reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport Controller from '@ember/controller';\nimport { isBlank } from '@ember/utils';\n\nconst isNonEmptyStringQueryParam = paramStr => {\n    return (\n        typeof paramStr === 'string' &&\n        !isBlank(paramStr) &&\n        // Handles 'https://wikipedia.org/?param' case.\n        // Ember parses as the literal string 'true'\n        paramStr !== 'true'\n    );\n};\n\nexport default Controller.extend({\n    chat: service(),\n    intl: service(),\n    session: service(),\n    settings: service(),\n    sidebar: service(),\n    application: service(),\n    permissions: service(),\n    phoneService: service('phone'),\n    sidebarService: reads('sidebar'),\n    appsService: service('apps'),\n    webrtc: service('webrtc'),\n\n    queryParams: ['mobile', 'panels', 'initialPanel'],\n    panels: null,\n    initialPanel: null,\n\n    init() {\n        this._super(...arguments);\n        this._applyTheme(this.get('application.sparkTheme'));\n    },\n\n    updateSparkTheme: observer('application.sparkTheme', function () {\n        this._applyTheme(this.get('application.sparkTheme'));\n    }),\n\n    updateCurrentRouteName: observer('currentRouteName', function () {\n        once(this, this.set, 'application.currentRouteName', this.currentRouteName);\n    }),\n\n    panelsOverrideObject: computed('panels', 'initialPanel', function () {\n        const panelsOverrideObject = {};\n        const panelsOverride = this.panels;\n        const initialPanelOverride = this.initialPanel;\n        if (isNonEmptyStringQueryParam(panelsOverride)) {\n            panelsOverrideObject.panelsOverride = panelsOverride.split(',');\n        } else if (panelsOverride === '') {\n            panelsOverrideObject.panelsOverride = [];\n        }\n        if (isNonEmptyStringQueryParam(initialPanelOverride)) {\n            panelsOverrideObject.initialPanelOverride = initialPanelOverride;\n        }\n        return panelsOverrideObject;\n    }),\n\n    actions: {\n        reportError(notification) {\n            if (notification) {\n                notification.hide();\n            }\n\n            this.sidebar.closePanel();\n            this.transitionToRoute('feedback');\n        },\n\n        openPreferencesModal() {\n            this.settings.open();\n        }\n    },\n\n    /**\n     * Applies the flare-mode attribute to the target element based on the current spark theme.\n     * @param {object|undefined} theme - The spark theme object ({ id, name, mode })\n     * @param {HTMLElement} [targetElement=document.documentElement] - The element to apply the attribute to\n     */\n    _applyTheme: function (theme, targetElement = document.documentElement) {\n        if (!targetElement) {\n            return;\n        }\n\n        if (!theme || theme.name !== 'flare') {\n            targetElement.removeAttribute('flare-mode');\n        } else if (theme.name === 'flare') {\n            targetElement.setAttribute('flare-mode', theme.mode);\n        }\n    }\n});\n","import { inject as service } from '@ember/service';\nimport Controller from '@ember/controller';\n\nexport default Controller.extend({\n    permissions: service()\n});\n","import { observer } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Controller from '@ember/controller';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nvar EngageController = Controller.extend(LoggerMixin, {\n    engageService: service('engage'),\n\n    // Overridden to preserve hash query parameters.\n    transitionToRoute(route) {\n        window.location.hash = route;\n    },\n\n    // Overridden to preserve hash query parameters.\n    replaceRoute(route) {\n        const search = window.location.search;\n        window.location.replace(`${window.location.pathname}${search}#${route}`);\n    },\n\n    setEngageActive() {\n        this.set('engageService.route', this.get('model.engagePath'));\n        this.set('engageService.isEngageActive', true);\n    },\n\n    setEngageInactive() {\n        this.set('engageService.isEngageActive', false);\n    },\n\n    navigationEvent: observer('engageService.navigationRoute', function () {\n        const navRoute = this.get('engageService.navigationRoute');\n        if (navRoute) {\n            const route = engageRouteToCollaborateRoute(navRoute);\n            this.logger.debug('Transitioning to', route);\n            this.transitionToRoute(route); //see override above\n            this.set('engageService.navigationRoute', null);\n        }\n    }),\n\n    redirectEvent: observer('engageService.redirectRoute', function () {\n        const route = engageRouteToCollaborateRoute(this.get('engageService.redirectRoute'));\n        this.replaceRoute(route); //see override above\n        this.logger.debug('Redirecting to', route);\n    })\n});\n\nfunction engageRouteToCollaborateRoute(route) {\n    // Content management routes live under their own top-level position in collaborate\n    let newRoute = route.replace(/^#contentManagement/, '/content-management');\n    // Everything else is mapped to the /engage/... routes\n    if (!/^\\/content-management/.test(newRoute)) {\n        newRoute = route.replace(/^#\\/?/, '/engage/');\n    }\n    return newRoute;\n}\n\nexport default EngageController;\n","import Controller from '@ember/controller';\n\nexport default Controller.extend();\n","import { computed } from '@ember/object';\nimport { alias } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport Controller from '@ember/controller';\n\nexport default Controller.extend({\n    stashLogger: service(),\n\n    loggingOptions: alias('stashLogger.loggingOptions'),\n\n    logs: computed('stashLogger.internalLogs.[]', function () {\n        const internalLogs = this.get('stashLogger.internalLogs') || [];\n        return internalLogs.map(log => {\n            return {\n                topic: log.topic,\n                level: log.level,\n                itemsToLog: log.itemsToLog,\n                stringified: JSON.stringify(log.itemsToLog)\n            };\n        });\n    }),\n\n    actions: {\n        toggleOption(option) {\n            option.toggleProperty('selected');\n        }\n    }\n});\n","import Controller from '@ember/controller';\n\nexport default Controller.extend({\n    queryParams: ['targetRoute']\n});\n","import FieldConfig from '../field-config';\nimport ExternalContactModel from '../../models/external-contact';\n\nexport default FieldConfig.extend({\n    modelClass: ExternalContactModel\n}).reopenClass({\n    modelClass: ExternalContactModel\n});\n","import FieldConfig from '../field-config';\nimport GroupModel from '../../models/group';\n\nexport default FieldConfig.extend({\n    modelClass: GroupModel\n}).reopenClass({\n    modelClass: GroupModel\n});\n","import FieldConfig from '../field-config';\nimport OrgModel from '../../models/org';\n\nexport default FieldConfig.extend({\n    modelClass: OrgModel\n}).reopenClass({\n    modelClass: OrgModel\n});\n","import FieldConfig from '../field-config';\nimport PersonModel from '../../models/person';\n\nexport default FieldConfig.extend({\n    modelClass: PersonModel\n}).reopenClass({\n    modelClass: PersonModel\n});\n","import { getOwner } from '@ember/application';\nimport { A } from '@ember/array';\nimport { alias } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport EmberObject, { computed } from '@ember/object';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nimport FieldSection from './field-section';\n\nexport const KEY_BLACKLIST = [\n    'id',\n    '_id',\n    'guid',\n    'store',\n    'data',\n    'currentState',\n    'name',\n    'type',\n    'group',\n    'title',\n    'department',\n    'phone',\n    'email',\n    'description',\n    'organization'\n];\nconst GROUP_BLACKLIST = [...KEY_BLACKLIST, 'expression', 'groupType'];\nconst ORG_BLACKLIST = [...KEY_BLACKLIST, 'orgPreferences', 'shortName'];\nconst PROFILE_BLACKLIST = [\n    ...KEY_BLACKLIST,\n    'activities',\n    'profile',\n    'emptySections',\n    'fieldSections',\n    'emptyWriteableSections'\n];\n\nconst FieldConfig = EmberObject.extend({\n    intl: service(),\n    application: service(),\n\n    id: alias('_id'),\n\n    _id: null,\n    orgId: null,\n    entityType: null,\n    version: null,\n    sections: [],\n\n    _initModelWithType: function () {\n        const type = this.entityType;\n        const modelClass = this.modelClass;\n\n        let blacklist;\n        switch (type) {\n            case 'person':\n                blacklist = [...PROFILE_BLACKLIST];\n                break;\n            case 'org':\n                blacklist = [...ORG_BLACKLIST];\n                break;\n            case 'group':\n                blacklist = [...GROUP_BLACKLIST];\n                break;\n            case 'externalContact':\n            default:\n                blacklist = [...KEY_BLACKLIST];\n                break;\n        }\n\n        let fields = {};\n\n        this.sections.forEach(function (section) {\n            if (!A(blacklist).includes(section.key)) {\n                fields[section.key] = DS.attr();\n            }\n        });\n\n        modelClass\n            .reopenClass({\n                fieldConfig: this\n            })\n            .reopen(fields, {\n                fieldConfig: this\n            });\n\n        if (type === 'group') {\n            var allowedValues = this.getFieldByKey('general.groupType').get('params.allowedValues') || [];\n            allowedValues = allowedValues.filter(value => {\n                return value !== 'purecloud.distributionGroups';\n            });\n            this.set('groupTypes', allowedValues);\n        }\n    },\n\n    unknownProperty: function (property) {\n        var sections = this.sections;\n\n        if (_.map(sections, 'key').indexOf(property) > -1) {\n            return this.getSectionByKey(property);\n        }\n\n        return this._super();\n    },\n\n    splitFieldPath: function (path) {\n        var split = path.replace(/^\\w+\\.\\s/gi, '').split('.');\n        return {\n            sectionKey: split[0],\n            fieldKey: split[1]\n        };\n    },\n\n    getSectionByKey: function (key) {\n        return this.sections.findBy('key', key);\n    },\n\n    getFieldByKey: function (key) {\n        var splitField = this.splitFieldPath(key);\n        var section = this.getSectionByKey(splitField.sectionKey);\n        if (splitField.fieldKey && section) {\n            return section.getFieldByKey(splitField.fieldKey);\n        }\n\n        return undefined;\n    },\n\n    getFieldListByType: function (type) {\n        var fieldList = this.sections\n            .map(function (section) {\n                return section.getFieldsByType(type);\n            })\n            .filter(function (field) {\n                return field !== undefined && field.length > 0;\n            });\n\n        return _.flatten(fieldList);\n    },\n\n    getFieldsByType: function () {\n        this.getFieldListByType.apply(this, arguments);\n    },\n\n    getAllowedValues: function (fieldPath) {\n        return this.getFieldByKey(fieldPath).params.allowedValues;\n    },\n\n    isFieldRepeatable: function (fieldPath) {\n        var field = this.getFieldByKey(fieldPath);\n\n        if (field) {\n            return field.repeatable;\n        }\n\n        return false;\n    },\n\n    isFieldReference: function (fieldPath) {\n        var field = this.getFieldByKey(fieldPath);\n\n        if (field) {\n            return field.type === 'reference';\n        }\n\n        return false;\n    },\n\n    isFieldChoice: function (fieldPath) {\n        return this.getFieldByKey(fieldPath).type === 'select';\n    },\n\n    groupFieldConfig: computed(function () {\n        return this.getFieldConfig('group', getOwner(this));\n    }),\n\n    personFieldConfig: computed(function () {\n        return this.getFieldConfig('person', getOwner(this));\n    })\n});\n\nvar extra = {\n    getFieldConfig: function (type, owner) {\n        return owner.lookup('field-config:' + type);\n    }\n};\n\nFieldConfig.reopenClass({\n    createFieldConfig: function (attributes, container) {\n        // Ensure that sections are the proper object\n        attributes.sections = attributes.sections.map(function (section) {\n            return FieldSection.create(section);\n        });\n\n        var instance = container.lookup('field-config:' + attributes.entityType);\n        if (instance) {\n            instance.setProperties(attributes);\n\n            instance.sections.forEach(function (section) {\n                section.set('fieldConfig', instance);\n            });\n\n            instance._initModelWithType();\n\n            return instance;\n        }\n        console.warn('Unknown field-config type:', { type: attributes.entityType });\n    }\n})\n    .reopenClass(extra)\n    .reopen(extra);\n\nexport default FieldConfig;\n","import { resolve, Promise } from 'rsvp';\nimport { on } from '@ember/object/evented';\nimport EmberObject, { defineProperty, computed } from '@ember/object';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nexport default EmberObject.extend({\n    entity: null,\n    field: null,\n\n    entries: [],\n\n    attachComputedEntries: on('init', function () {\n        var fieldPath = this.field.getFieldPath();\n        if (typeof fieldPath === 'string') {\n            fieldPath = fieldPath.trim();\n\n            var boundTo = `entity.${fieldPath}`;\n            var boundToEach = `entity.${fieldPath}.[]`;\n\n            defineProperty(this, 'entries', computed(boundTo, boundToEach, this.getEntriesFromEntity));\n        }\n    }),\n\n    fieldPath: computed('field', function () {\n        return this.field.getFieldPath();\n    }),\n\n    fieldPathClass: computed('fieldPath', function () {\n        var fieldPath = this.fieldPath;\n        return fieldPath.replace(/\\./gi, '-');\n    }),\n\n    isEmpty: computed('field', 'entries', 'entries.[]', function () {\n        return this.isFieldEmpty(this.field, this.entries);\n    }),\n\n    writeable: computed('entity.readWritePermissions', 'entries.[]', function () {\n        var path = this.field.getFieldPath();\n        var readWritePermissions = this.get('entity.readWritePermissions');\n        var promise = resolve(true);\n\n        if (this.get('entity.type') !== 'group') {\n            promise = new Promise(function (resolve) {\n                readWritePermissions.then(function (permissions) {\n                    resolve(_.includes(permissions.write, path));\n                });\n            });\n        }\n\n        return DS.PromiseObject.create({\n            promise: promise\n        });\n    }),\n\n    getEntriesFromEntity: function () {\n        var path = this.field.getFieldPath();\n        var value = this.entity.getFieldValue(path);\n        if (value === undefined) {\n            return [];\n        }\n\n        return value;\n    },\n\n    isFieldEmpty: function (field, entry) {\n        if (entry === undefined) {\n            return true;\n        }\n\n        if (field.repeatable) {\n            return _.isEmpty(entry) || entry.length <= 0;\n        } else {\n            return !(entry && entry.value);\n        }\n    }\n});\n","import { reads } from '@ember/object/computed';\nimport EmberObject, { computed } from '@ember/object';\nimport _ from 'lodash';\n\nimport Field from './field';\n\nvar FieldSection = EmberObject.extend({\n    intl: reads('fieldConfig.intl'),\n    application: reads('fieldConfig.application'),\n\n    fieldConfig: null,\n\n    key: null,\n    state: null,\n    instructionText: null,\n    fieldList: [],\n\n    getFieldByKey: function (key) {\n        return this.fieldList.findBy('key', key);\n    },\n\n    getFieldsByType: function (type) {\n        return this.fieldList.filterBy('type', type);\n    },\n\n    getEntityType: function () {\n        return this.fieldConfig.entityType;\n    },\n\n    getI18nKey: function () {\n        var type = this.getEntityType();\n        return `${type}_${this.key}`;\n    },\n\n    unknownProperty: function (property) {\n        var fieldList = this.fieldList;\n\n        if (_.map(fieldList, 'key').indexOf(property) > -1) {\n            return this.getFieldByKey(property);\n        }\n\n        return null;\n    },\n\n    sectionName: computed(function () {\n        const intl = this.intl;\n        const key = this.getI18nKey();\n        const serverKey = `server_translations.${key}`;\n        if (!intl.exists(serverKey)) {\n            return key;\n        }\n        return intl.t(serverKey, {}, true).toString();\n    })\n});\n\nFieldSection.reopenClass({\n    create: function (attributes) {\n        attributes.fieldList = attributes.fieldList\n            .filter(field => {\n                return field.state !== 'deleted';\n            })\n            .map(field => {\n                return Field.create(field);\n            });\n\n        var instance = this._super(attributes);\n        instance.fieldList.forEach(function (field) {\n            field.section = instance;\n        });\n\n        return instance;\n    }\n});\n\nexport default FieldSection;\n","import { reads } from '@ember/object/computed';\n\nimport EmberObject, { computed } from '@ember/object';\n\nvar Field = EmberObject.extend({\n    intl: reads('section.intl'),\n\n    section: null,\n\n    key: null,\n    type: null,\n    labelKeys: [],\n    instructionText: '',\n    customLabels: false,\n    repeatable: false,\n    params: null,\n\n    maxRepeat: reads('params.maxRepeat'),\n\n    i18nLabel: computed(function () {\n        let intl = this.intl;\n        let key = `server_translations.${this.getI18nKey()}`;\n        let labelKey = `server_translations.${this.getI18nLabelKey()}`;\n        if (intl.exists(labelKey)) {\n            return intl.t(labelKey).toString();\n        }\n        if (intl.exists(key)) {\n            return intl.t(key).toString();\n        }\n        return this.key;\n    }),\n\n    i18nKey: computed(function () {\n        return this.getI18nKey();\n    }),\n\n    elemId: computed(function () {\n        return `#${this.key}`;\n    }),\n\n    fieldPath: computed(function () {\n        return this.getFieldPath();\n    }),\n\n    fieldPathClass: computed(function () {\n        let path = this.getFieldPath();\n        return path.replace(/\\./gi, '-');\n    }),\n\n    getI18nKey() {\n        return `${this.section.getI18nKey()}_${this.key}`;\n    },\n\n    getI18nLabelKey() {\n        return `${this.getI18nKey()}_labelKey_${this.key}`;\n    },\n\n    getFieldPath() {\n        return this.section.key + '.' + this.key;\n    },\n\n    getEntityType() {\n        return this.section.getEntityType();\n    }\n});\n\nexport default Field;\n","export default {\n  time: {\n    hhmmss: {\n      hour: 'numeric',\n      minute: 'numeric',\n      second: 'numeric'\n    }\n  },\n  date: {\n    hhmmss: {\n      hour: 'numeric',\n      minute: 'numeric',\n      second: 'numeric'\n    }\n  },\n  number: {\n    EUR: {\n      style: 'currency',\n      currency: 'EUR',\n      minimumFractionDigits: 2,\n      maximumFractionDigits: 2\n    },\n    USD: {\n      style: 'currency',\n      currency: 'USD',\n      minimumFractionDigits: 2,\n      maximumFractionDigits: 2\n    }\n  }\n};\n","import { inject as service } from '@ember/service';\nimport Helper from '@ember/component/helper';\n\nexport default Helper.extend({\n    addressformat: service(),\n\n    compute: function (params) {\n        if (!params || params.length !== 1) {\n            console.warn('addressformat helper called with bad arguments');\n            return '';\n        }\n        return this.addressformat.formatOrLookupAddressForDisplay(params[0]);\n    }\n});\n","import { helper } from '@ember/component/helper';\nimport config from '../config/environment';\nimport {\n  shaRegExp,\n  versionRegExp,\n  versionExtendedRegExp,\n} from 'ember-cli-app-version/utils/regexp';\n\nexport function appVersion(_, hash = {}) {\n  const version = config.APP.version;\n  // e.g. 1.0.0-alpha.1+4jds75hf\n\n  // Allow use of 'hideSha' and 'hideVersion' For backwards compatibility\n  let versionOnly = hash.versionOnly || hash.hideSha;\n  let shaOnly = hash.shaOnly || hash.hideVersion;\n\n  let match = null;\n\n  if (versionOnly) {\n    if (hash.showExtended) {\n      match = version.match(versionExtendedRegExp); // 1.0.0-alpha.1\n    }\n    // Fallback to just version\n    if (!match) {\n      match = version.match(versionRegExp); // 1.0.0\n    }\n  }\n\n  if (shaOnly) {\n    match = version.match(shaRegExp); // 4jds75hf\n  }\n\n  return match ? match[0] : version;\n}\n\nexport default helper(appVersion);\n","import Helper from '@ember/component/helper';\nimport { Promise } from 'rsvp';\n\n/**\n * Handlebars helper that unwraps a promise value for use in templates.\n * Renders null/empty until the promise resolves, then re-renders with the value.\n *\n * Usage: {{await somePromise}}\n *\n * Previously provided by the ember-promise-helpers addon (helper:await).\n * Inlined to remove the external dependency.\n */\nexport default Helper.extend({\n    /**\n     * The value returned synchronously before the promise settles.\n     * Defaults to null so the template renders empty while waiting.\n     */\n    valueBeforeSettled: null,\n\n    compute([maybePromise]) {\n        if (!maybePromise || typeof maybePromise.then !== 'function') {\n            return maybePromise;\n        }\n        return this._ensureLatestPromise(maybePromise, promise => {\n            promise.then(\n                value => this._setValue(value, maybePromise),\n                () => this._setValue(null, maybePromise)\n            );\n        });\n    },\n\n    _ensureLatestPromise(promise, callback) {\n        if (this._wasSettled && promise === this._promise) {\n            return this._value;\n        } else {\n            this._unsettle();\n        }\n        this._promise = promise;\n        callback(Promise.resolve(promise));\n        return this.get('valueBeforeSettled');\n    },\n\n    _settle(promise) {\n        if (this._allowUpdates(promise)) {\n            this._wasSettled = true;\n            this.recompute();\n        }\n    },\n\n    _unsettle() {\n        this._wasSettled = false;\n        this._promise = null;\n    },\n\n    _setValue(value, promise) {\n        if (this._allowUpdates(promise)) {\n            this._value = value;\n            this._settle(promise);\n        }\n    },\n\n    _allowUpdates(promise) {\n        return this._promise === promise;\n    }\n});\n","import { helper as buildHelper } from '@ember/component/helper';\nimport { dasherize as emberDasherize } from '@ember/string';\n\nexport function dasherize(params /*, hash */) {\n    var entity = params && params.length > 0 ? params[0] : '';\n    entity = entity || '';\n    entity = entity.toString();\n\n    return emberDasherize(entity);\n}\n\nexport default buildHelper(dasherize);\n","import { htmlSafe } from '@ember/template';\nimport Helper from '@ember/component/helper';\nimport Ember from 'ember';\nimport _ from 'lodash';\nimport { emojifyString } from 'web-directory/utils/emoji';\n\nconst { Handlebars } = Ember;\n\nexport default Helper.helper(function (params) {\n    let text = _.head(params);\n    if (text) {\n        text = emojifyString(Handlebars.Utils.escapeExpression(text));\n        return htmlSafe(text);\n    }\n    return text;\n});\n","import { helper as buildHelper } from '@ember/component/helper';\nimport _ from 'lodash';\n\nexport default buildHelper(function (params = []) {\n    return _.escape(params[0]);\n});\n","import { helper as buildHelper } from '@ember/component/helper';\n\nexport default buildHelper(function ([arr]) {\n    if (arr && arr.length) {\n        return arr[0];\n    }\n\n    return {};\n});\n","import Helper from '@ember/component/helper';\nimport Ember from 'ember';\nimport { emojifyString } from 'web-directory/utils/emoji';\n\nconst _flairRegEx = new RegExp(/^(flair:)(#[0-9a-f]{3}:|#[0-9a-f]{6}:){0,1}(.+)/i); // flair:[#hex:]message\n\nexport default Helper.extend({\n    compute(params, namedArgs) {\n        const status = params[0];\n        const hideIfText = namedArgs.hideIfText;\n\n        let color = '#aaaaaa';\n\n        let match = _flairRegEx.exec(status);\n        if (match) {\n            if (match[2]) {\n                color = match[2].substring(0, match[2].length - 1);\n            }\n            let emojiText = emojifyString(Ember.Handlebars.Utils.escapeExpression(match[3]));\n            return `<div class=\"flair\" style=\"background-color: ${color}\"> ${emojiText} </div>`;\n        } else if (hideIfText) {\n            return '';\n        } else {\n            return emojifyString(Ember.Handlebars.Utils.escapeExpression(status));\n        }\n    }\n});\n","import { get } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Helper from '@ember/component/helper';\n\nconst fullNameHelper = Helper.extend({\n    intl: service(),\n    names: service(),\n\n    compute(params) {\n        const externalProfile = params[0];\n        if (externalProfile) {\n            return this.names.fullName(externalProfile) || get(externalProfile, 'firstName');\n        }\n        return this.intl.safestring('purecloud.unknown');\n    }\n});\n\nexport default fullNameHelper;\n","import { helper as buildHelper } from '@ember/component/helper';\n\nexport default buildHelper(params => {\n    const type = params[0];\n\n    switch (type) {\n        case 'faq':\n            return 'legacy/ic-chat-oval-multi';\n        case 'article':\n            return 'legacy/file';\n        case 'glossary':\n            return 'legacy/ic-view-list';\n        case 'video':\n            return 'legacy/video';\n        case 'post':\n            return 'legacy/post';\n        case 'releasenote':\n            return 'legacy/ic-campaign';\n        case 'page':\n            return 'legacy/file';\n        default:\n            return '';\n    }\n});\n","import { htmlSafe } from '@ember/template';\nimport { helper as buildHelper } from '@ember/component/helper';\n\nexport default buildHelper(function (params = []) {\n    return htmlSafe(params[0]);\n});\n","import { helper as buildHelper } from '@ember/component/helper';\n\nexport default buildHelper(function ([routes, station]) {\n    if (!routes || !station) {\n        return false;\n    }\n    const routeIds = routes.filterBy('isStation').mapBy('station.id');\n    return routeIds.indexOf(station.get('id')) > -1;\n});\n","import { helper as buildHelper } from '@ember/component/helper';\n\nexport function joinStrings(params /*, hash*/) {\n    const [joinCharacter, ...rest] = params || [];\n    return rest.join(joinCharacter);\n}\n\nexport default buildHelper(joinStrings);\n","import pageTitle from 'ember-page-title/helpers/page-title';\n\nexport default pageTitle;\n","import { inject as service } from '@ember/service';\nimport { observer } from '@ember/object';\nimport Helper from '@ember/component/helper';\n\nexport default Helper.extend({\n    phoneIntegrations: service(),\n\n    onIntegrationConfigChange: observer('phoneIntegrations.integrationConfigs.[]', function () {\n        this.recompute();\n    }),\n\n    compute([person]) {\n        if (person.integrationContactInfo === undefined) {\n            return [];\n        }\n        const phoneIntegrations = this.phoneIntegrations;\n        const integrationConfigs = phoneIntegrations.get('integrationConfigs');\n        return integrationConfigs.filter(\n            config =>\n                !!person.integrationContactInfo(config.key) &&\n                (config.includeBadge === undefined ||\n                    (config.includeBadge !== undefined && config.includeBadge === true))\n        );\n    }\n});\n","import pluralize from 'ember-inflector/lib/helpers/pluralize';\nexport default pluralize;\n","import { A as emberArray } from '@ember/array';\nimport Helper from '@ember/component/helper';\nimport { get, computed } from '@ember/object';\nimport { getOwner } from '@ember/application';\nimport { join } from '@ember/runloop';\nimport { runInDebug, assert } from '@ember/debug';\nimport Ember from 'ember';\n\n/**\n * In-app override of `ember-route-action-helper`'s `route-action` helper.\n *\n * The published addon (v2.0.6) reads `routerLib.currentHandlerInfos`, which was\n * removed from the router microlib around Ember 3.9. Under Ember 3.28 that\n * getter is `undefined`, so the addon finds zero routes and asserts\n * \"Unable to find action <name>\" for EVERY route-action invocation. That\n * assertion fires during bootstrap (e.g. the standalone app-pool's\n * `transitionToRoute`) and halts rendering.\n *\n * This implementation resolves the active routes using the Ember 3.x router\n * internals (`currentRouteInfos` / `state.routeInfos` with `.route`) while\n * still falling back to the legacy `currentHandlerInfos`/`.handler` shape so it\n * keeps working if the underlying Ember version changes again.\n */\n\n// Legacy closure-action marker. These keyword modules no longer exist in\n// Ember 3.x, so ACTION is typically undefined here; guarded below.\nlet ACTION;\ntry {\n    const registry = Ember && Ember.__loader && Ember.__loader.registry;\n    if (registry && 'ember-htmlbars/keywords/closure-action' in registry) {\n        ACTION = Ember.__loader.require('ember-htmlbars/keywords/closure-action').ACTION;\n    } else if (registry && 'ember-routing-htmlbars/keywords/closure-action' in registry) {\n        ACTION = Ember.__loader.require('ember-routing-htmlbars/keywords/closure-action').ACTION;\n    }\n} catch (e) {\n    ACTION = undefined;\n}\n\nfunction getRouteInfos(router) {\n    const routerLib = router._routerMicrolib || router.router;\n    if (!routerLib) {\n        return [];\n    }\n\n    // Ember 3.x (incl. 3.28): active route infos expose `.route`.\n    if (routerLib.currentRouteInfos) {\n        return routerLib.currentRouteInfos;\n    }\n    if (routerLib.state && routerLib.state.routeInfos) {\n        return routerLib.state.routeInfos;\n    }\n\n    // Legacy (<= 3.8): handler infos expose `.handler`.\n    if (routerLib.currentHandlerInfos) {\n        return routerLib.currentHandlerInfos;\n    }\n\n    return [];\n}\n\nfunction getRoutes(router) {\n    return emberArray(getRouteInfos(router))\n        .map(info => info.route || info.handler)\n        .filter(Boolean)\n        .reverse();\n}\n\nfunction getRouteWithAction(router, actionName) {\n    let action;\n    const handler = emberArray(getRoutes(router)).find(route => {\n        const actions = route.actions || route._actions || {};\n        action = actions[actionName];\n\n        return typeof action === 'function';\n    });\n\n    return { action, handler };\n}\n\nexport default Helper.extend({\n    router: computed(function () {\n        return getOwner(this).lookup('router:main');\n    }).readOnly(),\n\n    compute([actionName, ...params]) {\n        const router = get(this, 'router');\n        assert('[ember-route-action-helper] Unable to lookup router', router);\n\n        runInDebug(() => {\n            const { handler } = getRouteWithAction(router, actionName);\n            assert(`[ember-route-action-helper] Unable to find action ${actionName}`, handler);\n        });\n\n        const routeAction = function (...invocationArgs) {\n            const { action, handler } = getRouteWithAction(router, actionName);\n            const args = params.concat(invocationArgs);\n            return join(handler, action, ...args);\n        };\n\n        if (ACTION) {\n            routeAction[ACTION] = true;\n        }\n\n        return routeAction;\n    }\n});\n","import singularize from 'ember-inflector/lib/helpers/singularize';\nexport default singularize;\n","import { inject as service } from '@ember/service';\nimport Helper from '@ember/component/helper';\n\nexport default Helper.extend({\n    intl: service(),\n    compute: function (params, hash) {\n        return this.intl.safestring(params[0], hash);\n    }\n});\n","/**\n * IFC Client Configuration\n *\n * This file defines the configuration for all iframe-coordinator (IFC) clients\n * embedded in Web Directory. It includes both modal clients and center-stage clients.\n *\n * @example\n * ```typescript\n * import { IFCClientConfig, IFCTitleKey } from './iframe-client-config';\n *\n * const myClient: IFCClientConfig = {\n *   url: 'https://example.com',\n *   assignedRoute: '/my-app',\n *   defaultTitle: 'purecloud.ifcTitles.analyticsUi' // Type-safe translation key\n * };\n * ```\n *\n * @see docs/IFC-Integration.md for integration guide\n * @see docs/IFC-Messaging-API.md for messaging API reference\n */\n\n// Import auto-generated translation key types\nimport { IFCTitleKey } from './types/translation-keys';\n\n// Re-export for convenience\nexport { IFCTitleKey };\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\n/**\n * Breadcrumb configuration for navigation\n */\ninterface Breadcrumb {\n    /** Translation key for breadcrumb text */\n    textKey: string;\n    /** Link URL (typically hash route) */\n    href?: string;\n    /** Unique identifier for DOM element */\n    id?: string;\n    /** Whether this is the current/active page */\n    active?: boolean;\n}\n\n/**\n * Navigation configuration\n */\ninterface NavConfig {\n    /** Static breadcrumbs for the page */\n    breadcrumbs?: Breadcrumb[];\n    /** Admin menu category identifier */\n    menu?: string;\n}\n\n/**\n * Feature toggle configuration\n */\ninterface FeatureToggleConfig {\n    /** Feature toggle key (supports boolean expressions) */\n    key: string;\n    /** Route to redirect to when toggle is off */\n    redirect?: string;\n    /** Function to generate redirect arguments */\n    makeRedirectArgs?: (context: { path: string }) => Record<string, any>;\n    /** Use old admin redirect logic */\n    useRedirctFromOldAdmin?: boolean;\n}\n\n/**\n * IFC client configuration\n */\nexport interface IFCClientConfig {\n    /** URL where the application is deployed */\n    url: string;\n    /** Route in Web Directory that displays this app */\n    assignedRoute: string;\n    /** Translation key for default page title (e.g., 'purecloud.ifcTitles.analyticsUi') */\n    defaultTitle: IFCTitleKey;\n    /** Time Machine URL generator for versioned deployments */\n    timeMachineUrl?: (version: string, data?: Record<string, any>) => string | URL;\n    /** Navigation configuration */\n    nav?: NavConfig;\n    /** Feature toggle configuration */\n    featureToggle?: FeatureToggleConfig;\n    /** Query parameters to forward to iframe */\n    queryParams?: string[];\n}\n\nexport interface IFCSidePanelClientConfig extends IFCClientConfig {\n    urlFormat: (data: Record<string, string>) => string | URL;\n}\n\n/**\n * Collection of IFC client configurations\n */\nexport type IFCClientConfigs = Record<string, IFCClientConfig>;\nexport type IFCSidePanelClientConfigs = Record<string, IFCSidePanelClientConfig>;\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nconst location = window.location.href;\n\nconst makeAdminRedirectArgs = ({ path = '' }: { path?: string }): { adminPath: string } => ({\n    adminPath: path.replace(/^\\/admin\\//, '')\n});\n\nconst makeAdminV3RedirectArgs = ({ path = '' }: { path?: string }): { adminPath: string } => ({\n    // Query parameters in the redirect were causing some kind of infinite routing loop\n    adminPath: path.replace(/^\\/admin\\//, '').split('?')[0]\n});\n\nconst telephonyAdminKoUri = '/contact-center/components/telephonyAdmin/koApp/#';\nconst telephonyAdminUri = '/contact-center/components/telephonyAdmin/app/#';\n\nconst getTelephonyAdminTimeMachineUri = (version: string, hash: string, isLegacy = false): string =>\n    `/contact-center/components/telephonyAdmin/${version}/${isLegacy ? 'koApp' : 'app'}/#${hash}`;\n\n// ============================================================================\n// Side Panel Clients Configuration\n// ============================================================================\n\nconst sidePanelClients: IFCSidePanelClientConfigs = {\n    /* User Rules Side Panel Specification: https://bitbucket.org/inindca/user-rules-ui/src/master/README.md */\n    editUserRulesUi: {\n        urlFormat: data => {\n            if (!data) return '';\n\n            const url = new URL(`/user-rules-ui/-HASH-/edit/${data.ruleId}`, location);\n            url.searchParams.set('view', 'sidePanel');\n            // Set any params included in modalData\n            if (data.params) {\n                const params = data.params as unknown as Record<string, any>;\n                Object.keys(params).forEach(key => {\n                    url.searchParams.set(key, params[key]);\n                });\n            }\n            return url.href.replace('-HASH-', '#');\n        },\n        timeMachineUrl: (version, data) => {\n            if (!data) return '';\n\n            const url = new URL(`/user-rules-ui/${version}/-HASH-/edit/${data.ruleId}`, location);\n            url.searchParams.set('view', 'sidePanel');\n            // Set any params included in modalData\n            if (data && data.params) {\n                const params = data.params as unknown as Record<string, any>;\n                Object.keys(params).forEach((key: string) => {\n                    url.searchParams.set(key, params[key]);\n                });\n            }\n            return url.href.replace('-HASH-', '#');\n        },\n        assignedRoute: '/',\n        defaultTitle: 'purecloud.ifcTitles.userRulesEdit',\n        url: '/'\n    },\n    /* User Rules Side Panel Specification: https://bitbucket.org/inindca/user-rules-ui/src/master/README.md */\n    listUserRulesUi: {\n        urlFormat: data => {\n            if (!data) return '';\n\n            const url = new URL(`/user-rules-ui/-HASH-/list`, location);\n            url.searchParams.set('view', 'sidePanel');\n            // Set any params included in modalData\n            if (data.params) {\n                const params = data.params as unknown as Record<string, any>;\n                Object.keys(params).forEach(key => {\n                    url.searchParams.set(key, params[key]);\n                });\n            }\n            return url.href.replace('-HASH-', '#');\n        },\n        timeMachineUrl: (version, data) => {\n            if (!data) return '';\n\n            const url = new URL(`/user-rules-ui/${version}/-HASH-/list`, location);\n            url.searchParams.set('view', 'sidePanel');\n            // Set any params included in modalData\n            if (data.params) {\n                const params = data.params as unknown as Record<string, any>;\n                Object.keys(params).forEach(key => {\n                    url.searchParams.set(key, params[key]);\n                });\n            }\n            return url.href.replace('-HASH-', '#');\n        },\n        assignedRoute: '/',\n        defaultTitle: 'purecloud.ifcTitles.userRulesList',\n        url: '/'\n    },\n    /* User Rules Side Panel Specification: https://bitbucket.org/inindca/user-rules-ui/src/master/README.md */\n    viewUserRulesUi: {\n        urlFormat: data => {\n            if (!data) return '';\n\n            const url = new URL(`/user-rules-ui/-HASH-/view/${data.ruleId}`, location);\n            url.searchParams.set('view', 'sidePanel');\n            // Set any params included in modalData\n            if (data.params) {\n                const params = data.params as unknown as Record<string, any>;\n                Object.keys(params).forEach(key => {\n                    url.searchParams.set(key, params[key]);\n                });\n            }\n            return url.href.replace('-HASH-', '#');\n        },\n        timeMachineUrl: (version, data) => {\n            if (!data) return '';\n\n            const url = new URL(`/user-rules-ui/${version}/-HASH-/view/${data.ruleId}`, location);\n            url.searchParams.set('view', 'sidePanel');\n            // Set any params included in modalData\n            if (data.params) {\n                const params = data.params as unknown as Record<string, any>;\n                Object.keys(params).forEach(key => {\n                    url.searchParams.set(key, params[key]);\n                });\n            }\n            return url.href.replace('-HASH-', '#');\n        },\n        assignedRoute: '/',\n        defaultTitle: 'purecloud.ifcTitles.userRulesView',\n        url: '/'\n    }\n};\n\n// ============================================================================\n// Modal Clients Configuration\n// ============================================================================\n\nconst modalClients: IFCClientConfigs = {\n    agentAdherenceDetailsModal: {\n        url: new URL('/agent-home/#/adherence-details-modal', location).toString(),\n        timeMachineUrl: version => new URL(`/agent-adherence-details/${version}/#/`, location).toString(),\n        assignedRoute: '/agent-adherence-details',\n        defaultTitle: 'purecloud.ifcTitles.agentAdherenceDetails'\n    },\n    wemCoachingUi: {\n        url: new URL('/wem-coaching-ui/#/', location).toString(),\n        timeMachineUrl: version => new URL(`/wem-coaching-ui/${version}/#/`, location).toString(),\n        assignedRoute: '/wem-coaching-ui',\n        defaultTitle: 'purecloud.ifcTitles.wemCoachingUi'\n    },\n    wemCoachingUiAddExisting: {\n        url: new URL('/wem-coaching-ui/#/addToExisting', location).toString(),\n        timeMachineUrl: version => new URL(`/wem-coaching-ui/${version}/#/addToExisting`, location).toString(),\n        assignedRoute: '/addToExisting',\n        defaultTitle: 'purecloud.ifcTitles.wemCoachingUi'\n    },\n    wemLearningUi: {\n        url: new URL('/wem-learning-ui/#/performance/modules/manual-assign', location).toString(),\n        timeMachineUrl: version =>\n            new URL(`/wem-learning-ui/${version}/#/performance/modules/manual-assign`, location).toString(),\n        assignedRoute: '/admin/performance/modules/manual-assign',\n        defaultTitle: 'purecloud.ifcTitles.manualAssignModules'\n    },\n    iamAdminDeletePolicyModal: {\n        url: new URL('/iam-admin/#/policies/delete', location).toString(),\n        timeMachineUrl: version => new URL(`/iam-admin/${version}/#/policies/delete`, location).toString(),\n        assignedRoute: '/admin/people-permissions/policies/delete',\n        defaultTitle: 'purecloud.ifcTitles.deletePolicy'\n    },\n    recognitionsUi: {\n        url: new URL('/recognitions-ui/#/', location).toString(),\n        timeMachineUrl: version => new URL(`/recognitions-ui/${version}/#/`, location).toString(),\n        assignedRoute: '/recognitions-ui',\n        defaultTitle: 'purecloud.ifcTitles.recognitionsUi'\n    },\n    agentHomeContestDetailsUi: {\n        url: new URL('/agent-home/#/contests-details', location).toString(),\n        timeMachineUrl: version => new URL(`/contests-details/${version}/#/`, location).toString(),\n        assignedRoute: '/contests-details',\n        defaultTitle: 'purecloud.ifcTitles.contestDetails'\n    },\n    iamAdminDeleteSSOModal: {\n        url: new URL('/iam-admin/#/sso/delete', location).toString(),\n        timeMachineUrl: version => new URL(`/iam-admin/${version}/#/sso/delete`, location).toString(),\n        assignedRoute: '/admin/identity/sso/delete',\n        defaultTitle: 'purecloud.ifcTitles.deleteSingleSignOn'\n    },\n    iamAdminDeleteProviderCertificate: {\n        url: new URL('/iam-admin/#/providers/deleteCertificate', location).toString(),\n        timeMachineUrl: version => new URL(`/iam-admin/${version}/#/providers/deleteCertificate`, location).toString(),\n        assignedRoute: '/admin/identity/providers/deleteCertificate',\n        defaultTitle: 'purecloud.ifcTitles.deleteCertificate'\n    },\n    iamAdminDeleteOAuthClientModal: {\n        url: new URL('/iam-admin/#/oauth-clients/delete', location).toString(),\n        timeMachineUrl: version => new URL(`/iam-admin/${version}/#/oauth-clients/delete`, location).toString(),\n        assignedRoute: '/admin/access-management/oauth-clients/delete',\n        defaultTitle: 'purecloud.ifcTitles.deleteOauthClient'\n    },\n    iamAdminChangeOAuthClientSecretModal: {\n        url: new URL('/iam-admin/#/oauth-clients/changesecret', location).toString(),\n        timeMachineUrl: version => new URL(`/iam-admin/${version}/#/oauth-clients/changesecret`, location).toString(),\n        assignedRoute: '/admin/access-management/oauth-clients/changesecret',\n        defaultTitle: 'purecloud.ifcTitles.changeOauthClientSecret'\n    },\n    iamAdminDeleteRoleModal: {\n        url: new URL('/iam-admin/#/roles/delete', location).toString(),\n        timeMachineUrl: version => new URL(`/iam-admin/${version}/#/roles/delete`, location).toString(),\n        assignedRoute: '/admin/people-permissions/roles/delete',\n        defaultTitle: 'purecloud.ifcTitles.deleteRole'\n    },\n    iamAdminDivisionCreate: {\n        url: new URL('/iam-admin/#/divisions/create', location).toString(),\n        timeMachineUrl: version => new URL(`/iam-admin/${version}/#/divisions/create`, location).toString(),\n        assignedRoute: '/admin/people-permissions/divisions/create',\n        defaultTitle: 'purecloud.ifcTitles.createDivision'\n    },\n    iamAdminDivisionDelete: {\n        url: new URL('/iam-admin/#/divisions/delete', location).toString(),\n        timeMachineUrl: version => new URL(`/iam-admin/${version}/#/divisions/delete`, location).toString(),\n        assignedRoute: '/admin/people-permissions/divisions/delete',\n        defaultTitle: 'purecloud.ifcTitles.deleteDivision'\n    },\n    iamAdminSaveRoleModal: {\n        url: new URL('/iam-admin/#/roles/save', location).toString(),\n        timeMachineUrl: version => new URL(`/iam-admin/${version}/#/roles/save`, location).toString(),\n        assignedRoute: '/admin/people-permissions/roles/save',\n        defaultTitle: 'purecloud.ifcTitles.saveRole'\n    },\n    iamAdminRestoreDefaultRoleModal: {\n        url: new URL('/iam-admin/#/roles/restoreDefault', location).toString(),\n        timeMachineUrl: version => new URL(`/iam-admin/${version}/#/roles/restoreDefault`, location).toString(),\n        assignedRoute: '/admin/people-permissions/roles/restoreDefault',\n        defaultTitle: 'purecloud.ifcTitles.restoreDefaultRole'\n    },\n    iamAdminPermissionConditionsModal: {\n        url: new URL('/iam-admin/#/roles/permissionConditions', location).toString(),\n        timeMachineUrl: version => new URL(`/iam-admin/${version}/#/roles/permissionConditions`, location).toString(),\n        assignedRoute: '/admin/people-permissions/roles/permissionConditions',\n        defaultTitle: 'purecloud.ifcTitles.conditions'\n    },\n    iamAdminRolesChangeMembershipModal: {\n        url: new URL('/iam-admin/#/roles/changeMembership', location).toString(),\n        timeMachineUrl: version => new URL(`/iam-admin/${version}/#/roles/changeMembership`, location).toString(),\n        assignedRoute: '/admin/people-permissions/roles/changeMembership',\n        defaultTitle: 'purecloud.ifcTitles.changeMembershipForRole'\n    },\n    userRulesUi: {\n        url: new URL('/user-rules-ui/#/', location).toString(),\n        timeMachineUrl: version => new URL(`/user-rules-ui/${version}/#/`, location).toString(),\n        assignedRoute: '/user-rules-ui',\n        defaultTitle: 'purecloud.ifcTitles.userRulesUi'\n    },\n    iamAdminAuthorizedAppsActionModal: {\n        url: new URL('/iam-admin/#/authorized-apps/action', location).toString(),\n        timeMachineUrl: version => new URL(`/iam-admin/${version}/#/authorized-apps/action`, location).toString(),\n        assignedRoute: '/admin/access-management/authorized-apps/action',\n        defaultTitle: 'purecloud.ifcTitles.modifyClient'\n    },\n    iamAdminAcknowledgeOAuthClientSecretSaveModal: {\n        url: new URL('/iam-admin/#/oauth-clients/acknowledgeSecretSave', location).toString(),\n        timeMachineUrl: version =>\n            new URL(`/iam-admin/${version}/#/oauth-clients/acknowledgeSecretSave`, location).toString(),\n        assignedRoute: '/admin/people-permissions/oauth-clients/acknowledgeSecretSave',\n        defaultTitle: 'purecloud.ifcTitles.copyAndStoreClientSecret'\n    },\n    iamAdminAuthAppsAuthorizeClientModal: {\n        url: new URL('/iam-admin/#/authorized-apps/authClient', location).toString(),\n        timeMachineUrl: version => new URL(`/iam-admin/${version}/#/authorized-apps/authClient`, location).toString(),\n        assignedRoute: '/admin/access-management/authorized-apps/authClient',\n        defaultTitle: 'purecloud.ifcTitles.authorizeClient'\n    },\n    iamAdminAuthAppsAddRolesModal: {\n        url: new URL('/iam-admin/#/authorized-apps/add', location).toString(),\n        timeMachineUrl: version => new URL(`/iam-admin/${version}/#/authorized-apps/add`, location).toString(),\n        assignedRoute: '/admin/access-management/authorized-apps/add',\n        defaultTitle: 'purecloud.ifcTitles.addRoles'\n    },\n    iamAdminRemoveExcludedAPIModal: {\n        url: new URL('/iam-admin/#/settings/remove-api', location).toString(),\n        timeMachineUrl: version => new URL(`/iam-admin/${version}/#/settings/remove-api`, location).toString(),\n        assignedRoute: '/admin/access-management/settings/remove-api',\n        defaultTitle: 'purecloud.ifcTitles.removeApi'\n    },\n    iamAdminDisableLoginAcknowledgmentModal: {\n        url: new URL('/iam-admin/#/settings/disable-login-acknowledgment', location).toString(),\n        timeMachineUrl: version =>\n            new URL(`/iam-admin/${version}/#/settings/disable-login-acknowledgment`, location).toString(),\n        assignedRoute: '/admin/access-management/settings/disable-login-acknowledgment',\n        defaultTitle: 'purecloud.ifcTitles.disableGenesysCloudloginAcknowledgment'\n    },\n    iamAdminCreatePairModal: {\n        url: new URL('/iam-admin/#/authorized-orgs/create-pair', location).toString(),\n        timeMachineUrl: version => new URL(`/iam-admin/${version}/#/authorized-orgs/create-pair`, location).toString(),\n        assignedRoute: '/admin/auth-orgs/create-pair',\n        defaultTitle: 'purecloud.ifcTitles.createPair'\n    },\n    iamAdminDeletePairModal: {\n        url: new URL('/iam-admin/#/authorized-orgs/delete', location).toString(),\n        timeMachineUrl: version => new URL(`/iam-admin/${version}/#/authorized-orgs/delete`, location).toString(),\n        assignedRoute: '/admin/auth-orgs/delete',\n        defaultTitle: 'purecloud.ifcTitles.deletePair'\n    },\n    iamAdminDisablePairModal: {\n        url: new URL('/iam-admin/#/authorized-orgs/disable', location).toString(),\n        timeMachineUrl: version => new URL(`/iam-admin/${version}/#/authorized-orgs/disable`, location).toString(),\n        assignedRoute: '/admin/auth-orgs/disable',\n        defaultTitle: 'purecloud.ifcTitles.disablePair'\n    },\n    iamAdminPairWithGenesysModal: {\n        url: new URL('/iam-admin/#/authorized-orgs/pair/genesys', location).toString(),\n        timeMachineUrl: version => new URL(`/iam-admin/${version}/#/authorized-orgs/pair/genesys`, location).toString(),\n        assignedRoute: '/admin/auth-orgs/pair/genesys',\n        defaultTitle: 'purecloud.ifcTitles.pairWithGenesysCare'\n    },\n    iamAdminDeleteTrustUserOrGroupModal: {\n        url: new URL('/iam-admin/#/authorized-orgs/delete-user-or-group', location).toString(),\n        timeMachineUrl: version =>\n            new URL(`/iam-admin/${version}/#/authorized-orgs/delete-user-or-group`, location).toString(),\n        assignedRoute: '/admin/auth-orgs/delete-user-or-group',\n        defaultTitle: 'purecloud.ifcTitles.deleteUserOrGroup'\n    },\n    iamAdminDeleteMFADeviceModal: {\n        url: new URL('/iam-admin/#/security/delete-mfa', location).toString(),\n        timeMachineUrl: version => new URL(`/iam-admin/${version}/#/security/delete-mfa`, location).toString(),\n        assignedRoute: '/security/delete-mfa',\n        defaultTitle: 'purecloud.ifcTitles.deleteMFADevice'\n    },\n    iamAdminSetDefaultMFADeviceModal: {\n        url: new URL('/iam-admin/#/security/set-default-mfa', location).toString(),\n        timeMachineUrl: version =>\n            new URL(`/iam-admin/${version}/#/security/set-default-mfa`, location).toString(),\n        assignedRoute: '/security/set-default-mfa',\n        defaultTitle: 'purecloud.ifcTitles.setDefaultMFADevice'\n    }\n};\n\n// ============================================================================\n// Center Stage Clients Configuration\n// ============================================================================\n\nconst centerStageClients: IFCClientConfigs = {\n    manageUserRulesUi: {\n        url: new URL('/user-rules-ui/#/manage', location).toString(),\n        timeMachineUrl: version => new URL(`/user-rules-ui/${version}/#/manage`, location).toString(),\n        assignedRoute: '/admin/user-rules',\n        defaultTitle: 'purecloud.ifcTitles.manageUsersRules'\n    },\n\n    userRulesUi: {\n        url: new URL('/user-rules-ui/#/', location).toString(),\n        timeMachineUrl: version => new URL(`/user-rules-ui/${version}/#/`, location).toString(),\n        assignedRoute: '/user-rules-ui',\n        defaultTitle: 'purecloud.ifcTitles.userRulesUi'\n    },\n\n    taskManagementParkedConversations: {\n        url: new URL('/email-parking-ui/#/', location).toString(),\n        timeMachineUrl: version => new URL(`/email-parking-ui/${version}/#/`, location).toString(),\n        assignedRoute: '/agent/task-management/parked-conversations',\n        defaultTitle: 'purecloud.ifcTitles.parkedConversations'\n    },\n\n    group: {\n        url: new URL('/connections-ui/#/group', location).toString(),\n        timeMachineUrl: version => new URL(`/connections-ui/${version}/#/group`, location).toString(),\n        assignedRoute: '/group-v2',\n        defaultTitle: 'purecloud.ifcTitles.group'\n    },\n\n    search: {\n        url: new URL('/connections-ui/#/search', location).toString(),\n        timeMachineUrl: version => new URL(`/connections-ui/${version}/#/search`, location).toString(),\n        assignedRoute: '/search-v2',\n        defaultTitle: 'purecloud.ifcTitles.search',\n        queryParams: ['entity', 'query', 'queryFacets'],\n        featureToggle: { key: 'NOT AGORA-78_integrate-agora-ui' }\n    },\n\n    person: {\n        url: new URL('/connections-ui/#/person', location).toString(),\n        timeMachineUrl: version => new URL(`/connections-ui/${version}/#/person`, location).toString(),\n        assignedRoute: '/person-v2',\n        defaultTitle: 'purecloud.ifcTitles.person',\n        queryParams: ['editEmergencyLocation'],\n        featureToggle: { key: 'NOT AGORA-78_integrate-agora-ui' }\n    },\n\n    card: {\n        url: new URL('/connections-ui/#/card', location).toString(),\n        timeMachineUrl: version => new URL(`/connections-ui/${version}/#/card`, location).toString(),\n        assignedRoute: '/card-v2',\n        defaultTitle: 'purecloud.ifcTitles.person',\n        featureToggle: { key: 'NOT AGORA-78_integrate-agora-ui' }\n    },\n\n    agoraUISearch: {\n        url: new URL('/agora-ui/#/search', location).toString(),\n        timeMachineUrl: version => new URL(`/agora-ui/${version}/#/search`, location).toString(),\n        assignedRoute: '/search-v2',\n        defaultTitle: 'purecloud.ifcTitles.search',\n        queryParams: ['entity', 'query', 'queryFacets'],\n        featureToggle: { key: 'AGORA-78_integrate-agora-ui' }\n    },\n\n    agoraUIPerson: {\n        url: new URL('/agora-ui/#/person', location).toString(),\n        timeMachineUrl: version => new URL(`/agora-ui/${version}/#/person`, location).toString(),\n        assignedRoute: '/person-v2',\n        defaultTitle: 'purecloud.ifcTitles.person',\n        queryParams: ['editEmergencyLocation'],\n        featureToggle: { key: 'AGORA-78_integrate-agora-ui' }\n    },\n\n    agoraUICard: {\n        url: new URL('/agora-ui/#/card', location).toString(),\n        timeMachineUrl: version => new URL(`/agora-ui/${version}/#/card`, location).toString(),\n        assignedRoute: '/card-v2',\n        defaultTitle: 'purecloud.ifcTitles.person',\n        featureToggle: { key: 'AGORA-78_integrate-agora-ui' }\n    },\n\n    liveNow: {\n        url: new URL('/journey-micro/gpe-ui-live-now/#/', location).toString(),\n        timeMachineUrl: version => `/journey-micro/gpe-ui-live-now/${version}/#/`,\n        assignedRoute: '/admin/live-now',\n        defaultTitle: 'purecloud.ifcTitles.liveNow',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.predictiveEngagement.predictiveEngagement'\n                },\n                {\n                    textKey: 'frameNav.predictiveEngagement.liveNow'\n                }\n            ],\n            menu: 'admin:PREDICTIVE_ENGAGEMENT'\n        }\n    },\n\n    outcomesMilestones: {\n        url: new URL('/customer-outcomes-ui/#/outcomes-milestones', location).toString(),\n        timeMachineUrl: version => {\n            if (version === 'local') {\n                return new URL('https://localhost:4444/#/outcomes-milestones');\n            } else {\n                return `/customer-outcomes-ui/${version}/#/outcomes-milestones`;\n            }\n        },\n        assignedRoute: '/admin/outcomes-milestones',\n        defaultTitle: 'purecloud.ifcTitles.outcomesMilestones',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.enrichments.enrichments',\n                    href: '#/admin'\n                },\n                {\n                    textKey: 'frameNav.enrichments.outcomesMilestones',\n                    href: '#/admin/outcomes-milestones'\n                }\n            ],\n            menu: 'admin:ENRICHMENTS'\n        },\n        featureToggle: {\n            key: 'PURE-6813_OutcomesMilestones'\n        }\n    },\n\n    journeyShapingSegment: {\n        url: new URL('/journey-micro/gpe-ui-journey-shaping/#/journey/segment', location).toString(),\n        timeMachineUrl: version =>\n            new URL(`/journey-micro/gpe-ui-journey-shaping/${version}/#/journey/segment`, location).toString(),\n        assignedRoute: '/admin/journey/segment',\n        defaultTitle: 'purecloud.ifcTitles.journeyShapingSegment',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.enrichments.enrichments'\n                },\n                {\n                    textKey: 'frameNav.enrichments.customerSegments'\n                }\n            ],\n            menu: 'admin:ENRICHMENTS'\n        }\n    },\n\n    PEFActionMap: {\n        url: new URL('/journey/admin/#/embed/engagement/action-map', location).toString(),\n        timeMachineUrl: version =>\n            new URL(`/journey/admin/${version}/#/embed/engagement/action-map`, location).toString(),\n        assignedRoute: '/admin/embed/engagement/action-map',\n        defaultTitle: 'purecloud.ifcTitles.engagementActionMap',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.predictiveEngagement.predictiveEngagement'\n                },\n                {\n                    textKey: 'frameNav.predictiveEngagement.actionMaps'\n                }\n            ],\n            menu: 'admin:PREDICTIVE_ENGAGEMENT'\n        }\n    },\n\n    PEFContentOffer: {\n        url: new URL('/journey/admin/#/library/action-template', location).toString(),\n        timeMachineUrl: version => new URL(`/journey/admin/${version}/#/library/action-template`, location).toString(),\n        assignedRoute: '/admin/embed/library/action-template',\n        defaultTitle: 'purecloud.ifcTitles.engagementContentOffer',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.predictiveEngagement.predictiveEngagement'\n                },\n                {\n                    textKey: 'frameNav.predictiveEngagement.actionLibrary'\n                }\n            ],\n            menu: 'admin:PREDICTIVE_ENGAGEMENT'\n        }\n    },\n\n    PEFGlobalSettings: {\n        url: new URL('/journey/admin/#/global-settings', location).toString(),\n        timeMachineUrl: version => new URL(`/journey/admin/${version}/#/global-settings`, location).toString(),\n        assignedRoute: '/admin/embed/global-settings',\n        defaultTitle: 'purecloud.ifcTitles.engagementGlobalSettings',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.predictiveEngagement.predictiveEngagement'\n                },\n                {\n                    textKey: 'frameNav.predictiveEngagement.globalSettings'\n                }\n            ],\n            menu: 'admin:PREDICTIVE_ENGAGEMENT'\n        }\n    },\n\n    PEFAnalyticsVisitor: {\n        url: new URL('/journey/admin/#/analytics/visitor-activity', location).toString(),\n        timeMachineUrl: version =>\n            new URL(`/journey/admin/${version}/#/analytics/visitor-activity`, location).toString(),\n        assignedRoute: '/admin/embed/analytics/visitor-activity',\n        defaultTitle: 'purecloud.ifcTitles.engagementVisitorActivityReport',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.predictiveEngagement.predictiveEngagement'\n                },\n                {\n                    textKey: 'frameNav.predictiveEngagement.visitorActivityReport'\n                }\n            ],\n            menu: 'admin:PREDICTIVE_ENGAGEMENT'\n        }\n    },\n\n    PEFAnalyticsActionMap: {\n        url: new URL('/journey/admin/#/analytics/action-map', location).toString(),\n        timeMachineUrl: version => new URL(`/journey/admin/${version}/#/analytics/action-map`, location).toString(),\n        assignedRoute: '/admin/embed/analytics/action-map',\n        defaultTitle: 'purecloud.ifcTitles.engagementActionMapReport',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.predictiveEngagement.predictiveEngagement'\n                },\n                {\n                    textKey: 'frameNav.predictiveEngagement.actionMapReport'\n                }\n            ],\n            menu: 'admin:PREDICTIVE_ENGAGEMENT'\n        }\n    },\n\n    topicDefinitionsV2: {\n        url: new URL('/topics-definitions-ui-v2/#/', location).toString(),\n        timeMachineUrl: version => `/topics-definitions-ui-v2/${version}/#/`,\n        assignedRoute: '/topics-definitions',\n        defaultTitle: 'purecloud.ifcTitles.topicsDefinitions',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.quality.qualityAdmin', href: '#/admin/quality' }],\n            menu: 'admin:QUALITY'\n        }\n    },\n\n    programsDefinitions: {\n        url: new URL('/programs-definitions-ui/#/', location).toString(),\n        timeMachineUrl: version => `/programs-definitions-ui/${version}/#/`,\n        assignedRoute: '/programs-definitions',\n        defaultTitle: 'purecloud.ifcTitles.programsDefinitions',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.quality.qualityAdmin', href: '#/admin/quality' }],\n            menu: 'admin:QUALITY'\n        }\n    },\n\n    staCategoryDefinitions: {\n        url: new URL('/sta-category-definitions-ui/#/', location).toString(),\n        timeMachineUrl: version => `/sta-category-definitions-ui/${version}/#/`,\n        assignedRoute: '/quality/admin/sta-category-definitions',\n        defaultTitle: 'purecloud.ifcTitles.staCategoryDefinitions',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.quality.qualityAdmin', href: '#/admin/quality' }],\n            menu: 'admin:QUALITY'\n        }\n    },\n\n    agentChecklistsUi: {\n        url: new URL('/agent-checklists-ui/#/', location).toString(),\n        timeMachineUrl: version => `/agent-checklists-ui/${version}/#/`,\n        assignedRoute: '/quality/admin/agent-checklists-ui',\n        defaultTitle: 'purecloud.ifcTitles.agentChecklists',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.quality.qualityAdmin', href: '#/admin/quality' }],\n            menu: 'admin:QUALITY'\n        }\n    },\n\n    quality: {\n        url: new URL('/quality-ifc/#/', location).toString(),\n        assignedRoute: '/admin/quality',\n        defaultTitle: 'purecloud.ifcTitles.qualityAdmin',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.quality.qualityAdmin', href: '#/admin/quality', id: 'quality' }],\n            menu: 'admin:QUALITY'\n        }\n    },\n\n    staSettings: {\n        url: new URL('/speech-and-text-analytics-settings-ui/#/', location).toString(),\n        timeMachineUrl: version => `/speech-and-text-analytics-settings-ui/${version}/#/`,\n        assignedRoute: '/quality/admin/speech-and-text-analytics',\n        defaultTitle: 'purecloud.ifcTitles.speechAndTextAnalysis',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.quality.qualityAdmin', href: '#/admin/quality' }],\n            menu: 'admin:QUALITY'\n        }\n    },\n\n    dictionaryFeedback: {\n        url: new URL('/dictionary-feedback-ui/#/', location).toString(),\n        timeMachineUrl: version => `/dictionary-feedback-ui/${version}/#/`,\n        assignedRoute: '/quality/admin/dictionary-management',\n        defaultTitle: 'purecloud.ifcTitles.dictionaryManagement',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.quality.qualityAdmin', href: '#/admin/quality' }],\n            menu: 'admin:QUALITY'\n        }\n    },\n\n    sentimentFeedback: {\n        url: new URL('/sentiment-feedback-ui/#/', location).toString(),\n        timeMachineUrl: version => `/sentiment-feedback-ui/${version}/#/`,\n        assignedRoute: '/quality/admin/sentiment-feedback',\n        defaultTitle: 'purecloud.ifcTitles.sentimentFeedback',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.quality.qualityAdmin', href: '#/admin/quality' }],\n            menu: 'admin:QUALITY'\n        }\n    },\n\n    reprocessInteractions: {\n        url: new URL('/sta-reprocess-interactions-ui/#/', location).toString(),\n        timeMachineUrl: version => `/sta-reprocess-interactions-ui/${version}/#/`,\n        assignedRoute: '/quality/admin/reprocess-interactions',\n        featureToggle: { key: 'WEM-885_ReprocessInteractionsUI' },\n        defaultTitle: 'purecloud.ifcTitles.interactionReprocessing',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.quality.qualityAdmin', href: '#/admin/quality' }],\n            menu: 'admin:QUALITY'\n        }\n    },\n\n    topicMinerUI: {\n        url: new URL('/intent-miner/#/', location).toString(),\n        timeMachineUrl: version => `/intent-miner/${version}/#/`,\n        assignedRoute: '/quality/admin/topic-miner',\n        defaultTitle: 'purecloud.ifcTitles.topicMiner',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.quality.qualityAdmin', href: '#/admin/quality' }],\n            menu: 'admin:QUALITY'\n        }\n    },\n\n    embeddedAnalyticsUi: {\n        url: new URL('/embedded-analytics-ui/#/', location).toString(),\n        timeMachineUrl: version => `/embedded-analytics-ui/${version}/#/`,\n        assignedRoute: '/analyticsexplorer',\n        defaultTitle: 'purecloud.ifcTitles.analyticsExplorer',\n        featureToggle: {\n            key: 'PURE-7428_embedded-analytics'\n        }\n    },\n\n    analyticsUi: {\n        url: new URL('/analytics-ui/#/', location).toString(),\n        assignedRoute: '/analytics',\n        defaultTitle: 'purecloud.ifcTitles.analyticsUi',\n        queryParams: ['evaluationId', 'surveyId', 'giaTranscriptVersion', 'assignmentPanel']\n    },\n\n    analyticsAdminUi: {\n        url: new URL('/analytics-ui/#/admin', location).toString(),\n        timeMachineUrl: version => `/analytics-ui/${version}/#/admin`,\n        assignedRoute: '/admin/contact-center/analytics',\n        defaultTitle: 'purecloud.ifcTitles.analyticsUiAdmin',\n\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.contactCenter.contactCenter'\n                },\n                {\n                    textKey: 'frameNav.contactCenter.analytics'\n                }\n            ],\n\n            menu: 'admin:CONTACT_CENTER'\n        }\n    },\n\n    adminV3TelephonyDids: {\n        url: new URL('/admin-v3/#/telephony/did', location).toString(),\n        assignedRoute: '/admin/telephony/did',\n        defaultTitle: 'purecloud.ifcTitles.untitled',\n        nav: {\n            breadcrumbs: [\n                { textKey: 'frameNav.telephony.telephony', href: '#/admin' },\n                { textKey: 'frameNav.telephony.did', href: '#/admin/telephony/did' }\n            ],\n            menu: 'admin:TELEPHONY'\n        },\n        featureToggle: {\n            key: 'adminUI.v3.IFC.migration AND (NOT PURE-3796_DIDGroups)',\n            redirect: 'admin',\n            makeRedirectArgs: makeAdminV3RedirectArgs\n        }\n    },\n\n    externalSourcesAdminUI: {\n        url: new URL('/external-sources-admin-ui/#/', location).toString(),\n        timeMachineUrl: version => `/external-sources-admin-ui/${version}/#/`,\n        assignedRoute: '/admin/external-sources',\n        defaultTitle: 'purecloud.ifcTitles.externalSourcesAdmin',\n        nav: {\n            breadcrumbs: [\n                { textKey: 'frameNav.directory.directory', href: '#/admin' },\n                { textKey: 'frameNav.directory.externalSources', href: '#/admin/external-sources' }\n            ],\n            menu: 'admin:DIRECTORY'\n        }\n    },\n\n    externalEventSchemasAdminUI: {\n        url: new URL('/external-event-schemas-admin-ui/#/schemas', location).toString(),\n        timeMachineUrl: version => `/external-event-schemas-admin-ui/${version}/#/schemas`,\n        assignedRoute: '/admin/external-events/schemas',\n        defaultTitle: 'purecloud.ifcTitles.externalEventSchemas',\n        nav: {\n            breadcrumbs: [\n                { textKey: 'frameNav.externalEventIngestion.externalEventIngestion', href: '#/admin' },\n                {\n                    textKey: 'frameNav.externalEventIngestion.schemas',\n                    href: '#/admin/external-events/schemas'\n                }\n            ]\n        }\n    },\n\n    externalEventConfigurationsAdminUI: {\n        url: new URL('/external-events-admin-ui/#/events', location).toString(),\n        timeMachineUrl: version => `/external-events-admin-ui/${version}/#/events`,\n        assignedRoute: '/admin/external-events/configurations',\n        defaultTitle: 'purecloud.ifcTitles.externalEventConfigurations',\n        nav: {\n            breadcrumbs: [\n                { textKey: 'frameNav.externalEventIngestion.externalEventIngestion', href: '#/admin' },\n                {\n                    textKey: 'frameNav.externalEventIngestion.configurations',\n                    href: '#/admin/external-events/configurations'\n                }\n            ]\n        }\n    },\n\n    intentTaxonomyUI: {\n        defaultTitle: 'purecloud.ifcTitles.customerIntents',\n        url: new URL('/intent-taxonomy-ui/#/', location).toString(),\n        timeMachineUrl: version => {\n            if (version === 'local') {\n                return new URL('https://localhost:4444/intent-taxonomy-ui/#/');\n            } else {\n                return `/intent-taxonomy-ui/${version}/#/`;\n            }\n        },\n        assignedRoute: '/admin/intent-taxonomy-ui',\n        nav: {\n            breadcrumbs: [\n                { textKey: 'frameNav.enrichments.enrichments', href: '#/admin' },\n                { textKey: 'frameNav.enrichments.customerIntents', href: '#/admin/intent-taxonomy-ui' }\n            ]\n        }\n    },\n\n    directoryAdminGroups: {\n        url: new URL('/directory-admin-ui/#/groups', location).toString(),\n        timeMachineUrl: version => `/directory-admin-ui/${version}/#/groups`,\n        assignedRoute: '/admin/groups',\n        defaultTitle: 'purecloud.ifcTitles.directoryGroups',\n        nav: {\n            breadcrumbs: [\n                { textKey: 'frameNav.directory.directory', href: '#/admin' },\n                { textKey: 'frameNav.directory.groups', href: '#/admin/groups' }\n            ],\n            menu: 'admin:DIRECTORY'\n        }\n    },\n\n    directoryAdminProfileGroup: {\n        url: new URL('/directory-admin-ui/#/group', location).toString(),\n        timeMachineUrl: version => `/directory-admin-ui/${version}/#/group`,\n        assignedRoute: '/admin/groupprofile',\n        defaultTitle: 'purecloud.ifcTitles.directoryGroupProfile',\n        nav: {\n            breadcrumbs: [\n                { textKey: 'frameNav.directory.directory', href: '#/admin' },\n                { textKey: 'frameNav.directory.groups', href: '#/admin/groups' }\n            ],\n            menu: 'admin:DIRECTORY'\n        }\n    },\n\n    LocationsUI: {\n        url: new URL('/locations-ui/#/locations', location).toString(),\n        timeMachineUrl: version => `/locations-ui/${version}/#/locations`,\n        assignedRoute: '/admin/directory/locations',\n        defaultTitle: 'purecloud.ifcTitles.locations',\n        nav: {\n            breadcrumbs: [\n                { textKey: 'frameNav.directory.directory', href: '#/admin' },\n                { textKey: 'frameNav.directory.locations', href: '#/admin/directory/locations' }\n            ],\n            menu: 'admin:DIRECTORY'\n        },\n        featureToggle: {\n            key: 'PURE-7648_locations',\n            redirect: 'admin',\n            makeRedirectArgs: makeAdminRedirectArgs\n        }\n    },\n\n    customFieldsContacts: {\n        url: new URL('/custom-fields-ui/#/custom-fields/contacts', location).toString(),\n        assignedRoute: '/admin/custom-fields-v2/contacts',\n        defaultTitle: 'purecloud.ifcTitles.customFieldsContacts',\n        timeMachineUrl: version => {\n            if (version === 'local') {\n                return new URL('https://localhost:5173/custom-fields-ui/#/custom-fields/contacts');\n            } else {\n                return `/custom-fields-ui/${version}/#/custom-fields/contacts`;\n            }\n        },\n        nav: {\n            breadcrumbs: [\n                { textKey: 'frameNav.directory.directory', href: '#/admin' },\n                { textKey: 'frameNav.directory.externalContacts', href: '#/admin/custom-fields/contacts' }\n            ],\n            menu: 'admin:DIRECTORY'\n        }\n    },\n\n    customFieldsExternalOrgs: {\n        url: new URL('/custom-fields-ui/#/custom-fields/external-orgs', location).toString(),\n        assignedRoute: '/admin/custom-fields-v2/external-orgs',\n        defaultTitle: 'purecloud.ifcTitles.customFieldsExternalOrgs',\n        timeMachineUrl: version => {\n            if (version === 'local') {\n                return new URL('https://localhost:5173/custom-fields-ui/#/custom-fields/external-orgs');\n            } else {\n                return `/custom-fields-ui/${version}/#/custom-fields/external-orgs`;\n            }\n        },\n        nav: {\n            breadcrumbs: [\n                { textKey: 'frameNav.directory.directory', href: '#/admin' },\n                { textKey: 'frameNav.directory.externalOrgs', href: '#/admin/custom-fields/external-orgs' }\n            ],\n            menu: 'admin:DIRECTORY'\n        }\n    },\n\n    adminV3WorkTeams: {\n        url: new URL('/admin-v3/#/teams', location).toString(),\n        assignedRoute: '/admin/teams',\n        defaultTitle: 'purecloud.ifcTitles.untitled',\n        nav: {\n            breadcrumbs: [\n                { textKey: 'frameNav.directory.directory', href: '#/admin' },\n                { textKey: 'frameNav.directory.workTeams', href: '#/admin/teams' }\n            ],\n            menu: 'admin:DIRECTORY'\n        },\n        featureToggle: {\n            key: 'adminUI.v3.IFC.migration AND (NOT ACT-1409_workTeamsMigration)',\n            redirect: 'admin',\n            makeRedirectArgs: makeAdminV3RedirectArgs\n        }\n    },\n\n    directoryAdminWorkTeams: {\n        url: new URL('/directory-admin-ui/#/teams', location).toString(),\n        timeMachineUrl: version => `/directory-admin-ui/${version}/#/teams`,\n        assignedRoute: '/admin/teams',\n        defaultTitle: 'purecloud.ifcTitles.untitled',\n        nav: {\n            breadcrumbs: [\n                { textKey: 'frameNav.directory.directory', href: '#/admin' },\n                { textKey: 'frameNav.directory.workTeams', href: '#/admin/teams' }\n            ],\n            menu: 'admin:DIRECTORY'\n        },\n        featureToggle: {\n            key: 'ACT-1409_workTeamsMigration',\n            redirect: 'admin'\n        }\n    },\n\n    messengerAdminConfigurationsV2: {\n        url: new URL('/messenger-admin-v2/#/messenger/configurations', location).toString(),\n        timeMachineUrl: version => `/messenger-admin-v2/${version}/#/messenger/configurations`,\n        assignedRoute: '/admin/messenger/configurations',\n        defaultTitle: 'purecloud.ifcTitles.untitled',\n        nav: {\n            breadcrumbs: [\n                { textKey: 'frameNav.messagingAdmin.message', href: '#/admin' },\n                { textKey: 'frameNav.messagingAdmin.configurations', href: '#/admin/messenger/configurations' }\n            ],\n            menu: 'admin:MESSAGE'\n        },\n        queryParams: ['duplicateId']\n    },\n\n    messengerAdminDeploymentsV2: {\n        url: new URL('/messenger-admin-v2/#/messenger/deployments', location).toString(),\n        timeMachineUrl: version => `/messenger-admin-v2/${version}/#/messenger/deployments`,\n        assignedRoute: '/admin/messenger/deployments',\n        defaultTitle: 'purecloud.ifcTitles.untitled',\n        nav: {\n            breadcrumbs: [\n                { textKey: 'frameNav.messagingAdmin.message', href: '#/admin' },\n                { textKey: 'frameNav.messagingAdmin.deployments', href: '#/admin/messenger/deployments' }\n            ],\n            menu: 'admin:MESSAGE'\n        }\n    },\n    learningModules: {\n        url: new URL('/wem-learning-ui/#/performance/modules', location).toString(),\n        timeMachineUrl: version => new URL(`/wem-learning-ui/${version}/#/performance/modules`, location).toString(),\n        assignedRoute: '/admin/performance/modules',\n        defaultTitle: 'purecloud.ifcTitles.modulesUi',\n        nav: {\n            breadcrumbs: [\n                { textKey: 'frameNav.performanceEngagement.performanceAdmin', href: '#/admin', active: true }\n            ],\n            menu: 'admin:performance/modules'\n        }\n    },\n\n    rtsConfig: {\n        url: new URL('/rts-config/#/', location).toString(),\n        timeMachineUrl: version => `/rts-config/${version}/#/`,\n        assignedRoute: '/admin/performance/realtime-supervision',\n        defaultTitle: 'purecloud.ifcTitles.realTimeSupervisionConfiguration',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.performanceEngagement.employeeEngagement.realtimeSupervision',\n                    href: '#/admin/performance/realtime-supervision',\n                    id: 'rtsConfig',\n                    active: true\n                }\n            ],\n            menu: 'admin:performance/modules'\n        },\n        featureToggle: {\n            key: 'WEM-437_screen-monitoring'\n        }\n    },\n\n    agentHome: {\n        url: new URL('/agent-home/#/', location).toString(),\n        assignedRoute: '/activity',\n        timeMachineUrl: version => new URL(`/agent-home/${version}/#/`, location).toString(),\n        defaultTitle: 'purecloud.ifcTitles.agentHome'\n    },\n\n    operationsHub: {\n        url: new URL('/hub-framework/#/', location).toString(),\n        assignedRoute: '/home',\n        timeMachineUrl: version => new URL(`/hub-framework/${version}/#/`, location).toString(),\n        defaultTitle: 'purecloud.ifcTitles.home',\n        featureToggle: {\n            key: 'WEM-1476_Agent-Activity-Migration'\n        }\n    },\n\n    performanceNotification: {\n        url: new URL('/notification-rules/#/', location).toString(),\n        timeMachineUrl: version => `/notification-rules/${version}/#/`,\n        assignedRoute: '/admin/performance/notification',\n        defaultTitle: 'purecloud.ifcTitles.notificationRules',\n        featureToggle: {\n            key: 'switchboardUI.notificationRules',\n            redirect: 'admin',\n            makeRedirectArgs: makeAdminRedirectArgs\n        },\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.performanceEngagement.performanceAdmin',\n                    href: '#/admin',\n                    active: true\n                }\n            ],\n            menu: 'admin:performance/modules'\n        }\n    },\n\n    gamificationProfilesUi: {\n        url: new URL('/gamification-profiles-ui/#/', location).toString(),\n        assignedRoute: '/admin/performance/gamification-profiles',\n        defaultTitle: 'purecloud.ifcTitles.gamificationProfilesUi',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.performanceEngagement.performanceAdmin',\n                    href: '#/admin',\n                    active: true\n                }\n            ],\n            menu: 'admin:performance/modules'\n        }\n    },\n\n    gamificationSettingsUi: {\n        url: new URL('/gamification-settings-ui/#/', location).toString(),\n        assignedRoute: '/admin/performance/gamification-settings',\n        defaultTitle: 'purecloud.ifcTitles.gamificationSettingsUi',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.performanceEngagement.performanceAdmin',\n                    href: '#/admin',\n                    active: true\n                }\n            ],\n            menu: 'admin:performance/modules'\n        }\n    },\n\n    gamificationContestsUi: {\n        url: new URL('/gamification-contests-ui/#/', location).toString(),\n        timeMachineUrl: version => `/gamification-contests-ui/${version}/#/`,\n        assignedRoute: '/admin/performance/gamification-contests',\n        defaultTitle: 'purecloud.ifcTitles.gamificationContestsUi',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.performanceEngagement.performanceAdmin',\n                    href: '#/admin',\n                    active: true\n                }\n            ],\n            menu: 'admin:performance/modules'\n        }\n    },\n\n    anomalyDetection: {\n        url: new URL('/anomaly-detection-ui/#/', location).toString(),\n        timeMachineUrl: version => `/anomaly-detection-ui/${version}/#/`,\n        assignedRoute: '/admin/anomaly-detection',\n        defaultTitle: 'purecloud.ifcTitles.anomalyDetection',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.anomalyDetection', active: true }],\n            menu: 'admin:analytics/anomalydetection'\n        },\n        featureToggle: { key: 'WEM-1310_QueueAnomalyDetection' }\n    },\n\n    wfmSupervisor: {\n        url: new URL('/wfm-supervisor/#/', location).toString(),\n        timeMachineUrl: version => `/wfm-supervisor/${version}/#/`,\n        assignedRoute: '/admin/wfm',\n        defaultTitle: 'purecloud.ifcTitles.workforceManagement',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.workforceManagement',\n                    href: '#/admin/wfm',\n                    id: 'wfm'\n                }\n            ],\n            menu: 'admin:WFM'\n        }\n    },\n\n    wfmShrinkage: {\n        url: new URL('/wfm-shrinkage-ui/#/', location).toString(),\n        timeMachineUrl: version => `/wfm-shrinkage-ui/${version}/#/`,\n        assignedRoute: '/admin/wfm/shrinkage/',\n        defaultTitle: 'purecloud.ifcTitles.untitled',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.workforceManagement',\n                    href: '#/admin/wfm',\n                    id: 'wfm'\n                }\n            ],\n            menu: 'admin:WFM'\n        }\n    },\n\n    wfmHistoricalDataImport: {\n        url: new URL('/wfm-historical-data-import-ui/#/', location).toString(),\n        timeMachineUrl: version => `/wfm-historical-data-import-ui/${version}/#/`,\n        assignedRoute: '/admin/wfm/historicalImportV2/',\n        defaultTitle: 'purecloud.ifcTitles.untitled',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.workforceManagement',\n                    href: '#/admin/wfm',\n                    id: 'wfm'\n                }\n            ],\n            menu: 'admin:WFM'\n        }\n    },\n\n    wfmActivityPlanner: {\n        url: new URL('/wfm-activity-planner-ui/#/', location).toString(),\n        timeMachineUrl: version => `/wfm-activity-planner-ui/${version}/#/`,\n        assignedRoute: '/admin/wfm/activityplans/',\n        defaultTitle: 'purecloud.ifcTitles.untitled',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.workforceManagement',\n                    href: '#/admin/wfm',\n                    id: 'wfm'\n                }\n            ],\n            menu: 'admin:WFM'\n        }\n    },\n\n    wfmMainForecast: {\n        url: new URL('/wfm-main-forecast-ui/#/', location).toString(),\n        assignedRoute: '/admin/wfm/main-forecast/',\n        defaultTitle: 'purecloud.ifcTitles.mainForecast',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.workforceManagement',\n                    href: '#/admin/wfm',\n                    id: 'wfm'\n                }\n            ],\n            menu: 'admin:WFM'\n        }\n    },\n\n    wfmForecasts: {\n        url: new URL('/wfm-main-forecast-ui/#/forecasts', location).toString(),\n        assignedRoute: '/admin/wfm/forecasting/forecasts',\n        defaultTitle: 'purecloud.ifcTitles.forecasts',\n        featureToggle: {\n            key: 'WEM-1539_forecast_list', // WFMFUI-2684:WEM-1539 | Post GA toggle cleanup\n            redirect: '/admin/wfm/forecasts'\n        },\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.workforceManagement',\n                    href: '#/admin/wfm',\n                    id: 'wfm'\n                }\n            ],\n            menu: 'admin:WFM'\n        }\n    },\n\n    wfmAdherenceAdjustments: {\n        url: new URL('/wfm-adherence-adjustments/#/', location).toString(),\n        timeMachineUrl: version => `/wfm-adherence-adjustments/${version}/#/`,\n        assignedRoute: '/admin/wfm/adherence/adjustments',\n        defaultTitle: 'purecloud.ifcTitles.adherenceAdjustments',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.workforceManagement',\n                    href: '#/admin/wfm',\n                    id: 'wfm'\n                }\n            ],\n            menu: 'admin:WFM'\n        },\n        featureToggle: { key: 'WEM-893_Adherence_Adjustments' }\n    },\n\n    wfmHistoricalAdherence: {\n        url: new URL('/wfm-historical-adherence/#/', location).toString(),\n        timeMachineUrl: version => `/wfm-historical-adherence/${version}/#/`,\n        assignedRoute: '/admin/wfm/adherence/historicalV2',\n        defaultTitle: 'purecloud.ifcTitles.historicalAdherence',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.workforceManagement',\n                    href: '#/admin/wfm',\n                    id: 'wfm'\n                }\n            ],\n            menu: 'admin:WFM'\n        }\n    },\n    wfmCapacityPlanning: {\n        url: new URL('/wfm-capacity-planning-ui/#/', location).toString(),\n        timeMachineUrl: version => new URL(`/wfm-capacity-planning-ui/${version}/#/`, location).toString(),\n        assignedRoute: '/admin/wfm/capacity-planning',\n        defaultTitle: 'purecloud.ifcTitles.untitled',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.workforceManagement',\n                    href: '#/admin/wfm',\n                    id: 'wfm'\n                }\n            ],\n            menu: 'admin:WFM'\n        }\n    },\n    wfmWorkplans: {\n        url: new URL('/wfm-workplans-ui/#/', location).toString(),\n        timeMachineUrl: version => new URL(`/wfm-workplans-ui/${version}/#/`, location).toString(),\n        assignedRoute: '/admin/wfm/workPlanV2',\n        defaultTitle: 'purecloud.ifcTitles.untitled',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.workforceManagement',\n                    href: '#/admin/wfm',\n                    id: 'wfm'\n                }\n            ],\n            menu: 'admin:WFM'\n        }\n    },\n    wfmDecisionMetrics: {\n        url: new URL('/wfm-decision-metrics-ui/#/', location).toString(),\n        timeMachineUrl: version => new URL(`/wfm-decision-metrics-ui/${version}/#/`, location).toString(),\n        assignedRoute: '/admin/performance/decisionMetrics',\n        defaultTitle: 'purecloud.ifcTitles.untitled',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.workforceManagement',\n                    href: '#/admin/performance',\n                    id: 'performance'\n                }\n            ],\n            menu: 'admin:performance'\n        },\n        featureToggle: { key: 'WEM-1385_DecisionMetrics' }\n    },\n\n    wfmStaffingGroup: {\n        url: new URL('/wfm-staffing-groups/#/', location).toString(),\n        timeMachineUrl: version => `/wfm-staffing-groups/${version}/#/`,\n        assignedRoute: '/admin/wfm/staffingGroups',\n        defaultTitle: 'purecloud.ifcTitles.untitled',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.workforceManagement',\n                    href: '#/admin/wfm',\n                    id: 'wfm'\n                }\n            ],\n            menu: 'admin:WFM'\n        }\n    },\n\n    wfmTimeOff: {\n        url: new URL('/wfm-timeoff-ui/#/', location).toString(),\n        timeMachineUrl: version => `/wfm-timeoff-ui/${version}/#/`,\n        assignedRoute: '/admin/wfm/time-off',\n        defaultTitle: 'purecloud.ifcTitles.untitled',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.workforceManagement',\n                    href: '#/admin/wfm',\n                    id: 'wfm'\n                }\n            ],\n            menu: 'admin:WFM'\n        }\n    },\n\n    wfmOpportunities: {\n        url: new URL('/wfm-opportunities-ui/#/', location).toString(),\n        timeMachineUrl: version => `/wfm-opportunities-ui/${version}/#/`,\n        assignedRoute: '/admin/wfm/opportunities',\n        defaultTitle: 'purecloud.ifcTitles.untitled',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.workforceManagement',\n                    href: '#/admin/wfm',\n                    id: 'wfm'\n                }\n            ],\n            menu: 'admin:WFM'\n        }\n    },\n\n    outbound: {\n        url: new URL('/outbound/#/', location).toString(),\n        timeMachineUrl: version => `/outbound/${version}/#/`,\n        assignedRoute: '/admin/outbound',\n        defaultTitle: 'purecloud.ifcTitles.outbound',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.outbound',\n                    href: '#/admin/outbound'\n                }\n            ],\n            menu: 'admin:OUTBOUND'\n        }\n    },\n\n    performanceExternalMetricDefinitions: {\n        url: new URL('/performance-external-metric-definitions-ui/#/', location).toString(),\n        assignedRoute: '/admin/performance/external-metric-definitions',\n        defaultTitle: 'purecloud.ifcTitles.externalMetricDefinitionsUi',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.performanceEngagement.performanceAdmin',\n                    href: '#/admin',\n                    active: true\n                }\n            ],\n            menu: 'admin:performance/modules'\n        }\n    },\n\n    // Handles old route and redirection to new one\n    // All links inside web-directory and admin-ui should be with the engage in the url\n    scripterTemplatesUIOld: {\n        url: new URL('/scripter/#/scriptTemplates', location).toString(),\n        assignedRoute: '/engage/admin/scriptTemplates',\n        defaultTitle: 'purecloud.ifcTitles.scripterIntegration',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.scripter.scriptTemplates',\n                    href: '#/admin/scriptTemplates',\n                    active: true\n                }\n            ],\n            menu: 'admin:directory/acdSkills'\n        }\n    },\n\n    // Handles old route and redirection to new one\n    // All links inside web-directory and admin-ui should be with the engage in the url\n    scripterUIOld: {\n        url: new URL('/scripter/#/scripts', location).toString(),\n        assignedRoute: '/engage/admin/scripts',\n        defaultTitle: 'purecloud.ifcTitles.scripterUiOld',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.scripter.scripts',\n                    href: '#/admin/scripts',\n                    active: true\n                }\n            ],\n            menu: 'admin:directory/acdSkills'\n        }\n    },\n\n    scripterTemplatesUI: {\n        url: new URL('/scripter/#/scriptTemplates', location).toString(),\n        assignedRoute: '/admin/scriptTemplates',\n        defaultTitle: 'purecloud.ifcTitles.scripterTemplatesUi',\n        nav: {\n            menu: 'admin:directory/acdSkills'\n        }\n    },\n\n    scripterUI: {\n        url: new URL('/scripter/#/scripts', location).toString(),\n        assignedRoute: '/admin/scripts',\n        defaultTitle: 'purecloud.ifcTitles.scripterUi',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.scripter.scripts',\n                    href: '#/admin/scripts',\n                    active: true\n                }\n            ],\n            menu: 'admin:directory/acdSkills'\n        }\n    },\n\n    messagingPlatformsUI: {\n        url: new URL('/messaging-admin-ui/#/messaging-platforms', location).toString(),\n        timeMachineUrl: version => new URL(`/messaging-admin-ui/${version}/#/messaging-platforms`, location).toString(),\n        assignedRoute: '/admin/messaging/platforms',\n        defaultTitle: 'purecloud.ifcTitles.messagingPlatformsUi',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.messagingAdmin.message', href: '#/admin' }],\n            menu: 'admin:MESSAGE'\n        }\n    },\n\n    platformConfigs: {\n        url: new URL('/messaging-admin-ui/#/platform-configs', location).toString(),\n        timeMachineUrl: version => new URL(`/messaging-admin-ui/${version}/#/platform-configs`, location).toString(),\n        assignedRoute: '/admin/messaging/platform-configs',\n        defaultTitle: 'purecloud.ifcTitles.platformConfigs',\n        nav: {\n            breadcrumbs: [\n                { textKey: 'frameNav.messagingAdmin.message', href: '#/admin' },\n                {\n                    textKey: 'frameNav.messagingAdmin.platformConfigs',\n                    href: '#/admin/messaging/platforms-configs',\n                    active: true\n                }\n            ],\n            menu: 'admin:MESSAGE'\n        }\n    },\n\n    supportedContentProfilesUi: {\n        url: new URL('/messaging-admin-ui/#/supported-content-profiles', location).toString(),\n        timeMachineUrl: version =>\n            new URL(`/messaging-admin-ui/${version}/#/supported-content-profiles`, location).toString(),\n        assignedRoute: '/admin/messaging/supported-content-profiles',\n        defaultTitle: 'purecloud.ifcTitles.supportedContentProfilesUi',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.messagingAdmin.message', href: '#/admin' }],\n            menu: 'admin:MESSAGE'\n        }\n    },\n\n    threadingTimelineUi: {\n        url: new URL('/messaging-admin-ui/#/threading-timeline', location).toString(),\n        timeMachineUrl: version => new URL(`/messaging-admin-ui/${version}/#/threading-timeline`, location).toString(),\n        assignedRoute: '/admin/messaging/threading-timeline',\n        defaultTitle: 'purecloud.ifcTitles.threadingTimelineUi',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.messagingAdmin.message', href: '#/admin' }],\n            menu: 'admin:MESSAGE'\n        }\n    },\n\n    smsNumberInventory: {\n        url: new URL('/messaging-admin-ui/#/sms-numbers', location).toString(),\n        timeMachineUrl: version => new URL(`/messaging-admin-ui/${version}/#/sms-numbers`, location).toString(),\n        assignedRoute: '/admin/messaging/sms-numbers',\n        defaultTitle: 'purecloud.ifcTitles.smsNumberInventory',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.messagingAdmin.message', href: '#/admin' }],\n            menu: 'admin:MESSAGE'\n        }\n    },\n\n    voiceNumberManagement: {\n        url: new URL('/gcv-apps/#/number-management', location).toString(),\n        timeMachineUrl: version => `/gcv-apps/${version}/#/number-management`,\n        assignedRoute: '/admin/telecom/numbers',\n        defaultTitle: 'purecloud.ifcTitles.numberManagementUi',\n        nav: {\n            breadcrumbs: [\n                { textKey: 'frameNav.genesysCloudVoice.genesysCloudVoice', href: '#/admin' },\n                {\n                    textKey: 'frameNav.genesysCloudVoice.numberManagement',\n                    href: '#/admin/telecom/numbers',\n                    active: true\n                }\n            ],\n            menu: 'admin:VOICE_CARRIER_SERVICES'\n        }\n    },\n\n    voiceNumberRedirection: {\n        url: new URL('/gcv-number-redirection/#/', location).toString(),\n        timeMachineUrl: version => `/gcv-number-redirection/${version}/#/`,\n        assignedRoute: '/admin/telecom/number-redirection',\n        defaultTitle: 'purecloud.ifcTitles.numberRedirectionUi',\n        featureToggle: {\n            key: 'PURE-5788_GCV_Disaster_Recovery'\n        },\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.genesysCloudVoice.numberRedirection' }],\n            menu: 'admin:VOICE_CARRIER_SERVICES'\n        }\n    },\n\n    voicePrefixBlocking: {\n        url: new URL('/gcv-prefix-blocking/#/', location).toString(),\n        timeMachineUrl: version => `/gcv-prefix-blocking/${version}/#/`,\n        assignedRoute: '/admin/telecom/prefix-blocking',\n        defaultTitle: 'purecloud.ifcTitles.prefixBlockingUi',\n        featureToggle: {\n            key: 'PURE-7224_Prefix'\n        },\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.genesysCloudVoice.prefixBlocking' }],\n            menu: 'admin:VOICE_CARRIER_SERVICES'\n        }\n    },\n\n    integrations: {\n        url: new URL('/integrations-admin-ui/#/integrations', location).toString(),\n        timeMachineUrl: version => `/integrations-admin-ui/${version}/#/integrations`,\n        assignedRoute: '/admin/integrations/apps',\n        defaultTitle: 'purecloud.ifcTitles.integrationsAdminUi',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.integrations'\n                }\n            ],\n            menu: 'admin:INTEGRATIONS'\n        }\n    },\n\n    integrationsActions: {\n        url: new URL('/actions-admin-ui/#/actions', location).toString(),\n        timeMachineUrl: version => `/actions-admin-ui/${version}/#/actions`,\n        assignedRoute: '/admin/integrations/actions',\n        defaultTitle: 'purecloud.ifcTitles.dataActionsUi',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.integrations'\n                }\n            ],\n            menu: 'admin:INTEGRATIONS'\n        }\n    },\n\n    messageRouting: {\n        url: new URL('/messaging-admin-ui/#/message-routing', location).toString(),\n        timeMachineUrl: version => new URL(`/messaging-admin-ui/${version}/#/message-routing`, location).toString(),\n        assignedRoute: '/admin/routing/sms',\n        defaultTitle: 'purecloud.ifcTitles.untitled',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.routing.routing' }],\n            menu: 'admin:ROUTING'\n        }\n    },\n\n    // Handle the double existing admin route. Also will handle when it goes to single admin route\n    oldAdminEmailDomains: {\n        url: new URL('/email-admin-ui/#/email-domains', location).toString(),\n        timeMachineUrl: version => new URL(`/email-admin-ui/${version}/#/email-domains`, location).toString(),\n        assignedRoute: '/admin/admin/organization/email/domains',\n        defaultTitle: 'purecloud.ifcTitles.untitled',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.contactCenter.contactCenter',\n                    href: '#/admin'\n                }\n            ],\n            menu: 'admin:CONTACT_CENTER'\n        }\n    },\n\n    adminEmailDomains: {\n        url: new URL('/email-admin-ui/#/email-domains', location).toString(),\n        timeMachineUrl: version => new URL(`/email-admin-ui/${version}/#/email-domains`, location).toString(),\n        assignedRoute: '/admin/organization/email/domains',\n        defaultTitle: 'purecloud.ifcTitles.untitled',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.contactCenter.contactCenter',\n                    href: '#/admin'\n                }\n            ],\n            menu: 'admin:CONTACT_CENTER'\n        }\n    },\n\n    responseManagementUI: {\n        url: new URL('/responseManagement/#/', location).toString(),\n        assignedRoute: '/admin/responseManagement',\n        defaultTitle: 'purecloud.ifcTitles.responseManagementUi',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.responseManagement.responses',\n                    href: '#/admin/responseManagement/responses',\n                    active: true\n                }\n            ],\n            menu: 'admin:directory/acdSkills'\n        }\n    },\n\n    auditViewerUI: {\n        url: new URL('/audit-viewer-ui/#/full-page-audit-viewer', location).toString(),\n        timeMachineUrl: version => `/audit-viewer-ui/${version}/#/full-page-audit-viewer`,\n        assignedRoute: '/admin/troubleshooting/auditviewer',\n        defaultTitle: 'purecloud.ifcTitles.auditViewerUi',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.troubleshooting', active: true }],\n            menu: 'admin:troubleshooting/auditviewer'\n        }\n    },\n\n    platformUsageUI: {\n        url: new URL('/usage-platform-ui/#/platformusage', location).toString(),\n        assignedRoute: '/admin/platformusage',\n        defaultTitle: 'purecloud.ifcTitles.platformUsageUi'\n    },\n\n    screenRecordingPlayback: {\n        url: new URL('/screen-recording-ui/#/interactions', location).toString(),\n        assignedRoute: '/quality/screenrecordings/interactions',\n        defaultTitle: 'purecloud.ifcTitles.screenRecordingPlayback'\n    },\n\n    authOrgsUI: {\n        url: new URL('/auth-orgs-ui/#/auth-orgs', location).toString(),\n        timeMachineUrl: version => `/auth-orgs-ui/${version}/#/auth-orgs`,\n        assignedRoute: '/admin/auth-orgs',\n        defaultTitle: 'purecloud.ifcTitles.authOrgsUi',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.peoplePermissions', active: true }],\n            menu: 'admin:PEOPLE_PERMISSIONS'\n        }\n    },\n\n    partnersUI: {\n        url: new URL('/auth-orgs-ui/#/partners', location).toString(),\n        timeMachineUrl: version => `/auth-orgs-ui/${version}/#/partners`,\n        assignedRoute: '/partners/ui',\n        defaultTitle: 'purecloud.ifcTitles.untitled',\n        nav: {\n            breadcrumbs: []\n        }\n    },\n\n    agentUIPanelSettings: {\n        url: new URL('/agent-ui-settings-v2/#/', location).toString(),\n        timeMachineUrl: version => `/agent-ui-settings-v2/${version}/#/`,\n        assignedRoute: '/admin/contact-center/panel-settings',\n        defaultTitle: 'purecloud.ifcTitles.agentUiPanelSettings',\n        nav: {\n            breadcrumbs: [\n                { textKey: 'frameNav.contactCenter.contactCenter', href: '#/admin' },\n                { textKey: 'frameNav.contactCenter.panelManager', active: true }\n            ],\n            menu: 'admin:contact-center/panel-settings'\n        }\n    },\n\n    agentUIConversationCustomAttributes: {\n        url: new URL('/agent-ui-settings-v2/#/conversation-schemas', location).toString(),\n        timeMachineUrl: version => `/agent-ui-settings-v2/${version}/#/conversation-schemas`,\n        assignedRoute: '/admin/conversation-schemas',\n        defaultTitle: 'purecloud.ifcTitles.untitled',\n        nav: {\n            breadcrumbs: [\n                { textKey: 'frameNav.architect.architect', href: '#/admin' },\n                { textKey: 'frameNav.architect.conversationSchemas', href: '#/admin/conversation-schemas' }\n            ],\n            menu: 'admin:ARCHITECT'\n        },\n        featureToggle: {\n            key: 'PURE-5564_CCA',\n            redirect: 'admin'\n        }\n    },\n\n    agentUiQueueActivation: {\n        url: new URL('/agent-ui-settings-v2/#/queue-activation', location).toString(),\n        timeMachineUrl: version => `/agent-ui-settings-v2/${version}/#/queue-activation`,\n        assignedRoute: '/queues/activate/me',\n        defaultTitle: 'purecloud.ifcTitles.analyticsUi',\n        featureToggle: {\n            key: 'ACT-2139_queue-activation-page-agent-ui-settings',\n            redirect: '/analytics/queues/activate/me'\n        }\n    },\n\n    agentUIQueueList: {\n        url: new URL('/agent-ui-settings-v2/#/queue-list', location).toString(),\n        timeMachineUrl: version => `/agent-ui-settings-v2/${version}/#/queue-list`,\n        assignedRoute: '/admin/admin/organization/_queuesV2',\n        defaultTitle: 'purecloud.ifcTitles.agentUiQueues',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.contactCenter.contactCenter',\n                    href: '#/admin'\n                },\n                {\n                    textKey: 'frameNav.contactCenter.queues',\n                    href: '#/admin/admin/organization/_queuesV2'\n                }\n            ],\n            menu: 'admin:contact-center/utilization'\n        }\n    },\n\n    agentUIQueueDetailsV2: {\n        url: new URL('/agent-ui-settings-v2/#/queue', location).toString(),\n        timeMachineUrl: version => {\n            const match = window.location.hash.match(\n                /([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})(\\/.*)?/i\n            );\n            const queueId = match ? match[1] : '';\n            const pagePath = match && match[2] ? match[2] : '/general';\n            return `/agent-ui-settings-v2/${version}/#/queue/${queueId}${pagePath}`;\n        },\n        assignedRoute: '/admin/organization/queues',\n        defaultTitle: 'purecloud.ifcTitles.agentUiQueueDetailsV2',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.responseManagement.contactCenter',\n                    href: '#/admin'\n                },\n                {\n                    textKey: 'frameNav.contactCenter.queues',\n                    href: '#/admin/admin/organization/_queuesV2'\n                }\n            ],\n            menu: 'admin:admin/organization/_queuesV2'\n        }\n    },\n\n    predictiveRoutingUiCustomKpis: {\n        url: new URL('/predictive-routing-ui/#/predictive-routing/custom-kpis', location).toString(),\n        timeMachineUrl: version => `/predictive-routing-ui/${version}/#/predictive-routing/custom-kpis`,\n        assignedRoute: '/admin/predictive-routing/custom-kpis',\n        defaultTitle: 'purecloud.ifcTitles.customKpis',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.predictiveRouting.predictiveRouting',\n                    href: '#/admin'\n                },\n                {\n                    textKey: 'frameNav.predictiveRouting.customKpis',\n                    href: '#/admin/predictive-routing/custom-kpis'\n                }\n            ],\n            menu: 'admin:PREDICTIVE_ROUTING'\n        },\n        featureToggle: {\n            key: '(gpr.AP-8265.showCustomKpiLink AND NOT (AI-1435_CustomRevenueKpis))',\n            redirect: 'admin',\n            makeRedirectArgs: makeAdminRedirectArgs\n        }\n    },\n\n    predictiveRoutingUiRevenueKpis: {\n        url: new URL('/predictive-routing-ui/#/predictive-routing/revenue-kpis', location).toString(),\n        timeMachineUrl: version => `/predictive-routing-ui/${version}/#/predictive-routing/revenue-kpis`,\n        assignedRoute: '/admin/predictive-routing/revenue-kpis',\n        defaultTitle: 'purecloud.ifcTitles.revenueKpis',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.predictiveRouting.predictiveRouting',\n                    href: '#/admin'\n                },\n                {\n                    textKey: 'frameNav.predictiveRouting.revenueKpis',\n                    href: '#/admin/predictive-routing/revenue-kpis'\n                }\n            ],\n            menu: 'admin:PREDICTIVE_ROUTING'\n        },\n        featureToggle: {\n            key: '(gpr.AP-8265.showCustomKpiLink AND AI-1435_CustomRevenueKpis)',\n            redirect: 'admin',\n            makeRedirectArgs: makeAdminRedirectArgs\n        }\n    },\n\n    agentUIUtilizationV2: {\n        url: new URL('/agent-ui-settings-v2/#/utilization', location).toString(),\n        timeMachineUrl: version => `/agent-ui-settings-v2/${version}/#/utilization`,\n        assignedRoute: '/admin/contact-center/utilization',\n        defaultTitle: 'purecloud.ifcTitles.agentUiUtilizationV2',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.responseManagement.contactCenter',\n                    href: '#/admin'\n                },\n                { textKey: 'frameNav.contactCenter.utilization', active: true }\n            ],\n            menu: 'admin:contact-center/utilization'\n        }\n    },\n\n    agentUIWrapupCodesv2: {\n        url: new URL('/agent-ui-settings-v2/#/wrapup-codes', location).toString(),\n        timeMachineUrl: version => `/agent-ui-settings-v2/${version}/#/wrapup-codes`,\n        assignedRoute: '/admin/admin/organization/_wrapupCodesV2',\n        defaultTitle: 'purecloud.ifcTitles.agentUiWrapupCodesV2',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.responseManagement.contactCenter',\n                    href: '#/admin'\n                },\n                { textKey: 'frameNav.contactCenter.wrapupCodes', active: true }\n            ],\n            menu: 'admin:admin/organization/_wrapupCodesV2'\n        }\n    },\n\n    agentUIAcdSkillsv2: {\n        url: new URL('/agent-ui-settings-v2/#/acd-skills', location).toString(),\n        timeMachineUrl: version => `/agent-ui-settings-v2/${version}/#/acd-skills`,\n        assignedRoute: '/admin/directory/acdSkills',\n        defaultTitle: 'purecloud.ifcTitles.agentUiAcdSkillsV2',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.responseManagement.contactCenter',\n                    href: '#/admin'\n                },\n                { textKey: 'frameNav.contactCenter.acdSkills', active: true }\n            ],\n            menu: 'admin:directory/acdSkills'\n        }\n    },\n\n    agentAssistAdminUi: {\n        url: new URL('/agent-assist-admin-ui/#/', location).toString(),\n        timeMachineUrl: version => `/agent-assist-admin-ui/${version}/#/`,\n        assignedRoute: '/admin/assistants',\n        defaultTitle: 'purecloud.ifcTitles.agentAssistAdminUi',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.contactCenter.contactCenter',\n                    href: '#/admin'\n                },\n                {\n                    textKey: 'frameNav.contactCenter.assistants',\n                    href: '#/admin/assistants/list'\n                }\n            ],\n            menu: 'admin:assistants/list'\n        }\n    },\n\n    agentCopilotAdminUi: {\n        url: new URL('/copilot-admin-ui/#/', location).toString(),\n        timeMachineUrl: version => `/copilot-admin-ui/${version}/#/`,\n        assignedRoute: '/admin/copilots',\n        defaultTitle: 'purecloud.ifcTitles.agentCopilotsAdminUi',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.contactCenter.contactCenter',\n                    href: '#/admin'\n                },\n                {\n                    textKey: 'frameNav.contactCenter.copilots',\n                    href: '#/admin/copilots'\n                }\n            ],\n            menu: 'admin:copilots'\n        }\n    },\n\n    agenticVaUi: {\n        url: new URL('/agentic-va-ui/#/', location).toString(),\n        timeMachineUrl: version => `/agentic-va-ui/${version}/#/`,\n        assignedRoute: '/admin/ai-studio/agentic-virtual-agents',\n        defaultTitle: 'purecloud.ifcTitles.agenticVirtualAgentsUi',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.aiStudio.aiStudio',\n                    href: '#/admin'\n                },\n                {\n                    textKey: 'frameNav.aiStudio.agenticVirtualAgents',\n                    href: '#/admin/ai-studio/agentic-virtual-agents'\n                }\n            ],\n            menu: 'admin:ai-studio/agentic-virtual-agents'\n        },\n        featureToggle: {\n            key: 'AI-1365_agentic_virtual_agents',\n            redirect: 'admin'\n        }\n    },\n\n    copilotConfigUi: {\n        url: new URL('/copilot-config-ui/#/', location).toString(),\n        timeMachineUrl: version => {\n            if (version === 'local') {\n                return new URL('https://localhost:1111/copilot-config-ui/#/');\n            } else {\n                return `/copilot-config-ui/${version}/#/`;\n            }\n        },\n        assignedRoute: '/admin/ai-studio/copilot-configuration',\n        defaultTitle: 'purecloud.ifcTitles.copilotConfiguration',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.aiStudio.aiStudio',\n                    href: '#/admin'\n                },\n                {\n                    textKey: 'frameNav.aiStudio.copilotConfiguration',\n                    href: '#/admin/ai-studio/copilot-configuration'\n                }\n            ],\n            menu: 'admin:ai-studio/copilot-configuration'\n        },\n        featureToggle: {\n            key: 'AI-1390_Copilot_Configuration',\n            redirect: 'admin'\n        }\n    },\n\n    guideBuilderUi: {\n        url: new URL('/guide-builder-ui/#/', location).toString(),\n        timeMachineUrl: version => `/guide-builder-ui/${version}/#/`,\n        assignedRoute: '/admin/ai-studio/guides',\n        defaultTitle: 'purecloud.ifcTitles.guideBuilderUi',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.aiStudio.aiStudio',\n                    href: '#/admin'\n                },\n                {\n                    textKey: 'frameNav.aiStudio.guides',\n                    href: '#/admin/ai-studio/guides'\n                }\n            ],\n            menu: 'admin:ai-studio/guides'\n        },\n        featureToggle: {\n            key: 'AI-1206_guides_for_va',\n            redirect: 'admin'\n        }\n    },\n\n    summaryWorkbench: {\n        url: new URL('/summary-workbench/#/', location).toString(),\n        timeMachineUrl: version => `/summary-workbench/${version}/#/`,\n        assignedRoute: '/admin/ai-studio/summary-workbench',\n        defaultTitle: 'purecloud.ifcTitles.summaries',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.aiStudio.aiStudio',\n                    href: '#/admin'\n                },\n                {\n                    textKey: 'frameNav.aiStudio.summaryWorkbench',\n                    href: '#/admin/ai-studio/summary-workbench'\n                }\n            ],\n            menu: 'admin:ai-studio/summary-workbench'\n        },\n        featureToggle: {\n            key: 'AI-1199_summary_workbench',\n            redirect: 'admin'\n        }\n    },\n\n    refineResponse: {\n        url: new URL('/refine-response-admin/#/', location).toString(),\n        timeMachineUrl: version => `/refine-response-admin/${version}/#/`,\n        assignedRoute: '/admin/ai-studio/refine-response',\n        defaultTitle: 'purecloud.ifcTitles.refineResponse',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.aiStudio.aiStudio',\n                    href: '#/admin'\n                },\n                {\n                    textKey: 'frameNav.aiStudio.refineResponse',\n                    href: '#/admin/ai-studio/refine-response'\n                }\n            ],\n            menu: 'admin:ai-studio/refine-response'\n        },\n        featureToggle: {\n            key: 'AI-1402_email_refinement_with_ai',\n            redirect: 'admin'\n        }\n    },\n\n    logCaptureUI: {\n        url: new URL('/troubleshooting-ui/#/log-capture', location).toString(),\n        timeMachineUrl: version => `/troubleshooting-ui/${version}/#/log-capture`,\n        assignedRoute: '/admin/troubleshooting/logcapture',\n        defaultTitle: 'purecloud.ifcTitles.logCaptureUi',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.troubleshooting', active: true }],\n            menu: 'admin:troubleshooting/auditviewer'\n        }\n    },\n\n    operationalConsoleUI: {\n        url: new URL('/troubleshooting-ui/#/operational-console', location).toString(),\n        timeMachineUrl: version => `/troubleshooting-ui/${version}/#/operational-console`,\n        assignedRoute: '/admin/troubleshooting/operational-console',\n        defaultTitle: 'purecloud.ifcTitles.operationalConsoleUi',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.troubleshooting', active: true }],\n            menu: 'admin:troubleshooting/auditviewer'\n        }\n    },\n\n    multiOrgOverviewUI: {\n        url: new URL('/mrmo-ui/#/', location).toString(),\n        timeMachineUrl: version => {\n            if (version === 'local') {\n                return 'http://localhost:5173/mrmo-ui/#/';\n            } else {\n                return `/mrmo-ui/${version}/#/`;\n            }\n        },\n        assignedRoute: '/admin/multi-org-management',\n        defaultTitle: 'purecloud.ifcTitles.multiOrgManagement',\n        featureToggle: {\n            key: 'PURE-6270_failover_conductor OR PURE-6225_mrmo_replication'\n        },\n        nav: {\n            breadcrumbs: [],\n            menu: 'admin:ACCOUNT_SETTINGS'\n        }\n    },\n\n    orgPairingUI: {\n        url: new URL('/mrmo-ui/#/org-pairing', location).toString(),\n        timeMachineUrl: version => {\n            if (version === 'local') {\n                return 'http://localhost:5173/mrmo-ui/#/org-pairing';\n            } else {\n                return `/mrmo-ui/${version}/#/pairing`;\n            }\n        },\n        assignedRoute: '/admin/multi-org-management/org-pairing',\n        defaultTitle: 'purecloud.ifcTitles.orgPairing',\n        featureToggle: {\n            key: 'PURE-6270_failover_conductor OR PURE-6225_mrmo_replication'\n        },\n        nav: {\n            breadcrumbs: [],\n            menu: 'admin:ACCOUNT_SETTINGS'\n        }\n    },\n\n    replicationUI: {\n        url: new URL('/mrmo-ui/#/replication', location).toString(),\n        timeMachineUrl: version => {\n            if (version === 'local') {\n                return 'http://localhost:5173/mrmo-ui/#/replication';\n            } else {\n                return `/mrmo-ui/${version}/#/replication`;\n            }\n        },\n        assignedRoute: '/admin/multi-org-management/replication',\n        defaultTitle: 'purecloud.ifcTitles.replication',\n        featureToggle: {\n            key: 'PURE-6225_mrmo_replication'\n        },\n        nav: {\n            breadcrumbs: [],\n            menu: 'admin:ACCOUNT_SETTINGS'\n        }\n    },\n\n    userSwitchingUI: {\n        url: new URL('/mrmo-ui/#/user-switching', location).toString(),\n        timeMachineUrl: version => {\n            if (version === 'local') {\n                return 'http://localhost:5173/mrmo-ui/#/user-switching';\n            } else {\n                return `/mrmo-ui/${version}/#/user-switching`;\n            }\n        },\n        assignedRoute: '/admin/multi-org-management/user-switching',\n        defaultTitle: 'purecloud.ifcTitles.userSwitchingConfiguration',\n        featureToggle: {\n            key: 'PURE-6270_failover_conductor'\n        },\n        nav: {\n            breadcrumbs: [],\n            menu: 'admin:ACCOUNT_SETTINGS'\n        }\n    },\n\n    knowledgeWorkbenchArticleUI: {\n        url: new URL('/knowledge-workbench/#/knowledgeBases/articles', location).toString(),\n        timeMachineUrl: version => `/knowledge-workbench/${version}/#/knowledgeBases/articles`,\n        assignedRoute: '/admin/knowledge/knowledgeBases/articles',\n        defaultTitle: 'purecloud.ifcTitles.knowledgeWorkbenchArticleUi',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.knowledgeWorkbench.knowledge'\n                },\n                {\n                    textKey: 'frameNav.knowledgeWorkbench.articles',\n                    href: '#/admin/knowledge/knowledgeBases/articles'\n                }\n            ],\n            menu: 'admin:knowledge/knowledgeBases/articles'\n        }\n    },\n\n    knowledgeWorkbenchCategoryUI: {\n        url: new URL('/knowledge-workbench/#/knowledgeBases/categories', location).toString(),\n        timeMachineUrl: version => `/knowledge-workbench/${version}/#/knowledgeBases/categories`,\n        assignedRoute: '/admin/knowledge/knowledgeBases/categories',\n        defaultTitle: 'purecloud.ifcTitles.knowledgeWorkbenchCategoryUi',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.knowledgeWorkbench.knowledge'\n                },\n                {\n                    textKey: 'frameNav.knowledgeWorkbench.categories',\n                    href: '#/admin/knowledge/knowledgeBases/categories'\n                }\n            ],\n            menu: 'admin:knowledge/knowledgeBases/categories'\n        }\n    },\n\n    knowledgeWorkbenchSourcesUI: {\n        url: new URL('/knowledge-workbench/#/knowledgeBases/sources', location).toString(),\n        timeMachineUrl: version => `/knowledge-workbench/${version}/#/knowledgeBases/sources`,\n        assignedRoute: '/admin/knowledge/knowledgeBases/sources',\n        defaultTitle: 'purecloud.ifcTitles.knowledgeWorkbenchSourcesUi',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.knowledgeWorkbench.knowledge'\n                },\n                {\n                    textKey: 'frameNav.knowledgeWorkbench.sources',\n                    href: '#/admin/knowledge/knowledgeBases/sources'\n                }\n            ],\n            menu: 'admin:knowledge/knowledgeBases/sources'\n        }\n    },\n\n    knowledgeWorkbenchActivityUI: {\n        url: new URL('/knowledge-workbench/#/knowledgeBases/activity', location).toString(),\n        timeMachineUrl: version => `/knowledge-workbench/${version}/#/knowledgeBases/activity`,\n        assignedRoute: '/admin/knowledge/knowledgeBases/activity',\n        defaultTitle: 'purecloud.ifcTitles.knowledgeWorkbenchActivityUi',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.knowledgeWorkbench.knowledge'\n                },\n                {\n                    textKey: 'frameNav.knowledgeWorkbench.activity',\n                    href: '#/admin/knowledge/knowledgeBases/activity'\n                }\n            ],\n            menu: 'admin:knowledge/knowledgeBases/activity'\n        }\n    },\n\n    knowledgeConfigurationUI: {\n        url: new URL('/knowledge-workbench/#/knowledgeConfiguration/configurations', location).toString(),\n        timeMachineUrl: version => `/knowledge-workbench/${version}/#/knowledgeConfiguration/configurations`,\n        assignedRoute: '/admin/knowledge/knowledgeConfiguration/configurations',\n        defaultTitle: 'purecloud.ifcTitles.knowledgeConfigurationUi',\n        featureToggle: { key: 'NOT GKC-26947_disable-knowledge-v3-for-EUSC' },\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.knowledgeWorkbench.knowledge'\n                },\n                {\n                    textKey: 'frameNav.knowledgeWorkbench.configuration',\n                    href: '#/admin/knowledge/knowledgeConfiguration/configurations'\n                }\n            ],\n            menu: 'admin:knowledge/knowledgeConfiguration/configurations'\n        }\n    },\n\n    knowledgeFabricContentUI: {\n        url: new URL('/knowledge-workbench/#/knowledgeConfiguration/content', location).toString(),\n        timeMachineUrl: version => `/knowledge-workbench/${version}/#/knowledgeConfiguration/content`,\n        assignedRoute: '/admin/knowledge/knowledgeConfiguration/content',\n        defaultTitle: 'purecloud.ifcTitles.knowledgeFabricContentUi',\n        featureToggle: { key: 'AI-1469_source-file-listing AND (NOT GKC-26947_disable-knowledge-v3-for-EUSC)' },\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.knowledgeWorkbench.knowledge'\n                },\n                {\n                    textKey: 'frameNav.knowledgeWorkbench.fabricContent',\n                    href: '#/admin/knowledge/knowledgeConfiguration/content'\n                }\n            ],\n            menu: 'admin:knowledge/knowledgeConfiguration/content'\n        }\n    },\n\n    knowledgeOptimizerUI: {\n        url: new URL('/knowledge-optimizer/#/knowledge/optimizer/', location).toString(),\n        timeMachineUrl: version => `/knowledge-optimizer/${version}/#/knowledge/optimizer/`,\n        assignedRoute: '/admin/knowledge/optimizer',\n        defaultTitle: 'purecloud.ifcTitles.knowledgeOptimizerUi',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.knowledgeOptimizer.knowledge'\n                },\n                {\n                    textKey: 'frameNav.knowledgeOptimizer.optimizer'\n                }\n            ],\n            menu: 'admin:knowledge/optimizer'\n        }\n    },\n\n    architectComponentsUIOutcome: {\n        url: new URL('/architect-components/#/flowoutcomes/', location).toString(),\n        timeMachineUrl: version => `/architect-components/${version}/#/flowoutcomes/`,\n        assignedRoute: '/admin/routing/flowoutcomes',\n        defaultTitle: 'purecloud.ifcTitles.flowOutcome',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.architect.architect',\n                    href: '#/admin'\n                },\n                {\n                    textKey: 'frameNav.architect.flowOutcomes',\n                    href: '#/admin/routing/flowoutcomes'\n                }\n            ],\n            menu: 'admin:routing/flowoutcomes'\n        }\n    },\n    architectComponentsUIMilestone: {\n        url: new URL('/architect-components/#/flowmilestones/', location).toString(),\n        timeMachineUrl: version => `/architect-components/${version}/#/flowmilestones/`,\n        assignedRoute: '/admin/routing/flowmilestones',\n        defaultTitle: 'purecloud.ifcTitles.flowMilestone',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.architect.architect',\n                    href: '#/admin'\n                },\n                {\n                    textKey: 'frameNav.architect.flowMilestones',\n                    href: '#/admin/routing/flowmilestones'\n                }\n            ],\n            menu: 'admin:routing/flowmilestones'\n        }\n    },\n    architectComponentsUIDataTable: {\n        url: new URL('/architect-components/#/datatables/', location).toString(),\n        timeMachineUrl: version => `/architect-components/${version}/#/datatables/`,\n        assignedRoute: '/admin/routing/datatables',\n        defaultTitle: 'purecloud.ifcTitles.dataTable',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.architect.architect',\n                    href: '#/admin'\n                },\n                {\n                    textKey: 'frameNav.architect.dataTables',\n                    href: '#/admin/routing/datatables'\n                }\n            ],\n            menu: 'admin:routing/datatables'\n        }\n    },\n    triggersUI: {\n        url: new URL('/triggers-ui/#/', location).toString(),\n        timeMachineUrl: version => new URL(`/triggers-ui/${version}/#/`, location).toString(),\n        assignedRoute: '/admin/triggers',\n        defaultTitle: 'purecloud.ifcTitles.triggers',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.architect.architect',\n                    href: '#/admin'\n                },\n                {\n                    textKey: 'frameNav.architect.triggers',\n                    href: '#/admin/triggers'\n                }\n            ],\n            menu: 'admin:triggers'\n        }\n    },\n\n    billingUI: {\n        url: new URL('/billing-v2/#/', location).toString(),\n        timeMachineUrl: version => `/billing-v2/${version}/#/`,\n        assignedRoute: '/admin/billing',\n        defaultTitle: 'purecloud.ifcTitles.untitled'\n    },\n\n    contactsAndOrganizationsUI: {\n        url: new URL('/contacts-and-organizations-ui/#/', location).toString(),\n        timeMachineUrl: version => {\n            if (version === 'local') {\n                return new URL('https://localhost:4450/contacts-and-organizations-ui/#/');\n            } else {\n                return `/contacts-and-organizations-ui/${version}/#/`;\n            }\n        },\n        assignedRoute: '/contactsAndOrganizations',\n        defaultTitle: 'purecloud.ifcTitles.contactsAndOrganizations'\n    },\n\n    iamAdminPeoplePermissions: {\n        url: new URL('/iam-admin/#/', location).toString(),\n        timeMachineUrl: version => `/iam-admin/${version}/#/`,\n        assignedRoute: '/admin/people-permissions',\n        defaultTitle: 'purecloud.ifcTitles.untitled',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.peoplePermissions'\n                }\n            ],\n            menu: 'admin:PEOPLE_PERMISSIONS'\n        }\n    },\n\n    iamAdminAccessManagement: {\n        url: new URL('/iam-admin/#/', location).toString(),\n        timeMachineUrl: version => `/iam-admin/${version}/#/`,\n        assignedRoute: '/admin/access-management',\n        defaultTitle: 'purecloud.ifcTitles.untitled',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.integrations'\n                }\n            ],\n            menu: 'admin:INTEGRATIONS'\n        }\n    },\n\n    iamAdminIdentity: {\n        url: new URL('/iam-admin/#/', location).toString(),\n        timeMachineUrl: version => `/iam-admin/${version}/#/`,\n        assignedRoute: '/admin/identity',\n        defaultTitle: 'purecloud.ifcTitles.untitled',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.integrations'\n                }\n            ],\n            menu: 'admin:INTEGRATIONS'\n        }\n    },\n\n    iamUserSecurity: {\n        url: new URL('/iam-admin/#/security', location).toString(),\n        timeMachineUrl: version => `/iam-admin/${version}/#/security`,\n        assignedRoute: '/security',\n        defaultTitle: 'purecloud.ifcTitles.untitled'\n    },\n\n    telephonyAdminOperatingSchedules: {\n        url: new URL(`${telephonyAdminUri}/routing/scheduling`, location).toString(),\n        timeMachineUrl: version =>\n            new URL(getTelephonyAdminTimeMachineUri(version, '/routing/scheduling'), location).toString(),\n        assignedRoute: '/admin/routing/scheduling',\n        defaultTitle: 'purecloud.ifcTitles.telephonyAdminOperatingSchedules',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.routing.routing' }, { textKey: 'frameNav.routing.operatingSchedules' }],\n            menu: 'admin:ROUTING'\n        }\n    },\n\n    telephonyAdminCallRouting: {\n        url: new URL(`${telephonyAdminUri}/routing/ivrs`, location).toString(),\n        timeMachineUrl: version =>\n            new URL(getTelephonyAdminTimeMachineUri(version, '/routing/ivrs'), location).toString(),\n        assignedRoute: '/admin/routing/ivrs',\n        defaultTitle: 'purecloud.ifcTitles.telephonyAdminCallRouting',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.routing.routing' }, { textKey: 'frameNav.routing.ivrs' }],\n            menu: 'admin:ROUTING'\n        }\n    },\n\n    telephonyAdminEmergencyGroups: {\n        url: new URL(`${telephonyAdminUri}/routing/emergency-groups`, location).toString(),\n        timeMachineUrl: version =>\n            new URL(getTelephonyAdminTimeMachineUri(version, '/routing/emergency-groups'), location).toString(),\n        assignedRoute: '/admin/routing/emergency-groups',\n        defaultTitle: 'purecloud.ifcTitles.telephonyAdminEmergencyGroups',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.routing.routing' }, { textKey: 'frameNav.routing.emergencyGroups' }],\n            menu: 'admin:ROUTING'\n        }\n    },\n\n    telephonyAdminTopology: {\n        url: new URL(`${telephonyAdminKoUri}telephonyAdmin/topology`, location).toString(),\n        timeMachineUrl: version =>\n            new URL(getTelephonyAdminTimeMachineUri(version, 'telephonyAdmin/topology', true), location).toString(),\n        assignedRoute: '/admin/telephony/topology',\n        defaultTitle: 'purecloud.ifcTitles.telephonyAdminTopology',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.telephony.telephony' }, { textKey: 'frameNav.telephony.topology' }],\n            menu: 'admin:TELEPHONY'\n        }\n    },\n\n    telephonyAdminMetrics: {\n        url: new URL(`${telephonyAdminUri}/telephony/metrics`, location).toString(),\n        timeMachineUrl: version =>\n            new URL(getTelephonyAdminTimeMachineUri(version, '/telephony/metrics'), location).toString(),\n        assignedRoute: '/admin/telephony/metrics',\n        defaultTitle: 'purecloud.ifcTitles.telephonyAdminMetrics',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.telephony.telephony' }, { textKey: 'frameNav.telephony.metrics' }],\n            menu: 'admin:TELEPHONY'\n        },\n        featureToggle: { key: 'PURE-5705_CloudTrunkStatusAndMetrics' }\n    },\n\n    telephonyAdminMetricsKo: {\n        url: new URL(`${telephonyAdminKoUri}telephonyAdmin/metrics`, location).toString(),\n        timeMachineUrl: version =>\n            new URL(getTelephonyAdminTimeMachineUri(version, 'telephonyAdmin/metrics', true), location).toString(),\n        assignedRoute: '/admin/telephony/metrics',\n        defaultTitle: 'purecloud.ifcTitles.telephonyAdminMetrics',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.telephony.telephony' }, { textKey: 'frameNav.telephony.metrics' }],\n            menu: 'admin:TELEPHONY'\n        },\n        featureToggle: { key: 'NOT PURE-5705_CloudTrunkStatusAndMetrics' }\n    },\n\n    telephonyAdminTrunks: {\n        url: new URL(`${telephonyAdminKoUri}telephonyAdmin/trunks`, location).toString(),\n        timeMachineUrl: version =>\n            new URL(getTelephonyAdminTimeMachineUri(version, 'telephonyAdmin/trunks', true), location).toString(),\n        assignedRoute: '/admin/telephony/trunks',\n        defaultTitle: 'purecloud.ifcTitles.telephonyAdminTrunks',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.telephony.telephony' }, { textKey: 'frameNav.telephony.trunks' }],\n            menu: 'admin:TELEPHONY'\n        }\n    },\n\n    telephonyAdminSites: {\n        url: new URL(`${telephonyAdminKoUri}telephonyAdmin/sites`, location).toString(),\n        timeMachineUrl: version =>\n            new URL(getTelephonyAdminTimeMachineUri(version, 'telephonyAdmin/sites', true), location).toString(),\n        assignedRoute: '/admin/telephony/sites',\n        defaultTitle: 'purecloud.ifcTitles.telephonyAdminSites',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.telephony.telephony' }, { textKey: 'frameNav.telephony.sites' }],\n            menu: 'admin:TELEPHONY'\n        }\n    },\n\n    telephonyAdminEdgeGroups: {\n        url: new URL(`${telephonyAdminKoUri}telephonyAdmin/edgeGroups`, location).toString(),\n        timeMachineUrl: version =>\n            new URL(getTelephonyAdminTimeMachineUri(version, 'telephonyAdmin/edgeGroups', true), location).toString(),\n        assignedRoute: '/admin/telephony/edge-groups',\n        defaultTitle: 'purecloud.ifcTitles.telephonyAdminEdgeGroups',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.telephony.telephony' }, { textKey: 'frameNav.telephony.edgeGroups' }],\n            menu: 'admin:TELEPHONY'\n        }\n    },\n\n    telephonyAdminPremisesEdges: {\n        url: new URL(`${telephonyAdminKoUri}telephonyAdmin/edges`, location).toString(),\n        timeMachineUrl: version =>\n            new URL(getTelephonyAdminTimeMachineUri(version, 'telephonyAdmin/edges', true), location).toString(),\n        assignedRoute: '/admin/telephony/edges',\n        defaultTitle: 'purecloud.ifcTitles.telephonyAdminPremisesEdges',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.telephony.telephony' }, { textKey: 'frameNav.telephony.premisesEdges' }],\n            menu: 'admin:TELEPHONY'\n        }\n    },\n\n    telephonyAdminCloudMedia: {\n        url: new URL(`${telephonyAdminUri}/telephony/cloud-media`, location).toString(),\n        timeMachineUrl: version =>\n            new URL(getTelephonyAdminTimeMachineUri(version, '/telephony/cloud-media'), location).toString(),\n        assignedRoute: '/admin/telephony/cloud-media',\n        defaultTitle: 'purecloud.ifcTitles.telephonyAdminCloudMedia',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.telephony.telephony' }, { textKey: 'frameNav.telephony.cloudMedia' }],\n            menu: 'admin:TELEPHONY'\n        }\n    },\n\n    telephonyAdminPhoneManagement: {\n        url: new URL(`${telephonyAdminKoUri}telephonyAdmin/phoneManagement`, location).toString(),\n        timeMachineUrl: version =>\n            new URL(\n                getTelephonyAdminTimeMachineUri(version, 'telephonyAdmin/phoneManagement', true),\n                location\n            ).toString(),\n        assignedRoute: '/admin/telephony/phone-management',\n        defaultTitle: 'purecloud.ifcTitles.telephonyAdminPhoneManagement',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.telephony.telephony'\n                },\n                {\n                    textKey: 'frameNav.telephony.phoneManagement'\n                }\n            ],\n            menu: 'admin:TELEPHONY'\n        }\n    },\n\n    telephonyAdminCertificateAuthorities: {\n        url: new URL(`${telephonyAdminKoUri}telephonyAdmin/authorizedServices`, location).toString(),\n        timeMachineUrl: version =>\n            new URL(\n                getTelephonyAdminTimeMachineUri(version, 'telephonyAdmin/authorizedServices', true),\n                location\n            ).toString(),\n        assignedRoute: '/admin/telephony/certificate-authorities',\n        defaultTitle: 'purecloud.ifcTitles.telephonyAdminCertificateAuthorities',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.telephony.telephony'\n                },\n                {\n                    textKey: 'frameNav.telephony.certificateAuthorities'\n                }\n            ],\n            menu: 'admin:TELEPHONY'\n        }\n    },\n\n    telephonyAdminExtensions: {\n        url: new URL(`${telephonyAdminUri}/telephony/extensions`, location).toString(),\n        timeMachineUrl: version =>\n            new URL(getTelephonyAdminTimeMachineUri(version, '/telephony/extensions'), location).toString(),\n        assignedRoute: '/admin/telephony/extensions',\n        defaultTitle: 'purecloud.ifcTitles.telephonyAdminExtensions',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.telephony.telephony' }, { textKey: 'frameNav.telephony.extensions' }],\n            menu: 'admin:TELEPHONY'\n        }\n    },\n\n    telephonyAdminDIDNumbers: {\n        url: new URL(`${telephonyAdminUri}/telephony/did`, location).toString(),\n        timeMachineUrl: version =>\n            new URL(getTelephonyAdminTimeMachineUri(version, '/telephony/did'), location).toString(),\n        assignedRoute: '/admin/telephony/did',\n        defaultTitle: 'purecloud.ifcTitles.telephonyAdminDIDNumbers',\n        nav: {\n            breadcrumbs: [\n                { textKey: 'frameNav.telephony.telephony' },\n                { textKey: 'frameNav.telephony.directInwardDialing' }\n            ],\n            menu: 'admin:TELEPHONY'\n        },\n        featureToggle: {\n            key: 'PURE-3796_DIDGroups'\n        }\n    },\n    telephonyAdminSettings: {\n        url: new URL(`${telephonyAdminUri}/telephony/settings`, location).toString(),\n        timeMachineUrl: version =>\n            new URL(getTelephonyAdminTimeMachineUri(version, '/telephony/settings'), location).toString(),\n        assignedRoute: '/admin/telephony/settings',\n        defaultTitle: 'purecloud.ifcTitles.telephonyAdminSettings',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.telephony.telephony' }, { textKey: 'frameNav.telephony.settings' }],\n            menu: 'admin:TELEPHONY'\n        }\n    },\n\n    telephonyAdminCallerIdGroups: {\n        url: new URL(`${telephonyAdminUri}/telephony/caller-id-groups`, location).toString(),\n        timeMachineUrl: version =>\n            new URL(getTelephonyAdminTimeMachineUri(version, '/telephony/caller-id-groups'), location).toString(),\n        assignedRoute: '/admin/telephony/caller-id-groups',\n        defaultTitle: 'purecloud.ifcTitles.callerIdGroups',\n        featureToggle: { key: 'PURE-3963_caller_id_groups' },\n        nav: {\n            breadcrumbs: [\n                { textKey: 'frameNav.telephony.telephony' },\n                { textKey: 'frameNav.telephony.callerIdGroups' }\n            ],\n            menu: 'admin:TELEPHONY'\n        }\n    },\n\n    nerCustomEntitesUI: {\n        url: new URL('/ner-custom-entities-ui/#/', location).toString(),\n        timeMachineUrl: version => `/ner-custom-entities-ui/${version}/#/`,\n        assignedRoute: '/admin/dataprivacy/maskingrules',\n        defaultTitle: 'purecloud.ifcTitles.digitalDataFilteringRules',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.accountSettings.accountSettings'\n                },\n                {\n                    textKey: 'frameNav.accountSettings.nerCustomUI'\n                }\n            ],\n            menu: 'admin:ACCOUNT_SETTINGS'\n        }\n    },\n    workAutomationWorkbins: {\n        url: new URL('/task-management-workbins/#/workbins', location).toString(),\n        timeMachineUrl: version => `/task-management-workbins/${version}/#/workbins`,\n        assignedRoute: '/admin/workbins',\n        defaultTitle: 'purecloud.ifcTitles.workbins',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.workAutomation.workAutomation',\n                    href: '#/admin'\n                },\n                {\n                    textKey: 'frameNav.workAutomation.workbins',\n                    href: '#/admin/workbins'\n                }\n            ],\n            menu: 'admin:WORK_AUTOMATION'\n        }\n    },\n    workAutomationWorktypes: {\n        url: new URL('/task-management-worktypes/#/worktypes', location).toString(),\n        timeMachineUrl: version => `/task-management-worktypes/${version}/#/worktypes`,\n        assignedRoute: '/admin/worktypes',\n        defaultTitle: 'purecloud.ifcTitles.worktypes',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.workAutomation.workAutomation',\n                    href: '#/admin'\n                },\n                {\n                    textKey: 'frameNav.workAutomation.worktypes',\n                    href: '#/admin/worktypes'\n                }\n            ],\n            menu: 'admin:WORK_AUTOMATION'\n        }\n    },\n    workAutomationSchemaBuilder: {\n        url: new URL('/task-management-schema-builder/#/custom-attributes', location).toString(),\n        timeMachineUrl: version => `/task-management-schema-builder/${version}/#/custom-attributes`,\n        assignedRoute: '/admin/custom-attributes',\n        defaultTitle: 'purecloud.ifcTitles.customAttributes',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.workAutomation.workAutomation',\n                    href: '#/admin'\n                },\n                {\n                    textKey: 'frameNav.workAutomation.schemaBuilder',\n                    href: '#/admin/custom-attributes'\n                }\n            ],\n            menu: 'admin:WORK_AUTOMATION'\n        }\n    },\n    workAutomationWorkitems: {\n        url: new URL('/task-management-workitems/#/workitems', location).toString(),\n        timeMachineUrl: version => new URL(`/task-management-workitems/${version}/#/workitems`, location).toString(),\n        assignedRoute: '/agent/task-management/workitems',\n        defaultTitle: 'purecloud.ifcTitles.workitems'\n    },\n    workAutomationCaseplans: {\n        url: new URL('/task-management-caseplans/#/caseplans', location).toString(),\n        timeMachineUrl: version => `/task-management-caseplans/${version}/#/caseplans`,\n        assignedRoute: '/admin/caseplans',\n        defaultTitle: 'purecloud.ifcTitles.caseplans',\n        featureToggle: {\n            key: 'PURE-7138_caseplan_builder AND PURE-6320_case_management'\n        },\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.workAutomation.workAutomation',\n                    href: '#/admin'\n                },\n                {\n                    textKey: 'frameNav.workAutomation.caseplans',\n                    href: '#/admin/caseplans'\n                }\n            ],\n            menu: 'admin:WORK_AUTOMATION'\n        }\n    },\n    workAutomationCases: {\n        url: new URL('/task-management-cases/#/cases', location).toString(),\n        timeMachineUrl: version => `/task-management-cases/${version}/#/cases`,\n        assignedRoute: '/agent/task-management/cases',\n        defaultTitle: 'purecloud.ifcTitles.cases',\n        featureToggle: {\n            key: 'PURE-7203_case_list_ui AND PURE-7203_case_list'\n        }\n    },\n    disconnectInteractions: {\n        url: new URL(`/agent-ui-settings-v2/#/disconnect-interactions`, location).toString(),\n        timeMachineUrl: version => `/agent-ui-settings-v2/${version}/#/disconnect-interactions`,\n        assignedRoute: '/admin/routing/disconnectInteractions',\n        defaultTitle: 'purecloud.ifcTitles.untitled',\n        nav: {\n            breadcrumbs: [\n                { textKey: 'frameNav.routing.routing' },\n                { textKey: 'frameNav.routing.disconnectInteractions' }\n            ],\n            menu: 'admin:ROUTING'\n        }\n    },\n    socialListeningAdminUI: {\n        url: new URL('/social-listening-admin-ui/#/topics', location).toString(),\n        timeMachineUrl: version => new URL(`/social-listening-admin-ui/${version}/#/topics`, location).toString(),\n        assignedRoute: '/admin/topics',\n        defaultTitle: 'purecloud.ifcTitles.socialListeningAdminUi',\n        nav: {\n            breadcrumbs: [\n                { textKey: 'frameNav.messagingAdmin.message', href: '#/admin' },\n                { textKey: 'frameNav.socialListening.socialListening', href: '#/admin/topics' }\n            ],\n            menu: 'admin:MESSAGE'\n        }\n    },\n    //CM-5347: adding iframe client config for documents decomposition. separate configs are required for each UI page to navigate in between the pages.\n    contentManagement: {\n        url: new URL('/content-management-ifc/#/contentManagement/', location).toString(),\n        timeMachineUrl: version => `/content-management-ifc/${version}/#/contentManagement/`,\n        assignedRoute: '/content-management/',\n        defaultTitle: 'purecloud.ifcTitles.untitled'\n    },\n    contentManagementAdmin: {\n        url: new URL('/content-management-ifc/#/contentManagement/admin/', location).toString(),\n        timeMachineUrl: version => `/content-management-ifc/${version}/#/contentManagement/admin/`,\n        assignedRoute: '/admin/contentManagement/admin/',\n        defaultTitle: 'purecloud.ifcTitles.untitled',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.contentManagement.documents',\n                    active: false\n                },\n                {\n                    textKey: 'frameNav.contentManagement.workspaces',\n                    active: false\n                }\n            ]\n        }\n    },\n    socialEscalationRulesUI: {\n        url: new URL('/social-listening-admin-ui/#/escalation-rules', location).toString(),\n        timeMachineUrl: version =>\n            new URL(`/social-listening-admin-ui/${version}/#/escalation-rules`, location).toString(),\n        assignedRoute: '/admin/escalation-rules',\n        defaultTitle: 'purecloud.ifcTitles.socialEscalationRules',\n        nav: {\n            breadcrumbs: [\n                { textKey: 'frameNav.messagingAdmin.message', href: '#/admin' },\n                { textKey: 'frameNav.socialListening.socialEscalationRules', href: '#/admin/escalation-rules' }\n            ],\n            menu: 'admin:MESSAGE'\n        }\n    },\n    identityResolutionConfigUI: {\n        url: new URL('/identity-resolution-config-ui/#/', location).toString(),\n        timeMachineUrl: version => `/identity-resolution-config-ui/${version}/#/`,\n        assignedRoute: '/admin/identity-resolution',\n        defaultTitle: 'purecloud.ifcTitles.identityResolutionConfig',\n        nav: {\n            breadcrumbs: [\n                { textKey: 'frameNav.directory.directory', href: '#/admin' },\n                { textKey: 'frameNav.directory.identityResolution', href: '#/admin/identity-resolution' }\n            ],\n            menu: 'admin:DIRECTORY'\n        }\n    },\n    ruleBasedDecisionsRulesSchemas: {\n        url: new URL('/rule-based-decisions/#/rules-schemas', location).toString(),\n        timeMachineUrl: version => `/rule-based-decisions/${version}/#/rules-schemas`,\n        assignedRoute: '/admin/rules-schemas',\n        defaultTitle: 'purecloud.ifcTitles.rulesSchemas',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.ruleBasedDecisions.ruleBasedDecisions',\n                    href: '#/admin'\n                },\n                {\n                    textKey: 'frameNav.ruleBasedDecisions.rulesSchemas',\n                    href: '#/admin/rules-schemas'\n                }\n            ],\n            menu: 'admin:RULE_BASED_DECISIONS'\n        }\n    },\n    ruleBasedDecisionsDecisionTables: {\n        url: new URL('/rule-based-decisions/#/decision-tables', location).toString(),\n        timeMachineUrl: version => `/rule-based-decisions/${version}/#/decision-tables`,\n        assignedRoute: '/admin/decision-tables',\n        defaultTitle: 'purecloud.ifcTitles.decisionTables',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.ruleBasedDecisions.ruleBasedDecisions',\n                    href: '#/admin'\n                },\n                {\n                    textKey: 'frameNav.ruleBasedDecisions.decisionTables',\n                    href: '#/admin/decision-tables'\n                }\n            ],\n            menu: 'admin:RULE_BASED_DECISIONS'\n        }\n    },\n    usageUI: {\n        url: new URL('/usage-ui/#/', location).toString(),\n        timeMachineUrl: version => `/usage-ui/${version}/#/`,\n        defaultTitle: 'purecloud.ifcTitles.usage',\n        assignedRoute: '/admin/usage',\n        featureToggle: {\n            key: 'PURE-6828_refinery_launch',\n            redirect: 'admin',\n            makeRedirectArgs: makeAdminRedirectArgs\n        }\n    },\n    usersUi: {\n        url: new URL('/users-ui/#/users', location).toString(),\n        timeMachineUrl: version => new URL(`/users-ui/${version}/#/users`, location).toString(),\n        assignedRoute: '/admin/users',\n        defaultTitle: 'purecloud.ifcTitles.people',\n        nav: {\n            breadcrumbs: [\n                {\n                    textKey: 'frameNav.peoplePermissions'\n                }\n            ],\n            menu: 'admin:PEOPLE_PERMISSIONS'\n        },\n        featureToggle: {\n            key: 'PAUI-80.PeopleUiDecomposition',\n            redirect: 'admin',\n            makeRedirectArgs: makeAdminRedirectArgs\n        }\n    },\n    audioHookMonitors: {\n        url: new URL('/monitor-config-ui/#/', location).toString(),\n        timeMachineUrl: version => new URL(`/monitor-config-ui/${version}/#/`, location).toString(),\n        assignedRoute: '/admin/integrations/audiohook/monitors',\n        defaultTitle: 'purecloud.ifcTitles.audioHookMonitors',\n        nav: {\n            breadcrumbs: [{ textKey: 'frameNav.integrations' }],\n            menu: 'admin:INTEGRATIONS'\n        },\n        featureToggle: {\n            key: 'PURE-5110_AudioHook-Monitor-Config',\n            redirect: 'admin',\n            makeRedirectArgs: makeAdminRedirectArgs\n        }\n    }\n};\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport { centerStageClients, modalClients, sidePanelClients };\n","import initialize from 'ember-modal-dialog/initializers/add-modals-container';\n\nexport default {\n  name: 'add-modals-container',\n  initialize: initialize\n};\n","import AnalyticsService from '../services/analytics';\n\nexport default {\n    name: 'setupAnalyticsService',\n    after: 'setupSessionService',\n    initialize(application) {\n        application.register('service:analytics', AnalyticsService);\n        application.inject('service:analytics', 'store', 'service:store');\n        application.inject('service:analytics', 'applicationService', 'service:application');\n        application.inject('controller', 'analyticsService', 'service:analytics');\n        application.inject('route', 'analyticsService', 'service:analytics');\n        application.inject('component', 'analyticsService', 'service:analytics');\n    }\n};\n","import initializerFactory from 'ember-cli-app-version/initializer-factory';\nimport config from '../config/environment';\n\nlet name, version;\nif (config.APP) {\n  name = config.APP.name;\n  version = config.APP.version;\n}\n\nexport default {\n  name: 'App Version',\n  initialize: initializerFactory(name, version),\n};\n","import ApplicationService from '../services/application';\n\nexport default {\n    name: 'setupApplicationService',\n    after: 'orgspan',\n    initialize(application) {\n        application.register('service:application', ApplicationService);\n        application.inject('controller', 'applicationService', 'service:application');\n        application.inject('route', 'applicationService', 'service:application');\n        application.inject('component', 'applicationService', 'service:application');\n        application.inject('model', 'applicationService', 'service:application');\n    }\n};\n","import MyInteractionsApiHandler from '../services/apps-api-handlers/my-interactions-handler';\nimport ExternalContactsHandler from '../services/apps-api-handlers/external-contacts-handler';\nimport ResourceCenterHandler from '../services/apps-api-handlers/resource-center-handler';\nimport DirectoryNavHandler from '../services/apps-api-handlers/directory-nav-handler';\nimport ToastHandler from '../services/apps-api-handlers/toast-handler';\nimport AttentionCountHandler from '../services/apps-api-handlers/attention-count-handler';\nimport LifecycleHandler from '../services/apps-api-handlers/lifecycle-handler';\nimport ShowInteractionDetailsHandler from '../services/apps-api-handlers/show-interaction-details-handler';\n\nconst APPS_API_HANDLER_TYPE = 'apps-api-handler';\nexport function initialize(application) {\n    // Register the API Handlers and the list of handler keys for dynamic injection\n    let handlerMap = {\n        'my-interactions-handler': MyInteractionsApiHandler,\n        'external-contacts-handler': ExternalContactsHandler,\n        'resource-center-handler': ResourceCenterHandler,\n        'directory-nav-handler': DirectoryNavHandler,\n        'toast-handler': ToastHandler,\n        'attention-count-handler': AttentionCountHandler,\n        'lifecycle-handler': LifecycleHandler,\n        'show-interaction-details-handler': ShowInteractionDetailsHandler\n    };\n\n    let handlerKeys = [];\n    Object.keys(handlerMap).forEach(currName => {\n        let currFullName = `${APPS_API_HANDLER_TYPE}:${currName}`;\n        handlerKeys.push(currFullName);\n        application.register(currFullName, handlerMap[currName]);\n    });\n\n    application.register(`${APPS_API_HANDLER_TYPE}:keys`, handlerKeys, { instantiate: false });\n\n    application.inject('service:apps', 'routerService', 'router:main');\n}\n\nexport default {\n    name: 'apps-service',\n    after: 'setupSessionService',\n    initialize: initialize\n};\n","import Route from '@ember/routing/route';\nimport AuthenticatedAuthorizedRouteMixin from '../mixins/authenticated-authorized-route-mixin';\n\nexport default {\n    name: 'authenticationSetup',\n    after: 'orgspan',\n    before: 'authenticators',\n\n    initialize: function () {\n        /*\n         * Protecting ALL routes with ember-simple-auth by default\n         *\n         * Routes can override beforeModel to implement different authentication behavior\n         * (e.g., unauthenticated routes like login-oauth check isAuthenticated and redirect if already logged in)\n         */\n        Route.reopen(AuthenticatedAuthorizedRouteMixin);\n    }\n};\n","import EmberObject from '@ember/object';\nimport config from '../config/environment';\nimport netUtils from '../utils/net';\nimport { setLocalhostApiDomain } from '@genesys/gc-mfe-auth';\n\nfunction loadOauthProps() {\n    const { oauthProps } = config;\n    if (oauthProps && typeof oauthProps === 'object' && !Object.prototype.hasOwnProperty.call(oauthProps, 'clientId')) {\n        try {\n            const { runtime } = netUtils.getEnvDetails();\n            // Authenticator will handle `null` from a UI perspective\n            return runtime.name in oauthProps ? oauthProps[runtime.name] : null;\n        } catch (e) {\n            return null;\n        }\n    }\n    return oauthProps;\n}\n\n/**\n * When running locally, gc-mfe-auth defaults to inindca.com for all auth flows.\n * This tells it which domain to use based on the env in the URL\n * (e.g. mypurecloud.com for /prod). Must run before ember-simple-auth\n * initializes the session. See MRMO-599.\n */\nfunction configureLocalhostAuthDomain() {\n    try {\n        const { runtime } = netUtils.getEnvDetails();\n        if (runtime.local && runtime.currentDomainName) {\n            setLocalhostApiDomain(runtime.currentDomainName);\n        }\n    } catch (_e) {\n        // Non-local or unrecognized URL — no override needed\n    }\n}\n\nexport default {\n    name: 'authenticators',\n    before: 'ember-simple-auth',\n    after: 'setupSessionService',\n    initialize: function (application) {\n        configureLocalhostAuthDomain();\n        application.register('authenticator:oauthProps', EmberObject.extend(loadOauthProps() || {}));\n        application.inject('authenticator:directory', 'oauthProps', 'authenticator:oauthProps');\n        application.inject('authorizer:directory', 'oauthProps', 'authenticator:oauthProps');\n    }\n};\n","import ChatFrameService from '../services/chat-frame';\n\nexport default {\n    name: 'setupChatFrameService',\n    after: 'setupPhoneService',\n    initialize: function (application) {\n        application.register('service:chatFrame', ChatFrameService, { singleton: true, initialize: true });\n    }\n};\n","import ChatService from '../services/chat';\n\nexport default {\n    name: 'setupChatService',\n    after: 'setupPhoneService',\n    initialize: function (application) {\n        application.register('service:chat', ChatService, { singleton: true, initialize: true });\n        application.inject('service:chat', 'store', 'service:store');\n        application.inject('service:chat', 'session', 'service:session');\n        application.inject('service:chat', 'preferences', 'service:preferences');\n        application.inject('service:chat', 'analyticsService', 'service:analytics');\n        application.inject('service:chat', 'applicationService', 'service:application');\n        application.inject('service:chat', 'phoneService', 'service:phone');\n        application.inject('service:chat', 'sidebarService', 'service:sidebar');\n\n        application.inject('controller', 'chatService', 'service:chat');\n        application.inject('route', 'chatService', 'service:chat');\n        application.inject('component', 'chatService', 'service:chat');\n    }\n};\n","import ClockService from '../services/clock';\n\nexport default {\n    name: 'clock-service',\n    initialize(application) {\n        // Register the clock service as a singleton with auto-initialization\n        // The initialize:true option forces the service to instantiate on app boot\n        application.register('service:clock', ClockService, { singleton: true, initialize: true });\n\n        // Ember 3.28: Cannot use auto-injection - creates conflict with explicit inject('clock')\n        // Components that need clock must inject explicitly: clock: service()\n    }\n};\n","export { default, initialize } from 'ember-component-css/initializers/component-styles';\n\nimport Ember from 'ember';\n\nimport StyleNamespacingExtras from '../mixins/style-namespacing-extras';\n\n// eslint-disable-next-line ember/new-module-imports\nEmber.Component.reopen(StyleNamespacingExtras);\n","import ContainerDebugAdapter from 'ember-resolver/resolvers/classic/container-debug-adapter';\n\nexport default {\n  name: 'container-debug-adapter',\n\n  initialize() {\n    let app = arguments[1] || arguments[0];\n\n    app.register('container-debug-adapter:main', ContainerDebugAdapter);\n    app.inject('container-debug-adapter:main', 'namespace', 'application:main');\n  }\n};\n","import WebrtcSdkService from '../services/device-profiles-v2';\n\nexport default {\n    name: 'setupDeviceProfilesService',\n    after: 'setupWebrtcSdkService',\n    initialize: function (application) {\n        application.register('service:device-profiles-v2', WebrtcSdkService);\n        application.inject('controller', 'device-profiles-v2', 'service:device-profiles-v2');\n        application.inject('route', 'device-profiles-v2', 'service:device-profiles-v2');\n        application.inject('component', 'device-profiles-v2', 'service:device-profiles-v2');\n    }\n};\n","import {initializer as initialize} from 'ember-data-change-tracker';\n\nexport default {\n  name: 'ember-data-change-tracker',\n  after: 'ember-data',\n  initialize\n};\n","import 'ember-data';\n\nimport setupContainer from 'ember-data/setup-container';\n\n/*\n  This code initializes EmberData in an Ember application.\n\n  It ensures that the `store` service is automatically injected\n  as the `store` property on all routes and controllers.\n*/\nexport default {\n  name: 'ember-data',\n  initialize: setupContainer,\n};\n","import ENV from '../config/environment';\nimport Configuration from 'ember-simple-auth/configuration';\nimport setupSession from 'ember-simple-auth/initializers/setup-session';\nimport setupSessionRestoration from 'ember-simple-auth/initializers/setup-session-restoration';\nimport Adaptive from 'ember-simple-auth/session-stores/adaptive';\nimport LocalStorage from 'ember-simple-auth/session-stores/local-storage';\nimport Cookie from 'ember-simple-auth/session-stores/cookie';\n\nexport default {\n  name: 'ember-simple-auth',\n\n  initialize(registry) {\n    const config = ENV['ember-simple-auth'] || {};\n    config.rootURL = ENV.rootURL || ENV.baseURL;\n    Configuration.load(config);\n\n    registry.register('session-store:adaptive', Adaptive);\n    registry.register('session-store:cookie', Cookie);\n    registry.register('session-store:local-storage', LocalStorage);\n\n    setupSession(registry);\n    setupSessionRestoration(registry);\n  }\n};\n","import Ember from 'ember';\nimport config from '../config/environment';\n\nexport function initialize() {\n  var application = arguments[1] || arguments[0];\n  if (config.exportApplicationGlobal !== false) {\n    var theGlobal;\n    if (typeof window !== 'undefined') {\n        theGlobal = window;\n    } else if (typeof global !== 'undefined') {\n        theGlobal = global\n    } else if (typeof self !== 'undefined') {\n        theGlobal = self;\n    } else {\n       // no reasonable global, just bail\n       return;\n    }\n\n    var value = config.exportApplicationGlobal;\n    var globalName;\n\n    if (typeof value === 'string') {\n      globalName = value;\n    } else {\n      globalName = Ember.String.classify(config.modulePrefix);\n    }\n\n    if (!theGlobal[globalName]) {\n      theGlobal[globalName] = application;\n\n      application.reopen({\n        willDestroy: function() {\n          this._super.apply(this, arguments);\n          delete theGlobal[globalName];\n        }\n      });\n    }\n  }\n}\n\nexport default {\n  name: 'export-application-global',\n\n  initialize: initialize\n};\n","import FieldConfig from '../field-config/field-config';\n\nimport PersonFieldConfig from '../field-config/entities/person';\nimport GroupFieldConfig from '../field-config/entities/group';\nimport OrgFieldConfig from '../field-config/entities/org';\nimport ExternalContactFieldConfig from '../field-config/entities/external-contact';\n\nfunction _register(application, id, config) {\n    application.register(id, config);\n}\n\nfunction initialize(application) {\n    _register(application, 'field-config:base', FieldConfig);\n    _register(application, 'field-config:person', PersonFieldConfig);\n    _register(application, 'field-config:group', GroupFieldConfig);\n    _register(application, 'field-config:org', OrgFieldConfig);\n    _register(application, 'field-config:externalContact', ExternalContactFieldConfig);\n}\n\nexport default {\n    name: 'setupFieldConfig',\n    after: 'orgspan',\n    initialize\n};\n","import IntegrationsPresenceService from '../services/integrations-presence';\n\nexport default {\n    name: 'setupIntegrationsPresenceService',\n    after: 'setupSessionService',\n    initialize: function (application) {\n        application.register('service:integrations-presence', IntegrationsPresenceService, {\n            singleton: true,\n            initialize: true\n        });\n        application.inject('component', 'integrations-presence', 'service:integrations-presence');\n    }\n};\n","/* global requirejs */\n\nexport function initialize(application) {\n    let providerConfigMap = {};\n    Object.keys(requirejs.entries)\n        .filter(entry => entry.startsWith('web-directory/app-providers/'))\n        .forEach(entryName => {\n            const providerName = entryName.replace('web-directory/app-providers/', '');\n            const file = requirejs(entryName);\n            application.register('app-provider:' + providerName, file.default, {\n                singeleton: false,\n                instantiate: true\n            });\n            providerConfigMap[providerName] = file.boolExpr;\n        });\n    application.register('app-provider:provider-config-map', providerConfigMap, { instantiate: false });\n}\n\nexport default {\n    name: 'interapption-providers',\n    initialize: initialize\n};\n","import { registerDeprecationHandler } from '@ember/debug';\nimport config from '../config/environment';\n\nconst MainInitializer = {\n    name: 'orgspan',\n    after: 'ember-data',\n\n    initialize: function (application) {\n        // TODO: THIS IS BAD...remove later\n        window.Orgspan = application;\n        window.Genesys = {};\n\n        application.inject('component', 'store', 'service:store');\n\n        /*\n         * Ember is supposed to noop Ember.deprecate calls in production builds:\n         * http://emberjs.com/api/classes/Ember.html#method_deprecate\n         * However, this is a WIP:\n         * https://github.com/ember-cli/rfcs/pull/50\n         *\n         * Until this RFC is implemented, kill the deprecation chain which will\n         * result in noop (e.g. no logging) in non-dev environments.\n         */\n        if (config.environment !== 'development') {\n            // Register an empty function to break the deprecation chain call\n            registerDeprecationHandler(function () {});\n        }\n    }\n};\n\nif (config.environment === 'test') {\n    MainInitializer.after = ['ember-data'];\n}\n\nexport default MainInitializer;\n","import Provider from '../media-providers/provider';\nimport ZoomProvider from '../media-providers/zoom';\nimport PureCloudProvider from '../media-providers/purecloud';\nimport TeamsProvider from '../media-providers/teams';\n\nfunction _register(application, id, config) {\n    application.register(id, config, { singleton: false });\n}\n\nfunction initialize(application) {\n    _register(application, 'media-provider:base', Provider);\n    _register(application, 'media-provider:zoom', ZoomProvider);\n    _register(application, 'media-provider:purecloud', PureCloudProvider);\n    _register(application, 'media-provider:teams', TeamsProvider);\n}\n\nexport default {\n    name: 'setupMediaProviders',\n    after: 'orgspan',\n    initialize\n};\n","import MonitoringService from '../services/monitoring';\n\nexport default {\n    name: 'setupMonitoringService',\n    after: 'setupSessionService',\n    initialize(application) {\n        application.register('service:monitoring', MonitoringService);\n        // `session` and `logger` are resolved by the service itself in init(). They used to be\n        // supplied here with application.inject(), which installs getter-only properties — that made\n        // them unassignable in the service and absent entirely in unit tests, since initializers\n        // don't run under setupTest(). Owning them in the class keeps app and test behaviour\n        // identical. See .kiro/steering/ember-3-migration.md.\n    }\n};\n","import PhoneService from '../services/phone';\n\nexport default {\n    name: 'setupPhoneService',\n    after: 'setupSessionService',\n    initialize: function (application) {\n        application.register('service:phone', PhoneService, { singleton: true, initialize: true });\n        application.inject('service:phone', 'store', 'service:store');\n        application.inject('service:phone', 'session', 'service:session');\n        application.inject('service:phone', 'preferences', 'service:preferences');\n        application.inject('service:phone', 'analyticsService', 'service:analytics');\n        application.inject('service:phone', 'applicationService', 'service:application');\n\n        application.inject('route', 'phoneService', 'service:phone');\n        application.inject('component', 'phoneService', 'service:phone');\n    }\n};\n","import PigeonService from 'web-directory/services/pigeon';\n\nexport default {\n    name: 'setupPigeonService',\n    before: 'setupPhoneService',\n    initialize: function (application) {\n        application.register('service:pigeon', PigeonService);\n    }\n};\n","import PreferencesService from '../services/preferences';\n\nexport default {\n    name: 'setupPreferencesService',\n    before: 'setupApplicationService',\n    initialize(application) {\n        application.register('service:preferences', PreferencesService);\n        application.inject('controller', 'preferences', 'service:preferences');\n        application.inject('route', 'preferences', 'service:preferences');\n        application.inject('component', 'preferences', 'service:preferences');\n    }\n};\n","/* eslint-disable */\n/**\n * Register Genesys Spark (GUX) web components.\n * Moved from app.js to avoid synchronous module loading issues with ember-auto-import code splitting.\n *\n * This initializer returns a Promise, causing Ember to wait for genesys-spark registration\n * before continuing with application boot.\n *\n * Note: Dynamic import() syntax requires ES2020, but ESLint 5.x in this project doesn't support it.\n * ESLint is disabled for this file.\n */\nexport function initialize(/* application */) {\n    // Return the Promise so Ember waits for registration to complete\n    return import('genesys-spark')\n        .then(({ registerSparkComponents }) => {\n            registerSparkComponents();\n        })\n        .catch(() => {\n            // Don't throw - let app continue even if spark fails to load\n        });\n}\n\nexport default {\n    name: 'register-spark-components',\n    initialize\n};\n","import Application from '@ember/application';\nimport ScreenMonitorNotificationsService from '../services/screen-monitor-notifications';\n\nexport default {\n    name: 'setupScreenMonitorNotificationsService',\n    after: 'setupSessionService',\n    initialize(application: Application) {\n        application.register('service:screen-monitor-notifications', ScreenMonitorNotificationsService, {\n            singleton: true,\n            initialize: true\n        });\n\n        // `pigeon` and `session` are resolved by the service itself in init(). They used to be\n        // supplied here with application.inject(), which installs getter-only properties — that made\n        // them unassignable in the service and absent entirely in unit tests, since initializers\n        // don't run under setupTest(). Owning them in the class keeps app and test behaviour\n        // identical. See .kiro/steering/ember-3-migration.md.\n\n        application.inject('component', 'screen-monitor-notifications', 'service:screen-monitor-notifications');\n    }\n};\n","import ajax from 'ember-ajax';\nimport ApplicationService from 'web-directory/services/application';\nimport { isTesting } from 'web-directory/utils/testing';\n\nexport default {\n    name: 'service-discovery',\n\n    initialize: function (application) {\n        application.deferReadiness();\n        if (isTesting) {\n            ApplicationService.reopen({\n                authUri: null\n            });\n        } else {\n            ajax('/services/discovery.properties', {\n                method: 'GET',\n                crossDomain: true,\n                dataType: 'text',\n                contentType: 'text/plain'\n            })\n                .then(function (properties) {\n                    const instanceProperties = {};\n                    const authUriRegex = /^auth\\.uri\\=(.*)$/gim;\n                    const authUriResults = authUriRegex.exec(properties);\n                    instanceProperties.authUri = authUriResults ? authUriResults[1] : null;\n\n                    const apiUriRegex = /^api\\.uri\\=(.*)$/gim;\n                    const apiUriResults = apiUriRegex.exec(properties);\n                    const apiUri = apiUriResults && apiUriResults[1];\n                    if (apiUri) {\n                        instanceProperties.purecloudV2BaseUri = apiUri;\n                    }\n\n                    const cobrowseUriRegex = /^cobrowse\\.uri\\=(.*)$/gim;\n                    const cobrowseUriResults = cobrowseUriRegex.exec(properties);\n                    const cobrowseUri = cobrowseUriResults && cobrowseUriResults[1];\n                    if (cobrowseUri) {\n                        instanceProperties.cobrowseUri = cobrowseUri;\n                    }\n\n                    const purecloudUriRegex = /^purecloud\\.uri\\=(.*)$/gim;\n                    const purecloudUriResults = purecloudUriRegex.exec(properties);\n                    const purecloudUri = purecloudUriResults && purecloudUriResults[1];\n                    if (purecloudUri) {\n                        instanceProperties.purecloudAppsUri = purecloudUri;\n                    }\n\n                    const streamingServiceUriRegex = /^streaming\\.uri=(.*)$/gim;\n                    const streamingServiceUriResults = streamingServiceUriRegex.exec(properties);\n                    const streamingServiceUri = streamingServiceUriResults && streamingServiceUriResults[1];\n                    if (streamingServiceUri) {\n                        instanceProperties.streamingServiceUri = streamingServiceUri;\n                    }\n\n                    ApplicationService.reopen(instanceProperties);\n\n                    application.advanceReadiness();\n                })\n                .catch(error => {\n                    console.error(\"Couldn't reach service discovery.\", error);\n                    application.advanceReadiness();\n                    ApplicationService.reopen({\n                        authUri: null\n                    });\n                });\n        }\n    }\n};\n","import SessionService from '../services/session';\n\nexport default {\n    name: 'setupSessionService',\n    after: 'setupApplicationService',\n    initialize(application) {\n        application.register('service:session', SessionService);\n        application.inject('service:session', 'application', 'service:application');\n        application.inject('controller', 'session', 'service:session');\n        application.inject('route', 'session', 'service:session');\n        application.inject('component', 'session', 'service:session');\n        application.inject('adapter', 'session', 'service:session');\n    }\n};\n","import SidebarService from '../services/sidebar';\n\nexport default {\n    name: 'setupSidebarService',\n    after: 'setupPreferencesService',\n    initialize: function (application) {\n        application.register('service:sidebar', SidebarService, { singleton: true, initialize: true });\n        application.inject('service:sidebar', 'preferences', 'service:preferences');\n\n        application.inject('controller', 'sidebarService', 'service:sidebar');\n        application.inject('route', 'sidebarService', 'service:sidebar');\n        application.inject('component', 'sidebarService', 'service:sidebar');\n    }\n};\n","import VideoConferenceDetailsService from '../services/video-conference-details';\n\nexport default {\n    name: 'setupVideoConferenceDetailsService',\n    after: 'setupChatService',\n    initialize: function (application) {\n        application.register('service:video-conference-details', VideoConferenceDetailsService, {\n            singleton: true,\n            initialize: true\n        });\n        // ajax, pigeon, permissions and logger are resolved by the service itself in init(). They\n        // used to be supplied here with application.inject(), which installs getter-only properties\n        // — that made them unassignable in the service and absent entirely in unit tests, since\n        // initializers don't run under setupTest(). Owning them in the class keeps app and test\n        // behaviour identical. (`session` was injected here too but the service never used it.)\n        // See .kiro/steering/ember-3-migration.md.\n    }\n};\n","import WebrtcSdkService from '../services/webrtc-sdk';\nimport 'genesys-cloud-webrtc-sdk';\n\nexport default {\n    name: 'setupWebrtcSdkService',\n    after: 'setupSessionService',\n    initialize: function (application) {\n        application.register('service:webrtc-sdk', WebrtcSdkService);\n        application.inject('controller', 'webrtc-sdk', 'service:webrtc-sdk');\n        application.inject('route', 'webrtc-sdk', 'service:webrtc-sdk');\n        application.inject('component', 'webrtc-sdk', 'service:webrtc-sdk');\n    }\n};\n","import WebrtcService from 'web-directory/services/webrtc';\n\nexport default {\n    name: 'setupWebrtcService',\n    after: 'setupChatService',\n    initialize: function (application) {\n        application.register('service:webrtc', WebrtcService, { singleton: true, initialize: true });\n        application.inject('service:webrtc', 'store', 'service:store');\n        application.inject('service:webrtc', 'session', 'service:session');\n        application.inject('service:webrtc', 'preferences', 'service:preferences');\n        application.inject('service:webrtc', 'analyticsService', 'service:analytics');\n        application.inject('service:webrtc', 'applicationService', 'service:application');\n        application.inject('service:webrtc', 'phoneService', 'service:phone');\n        application.inject('service:webrtc', 'sidebarService', 'service:sidebar');\n        application.inject('service:webrtc', 'chatService', 'service:chat');\n\n        application.inject('controller', 'webrtcService', 'service:webrtc');\n        application.inject('route', 'webrtcService', 'service:webrtc');\n        application.inject('component', 'webrtcService', 'service:webrtc');\n    }\n};\n","import WebrtcSettings from '../services/webrtc-settings';\n\nexport default {\n    name: 'setupWebrtcSettingsService',\n    before: 'setupApplicationService',\n    initialize(application) {\n        application.register('service:webrtc-settings', WebrtcSettings);\n        application.inject('controller', 'webrtc-settings', 'service:webrtc-settings');\n        application.inject('route', 'webrtc-settings', 'service:webrtc-settings');\n        application.inject('component', 'webrtc-settings', 'service:webrtc-settings');\n    }\n};\n","type WorkerProviderFactory = {\n    default: unknown;\n    boolExpr: boolean;\n};\n\ntype RequireJsLike = {\n    entries: Record<string, unknown>;\n    (moduleName: string): WorkerProviderFactory;\n};\n\ntype InitializerApplication = {\n    register: (name: string, factory: unknown, options?: { singleton?: boolean; instantiate?: boolean }) => void;\n};\n\ndeclare const requirejs: RequireJsLike;\n\nexport function initialize(application: InitializerApplication) {\n    let providerConfigMap: Record<string, boolean> = {};\n    Object.keys(requirejs.entries)\n        .filter(entry => entry.startsWith('web-directory/worker-providers/'))\n        .forEach(entryName => {\n            const providerName = entryName.replace('web-directory/worker-providers/', '');\n            const file = requirejs(entryName);\n            application.register('worker-provider:' + providerName, file.default, {\n                singleton: true,\n                instantiate: true\n            });\n            providerConfigMap[providerName] = file.boolExpr;\n        });\n    application.register('worker-provider:provider-config-map', providerConfigMap, { instantiate: false });\n}\n\nexport default {\n    name: 'worker-providers',\n    initialize: initialize\n};\n","export function initialize(instance) {\n    const agentScheduleService = instance.lookup('service:agent-schedule');\n    agentScheduleService.checkAdherenceState();\n    agentScheduleService.initializeScheduleUpdateListener();\n}\n\nexport default {\n    name: 'agent-schedule',\n    initialize\n};\n","export function initialize(instance) {\n    const applicationController = instance.lookup('controller:application');\n\n    const chatService = instance.lookup('service:chat');\n    const phoneService = instance.lookup('service:phone');\n\n    phoneService.set('applicationController', applicationController);\n    chatService.set('applicationController', applicationController);\n}\n\nexport default {\n    name: 'attach-application-controller',\n    initialize\n};\n","export default {\n    name: 'attach-application-session',\n    initialize(instance) {\n        const application = instance.lookup('application:main');\n        application.set('session', instance.lookup('service:session'));\n    }\n};\n","import { debugBackburner } from 'web-directory/utils/debug-backburner';\nimport { debugRsvp } from 'web-directory/utils/debug-rsvp';\n\nexport function initialize(appInstance) {\n    let config = appInstance.resolveRegistration('config:environment');\n    debugBackburner(config);\n    debugRsvp(config);\n}\n\nexport default {\n    name: 'backburner-debug',\n    initialize\n};\n","export function initialize(instance) {\n    // Force the clock service to instantiate and start ticking\n    // This ensures the service starts even if no component has accessed it yet\n    instance.lookup('service:clock');\n}\n\nexport default {\n    name: 'clock-service',\n    initialize\n};\n","import ApplicationInstance from '@ember/application/instance';\n\nexport default {\n    name: 'setupConversationService',\n    initialize(instance) {\n        // Only initialize the service if this is an application, not an engine\n        if (instance instanceof ApplicationInstance) {\n            instance.lookup('service:conversation');\n        }\n    }\n};\n","import type ApplicationInstance from '@ember/application/instance';\n\nexport function initialize(appInstance: ApplicationInstance) {\n    appInstance.lookup('service:copilot-broadcast');\n}\n\nexport default {\n    name: 'instantiate-copilot-broadcast',\n    initialize\n};\n","/* exists only for things that historically used \"after\" or \"before\" */\nexport default {\n  name: 'ember-data',\n  initialize() {},\n};\n","/**\n * Override ember-intl's default instance initializer.\n *\n * The default initializer calls hydrate() which accesses requirejs.entries\n * to discover bundled translations. Since we use publicOnly: true and load\n * translations asynchronously via AJAX, requirejs.entries has no translation\n * modules and may be null in some environments.\n *\n * We just need to ensure the intl service is instantiated early.\n */\nexport function initialize(instance) {\n    instance.lookup('service:intl');\n}\n\nexport default {\n    name: 'ember-intl',\n    initialize\n};\n","// This is only needed for backwards compatibility and will be removed in the\n// next major release of ember-simple-auth. Unfortunately, there is no way to\n// deprecate this without hooking into Ember's internals…\nexport default {\n  name: 'ember-simple-auth',\n\n  initialize() {}\n};\n","import EntityContactGroupComponent from 'web-directory/components/entity-contact-group/component';\nimport EntityImageDefaults from 'web-directory/mixins/entity-image-defaults';\n\nexport function initialize() {\n    EntityContactGroupComponent.reopen(EntityImageDefaults);\n}\n\nexport default {\n    name: 'entity-contact-group',\n    initialize\n};\n","import EntityHoverCard from 'web-directory/components/entity-hover-card/component';\nimport EntityImageDefaults from 'web-directory/mixins/entity-image-defaults';\n\nexport function initialize() {\n    EntityHoverCard.reopen(EntityImageDefaults);\n}\n\nexport default {\n    name: 'entity-hover-card',\n    initialize\n};\n","import EntityImageComponent from 'web-directory/components/entity-image/component';\nimport EntityImageDefaults from 'web-directory/mixins/entity-image-defaults';\n\nexport function initialize() {\n    EntityImageComponent.reopen(EntityImageDefaults);\n}\n\nexport default {\n    name: 'entity-image',\n    initialize\n};\n","import { reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport EntityLocationComponent from 'web-directory/components/entity-location/component';\n\nexport function initialize() {\n    EntityLocationComponent.reopen({\n        session: service(),\n        geolocation: service(),\n\n        self: reads('session.person'),\n        isGeolocationEnabled: reads('geolocation.isEnabled')\n    });\n}\n\nexport default {\n    name: 'entity-location',\n    initialize\n};\n","import { set } from '@ember/object';\nimport Component from '@ember/component';\nimport _ from 'lodash';\n\nexport default {\n    name: 'reopen-component',\n\n    initialize(instance) {\n        const session = instance.lookup('service:session');\n        const preferences = instance.lookup('service:preferences');\n\n        Component.reopen({\n            bubbleAction(data) {\n                try {\n                    this.triggerAction(data);\n                } catch (e) {\n                    // Turn on to debug component stack\n                    // console.warn(e.message, e.stack);\n                }\n\n                const parentView = this.parentView;\n                if (parentView && parentView.bubbleAction) {\n                    parentView.bubbleAction(data);\n                }\n            }\n        });\n\n        Component.reopen({\n            init() {\n                this._super();\n\n                var services = this.needsServices;\n                if (!services) {\n                    services = [];\n                }\n\n                var current = this.services;\n                if (!current) {\n                    current = {};\n                }\n\n                _.each(services, function (name) {\n                    var service = instance.lookup('service:' + name);\n                    set(current, name, service);\n                });\n\n                this.set('services', current);\n\n                if (!this.session) {\n                    this.set('session', session);\n                }\n\n                if (!this.preferences) {\n                    this.set('preferences', preferences);\n                }\n            }\n        });\n    }\n};\n","import LinkComponent from '@ember/routing/link-component';\n\nexport default {\n    name: 'reopen-linkview',\n\n    initialize: function (instance) {\n        LinkComponent.reopen({\n            _invoke: function () {\n                var sidebar = instance.lookup('service:sidebar');\n\n                sidebar.ensureRouteVisibility();\n                return this._super.apply(this, arguments);\n            }\n        });\n    }\n};\n","import { inject as service } from '@ember/service';\nimport { observer } from '@ember/object';\nimport Route from '@ember/routing/route';\n\nexport default {\n    name: 'reopen-route',\n\n    initialize() {\n        Route.reopen({\n            intl: service(),\n            sidebar: service(),\n            application: service(),\n            pageTitle: service('bookmark-page-title'),\n\n            routeTitle: '',\n\n            updateRouteTitle: observer(\n                'routeName',\n                'routeTitle',\n                'application.{orgName,currentRouteName}',\n                'sidebar.{showConversations,communicationSidebarExpanded}',\n                function () {\n                    let parts = [];\n                    let routeName = this.routeName;\n                    let routeTitle = this.routeTitle;\n                    let appRoute = this.get('application.currentRouteName') || '';\n                    let orgName = this.get('application.orgName');\n                    let sidebar = this.sidebar;\n\n                    if (!routeTitle || appRoute.indexOf(routeName) === -1) {\n                        return;\n                    }\n\n                    if (sidebar.get('showConversations') && sidebar.get('communicationSidebarExpanded')) {\n                        parts.push(this.intl.safestring('components.navMenu.chat').toString());\n                    } else {\n                        parts.push(typeof routeTitle === 'function' ? routeTitle.call(this) : routeTitle);\n                    }\n\n                    if (orgName) {\n                        parts.push(orgName);\n                    }\n                    this.get('pageTitle').set('nativePageTitle', {\n                        title: parts.join(' - '),\n                        forURL: this.router.currentURL\n                    });\n                    window.document.title = parts.join(' - ');\n                }\n            )\n        });\n    }\n};\n","export default {\n    name: 'setupScreenRecordingService',\n    initialize(instance) {\n        const screenRecordingService = instance.lookup('service:screenRecording');\n        const sessionService = instance.lookup('service:session');\n        screenRecordingService.set('session', sessionService);\n    }\n};\n","import { isTesting } from 'web-directory/utils/testing';\nimport HostedContext from '../utils/hosted-context';\nimport { parseRuntimeCustom } from '../utils/net';\n\nexport default {\n    name: 'set-application-service-values',\n    initialize(instance) {\n        const application = instance.lookup('application:main');\n        const service = instance.lookup('service:application');\n        service.setProperties(application.getProperties('urlprefix', 'semver', 'version', 'context'));\n        const context = HostedContext.create(instance.ownerInjection());\n        service.set('hostedContext', context);\n        service.set('store', instance.lookup('service:store'));\n        if (isTesting) {\n            // Runtime will not resolve in testing mode, so anything that uses it will need to mock it in the tests.\n            service.set('runtime', null);\n        } else {\n            try {\n                const runtime = parseRuntimeCustom();\n                if (runtime) service.set('runtime', parseRuntimeCustom());\n                else {\n                    throw new Error('Failed to parse URL into a known runtime environment. Check URL and utils/net.js');\n                }\n            } catch (error) {\n                console.error(error);\n                // Setting the errorState on the applicaiton service will route to the maintenance mode page.\n                service.set('errorState', { type: 'invalidEnv' });\n                service.set('runtime', null);\n            }\n        }\n        application.set('applicationService', service);\n    }\n};\n","export default {\n    name: 'set-application-values',\n    initialize(instance) {\n        const application = instance.lookup('application:main');\n        application.set('instance', instance);\n        application.set('ajax', instance.lookup('ajax:application'));\n        application.set('permissions', instance.lookup('permissions:application'));\n\n        // Probably shouldn't access these this way...might be one of those separation of concerns problems\n        application.set('store', instance.lookup('service:store'));\n        application.set('router', instance.lookup('router:main'));\n    }\n};\n","import { get } from '@ember/object';\nimport { run } from '@ember/runloop';\nimport $ from 'jquery';\nimport { initializeMarkdownRendering } from '../utils/markdown';\nimport { initializeEmojiRendering } from 'web-directory/utils/emoji';\nimport { initializeFavicon } from '../services/favicon';\n\nexport default {\n    name: 'setup-application',\n    initialize: function (instance) {\n        const application = instance.lookup('application:main');\n        // looking up sound service here loads all of the sounds and creates handlers for onplay and onstop events.\n        // see PCDWEBK-3861 for more info.\n        const sound = instance.lookup('service:sound'); // eslint-disable-line no-unused-vars\n\n        $(window).on('beforeunload', function (event) {\n            return run(() => {\n                // mailto: links cause beforeunload to fire.\n                let isLink = false;\n                let $target = $(get(event, 'target.activeElement'));\n                let href = $target.attr('href');\n                if (!href) {\n                    $target = $($target).closest('a');\n                    href = $target.attr('href');\n                }\n                if (href) {\n                    isLink = href.indexOf('mailto') > -1 || href.indexOf('tel') > -1;\n                }\n                if (isLink) {\n                    return;\n                }\n\n                try {\n                    const webrtcSdkService = instance.lookup('service:webrtc-sdk');\n\n                    let hasActiveCall = webrtcSdkService.get('hasActiveSoftphoneConversation');\n\n                    if (!webrtcSdkService.get('useSdk')) {\n                        const webrtcService = instance.lookup('service:webrtc');\n                        const phoneService = instance.lookup('service:phone');\n\n                        const conversation = webrtcService.get('conversations').find(c => {\n                            return c.get('isConnected');\n                        });\n\n                        const persistentConnectionActive = phoneService.get('persistentConnectionActive');\n                        const hasPhoneConversation = phoneService.get('activeConversations.length');\n                        const idlePersistent = persistentConnectionActive && !hasPhoneConversation;\n\n                        hasActiveCall = !!conversation && !idlePersistent;\n                    }\n\n                    if (hasActiveCall) {\n                        const intl = instance.lookup('service:intl');\n                        return intl.safestring('purecloud.promptForRefreshActiveCall').toString();\n                    }\n                } catch (e) {\n                    console.error('Could not find active conversation and active persistent connection', {\n                        error: e\n                    });\n                }\n\n                try {\n                    const pigeonService = instance.lookup('service:pigeon');\n                    if (pigeonService) {\n                        // Avoid reconnecting upon a refresh.\n                        pigeonService.reconnect = function () {};\n                        pigeonService.disconnect();\n                    }\n                } catch (e) {\n                    console.error('Could not find pigeon service', { error: e });\n                }\n            });\n        });\n\n        const urlPrefix = application.get('urlprefix');\n\n        initializeEmojiRendering(urlPrefix);\n\n        const isApplicationRoute = function (href) {\n            return !!/^\\/?#\\/.*\\/[a-f0-9]{24}/.test(href) || !!/^\\/?#\\/.*\\/[a-z0-9-]{36}$/i.test(href);\n        };\n\n        initializeMarkdownRendering(isApplicationRoute);\n        initializeFavicon();\n    }\n};\n","export default {\n    name: 'setup-apps-api-handlers',\n    initialize(instance) {\n        let apiHandlers = [];\n        let apiHandlerKeys = instance.lookup('apps-api-handler:keys');\n        if (apiHandlerKeys && apiHandlerKeys.length) {\n            apiHandlerKeys.forEach(currHandlerKey => {\n                apiHandlers.push(instance.lookup(currHandlerKey));\n            });\n        }\n\n        instance.lookup('service:apps').set('globalApiHandlers', apiHandlers);\n    }\n};\n","import { on } from 'rsvp';\nimport { get } from '@ember/object';\nimport Ember from 'ember';\n\nexport function initialize(instance) {\n    const stashLogger = instance.lookup('service:stash-logger');\n    Ember.Logger = stashLogger;\n    Ember.onerror = function (error) {\n        // Guard against null, undefined, or empty errors\n        if (!error) {\n            return;\n        }\n\n        const status = error ? get(error, 'status') : null;\n        if (status === 200) {\n            return null;\n        } else if (status === 418) {\n            const applicationService = instance.lookup('service:application');\n            const session = applicationService.get('session');\n            if (session) {\n                session.logout();\n            }\n        }\n\n        // Sometimes Ember RSVP triggers the onError, and sometimes it doesn't,\n        // so this will prevent the same error being logged multiple times\n        if ((typeof error === 'object' && error._logged === true) || error === 'Request Cancelled') {\n            return;\n        }\n\n        if (typeof error === 'object' && error !== null) {\n            error._logged = true;\n        }\n\n        stashLogger.error(`Global Error Caught: ${error}`);\n\n        // CRITICAL: Re-throw errors during tests so QUnit can properly report them\n        // ember-qunit requires that Ember.onerror rethrows when Ember.testing is true\n        // See: https://github.com/emberjs/ember-qunit/blob/master/docs/TEST_ISOLATION_VALIDATION.md\n        if (Ember.testing) {\n            throw error;\n        }\n    };\n\n    on('error', function (error) {\n        if (!error) {\n            return; // https://github.com/simplabs/ember-simple-auth/issues/439\n        }\n        if (!instance.isDestroyed) {\n            Ember.onerror(error);\n        }\n    });\n\n    const nrOnError = window.onerror;\n    window.onerror = function () {\n        if (nrOnError) {\n            nrOnError.apply(nrOnError, arguments);\n        }\n        stashLogger.error(arguments);\n        return true; // stash logger will handle and log it\n    };\n}\n\nexport default {\n    name: 'setup-error-handling',\n    initialize: initialize\n};\n","export default {\n    name: 'setup-monitoring-instance',\n    initialize(instance) {\n        // Force instantiation of the monitoring service by looking it up\n        instance.lookup('service:monitoring');\n    }\n};\n","function hasQueryParam(param) {\n    const search = window.location.search;\n\n    if (!search) {\n        return false;\n    }\n\n    const params = new URLSearchParams(window.location.search);\n\n    return params.get(param) === 'true';\n}\n\nexport function initialize(instance) {\n    ['disableSoftphone', 'disableProactiveDevicePermissions'].forEach(param => {\n        if (hasQueryParam(param)) {\n            const webrtc = instance.lookup('service:webrtc');\n            webrtc.logger.info(`Setting webrtc.${param} to true based on query param`);\n            webrtc.set(param, true);\n        }\n    });\n}\n\nexport default {\n    name: 'webrtc',\n    initialize\n};\n","import { inject as service } from '@ember/service';\nimport EmberObject, { computed, get } from '@ember/object';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nconst TARGET_PRESENCE = Object.freeze({\n    BUSY: 'busy',\n    MEETING: 'meeting',\n    OFFLINE: 'offline'\n});\n\nexport default EmberObject.extend(LoggerMixin, {\n    intl: service(),\n    application: service(),\n    mediaProviders: service(),\n\n    // Required props\n\n    /**\n     * User associated with this media provider instance (usually the current UI session user)\n     */\n    user: null,\n\n    /**\n     * Type of media provider\n     * Currently only \"video\"\n     */\n    type: null,\n\n    /**\n     * Unique id among the video provider implementations\n     */\n    id: null,\n\n    /**\n     * Label for the media provider (can be a computed property)\n     */\n    label: null,\n\n    /**\n     * Used to store stateful data that can be used in the UI\n     */\n    data: null,\n\n    /**\n     * Path to an image used to launch a video chat inside of the video panel\n     */\n    launchVideoImage: computed(function () {\n        return '';\n    }),\n\n    disabled: computed(\n        'user',\n        'room.oneToOneTarget',\n        'room.oneToOneTarget.activities.{presence}',\n        'user.activities.{presence}',\n        function () {\n            let presence = this.getTargetPresence();\n            return (\n                presence === TARGET_PRESENCE.BUSY ||\n                presence === TARGET_PRESENCE.MEETING ||\n                presence === TARGET_PRESENCE.OFFLINE\n            );\n        }\n    ),\n\n    disabledMessage: computed('disabled', 'user.name', 'room.oneToOneTarget.name', function () {\n        let presence = this.getTargetPresence();\n        let name = this.get('user.name') || this.get('room.oneToOneTarget.name');\n        if (presence === TARGET_PRESENCE.OFFLINE) {\n            return this.intl.t('ewc.userOffline', { name });\n        }\n        if (presence === TARGET_PRESENCE.BUSY || presence === TARGET_PRESENCE.MEETING) {\n            return this.intl.t('ewc.userBusy', { name });\n        }\n        return this.intl.t('common.disabled');\n    }),\n\n    getTargetPresence() {\n        let user = this.user;\n        let room = this.room;\n\n        if (user) {\n            const gcPresence = user.get('primaryPresence');\n            if (gcPresence) {\n                return (get(gcPresence, 'presenceDefinition.systemPresence') || '').toLowerCase();\n            }\n        }\n        if (room && room.get('oneToOneTarget')) {\n            const profile = room.get('oneToOneTarget');\n            const chatUserPresence = profile.get('primaryPresence');\n            if (chatUserPresence) {\n                return (get(chatUserPresence, 'presenceDefinition.systemPresence') || '').toLowerCase();\n            }\n        }\n        return '';\n    },\n\n    // Optional props\n\n    /**\n     * Optional chat room\n     * If you have a media provider that associates itself with a room (video),\n     * you can set this property to hold that state\n     */\n    room: null,\n\n    /**\n     * Optional handler (can be async)\n     * If the provider needs to handle user action (clicking something in the interface)\n     * then you can provider that function here\n     */\n    action: () => {},\n\n    /**\n     * Optional data loader\n     */\n    loadData: () => {},\n\n    /**\n     * Optional handler\n     * If your media provider action could not be run, this handler will be called\n     * It can be used to show an error notification\n     */\n    showRunErrorNotification: () => {},\n\n    /**\n     * Indicates if this provider is available as a feature to the current user.\n     * Implementations can utilize feature toggles, org settings, user access controls, etc.\n     * as needed.\n     *\n     * Used to provide access to various parts of the UI for a media provider\n     * Currently mostly used for chat widget rendering and video dropdowns\n     */\n    haveAccess: computed(function () {\n        return true;\n    }),\n\n    isActive: computed('id', 'mediaProviders.activeProvider', function () {\n        const active = this.get('mediaProviders.activeProvider');\n        return active && active.get('id') === this.id;\n    }),\n\n    notification: computed(function () {\n        return null;\n    }),\n\n    // Internal API below\n\n    /**\n     * Check if we can run an action based on current provider state\n     * For example, you cannot join a second video call while on video\n     */\n    canRunAction(options) {\n        if (this.type !== 'video') {\n            return true;\n        }\n\n        if (this.get('mediaProviders.usingVideoProvider') || this.get('webrtc.activeRoom.showingVideo')) {\n            if (options.allowMultipleMeetings) {\n                return true;\n            }\n            this.logger.warn('Media Provider: Cannot run video action while on video', {\n                provider: this\n            });\n            return false;\n        } else if (this.get('application.isPopout')) {\n            this.logger.warn('Media Provider: Cannot run video action while in popout', {\n                provider: this\n            });\n            return false;\n        }\n\n        return true;\n    },\n\n    /**\n     * Grabs the jid for a user or room. Method is used in the purecloud, teams, and zoom provider\n     * classes.\n     * @param {*} options\n     * @returns string (jid) or undefined\n     */\n    getJid(options) {\n        let user = this.user;\n        if (!user && options) {\n            user = options.user;\n        }\n        let jid;\n        if (user) {\n            // user could be different types of entities, so access jid both ways\n            jid = user.get('chat.jabberId') || user.get('jid');\n        } else if (this.room) {\n            jid = this.get('room.jid');\n        }\n        return jid;\n    },\n\n    init() {\n        this._super(...arguments);\n\n        const originalAction = this.action;\n        this.action = async function action(options = {}) {\n            const _options = Object.assign(options, {\n                user: this.user\n            });\n\n            if (!this.canRunAction(options) && this.showRunErrorNotification) {\n                this.showRunErrorNotification(options);\n                return;\n            }\n\n            if (this.haveEmbeddedClientAccess) {\n                this.mediaProviders.set('activeProvider', this);\n            }\n            try {\n                await originalAction.apply(this, [_options]);\n            } catch (err) {\n                this.mediaProviders.set('activeProvider', null);\n                this.logger.error('Media Provider: Error running video action', {\n                    err,\n                    provider: this.id\n                });\n            }\n        }.bind(this);\n    }\n});\n","import { computed, observer } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Provider from './provider';\n\nexport const PROVIDER_ID = 'purecloud';\n\nexport default Provider.extend({\n    intl: service(),\n    chat: service(),\n    webrtc: service(),\n    sidebar: service(),\n    application: service(),\n    mediaProviders: service(),\n\n    id: PROVIDER_ID,\n    data: {},\n    type: 'video',\n\n    init() {\n        this._super(...arguments);\n\n        this.get('webrtc.activeRoom.showingVideo');\n    },\n\n    launchVideoImage: computed('application.urlprefix', function () {\n        return `${this.get('application.urlprefix')}assets/images/svg/Genesys_Cloud-Expanded-landscape-color.svg`;\n    }),\n\n    haveAccess: computed('user.profile.content', 'room', 'webrtc.videoCallCapable', function () {\n        if (!this.get('webrtc.videoCallCapable')) {\n            return false;\n        }\n\n        let user = this.get('room.oneToOneTarget') || this.get('user.profile.content');\n        if (!user) {\n            // GC video should just generally always be available\n            return true;\n        }\n\n        return !user.get('isOffline');\n    }),\n\n    action(options) {\n        let jid = this.getJid(options);\n        this.application.openChatRoomWithVideo(jid, false);\n    },\n\n    label: computed(function () {\n        return this.intl.t('mediaProviders.purecloud.label').toString();\n    }),\n\n    showingVideoChanged: observer('webrtc.activeRoom.showingVideo', function () {\n        if (!this.get('webrtc.activeRoom.showingVideo') && this.isActive) {\n            this.set('mediaProviders.activeProvider', null);\n        }\n    })\n});\n","import { computed } from '@ember/object';\nimport { readOnly } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport LoggerMixin from '../mixins/logger';\nimport Provider from './provider';\n\n// app id from integration definition\nconst APPS_ID = 'premium-app-ms-teams';\n\nexport default Provider.extend(LoggerMixin, {\n    apps: service(),\n    chat: service(),\n    intl: service(),\n    ajax: service(),\n    webrtc: service(),\n    sidebar: service(),\n    session: service(),\n    application: service(),\n    permissions: service(),\n    mediaProviders: service(),\n    notificationService: service('notification'),\n    phoneIntegrations: service(),\n\n    /**\n     * Teams provider id.\n     * Will be used in chat service's sendVideoProviderNotification method. 'id' will\n     * be the stanza name which will render the teams-notification component for Teams.\n     */\n    id: 'teams',\n    type: 'video',\n    /**\n     * web-directory component that will render the Teams client app in an iframe that we will use\n     * for communicating from web-directory -> Teams client app. Will allow us to create Teams meetings\n     * from '/teams' command and the media-providers/video-dropdown component. This component is rendered\n     * in the video-panel\n     */\n    component: null,\n\n    settings: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.set('settings', {});\n    },\n\n    /**\n     * Provider launch image. Would be rendered in webrtc panel.\n     * Note: we are not currently supporting 3rd Party embedded video, therefore, this\n     * property is not technically needed but may be required in the future.\n     */\n    launchVideoImage: computed(function () {\n        return 'https://inin-static-assets.s3.amazonaws.com/msteams-integration/msteams-icon.png';\n    }),\n\n    /**\n     * Provider label\n     */\n    label: computed(function () {\n        return this.intl.t('mediaProviders.teams.label').toString();\n    }),\n\n    profile: computed('user.profile.content', 'user.profile.content.preferences.preferences.@each.value', function () {\n        return this.get('user.profile.content');\n    }),\n\n    haveAccess: readOnly('permissions.canViewTeamsMeetings'),\n\n    /**\n     * This is remnant from Zoom provider. Leaving it here and defaulting as false as we\n     * may implement a MS Teams Meeting embedded within Genesys Cloud.\n     */\n    haveEmbeddedClientAccess: false,\n\n    /**\n     * Data is used in chat service's sendVideoProviderNotification method to build stanza.\n     * This is set during runtime.\n     */\n    data: computed('profile', 'user.id', function () {\n        return {};\n    }),\n\n    notification: computed('data', function () {\n        let key = 'mediaProviders.teams.defaultNotification';\n        return this.intl.t(key, { meetingUrl: this.get('data.url') }).toString();\n    }),\n\n    /**\n     * Show error when trying to run a meeting.\n     * Note: we are not currently supporting 3rd Party embedded video, therefore, this\n     * method is not technically needed but may be required in the future.\n     * @param {*} options\n     * @returns\n     */\n    showRunErrorNotification(options) {\n        if (this.get('mediaProviders.usingVideoProvider') || this.get('webrtc.activeRoom.showingVideo')) {\n            if (options.allowMultipleMeetings) {\n                return true;\n            }\n            let title = this.intl.t('mediaProviders.zoom.cannotJoinMeeting');\n            let message = this.intl.t('mediaProviders.zoom.noDoubleVideo');\n            this.notificationService.error(title, message);\n            return;\n        } else if (this.get('application.isPopout')) {\n            let title = this.intl.t('mediaProviders.zoom.errors.cannotJoinPopout.title');\n            let message = this.intl.t('mediaProviders.zoom.errors.cannotJoinPopout.message');\n            this.notificationService.error(title, message);\n            return;\n        }\n    },\n\n    /**\n     * Action called by the UI hooks to launch video. Options are an optional property.\n     * @param {object} [options=undefined]\n     * @param {string} options.meetingId\n     * @param {string} options.password\n     * @param {string} options.url\n     * @param {array} options.participants\n     * @param {boolean} [options.sendNotification]\n     * @param {boolean} [options.allowMultipleMeetings]\n     */\n    // eslint-disable-next-line no-unused-vars\n    async action(options) {\n        // no access to Teams meetings\n        if (!this.haveAccess) {\n            return;\n        }\n\n        try {\n            // create the Teams meeting and update the 'data' property\n            await this.createMeetingAndUpdateData();\n        } catch (err) {\n            throw err;\n        }\n    },\n\n    /**\n     * Calls back into media providers because the Teams frame registers itself\n     * as the handler to create meetings using IFC. Done in order to centralize\n     * logic for creating meetings.\n     */\n    async createTeamsMeeting() {\n        let room = this.room || this.get('chat.activeRoom');\n\n        // Use the user's room as the target for the message if we are targetting 1-1 from\n        // their profile\n        if (this.user && this.get('user.id') !== this.get('session.user.id')) {\n            try {\n                const jid = this.getJid();\n                room = await this.chat.loadChatRoom(jid);\n            } catch (error) {\n                this.logger.warn(\n                    'media-providers/teams.createTeamsMeeting: Error getting chat room for setting status message',\n                    { error }\n                );\n            }\n        }\n\n        this.setTextareaStatus(this.intl.t('mediaProviders.teams.creatingTeamsMeeting'), room);\n        return this.mediaProviders\n            .createTeamsMeeting({\n                title: 'Genesys Instant Meeting',\n                agenda: 'Genesys Instant Meeting',\n                scheduled: false\n            })\n            .finally(() => {\n                this.setTextareaStatus(null, room);\n            });\n    },\n\n    showErrorToast() {\n        let title = this.intl.t('mediaProviders.teams.errors.createError.title');\n        let message = this.intl.t('mediaProviders.teams.errors.createError.message');\n        this.notificationService.error(title, message, {\n            clickHandler: () => {\n                // if the user clicks the notification, we will open the Teams Client app\n                // in the Apps panel\n                const sidebar = this.sidebar;\n                let apps = this.apps;\n                apps.get('widgetAppPool')\n                    .findAllApps()\n                    .then(apps => {\n                        let appInstance = apps.find(app => app.get('typeId') === APPS_ID);\n                        if (appInstance) {\n                            let appId = appInstance.get('id');\n                            sidebar.openPanel(appId);\n                        }\n                    });\n            }\n        });\n    },\n\n    async createMeetingAndUpdateData() {\n        try {\n            // make api request to create the meeting\n            const { joinUrl, id } = await this.phoneIntegrations.createInstantMeeting('microsoftteams');\n            const userId = this.get('user.id');\n            const message = this.intl.t('mediaProviders.teams.defaultNotification', { meetingUrl: joinUrl }).toString();\n            const teamsData = {\n                meetingId: id,\n                url: joinUrl,\n                userId\n            };\n            // send the chat message\n            // Collab chat frame will receive the Realtime message event to show the new message\n            await this.chat.sendIntegrationVideoMessage(userId, this.id, message, teamsData);\n        } catch (err) {\n            this.showErrorToast();\n            this.logger.error(err);\n            throw err;\n        }\n    },\n\n    setTextareaStatus(message, room = null) {\n        let activeRoom = this.get('chat.activeRoom');\n\n        if (room) {\n            room.set('textareaStatus', message);\n        } else if (activeRoom) {\n            activeRoom.set('textareaStatus', message);\n        }\n    }\n});\n","export function queryParamsToObject(params) {\n    if (!params) {\n        return {};\n    }\n\n    return params.split('&').reduce((acc, param) => {\n        let keyValue = param.split('=');\n        if (keyValue.length === 2) {\n            let [key, value] = keyValue;\n            acc[key] = value;\n        }\n        return acc;\n    }, {});\n}\n\nexport function buildAuthUrl(baseUrl, authConfig) {\n    let query = Object.keys(authConfig)\n        .map(key => {\n            let value = authConfig[key];\n            return `${key}=${value}`;\n        })\n        .join('&');\n    return `${baseUrl}?${query}`;\n}\n\nexport function performIframeAuth(authUrl, authConfig) {\n    return new Promise((resolve, reject) => {\n        let url = buildAuthUrl(authUrl, authConfig);\n\n        let iframe = document.createElement('iframe');\n        iframe.style = 'height:0;width:0;position:absolute;z-index:0';\n        iframe.src = url;\n        document.body.appendChild(iframe);\n\n        let timer, cancelTimer;\n\n        timer = setInterval(function () {\n            try {\n                if (iframe) {\n                    let hash = iframe.contentWindow.location.hash;\n                    let search = iframe.contentWindow.location.search;\n                    if (hash) {\n                        let params = queryParamsToObject(hash.substring(1));\n                        let accessToken = params['access_token'];\n                        if (accessToken) {\n                            document.body.removeChild(iframe);\n                            clearInterval(timer);\n                            clearTimeout(cancelTimer);\n                            resolve(accessToken);\n                        }\n                    }\n                    if (search) {\n                        let params = queryParamsToObject(search.substring(1));\n                        let code = params['code'];\n                        if (code) {\n                            clearInterval(timer);\n                            clearTimeout(cancelTimer);\n                            document.body.removeChild(iframe);\n                            resolve(code);\n                        }\n                    }\n                }\n            } catch (e) {\n                // Ignore for now\n            }\n        }, 20);\n\n        // After 5 seconds, if we havent resolved, exit\n        // A properly authed client shouldnt take long on the redirect\n        cancelTimer = setTimeout(function () {\n            window.clearTimeout(cancelTimer);\n            window.clearInterval(timer);\n            reject(new Error('Timeout'));\n        }, 5000);\n    });\n}\n","import { readOnly } from '@ember/object/computed';\nimport { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Provider from './provider';\n\nexport default Provider.extend({\n    apps: service(),\n    chat: service(),\n    intl: service(),\n    ajax: service(),\n    webrtc: service(),\n    sidebar: service(),\n    session: service(),\n    application: service(),\n    permissions: service(),\n    mediaProviders: service(),\n    notificationService: service('notification'),\n    logger: service('stash-logger'),\n    phoneIntegrations: service(),\n\n    id: 'zoom',\n    type: 'video',\n    component: null,\n\n    settings: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.set('settings', {});\n    },\n\n    launchVideoImage: computed(function () {\n        return 'https://inin-static-assets.s3.amazonaws.com/zoom-integration/zoom-lg.png';\n    }),\n\n    label: computed(function () {\n        return this.intl.t('mediaProviders.zoom.label').toString();\n    }),\n\n    profile: computed('user.profile.content', 'user.profile.content.preferences.preferences.@each.value', function () {\n        return this.get('user.profile.content');\n    }),\n\n    haveAccess: readOnly('permissions.canViewZoomMeetings'),\n\n    haveEmbeddedClientAccess: false,\n\n    // Data is used by the chat widget sender to build stanza\n    // This is set during runtime\n    data: computed('profile', 'user.id', function () {\n        return {};\n    }),\n\n    notification: computed('data', function () {\n        let key = 'mediaProviders.zoom.defaultNotification';\n        return this.intl.t(key, { meetingUrl: this.get('data.url') }).toString();\n    }),\n\n    showRunErrorNotification(options) {\n        if (this.get('mediaProviders.usingVideoProvider') || this.get('webrtc.activeRoom.showingVideo')) {\n            if (options.allowMultipleMeetings) {\n                return true;\n            }\n            let title = this.intl.t('mediaProviders.zoom.cannotJoinMeeting');\n            let message = this.intl.t('mediaProviders.zoom.noDoubleVideo');\n            this.notificationService.error(title, message);\n            return;\n        } else if (this.get('application.isPopout')) {\n            let title = this.intl.t('mediaProviders.zoom.errors.cannotJoinPopout.title');\n            let message = this.intl.t('mediaProviders.zoom.errors.cannotJoinPopout.message');\n            this.notificationService.error(title, message);\n            return;\n        }\n    },\n\n    /**\n     * Action called by the UI hooks to launch video. Options are an optional property.\n     * @param {object} [options=undefined]\n     * @param {string} options.meetingId\n     * @param {string} options.password\n     * @param {string} options.url\n     * @param {array} options.participants\n     * @param {boolean} [options.sendNotification]\n     * @param {boolean} [options.allowMultipleMeetings]\n     */\n    async action() {\n        if (!this.haveAccess) {\n            return;\n        }\n\n        try {\n            await this.createMeetingAndUpdateData();\n        } catch (err) {\n            throw err;\n        }\n    },\n\n    /**\n     * Calls back into media providers because the zoom frame registers itself\n     * as the handler to create meetings using IFC. Done in order to centralize\n     * logic for creating meetings.\n     */\n    async createZoomMeeting() {\n        let room = this.room || this.get('chat.activeRoom');\n\n        // Use the user's room as the target for the message if we are targetting 1-1 from\n        // their profile\n        if (this.user && this.get('user.id') !== this.get('session.user.id')) {\n            try {\n                const jid = this.getJid();\n                room = await this.chat.loadChatRoom(jid);\n            } catch (error) {\n                this.logger.warn('Error getting chat room for setting status message', { error });\n            }\n        }\n\n        this.setTextareaStatus(this.intl.t('mediaProviders.zoom.creatingZoomMeeting'), room);\n        return this.mediaProviders\n            .createZoomMeeting({\n                title: 'Genesys Instant Meeting',\n                agenda: 'Genesys Instant Meeting',\n                scheduled: false\n            })\n            .finally(() => {\n                this.setTextareaStatus(null, room);\n            });\n    },\n\n    showErrorToast() {\n        let title = this.intl.t('mediaProviders.zoom.errors.createError.title');\n        let message = this.intl.t('mediaProviders.zoom.errors.createError.message');\n        this.notificationService.error(title, message, {\n            clickHandler: () => {\n                const sidebar = this.sidebar;\n                let apps = this.apps;\n                apps.get('widgetAppPool')\n                    .findAllApps()\n                    .then(apps => {\n                        let appInstance = apps.find(app => app.get('typeId') === 'premium-app-zoom');\n                        if (appInstance) {\n                            let appId = appInstance.get('id');\n                            sidebar.openPanel(appId);\n                        }\n                    });\n            }\n        });\n    },\n\n    async createMeetingAndUpdateData() {\n        try {\n            // make api request to create the meeting\n            const { joinUrl, id } = await this.phoneIntegrations.createInstantMeeting('zoomphone');\n            const userId = this.get('user.id');\n            const message = this.intl.t('mediaProviders.zoom.defaultNotification', { meetingUrl: joinUrl }).toString();\n            const zoomData = {\n                meetingId: id,\n                url: joinUrl,\n                userId\n            };\n            // send the chat message\n            // Collab chat frame will receive the Realtime message event to show the new message\n            await this.chat.sendIntegrationVideoMessage(userId, this.id, message, zoomData);\n        } catch (err) {\n            this.showErrorToast();\n            this.logger.error(err);\n            throw err;\n        }\n    },\n\n    setTextareaStatus(message, room = null) {\n        let activeRoom = this.get('chat.activeRoom');\n\n        if (room) {\n            room.set('textareaStatus', message);\n        } else if (activeRoom) {\n            activeRoom.set('textareaStatus', message);\n        }\n    }\n});\n","import { later } from '@ember/runloop';\nimport { getOwner } from '@ember/application';\nimport { get, set } from '@ember/object';\nimport { reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport Mixin from '@ember/object/mixin';\nimport _ from 'lodash';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nexport default Mixin.create(LoggerMixin, {\n    notification: service(),\n    intl: service(),\n    session: service(),\n\n    personGuid: reads('session.person.guid'),\n\n    // TODO: Ultimately, we need to store these values somewhere other\n    // than the model. We may introduce a persistance service that will\n    // allow us to store interaction properties by id and persist them\n    // back to the public API via the preference API.\n    modelSet(model, property, value) {\n        if (model && !get(model, 'isDestroyed') && !get(model, 'isDestroying')) {\n            model.set(property, value);\n        }\n    },\n\n    _displayApiError(error, fallbackMessageKey) {\n        const code = _.get(error, 'responseJSON.code');\n        const key = code && `error.${code}`;\n        this._displayError(key && this.intl.exists(key) ? key : fallbackMessageKey);\n    },\n\n    _displayError(messageKey, messageKeyOption) {\n        const message = this.intl.t(messageKey, messageKeyOption).toString();\n        this.notification.error(null, message, {});\n    },\n\n    _displayNotification(titleKey, messageKey) {\n        let title = null;\n        let message = null;\n\n        if (titleKey) {\n            title = this.intl.t(titleKey).toString();\n        }\n\n        if (messageKey) {\n            message = this.intl.t(messageKey).toString();\n        }\n\n        this.notification.info(title, message);\n    },\n\n    _isInDOM() {\n        const isDestroyed =\n            this.isDestroyed ||\n            this.isDestroying ||\n            !this.interaction ||\n            this.get('interaction.isDestroyed') ||\n            this.get('interaction.isDestroying');\n\n        if (isDestroyed) {\n            return false;\n        } else if (this.get('interaction.isCall')) {\n            const conversation = this.get('interaction.conversation');\n            const conversationIsDestroyed =\n                !conversation || conversation.get('isDestroying') || conversation.get('isDestroyed');\n            if (conversationIsDestroyed) {\n                return false;\n            }\n        }\n\n        return true;\n    },\n\n    getInteractionTypeFromCP(interaction) {\n        let type = {\n            isCall: false,\n            isFax: false,\n            isChat: false,\n            isEmail: false,\n            isCallback: false,\n            isSms: false\n        };\n        const myselfAgent = _.findLast(interaction.participants, party => {\n            let partyIsUser = _.has(party, 'userId') ? party.userId === this.personGuid : false;\n            let partyIsAgent = _.has(party, 'purpose') ? party.purpose.toLowerCase() === 'agent' : false;\n            return partyIsUser && partyIsAgent;\n        });\n        type.isCallback = myselfAgent ? _.has(myselfAgent, 'callbacks') && myselfAgent.callbacks.length : false;\n        type.isCall = _.some(interaction.participants, party => !_.isEmpty(party.calls));\n        type.isFax = _.some(interaction.participants, party =>\n            _.has(party, 'purpose') ? party.purpose === 'fax' : false\n        );\n        type.isChat = _.some(interaction.participants, party => !_.isEmpty(party.chats));\n        type.isEmail = _.some(interaction.participants, party => !_.isEmpty(party.emails));\n        type.isSms = _.some(interaction.participants, party => !_.isEmpty(party.messages));\n\n        return type;\n    },\n\n    handleMissedTimedBoxTimer(ctx, payload, Interaction, conversationModel) {\n        try {\n            // ownerInjection() must be the first arg in Ember 3.28\n            const tmpInteractionModel = Interaction.create(getOwner(ctx).ownerInjection());\n            Object.keys(payload).forEach(key => {\n                tmpInteractionModel.set(key, payload[key]);\n            });\n\n            if (tmpInteractionModel && conversationModel) {\n                set(tmpInteractionModel, 'conversation', conversationModel);\n            }\n\n            const interactionHasMissedTimer = get(tmpInteractionModel, 'hasMissedTimer');\n\n            if (tmpInteractionModel && interactionHasMissedTimer) {\n                const titleKey = 'purecloud.acdInteraction.aftercallworkTitleMessage';\n                const messageKey = 'purecloud.acdInteraction.aftercallworkTimerExpiredBodyMessage';\n                this._displayNotification(titleKey, messageKey);\n            }\n            if (tmpInteractionModel) {\n                later(() => {\n                    tmpInteractionModel.destroy();\n                });\n            }\n        } catch (error) {\n            this.logger.info('ACD: handleMissedBoxTimer error', { error });\n        }\n    },\n\n    windowInFocus() {\n        var hosted;\n        hosted = this.get('applicationService.hostedContext');\n        if (hosted != null ? hosted.isHosted() : void 0) {\n            return hosted.applicationHasFocus();\n        } else {\n            return document.hasFocus();\n        }\n    },\n\n    timeDiff(timeCreated) {\n        const diff = Date.now() - new Date(timeCreated).getTime();\n        if (diff < 500) {\n            this.logger.info('ACD: interaction create destroy diff', { diff });\n        }\n    }\n});\n","import { notEmpty, reads, and, bool } from '@ember/object/computed';\nimport Mixin from '@ember/object/mixin';\nimport { computed } from '@ember/object';\nimport { inject } from '@ember/service';\n\nfunction maybeLowerCase(str) {\n    return str && str.toLowerCase();\n}\n\nexport default Mixin.create({\n    conversationModeService: inject('modes/conversation-mode-service'),\n\n    notes: null,\n    selectedWrapupCode: null,\n    wrapupNotSaved: true,\n    oldWrapupCode: null,\n    skipAfterCallWork: false,\n    isAfterCallWorkTimerExpired: false,\n\n    isWrapupCodeSet: notEmpty('selectedWrapupCode'),\n    isNotesSet: notEmpty('notes'),\n    activeCallWorkCompleted: reads('participantForCurrentUser.wrapup.code'),\n\n    activeCallWorkNeeded: computed('activeCallWorkCompleted', 'participantForCurrentUser.wrapupRequired', function () {\n        return !this.activeCallWorkCompleted && this.get('participantForCurrentUser.wrapupRequired');\n    }),\n\n    /**\n     * Whether the org has communication-based ACW enabled.\n     * In Modes, reads from conversation-mode-service which fetches and caches\n     * the setting on each new interaction (mirrors legacy interaction component\n     * calling fetchCommunicationBasedACWSetting on each interaction selection).\n     * In legacy, reads from the interaction service directly.\n     */\n    canUseCommunicationACW: computed(\n        'session.useModes',\n        'interaction.orgLevelConversationsSettings.communicationBasedACW',\n        'conversationModeService.orgLevelConversationsSettings.communicationBasedACW',\n        function () {\n            if (this.get('session.useModes')) {\n                return this.get('conversationModeService.orgLevelConversationsSettings.communicationBasedACW');\n            }\n            return this.get('interaction.orgLevelConversationsSettings.communicationBasedACW');\n        }\n    ),\n\n    canAgentRequestACW: and('canUseCommunicationACW', 'useCommunicationACW', 'isWrapupPromptAgentRequested'),\n\n    useCommunicationACW: computed('canUseCommunicationACW', 'isWrapupPromptAgentRequested', function () {\n        if (this.canUseCommunicationACW && this.isWrapupPromptAgentRequested) {\n            return true;\n        }\n\n        return this.canUseCommunicationACW;\n    }),\n\n    isAfterCallWorkCompleted: computed(\n        'participantForCurrentUser.wrapup',\n        'participantForCurrentUser.wrapupRequired',\n        'skipAfterCallWork',\n        'isCommunicationAfterCallWorkCompleted',\n        'useCommunicationACW',\n        function () {\n            if (this.useCommunicationACW) {\n                return this.isCommunicationAfterCallWorkCompleted;\n            }\n\n            if (!this.get('participantForCurrentUser.wrapupRequired')) {\n                return true;\n            } else if (this.get('participantForCurrentUser.wrapup') || this.skipAfterCallWork) {\n                return true;\n            }\n            return false;\n        }\n    ),\n\n    communicationMedia: computed(\n        'participantForCurrentUser.calls.firstObject.wrapup',\n        'participantForCurrentUser.chats.firstObject.wrapup',\n        'participantForCurrentUser.emails.firstObject.wrapup',\n        'participantForCurrentUser.messages.firstObject.wrapup',\n        'participantForCurrentUser.callbacks.firstObject.wrapup',\n        'isChat',\n        'isCall',\n        'isCallback',\n        'isEmail',\n        'isSms',\n        function () {\n            let communicationObj = null;\n            if (this.isCall) {\n                communicationObj = this.get('participantForCurrentUser.calls.firstObject');\n            } else if (this.isChat) {\n                communicationObj = this.get('participantForCurrentUser.chats.firstObject');\n            } else if (this.isEmail) {\n                communicationObj = this.get('participantForCurrentUser.emails.firstObject');\n            } else if (this.isSms) {\n                communicationObj = this.get('participantForCurrentUser.messages.firstObject');\n            } else if (this.isCallback) {\n                communicationObj = this.get('participantForCurrentUser.callbacks.firstObject');\n            }\n            return communicationObj;\n        }\n    ),\n\n    isCommunicationAfterCallWorkCompleted: computed(\n        'communicationMedia.wrapup',\n        'participantForCurrentUser.wrapupRequired',\n        'skipAfterCallWork',\n        'canAgentRequestACW',\n        function () {\n            if (this.canAgentRequestACW) {\n                if (!this.get('communicationMedia.afterCallWorkRequired')) {\n                    return true;\n                }\n            } else if (!this.get('participantForCurrentUser.wrapupRequired')) {\n                return true;\n            }\n\n            return !!this.get('communicationMedia.wrapup') || this.skipAfterCallWork;\n        }\n    ),\n\n    isCommunicationAfterCallWorkRequested: bool('connectedCommunication.afterCallWorkRequired'),\n\n    isAfterCallWorkMandatory: computed(\n        'isCall',\n        'conversation.isAfterCallWorkMandatory',\n        'isCallback',\n        'needsCallWrapUp',\n        'participantForCurrentUser.wrapupPrompt',\n        'isNonDiscretionaryCompletion',\n        'canUseCommunicationACW',\n        'dialerPreview',\n        function () {\n            const wrapupPrompt = (this.get('participantForCurrentUser.wrapupPrompt') || '').toLowerCase();\n            if (this.isCallback) {\n                return wrapupPrompt === 'mandatory' || this.dialerPreview;\n            } else if (this.needsCallWrapUp) {\n                return true;\n            } else if (this.isCall) {\n                return this.get('conversation.isAfterCallWorkMandatory');\n            } else {\n                if (this.canUseCommunicationACW) {\n                    return wrapupPrompt === 'mandatory' || this.isNonDiscretionaryCompletion;\n                }\n                return wrapupPrompt === 'mandatory' || wrapupPrompt === 'timeout' || wrapupPrompt === 'forcedtimeout';\n            }\n        }\n    ),\n\n    isAfterCallWorkForcedTimeout: computed(\n        'isCall',\n        'conversation.isAfterCallWorkForcedTimeout',\n        'participantForCurrentUser.wrapupPrompt',\n        'canUseCommunicationACW',\n        function () {\n            if (this.isCall) {\n                return this.get('conversation.isAfterCallWorkForcedTimeout');\n            } else {\n                if (this.canUseCommunicationACW) {\n                    const prompt = (this.get('participantForCurrentUser.wrapupPrompt') || '').toLowerCase();\n                    return this.get('participantForCurrentUser.wrapupTimeoutMs') && prompt === 'forcedtimeout';\n                } else {\n                    return false;\n                }\n            }\n        }\n    ),\n\n    isAfterCallWorkTimeout: computed(\n        'isCall',\n        'conversation.isAfterCallWorkTimeout',\n        'participantForCurrentUser.wrapupPrompt',\n        'canUseCommunicationACW',\n        function () {\n            if (this.isCall) {\n                return this.get('conversation.isAfterCallWorkTimeout');\n            } else {\n                if (this.canUseCommunicationACW) {\n                    const prompt = (this.get('participantForCurrentUser.wrapupPrompt') || '').toLowerCase();\n                    return this.get('participantForCurrentUser.wrapupTimeoutMs') && prompt === 'timeout';\n                } else {\n                    return false;\n                }\n            }\n        }\n    ),\n\n    isNonDiscretionaryCompletion: computed(\n        'isCall',\n        'conversation.isNonDiscretionaryCompletion',\n        'isWrapupPromptAgentRequested',\n        'isAfterCallWorkForcedTimeout',\n        'isAfterCallWorkTimeout',\n        'canUseCommunicationACW',\n        function () {\n            if (this.isCall) {\n                return this.get('conversation.isNonDiscretionaryCompletion');\n            } else {\n                if (this.canUseCommunicationACW) {\n                    return (\n                        this.isAfterCallWorkForcedTimeout ||\n                        this.isAfterCallWorkTimeout ||\n                        this.isWrapupPromptAgentRequested\n                    );\n                } else {\n                    return false;\n                }\n            }\n        }\n    ),\n\n    isWrapupPromptAgentRequested: computed('participantForCurrentUser.wrapupPrompt', function () {\n        const wrapupPrompt = maybeLowerCase(this.get('participantForCurrentUser.wrapupPrompt'));\n        return wrapupPrompt === 'agentrequested';\n    }),\n\n    hasMissedTimer: computed('participantForCurrentUser.wrapup.code', 'isNonDiscretionaryCompletion', function () {\n        return (\n            this.get('participantForCurrentUser.wrapup.code') === 'ININ-WRAP-UP-TIMEOUT' &&\n            this.isNonDiscretionaryCompletion\n        );\n    })\n});\n","import { reads } from '@ember/object/computed';\nimport { computed, get } from '@ember/object';\nimport Mixin from '@ember/object/mixin';\nimport participantStatus from 'web-directory/utils/acdParticipantStatuses';\n\nexport default Mixin.create({\n    isParked: computed('interactionState', function () {\n        if (!this.interactionState) {\n            return false;\n        }\n        return this.interactionState.toLowerCase() === participantStatus.PARKED.toLowerCase();\n    }),\n\n    isDisconnected: computed('interactionState', function () {\n        if (!this.interactionState) {\n            return false;\n        }\n        return this.interactionState.toLowerCase() === participantStatus.DISCONNECTED.toLowerCase();\n    }),\n\n    isConnected: computed('interactionState', function () {\n        if (!this.interactionState) {\n            return false;\n        }\n        return this.interactionState.toLowerCase() === participantStatus.CONNECTED.toLowerCase();\n    }),\n\n    isAlerting: computed('interactionState', function () {\n        if (!this.interactionState) {\n            return false;\n        }\n        return this.interactionState.toLowerCase() === participantStatus.ALERTING.toLowerCase();\n    }),\n\n    isDialing: computed('interactionState', function () {\n        if (!this.interactionState) {\n            return false;\n        }\n        return this.interactionState.toLowerCase() === participantStatus.DIALING.toLowerCase();\n    }),\n\n    isContacting: computed('interactionState', function () {\n        if (!this.interactionState) {\n            return false;\n        }\n        return this.interactionState.toLowerCase() === participantStatus.CONTACTING.toLowerCase();\n    }),\n\n    isTerminated: computed('interactionState', function () {\n        if (!this.interactionState) {\n            return false;\n        }\n        return this.interactionState.toLowerCase() === participantStatus.TERMINATED.toLowerCase();\n    }),\n\n    isTransmitting: computed('interactionState', function () {\n        if (!this.interactionState) {\n            return false;\n        }\n        return this.interactionState.toLowerCase() === participantStatus.TRANSMITTING.toLowerCase();\n    }),\n\n    isConfined: reads('participantForCurrentUser.calls.firstObject.confined'),\n\n    isHeld: computed(\n        'type',\n        'participantForCurrentUser.chats.firstObject.held',\n        'participantForCurrentUser.calls.firstObject.held',\n        'participantForCurrentUser.callbacks.firstObject.held',\n        'participantForCurrentUser.messages.firstObject.held',\n        'participantForCurrentUser.emails.firstObject.held',\n        function () {\n            const type = this.type;\n\n            switch (type) {\n                case 'call':\n                    return this.get('participantForCurrentUser.calls.firstObject.held');\n                case 'callback':\n                    return this.get('participantForCurrentUser.callbacks.firstObject.held');\n                case 'chat':\n                    return this.get('participantForCurrentUser.chats.firstObject.held');\n                case 'email':\n                    return this.get('participantForCurrentUser.emails.firstObject.held');\n                case 'message':\n                    return this.get('participantForCurrentUser.messages.firstObject.held');\n                default:\n                    return false;\n            }\n        }\n    ),\n\n    /**\n     * The state of the latest conversation.\n     *\n     * @note digital consulting - PURE-5007\n     * When the type is of `message` users can chat internally with one another through the means of\n     * digital consulting. When this occurs the `internalMessages` lives alongside `messages` in the\n     * conversation. When an agent is being consulted with through the `internalMessages`, the `messages`\n     * array will be undefined since they do not have any `messages` with the customer. All of their comms\n     * will be saved through `internalMessages`. To get the true latest state of the conversation we will look\n     * for the `messages` array first, but if undefined we will fallback and check the `internalMessages`. The\n     * fallback is mainly for the consulting agent to be alerted correctly.\n     */\n    interactionState: computed(\n        'type',\n        'participantForCurrentUser.chats.firstObject.state',\n        'participantForCurrentUser.callbacks.firstObject.state',\n        'participantForCurrentUser.calls.firstObject.state',\n        'participantForCurrentUser.emails.firstObject.state',\n        'participantForCurrentUser.messages.firstObject.state',\n        'participantForCurrentUser.internalMessages.firstObject.state',\n        'participantForCurrentUser.videos.firstObject.state',\n        function () {\n            const type = this.type;\n\n            switch (type) {\n                case 'chat':\n                    return this.get('participantForCurrentUser.chats.firstObject.state');\n                case 'call':\n                    return this.get('participantForCurrentUser.calls.firstObject.state');\n                case 'callback':\n                    return this.get('participantForCurrentUser.callbacks.firstObject.state');\n                case 'email':\n                    return this.get('participantForCurrentUser.emails.firstObject.state');\n                case 'message': {\n                    const [first] =\n                        this.get('participantForCurrentUser.messages') ||\n                        this.get('participantForCurrentUser.internalMessages') ||\n                        [];\n                    return first ? get(first, 'state') : null;\n                }\n                default:\n                    return null;\n            }\n        }\n    )\n});\n","import { inject as service } from '@ember/service';\nimport { later } from '@ember/runloop';\nimport Mixin from '@ember/object/mixin';\nimport { computed } from '@ember/object';\nimport moment from 'web-directory/utils/dates';\nimport _ from 'lodash';\n\nexport default Mixin.create({\n    logger: service('stash-logger'),\n    session: service(),\n\n    lastInteractionTime: computed('participantForCurrentUser.connectedTime', 'messages.[]', 'isEmail', function () {\n        if (this.isEmail) {\n            const mostRecentMessage = _.head(this.messages);\n            return mostRecentMessage && mostRecentMessage.get('time');\n        }\n\n        if (!this.get('participantForCurrentUser.connectedTime')) {\n            return moment();\n        }\n        return moment(this.get('participantForCurrentUser.connectedTime'));\n    }),\n\n    connectedTime: computed(\n        'participantForCurrentUser.{connectedTime,calls.firstObject.connectedTime}',\n        'isCall',\n        function () {\n            if (this.isCall && this.get('participantForCurrentUser.calls.firstObject.connectedTime')) {\n                return moment(this.get('participantForCurrentUser.calls.firstObject.connectedTime'));\n            } else if (!this.get('participantForCurrentUser.connectedTime')) {\n                return moment();\n            }\n            return moment(this.get('participantForCurrentUser.connectedTime'));\n        }\n    ),\n\n    endTime: computed(\n        'type',\n        'participantForCurrentUser.endTime',\n        'participantForCurrentUser.calls.firstObject.disconnectedTime',\n        'participantForCurrentUser.callbacks.firstObject.disconnectedTime',\n        'participantForCurrentUser.chats.firstObject.disconnectedTime',\n        'participantForCurrentUser.emails.firstObject.disconnectedTime',\n        function () {\n            let endTime;\n            const type = this.type;\n\n            switch (type) {\n                case 'chat':\n                    endTime = this.get('participantForCurrentUser.chats.firstObject.disconnectedTime');\n                    break;\n                case 'call':\n                    endTime = this.get('participantForCurrentUser.calls.firstObject.disconnectedTime');\n                    break;\n                case 'callback':\n                    endTime = this.get('participantForCurrentUser.callbacks.firstObject.disconnectedTime');\n                    break;\n                case 'email':\n                    endTime = this.get('participantForCurrentUser.emails.firstObject.disconnectedTime');\n                    break;\n                case 'message':\n                    endTime = this.get('participantForCurrentUser.messages.firstObject.disconnectedTime');\n                    break;\n            }\n            endTime = endTime || this.get('participantForCurrentUser.endTime');\n            return endTime ? moment(endTime) : null;\n        }\n    ),\n\n    alertingStartTime: computed(\n        'type',\n        'participantForCurrentUser.calls.firstObject.startAlertingTime',\n        'participantForCurrentUser.callbacks.firstObject.startAlertingTime',\n        'participantForCurrentUser.chats.firstObject.startAlertingTime',\n        'participantForCurrentUser.emails.firstObject.startAlertingTime',\n        function () {\n            let alertingStartTime;\n            const type = this.type;\n\n            switch (type) {\n                case 'chat':\n                    alertingStartTime = this.get('participantForCurrentUser.chats.firstObject.startAlertingTime');\n                    break;\n                case 'call':\n                    alertingStartTime =\n                        this.startAlertingTime ||\n                        this.get('participantForCurrentUser.calls.firstObject.startAlertingTime');\n                    if (!alertingStartTime) {\n                        alertingStartTime = moment();\n                        this.set('startAlertingTime', alertingStartTime.format());\n                    }\n                    break;\n                case 'callback':\n                    alertingStartTime = this.get('participantForCurrentUser.callbacks.firstObject.startAlertingTime');\n                    break;\n                case 'email':\n                    alertingStartTime = this.get('participantForCurrentUser.emails.firstObject.startAlertingTime');\n                    break;\n                case 'message':\n                    alertingStartTime = this.get('participantForCurrentUser.messages.firstObject.startAlertingTime');\n                    break;\n            }\n            alertingStartTime = alertingStartTime || moment();\n            return moment(alertingStartTime);\n        }\n    ),\n    // Alerting time remaing\n\n    showAlertingTimeout: computed('participantForCurrentUser.alertingTimeoutMs', 'isAlerting', function () {\n        return !!this.get('participantForCurrentUser.alertingTimeoutMs') && this.isAlerting;\n    }),\n\n    alertingTimeRemaining: computed(\n        'participantForCurrentUser.alertingTimeoutMs',\n        'isAlerting',\n        'alertingStartTime',\n        function () {\n            const timeoutValue = this.get('participantForCurrentUser.alertingTimeoutMs');\n            return moment(this.alertingStartTime).add(timeoutValue, 'milliseconds');\n        }\n    ),\n\n    // Time entered Queue\n    timeInQueue: computed('participantForQueue.{connectedTime,endTime}', function () {\n        if (!this.get('participantForQueue.endTime')) {\n            return this.get('participantForQueue.connectedTime');\n        }\n        return null;\n    }),\n\n    // Time spent in Queue duration\n    timeInQueueDuration: computed('participantForQueue.{connectedTime,endTime}', function () {\n        if (this.get('participantForQueue.endTime')) {\n            const connectedTime = this.get('participantForQueue.connectedTime');\n            const endTime = moment(this.get('participantForQueue.endTime'));\n            const elapsedTime = endTime.diff(connectedTime);\n\n            if (elapsedTime < 0) {\n                return null;\n            }\n\n            return elapsedTime;\n        }\n        return null;\n    }),\n\n    // Connected Duration timer\n    connectedDuration: computed('endTime', 'connectedTime', function () {\n        const connectedTime = this.connectedTime;\n        if (connectedTime && this.endTime) {\n            return moment(this.endTime).diff(moment(connectedTime));\n        }\n        return null;\n    }),\n\n    //On hold timer\n\n    _currentHoldMoment: null,\n\n    heldStartTime: computed('isHeld', 'isConsultParticipantHolding', function () {\n        const isConsultParticipantHolding = this.isConsultParticipantHolding;\n        const isHeld = this.isHeld;\n\n        if (isConsultParticipantHolding) {\n            // There is no timestamp for start time\n            // of a confinement in the payload so we'll cache it.\n            const _currentHoldMoment = this._currentHoldMoment;\n\n            if (_currentHoldMoment) {\n                return _currentHoldMoment;\n            }\n\n            const now = moment();\n            this.set('_currentHoldMoment', now);\n\n            return now;\n        } else if (isHeld) {\n            const holdTime = this.get('participantForCurrentUser.calls.firstObject.startHoldTime');\n            return moment(holdTime);\n        }\n\n        this.set('_currentHoldMoment', null);\n        return null;\n    }),\n\n    lastMessageTime: computed(\n        'room.messages.lastObject',\n        'latestMessage.timestamp',\n        'latestMessage.messageTime',\n        'isChat',\n        'isSms',\n        function () {\n            if (this.isChat) {\n                let last = this.get('room.messages.lastObject');\n                if (last) {\n                    return last.get('time') || null;\n                }\n                return null;\n            } else if (this.isSms) {\n                return moment(this.get('latestMessage.timestamp') || this.get('latestMessage.messageTime')).format();\n            }\n        }\n    ),\n\n    //After-call work timer\n    acwStartTimer: computed('isDisconnected', 'isTerminated', 'isNonDiscretionaryCompletion', 'endTime', function () {\n        if ((this.isDisconnected || this.isTerminated) && !this.isNonDiscretionaryCompletion && this.endTime) {\n            return moment(this.endTime);\n        }\n        return null;\n    }),\n\n    acwTimeoutTimer: computed(\n        'isDisconnected',\n        'isTerminated',\n        'isNonDiscretionaryCompletion',\n        'endTime',\n        'participantForCurrentUser.wrapupTimeoutMs',\n        'isDestroyed',\n        'isDestroying',\n        function () {\n            if ((this.isDisconnected || this.isTerminated) && this.isNonDiscretionaryCompletion) {\n                let timeoutValue = this.get('participantForCurrentUser.wrapupTimeoutMs');\n\n                const elapsedTime = moment().diff(this.endTime);\n\n                timeoutValue = elapsedTime > timeoutValue ? 0 : timeoutValue - elapsedTime;\n\n                later(() => {\n                    if (!this.isDestroyed && !this.isDestroying) {\n                        this.modelSet('isAfterCallWorkTimerExpired', true);\n                    }\n                }, timeoutValue);\n\n                return moment().add(timeoutValue, 'ms');\n            }\n            return null;\n        }\n    )\n});\n","import { readOnly, alias } from '@ember/object/computed';\nimport { computed, get } from '@ember/object';\nimport Mixin from '@ember/object/mixin';\nimport { inject } from '@ember/service';\nimport findLast from 'lodash/findLast';\nimport last from 'lodash/last';\nimport reject from 'lodash/reject';\nimport {\n    getTrueCustomerIfMultipleCustomersExist,\n    isScreenMonitoringParticipant,\n    isBargeParticipant,\n    resolveQueueToQueueVoiceParticipantForCustomer\n} from 'web-directory/utils/acd';\n\nconst MACHINE_PARTICIPANTS = ['acd', 'ivr', 'dialer.system'];\n\nconst CUSTOMER_PARTICIPANTS = ['manual', 'inbound', 'dialer', 'customer', 'external'];\n\nconst MEDIA_TYPES = ['chats', 'calls', 'callbacks', 'emails', 'screenshares', 'cobrowsesessions', 'videos'];\n\nexport default Mixin.create({\n    session: inject('session'),\n\n    /**\n     * We want to track if digital consult feature is enabled and being used. This will determine how we evaluate\n     * consulting parties in the certain situations.\n     */\n    isDigitalConsultEnabled: readOnly('session.features.PURE-5007_digitalConsult'),\n\n    isCustomerParticipant(participant) {\n        return CUSTOMER_PARTICIPANTS.includes(participant.purpose);\n    },\n\n    isMachineParticipant(participant) {\n        return MACHINE_PARTICIPANTS.includes(participant.purpose);\n    },\n\n    isAgentParticipant(participant) {\n        return participant.purpose === 'agent';\n    },\n\n    isCurrentUserOrMachineParticipant(participant) {\n        return (\n            ((participant.purpose === 'user' || participant.purpose === 'agent') &&\n                participant.userId === this.get('participantForCurrentUser.userId')) ||\n            participant.userId === this.get('session.person.guid') ||\n            this.isMachineParticipant(participant)\n        );\n    },\n\n    /**\n     * Determines who the host participant should be based on the participant array order\n     * and if the participant is an agent and is also human and connected.\n     *\n     * Currently returning `null` to eliminate any role assumptions for participants.\n     * Keeping this around to expand upon when the backend implements participant roles\n     * for a conversation.\n     */\n    hostParticipant: computed('allHumanConnectedParticipants.[]', function () {\n        return null;\n\n        // TODO: Update when the backend provides the participant roles\n        // const participants = this.get('allHumanConnectedParticipants') || [];\n        // for (const participant of participants) {\n        //     const isAgent = participant.purpose === 'agent';\n        //     if (isAgent) {\n        //         return participant;\n        //     }\n        // }\n    }),\n\n    // Human Participants with purpose 'manual', 'inbound', 'dialer', 'customer', or 'external\n    customerParticipants: computed('participants.@each.purpose', function () {\n        const participants = this.participants || [];\n        return participants.filter(participant => this.isCustomerParticipant(participant));\n    }),\n\n    agentParticipants: computed('participants.@each.purpose', function () {\n        const participants = this.participants || [];\n        return participants.filter(participant => this.isAgentParticipant(participant));\n    }),\n\n    // Human participants that are not the current user\n    otherParticipants: computed('participants.@each.{purpose,userId}', function () {\n        return reject(this.participants, participant => {\n            return this.isCurrentUserOrMachineParticipant(participant);\n        });\n    }),\n\n    // Connected Human Participants and customers (regardless of connection status)\n    otherConnectedParticipants: computed('otherParticipants.@each.endTime', function () {\n        return reject(this.otherParticipants, participant => {\n            // Reject participant if disconnected or a monitoring\n            // participant and not a customer.\n            const isDisconnected = !!participant.endTime;\n\n            // TODO: The public api will eventually filter these out.\n            // This can be removed when that is done.\n            const isMonitored = !!participant.monitoredParticipantId;\n            const isCoached = !!participant.coachedParticipantId;\n            const isBarged = isBargeParticipant(participant);\n            const isScreenMonitor = isScreenMonitoringParticipant(participant);\n\n            return isDisconnected || isMonitored || isCoached || isBarged || isScreenMonitor;\n        });\n    }),\n\n    // Connected Human Participants and customers (regardless of connection status)\n    allHumanConnectedParticipants: computed('participants.@each.{purpose,userId,endTime}', function () {\n        return reject(this.participants, participant => {\n            const isDisconnected = !!participant.endTime;\n            const isMonitored = !!participant.monitoredParticipantId;\n            const isCoached = !!participant.coachedParticipantId;\n            const isScreenMonitor = isScreenMonitoringParticipant(participant);\n\n            return (\n                isDisconnected || isMonitored || isCoached || isScreenMonitor || this.isMachineParticipant(participant)\n            );\n        });\n    }),\n\n    /**\n     * All participants that should be showing up in a potential conference.\n     * Note that the participant that is being connecting should not show up if they are being connected\n     * through and queue that is also connected.\n     */\n    allConferenceParticipants: computed(\n        'participants.[]',\n        'participants.@each.{purpose,userId,endTime,queueId,coachedParticipantId,monitoredParticipantId}',\n        function () {\n            const participants = this.participants || [];\n            const connectingQueue = new Map();\n            return participants.filter(participant => {\n                if (isScreenMonitoringParticipant(participant)) {\n                    return false;\n                }\n\n                if (this.isMachineParticipant(participant)) {\n                    // Filter out any callback typed machine participants\n                    if (participant['callbacks']) {\n                        return false;\n                    } else if (participant.endTime) {\n                        connectingQueue.delete(participant.queueId);\n                    } else if (!connectingQueue.has(participant.queueId)) {\n                        connectingQueue.set(participant.queueId, participant);\n                        return true;\n                    }\n                }\n\n                if (participant.endTime || participant.monitoredParticipantId || participant.coachedParticipantId) {\n                    return false;\n                } else if (connectingQueue.has(participant.queueId)) {\n                    return false;\n                }\n\n                return true;\n            });\n        }\n    ),\n\n    participantForCustomer: computed(\n        'participants.@each.{purpose,userId,endTime,monitoredParticipantId,coachedParticipantId,bargedParticipantId}',\n        'participants.@each.connectedTime',\n        'session.person.guid',\n        'session.useMultipanel',\n        'isDigitalConsultEnabled',\n        'onConsult',\n        'consultParticipant',\n        'otherConnectedParticipants.[]',\n        'isDisconnected',\n        'isTerminated',\n        'isCall',\n        'isMessage',\n        'isEmail',\n        'session.features.SERVOPS-62312_queueToQueueVoiceCustomer',\n        function () {\n            if (this.isDestroyed || this.isDestroying) return null;\n            // If there is a consultParticipant on the conversation then we should return that as the customer.\n            // The consultParticipantId on the model is returned by the backend and points to the ID of the customer\n            // participant. This is true for voice.\n            // However for messaging interaction we do not get a consultParticipantId on the model. For messaging\n            // the consultParticipant is essentially the participantForCustomer. Thus if messaging needs to reference\n            // the consultParticipant it can use the participantForCustomer.\n            const consultParticipantId = this.consultParticipantId || this.get('consultParticipant.id');\n\n            if (consultParticipantId && this.isCall) {\n                const participants = this.participants || [];\n                const trueCustomerParticipant = participants.findBy('id', consultParticipantId);\n                if (trueCustomerParticipant) {\n                    return trueCustomerParticipant;\n                }\n            }\n\n            /**\n             * ServOPS-62312: ACE-5393: Queue-to-queue voice participant for customer\n             * When the conversation has **only** `agent` and `acd` participants — no other purposes,\n             * no screen-monitor rows, and no coach/monitor/barge legs — return the participant `participantForCustomer` should use.\n             * Supports multiple agent and/or `acd` rows (re-alert, blind transfer back to queue).\n             * Call only when `isCall && !onConsult`. Otherwise behavior is undefined and legacy logic runs.\n             * Returns `null` when this does not apply.\n             *\n             * @see /docs/ADRs/participantForCustomer/queueToQueueCalls.md\n             */\n            if (\n                this.get('isCall') &&\n                !this.get('onConsult') &&\n                this.get('session.features.SERVOPS-62312_queueToQueueVoiceCustomer')\n            ) {\n                const queueToQueueParticipant = resolveQueueToQueueVoiceParticipantForCustomer(\n                    this.get('participants') || [],\n                    this.get('session.person.guid')\n                );\n                if (queueToQueueParticipant) {\n                    return queueToQueueParticipant;\n                }\n            }\n\n            const omitConsultingForDigital =\n                this.get('session.useMultipanel') && this.isDigitalConsultEnabled && this.type === 'message';\n\n            let participantCaller = null;\n            const customer = findLast(this.participants, participant => {\n                // The logic from this point on does not expect to run for consults since for voice consults we already identified the customer in the lines above\n                // (see trueCustomerParticipant) since there is a clear consultParticipantId supplied in the model by the backend. For digital consult we will need\n                // to account for consults case running below. So will use omitConsultingForDigital to omit the consult initiator\n                // and the specialist i.e the consultAgentParticipant.\n                if (omitConsultingForDigital) {\n                    // if we are processing digital consult we do not want any consultant participants (initiator or consulted)\n                    if (participant.internalMessages) return false;\n                }\n\n                const isCurrentUser = this.get('session.person.guid') === participant.userId;\n\n                /**\n                 * Solely used for determining the edge-case of a queue calling a queue.\n                 * We do not want to return the current user\n                 */\n                // TODO: Remove the `else if` portion of this statement when the `if` feature toggle is removed.\n                if (!isCurrentUser) {\n                    if (\n                        (this.get('session.features.interactionNameQueueCallingQueue') &&\n                            participant.purpose === 'acd' &&\n                            get(participant, 'calls.firstObject.direction') === 'inbound') ||\n                        (participant.purpose === 'agent' &&\n                            get(participant, 'calls.firstObject.direction') === 'outbound')\n                    ) {\n                        participantCaller = participant;\n                    }\n                }\n\n                const isExternalCustomer = CUSTOMER_PARTICIPANTS.includes(participant.purpose);\n                const isInternalCustomer = !isCurrentUser && participant.purpose === 'user';\n\n                // Screen monitoring participants should never be the participantForCustomer\n                const isScreenMonitor = isScreenMonitoringParticipant(participant);\n                const isBarge = isBargeParticipant(participant);\n\n                return (\n                    !participant.monitoredParticipantId &&\n                    !participant.coachedParticipantId &&\n                    !isBarge &&\n                    !isScreenMonitor &&\n                    (isExternalCustomer || isInternalCustomer)\n                );\n            });\n\n            if (customer && customer.endTime) {\n                const nextConnectedParticipant = this.get('otherConnectedParticipants.firstObject');\n                const isDisconnected = this.isDisconnected || this.isTerminated;\n\n                if (nextConnectedParticipant && !isDisconnected) {\n                    return nextConnectedParticipant;\n                }\n            }\n\n            /**\n             * If we still don't have a customer at this point then consider the scenario where this may be an agent\n             * calling a queue on behalf of a queue so we are identifying the caller as the `customer`.\n             *\n             * @note this does not apply when the conversation is a consult as the customer is already defined\n             */\n            if (!customer && this.isCall && participantCaller && !this.onConsult) {\n                return participantCaller;\n            }\n\n            if (customer) {\n                /**\n                 * if there are multiple customers in the participants list the customer returned above is likely incorrect\n                 * if it is not a user participant. In that case the getTrueCustomerIfMultipleCustomersExist will return the\n                 * last connected true customer participant - if there is only one customer participant - getTrueCustomerIfMultipleCustomersExist\n                 * returns nothing and the value of customer falls through\n                 *\n                 * agents that reconnect emails they did not initiate can get added to the participant array as `user` and\n                 * be after the `customer` in the participant array. In that case we need to check emails if customer purpose\n                 * is `user` at this point.\n                 */\n                const customerParticipant = getTrueCustomerIfMultipleCustomersExist(this);\n                if ((customer.purpose !== 'user' || this.isEmail) && customerParticipant) {\n                    return customerParticipant;\n                }\n            }\n\n            return customer;\n        }\n    ),\n\n    /**\n     * Returns all of the active participants. Active is described as trying to connect or connected.\n     * It does not include any participants who have an endTime, or are screen monitors.\n     * The id's returned supported external, user, or queue with a regular `id` fallback.\n     *\n     * [ACE-3276] If an incoming customer who is not associated with an external contact yet may not have\n     * any other form of id other than the base `id` or `queueId` it came from.\n     */\n    activeParticipantIds: computed('participants.[]', function () {\n        const participants = this.participants || [];\n        return participants.reduce((filtered, participant) => {\n            const { endTime, externalContactId, userId, queueId, id, purpose } = participant;\n            if (!endTime && !isScreenMonitoringParticipant(participant)) {\n                if (['agent', 'user'].includes(purpose) && userId) {\n                    filtered.push(userId);\n                } else if (['acd'].includes(purpose) && queueId) {\n                    filtered.push(queueId);\n                } else if (CUSTOMER_PARTICIPANTS.includes(purpose) && externalContactId) {\n                    filtered.push(externalContactId);\n                } else {\n                    filtered.push(id);\n                }\n            }\n            return filtered;\n        }, []);\n    }),\n\n    participantsForCurrentUser: computed('participants.@each.{purpose,userId}', 'session.person.guid', function () {\n        if (this.isDestroyed || this.isDestroying) return [];\n        const participants = this.participants || [];\n        return participants.filter(participant => {\n            const purpose = participant.purpose;\n            const participantUserId = participant.userId;\n            const userId = this.get('session.person.guid');\n\n            // Screen monitoring participant should not be treated as \"participantsForCurrentUser\"\n            if (isScreenMonitoringParticipant(participant)) {\n                return false;\n            }\n\n            return userId === participantUserId && (purpose === 'user' || purpose === 'agent');\n        });\n    }),\n\n    /**\n     * This refers to the latest agent participant for the interaction. This differs from the participantForCurrentUser\n     * in that it will return the latest agent participant for the interaction which may not be the current user, whereas the participantForCurrentUser\n     * will return the latest participant for the current user.\n     *\n     * @note this was introduce in our messaging takeover feature to provide the endpoint with the correct participant id for the takeover action.\n     */\n    participantForCurrentAgent: computed('participants.@each.{purpose}', function () {\n        // latest agent participant\n        return [...(this.participants || [])].reverse().findBy('purpose', 'agent');\n    }),\n\n    getFirstStuckParticipant: function () {\n        const currentUserParticipants = this.participantsForCurrentUser;\n\n        const stuckParticipant = currentUserParticipants.find(participant => {\n            const hasActivePrimary = this._doesParticipantHaveActivePrimaryMedia(participant);\n            const hasActiveSessionShare = this._doesParticipantHaveActiveSessionShare(participant);\n            return !hasActivePrimary && hasActiveSessionShare;\n        });\n        return stuckParticipant;\n    },\n\n    participantForCurrentUser: computed('participantsForCurrentUser.@each.wrapup', function () {\n        const currentUserParticipants = this.participantsForCurrentUser;\n\n        // alerting interactions\n\n        const lastAlertingParticipant = findLast(currentUserParticipants, participant => {\n            return findLast(MEDIA_TYPES, type => {\n                if (participant[type]) {\n                    return findLast(participant[type], media => {\n                        return media.state.toLowerCase() === 'alerting';\n                    });\n                }\n            });\n        });\n\n        if (lastAlertingParticipant) {\n            return lastAlertingParticipant;\n        }\n\n        // non-disconnected interactions\n\n        const lastNonDisconnectedParticipant = findLast(currentUserParticipants, participant => {\n            return findLast(MEDIA_TYPES, type => {\n                if (participant[type]) {\n                    return findLast(participant[type], media => {\n                        return (\n                            media.state.toLowerCase() !== 'disconnected' && media.state.toLowerCase() !== 'terminated'\n                        );\n                    });\n                }\n            });\n        });\n\n        if (lastNonDisconnectedParticipant) {\n            return lastNonDisconnectedParticipant;\n        }\n\n        // disconnected interactions\n\n        const lastCurrentUserNeedingWrapup = findLast(currentUserParticipants, participant => {\n            return participant.wrapupRequired && !participant.wrapup;\n        });\n\n        // If everyone has a wrapup code\n        if (!lastCurrentUserNeedingWrapup) {\n            return last(currentUserParticipants);\n        }\n\n        // If participant needs wrapup\n        // return lastCurrentUserNeedingWrapup;\n\n        // If we reach this point then this means that:\n        // 1) All agent participants have wrapped up and therefore should be disconnected\n        // 2) All agent participants have no active callbacks\n        // In this case we are (may be) dealing with a stuck interaction that conversation service still believes is active.\n\n        // Let's get the first participant for the agent with a stuck interaction\n        // TODO: confirm that first object is latest added by conversation service.\n        return lastCurrentUserNeedingWrapup || this.getFirstStuckParticipant();\n    }),\n\n    participantsForACD: computed('participants.@each.purpose', function () {\n        const participants = this.participants || [];\n        return participants.filter(participant => participant.purpose === 'acd');\n    }),\n\n    participantForQueue: alias('participantsForACD.lastObject'),\n\n    dialerParticipant: computed('participants.@each.purpose', function () {\n        const participants = this.participants || [];\n        return participants.find(participant => participant.purpose === 'dialer');\n    }),\n\n    /**\n     * Iterates through the participants in reverse to find the last/newest participant that is\n     * considered either a machine or agent. Used to determine if the interaction is being transferred.\n     * The return breaks the for loop in this instance to it will only iterates as long as it needs to.\n     */\n    transferringToParticipant: computed('participants.[]', 'activeAttendedTransfer', function () {\n        const activeTransfer = this.activeAttendedTransfer;\n        const destination = activeTransfer ? activeTransfer.destination : null;\n        if (!destination) return null;\n\n        const participants = this.participants || [];\n        // we want to look at the participants in reverse order to find newest reference\n        for (let i = participants.length - 1; i >= 0; i--) {\n            const participant = participants[i];\n            if (participant.userId === destination.userId) {\n                return participant;\n            }\n        }\n        // participant not found.\n        return null;\n    })\n});\n","import { and, reads, notEmpty, or, equal } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport Mixin from '@ember/object/mixin';\nimport { computed } from '@ember/object';\nimport DS from 'ember-data';\nimport { isRoomJid } from 'web-directory/utils/jid-helpers';\nimport isEmpty from 'lodash/isEmpty';\nimport maxBy from 'lodash/maxBy';\nimport moment from 'web-directory/utils/dates';\n\nconst PROVIDER_MEDIATYPE = {\n    COBROWSE: 'PureCloud Co-browse',\n    SCREENSHARE: 'PureCloud WebRTC screen-share',\n    VIDEO: 'PureCloud WebRTC video'\n};\n\nfunction aggregateMedia(screenShares, cobrowsesessions, videos) {\n    // Ensure provider is identified in array items.\n    // This step could be skipped if backend does not remove provider info\n    (screenShares || []).forEach(mediaObj => {\n        if (!mediaObj.mediaType) {\n            mediaObj.mediaType = PROVIDER_MEDIATYPE.SCREENSHARE;\n        }\n    });\n\n    (cobrowsesessions || []).forEach(mediaObj => {\n        if (!mediaObj.mediaType) {\n            mediaObj.mediaType = PROVIDER_MEDIATYPE.COBROWSE;\n        }\n    });\n\n    (videos || []).forEach(mediaObj => {\n        if (!mediaObj.mediaType) {\n            mediaObj.mediaType = PROVIDER_MEDIATYPE.VIDEO;\n        }\n    });\n\n    let allMedia = [];\n    if (screenShares) {\n        allMedia = allMedia.concat(screenShares);\n    }\n    if (cobrowsesessions) {\n        allMedia = allMedia.concat(cobrowsesessions);\n    }\n    if (videos) {\n        allMedia = allMedia.concat(videos);\n    }\n\n    return allMedia;\n}\n\nfunction getMediaObject(mediaArray) {\n    // This function identifies the current active media\n    // object from mediaArray mediaArray is expected to contain\n    // the secondary media types within a participant i.e screenShares,\n    // cobrowseSessions, videos etc.\n\n    // Get media with latest connected Time\n    const mediaWithlatestConnectedTime = maxBy(mediaArray, function (mediaObj) {\n        if (mediaObj && mediaObj.connectedTime) {\n            return moment(mediaObj.connectedTime).unix();\n        }\n        return 0;\n    });\n\n    // Get media with latest disconnected time\n    const mediaWithlatestDisconnectedTime = maxBy(mediaArray, function (mediaObj) {\n        if (mediaObj && mediaObj.disconnectedTime) {\n            return moment(mediaObj.disconnectedTime).unix();\n        }\n        return 0;\n    });\n\n    // Get latest active media\n    const maxConnectedTime = moment(\n        mediaWithlatestConnectedTime && mediaWithlatestConnectedTime.connectedTime\n            ? mediaWithlatestConnectedTime.connectedTime\n            : 0\n    );\n    const maxDisconnectedTime = moment(\n        mediaWithlatestDisconnectedTime && mediaWithlatestDisconnectedTime.disconnectedTime\n            ? mediaWithlatestDisconnectedTime.disconnectedTime\n            : 0\n    );\n\n    const activeMedia = maxConnectedTime.isAfter(maxDisconnectedTime)\n        ? mediaWithlatestConnectedTime\n        : mediaWithlatestDisconnectedTime;\n\n    return activeMedia;\n}\n\nexport default Mixin.create({\n    ajax: service(),\n    permissions: service(),\n    communication: service(),\n    session: service(),\n\n    sessionShareCode: null,\n    isSessionCodeRequired: false,\n\n    isSessionSharing: false,\n    isRequestingEndSessionShare: false,\n\n    sessionShareDisconnectTimer: null,\n    sessionShareExplicitlyInitiated: false,\n    sessionShareActiveOnLoad: false,\n    isCobrowseV2Disconnected: false,\n    isCobrowseV2: false,\n\n    // feature toggles & permissions\n\n    canScreenShareOnCall: and('isCall', 'permissions.canViewAcdScreenShare'),\n    canScreenShareOnChat: and('isChat', 'permissions.canViewAcdScreenShare'),\n    canCobrowseOnCall: and('isCall', 'permissions.canViewAcdCoBrowseForCall'),\n    canCobrowseOnChat: and('isChat', 'permissions.canViewAcdCoBrowseForChat'),\n\n    // State\n\n    isRequestingScreenShareOrCoBrowse: false,\n    isRequestingVideo: false,\n\n    sessionShareState: reads('mostRecentAgentSessionShare.state'),\n    customerShareState: reads('mostRecentCustomerSessionShare.state'),\n    hasSessionShareCode: notEmpty('sessionShareCode'),\n    sessionShareActive: or('isRequestingSessionShare', 'hasSessionShareCode', 'isSessionSharing'),\n    isRequestingSessionShare: or('isRequestingScreenShareOrCoBrowse', 'isRequestingVideo'),\n\n    isSessionShareConnected: computed('sessionShareState', 'isV2Provider', function () {\n        const state = this.sessionShareState || '';\n        return state.toLowerCase() === 'connected';\n    }),\n\n    isSessionShareDisconnected: computed('sessionShareState', 'isRequestingNewSessionShare', function () {\n        const state = this.sessionShareState || '';\n        return state.toLowerCase() === 'disconnected' && !this.isRequestingNewSessionShare;\n    }),\n\n    isCustomerInSessionShare: computed('customerShareState', 'isSessionSharing', function () {\n        let state = this.customerShareState || '';\n        return this.isSessionSharing && state.toLowerCase() === 'connected';\n    }),\n\n    isCustomerDisconnectedFromSharedSession: computed('customerShareState', 'isSessionSharing', function () {\n        let state = this.customerShareState || '';\n        return this.isSessionSharing && state.toLowerCase() === 'disconnected';\n    }),\n\n    isAgentDisconnectedFromSharedSession: computed(\n        'sessionShareState',\n        'isSessionSharing',\n        'isRequestingNewSessionShare',\n        function () {\n            const state = this.sessionShareState || '';\n            return this.isSessionSharing && state.toLowerCase() === 'disconnected' && !this.isRequestingNewSessionShare;\n        }\n    ),\n\n    isWaitingForAgentToConnect: computed(\n        'isSessionShareConnected',\n        'isAgentDisconnectedFromSharedSession',\n        'sessionShareState',\n        'isV2Provider',\n        function () {\n            return !this.isSessionShareConnected && !this.isAgentDisconnectedFromSharedSession;\n        }\n    ),\n\n    isWaitingForCustomerToConnect: computed(\n        'isSessionCodeRequired',\n        'isCustomerInSessionShare',\n        'isCustomerDisconnectedFromSharedSession',\n        'isV2Provider',\n        function () {\n            return (\n                this.isSessionCodeRequired &&\n                !this.isCustomerInSessionShare &&\n                !this.isCustomerDisconnectedFromSharedSession\n            );\n        }\n    ),\n\n    hasCustomerJoinedSessionShareRoom: computed('customerShareState', function () {\n        const state = this.customerShareState || '';\n        return state.toLowerCase() === 'connected';\n    }),\n\n    hasAgentJoinedSessionShareRoom: computed('sessionShareState', function () {\n        const state = this.sessionShareState || '';\n        return state.toLowerCase() === 'connected';\n    }),\n\n    sessionShareRoomJid: computed('mostRecentCustomerSessionShare.context', function () {\n        const context = this.get('mostRecentCustomerSessionShare.context');\n        if (context && context.indexOf(':') >= 0) {\n            return context.substring(context.indexOf(':') + 1);\n        } else if (context && isRoomJid(context)) {\n            return context;\n        }\n        return null;\n    }),\n\n    // media objects\n\n    mostRecentAgentSessionShare: computed(\n        'participantForCurrentUser.{videos.[],screenShares.[],screenshares.[],cobrowsesessions.[]}',\n        function () {\n            let screenShares =\n                this.get('participantForCurrentUser.screenShares') ||\n                this.get('participantForCurrentUser.screenshares');\n            let cobrowsesessions = this.get('participantForCurrentUser.cobrowsesessions');\n            let videos = this.get('participantForCurrentUser.videos');\n\n            let allMedia = aggregateMedia(screenShares, cobrowsesessions, videos);\n\n            if (!isEmpty(allMedia)) {\n                const mediaObject = getMediaObject(allMedia);\n                this.logger.info('getMediaObject for agent', mediaObject);\n                return mediaObject;\n            }\n            return null;\n        }\n    ),\n\n    mostRecentCustomerSessionShare: computed(\n        'participantForCustomer.{videos.[],screenShares.[],screenshares.[],cobrowsesessions.[]}',\n        function () {\n            let screenShares =\n                this.get('participantForCustomer.screenShares') || this.get('participantForCustomer.screenshares');\n            let cobrowsesessions = this.get('participantForCustomer.cobrowsesessions');\n            let videos = this.get('participantForCustomer.videos');\n\n            let allMedia = aggregateMedia(screenShares, cobrowsesessions, videos);\n\n            if (!isEmpty(allMedia)) {\n                const mediaObject = getMediaObject(allMedia);\n                this.logger.info('getMediaObject for customer', mediaObject);\n                return mediaObject;\n            }\n            return null;\n        }\n    ),\n\n    // type\n\n    sessionShareType: computed('isScreenShare', 'isVideoShare', 'isCoBrowse', function () {\n        if (this.isScreenShare) {\n            return 'screen-share';\n        } else if (this.isVideoShare) {\n            return 'video';\n        } else if (this.isCoBrowse) {\n            return 'co-browse';\n        }\n        return null;\n    }),\n\n    canScreenShare: or('canScreenShareOnCall', 'canScreenShareOnChat'),\n    canCobrowse: or('canCobrowseOnCall', 'canCobrowseOnChat'),\n\n    mediaTypeIsScreenShare: equal('mostRecentCustomerSessionShare.mediaType', PROVIDER_MEDIATYPE.SCREENSHARE),\n    mediaTypeIsCobrowse: equal('mostRecentCustomerSessionShare.mediaType', PROVIDER_MEDIATYPE.COBROWSE),\n    mediaTypeIsVideo: equal('mostRecentCustomerSessionShare.mediaType', PROVIDER_MEDIATYPE.VIDEO),\n\n    isScreenShare: computed(\n        'isRequestingScreenShareOrCoBrowse',\n        'isRequestingVideo',\n        'canScreenShare',\n        'mediaTypeIsScreenShare',\n        function () {\n            if (this.isRequestingScreenShareOrCoBrowse) {\n                return true;\n            }\n\n            if (this.isRequestingVideo) {\n                return false;\n            }\n\n            return this.canScreenShare && this.mediaTypeIsScreenShare;\n        }\n    ),\n\n    isCoBrowse: computed(\n        'isRequestingVideo',\n        'isRequestingScreenShareOrCoBrowse',\n        'mediaTypeIsCobrowse',\n        'canCobrowse',\n        function () {\n            if (this.isRequestingScreenShareOrCoBrowse || this.isRequestingVideo) {\n                return false;\n            }\n\n            return this.canCobrowse && this.mediaTypeIsCobrowse;\n        }\n    ),\n\n    isVideoShare: computed('isRequestingVideo', 'isRequestingScreenShareOrCoBrowse', 'mediaTypeIsVideo', function () {\n        return this.isRequestingVideo && !this.isRequestingScreenShareOrCoBrowse;\n    }),\n\n    // permission errors\n\n    hasScreenSharePermissionError: or('hasCobrowsePermissionError', 'hasVideoPermissionError', 'hasShareError'),\n\n    hasCobrowsePermissionError: computed('mediaTypeIsCobrowse', 'canCobrowse', function () {\n        if (this.mediaTypeIsCobrowse && !this.canCobrowse) {\n            this.logger.error(\n                'ERROR: setSessionShareType: Co-Browse: Permissions or feature toggle missing to process acd co-browse events.',\n                this.id\n            );\n            return true;\n        }\n        return false;\n    }),\n\n    hasVideoPermissionError: computed('mediaTypeIsVideo', function () {\n        if (this.mediaTypeIsVideo) {\n            this.logger.error(\n                'ERROR: setSessionShareType: Video: Permissions or feature toggle missing to process acd video events.',\n                this.id\n            );\n            return true;\n        }\n        return false;\n    }),\n\n    hasShareError: computed('mediaTypeIsScreenShare', 'canScreenShare', function () {\n        if (this.mediaTypeIsScreenShare && !this.canScreenShare) {\n            this.logger.error(\n                'ERROR: setSessionShareType: Screen-share: Permissions or feature toggle missing to process acd screen-share events.',\n                this.id\n            );\n            return true;\n        }\n        return false;\n    }),\n\n    // Timers\n\n    sessionShareConnectedTime: computed(\n        'mostRecentAgentSessionShare.connectedTime',\n        'participantForCurrentUser.connectedTime',\n        function () {\n            if (this.get('mostRecentAgentSessionShare.connectedTime')) {\n                return moment(this.get('mostRecentAgentSessionShare.connectedTime'));\n            } else if (this.get('participantForCurrentUser.connectedTime')) {\n                return moment(this.get('participantForCurrentUser.connectedTime'));\n            }\n            return moment();\n        }\n    ),\n\n    sessionShareDuration: computed('mostRecentAgentSessionShare.{disconnectedTime,connectedTime}', function () {\n        const connectedTime = this.get('mostRecentAgentSessionShare.connectedTime');\n        const endTime = this.get('mostRecentAgentSessionShare.disconnectedTime') || moment();\n        if (connectedTime && endTime) {\n            return moment(endTime).diff(moment(connectedTime));\n        }\n        return null;\n    }),\n\n    // V2 Session share media\n\n    activeMediaRequests: computed(function () {\n        const url = this.communication.mediaRequestUri(this.id);\n        return DS.PromiseArray.create({\n            promise: this.ajax.request(url).then(res => res.entities)\n        });\n    })\n});\n","import { resolve, reject } from 'rsvp';\nimport { inject as service } from '@ember/service';\nimport Mixin from '@ember/object/mixin';\n\nexport default Mixin.create({\n    application: service(),\n    session: service(),\n    router: service(),\n\n    authenticationRoute: 'login-oauth',\n\n    beforeModel: async function (transition) {\n        // Wait for ESA session setup to complete before checking auth state.\n        // In Ember 3.28, child route beforeModel hooks can fire before the\n        // application route's `await session.setup()` resolves. Without this\n        // gate, the mixin sees isAuthenticated === false during initial load\n        // and prematurely redirects to login-oauth. (ATLAS-2418)\n        if (this.session._setupPromise) {\n            await this.session._setupPromise;\n        }\n\n        // ESA setup only covers token restore. The authenticator can hold a valid\n        // token while the bootstrap chain that populates `session.user` is still\n        // running, and `isAuthenticated` requires both. Refreshing a child route\n        // lands in exactly that window, so without waiting the check below reads a\n        // half-built session as unauthenticated and redirects to login-oauth,\n        // which discards the requested route and strands the user on /home.\n        // (ATLAS-2424)\n        await this._waitForInFlightAuthentication();\n\n        // Check if the session is authenticated\n        if (!this.get('session.isAuthenticated')) {\n            // Store the attempted transition for redirect after login\n            this.set('session.attemptedTransition', transition);\n\n            // Redirect to the authentication route\n            this.router.transitionTo(this.authenticationRoute);\n            return reject('Authentication required');\n        }\n\n        // Session is authenticated, now check authorization\n        if (!this.get('session.hasAppAccess')) {\n            transition.abort();\n            this.router.transitionTo('no-access');\n            return reject('No app access');\n        }\n\n        return resolve();\n    },\n\n    /**\n     * Waits for an in-flight session bootstrap to settle so the auth check reads a\n     * settled state rather than a partially built session.\n     *\n     * A rejected bootstrap is not an error here: it leaves the session\n     * unauthenticated, which is precisely the case the auth check handles (and the\n     * authenticator has already logged and reported the failure).\n     */\n    async _waitForInFlightAuthentication() {\n        const bootstrapPromise = this.get('session._bootstrapPromise');\n        if (!bootstrapPromise) {\n            return;\n        }\n\n        try {\n            await bootstrapPromise;\n        } catch (e) {\n            // Intentionally ignored; the auth check below handles the failed state.\n        }\n    }\n});\n","import { inject as service } from '@ember/service';\nimport Mixin from '@ember/object/mixin';\n\nconst BatchDataRequestsMixin = Mixin.create({\n    batchDataRequests: service(),\n\n    getUser(id) {\n        return this.batchDataRequests.getUser(id);\n    },\n\n    refreshUser(id) {\n        return this.batchDataRequests.refreshUser(id);\n    },\n\n    getChatUser(jid) {\n        return this.batchDataRequests.getChatUser(jid);\n    },\n\n    getGroup(jid) {\n        return this.batchDataRequests.getGroup(jid);\n    }\n});\n\nexport default BatchDataRequestsMixin;\n","import EmberObject, { set } from '@ember/object';\nimport { on } from '@ember/object/evented';\nimport { inject as service } from '@ember/service';\nimport Mixin from '@ember/object/mixin';\nimport RSVP, { resolve } from 'rsvp';\nimport { getOwner } from '@ember/application';\nimport _ from 'lodash';\nimport ChatRoom from '../models/chat-room';\nimport { getEntityObjectId, isPersonJid, isGroupJid, isSupervisorJid } from 'web-directory/utils/jid-helpers';\n\nexport default Mixin.create({\n    presenceSubscription: service(),\n    batchDataRequests: service(),\n\n    initRoomCaching: on('init', function () {\n        return this.set('rooms', EmberObject.create());\n    }),\n\n    getChatRoom(jid) {\n        return new RSVP.Promise(resolve => {\n            const objectId = getEntityObjectId(jid);\n            let room = this.get(`rooms.${objectId}`);\n            if (room) {\n                const isGroupRoom = !isPersonJid(room.get('jid'));\n                const passedInJidIsPerson = isPersonJid(jid) && !isSupervisorJid(jid);\n                if (passedInJidIsPerson && isGroupRoom) {\n                    this.logger.debug(\n                        `<cache-chat-rooms-mixin> Found incorrect chat room with jid\n                        ${room.get('jid')}. Closing the room. Passed in jid is ${jid}`\n                    );\n                    // bad jid from early chat beta\n                    // need to leave the room so it will be deleted on realtime side\n                    this.closeActiveRoom(room);\n\n                    // create the correct 1-1 chat room and store in `rooms` dictionary\n                    const personRoom = ChatRoom.create(\n                        Object.assign({ jid, objectId }, getOwner(this).ownerInjection())\n                    );\n                    set(this.rooms, objectId, personRoom, true);\n\n                    // shouldn't need to run this feature toggle check but to be safe\n                    return resolve(this.setupRoomContextV2(personRoom));\n                }\n                return resolve(room);\n            }\n\n            room = ChatRoom.create(Object.assign({ jid, objectId }, getOwner(this).ownerInjection()));\n            set(this.rooms, objectId, room, true);\n\n            return resolve(this.setupRoomContextV2(room));\n        });\n    },\n\n    setupRoomContext(room) {\n        const jid = room.get('jid');\n        room.set('muted', this.roomMuted(jid));\n\n        if (room.get('isSoftphoneRoom')) {\n            return resolve(room);\n        }\n        if (isPersonJid(jid)) {\n            return this.addChatTargetAsParticipant(room);\n        }\n        if (isGroupJid(jid)) {\n            return this.loadGroup(room);\n        }\n        return resolve(room);\n    },\n    setupRoomContextV2(room) {\n        const jid = room.get('jid');\n        room.set('muted', this.roomMuted(jid));\n\n        if (room.get('isSoftphoneRoom')) {\n            return resolve(room);\n        }\n        if (isPersonJid(jid)) {\n            room.set('oneToOneTarget', jid);\n        }\n        if (isGroupJid(jid)) {\n            return this.loadGroup(room);\n        }\n        return resolve(room);\n    },\n\n    addChatTargetAsParticipant(room) {\n        const jid = room.get('jid');\n        const user = this.get('session.person');\n        return this.batchDataRequests.getChatUser(jid).then(person => {\n            room.set('oneToOneTarget', person);\n            this.addParticipantToRoom(room, person);\n            this.addParticipantToRoom(room, user);\n            this.presenceSubscription.subscribeToPresence(person);\n            person.set('oneToOneRoom', room);\n            return room;\n        });\n    },\n\n    loadRoomSubject(room) {\n        if (room.isOneToOneRoom() || room.get('rawSubject')) {\n            return resolve(room);\n        }\n\n        const roomJid = room.get('jid');\n        return this.getStreamingRoomInfo(roomJid).then(({ subject }) => {\n            this.updateRoomSubject(room, subject);\n            return room;\n        });\n    },\n\n    addRoomToCache(room) {\n        const objectId = getEntityObjectId(room.jid);\n        set(this.rooms, objectId, room, true);\n    },\n\n    addAllParticipantsToRoom(room, participantJids) {\n        const cachedParticipants = room.get('participants');\n\n        _.forEach(cachedParticipants, cachedParticipant => {\n            const cachedParticipantJid = cachedParticipant && cachedParticipant.get('jid');\n            if (participantJids.indexOf(cachedParticipantJid) === -1) {\n                this.removeParticipantFromRoom(room, cachedParticipant);\n            } else {\n                participantJids.removeObject(cachedParticipantJid);\n            }\n        });\n\n        _.forEach(participantJids, jid => {\n            this.batchDataRequests.getChatUser(jid).then(person => {\n                return this.addParticipantToRoom(room, person);\n            });\n        });\n    },\n\n    loadGroup(room) {\n        if (!room.isGroupRoom()) {\n            return resolve(room);\n        }\n\n        return this.batchDataRequests.getGroup(room.get('objectId')).then(group => {\n            room.set('group', group);\n            if (group && _.isEmpty(group.get('name'))) {\n                this.loadRoomSubject(room);\n            }\n            return room;\n        });\n    }\n});\n","/* eslint-disable ember/closure-actions */\n\nimport { bind } from '@ember/runloop';\n\nimport $ from 'jquery';\nimport { A } from '@ember/array';\nimport { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Mixin from '@ember/object/mixin';\n\nimport Ember from 'ember';\nimport moment from 'web-directory/utils/dates';\n\nconst MD_SPECIAL_CHAR_REG_EXP = new RegExp('([_`\\\\\\\\])', 'g');\n\nexport default Mixin.create({\n    session: service(),\n    chat: service(),\n    notification: service(),\n    permissions: service(),\n    phone: service(),\n    webrtc: service(),\n    settings: service(),\n    sidebar: service(),\n    preferences: service(),\n    cobrowse: service(),\n    documents: service(),\n    geolocation: service(),\n    intl: service(),\n    presenceSubscription: service(),\n    roster: service(),\n    chatCommands: service(),\n\n    textarea: null,\n    publicMappings: computed('session.features.cobrowseAssist', function () {\n        const publicMappings = [\n            {\n                name: 'afk',\n                value: this.afk\n            },\n            {\n                name: 'collapse',\n                value: this.collapseMedia\n            },\n            {\n                name: 'dnd',\n                value: this.dnd\n            },\n            {\n                name: 'expand',\n                value: this.expandMedia\n            },\n            {\n                name: 'giphy',\n                value: this.sendGiphyGif\n            },\n            {\n                name: 'last',\n                value: this.openLastRoom\n            },\n            {\n                name: 'leave',\n                value: this.leaveCurrentRoom\n            },\n            {\n                name: 'mute',\n                value: this.muteRoom\n            },\n            {\n                name: 'phone',\n                value: this.makePhoneCall,\n                oneToOne: true\n            },\n            {\n                name: 'popout',\n                value: this.popoutChatRoom\n            },\n            {\n                name: 'prefs',\n                value: this.openPreferences\n            },\n            {\n                name: 'presence',\n                value: this.setPresence\n            },\n            {\n                name: 'unmute',\n                value: this.unmuteRoom\n            },\n            {\n                name: 'whisper',\n                value: this.sendWhisper\n            }\n        ];\n\n        if (this.get('session.features.cobrowseAssist')) {\n            publicMappings.push({\n                name: 'cobrowse',\n                value: this.startStopCobrowse\n            });\n        }\n        publicMappings.push({\n            name: 'search',\n            value: this.searchCommand\n        });\n\n        return publicMappings;\n    }),\n\n    shortcutMappings: computed('publicMappings.[]', 'chatCommands.commands.[]', function () {\n        const serviceCommands = this.get('chatCommands.commands');\n        const mappings = [].concat(this.publicMappings, serviceCommands);\n\n        return (mappings || [])\n            .map(mapping => {\n                const result = Object.assign({}, mapping);\n                if (!result.command) {\n                    result.command = `/${result.name}`;\n                }\n\n                let expression = result.expression;\n                if (!expression) {\n                    expression = result.inlineReplacement ? `^${result.command}$` : result.command;\n                }\n                result.regExp = new RegExp(expression);\n\n                if (typeof result.value === 'string') {\n                    result.value = result.value.replace(MD_SPECIAL_CHAR_REG_EXP, '\\\\$1');\n                }\n                return result;\n            })\n            .sort(function (cmd1, cmd2) {\n                // Sort inline to last so proper commands have priority\n                const val1 = cmd1.inlineReplacement ? 1 : 0;\n                const val2 = cmd2.inlineReplacement ? 1 : 0;\n                return val1 - val2;\n            });\n    }),\n\n    filteredMappings: computed(\n        'shortcutMappings.[]',\n        'chatCommands.commands.[]',\n        'chat.activeRoom.oneToOneTarget',\n        'webrtc.{enabled,videoCallCapable}',\n        function () {\n            const mappings = this.shortcutMappings;\n            const phoneEnabled = this.get('phone.enabled') && this.get('chat.activeRoom.oneToOneTarget');\n            const videoEnabled = this.get('webrtc.enabled') && this.get('webrtc.videoCallCapable');\n            const docEnabled = this.get('chat.activeRoom.oneToOneTarget');\n            const giphyEnabled = this.get('permissions.canUseGiphy');\n            const intl = this.intl;\n            return A(\n                mappings\n                    .filter(function (mapping) {\n                        if (mapping.hidden) {\n                            return false;\n                        }\n                        if ('phone' === mapping.name) {\n                            return phoneEnabled;\n                        }\n                        if ('video' === mapping.name) {\n                            return videoEnabled;\n                        }\n                        if ('documents' === mapping.name) {\n                            return docEnabled;\n                        }\n                        if ('map' === mapping.name) {\n                            return false;\n                        }\n                        if ('giphy' === mapping.name) {\n                            return giphyEnabled;\n                        }\n                        return true;\n                    })\n                    .map(function (mapping) {\n                        if (intl.exists(`chat.commands.${mapping.name}.command`)) {\n                            return {\n                                help: intl.t(`chat.commands.${mapping.name}.description`).toString(),\n                                name: '/' + intl.t(`chat.commands.${mapping.name}.command`).toString(),\n                                value: mapping.value\n                            };\n                        }\n                        return {\n                            help: '',\n                            name: `/${mapping.name}`,\n                            value: mapping.value\n                        };\n                    })\n            ).sortBy('name');\n        }\n    ),\n\n    _errorHandler(jqXHR /*, textStatus, errorThrown*/) {\n        Ember.onerror(jqXHR);\n    },\n\n    addChatCommand(name, action) {\n        const commands = this.publicMappings;\n        commands.addObject({\n            name,\n            value: action\n        });\n    },\n\n    checkForCommand(message, options) {\n        if (this.acdToggle) {\n            return message;\n        }\n        message = this.checkForShortcutCommand(message, options);\n        return message;\n    },\n\n    checkForShortcutCommand(message, options) {\n        const shortcutMappings = this.shortcutMappings || [];\n\n        let exclusiveShortcut = null;\n        let inlineShortcuts = [];\n\n        for (let i = 0; i < shortcutMappings.length; i++) {\n            const currMapping = shortcutMappings[i];\n            const firstIndex = message.indexOf(currMapping.command);\n\n            if (firstIndex === 0 && !currMapping.inlineReplacement) {\n                exclusiveShortcut = currMapping;\n                // Short-circuit the loop if we find a proper command\n                break;\n            } else if (firstIndex >= 0 && currMapping.inlineReplacement) {\n                inlineShortcuts.push(currMapping);\n            }\n        }\n\n        if (exclusiveShortcut) {\n            if (typeof exclusiveShortcut.value === 'function') {\n                return (\n                    exclusiveShortcut.value.call(\n                        this,\n                        exclusiveShortcut.name,\n                        message.replace(exclusiveShortcut.regExp, '').trim(),\n                        options,\n                        message\n                    ) || ''\n                );\n            } else {\n                message = message.replace(exclusiveShortcut.regExp, exclusiveShortcut.value);\n                return message;\n            }\n        } else if (inlineShortcuts.length > 0) {\n            const tokens = message.split(' ');\n            (tokens || []).forEach((currToken, index) => {\n                if (currToken.indexOf('/') === 0) {\n                    inlineShortcuts.forEach(currShortcut => {\n                        const matchResult = currShortcut.regExp.exec(currToken);\n                        if (matchResult) {\n                            tokens[index] = currShortcut.value;\n                            return false;\n                        }\n                    });\n                }\n            });\n            return tokens.join(' ');\n        }\n        return message;\n    },\n\n    leaveCurrentRoom(cmd, arg) {\n        if (!arg) {\n            arg = '';\n        }\n        const chat = this.chat;\n        const roster = this.roster;\n        const leaveRooms = function (rooms) {\n            return (rooms || []).forEach(function (room) {\n                return chat.closeRoomAndClearCounts(room);\n            });\n        };\n        let rosters = {\n            active: false,\n            favorites: false,\n            people: false,\n            groups: false,\n            adhocs: false\n        };\n        if (!arg) {\n            rosters.active = true;\n        } else {\n            const items = arg.split(' ');\n            (items || []).forEach(target => {\n                if (target === 'room' || target === 'active' || target === 'current') {\n                    rosters.active = true;\n                } else if (target === 'all') {\n                    rosters = {\n                        active: true,\n                        favorites: true,\n                        people: true,\n                        groups: true,\n                        adhocs: true\n                    };\n                } else if (target === 'favorites') {\n                    rosters.favorites = true;\n                } else if (target === 'people' || target === 'directs' || target === 'direct') {\n                    rosters.people = true;\n                } else if (target === 'official' || target === 'groups' || target === 'group') {\n                    rosters.groups = true;\n                } else if (target === 'personal' || target === 'adhocs' || target === 'adhoc') {\n                    rosters.adhocs = true;\n                }\n            });\n        }\n        if (rosters.active) {\n            leaveRooms([chat.get('activeRoom')]);\n        }\n        if (rosters.favorites) {\n            leaveRooms(roster.get('favorites'));\n        }\n        if (rosters.people) {\n            leaveRooms(roster.get('people'));\n        }\n        if (rosters.groups) {\n            leaveRooms(roster.get('groups'));\n        }\n        if (rosters.adhocs) {\n            leaveRooms(roster.get('adhocs'));\n        }\n    },\n\n    shareDoc(docName) {\n        const sourceList = this.documentsList;\n        const source = (sourceList || []).find(doc => doc.name === docName);\n        const shareData = {\n            sharedEntityType: 'DOCUMENT',\n            sharedEntity: {\n                id: source.id\n            },\n            memberType: 'USER',\n            member: {\n                id: this.get('chat.activeRoom.oneToOneTarget.guid')\n            }\n        };\n        const successHandler = (/*data, textStatus, jqXHR*/) => {\n            this.set('sharingDoc', false);\n            return this.sendAction('sendMessage', `${source.sharingUri}`, this.activeRoom);\n        };\n        this.setProperties({\n            messageInput: '',\n            sharingDoc: true\n        });\n        this.setTextareaValue('');\n        this.documents.shareDocument(shareData).then(successHandler).catch(this._errorHandler.bind(this));\n    },\n\n    openLastRoom() {\n        var chat, historyStack, lastJid;\n        chat = this.chat;\n        historyStack = chat.get('roomHistoryStack');\n        if (historyStack.length <= 1) {\n            return;\n        }\n        lastJid = historyStack.get(historyStack.length - 2);\n        this.set('messageInput', '');\n        return chat.getChatRoom(lastJid).then(function (room) {\n            return chat.changeActiveRoom(room);\n        });\n    },\n\n    makePhoneCall() {\n        var phone;\n        phone = this.phone;\n        if (this.get('chat.activeRoom.oneToOneTarget.type') === 'person') {\n            return phone.makeCall(this.get('chat.activeRoom.oneToOneTarget'));\n        }\n    },\n\n    sendGiphyGif(cmd, args) {\n        return `/${cmd} ${args}`;\n    },\n\n    popoutChatRoom() {\n        this._popoutRoom(this.activeRoom);\n    },\n\n    _popoutRoom(room) {\n        let popout = room.get('popout') && !room.get('popout.closed');\n        if (popout || window.location.hash.indexOf('chat-room') === -1) {\n            const showingVideo = room.get('showingVideo');\n            const joinCallImmediately = !!this.get('webrtc.activeConversation.hasJoined');\n            const startVideoMuted = this.get('webrtc.activeConversation.localParticipant.videoMuted');\n            const startAudioMuted = this.get('webrtc.activeConversation.localParticipant.audioMuted');\n            this.chat.popoutChatRoom(room, showingVideo, joinCallImmediately, startVideoMuted, startAudioMuted);\n            if (showingVideo && !popout) {\n                // This is an an idea for improving the popout - the current video stays active\n                // for a few seconds until the popout bootstraps, then disconnects. If we do this,\n                // we'd need to add messaging to the user to show why it hasn't disconnected yet.\n                // Something like 'reconnecting your video in the popout window. This may take a few moments.''\n                //\n                // Ember.run.later(this, () => {\n                //     this.get('webrtc').endConversation({jid: room.get('jid'), reason: 'alternative-session'});\n                // }, 11000);\n                this.webrtc.endConversation({ jid: room.get('jid'), reason: 'alternative-session' });\n            }\n            this.sidebar.openPanel('conversations');\n        }\n    },\n\n    rollDice(cmd, args, cmdOptions = {}) {\n        const random = function (min, max) {\n            return Math.floor(Math.random() * (max - min + 1)) + min;\n        };\n        if (!args) {\n            return;\n        }\n\n        let match = args.match(/(\\d+)d(\\d+)/);\n        if (!match || match.length !== 3) {\n            return;\n        }\n\n        // eslint-disable-next-line no-unused-vars\n        const [head, ...tail] = match;\n        match = tail;\n\n        const min = 1;\n        let max = [].concat(match).pop();\n        let number = match[0];\n\n        if (number > 6) {\n            number = 6;\n        }\n        if (max > 24) {\n            max = 24;\n        }\n\n        const roll = (function () {\n            const results = [];\n            for (let i = 0; i < number; i++) {\n                results.push(random(min, max));\n            }\n            return results;\n        })().join(' ');\n\n        const dice = number + 'd' + max;\n        const message = this.intl\n            .t('chat.commands.roll.message', {\n                roll: roll,\n                dice: dice\n            })\n            .toString();\n\n        if (cmdOptions.isMessageEdit) {\n            return message;\n        } else {\n            this.sendAction('sendMessage', message, this.activeRoom);\n        }\n    },\n\n    editMessage(cmd, message, cmdOptions = {}, fullMessage) {\n        if (!this.get('chat.canCorrectMessages')) {\n            if (cmdOptions.isMessageEdit) {\n                return fullMessage;\n            } else {\n                return;\n            }\n        }\n\n        const room = this.activeRoom;\n        const [replaceText, replaceWith] = message.split('/');\n\n        if (!replaceText || !replaceWith) {\n            return fullMessage;\n        }\n\n        const messages = [...(room.get('messages') || [])].reverse();\n        const prevMessage = messages.find(message => {\n            return message.from === this.get('session.person.jid') && !message.get('corrects');\n        });\n\n        if (!prevMessage || !prevMessage.get('id') || !prevMessage.get('isEditable') || cmdOptions.isMessageEdit) {\n            return fullMessage;\n        }\n\n        const body = prevMessage.get('messageDisplay.raw').replace(replaceText, replaceWith);\n        const options = {\n            body,\n            to: room.get('jid'),\n            corrects: prevMessage.get('id')\n        };\n\n        this.sendMessage(body, room, options).then(() => {\n            this.disableMessagePendingForUploadFlag();\n        });\n    },\n\n    searchCommand(cmd, args) {\n        this.sendAction('triggerChatSearch', args);\n    },\n\n    openPreferences() {\n        this.settings.open();\n    },\n\n    muteRoom() {\n        this.chat.setRoomMuted(this.get('activeRoom.jid'), true);\n    },\n\n    unmuteRoom() {\n        this.chat.setRoomMuted(this.get('activeRoom.jid'), false);\n    },\n\n    _toggleAllMedia(state) {\n        (this.get('activeRoom.messages') || []).forEach(message => {\n            (message.get('mediaItems') || []).forEach(item => {\n                return item.set('collapsed', state);\n            });\n        });\n    },\n\n    collapseMedia() {\n        this._toggleAllMedia(true);\n    },\n\n    expandMedia() {\n        this._toggleAllMedia(false);\n    },\n\n    setPresence(cmd, args) {\n        if (!args || !args.trim()) {\n            args = 'available';\n        }\n        this.setSessionUsersPresence(args);\n    },\n\n    afk() {\n        this.presenceSubscription.changePresence(this.get('session.person.presence') === 'away' ? 'available' : 'away');\n    },\n\n    dnd() {\n        this.presenceSubscription.changePresence(this.get('session.person.presence') === 'busy' ? 'available' : 'busy');\n    },\n\n    setSessionUsersPresence(presenceString) {\n        const presence = this.session.getPresence(presenceString);\n        if (presence && presence.id) {\n            this.chat.setOrganizationPresenceId(presence.id);\n        }\n    },\n\n    showLocation(cmd, args, cmdOptions = {}) {\n        let message;\n        if (!this.get('geolocation.isEnabled')) {\n            console.error('Tried to show location with no geolocation capabilities (chat command)');\n            message = this.intl.t('chat.commands.map.error').toString();\n            return;\n        }\n        let zoom = Number(args) || 12;\n        if (zoom > 16) {\n            zoom = 16;\n        } else if (zoom < 0) {\n            zoom = 1;\n        }\n        const position = this.get('geolocation.currentPosition');\n        if (!position) {\n            message = this.intl.t('chat.commands.map.error').toString();\n            this.showError(message);\n        } else {\n            const lat = position.coords.latitude;\n            const lon = position.coords.longitude;\n            const coords = `${lat},${lon}`;\n            const lang = this.get('intl.isoLocale').substring(0, 2);\n            const imgUrl = `https://maps.googleapis.com/maps/api/staticmap?center=${coords}&size=500x500&zoom=${zoom}&maptype=roadmap&markers=color:red%7Clabel:C%7C${coords}&language=${lang}#.jpg`;\n\n            if (cmdOptions.isMessageEdit) {\n                return imgUrl;\n            } else {\n                this.sendAction('sendMessage', imgUrl, this.activeRoom);\n            }\n        }\n    },\n\n    showWeather(cmd, args, cmdOptions = {}) {\n        let message;\n        if (!this.get('geolocation.isEnabled')) {\n            console.error('Tried to use location with no geolocation capabilities (chat command)');\n            message = this.intl.t('chat.commands.weather.error').toString();\n            this.showError(message);\n            return;\n        }\n        const position = this.get('geolocation.currentPosition');\n        if (!position || !position.coords) {\n            message = this.intl.t('chat.commands.weather.error').toString();\n            this.showError(message);\n        } else {\n            const lat = position.coords.latitude;\n            const lon = position.coords.longitude;\n            const coords = `${lat},${lon}`;\n            const lang = this.get('intl.isoLocale').substring(0, 2);\n            let units = 'us';\n            if (navigator.language.toLowerCase() !== 'en-us') {\n                units = 'si';\n            }\n            const request = `https://api.forecast.io/forecast/49a79bf65564064f470261f904ad135a/${coords}`;\n            $.ajax({\n                url: request,\n                data: {\n                    lang: lang,\n                    units: units\n                },\n                dataType: 'jsonp'\n            }).then(\n                bind(this, data => {\n                    data.currently.precipProbability = `${data.currently.precipProbability * 100}`;\n                    message = this.intl.t('chat.commands.weather.message', data.currently).toString();\n\n                    if (cmdOptions.isMessageEdit) {\n                        return message;\n                    } else {\n                        this.sendAction('sendMessage', message, this.activeRoom);\n                    }\n                })\n            );\n        }\n    },\n\n    sendWhisper(cmd, args) {\n        const split = args.split(']') || [];\n        const name = split[0] + ']';\n        const list = this.mentionList;\n        const id = list[list.indexOf(name) + 1];\n\n        // remove the first mention\n        const message = args.replace(/\\[@[A-Za-z,\\s]+\\]\\(#\\/person\\/[a-z0-9]+\\)\\s/, '');\n\n        let roomJid = null;\n        this.store\n            .find('person', id)\n            .then(function (data) {\n                roomJid = data.get('jid');\n            })\n            .then(() => {\n                const time = moment();\n                const room = this.chat.getChatRoom(roomJid);\n                this.chat.sendMessageToRoom(roomJid, message).catch(err => {\n                    return this.chat.messageFailedToSend(room, time, err);\n                });\n            });\n    },\n\n    startStopCobrowse(cmd, args, cmdOptions = {}) {\n        const activeSession = this.get('cobrowse.activeSession');\n        if (activeSession) {\n            return this.cobrowse.stopCobrowse();\n        } else {\n            return this.cobrowse.startCobrowse().then(activeSession => {\n                const viewerUrl = activeSession.getViewerUrl();\n\n                const message = this.intl\n                    .t('chat.commands.cobrowse.sessionStart', {\n                        viewerUrl: activeSession.getViewerUrl()\n                    })\n                    .toString();\n\n                const onSessionStateChange = event => {\n                    const sessionState = event.newValue;\n                    if (sessionState.isEnded()) {\n                        activeSession.removeListener('change:sessionState', onSessionStateChange);\n                        const message = this.intl\n                            .t('chat.commands.cobrowse.sessionStop', {\n                                viewerUrl\n                            })\n                            .toString();\n\n                        if (cmdOptions.isMessageEdit) {\n                            return message;\n                        } else {\n                            this.sendAction('sendMessage', message, this.activeRoom);\n                        }\n                    }\n                };\n\n                activeSession.on('change:sessionState', onSessionStateChange);\n\n                if (cmdOptions.isMessageEdit) {\n                    return message;\n                } else {\n                    this.sendAction('sendMessage', message, this.activeRoom);\n                }\n            });\n        }\n    },\n\n    showError(message) {\n        this.notification.error(null, message, {\n            forceBrowserNotification: true\n        });\n    }\n});\n","import { setOwner, getOwner } from '@ember/application';\nimport { inject as service } from '@ember/service';\nimport Mixin from '@ember/object/mixin';\nimport EmberObject, { computed } from '@ember/object';\nimport Ember from 'ember';\nimport _ from 'lodash';\nimport GithubItemModel from '../models/github-item';\n\nconst { generateGuid } = Ember;\n\nconst imageRegex = /\\.(jpe?g|gifv?|png)(\\?.*)?(#.*)?$/i;\nconst timeStampRegex = /(\\d+h)?(\\d+m)?(\\d+s)?$/i;\n\nconst audioRegex = /\\.(mp3|aac|wav)(\\?.*)?(#.*)?$/i;\n\n/*\nhttps://media4.giphy.com/media/R06WhFXLF1Fmw/200w.gif\nhttp://i.giphy.com/R06WhFXLF1Fmw.gif\nhttp://giphy.com/embed/R06WhFXLF1Fmw\nhttp://giphy.com/gifs/christmas-cat-R06WhFXLF1Fmw\nhttp://giphy.com/gifs/R06WhFXLF1Fmw\n*/\nconst giphyRegex = /^https?:\\/\\/.*?giphy\\.com\\/.*?([0-9a-z]{13,}).*?$/i;\nconst giphyIdIndex = 1;\n\nconst imgurRegex = /^(http:\\/\\/)?.{1}\\.imgur\\.com\\/([0-9a-z]{0,})\\..*$/i;\n\n// regex for identifying youtube links\n// adapted from http://stackoverflow.com/a/10315969\n// + revised to include additional timestamp param\nconst youtubeRegex =\n    /^(?:https?:\\/\\/)?(?:www\\.|gaming\\.)?(?:youtu\\.be\\/|youtube\\.com\\/(?:embed\\/|v\\/|watch\\?v=|watch\\?.+&v=|))((\\w|-){11})(?:[&])?(?:t=)?([^&]+)?$/;\nconst youtubeIdIndex = 1; // identify the capture group position that contains the ID, convenient in case the regex changes\nconst youtubeTimeStampIndex = 3;\n\n// adapted from http://stackoverflow.com/questions/13286785/get-video-id-from-vimeo-url\n// + revised to include additional timestamp param\nconst vimeoRegex =\n    /https?:\\/\\/(?:www\\.|player\\.)?vimeo.com\\/(?:channels\\/(?:\\w+\\/)?|groups\\/([^/]*)\\/videos\\/|album\\/(\\d+)\\/video\\/|video\\/|)(\\d+)(?:$|\\/|\\?|#)?(?:t=)?([^&]+)?$/i;\nconst vimeoIdIndex = 3; // identify the capture group position that contains the ID, convenient in case the regex changes\nconst vimeoTimeStampIndex = 4;\n\nconst ghGistRegex = /http(?:s)?:\\/\\/gist.github\\.com\\/([a-zA-Z0-9_]+)\\/([a-zA-Z0-9]+)(?:\\.js)?/i;\nconst ghRepoRegex = /http(?:s)?:\\/\\/github\\.com\\/([a-zA-Z0-9_\\-.]+)\\/([a-zA-Z0-9\\-.]+)\\/?(?:\\/issues\\/[0-9]+)?$/i;\nconst twitterRegex = /http(?:s)?:\\/\\/(?:mobile.)?twitter\\.com\\/(?:#!\\/)?[a-zA-Z0-9_]+\\/status\\/([0-9]+)/i;\nconst googleSlidesRegex = /https?:\\/\\/docs.google.com\\/presentation\\/d\\/[a-zA-Z0-9_-]*\\//i;\nconst soundcloudRegex = /https?:\\/\\/soundcloud\\.com\\/(?!(stream|you)).+/i;\n\nfunction getImageShortName(url = '') {\n    const pattern = /([A-Z0-9_-]{1,}\\.(?:png|jpg|gif|jpeg))/i;\n    const match = pattern.exec(url);\n    if (match) {\n        return window.decodeURI(match.shift());\n    }\n    return window.decodeURI(url.split('/').pop());\n}\n\n// convert timestamp (1m30s) to parseable integer (90).\nfunction parseTimeStamp(timeStamp) {\n    if (timeStamp.indexOf('h') < 0 && timeStamp.indexOf('m') < 0 && timeStamp.indexOf('s') < 0) {\n        return parseInt(timeStamp);\n    }\n    timeStamp = timeStampRegex.exec(timeStamp);\n    timeStamp =\n        (timeStamp[1] ? parseInt(timeStamp[1]) * 360 : 0) +\n        (timeStamp[2] ? parseInt(timeStamp[2]) * 60 : 0) +\n        (timeStamp[3] ? parseInt(timeStamp[3]) : 0);\n    return timeStamp;\n}\n\nexport default Mixin.create({\n    intl: service(),\n\n    mediaItems: computed('images', 'videos', 'gists', 'githubRepos', 'tweets', function () {\n        const images = this.images;\n        const videos = this.videos;\n        const giphies = this.giphies;\n        const audios = this.audios;\n        const gists = this.gists;\n        const repos = this.githubRepos;\n        const tweets = this.tweets;\n        const googleSlides = this.googleSlides;\n        const soundcloud = this.soundcloud;\n\n        return _.union(images, videos, giphies, gists, repos, tweets, googleSlides, soundcloud, audios).map(item => {\n            item.set(\n                'mediaRenderer',\n                'chat-panel/conversation/conversation-pane/messages/widgets/media-item/' + item.get('mediaType')\n            );\n            return item;\n        });\n    }),\n\n    getLinks() {\n        return this.links || [];\n    },\n\n    /***********\n    exampleMediaType: computed('links', function () {\n        The 'links' property can sometimes be null/undefined, so use this.getLinks() to safely get a non-null array\n\n        map and filter links to match your media type\n        items are required have the following base properties:\n        {\n            mediaType,\n            title\n        }\n        other properties can be used to render the 'body' of the media\n    }),\n    ************/\n\n    images: computed('links', function () {\n        const links = _.filter(this.getLinks(), link => {\n            if (!link.match(imageRegex)) {\n                return false; // don't return any links not matching images\n            }\n            if (link.match(giphyRegex)) {\n                return false; // don't match giphy images here\n            }\n            if (link.startsWith('http://')) {\n                return link.match(imgurRegex); // if it's http, only return if it's imgur (can be upgraded to https)\n            }\n            return true; // all conditions met\n        });\n\n        return _.map(links, url => {\n            let gifv;\n            let match = imgurRegex.test(url);\n            if (url.endsWith('gifv')) {\n                gifv = {\n                    webm: url.replace('.gifv', '.webm'),\n                    mp4: url.replace('.gifv', '.mp4')\n                };\n            }\n            if (match) {\n                if (url.startsWith('http://')) {\n                    url = url.replace('http://', 'https://');\n                }\n            }\n            return EmberObject.create({\n                mediaType: 'inline-image',\n                url,\n                gifv: gifv,\n                title: getImageShortName(url),\n                identifier: generateGuid(null, 'inline-image')\n            });\n        });\n    }),\n\n    videos: computed('links', function () {\n        const links = this.getLinks();\n\n        let youtubeLinks = links\n            .map(link => youtubeRegex.exec(link))\n            .filter(match => !!match)\n            .map(match => {\n                let id = match[youtubeIdIndex];\n                let timeStamp = match[youtubeTimeStampIndex]\n                    ? `?start=${parseTimeStamp(match[youtubeTimeStampIndex])}`\n                    : '';\n                return EmberObject.create({\n                    mediaType: 'inline-video',\n                    title: this.intl.safestring('chat.inlineMedia.youtube').toString(),\n                    id: id,\n                    videoUrl: `https://www.youtube.com/embed/${id}${timeStamp}`\n                });\n            });\n\n        let vimeoLinks = links\n            .map(link => vimeoRegex.exec(link))\n            .filter(match => !!match)\n            .map(match => {\n                let id = match[vimeoIdIndex];\n                let timeStamp = match[vimeoTimeStampIndex] ? `#t=${parseTimeStamp(match[vimeoTimeStampIndex])}` : '';\n                return EmberObject.create({\n                    mediaType: 'inline-video',\n                    title: this.intl.safestring('chat.inlineMedia.vimeo').toString(),\n                    id: id,\n                    videoUrl: `//player.vimeo.com/video/${id}${timeStamp}`\n                });\n            });\n\n        return _.union(youtubeLinks, vimeoLinks);\n    }),\n\n    giphies: computed('links', function () {\n        return this.getLinks()\n            .map(link => giphyRegex.exec(link))\n            .filter(match => !!match)\n            .map(match => {\n                const id = match[giphyIdIndex];\n                return EmberObject.create({\n                    mediaType: 'inline-video',\n                    title: this.intl.safestring('chat.inlineMedia.giphy').toString(),\n                    id,\n                    videoUrl: `https://giphy.com/embed/${id}?html5=true`\n                });\n            });\n    }),\n\n    gists: computed('links', function () {\n        return this.getLinks()\n            .map(link => {\n                let matches = ghGistRegex.exec(link);\n                if (matches && (matches.length === 2 || matches.length === 3)) {\n                    let modelData = {\n                        mediaType: 'github-gist',\n                        username: matches[1],\n                        url: `https://gist.github.com/${matches[1]}/${matches[2]}.json?callback=?`\n                    };\n\n                    setOwner(modelData, getOwner(this));\n\n                    return GithubItemModel.create(modelData);\n                }\n                return undefined;\n            })\n            .filter(gist => !!gist);\n    }),\n\n    githubRepos: computed('links', function () {\n        return this.getLinks()\n            .map(link => {\n                let matches = ghRepoRegex.exec(link);\n                if (matches && (matches.length === 2 || matches.length === 3)) {\n                    let modelData = {\n                        mediaType: 'github-repo',\n                        username: matches[1],\n                        repo: matches[2],\n                        link: link,\n                        url: `https://api.github.com/repos/${matches[1]}/${matches[2]}`\n                    };\n\n                    setOwner(modelData, getOwner(this));\n\n                    return GithubItemModel.create(modelData);\n                }\n\n                return undefined;\n            })\n            .filter(repo => !!repo);\n    }),\n\n    tweets: computed('links', function () {\n        return this.getLinks()\n            .map(link => {\n                let matches = twitterRegex.exec(link);\n                if (matches && matches.length === 2) {\n                    return EmberObject.create({\n                        mediaType: 'twitter-card',\n                        title: this.intl.safestring('chat.inlineMedia.tweet').toString(),\n                        tweetId: matches[1],\n                        url: link,\n                        tweetInfo: null\n                    });\n                }\n                return undefined;\n            })\n            .filter(tweet => !!tweet);\n    }),\n\n    googleSlides: computed('links', function () {\n        return this.getLinks()\n            .map(link => googleSlidesRegex.exec(link))\n            .filter(match => !!match)\n            .map(match => {\n                let url = match[0];\n                return EmberObject.create({\n                    mediaType: 'google-slides',\n                    title: this.intl.safestring('chat.inlineMedia.googleSlides').toString(),\n                    url: `${url}embed?start=false&loop=false&delayms=3000`\n                });\n            });\n    }),\n\n    soundcloud: computed('links', function () {\n        return this.getLinks()\n            .map(link => soundcloudRegex.exec(link))\n            .filter(match => !!match)\n            .map(match => {\n                let url = match[0];\n                return EmberObject.create({\n                    mediaType: 'soundcloud',\n                    title: this.intl.safestring('chat.inlineMedia.soundcloud').toString(),\n                    url: url\n                });\n            });\n    }),\n\n    audios: computed('links', function () {\n        return this.getLinks()\n            .map(link => {\n                return {\n                    match: !!audioRegex.exec(link),\n                    link\n                };\n            })\n            .filter(res => res.match)\n            .map(res => {\n                return EmberObject.create({\n                    mediaType: 'inline-audio',\n                    title: this.intl.safestring('chat.inlineMedia.audio').toString(),\n                    url: res.link\n                });\n            });\n    })\n});\n","import { computed } from '@ember/object';\nimport { alias, bool } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport Mixin from '@ember/object/mixin';\nimport { displayDateRelativeToToday } from '../utils/dates';\nimport { compareJids } from 'web-directory/utils/jid-helpers';\nimport { getEntityObjectId } from 'web-directory/utils/jid-helpers';\n\nexport default Mixin.create({\n    intl: service(),\n    session: service(),\n\n    acdChatUser: alias('room.acdCustomerParticipant'),\n\n    isYou: computed('chatUser.jid', 'session.person.jid', function () {\n        return compareJids(this.get('chatUser.jid'), this.get('session.person.jid'));\n    }),\n\n    isAcdChatUser: computed('chatUser.id', 'acdChatUser.id', function () {\n        const chatUserId = getEntityObjectId(this.get('chatUser.id'));\n        const acdChatUserId = getEntityObjectId(this.get('acdChatUser.id'));\n        return chatUserId === acdChatUserId;\n    }),\n\n    isLastMessage: computed('room.messages.lastObject.id', function () {\n        return this.id === this.get('room.messages.lastObject.id');\n    }),\n\n    messageTime: computed('time', function () {\n        return displayDateRelativeToToday(this.time, this.get('intl.isoLocale'));\n    }),\n\n    messageDisplay: computed('correction', function () {\n        const correction = this.correction;\n        if (correction) {\n            return correction;\n        } else {\n            return this;\n        }\n    }),\n\n    isCorrection: bool('correction')\n});\n","import { later } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport Evented from '@ember/object/evented';\nimport Mixin from '@ember/object/mixin';\nimport { task, timeout } from 'ember-concurrency';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport StreamingService from 'web-directory/services/streaming';\nimport { isAcdJid, isMeetingJid, isScreenRecordingJid, isSupervisorJid } from 'web-directory/utils/jid-helpers';\nimport _ from 'lodash';\nimport { isTesting } from 'web-directory/utils/testing';\nimport moment from '../../utils/dates';\n\nconst ChatEvents = Mixin.create(Evented, LoggerMixin, {\n    phone: service(),\n    session: service(),\n    permissions: service(),\n    streaming: service(),\n    batchDataRequests: service(),\n    roster: service(),\n    intl: service(),\n\n    initialDataLoaded: false,\n    connected: false,\n    historyDirty: false,\n    handleHiddenRooms: true,\n\n    hiddenRooms: {},\n\n    _delayTime: 4000,\n\n    // Server Connection Events\n    connect: StreamingService.streamingEvent(function () {\n        if (!this.initialDataLoaded) {\n            this.set('initialDataLoaded', true);\n            this._firstConnectionEventTask.perform();\n        }\n        // ACD Chat still uses realtime and needs to know it's connected\n        this.set('connected', true);\n\n        if (!this.get('permissions.canViewBusinessChat')) {\n            // initial user presence is fetched here\n            // realtime will still issue a connect event\n            this.trigger('connected');\n            this._loadProfileAfterRealtime();\n            return;\n        }\n\n        this.trigger('connected');\n        this._loadProfileAfterRealtime();\n    }),\n\n    disconnect: StreamingService.streamingEvent(function () {\n        this.set('connected', false);\n    }),\n\n    unauthorized: StreamingService.streamingEvent(function () {\n        this.set('connected', false);\n    }),\n\n    // Chat Events\n    activeChat: StreamingService.streamingEvent(function ({ jid, last }) {\n        this.getChatRoom(jid).then(room => {\n            if (last && !room.get('lastMessageTimeRadix')) {\n                let time = moment(last);\n                room.set('lastMessageTime', time);\n                room.set('lastMessageTimeRadix', time.valueOf());\n            }\n\n            if (isAcdJid(jid) || isMeetingJid(jid) || isScreenRecordingJid(jid)) {\n                return this.processHiddenRooms(jid);\n            }\n\n            if (room.objectId === 'supervisorassistance') {\n                this.checkActiveRoomAgainstHistory(room);\n                return;\n            }\n        });\n    }),\n\n    message: StreamingService.streamingEvent(function (message) {\n        if (\n            isAcdJid(message.to) ||\n            isMeetingJid(message.to) ||\n            isScreenRecordingJid(message.to) ||\n            isSupervisorJid(message.to)\n        ) {\n            // ACD/meeting/screen recording/supervisor messages still use legacy chat\n            const children = message.stanza.children;\n            const isMention = children.findBy('name', 'reference') !== undefined;\n            if (isMention) {\n                this._handleXMPPReferenceMention(message);\n            }\n\n            let roomJid = this.getTargetRoomJid(message);\n            this.getChatRoom(roomJid).then(room => {\n                this.get('streaming.connection').setActive(roomJid);\n                if (this.isRoomVisible(roomJid)) {\n                    this.focusRoom(room);\n                }\n                this.roster.removeRoomFromClosed(room);\n                // is this addRoomToDashboard even needed anymore, where are dashboard rooms used?\n                this.addRoomToDashboard(room);\n                this.processNewChatMessage(message).then(messageModel => {\n                    room.addMessage(messageModel);\n                    if (room.isOneToOneRoom()) {\n                        this.savePersonalChats(messageModel, room);\n                    } else {\n                        this.savePersonalMentions(messageModel);\n                        this.saveRoomChats(messageModel, room);\n                        this.roster.incrementUnreadGroupMessage(messageModel, room);\n                    }\n                    if (isAcdJid(roomJid)) {\n                        this.sendAcdNotification(messageModel);\n                    } else {\n                        if (this.get('permissions.canViewBusinessChat')) {\n                            this.sendNotification(messageModel);\n                        }\n                    }\n                });\n            });\n        }\n    }),\n\n    subjectChange: StreamingService.streamingEvent(function ({ room, subject }) {\n        if (!isSupervisorJid(room)) {\n            return;\n        }\n        this.getChatRoom(room).then(roomModel => {\n            this.updateRoomSubject(roomModel, subject);\n        });\n    }),\n\n    chatState: StreamingService.streamingEvent(function ({ room, from, state }) {\n        if (!isAcdJid(room)) {\n            return;\n        }\n        const oneToOne = _.isEmpty(room);\n\n        if (state === 'composing') {\n            this.batchDataRequests.getChatUser(from).then(user => {\n                if (oneToOne) {\n                    room = user.get('jid');\n                }\n                this.addResponder(room, user);\n            });\n        } else if (state === 'paused' || state === 'active') {\n            this.batchDataRequests.getChatUser(from).then(user => {\n                this.removeResponder(room, user.get('name'), user.get('jid'));\n            });\n        }\n    }),\n\n    _handleXMPPReferenceMention({ stanza: { children }, from, to }) {\n        const personJid = this.get('session.person.jid');\n        const referenceChildren = _.filter(children, {\n            name: 'reference',\n            attrs: {\n                uri: personJid,\n                action: 'SUCCEEDED'\n            }\n        });\n\n        referenceChildren.forEach(() => {\n            this._handleMentionEvent(from, to);\n        });\n    },\n\n    _handleMentionEvent(from, room, subject) {\n        this.loadRoomAndUser(room, from).then(({ room, person }) => {\n            if (subject) {\n                this.updateRoomSubject(room, subject);\n            }\n            this.sendMentionNotification(room, person);\n        });\n    },\n\n    _firstConnectionEventTask: task(function* () {\n        yield timeout(isTesting ? 1000 : 4000);\n        let room = yield this.getChatRoom('supervisorassistance');\n        if (!this.get('session.person.isEngageUser')) {\n            // If the user no longer has permissions to join\n            // this room -- remove them so they no longer\n            // receive notifications for it. It will already\n            // be hidden in their roster.\n            console.info('Leaving supervisor assistance room.');\n            yield this.closeActiveRoom(room);\n            this.leaveAcdRoom(room.get('jid'));\n        }\n    }),\n\n    processHiddenRooms(jid) {\n        if (this.handleHiddenRooms) {\n            const inactiveRooms = this.hiddenRooms;\n            const type = _.head(jid.split('-'));\n\n            inactiveRooms[type] = (inactiveRooms[type] || 0) + 1;\n\n            this._debounceHiddenRoomTask.perform();\n        }\n    },\n\n    _debounceHiddenRoomTask: task(function* () {\n        yield timeout(isTesting ? 1000 : 15000);\n        this.logHiddenRoomCount();\n    }).restartable(),\n\n    logHiddenRoomCount() {\n        this.set('handleHiddenRooms', false);\n        this.logger.info('chat: roster hidden room count', this.hiddenRooms);\n    },\n\n    _loadProfileAfterRealtime(attempts = 0) {\n        // After realtime connects, events will flow through the API that will result in presence being updated\n        // While we connect to realtime after hawk, we are not necessarily guaranteed that we will receive\n        // a notification on presence update (hawk could still be processing our connect attempt, for example)\n        // So we should grab the latest profile data (which includes presence info used throughout the UI)\n        // in the future, after some time has passed.\n        later(() => {\n            let person = this.get('session.person');\n            if (person) {\n                this.logger.info('chat: connected, reloading local user info');\n                person.reload().then(() => {\n                    let presence = person.get('presence');\n                    if (presence && presence.toLowerCase() === 'offline') {\n                        this.logger.error('chat: person still marked as offline after delayed request');\n                        if (attempts === 0) {\n                            this._loadProfileAfterRealtime(attempts + 1);\n                        }\n                    }\n                });\n            }\n        }, this._delayTime);\n    }\n});\n\nexport default ChatEvents;\n","import { get } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Mixin from '@ember/object/mixin';\nimport { compareJids } from 'web-directory/utils/jid-helpers';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nconst VIDEO_NOTIFICATION_WIDGET_TYPES = ['video-notification', 'videoNotification'];\n\nconst MessageNotificationsMixin = Mixin.create(LoggerMixin, {\n    intl: service(),\n    session: service(),\n    interaction: service(),\n    notification: service(),\n    chat: service(),\n    webrtc: service(),\n    preferences: service(),\n\n    sendMentionNotification(room, person, message) {\n        // You shouldn't get a mention notification for yourself, which happens when sending a quote from another client\n        // like mobile\n        if (this.get('session.person.id') === person.get('id')) {\n            return;\n        }\n\n        if (this.shouldShowMentionNotification(room, message)) {\n            let roomName = '';\n\n            roomName = get(message, 'roomName');\n\n            const title = person.get('name');\n            const toastMessage = this.intl\n                .t('notification.titles.chatMention', {\n                    roomName\n                })\n                .toString();\n            this.notification.info(title, toastMessage, {\n                icon: person.get('profilePicture.x128'),\n                tag: room.get('jid'),\n                hideAfter: 10,\n                soundId: 'chat',\n                shouldShowPopup: true,\n                shouldPlaySound: !this.get('preferences.chat.global.soundsMuted'),\n                target: this.applicationController,\n                volume: this.getNotificationVolume(),\n                notificationOutputDeviceId: this.getNotificationOutputDeviceId()\n            });\n        }\n    },\n\n    sendNotification(message) {\n        if (this.shouldShowNotification(message)) {\n            let showPopup =\n                this.get('preferences.notifications.global.showGroupNotifications') ||\n                message.get('room').isOneToOneRoom();\n            let playSound = showPopup && !this.get('preferences.chat.global.soundsMuted');\n            let title = this.getNotificationTitle(message.get('room'), message.get('chatUser'), message);\n            let messageBody, raw;\n\n            if (VIDEO_NOTIFICATION_WIDGET_TYPES.includes(message.widgetType)) {\n                const messageKey = `chat.video.chatNotifications.${message.get('widget.data.type')}`;\n                const intl = this.intl;\n                if (intl.exists(messageKey)) {\n                    messageBody = this.intl.safestring(messageKey).toString();\n                    raw = this.intl.t(messageKey);\n                } else {\n                    messageBody = message.get('messageBody');\n                    raw = message.get('raw');\n                }\n            } else {\n                messageBody = message.get('messageBody');\n                raw = message.get('raw');\n            }\n\n            this.notification.info(title, messageBody, {\n                icon: message.get('chatUser.profilePicture.x128'),\n                rawMessage: raw,\n                tag: message.get('room.jid'),\n                hideAfter: 8,\n                soundId: 'chat',\n                shouldShowPopup: showPopup,\n                shouldPlaySound: playSound,\n                target: this.applicationController,\n                volume: this.getNotificationVolume(),\n                notificationOutputDeviceId: this.getNotificationOutputDeviceId()\n            });\n        }\n    },\n\n    sendAcdNotification(message) {\n        if (this.shouldShowNotification(message)) {\n            let showPopup = !this.get('interaction.isInteractionViewOpen');\n            let playSound = !this.get('preferences.chat.global.soundsMuted');\n            let title = message.get('room.acdCustomerParticipant.name');\n            let messageBody = message.get('messageBody');\n\n            this.notification.info(title, messageBody, {\n                icon: message.get('chatUser.profilePicture.x128'),\n                rawMessage: message.get('raw'),\n                messageStyle: 'acd-toast-notification',\n                tag: message.get('room.jid'),\n                hideAfter: false,\n                soundId: 'chat',\n                shouldShowPopup: showPopup,\n                shouldPlaySound: playSound,\n                target: this.applicationController,\n                volume: this.getNotificationVolume(),\n                notificationOutputDeviceId: this.getNotificationOutputDeviceId()\n            });\n        }\n    },\n\n    sendEngageNotification(message) {\n        let title = message.title;\n        let body = message.body;\n        let options = {\n            rawMessage: body,\n            hideAfter: message.hideAfter,\n            markdownToHtml: false,\n            shouldShowPopup: true,\n            shouldPlaySound: false,\n            clickHandler: message.clickHandler,\n            target: this.applicationController,\n            volume: this.getNotificationVolume(),\n            notificationOutputDeviceId: this.getNotificationOutputDeviceId()\n        };\n\n        if (message.severity === 'error') {\n            this.notification.error(title, body, options);\n        } else {\n            this.notification.info(title, body, options);\n        }\n    },\n\n    shouldShowNotification(message) {\n        let isBusyUser = this.get('session.person.presence') === 'busy' && !message.get('room').isOneToOneRoom();\n        let isDuplicate = false;\n        if (message.duplicate) {\n            isDuplicate = message.get('duplicate');\n        }\n\n        let messageAlreadySeen = !message.get('unread');\n        let fromLoggedInUser = compareJids(message.get('chatUser.jid'), this.get('session.person.jid'));\n        let targetRoomIsMuted = false;\n        let roomIsVisible = false;\n        let windowFocused = this.windowInFocus();\n        let isSupervisorRoom = false;\n        roomIsVisible = message.get('currentSelectedRoom.jid') === message.get('room.jid') && windowFocused;\n        targetRoomIsMuted = message.get('isRoomMuted');\n\n        // Negative cases that block notifications are checked first.\n        if (\n            isBusyUser ||\n            isDuplicate ||\n            messageAlreadySeen ||\n            fromLoggedInUser ||\n            roomIsVisible ||\n            targetRoomIsMuted ||\n            isSupervisorRoom\n        ) {\n            return false;\n        } else if (!roomIsVisible || !windowFocused) {\n            //Then positive cases that indicate a notification should be shown are checked.\n            return true;\n        }\n\n        // The final default is to not show a notification\n        return false;\n    },\n\n    shouldShowMentionNotification(room, message) {\n        let targetRoomIsMuted = false;\n        let roomIsVisible = false;\n        let groupNotificationsEnabled = false;\n        let coveredByMessageNotification = false;\n\n        if (message) {\n            targetRoomIsMuted = get(message, 'isRoomMuted');\n            roomIsVisible = get(message, 'currentSelectedRoom.jid') === get(message, 'to');\n        }\n        groupNotificationsEnabled = this.get('preferences.notifications.global.showGroupNotifications');\n        coveredByMessageNotification = groupNotificationsEnabled && !targetRoomIsMuted;\n\n        // Don't show a notification if the message is on screen already or if the notification will be covered\n        // by the message notification\n        if (roomIsVisible || coveredByMessageNotification) {\n            return false;\n        }\n\n        // Unlike messages the default for a mention notification is true\n        return true;\n    },\n\n    getNotificationTitle(room, chatUser, message) {\n        if (room.isOneToOneRoom()) {\n            return chatUser.get('name');\n        } else {\n            const features = this.get('session.features');\n            const hasSystemMessagesEnabled = features && features['CHAT-3304_RealtimeEnableSystemMessages'];\n            let personName =\n                message.from.includes('@conference') && hasSystemMessagesEnabled\n                    ? this.intl.safestring('chat.systemMessage').toString()\n                    : chatUser.get('name');\n            let roomName = '';\n            if (message) {\n                roomName = message.get('roomName');\n            } else {\n                roomName = room.getRawDisplaySubject();\n            }\n            return this.intl\n                .t('notification.titles.chatRoomMessage', {\n                    personName: personName,\n                    roomName: roomName\n                })\n                .toString();\n        }\n    },\n\n    sendTestNotification() {\n        let title = this.intl.safestring('notification.titles.testNotification').toString();\n        let message = this.intl.safestring('notification.titles.testText').toString();\n        this.notification.info(title, message, {\n            icon: this.get('session.person.profilePicture.x128'),\n            tag: 'test-message',\n            hideAfter: 8,\n            soundId: 'chat',\n            shouldShowPopup: true,\n            shouldPlaySound: true,\n            target: this.applicationController,\n            volume: this.getNotificationVolume(),\n            notificationOutputDeviceId: this.getNotificationOutputDeviceId(),\n            clickHandler: () => {}\n        });\n    },\n\n    getNotificationVolume() {\n        let volume = this.get('chat.chatNotificationVolume');\n        if (volume > 1) {\n            volume = volume / 100;\n        }\n        return volume;\n    },\n\n    getNotificationOutputDeviceId() {\n        return this.get('webrtc.notificationOutputDeviceId');\n    }\n});\n\nexport default MessageNotificationsMixin;\n","import { later } from '@ember/runloop';\nimport { get } from '@ember/object';\nimport { getOwner } from '@ember/application';\nimport { defer, reject } from 'rsvp';\nimport { inject as service } from '@ember/service';\nimport Mixin from '@ember/object/mixin';\nimport moment from 'moment';\nimport { markdownToHtml } from '../../utils/markdown';\nimport ChatMessage from '../../models/chat-message';\nimport uuid from 'uuid';\n\nexport default Mixin.create({\n    batchDataRequests: service(),\n\n    messageDelayDefault: 200,\n    messageDelay: 200,\n    maxDelay: 25000,\n\n    _splitOverSizedMessage(message) {\n        //this regex pattern will try to split the message as close to 4000 characters as possible,\n        //if 4000 character falls on the middle of a word it will split before the word begins. If splitting\n        //isn't possible due to a long string of characters without a space it will just split at the 4,000\n        //character mark.\n        const pattern = /^(?:([\\s\\S]{1,4000}(?=[\\s]|$))|(?!([\\s\\S]{1,4000}(?=[\\s]|$)))[\\s\\S]{1,4000})/i;\n        var messageQueue = [];\n\n        while (message.length > 0) {\n            const result = pattern.exec(message);\n            messageQueue.push(result[0]);\n            message = message.slice(result[0].length);\n        }\n        return messageQueue;\n    },\n\n    _convertSplitMessagesToWidgets(room, messageQueue) {\n        const jid = room.get('jid');\n        const id = uuid.v4();\n        let index = 0;\n\n        return messageQueue.map(message => {\n            const stanza = {\n                name: 'multipart-message',\n                contents: JSON.stringify({\n                    id: id,\n                    index: index++,\n                    messageCount: messageQueue.length\n                })\n            };\n            return {\n                to: jid,\n                body: message,\n                children: [stanza]\n            };\n        });\n    },\n\n    sendSplitMessageQueue(room, messageQueue) {\n        let deferred = defer();\n        this._delayedMessageSender(room, deferred, messageQueue, null);\n        deferred.promise.catch(unsentMessageQueue => {\n            this._addFailedMessagesToRoom(room, unsentMessageQueue);\n            deferred.resolve(null);\n        });\n        return deferred.promise;\n    },\n\n    _addFailedMessagesToRoom(room, unsentMessageQueue) {\n        unsentMessageQueue.forEach(splitWidget => {\n            const jid = room.get('jid');\n            const owner = getOwner(this);\n            const stanza = this._manuallyCreateStanzaForFailedMessage(splitWidget);\n\n            // ownerInjection() must be the first arg in Ember 3.28\n            let message = ChatMessage.create(\n                Object.assign(\n                    {\n                        from: this.get('session.person.jid'),\n                        oid: uuid.v4(),\n                        time: moment(),\n                        stanza: stanza,\n                        links: [],\n                        raw: splitWidget.body,\n                        to: jid,\n                        widget: splitWidget,\n                        sendError: true\n                    },\n                    owner.ownerInjection()\n                )\n            );\n            message.set('messageBody', markdownToHtml(splitWidget.body));\n            this.checkForMentions(message);\n            this.batchDataRequests.getChatUser(message.get('from')).then(person => {\n                message.set('chatUser', person);\n                this.setMessageReadState(message);\n                room.addMessage(message);\n            });\n        });\n    },\n\n    _manuallyCreateStanzaForFailedMessage(splitWidget) {\n        const childName = get(splitWidget, 'children.lastObject.name');\n        const childPayload = get(splitWidget, 'children.lastObject.contents');\n        return {\n            children: [\n                {\n                    name: childName,\n                    children: [childPayload]\n                }\n            ]\n        };\n    },\n\n    findMessageById(room, messageId) {\n        const messageCache = room.get('messageCache');\n        if (Object.prototype.hasOwnProperty.call(messageCache, messageId)) {\n            return messageCache.get(messageId);\n        }\n        return null;\n    },\n\n    _delayedMessageSender(room, deferred, messageQueue, pendingMessage) {\n        if (messageQueue.length === 0) {\n            deferred.resolve(null);\n            return;\n        }\n\n        if (this.messageDelay >= this.maxDelay) {\n            this.set('messageDelay', this.messageDelayDefault);\n            let message = this.findMessageById(room, pendingMessage);\n            const splitWidget = messageQueue.shift();\n            message.setProperties({\n                sendError: true,\n                pending: false,\n                widget: splitWidget\n            });\n            deferred.reject(messageQueue);\n            return;\n        }\n\n        if (pendingMessage !== null) {\n            const failedMessage = messageQueue.get('firstObject');\n            const splitMessageData = JSON.parse(get(failedMessage, 'children.lastObject.contents'));\n            const splitMessageParent = room.get('splitMessageCache').get(splitMessageData.id);\n\n            if (splitMessageParent.get('messageArray.length') > 1) {\n                const message = this.findMessageById(room, pendingMessage);\n                splitMessageParent.get('messageArray').removeObject(message);\n            } else {\n                room.get('messages').removeObject(splitMessageParent);\n                const splitMessageCache = room.get('splitMessageCache');\n                delete splitMessageCache[splitMessageData.id];\n            }\n        }\n\n        this.sendMessageToRoom(room.get('jid'), null, messageQueue[0])\n            .then(() => {\n                messageQueue.shift();\n                this.set('messageDelay', this.messageDelayDefault);\n                later(this, this._delayedMessageSender, room, deferred, messageQueue, null, this.messageDelay);\n            })\n            .catch(messageId => {\n                this.set('messageDelay', this.messageDelay * 2);\n                later(this, this._delayedMessageSender, room, deferred, messageQueue, messageId, this.messageDelay);\n                return reject();\n            });\n    }\n});\n","import { inject as service } from '@ember/service';\nimport { reads, notEmpty } from '@ember/object/computed';\nimport { computed, get } from '@ember/object';\nimport Mixin from '@ember/object/mixin';\nimport _ from 'lodash';\n\nexport default Mixin.create({\n    chatService: service('chat'),\n    oneToOneRoom: null,\n\n    presenceSubscriptionCounter: 0,\n\n    jid: computed('contactInfo.chat', function () {\n        const chatField = this.getFieldValue('contactInfo.chat');\n        if (chatField) {\n            return get(chatField, 'value.jid');\n        }\n        return null;\n    }),\n\n    // Deprecated: Please use entity-presence mixin properties where possible.\n    presence: reads('activityPresence'),\n    chatStatus: reads('primaryStatusMessage'),\n    hasChatStatus: notEmpty('chatStatus'),\n\n    // TODO: these hasMedia computeds should move \"up\" a layer to \"participant\" - a new model layer for persons in rooms\n    hasMedia: computed('mediaPresence', function () {\n        const mediaInfo = this.get('mediaPresence.media');\n        return !!_.find(mediaInfo, media => media.audio || media.video || media.listener);\n    }),\n\n    hasMediaInActiveChatRoom: computed('hasMedia', 'chatService.activeRoom', function () {\n        return this.get('mediaPresence.roomJid') === this.get('chatService.activeRoom.jid');\n    })\n});\n","import { inject as service } from '@ember/service';\nimport Mixin from '@ember/object/mixin';\nimport _ from 'lodash';\n\nconst BASE_URI_V2 = 'api/v2/conversations';\n\nexport default Mixin.create({\n    session: service(),\n    application: service(),\n\n    pcUri: function () {\n        let application = this.application;\n        return application.pcV2Uri.apply(application, arguments);\n    },\n    baseUri: function () {\n        let application = this.application;\n        return application.pcV2Uri(BASE_URI_V2);\n    },\n    callsUri: function (id) {\n        return `${this.communicationUri(id, 'calls')}`;\n    },\n    createCommunicationUri: function (mediaType) {\n        return `${this.baseUri()}/${mediaType}`;\n    },\n    communicationUri: function (id, mediaType) {\n        return !_.isEmpty(mediaType) ? `${this.baseUri()}/${mediaType}/${id}` : `${this.baseUri()}/${id}`;\n    },\n    communicationsUri(id, participantId, mediaType, mediaId) {\n        return `${this.participantUri(id, participantId, mediaType)}/communications/${mediaId}`;\n    },\n    communicationsByTypeUri: function (mediaType) {\n        return this.baseUri() + '?communicationType=' + mediaType;\n    },\n    consultUri: function (id, participantId, mediaType, entity, cancelOrConfineOrConference = false) {\n        if (!cancelOrConfineOrConference) {\n            let endUrlPath = '';\n            switch (entity) {\n                case 'person':\n                    endUrlPath = '/consult/agent';\n                    break;\n                case 'queue':\n                    endUrlPath = '/consult/queue';\n                    break;\n                case 'external':\n                    endUrlPath = '/consult/contact/external';\n                    break;\n                default:\n                    endUrlPath = '/voice/consult';\n            }\n            return this.participantUri(id, participantId, mediaType) + endUrlPath;\n        }\n        return this.participantUri(id, participantId, mediaType) + '/consult';\n    },\n    disconnectMediaTypeUri: function (id, mediaId, participantId, mediaType) {\n        const uri = `${BASE_URI_V2}/${mediaType}/${id}/participants/${participantId}/communications/${mediaId}`;\n        return this.application.pcV2Uri(uri);\n    },\n    getConversationUri: function (id) {\n        return this.communicationUri(id);\n    },\n    mediaRequestUri: function (id) {\n        return `${this.communicationUri(id, 'chats')}/mediarequests`;\n    },\n    mergeToConferenceUri: function (conferenceId) {\n        // api/v2/conversations/calls/{conversationId}/conference\n        return `${this.callsUri(conferenceId)}/conference`;\n    },\n    monitorUri: function (id, participantId, mediaType) {\n        return this.participantUri(id, participantId, mediaType) + '/monitor';\n    },\n    takeoverUri: function (conversationId, participantId) {\n        return this.participantUri(conversationId, participantId, 'messages') + '/takeover';\n    },\n    participantUri: function (id, participantId, mediaType) {\n        return this.participantsUri(id, mediaType) + participantId;\n    },\n    participantsUri: function (id, mediaType) {\n        return this.communicationUri(id, mediaType) + '/participants/';\n    },\n    participantDetailsUri: function (id, participantId) {\n        return this.participantUri(id, participantId) + '/details';\n    },\n    participantWrapupUri: function (id, participantId, mediaType) {\n        return this.participantUri(id, participantId, mediaType) + '/wrapup';\n    },\n    sessionShareCodeUri: function (id, participantId, mediaType) {\n        return this.participantUri(id, participantId, mediaType) + '/codes';\n    },\n    expireSessionShareCodeUri: function (id, participantId, securityKey) {\n        return this.participantUri(id, participantId) + '/codes/' + securityKey;\n    },\n    participantWrapupCodesUri: function (id, participantId, mediaType) {\n        return this.participantUri(id, participantId, mediaType) + '/wrapupcodes';\n    },\n    participantCommunicationWrapupUri: function (id, participantId, mediaType, communicationId) {\n        return this.participantUri(id, participantId, mediaType) + '/communications/' + communicationId + '/wrapup';\n    },\n    replaceUri: function (id, participantId, query, mediaType, entity) {\n        if (query) {\n            return this.participantUri(id, participantId, mediaType) + '/replace' + this.getQueryStr(query);\n        } else {\n            if (!!entity) {\n                let endUrlPath = '';\n                switch (entity) {\n                    case 'person':\n                    case 'agent':\n                        endUrlPath = '/replace/agent';\n                        break;\n                    case 'queue':\n                        endUrlPath = '/replace/queue';\n                        break;\n                    case 'external':\n                        endUrlPath = '/replace/contact/external';\n                        break;\n                    default:\n                        endUrlPath = '/transfer';\n                }\n                return this.participantUri(id, participantId, mediaType) + endUrlPath;\n            }\n            return this.participantUri(id, participantId, mediaType) + '/replace';\n        }\n    },\n    tagsUri: function (id) {\n        //Are we using this?\n        return this.communicationUri(id) + '/tags';\n    },\n    wrapUpUri: function (id, participantId) {\n        return this.participantUri(id, participantId) + '/wrapup';\n    },\n    wrapUpCodesUri: function (id) {\n        return this.communicationUri(id) + '/wrapupCodes';\n    },\n    messagesUri: function (id, mediaType) {\n        return `${this.communicationUri(id, mediaType)}/messages`;\n    },\n    sendChatMessageUri: function (conversationId, communicationId) {\n        return `${this.communicationUri(conversationId, 'chats')}/communications/${communicationId}/messages`;\n    },\n    sendTypingUri: function (conversationId, communicationId) {\n        return `${this.communicationUri(conversationId, 'chats')}/communications/${communicationId}/typing`;\n    },\n    draftUri: function (id, mediaType, query) {\n        if (query) {\n            return `${this.messagesUri(id, mediaType)}/draft${this.getQueryStr(query)}`;\n        } else {\n            return `${this.messagesUri(id, mediaType)}/draft`;\n        }\n    },\n    smsUri: function (id) {\n        return `${this.communicationUri(id, 'messages')}/messages`;\n    },\n    smsHistoryUri: function (id) {\n        return this.getConversationUri(id);\n    },\n    smsMessageDetailUri: function (id, messageId) {\n        // api/v2/conversations/messages/{conversationId}/messages/{messageId}/details\n        return `${this.smsUri(id)}/${messageId}/details/?useNormalizedMessage=true`;\n    },\n    smsMessageBatchUri: function (id) {\n        return `${this.smsUri(id)}/bulk?useNormalizedMessage=true`;\n    },\n    sendSMSMessageUri: function (id, communicationId) {\n        return `${this.communicationUri(\n            id,\n            'messages'\n        )}/communications/${communicationId}/messages?useNormalizedMessage=true`;\n    },\n    requestACWUri: function (interactionId, participantId, agentCommunicationId) {\n        // api/v2/conversations/aftercallwork/{conversationId}/participants/{participantId}/communications/{communicationId}\n        return `${this.communicationUri(\n            ''\n        )}aftercallwork/${interactionId}/participants/${participantId}/communications/${agentCommunicationId}`;\n    },\n\n    getDeploymentConfigUri: function (deploymentId, getSupportedContent = false) {\n        if (getSupportedContent) {\n            return `${this.pcUri()}api/v2/webdeployments/deployments/${deploymentId}/configurations?expand=supportedContent`;\n        }\n        return `${this.pcUri()}api/v2/webdeployments/deployments/${deploymentId}/configurations?type=active`;\n    },\n\n    getIntegrationConfigUri: function (subMessageType, integrationId) {\n        return `${this.baseUri()}/messaging/integrations/${subMessageType}/${integrationId}?expand=messagingSetting`;\n    },\n\n    getConversationSummaryFeedbackUri: function (conversationId, summaryId) {\n        return `${this.baseUri()}/${conversationId}/summaries/${summaryId}/feedback`;\n    },\n\n    /**\n     * /api/v2/conversations/{conversationId}/participants/{participantId}/internalmessages/users/communications\n     *\n     * @param {string} conversationId the id of the conversation to initiate the message with\n     * @param {string} participantId the id of the participant to initiate the message with\n     * @returns {string} generated uri for initiating the internal message\n     */\n    setupInternalMessageUri(conversationId, participantId) {\n        return `${this.baseUri()}/${conversationId}/participants/${participantId}/internalmessages/users/communications`;\n    },\n\n    getQueryStr: function (parameters) {\n        var query = '';\n        var arrayParameterCollection = {};\n        var params;\n\n        if (parameters && !_.isEmpty(parameters)) {\n            // Get all parameters that are simple key-value pairs and where the value is\n            // NOT an array\n            params = _.reduce(\n                parameters,\n                function (result, value, key) {\n                    if (Array.isArray(parameters[key])) {\n                        arrayParameterCollection[key] = value;\n                    } else {\n                        result[key] = value;\n                    }\n\n                    return result;\n                },\n                {}\n            );\n\n            // serialize the parameters\n            query = '?' + $.param(params);\n\n            _.forIn(arrayParameterCollection, function (arr, key) {\n                // convert the array values into query parameters that will result in:\n                //   ?key=value1&key=value2&...\n                _.each(arr, function (item) {\n                    if (query === '?') {\n                        query += key + '=' + item;\n                    } else {\n                        query += '&' + key + '=' + item;\n                    }\n                });\n            });\n        }\n        return query;\n    }\n});\n","import { inject as service } from '@ember/service';\nimport Mixin from '@ember/object/mixin';\nimport { Promise } from 'rsvp';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nexport default Mixin.create(LoggerMixin, {\n    session: service(),\n    ajax: service(),\n\n    defaultLogLevel: 'debug',\n\n    /*\n     * Proxies AJAX requests as raw requests capturing\n     * response codes, correlations, etc. and loggin them\n     * out to SumoLogic automatically. Failed requests\n     * Promises will always resolved with the response,\n     * payload, and jqXHR object.\n     *\n     * @param {string} url - The request url path.\n     * @param {object} options - The request options.\n     * @param {string} type - The type of request to be made.\n     *\n     * @returns {Promise} Result of Ajax request\n     */\n    makeRequest(url, options = {}, type = 'get') {\n        const userId = this.get('session.person.guid');\n        const logger = this.logger;\n\n        if (type !== 'raw') {\n            options.method = (options.method || type).toUpperCase();\n            options.cache = false;\n        } else if (type === 'raw') {\n            options.method = (options.method || 'get').toUpperCase();\n        }\n\n        if (options.method && options.method.toLowerCase() !== 'get') {\n            options.dataType = options.dataType || 'json';\n        }\n\n        if (\n            options.data &&\n            options.dataType &&\n            options.dataType.toLowerCase() === 'json' &&\n            typeof options.data !== 'string' &&\n            options.method.toLowerCase() !== 'get'\n        ) {\n            options.contentType = 'application/json; charset=UTF-8';\n            options.data = JSON.stringify(options.data);\n        }\n\n        /*\n         * Logs the request at a specific log level\n         *\n         * @param {string} path - The request url path.\n         * @param {object} options - The request options.\n         * @param {object} payload - The response payload.\n         * @param {int} status - The response status code.\n         * @param {string} correlation - The correlation guid of the response.\n         * @param {strign} logLevel - The level to emit the log with.\n         */\n        const logRequest = (path, options, payload, status, correlation, logLevel) => {\n            const log = {\n                namespace: 'conversations',\n                message: 'User request',\n                path: path,\n                options: options,\n                response: { status, correlation },\n                user: userId\n            };\n\n            if (payload) {\n                log.response.payload = payload;\n            }\n\n            logger[logLevel]('Conversation Request:', { log });\n        };\n\n        /*\n         * Parses the response from the request to send to logRequest.\n         *\n         * @param {object} jqXHR - The jqXHR object.\n         * @param {object} payload - The response payload.\n         * @param {boolean} isError - Flag used to set appropriate log level.\n         */\n        const captureRequest = (request, isError) => {\n            const jqXHR = request.jqXHR;\n            const payload = request.payload;\n            if (jqXHR) {\n                const statusCode = jqXHR.status;\n                const correlationId = jqXHR.getResponseHeader('ININ-Correlation-id');\n                const logLevel = isError ? 'error' : this.defaultLogLevel;\n                logRequest(url, options, payload, statusCode, correlationId, logLevel);\n            }\n        };\n\n        /*\n         * Resolves a provies based on the response of a request.\n         *\n         * @param {object} response - Response from jqXHR request.\n         * @param {boolean} error - Flag use to resolve/reject promise.\n         *\n         * @returns {Promise} Promise resolve/rejecting jqXHR response.\n         */\n        const resolveRequest = (response, error) => {\n            const resolution = !!error ? 'reject' : 'resolve';\n            if (type === 'raw' || !!error) {\n                return Promise[resolution](response);\n            }\n            return Promise[resolution](response.response);\n        };\n\n        /*\n         * Determines if jqXHR response error is merely a parse error\n         * of an empty string returned by publicAPI.\n         *\n         * @param {response} - Response object from request.\n         */\n        const isSuccessResponse = response => {\n            if (response) {\n                const status = response.status || response.jqXHR.status;\n                if (status === 200 || status === 202) {\n                    return true;\n                }\n            }\n            return false;\n        };\n\n        return this.ajax\n            .raw(url, options)\n            .then(response => {\n                captureRequest(response);\n                return resolveRequest(response);\n            })\n            .catch(response => {\n                // Swallow errors if jQuery is just failing to\n                // parse an empty respone as a valid JSON object.\n                if (isSuccessResponse(response)) {\n                    captureRequest(response);\n                    return resolveRequest(response);\n                }\n                captureRequest(response, true);\n                return resolveRequest(response, true);\n            });\n    }\n});\n","import Mixin from '@ember/object/mixin';\nimport { A } from '@ember/array';\nimport { computed } from '@ember/object';\nimport { equal, reads } from '@ember/object/computed';\nimport { CONVERSATION_STATES } from '../../utils/conversation-states';\nimport { getEntityObjectId } from '../../utils/jid-helpers';\n\nexport default Mixin.create({\n    activeChats: computed('chats.[]', function () {\n        const chats = this.chats;\n        const result = (chats || []).filter(\n            chat => chat.state !== CONVERSATION_STATES.DISCONNECTED && chat.state !== CONVERSATION_STATES.TERMINATED\n        );\n\n        return A(result);\n    }),\n\n    chats: computed('currentUserParticipant.chats', function () {\n        const currentUserParticipant = this.currentUserParticipant;\n        if (!currentUserParticipant) {\n            return [];\n        }\n\n        const userChats = currentUserParticipant.get('chats');\n        return userChats.toArray();\n    }),\n\n    currentChat: reads('activeChats.lastObject'),\n    chatProvider: reads('currentChat.provider'),\n    isInternalChatProvider: equal('chatProvider', 'PureCloud Webchat'),\n\n    lastChatMessageTime: reads('room.messages.lastObject.time'),\n\n    lastChatMessageWasCustomer: computed(\n        'room.messages.lastObject.chatUser.id',\n        'customerParticipant.address',\n        function () {\n            const error = new Error(\n                'DEPRECATION WARNING: ember-purecloud-components > chats.lastChatMessageWasCustomer is deprecated'\n            );\n            console.warn(error.message, {\n                stack: error.stack\n            });\n\n            if (this.get('room.messages.lastObject.chatUser')) {\n                const address = this.get('customerParticipant.address');\n                const customerId = getEntityObjectId(address);\n                const chatUserId = this.get('room.messages.lastObject.chatUser.id');\n                return customerId === chatUserId;\n            }\n            return false;\n        }\n    )\n});\n","import { alias, equal, reads } from '@ember/object/computed';\nimport Mixin from '@ember/object/mixin';\nimport { computed } from '@ember/object';\nimport { A } from '@ember/array';\nimport { CONVERSATION_STATES } from '../../utils/conversation-states';\n\nexport default Mixin.create({\n    emailMessages: null,\n    emailDraft: null,\n\n    // TODO: Fix this hacky trigger for reloading messages\n    _shouldReloadMessages: null,\n\n    activeEmails: computed('emails.[]', function () {\n        const allEmails = this.emails.toArray();\n        const active = (allEmails || []).filter(\n            email =>\n                email.get('state') !== CONVERSATION_STATES.DISCONNECTED &&\n                email.get('state') !== CONVERSATION_STATES.TERMINATED\n        );\n\n        return A(active);\n    }),\n\n    emails: computed('currentUserParticipant.emails', function () {\n        const currentUserParticipant = this.currentUserParticipant;\n        if (!currentUserParticipant) {\n            return A([]);\n        }\n\n        const userEmails = currentUserParticipant.get('emails');\n        return userEmails.toArray();\n    }),\n\n    currentEmail: alias('activeEmails.lastObject'),\n    emailProvider: alias('currentEmail.provider'),\n    isInternalEmailProvider: equal('emailProvider', 'PureCloud Email'),\n    lastEmailTime: reads('emailMessages.lastObject.time')\n});\n","import Mixin from '@ember/object/mixin';\nimport { computed } from '@ember/object';\n\n/**\n * The limits should be passed in when available from external services but they are not only relevant\n * for the interface.\n */\nexport default Mixin.create({\n    minimumLimit: null,\n    maximumLimit: null,\n    minItemsLimit: null,\n    maxItemsLimit: null,\n    minLengthLimit: null,\n    maxLengthLimit: null,\n\n    _isWithinLimit(valueKey, minLimitKey, maxLimitKey) {\n        const value = Number(this.get(valueKey));\n        const minLimit = this.get(minLimitKey);\n        const maxLimit = this.get(maxLimitKey);\n        return typeof minLimit !== 'number' || typeof maxLimit !== 'number'\n            ? true\n            : minLimit <= value && value <= maxLimit;\n    },\n\n    isMinimumWithinLimit: computed(function () {\n        return this._isWithinLimit('minimum', 'minimumLimit', 'maximumLimit');\n    }).volatile(),\n    isMaximumWithinLimit: computed(function () {\n        return this._isWithinLimit('maximum', 'minimumLimit', 'maximumLimit');\n    }).volatile(),\n\n    isMinItemsWithinLimit: computed(function () {\n        return this._isWithinLimit('minItems', 'minItemsLimit', 'maxItemsLimit');\n    }).volatile(),\n    isMaxItemsWithinLimit: computed(function () {\n        return this._isWithinLimit('maxItems', 'minItemsLimit', 'maxItemsLimit');\n    }).volatile(),\n\n    isMinLengthWithinLimit: computed(function () {\n        return this._isWithinLimit('minLength', 'minLengthLimit', 'maxLengthLimit');\n    }).volatile(),\n    isMaxLengthWithinLimit: computed(function () {\n        return this._isWithinLimit('maxLength', 'minLengthLimit', 'maxLengthLimit');\n    }).volatile()\n});\n","/* global $ */\n\nimport { notEmpty, and, reads } from '@ember/object/computed';\n\nimport { A } from '@ember/array';\nimport Evented from '@ember/object/evented';\nimport Mixin from '@ember/object/mixin';\nimport RSVP, { reject, resolve } from 'rsvp';\nimport EmberObject, { computed } from '@ember/object';\nimport { run, debounce } from '@ember/runloop';\n\nconst UA = window.navigator.userAgent.toLowerCase();\nconst IS_CHROME = !!window && !!window.chrome && !!window.chrome.webstore;\nconst IS_FIREFOX = window && typeof InstallTrigger !== 'undefined';\nlet BROWSER_VERSION;\nif (IS_CHROME) {\n    BROWSER_VERSION = UA.match(/chrom(e|ium)/) && parseInt(UA.match(/chrom(e|ium)\\/([0-9]+)\\./)[2], 10);\n} else if (IS_FIREFOX) {\n    BROWSER_VERSION = parseInt(UA.match(/firefox\\/([0-9]+)\\./)[1], 10);\n}\n\nfunction arrayComparerByDeviceId(otherArray) {\n    return current => {\n        const itemInOtherArray =\n            otherArray.filter(other => {\n                return other.deviceId === current.deviceId;\n            }).length === 0;\n\n        return itemInOtherArray;\n    };\n}\n\nexport function diffListsByDeviceId(existingList, newList) {\n    const itemsRemoved = existingList.filter(arrayComparerByDeviceId(newList));\n    const itemsAdded = newList.filter(arrayComparerByDeviceId(existingList));\n\n    return { added: itemsAdded, removed: itemsRemoved };\n}\n\nexport default Mixin.create(Evented, {\n    // options\n    fullHd: false,\n\n    canListDevices: false,\n\n    // camera and video stuff\n    hasCameraPermission: false,\n    cameraList: A(),\n    hasCamera: computed('cameraList.[]', function () {\n        return !!A(this.cameraList).find(camera => camera.deviceId !== 'default');\n    }),\n\n    // mic and audio stuff\n    hasMicPermission: false,\n    microphoneList: A(),\n    hasMicrophone: notEmpty('microphoneList'),\n    hasEnumeratedDevices: false,\n\n    callCapable: and('audioCallCapable', 'videoCallCapable'),\n\n    audioCallCapable: computed(function () {\n        const PC = window.RTCPeerConnection;\n        const gUM = window.navigator && window.navigator.mediaDevices && window.navigator.mediaDevices.getUserMedia;\n        const supportWebAudio = window.AudioContext && window.AudioContext.prototype.createMediaStreamSource;\n        const support = !!(PC && gUM && (supportWebAudio || window.RTCRtpTransceiver));\n\n        return support;\n    }),\n\n    webrtcAudioCallIssueKey: computed('audioCallCapable', 'hasMicrophone', 'hasMicPermission', function () {\n        let key;\n\n        if (!this.audioCallCapable) {\n            key = 'ewc.station.notCapable';\n        } else if (!this.hasMicPermission) {\n            key = 'ewc.station.noMicPermission';\n        } else if (!this.hasMicrophone) {\n            key = 'ewc.station.noMicrophoneDetected';\n        }\n\n        return key;\n    }),\n\n    webrtcAudioCallIssueAriaKey: computed('audioCallCapable', 'hasMicrophone', 'hasMicPermission', function () {\n        let key;\n\n        if (!this.audioCallCapable) {\n            key = 'navBar.commandView.callsState.errorNotCapableAria';\n        } else if (!this.hasMicPermission) {\n            key = 'navBar.commandView.callsState.errorNoMicPermissionAria';\n        } else if (!this.hasMicrophone) {\n            key = 'navBar.commandView.callsState.errorNoMicrophoneAria';\n        }\n\n        return key;\n    }),\n\n    videoCallCapable: computed('audioCallCapable', function () {\n        const audioCallCapable = this.audioCallCapable;\n        if (!audioCallCapable) {\n            return false;\n        }\n\n        const videoEl = document.createElement('video');\n        const supportVp8 =\n            videoEl && videoEl.canPlayType && videoEl.canPlayType('video/webm; codecs=\"vp8\", vorbis') === 'probably';\n        if (!supportVp8) {\n            return false;\n        }\n        return true;\n    }),\n\n    outputDeviceList: A(),\n    resolutionList: A(),\n\n    canShareScreen: reads('callCapable'),\n\n    enumerationTimer: null,\n\n    init() {\n        this._super(...arguments);\n        const timer = run.next(this, function () {\n            // Guard against destroyed object\n            if (this.isDestroyed || this.isDestroying) {\n                return;\n            }\n            this.enumerateDevices();\n            this.enumerateResolutions();\n        });\n        this.set('enumerationTimer', timer);\n\n        if (\n            window.navigator &&\n            window.navigator.mediaDevices &&\n            Object.prototype.hasOwnProperty.call(window.navigator.mediaDevices.constructor.prototype, 'ondevicechange')\n        ) {\n            const deviceChangeHandler = () => {\n                if (this.isDestroyed && this.isDestroying) {\n                    return;\n                }\n\n                console.debug('onDeviceChange fired');\n                /* reset device enumeration and enumerate again */\n                if (!this.isDestroyed && !this.isDestroying) {\n                    this.set('hasEnumeratedDevices', false);\n                }\n                const debounceTimer = debounce(this, this.enumerateDevices, true, 400);\n                this.set('debounceTimer', debounceTimer);\n            };\n            this._deviceChangeHandler = deviceChangeHandler;\n            $(window.navigator.mediaDevices).on('devicechange', deviceChangeHandler);\n        }\n\n        /* if we haven't loaded translation yet, hook into the load promise */\n        if (!this.get('intl.loaded')) {\n            this.get('intl.loadedPromise').then(() => {\n                if (!this.isDestroyed && !this.isDestroying) {\n                    this.set('hasEnumeratedDevices', false);\n                }\n                this.enumerateDevices();\n            });\n        }\n    },\n\n    willDestroy() {\n        const timer = this.enumerationTimer;\n        if (timer) {\n            run.cancel(timer);\n        }\n\n        const debounceTimer = this.debounceTimer;\n        if (debounceTimer) {\n            run.cancel(debounceTimer);\n        }\n\n        // Clean up jQuery event listener\n        if (this._deviceChangeHandler && window.navigator && window.navigator.mediaDevices) {\n            $(window.navigator.mediaDevices).off('devicechange', this._deviceChangeHandler);\n        }\n\n        this._super(...arguments);\n    },\n\n    updateDefaultDevices(/* devices */) {\n        const extended = !!this._super(...arguments);\n        if (!extended) {\n            throw new Error(\n                'updateDefaultDevices should be overridden - do you need to save preferences or change video stream?'\n            );\n        }\n    },\n\n    enumerateResolutions() {\n        const resolutions = A();\n        resolutions.pushObject(\n            EmberObject.create({\n                label: this.intl.t('webrtcDevices.resolutions.low').toString(),\n                presetId: 1,\n                constraints: {\n                    video: {\n                        width: { max: 320 },\n                        height: { max: 240 }\n                    }\n                }\n            })\n        );\n\n        resolutions.pushObject(\n            EmberObject.create({\n                label: this.intl.t('webrtcDevices.resolutions.medium').toString(),\n                presetId: 2,\n                constraints: {\n                    video: {\n                        width: { max: 640 },\n                        height: { max: 480 }\n                    }\n                }\n            })\n        );\n\n        const hd = EmberObject.create({\n            label: this.intl.t('webrtcDevices.resolutions.high').toString(),\n            presetId: 3,\n            constraints: {\n                video: {\n                    width: {\n                        min: 640,\n                        ideal: 1280,\n                        max: 1920\n                    },\n                    height: {\n                        min: 480,\n                        ideal: 720,\n                        max: 1080\n                    }\n                }\n            }\n        });\n        resolutions.pushObject(hd);\n\n        // full hd is disabled by default because very few computers actually support this\n        if (this.fullHd) {\n            resolutions.pushObject(\n                EmberObject.create({\n                    label: this.intl.t('webrtcDevices.resolutions.fullHd').toString(),\n                    presetId: 4,\n                    constraints: {\n                        video: {\n                            width: { exact: 1920 },\n                            height: { exact: 1080 }\n                        }\n                    }\n                })\n            );\n        }\n\n        this.set('resolutionList', resolutions);\n        return resolutions;\n    },\n\n    // Returns a promise which resolves when all devices have been enumerated and loaded\n    enumerateDevices(triggerListUpdatedEvent) {\n        if (this.isDestroyed || this.isDestroying) {\n            return;\n        }\n\n        if (!window.navigator.mediaDevices || !window.navigator.mediaDevices.enumerateDevices) {\n            return reject();\n        }\n\n        // if we have already enumerated devices successfully _and_ we have mic/camera permissions\n        //  (ie. if labels are present) then we do not need to enumerate devices again\n        if (this.hasEnumeratedDevices && this.hasMicPermission) {\n            return resolve();\n        }\n\n        let cameraCount = 0;\n        let microphoneCount = 0;\n        let outputDeviceCount = 0;\n        const cameras = [];\n        const microphones = [];\n        const outputDevices = [];\n        const defaultDevice = {\n            deviceId: 'default',\n            label: this.intl.t('webrtcDevices.default').toString()\n        };\n\n        const addCamera = (device, hasBrowserLabel) => {\n            if (!hasBrowserLabel) {\n                const existingDeviceInList = this.cameraList.find(camera => camera.deviceId === device.deviceId);\n\n                if (device.deviceId && device.deviceId.toLowerCase() === 'default') {\n                    device.label = this.intl.t('webrtcDevices.default').toString();\n                } else if (device.deviceId && device.deviceId.toLowerCase().indexOf('communication') === 0) {\n                    device.label = this.intl.t('webrtcDevices.windowsCommunication').toString();\n                }\n\n                /* if the existing device does have a label, we will use that */\n                if (existingDeviceInList && existingDeviceInList.label) {\n                    device.label = existingDeviceInList.label;\n                }\n                device.label =\n                    device.label || this.intl.t('webrtcDevices.cameraLabel', { number: ++cameraCount }).toString();\n            }\n\n            /* check to make sure the translation worked */\n            if (device.label && device.label.startsWith('webrtcDevices')) {\n                device.label = (\n                    device.label.includes('default') || device.label.includes('Communication')\n                        ? this.intl.t(device.label)\n                        : this.intl.t('webrtcDevices.cameraLabel', { number: ++cameraCount })\n                ).toString();\n            }\n\n            this.set('hasCameraPermission', !!(this.hasCameraPermission || hasBrowserLabel));\n            cameras.push(EmberObject.create(device));\n        };\n\n        const addMicrophone = (device, hasBrowserLabel) => {\n            const existingDeviceInList = this.microphoneList.find(mic => mic.deviceId === device.deviceId);\n            if (device.deviceId) {\n                if (device.deviceId.toLowerCase() === 'default') {\n                    device.label = this.intl.t('webrtcDevices.default').toString();\n                } else if (device.deviceId.toLowerCase() === 'communications') {\n                    device.label = this.intl.t('webrtcDevices.defaultCommunications').toString();\n                }\n            }\n\n            if (!hasBrowserLabel) {\n                if (existingDeviceInList && existingDeviceInList.label) {\n                    device.label = existingDeviceInList.label;\n                }\n\n                if (device.deviceId && device.deviceId.toLowerCase().indexOf('communication') === 0) {\n                    device.label = this.intl.t('webrtcDevices.windowsCommunication').toString();\n                }\n                device.label =\n                    device.label ||\n                    this.intl.t('webrtcDevices.microphoneLabel', { number: ++microphoneCount }).toString();\n            }\n\n            /* if labels haven't loaded yet we need to get the translation */\n            if (device.label && device.label.startsWith('webrtcDevices')) {\n                device.label = (\n                    device.label.includes('default') || device.label.includes('Communication')\n                        ? this.intl.t(device.label)\n                        : this.intl.t('webrtcDevices.microphoneLabel', { number: ++microphoneCount })\n                ).toString();\n            }\n\n            this.set('hasMicPermission', !!(this.hasMicPermission || hasBrowserLabel));\n            microphones.push(EmberObject.create(device));\n        };\n        const addOutputDevice = (device, hasLabel) => {\n            if (!Object.prototype.hasOwnProperty.call(window.HTMLMediaElement.prototype, 'setSinkId')) {\n                return;\n            }\n            const existingDeviceInList = this.outputDeviceList.find(\n                outputDevice => outputDevice.deviceId === device.deviceId\n            );\n            if (device.deviceId) {\n                if (device.deviceId.toLowerCase() === 'default') {\n                    device.label = this.intl.t('webrtcDevices.default').toString();\n                } else if (device.deviceId.toLowerCase() === 'communications') {\n                    device.label = this.intl.t('webrtcDevices.defaultCommunications').toString();\n                }\n            }\n\n            if (!hasLabel) {\n                if (existingDeviceInList && existingDeviceInList.label) {\n                    device.label = existingDeviceInList.label;\n                }\n                device.label =\n                    device.label ||\n                    this.intl.t('webrtcDevices.outputDeviceLabel', { number: ++outputDeviceCount }).toString();\n            }\n\n            if (device.label && device.label.startsWith('webrtcDevices')) {\n                device.label = (\n                    device.label.includes('default') || device.label.includes('Communication')\n                        ? this.intl.t(device.label)\n                        : this.intl.t('webrtcDevices.outputDeviceLabel', { number: ++outputDeviceCount })\n                ).toString();\n            }\n            outputDevices.push(EmberObject.create(device));\n        };\n\n        // always add a dummy default for video, since the browser doesn't give us one like microphone\n        if (this.callCapable) {\n            addCamera(defaultDevice, false);\n        }\n        return window.navigator.mediaDevices\n            .enumerateDevices()\n            .then(devices => {\n                console.info({\n                    message: 'webrtcDevices enumerated',\n                    devices\n                });\n                if (this.isDestroyed || this.isDestroying) {\n                    return;\n                }\n\n                if (IS_FIREFOX && BROWSER_VERSION < 42) {\n                    this.set('canListDevices', false);\n                    addMicrophone(defaultDevice);\n                } else {\n                    this.set('canListDevices', true);\n                    this.setProperties({\n                        hasCameraPermission: false,\n                        hasMicPermission: false\n                    });\n\n                    devices.forEach(device => {\n                        const deviceInfo = {\n                            deviceId: device.deviceId,\n                            label: device.label,\n                            groupId:\n                                device.deviceId && device.deviceId.toLowerCase() === 'default' ? null : device.groupId\n                        };\n                        const hasLabel = device.label;\n\n                        if (device.kind === 'audioinput') {\n                            addMicrophone(deviceInfo, hasLabel);\n                        } else if (device.kind === 'audiooutput') {\n                            addOutputDevice(deviceInfo, hasLabel);\n                        } else if (device.kind === 'videoinput') {\n                            addCamera(deviceInfo, hasLabel);\n                        }\n                    });\n                }\n\n                const camerasDiff = diffListsByDeviceId(this.cameraList, cameras);\n                const microphonesDiff = diffListsByDeviceId(this.microphoneList, microphones);\n                const outputDevicesDiff = diffListsByDeviceId(this.outputDeviceList, outputDevices);\n\n                this.setProperties({\n                    cameraList: A(cameras),\n                    microphoneList: A(microphones),\n                    outputDeviceList: A(outputDevices)\n                });\n\n                /* if we have permissions after enumerating, we don't need to enumerate again */\n                if (this.hasMicPermission && this.hasCameraPermission) {\n                    if (!this.isDestroyed && !this.isDestroying) {\n                        this.set('hasEnumeratedDevices', true);\n                    }\n                }\n\n                if (triggerListUpdatedEvent) {\n                    const added = {\n                        cameras: camerasDiff.added,\n                        microphones: microphonesDiff.added,\n                        outputDevices: outputDevicesDiff.added,\n                        total: camerasDiff.added.length + microphonesDiff.added.length + outputDevicesDiff.added.length\n                    };\n                    const removed = {\n                        cameras: camerasDiff.removed,\n                        microphones: microphonesDiff.removed,\n                        outputDevices: outputDevicesDiff.removed,\n                        total:\n                            camerasDiff.removed.length +\n                            microphonesDiff.removed.length +\n                            outputDevicesDiff.removed.length\n                    };\n                    this.trigger('deviceListsUpdated', { added, removed });\n                }\n            })\n            .catch(err => {\n                if (!this.isDestroyed && !this.isDestroying) {\n                    console.error(err);\n                    this.set('canListDevices', false);\n                    addMicrophone(defaultDevice);\n                }\n            });\n    },\n\n    setOutputDevice(el, device) {\n        if (typeof device !== 'object' || typeof device.deviceId === 'undefined' || device.deviceId === null) {\n            return RSVP.Promise.reject('Cannot set null device');\n        }\n\n        const outputDevices = this.outputDeviceList;\n        const outputDevice = outputDevices.findBy('deviceId', device.deviceId);\n        if (!outputDevice) {\n            return RSVP.Promise.reject(new Error('Cannot set output device: device not found'));\n        }\n\n        if (typeof el.setSinkId !== 'undefined') {\n            return new RSVP.Promise(function (resolve) {\n                if (el.paused) {\n                    el.onplay = () => resolve();\n                } else {\n                    resolve();\n                }\n            })\n                .then(function () {\n                    el.setSinkId(device.deviceId);\n                })\n                .then(() => {\n                    console.log({\n                        message: 'webrtcDevices outputDevice set',\n                        device: {\n                            deviceId: device.deviceId,\n                            label: device.label\n                        },\n                        outputDevices: outputDevices.map(d => ({ deviceId: d.deviceId, label: device.label }))\n                    });\n                })\n                .catch(err => {\n                    console.error('failed to set audio output device', err);\n                });\n        } else {\n            console.error('attempted to set sink id in unsupported browser');\n            return RSVP.Promise.reject('Not supported');\n        }\n    },\n\n    setDefaultOutputDevice(el) {\n        const device = this.defaultOutputDevice;\n        if (device) {\n            return this.setOutputDevice(el, this.defaultOutputDevice);\n        }\n        return RSVP.Promise.resolve();\n    }\n});\n","import { on } from '@ember/object/evented';\nimport $ from 'jquery';\nimport Mixin from '@ember/object/mixin';\nimport { bind, run } from '@ember/runloop';\n\nexport default Mixin.create({\n    handleMessageEvent(event) {\n        run(() => {\n            const iframe = this.element;\n            if (iframe) {\n                const messageEvent = event.originalEvent;\n                const messageData = messageEvent.data;\n                const messageOptions = Object.assign({}, messageData.options);\n                if (messageEvent.source === iframe.contentWindow && messageData.type) {\n                    this.triggerMessageAction(messageData.type.toLowerCase(), messageData.data, messageOptions);\n                }\n            }\n        });\n    },\n\n    triggerMessageAction(type, data, options = {}) {\n        if (this.messageHandlers[type]) {\n            this.logger.debug('Handling message type', type, data);\n            this.messageHandlers[type].call(this, data, options);\n        } else {\n            // An in-house utility generates messages in this\n            // format that we do not want to log. See: PCDWEBK-4163\n            if (type !== 'rpc:request') {\n                this.logger.info('Unknown message type', { type, data });\n            }\n        }\n    },\n\n    startMessageListener: on('didInsertElement', function () {\n        $(window).on(`message.${this.elementId}`, bind(this, this.handleMessageEvent));\n    }),\n\n    stopMessageListener: on('willDestroyElement', function () {\n        $(window).off(`message.${this.elementId}`);\n    })\n});\n","import { computed } from '@ember/object';\nimport { on } from '@ember/object/evented';\nimport { inject as service } from '@ember/service';\nimport Mixin from '@ember/object/mixin';\nimport _ from 'lodash';\n\nvar EntityControllerMixin = Mixin.create({\n    intl: service(),\n    application: service(),\n\n    entity: null,\n\n    excludedFieldSections: null,\n\n    lastUploadedImage: null,\n\n    editingPictures: false,\n\n    actions: {\n        cancelEditProfilePicture() {\n            this.set('editingPictures', false);\n        },\n\n        editProfilePicture() {\n            this.set('editingPictures', true);\n        },\n\n        cancelUpload() {\n            this.send('editProfilePicture');\n        },\n\n        cancelEditPictures() {\n            this.set('uploadType', null);\n        },\n\n        noop() {}\n    },\n\n    setInitialFieldSections: on('init', function () {\n        this.set('excludedFieldsSections', []);\n    }),\n\n    fieldSections: computed('entity', function () {\n        var entity = this.entity;\n\n        if (entity) {\n            var sections = this.entity.fieldConfig.sections;\n\n            if (this.get('application.session.user.isAdmin') && !this.get('application.session.user.personId')) {\n                return _.filter(\n                    sections,\n                    function (section) {\n                        var excludedSections = this.excludedFieldSections;\n                        return excludedSections.indexOf(section.key) === -1;\n                    },\n                    this\n                );\n            }\n\n            return _.filter(\n                sections,\n                function (section) {\n                    var readableSections = this.entity.getReadableSections(),\n                        excludedSections = this.excludedFieldSections;\n                    return excludedSections.indexOf(section.key) === -1 && readableSections.indexOf(section.key) !== -1;\n                },\n                this\n            );\n        }\n\n        return [];\n    })\n});\n\nexport default EntityControllerMixin;\n","import { computed } from '@ember/object';\nimport { reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport Mixin from '@ember/object/mixin';\n\n// Brings in isOneToOneOfflineOrBusy\nimport WebrtcActionUtils from './webrtc-action-utils';\n\nexport default Mixin.create(WebrtcActionUtils, {\n    chat: service(),\n    store: service(),\n    webrtc: service(),\n    session: service(),\n    geolocation: service(),\n    application: service(),\n    phoneService: service('phone'),\n    mediaProviders: service(),\n    phoneIntegrations: service(),\n\n    isChatEnabled: reads('chat.enabled'),\n    isWebrtcEnabled: reads('webrtc.enabled'),\n    isGeolocationEnabled: reads('geolocation.isEnabled'),\n    phoneServiceEnabled: reads('phoneService.enabled'),\n    phoneAvailable: reads('phoneService.phoneAvailable'),\n    self: reads('session.person'),\n\n    init() {\n        this._super(...arguments);\n\n        this.set('applicationUrlPrefix', this.get('application.urlprefix') || '');\n\n        // Need user details to compute the 'useMediaProviders' property, which is only used by the {{entity-contact-group}} component.\n        if (this.get('entity.type') === 'person' && this.classNames.includes('entity-contact-group')) {\n            this.store\n                .findRecord('public-api-user', this.get('entity.id'), {\n                    adapterOptions: {\n                        expand: 'authorization'\n                    }\n                })\n                .then(user => {\n                    // Guard against the component being destroyed before the async request resolves\n                    // (e.g. rapid navigation away from the view that rendered this component)\n                    if (!this.isDestroyed && !this.isDestroying) {\n                        this.set('user', user);\n                    }\n                });\n        }\n    },\n    callEntity(entity) {\n        this.phoneService.makeCall(entity);\n    },\n\n    mediaProviderComponent: 'media-providers/video-dropdown',\n\n    videoProviders: computed('user', 'user.profile', function () {\n        return this.mediaProviders.getProvidersForUser('video', this.user);\n    }),\n\n    useMediaProviders: computed('videoProviders.@each.haveAccess', function () {\n        const providers = this.videoProviders.filter(provider => provider.get('haveAccess'));\n        return providers.length > 1;\n    }),\n\n    integrationBadgesComponent: 'integration-badges',\n    useIntegrationBadges: true\n});\n","import { inject as service } from '@ember/service';\nimport { reads, readOnly, notEmpty, or } from '@ember/object/computed';\nimport { join } from '@ember/runloop';\nimport { computed, get } from '@ember/object';\nimport Mixin from '@ember/object/mixin';\nimport { formatDateForDisplay } from 'web-directory/utils/date-time';\nimport { isPurecloudSource } from 'web-directory/utils/presence-utils';\n\nexport function isPresence(presenceMap, definition, check) {\n    if (!definition) {\n        return false;\n    }\n\n    let apiValue = get(definition, 'systemPresence');\n    let id = get(definition, 'id');\n\n    if (apiValue) {\n        return apiValue.toLowerCase() === check;\n    } else if (id && presenceMap) {\n        let presenceMapping = presenceMap.findBy('id', id);\n        if (presenceMapping && presenceMapping.systemPresence) {\n            return presenceMapping.systemPresence.toLowerCase() === check;\n        }\n    }\n\n    return false;\n}\n\nexport default Mixin.create({\n    intl: service(),\n    session: service(),\n    presenceService: service('presence'),\n    phoneIntegrations: service(),\n\n    outOfOffice: reads('activities.outOfOffice'),\n    routingStatus: reads('activities.routingStatus'),\n    acdDivisionPresenceProfileToggle: readOnly('session.features.acdDivisionPresenceProfileToggle'),\n    primaryPresence: computed(\n        'activities.presence',\n        'activities.integrationPresence',\n        'session.presenceMap',\n        'presenceList.[]',\n        'currentPresenceSource',\n        function () {\n            const presence = this.get('activities.presence');\n            const presenceList = this.get('presenceList');\n            let currentPresenceSource = this.get('currentPresenceSource');\n            const integrationPresence = this.get('integrationPresence');\n            let currentPresence = presence;\n\n            // check the presence list for primary presence\n            // falls back to `activities.presence`\n            if (presenceList && presenceList.length > 0) {\n                const existingPresence = presenceList.find(pres => {\n                    let presSource = pres.source;\n                    if (isPurecloudSource(presSource)) {\n                        presSource = 'default';\n                    }\n                    return presSource.toLowerCase() === currentPresenceSource.toLowerCase();\n                });\n                if (existingPresence) {\n                    if (!presence) {\n                        // there are times where activities.presence is undefined\n                        currentPresence = existingPresence;\n                    } else {\n                        // need to verify if expands presence (from api) is the latest presence\n                        const existingPresenceDate = new Date(existingPresence.modifiedDate);\n                        const activitiesPresenceDate = new Date(presence.modifiedDate);\n                        const isExistingPresenceLatest = existingPresenceDate > activitiesPresenceDate;\n                        if (isExistingPresenceLatest) {\n                            // if presence value in presence list, is the latest, then use that instead\n                            currentPresence = existingPresence;\n                        }\n                    }\n                }\n            }\n\n            // if user has an integration presence\n            if (integrationPresence && get(integrationPresence, 'presenceDefinition')) {\n                // check if user is offline for their primary presence source\n                const isGCOffline = isPresence(\n                    this.get('session.presenceMap'),\n                    !!currentPresence ? get(currentPresence, 'presenceDefinition') : undefined,\n                    'offline'\n                );\n\n                // if offline in primary presence source\n                // return integration presence\n                if (isGCOffline) {\n                    return integrationPresence;\n                }\n            }\n            return currentPresence;\n        }\n    ),\n\n    conversationSummary: reads('activities.conversationSummary'),\n    geolocation: reads('activities.geolocation'),\n    presenceDefinition: reads('primaryPresence.presenceDefinition'),\n\n    // PCUCC-1546 - new integrationPresence expands for 3rd Party Presence\n    integrationPresence: reads('activities.integrationPresence'),\n\n    presenceModel: computed(\n        'primaryPresence.presenceDefinition.systemPresence',\n        'presenceDefinition',\n        'presenceService.allPresences.[]',\n        'presenceService.outOfBandPresenceDefinitions.[]',\n        'acdDivisionPresenceProfileToggle',\n        function () {\n            const presenceService = this.get('presenceService');\n            const presences = this.get('presenceService.allPresences');\n            const presenceDefinition = this.get('presenceDefinition');\n            if (presenceDefinition && presences && presences.length > 0) {\n                const presence = presences.find(presence => {\n                    return get(presenceDefinition, 'id') === get(presence, 'id');\n                });\n\n                if (this.get('acdDivisionPresenceProfileToggle')) {\n                    const outOfBandPresences = this.get('presenceService.outOfBandPresenceDefinitions');\n                    let outOfBandPresence;\n                    if (outOfBandPresences) {\n                        outOfBandPresence = outOfBandPresences.find(presence => {\n                            return get(presenceDefinition, 'id') === get(presence, 'id');\n                        });\n                    }\n                    if (!presence && !outOfBandPresence) {\n                        // This recalculates the data necessary to handle the use cases where an unknown\n                        // presence is selected or when a deactivated presence has worked its way into the\n                        // cache (outside user intervention)\n                        // integration presence will be undefined at times and trigger many loops based on results\n                        join(() => {\n                            return presenceService.findPresence(get(presenceDefinition, 'id'), presenceDefinition);\n                        });\n                    }\n                    return presence || outOfBandPresence;\n                } else {\n                    if (!presence) {\n                        // This recalculates the data necessary to handle the use cases where an unknown\n                        // presence is selected or when a deactivated presence has worked its way into the\n                        // cache (outside user intervention)\n                        // integration presence will be undefined at times and trigger many loops based on results\n                        join(() => presenceService.findPresence(get(presenceDefinition, 'id')));\n                    }\n                    return presence;\n                }\n            }\n\n            return presences.findBy('key', 'offline');\n        }\n    ),\n\n    presenceLabel: computed(\n        'activityPresence',\n        'presenceDefinition',\n        'isOutOfOffice',\n        'outOfOffice.{endDate,indefinite}',\n        'integrationPresence',\n        'primaryPresence',\n        'presenceModel',\n        'acdDivisionPresenceProfileToggle',\n        function () {\n            if (this.get('isOutOfOffice')) {\n                const end = new Date(this.get('outOfOffice.endDate'));\n                // Year 9999 is the API's sentinel value for \"no end date\" (i.e. indefinite OOO).\n                // endDate may be undefined when OOO is indefinite, producing an Invalid Date.\n                if (isNaN(end.getTime()) || end.getFullYear() === 9999 || this.get('outOfOffice.indefinite')) {\n                    return this.get('intl').t('chat.presence.outOfOffice.title');\n                } else {\n                    return this.get('intl').t('chat.presence.outOfOffice.presence', {\n                        date: formatDateForDisplay(end.toISOString(), 'short')\n                    });\n                }\n            }\n\n            const integrationPresenceSource = this.get('integrationPresence.source');\n            let primaryPresenceSource = this.get('primaryPresence.source');\n\n            if (isPurecloudSource(primaryPresenceSource)) {\n                primaryPresenceSource = 'default';\n            }\n            if (this.get('acdDivisionPresenceProfileToggle')) {\n                // if using 3rd Party Presence, append 3rd Party labels to presence label\n                if (primaryPresenceSource === integrationPresenceSource && integrationPresenceSource) {\n                    const integrationLabel = this.get('intl').t(\n                        `integrationPresence.presenceLabels.${integrationPresenceSource.toLowerCase()}`\n                    );\n                    return `${this.get('presenceModel.label')} on ${integrationLabel}`;\n                }\n                return this.get('presenceModel.label');\n            }\n            // if using 3rd Party Presence, append 3rd Party labels to presence label\n            if (primaryPresenceSource === integrationPresenceSource && integrationPresenceSource) {\n                const integrationLabel = this.get('intl').t(\n                    `integrationPresence.presenceLabels.${integrationPresenceSource.toLowerCase()}`\n                );\n                return `${this.get('presenceModel.primaryLabel')} on ${integrationLabel}`;\n            }\n\n            return this.get('presenceModel.primaryLabel');\n        }\n    ),\n\n    /**\n     * Generates a label based on the users presence. Includes the secondary presence and the primary presence\n     * separated by a bullet symbol. i.e. `Busy 1 • Busy`.\n     * This gives the users a further look into the users exact presence\n     */\n    secondaryPresenceLabel: computed(\n        'activityPresence',\n        'presenceDefinition',\n        'presenceLabel',\n        'presenceModel.primaryLabel',\n        'acdDivisionPresenceProfileToggle',\n        function () {\n            if (this.get('acdDivisionPresenceProfileToggle')) {\n                if (!this.get('presenceLabel')) {\n                    return;\n                }\n                if (\n                    this.get('presenceModel.primaryLabel') &&\n                    this.get('presenceModel.primaryLabel') !== this.get('presenceLabel')\n                ) {\n                    return this.get('presenceModel.primaryLabel');\n                }\n                return null;\n            }\n\n            let secondaryPresence = null;\n\n            const definition = this.get('presenceDefinition');\n            const presenceMap = this.get('session.presenceMap');\n            const presence = presenceMap.find(p => p.id === definition.id);\n\n            if (presence) {\n                const locale = this.get('intl.isoLocale').toLowerCase();\n                const fallbackLocale = this.get('intl.baseLocale');\n\n                if (presence.languageLabels && Object.keys(presence.languageLabels).length > 0) {\n                    /**\n                     * The language label keys are inconsistent so we will just iterate over them\n                     * and try to match it up with the info we have\n                     */\n                    for (const [key, value] of Object.entries(presence.languageLabels)) {\n                        const formattedLocale = key.toLowerCase().replace(/_/g, '-');\n                        // if we found the exact locale that matches the users we can end it\n                        if (locale === formattedLocale) {\n                            secondaryPresence = value;\n                            break;\n                        }\n\n                        // sets the secondarypresence to the fallback locale if found and needed\n                        if (fallbackLocale === formattedLocale) {\n                            secondaryPresence = value;\n                        }\n                    }\n                }\n\n                let primaryPresence =\n                    typeof presence.systemPresence === 'string'\n                        ? presence.systemPresence.toLowerCase().trim().replace('_', ' ')\n                        : '';\n                // if the secondaryPresence and the primaryPresence are the same then we don't want to return anything\n                if (!secondaryPresence || secondaryPresence.toLowerCase().trim() === primaryPresence) {\n                    return null;\n                }\n            }\n\n            return secondaryPresence;\n        }\n    ),\n\n    primaryStatusMessage: reads('primaryPresence.message'),\n\n    cityExists: notEmpty('geolocation.city'),\n    regionExists: notEmpty('geolocation.region'),\n    countryExists: notEmpty('geolocation.country'),\n    hasGeolocation: or('cityExists', 'regionExists', 'countryExists'),\n\n    isAvailable: reads('isOnline'),\n    isOnline: computed('session.presenceMap.[]', 'presenceDefinition', 'isOutOfOffice', function () {\n        return this.isPresence('available') && !this.get('isOutOfOffice');\n    }),\n\n    isOffline: computed('session.presenceMap.[]', 'presenceDefinition', 'isOutOfOffice', function () {\n        return this.isPresence('offline');\n    }),\n\n    isAway: computed('session.presenceMap.[]', 'presenceDefinition', 'isOutOfOffice', function () {\n        const isAway =\n            this.isPresence('away') ||\n            this.isPresence('training') ||\n            this.isPresence('break') ||\n            this.isPresence('meal') ||\n            this.isPresence('idle');\n        return isAway && !this.get('isOutOfOffice');\n    }),\n\n    isBusy: computed('session.presenceMap.[]', 'presenceDefinition', 'isOutOfOffice', function () {\n        const isBusy = this.isPresence('busy') || this.isPresence('meeting');\n        return isBusy && !this.get('isOutOfOffice');\n    }),\n\n    isOutOfOffice: computed('session.presenceMap.[]', 'presenceDefinition', 'outOfOffice.active', function () {\n        return this.get('outOfOffice.active');\n    }),\n\n    isOnQueue: computed(\n        'session.presenceMap.[]',\n        'presenceDefinition',\n        'presenceDefinition.systemPresence',\n        'routingStatus.status',\n        'isOutOfOffice',\n        function () {\n            let systemPresence = this.get('presenceDefinition.systemPresence') || '';\n            return (\n                (systemPresence.toLowerCase() === 'on_queue' ||\n                    systemPresence.toLowerCase() === 'on queue' ||\n                    this.isPresence('on_queue')) &&\n                !this.get('isOutOfOffice')\n            );\n        }\n    ),\n\n    isOfflineOrBusy: or('isOffline', 'isBusy'),\n\n    activityPresence: computed('isOnQueue', 'isOutOfOffice', 'isOnline', 'isOffline', 'isAway', 'isBusy', function () {\n        if (this.get('isOnQueue')) {\n            return 'on_queue';\n        } else if (this.get('isOutOfOffice')) {\n            return 'out_of_office';\n        } else if (this.get('isOnline')) {\n            return 'available';\n        } else if (this.get('isAway')) {\n            return 'away';\n        } else if (this.get('isBusy')) {\n            return 'busy';\n        }\n\n        return 'offline';\n    }),\n    activityPresenceClass: computed('activityPresence', 'isOffline', 'isOutOfOffice', function () {\n        if (this.get('isOutOfOffice') && this.get('isOffline')) {\n            // Display offline CSS colors via class if out of office and signed out\n            return 'offline';\n        }\n        return this.get('activityPresence');\n    }),\n\n    isPresence(check) {\n        return isPresence(this.get('session.presenceMap'), this.get('presenceDefinition'), check);\n    }\n});\n","import { resolve, reject, Promise } from 'rsvp';\nimport { isArray } from '@ember/array';\nimport { set, computed, get } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Mixin from '@ember/object/mixin';\nimport Ember from 'ember';\nimport DS from 'ember-data';\nimport { pluralize } from 'ember-inflector';\nimport cloneDeep from 'lodash/cloneDeep';\nimport find from 'lodash/find';\nimport isEmpty from 'lodash/isEmpty';\nimport keys from 'lodash/keys';\nimport parseInt from 'lodash/parseInt';\nimport sortBy from 'lodash/sortBy';\n\nconst profilePictureFieldKey = {\n    person: 'images.profile',\n    group: 'images.activeProfilePicture'\n};\n\nconst imageMappings = {\n    person: {\n        profile: 'uploads.images',\n        informal: 'images.informal',\n        agent: 'agent.profileImage'\n    },\n    group: {\n        profile: 'images.profilePictures',\n        informal: 'images.gallery'\n    }\n};\n\nconst missingFieldsCache = {};\n\nconst EntityMixin = Mixin.create({\n    intl: service(),\n    ajax: service(),\n\n    _currentSection: null,\n    _missingFieldsCache: missingFieldsCache,\n\n    _id: DS.attr(),\n    _entity: DS.attr(),\n    guid: DS.attr(),\n    state: DS.attr(),\n    version: DS.attr().volatile(),\n    mt: DS.attr(),\n\n    apps: DS.attr(),\n    orgId: DS.attr(),\n\n    init: function () {\n        set(this, '_initialData', {});\n        set(this, '_previousData', {});\n        set(this, '_changedSinceSave', []);\n\n        this._super();\n    },\n\n    name: computed('general.name.@each.value', function () {\n        return this.getFieldValue('general.name').value;\n    }),\n\n    type: computed(function () {\n        if (typeof this.fieldConfig === 'undefined') {\n            return '';\n        }\n        return this.fieldConfig.entityType;\n    }),\n\n    profilePicture: computed(\n        'images.profile',\n        'images.profile.[]',\n        'images.activeProfilePicture.[]',\n        'images.profile.@each.ref',\n        function () {\n            const pictureKey = profilePictureFieldKey[this.type];\n            let fieldValue = this.getFieldValue(pictureKey);\n\n            if (!isEmpty(fieldValue)) {\n                return fieldValue.value;\n            } else {\n                fieldValue = this.getFieldValue(pictureKey, true);\n                if (!isEmpty(fieldValue.ref)) {\n                    return fieldValue.ref;\n                }\n            }\n\n            return null;\n        }\n    ),\n\n    profilePictureSizes: computed('profilePicture', function () {\n        const profilePicture = this.profilePicture;\n        if (profilePicture) {\n            // Strip off the 'x' in the keys and sort the available sizes.\n            return sortBy(keys(profilePicture).map(item => parseInt(item.substr(1))));\n        }\n        return [];\n    }),\n\n    uploadedImages: computed('uploads.images.[]', function () {\n        const type = this.type;\n        const path = imageMappings[type].profile;\n        return this.get(path);\n    }),\n\n    stateString: computed('state', function () {\n        return this.intl.safestring(`item.state.${this.get('data.state')}`);\n    }),\n\n    _self: computed(function () {\n        return this;\n    }),\n\n    _missingFields: computed('_missingFieldsCache', function () {\n        return missingFieldsCache[this.id] || [];\n    }),\n\n    recordPropertyChange(fieldPath) {\n        const changedSinceSave = this._changedSinceSave;\n\n        const missingFields = this._missingFields;\n        if (missingFields.indexOf(fieldPath) !== -1) {\n            missingFields.removeObject(fieldPath);\n        }\n\n        changedSinceSave.addObject(fieldPath);\n\n        this.notifyPropertyChange(fieldPath);\n    },\n\n    changedProperties() {\n        const changedSinceSave = this._changedSinceSave;\n        const missingFields = this._missingFields;\n        return (changedSinceSave || []).filter(field => missingFields.indexOf(field) < 0);\n    },\n\n    getReferencedField(fieldPath) {\n        const field = this.getFieldValue(fieldPath, true);\n\n        if (field.value && field.value.fieldId !== 'NONE') {\n            const referencedField = this.getFieldValue(field.value.fieldPath, true);\n\n            if (isArray(referencedField) && referencedField.length > 0) {\n                return find(referencedField, { _id: field.value.fieldId });\n            } else if (!isEmpty(referencedField)) {\n                return referencedField;\n            } else if (field.ref) {\n                // If the reference field path is not loaded, try the field.ref value.\n                return {\n                    value: field.ref\n                };\n            }\n\n            return referencedField;\n        }\n\n        return {};\n    },\n\n    getFieldValue(fieldPath, referencedLookup) {\n        if (fieldPath && typeof this.fieldConfig !== 'undefined') {\n            const fieldArray = get(this, fieldPath);\n            const repeatable = this.fieldConfig.isFieldRepeatable(fieldPath);\n            const reference = this.fieldConfig.isFieldReference(fieldPath);\n\n            if (!isEmpty(fieldArray)) {\n                if (reference && !referencedLookup) {\n                    return this.getReferencedField(fieldPath);\n                } else if (repeatable) {\n                    return fieldArray;\n                } else {\n                    return fieldArray[0];\n                }\n            }\n\n            return repeatable ? [] : {};\n        }\n\n        return [];\n    },\n\n    isFieldValueEmpty(fieldPath) {\n        if (fieldPath) {\n            const fieldArray = get(this, fieldPath);\n            if (fieldArray && fieldArray.length > 0) {\n                return !fieldArray.some(entry => entry && entry.value);\n            }\n        }\n        return true;\n    },\n\n    removeFieldValue(fieldPath, value) {\n        const repeatable = this.fieldConfig.isFieldRepeatable(fieldPath);\n        const currentFieldValue = this.getFieldValue(fieldPath);\n\n        if (repeatable) {\n            const object = find(currentFieldValue, value);\n            if (object && object !== -1) {\n                currentFieldValue.removeObject(object);\n            }\n        }\n    },\n\n    reset() {\n        const promise = this.reload();\n\n        // For some reason, we need to keep the state updated manually\n        promise.then(record => {\n            if (this.currentState.stateName.indexOf('uncommitted') < 0) {\n                this.adapterDidCommit();\n            }\n\n            return record;\n        });\n\n        return promise;\n    },\n\n    save() {\n        const state = this.currentState;\n\n        if (state.stateName.includes('deleted')) {\n            this.set('isDeleted', true);\n        }\n\n        const promise = this._super();\n        promise.then(this.onSaveSuccess.bind(this)).catch(this.onSaveError.bind(this));\n\n        return promise;\n    },\n\n    onSaveSuccess(entity) {\n        const copy = cloneDeep(this.data);\n        this.set('_initialData', copy);\n\n        // Clear historical data\n        this.set('_previousData', {});\n\n        this.set('versionError', false);\n\n        if (entity._internalModal) {\n            const internal = entity._internalModel;\n            if (internal.adapterDidCommit) {\n                internal.adapterDidCommit();\n            }\n        }\n\n        return entity;\n    },\n\n    onSaveError(error) {\n        const data = error.responseJSON || {};\n        const publicApiError = error.errors && error.errors[0];\n\n        if (publicApiError && publicApiError.title && publicApiError.title.indexOf('version') > -1) {\n            // Try to extract error from text inside the public api response\n            const regex = /^.*\\[(\\d+)\\].*\\[(\\d+)\\].*$/i;\n            const matches = publicApiError.title.match(regex);\n            if (matches.length === 3) {\n                console.info('Version mismatch, retrying with correct version:', publicApiError);\n\n                this.set('versionError', true);\n\n                const version = matches[2];\n                this.set('version', version);\n\n                return resolve(this.save()).then(this.onSaveSuccess.bind(this)).catch(this.onSaveError.bind(this));\n            }\n        } else if ((data && data.payload) || get(error, 'errors.length')) {\n            // Check error payload from directory-style error response\n            const payload = data.payload || get(error, 'errors.0.payload') || {};\n            if (payload.code === 'VERSION_MISMATCH') {\n                console.info('Version mismatch, retrying with correct version:', payload);\n\n                this.set('versionError', true);\n\n                this.set('version', payload.currentVersion);\n                return resolve(this.save()).then(this.onSaveSuccess.bind(this)).catch(this.onSaveError.bind(this));\n            } else {\n                return reject(error);\n            }\n        } else {\n            console.error(\"Couldn't save field config\", error);\n            return new Promise((_, reject) => {\n                this.reload().then(() => reject(error));\n            });\n        }\n    },\n\n    saveSection(section) {\n        this.set('_currentSection', section);\n        return this.save()\n            .catch(response => {\n                if (response && response.errors) {\n                    const error = response.errors[0];\n                    if (error && get(error, 'payload.code') === 'VERSION_MISMATCH') {\n                        return resolve(response);\n                    }\n                }\n                return reject(response);\n            })\n            .finally(() => this.set('_currentSection', null));\n    },\n\n    set(field, value, options) {\n        options = options || {};\n        const overwrite = options.overwrite !== undefined ? options.overwrite : undefined;\n        const recordChange = options.recordChange !== undefined ? options.recordChange : true;\n\n        if (field.indexOf('.') === -1 || overwrite === true) {\n            return this._super(field, value);\n        }\n\n        const sectionKey = field.split('.')[0];\n\n        if (this.get(field) === undefined) {\n            if (!this.fieldConfig.getFieldByKey(field)) {\n                // This is getting loud...\n                // console.error(`The field \"${field}\" does not exist on entity`, this);\n                return undefined;\n            }\n\n            if (!this.get(sectionKey)) {\n                this._super(sectionKey, {});\n            }\n        }\n\n        // Delegate to Ember when not dealing with our own field config\n        if (!this.fieldConfig.getSectionByKey(sectionKey)) {\n            return this._super(field, value);\n        }\n\n        let currentField = this.getFieldValue(field);\n        const fieldDef = this.fieldConfig.getFieldByKey(field);\n\n        if (this.fieldConfig.isFieldRepeatable(field)) {\n            const data = {\n                tempId: Ember.generateGuid(),\n                value: value,\n                labelKey: fieldDef.labelKeys[0]\n            };\n\n            if (currentField && currentField.length > 0) {\n                currentField.addObject(data);\n            } else {\n                currentField = [data];\n            }\n        } else {\n            if (currentField && currentField._id) {\n                set(currentField, 'value', value);\n            } else {\n                currentField = {\n                    tempId: Ember.generateGuid(),\n                    value: value,\n                    labelKey: fieldDef.labelKeys[0]\n                };\n            }\n\n            currentField = [currentField];\n        }\n\n        if (recordChange) {\n            this.recordPropertyChange(field);\n        }\n\n        return this._super(field, currentField);\n    },\n\n    getPermissableSections() {},\n    getReadableSections() {},\n    getWriteableSections() {},\n    getReadableFieldsForSection() {},\n    getWriteableFieldsForSection() {},\n\n    deleteField(fieldPath, fieldId) {\n        const id = this.id;\n        const field = this.getFieldValue(fieldPath);\n\n        if (!fieldId) {\n            fieldId = field._id;\n        }\n\n        const version = this.version;\n\n        const type = pluralize(this.type);\n        const path = `/directory/api/v2/${type}/${id}/${version}/field/${fieldPath}/${fieldId}`;\n\n        return this.ajax.del(path).then(data => {\n            this.set('version', data.rel.version);\n        });\n    },\n\n    linkUploadedImage(image, crop, imageInfo, uploadType) {\n        const type = this.type;\n        const path = `/directory/api/v2/images/${image._id}/link/${type}/${this.id}/${imageMappings[type][uploadType]}`;\n\n        let bbox = null;\n        const ratio = imageInfo.ratio;\n\n        if (crop) {\n            bbox = {\n                x: Math.floor(crop.x / ratio),\n                y: Math.floor(crop.y / ratio),\n                x2: Math.floor(crop.x2 / ratio),\n                y2: Math.floor(crop.y2 / ratio)\n            };\n        } else {\n            bbox = {\n                x: 0,\n                y: 0,\n                x2: Math.floor(imageInfo.width),\n                y2: Math.floor(imageInfo.height)\n            };\n        }\n\n        return this.ajax\n            .post(path, {\n                data: {\n                    labelKey: '',\n                    bbox\n                }\n            })\n            .then(data => {\n                const version = get(data, 'rel.version');\n                if (version) {\n                    this.set('version', version);\n                }\n            });\n    }\n});\n\nexport default EntityMixin;\n","import { Promise, all } from 'rsvp';\nimport $ from 'jquery';\nimport { inject as service } from '@ember/service';\nimport Mixin from '@ember/object/mixin';\nimport EvaluationModel from '../models/evaluation';\nimport { formatTimestampForDisplay } from 'web-directory/utils/date-time';\n\nconst EvaluationsMixin = Mixin.create({\n    application: service(),\n    session: service(),\n    evaluationsAjax: $.ajax,\n\n    getEvaluations() {\n        return new Promise(resolve => {\n            let promises = [];\n            let agentEvaluations = [];\n            let evaluatorEvaluations = [];\n            let assigneeEvaluations = [];\n            const agentId = this.get('session.person.guid');\n            let evaluatorUri =\n                `api/v2/quality/evaluations/query?` +\n                `expand=agent` +\n                `&expand=assignee` +\n                `&evaluatorUserId=${agentId}` +\n                `&evaluationState=Pending` +\n                `&evaluationState=InProgress` +\n                `&pageSize=25`;\n\n            let agentFinishedUri =\n                `api/v2/quality/evaluations/query?` +\n                `agentUserId=${agentId}` +\n                `&isReleased=true` +\n                `&agentHasRead=false` +\n                `&evaluationState=Finished` +\n                `&pageSize=25`;\n\n            let agentInReviewUri =\n                `api/v2/quality/evaluations/query?` +\n                `agentUserId=${agentId}` +\n                `&isReleased=true` +\n                `&evaluationState=InReview` +\n                `&pageSize=25`;\n\n            let assigneeUri =\n                `api/v2/quality/evaluations/query?` +\n                `expand=agent` +\n                `&expand=assignee` +\n                `&assigneeUserId=${agentId}` +\n                `&pageSize=25`;\n\n            // 30 days ago in milliseconds (30 days * 86,400,000 ms/day)\n            const startTime = new Date(Date.now() - 30 * 86400000).toISOString();\n\n            agentFinishedUri = agentFinishedUri + `&startTime=${startTime}`;\n            agentInReviewUri = agentInReviewUri + `&startTime=${startTime}`;\n            evaluatorUri = evaluatorUri + `&startTime=${startTime}`;\n            assigneeUri = assigneeUri + `&startTime=${startTime}`;\n\n            let evaluatorRequest = {\n                url: this.application.pcV2Uri(evaluatorUri),\n                cache: false,\n                method: 'GET',\n                contentType: 'application/json; charset=UTF-8'\n            };\n            let requestAgentFinished = {\n                url: this.application.pcV2Uri(agentFinishedUri),\n                cache: false,\n                method: 'GET',\n                contentType: 'application/json; charset=UTF-8'\n            };\n            let requestAgentInReview = {\n                url: this.application.pcV2Uri(agentInReviewUri),\n                cache: false,\n                method: 'GET',\n                contentType: 'application/json; charset=UTF-8'\n            };\n            let requestAssignee = {\n                url: this.application.pcV2Uri(assigneeUri),\n                cache: false,\n                method: 'GET',\n                contentType: 'application/json; charset=UTF-8'\n            };\n\n            promises.push(\n                this.evaluationsAjax(evaluatorRequest).then(({ entities = [] }) => {\n                    evaluatorEvaluations.push(\n                        entities.map(evaluation => {\n                            if (evaluation) {\n                                evaluation.changedDate = !evaluation.calibration\n                                    ? evaluation.dateAssigneeChanged || evaluation.assignedDate\n                                    : evaluation.assignedDate;\n                                evaluation.assignedDate =\n                                    evaluation.assignedDate && formatTimestampForDisplay(evaluation.assignedDate);\n                                evaluation.linkContext = 'admin';\n                            }\n                            return EvaluationModel.create(evaluation);\n                        })\n                    );\n                })\n            );\n\n            promises.push(\n                this.evaluationsAjax(requestAgentFinished).then(({ entities = [] }) => {\n                    agentEvaluations.push(\n                        entities.map(evaluation => {\n                            if (evaluation) {\n                                evaluation.changedDate = evaluation.releaseDate;\n                                evaluation.assignedDate =\n                                    evaluation.assignedDate && formatTimestampForDisplay(evaluation.assignedDate);\n                                evaluation.linkContext = 'agent';\n                            }\n                            return EvaluationModel.create(evaluation);\n                        })\n                    );\n                })\n            );\n\n            promises.push(\n                this.evaluationsAjax(requestAssignee).then(({ entities = [] }) => {\n                    assigneeEvaluations.push(\n                        entities.map(evaluation => {\n                            if (evaluation) {\n                                evaluation.changedDate = evaluation.dateAssigneeChanged;\n                                evaluation.assignedDate =\n                                    evaluation.assignedDate && formatTimestampForDisplay(evaluation.assignedDate);\n                                evaluation.linkContext = 'admin';\n                            }\n                            return EvaluationModel.create(evaluation);\n                        })\n                    );\n                })\n            );\n\n            promises.push(\n                this.evaluationsAjax(requestAgentInReview).then(({ entities = [] }) => {\n                    agentEvaluations.push(\n                        entities.map(evaluation => {\n                            if (evaluation) {\n                                evaluation.changedDate = evaluation.releaseDate;\n                                evaluation.assignedDate =\n                                    evaluation.assignedDate && formatTimestampForDisplay(evaluation.assignedDate);\n                                evaluation.linkContext = 'agent';\n                            }\n                            return EvaluationModel.create(evaluation);\n                        })\n                    );\n                })\n            );\n\n            let evaluationIdSet = {};\n            all(promises).then(function () {\n                // It is important that the results are processed this way: evaluator results first, then assignee, and then agent\n                // That allows the de-duplication to use the most relevant of the results first and reject the same evaluation\n                // from less relevant queries\n                const resultData = evaluatorEvaluations\n                    .concat(assigneeEvaluations, agentEvaluations)\n                    .reduce((totalResult, queryResult) => {\n                        return totalResult.concat(\n                            queryResult.reduce((result, evaluation) => {\n                                if (!evaluationIdSet[evaluation.id]) {\n                                    evaluationIdSet[evaluation.id] = true;\n                                    result.push(evaluation);\n                                }\n                                return result;\n                            }, [])\n                        );\n                    }, []);\n                resolve(resultData); //resolve the promise when all inner promises are resolved\n            });\n        });\n    },\n\n    readEvaluation(evaluation) {\n        const evaluationIsAdminContext =\n            evaluation && evaluation.linkContext && evaluation.linkContext.toUpperCase() === 'ADMIN';\n        return (window.location.hash = `#/engage/${evaluationIsAdminContext ? 'admin' : 'agent'}/interactions/${\n            evaluation.conversation.id\n        }/?evaluationId=${evaluation.id}`);\n    }\n});\n\nexport default EvaluationsMixin;\n","import { inject as service } from '@ember/service';\nimport { alias, gt, and, notEmpty, equal } from '@ember/object/computed';\nimport Mixin from '@ember/object/mixin';\nimport { observer, computed } from '@ember/object';\nimport { componentClassName } from 'web-directory/utils/external-contact-messaging';\n\nexport default Mixin.create({\n    relate: service(),\n    names: service(),\n    externalContacts: service(),\n    session: service(),\n    permissions: service(),\n\n    externalContactProfiles: null,\n\n    conversationId: alias('interaction.id'),\n    mediaType: alias('interaction.type'),\n\n    participants: alias('interaction.participants'),\n    consultAgentParticipant: alias('interaction.consultAgentParticipant'),\n    consultParticipant: alias('interaction.consultParticipant'),\n    communicationId: alias('interaction.communicationId'),\n    hasMultipleExternalContactMatches: gt('externalContactProfiles.length', 1),\n\n    hasRelateAccess: alias('permissions.hasExternalContactsViewContactAccess'),\n\n    isIncomingFromExternalContacts: and('hasRelateAccess', 'isIncoming', 'hasExternalContactProfiles'),\n    isConnectedWithExternalContact: and('hasRelateAccess', 'isConnected', 'hasOneExternalContactProfile'),\n    hasExternalContactProfiles: notEmpty('externalContactProfiles'),\n    hasOneExternalContactProfile: equal('externalContactProfiles.length', 1),\n\n    /**\n     * Returns the \"class\" of the thing that mixes in this mixin (the \"inheritor\")\n     * @private\n     */\n    _nameForInheritor() {\n        return componentClassName.call(this);\n    },\n\n    // This CP is used by the navbar.hbs template for for direct incoming (not to an agent's queue) calls\n    externalContactFullName: computed('externalContactProfiles.[]', function () {\n        const externalProfile = this.get('externalContactProfiles.firstObject');\n        if (externalProfile) {\n            return this.names.fullName(externalProfile);\n        }\n        return this.get('otherPartyThatIsNotTheInitiator.calls.firstObject.other.name');\n    }),\n\n    cleanup: observer('interaction.isInteractionActive', function () {\n        if (!this.get('interaction.isInteractionActive')) {\n            this.relate.interactionEnded(this.get('interaction.id'));\n        }\n    })\n});\n","import { getOwner } from '@ember/application';\nimport { Promise, all } from 'rsvp';\nimport { inject as service } from '@ember/service';\nimport Mixin from '@ember/object/mixin';\nimport _ from 'lodash';\nimport ajax from 'ember-ajax';\nimport FaxModel from '../models/fax';\n\nconst FaxesMixin = Mixin.create({\n    application: service(),\n\n    getFaxes() {\n        return new Promise(resolve => {\n            let request = {\n                contentType: 'application/json; charset=UTF-8',\n                cache: false\n            };\n            let url = this.application.pcV2Uri('api/v2/fax/documents');\n\n            return ajax(url, request).then(({ entities = [] }) => {\n                let owner = getOwner(this);\n                return resolve(\n                    _.map(entities, function (fax) {\n                        // ownerInjection() must be the first arg in Ember 3.28\n                        return FaxModel.create(Object.assign({}, fax, owner.ownerInjection()));\n                    })\n                );\n            });\n        });\n    },\n\n    readFax(fax) {\n        this.changeFaxReadState(fax, true);\n        let contentUri = fax.get('contentUri');\n        let sharingUri = fax.get('sharingUri');\n\n        if (sharingUri) {\n            window.open(sharingUri);\n        } else {\n            ajax(contentUri, {\n                cache: false\n            }).then(contentLocationUri => {\n                window.open(contentLocationUri);\n            });\n        }\n    },\n\n    markFaxesRead(faxes) {\n        _.each(faxes, fax => {\n            this.changeFaxReadState(fax, true);\n        });\n    },\n\n    markFaxesUnread(faxes) {\n        _.each(faxes, fax => {\n            this.changeFaxReadState(fax, false);\n        });\n    },\n\n    changeFaxReadState(fax, read) {\n        fax.set('read', read);\n        let id = fax.get('id');\n        ajax(this.application.pcV2Uri(`api/v2/fax/documents/${id}`), {\n            cache: false,\n            method: 'PUT',\n            contentType: 'application/json; charset=UTF-8',\n            dataType: 'json',\n            data: JSON.stringify({\n                id: id,\n                read: read\n            })\n        });\n    },\n\n    renameFax(fax, name) {\n        fax.set('name', name);\n        let id = fax.get('id');\n        return ajax(this.application.pcV2Uri(`api/v2/fax/documents/${id}`), {\n            cache: false,\n            method: 'PUT',\n            contentType: 'application/json; charset=UTF-8',\n            dataType: 'json',\n            data: {\n                name\n            }\n        });\n    },\n\n    deleteFaxes(faxes) {\n        all(\n            _.map(faxes, fax => {\n                this.deleteFax(fax);\n            })\n        );\n    },\n\n    downloadFax(id) {\n        ajax(this.application.pcV2Uri(`api/v2/fax/documents/${id}/content`), {\n            cache: false,\n            method: 'GET',\n            contentType: 'application/json; charset=UTF-8',\n            dataType: 'json'\n        }).then(function ({ contentLocationUri }) {\n            window.open(contentLocationUri);\n        });\n    },\n\n    deleteFax(fax) {\n        ajax(this.application.pcV2Uri(`api/v2/fax/documents/${fax.get('id')}`), {\n            cache: false,\n            method: 'DELETE',\n            contentType: 'application/json; charset=UTF-8'\n        });\n    }\n});\n\nexport default FaxesMixin;\n","import { computed } from '@ember/object';\nimport { bool } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport Mixin from '@ember/object/mixin';\n\nexport default Mixin.create({\n    notification: service(),\n    intl: service(),\n    phone: service(),\n\n    didFlag: bool('flaggedSelves.length'),\n    flagOperationInProcess: false,\n\n    flaggedSelves: computed('call.participants.@each.flaggedReason', 'call.myGuid', function () {\n        let myParticipants = this.get('call.participants');\n        if (!myParticipants) {\n            return [];\n        }\n        let myGuid = this.get('call.myGuid');\n        let myFlaggedParticipants = myParticipants.filter(\n            participant => participant.user && participant.user.id === myGuid && participant.flaggedReason\n        );\n        return myFlaggedParticipants;\n    }),\n\n    // allow flagging/unflagging calls for 45 minutes from end time (analytics service's window for accepting new events for a call is 60 minutes)\n    allowFlagChange: computed('call.callEnd', 'clock.minute', function () {\n        // Consume clock.minute to establish Glimmer autotracking (Ember 3.28 compatibility)\n        this.get('clock.minute');\n        const elapsedMs = Date.now() - new Date(this.get('call.callEnd')).getTime();\n        const minutesPassed = elapsedMs / 60000;\n        return minutesPassed < 45;\n    }),\n\n    flagInteractionAction(action) {\n        if (this.allowFlagChange) {\n            this.set('flagOperationInProcess', true);\n            const participants = action === 'flag' ? [this.get('call.myParticipant')] : this.flaggedSelves;\n            this.phone.flagCallHistoryInteraction(action, this.call, participants).then(() => {\n                this.set('flagOperationInProcess', false);\n            });\n        } else {\n            const message = this.intl.safestring('notification.purecloud.tooLateToFlag').toString();\n            this.notification.info(null, message, {\n                hideAfter: 5\n            });\n        }\n    }\n});\n","import { inject as service } from '@ember/service';\nimport Mixin from '@ember/object/mixin';\n\nvar currentJobs = [];\nvar finishedJobs = [];\n\nfunction jobEndpoint(id) {\n    return `/api/v2/jobs/${id}`;\n}\n\nexport default Mixin.create({\n    ajax: service(),\n\n    _currentJobs: currentJobs,\n    _finishedJobs: finishedJobs,\n\n    addJob: function (job, callback, scope) {\n        if (job) {\n            job.callback = callback;\n            job.scope = scope || this;\n            job.interval = window.setInterval(() => {\n                this.getJobData(job);\n            }, 5000);\n\n            currentJobs.addObject(job);\n        }\n    },\n\n    getJobData: function (job) {\n        return this.ajax.ajaxGet(jobEndpoint(job.jobId)).then(\n            data => {\n                data = data.res;\n\n                var retryJobId = data.retryJobId;\n\n                if (data.status !== 'in-progress' && data.status !== 'pending') {\n                    window.clearInterval(job.interval);\n\n                    if (data.status === 'retry') {\n                        job.jobId = retryJobId;\n                        this.handleJob(job);\n                    } else if (job.status === 'failed') {\n                        currentJobs.removeObject(job);\n                        finishedJobs.addObject(job);\n\n                        job.callback.apply(job.scope, [job]);\n                    } else {\n                        currentJobs.removeObject(job);\n                        finishedJobs.addObject(job);\n\n                        job.callback.apply(job.scope, [job]);\n                    }\n                }\n            },\n            function () {\n                window.clearInterval(job.interval);\n\n                currentJobs.removeObject(job);\n                finishedJobs.addObject(job);\n\n                job.callback.apply(job.scope, [job]);\n            }\n        );\n    }\n});\n","import { getOwner } from '@ember/application';\nimport Mixin from '@ember/object/mixin';\nimport Ember from 'ember';\nconst LOG_LEVELS = ['trace', 'log', 'debug', 'info', 'warn', 'error'];\n\nexport default Mixin.create({\n    /*\n     * The fact that this mixin relies on getOwner means that it should only\n     * be used in classes created by the Ember container.\n     * We've broken this rule in a few places, and have compensated by setting the owner\n     * object as 'owner' on the object where this is mixed in.\n     */\n\n    init() {\n        this._super(...arguments);\n        // @ts-ignore\n        let owner = getOwner(this) || this.get('owner');\n        if (owner) {\n            // @ts-ignore\n            this.set('stashLogger', owner.lookup('service:stash-logger'));\n            this.bindLogMethods();\n        } else {\n            console.warn('No container available, falling back to ember logs');\n            this._bindEmberLogFunctions();\n        }\n    },\n\n    _bindEmberLogFunctions(this: any) {\n        this.logger = {};\n        LOG_LEVELS.forEach(level => {\n            // @ts-ignore\n            if (Ember.Logger[level]) {\n                // @ts-ignore\n                this.logger[level] = Ember.Logger[level];\n            }\n        });\n    },\n\n    bindLogMethods(this: any) {\n        this.logger = {};\n        let stashLogger = this.get('stashLogger');\n        LOG_LEVELS.forEach(level => {\n            // @ts-ignore\n            this.logger[level] = ((level, ...itemsToLog) => {\n                stashLogger = stashLogger || this.get('stashLogger');\n\n                // just in case someone calls bindLogMethods without using stash logger (service)\n                if (!stashLogger || !stashLogger.bufferLog) {\n                    // @ts-ignore\n                    Ember.Logger[level](this._debugContainerKey, ...itemsToLog);\n                    return;\n                }\n\n                stashLogger.bufferLog(level, this._debugContainerKey, ...itemsToLog);\n            }).bind(this, level);\n        });\n    }\n});\n","import Mixin from '@ember/object/mixin';\nimport _ from 'lodash';\n\nexport default Mixin.create({\n    actions: {\n        error(error) {\n            const errorState = { type: 'profileFetchServerFailure' };\n\n            console.error(error);\n\n            if (error && error.errors) {\n                error = _.head(error.errors);\n            }\n\n            if (error) {\n                let code = error.code;\n                if (typeof error.status === 'number') {\n                    code = error.status;\n                }\n                if (code >= 400 && code < 500) {\n                    this.transitionTo('index');\n                } else if (error.status >= 500) {\n                    this.set('application.errorState', errorState);\n                    this.transitionTo('maintenance');\n                }\n            } else if (!error) {\n                this.set('application.errorState', errorState);\n                this.transitionTo('maintenance');\n            }\n        }\n    }\n});\n","import { on } from '@ember/object/evented';\nimport { computed, get } from '@ember/object';\nimport Mixin from '@ember/object/mixin';\n\nvar PagingMixin = Mixin.create({\n    entityType: null,\n\n    currentPage: null,\n    cachedTotal: null,\n\n    limit: 10,\n    extraParams: computed(function () {\n        return {};\n    }),\n\n    fieldList: null,\n\n    actions: {\n        nextPage() {\n            if (this.hasNextPage) {\n                this.incrementProperty('currentPage');\n                this.loadPage();\n            }\n        },\n\n        prevPage() {\n            if (this.hasPrevPage) {\n                this.decrementProperty('currentPage');\n                this.loadPage();\n            }\n        }\n    },\n\n    ensureCorrectProperties: on('init', function () {\n        if (!this.entityType) {\n            this.set('entityType', 'person');\n        }\n\n        this.set('currentPage', 0);\n        this.set('cachedTotal', 0);\n    }),\n\n    offset: computed('limit', 'currentPage', function () {\n        return this.limit * this.currentPage;\n    }),\n\n    currentPageDisplay: computed('currentPage', function () {\n        return this.currentPage + 1;\n    }),\n\n    totalPages: computed('currentPage', 'content.[]', 'page', 'cachedTotal', function () {\n        var cachedTotal = this.cachedTotal || 0;\n\n        return Math.ceil(cachedTotal / this.limit);\n    }),\n\n    hasNextPage: computed('currentPageDisplay', 'totalPages', function () {\n        return this.currentPageDisplay < this.totalPages;\n    }),\n\n    hasPrevPage: computed('currentPage', function () {\n        return this.currentPage !== 0;\n    }),\n\n    haveContent: computed('content.[]', 'currentPage', function () {\n        var content = this.content;\n        if (content) {\n            return content.get('length') > 0;\n        }\n\n        return false;\n    }),\n\n    loadPage() {\n        let directory = true;\n        let entityType = this.entityType;\n        let extraParams = this.extraParams;\n\n        let letterUpdate = {};\n        if (entityType === 'group') {\n            letterUpdate = {\n                letter: null\n            };\n        }\n\n        let params = Object.assign(\n            {},\n            {\n                limit: this.limit,\n                offset: this.offset,\n                directory: directory\n            },\n            extraParams,\n            letterUpdate\n        );\n\n        if (this.fieldList) {\n            params = Object.assign({}, params, {\n                fl: this.fieldList\n            });\n        }\n\n        let page = this.store.query(entityType, params);\n\n        page.then(data => {\n            // `store.query()` resolves directly to an array of model instances in this Ember Data\n            // version — there is no `.content` of internal-model wrappers needing `.getRecord()`.\n            const content = (data.toArray ? data.toArray() : data).slice();\n\n            this.set('content', content);\n\n            let cachedTotal = get(data, 'meta.count');\n            if (cachedTotal > 0) {\n                this.set('cachedTotal', cachedTotal);\n            }\n\n            return content;\n        });\n\n        this.set('page', page);\n\n        return page;\n    }\n});\n\nexport default PagingMixin;\n","/*\n\n http://apidocs.orgbooklabsdev.com/security.html#password-requirements\n\n minPasswordLength the minimum length of a user’s password (defaults 8)\n\n minPasswordDigits the minimum number of digits in the password (defaults 0)\n\n minPasswordLetters the minimum number of letters in the password (defaults 0)\n\n minPasswordSpecials the minimum number of speical characters in the password (defaults 0). Specials are one of the following !”#$%&’()*+,-./:;<=>?@[\\]^_`{|}~\n\n minPasswordAge the minimum age of a password (in seconds) before a password can be changed (defaults 0)\n\n passwordExpirationTime the maximum age of a password in days before it is considered invalid (defaults 0 indicating no expiration)\n\n maxAccountInactivity the maximum time in days before an account is considered inactive (defaults 0 indicating no inactivity period)\n\n -------------------------------------------\n\n {\n wordNotEmail: true,\n wordLength: true,\n wordSimilarToUsername: true,\n wordSequences: true,\n wordTwoCharacterClasses: false,\n wordRepetitions: false,\n wordLowercase: true,\n wordUppercase: true,\n wordOneNumber: true,\n wordThreeNumbers: true,\n wordOneSpecialChar: true,\n wordTwoSpecialChar: true,\n wordUpperLowerCombo: true,\n wordLetterNumberCombo: true,\n wordLetterNumberCharCombo: true\n }\n\n -------------------------------------------\n\n This mixin requires a password field to follow the bootstrap form dom structure.\n Then annotate the form-group of the password field with a class of pwstrength-container.\n */\n\nimport { get } from '@ember/object';\n\nimport { on } from '@ember/object/evented';\nimport { inject as service } from '@ember/service';\nimport Mixin from '@ember/object/mixin';\nimport moment from '../utils/dates';\n\nconst MAX_PASSWORD_LENGTH = 400;\n\nexport default Mixin.create({\n    intl: service(),\n    ajax: service(),\n    application: service(),\n\n    passwordLength: MAX_PASSWORD_LENGTH,\n\n    attachBehavior: on('didInsertElement', function () {\n        const intl = this.intl;\n        const path = 'api/v2/organizations/passwordrequirements';\n        const url = this.application.pcV2Uri(path);\n        this.ajax.ajaxGet(url).then(passwordRequirements => {\n            let minPasswordLength = get(passwordRequirements, 'minimumLength') || 8;\n            let minPasswordDigits = get(passwordRequirements, 'minimumDigits') || 1;\n            let minPasswordLetters = get(passwordRequirements, 'minimumLetters') || 0;\n            let minPasswordSpecials = get(passwordRequirements, 'minimumSpecials') || 1;\n            let minPasswordUpper = get(passwordRequirements, 'minimumUpper') || 1;\n            let minPasswordLower = get(passwordRequirements, 'minimumLower') || 1;\n\n            this.set('minPasswordLength', minPasswordLength);\n\n            let options = {};\n            options.common = {\n                minChar: minPasswordLength,\n                onKeyUp: (evt, data) => {\n                    const weak = intl.safestring('auth.password.strength.weak').toString();\n                    // complex second boolean to handle situation where plugin thinks password is wrong\n                    if (\n                        data.verdictLevel >= 1 ||\n                        (data.verdictText === weak && data.score === 0 && data.verdictLevel === -1)\n                    ) {\n                        this.set('isValidFromPasswordRulesPlugin', true);\n                    } else {\n                        this.set('isValidFromPasswordRulesPlugin', false);\n                    }\n                }\n            };\n            options.rules = {\n                activated: {\n                    wordNotEmail: false,\n                    wordLength: false,\n                    wordSimilarToUsername: false,\n                    wordSequences: false,\n                    wordTwoCharacterClasses: false,\n                    wordRepetitions: false,\n                    wordLowercase: false,\n                    wordUppercase: false,\n                    wordOneNumber: false,\n                    wordThreeNumbers: false,\n                    wordOneSpecialChar: false,\n                    wordTwoSpecialChar: false,\n                    wordUpperLowerCombo: false,\n                    wordLetterNumberCombo: false,\n                    wordLetterNumberCharCombo: false\n                }\n            };\n            const intlAuthRule = (rule, opts) => intl.t(`auth.password.validation.${rule}`, opts);\n            const intlAuthVerdict = verdict => intl.t(`auth.password.strength.${verdict}`);\n            options.ui = {\n                container: '.pwstrength-container',\n                showErrors: true,\n                showPopover: false,\n                showStatus: true,\n                showProgressBar: false,\n                showVerdictsInsideProgressBar: true,\n                viewports: {\n                    progress: '.pwstrength-progress',\n                    verdict: '.pwstrength-progress'\n                },\n                scores: [1, 6, 18, 36], //[14, 26, 40, 50],\n                colors: [1, 6], //[26, 50]\n                verdicts: [\n                    intlAuthVerdict('weak'),\n                    intlAuthVerdict('normal'),\n                    intlAuthVerdict('medium'),\n                    intlAuthVerdict('strong'),\n                    intlAuthVerdict('veryStrong')\n                ],\n                errorMessages: {\n                    wordLength: intlAuthRule('wordLength'),\n                    wordNotEmail: intlAuthRule('wordNotEmail'),\n                    wordSimilarToUsername: intlAuthRule('wordSimilarToUsername'),\n                    wordTwoCharacterClasses: intlAuthRule('wordTwoCharacterClasses'),\n                    wordRepetitions: intlAuthRule('wordRepetitions'),\n                    wordSequences: intlAuthRule('wordSequences'),\n                    minPasswordLength: intlAuthRule('wordLength'),\n                    minPasswordDigits: intlAuthRule('minPasswordDigits', {\n                        minPasswordDigits\n                    }),\n                    minPasswordLetters: intlAuthRule('minPasswordLetters', {\n                        minPasswordLetters\n                    }),\n                    minPasswordSpecials: intlAuthRule('minPasswordSpecials', { minPasswordSpecials }),\n                    maxPasswordLength: intlAuthRule('passwordLengthError'),\n                    minPasswordLower: intlAuthRule('passwordLowerError', {\n                        minPasswordLower\n                    }),\n                    minPasswordUpper: intlAuthRule('passwordUpperError', {\n                        minPasswordUpper\n                    })\n                },\n                spanError: function (options, key) {\n                    var text = options.ui.errorMessages[key];\n                    return '<span class=\"error-text\" aria-live=\"polite\">' + text + '</span>';\n                }\n            };\n            var $password = this.$('.pwstrength-container input:password');\n            $password.pwstrength(options);\n\n            if (minPasswordLength) {\n                $password.pwstrength(\n                    'addRule',\n                    'minPasswordLength',\n                    function (options, word, score) {\n                        if (word && word.length < minPasswordLength) {\n                            return score;\n                        }\n                        return 0;\n                    },\n                    -100,\n                    true\n                );\n            }\n\n            if (minPasswordDigits) {\n                $password.pwstrength(\n                    'addRule',\n                    'minPasswordDigits',\n                    function (options, word, score) {\n                        if (word.replace(/[^0-9]/g, '').length < minPasswordDigits) {\n                            return score;\n                        }\n                        return 0;\n                    },\n                    -100,\n                    true\n                );\n            }\n\n            if (minPasswordLetters) {\n                $password.pwstrength(\n                    'addRule',\n                    'minPasswordLetters',\n                    function (options, word, score) {\n                        if (word.replace(/[^A-Za-z]/g, '').length < minPasswordLetters) {\n                            return score;\n                        }\n                        return 0;\n                    },\n                    -100,\n                    true\n                );\n            }\n\n            // see: https://bitbucket.org/inindca/auth-api/src/master/pkg/model/organization_models.go#lines-24\n            if (minPasswordSpecials) {\n                $password.pwstrength(\n                    'addRule',\n                    'minPasswordSpecials',\n                    function (options, word, score) {\n                        if (\n                            word.replace(/[^!\"“”'#$%&‘’()*+,-.\\/\\\\:;<=>?@\\[\\]^_`{|}~]/g, '').length <\n                            minPasswordSpecials\n                        ) {\n                            return score;\n                        }\n                        return 0;\n                    },\n                    -100,\n                    true\n                );\n            }\n\n            if (minPasswordUpper) {\n                $password.pwstrength(\n                    'addRule',\n                    'minPasswordUpper',\n                    function (options, word, score) {\n                        if (word.replace(/[^A-Z]/g, '').length < minPasswordUpper) {\n                            return score;\n                        }\n                        return 0;\n                    },\n                    -100,\n                    true\n                );\n            }\n\n            if (minPasswordLower) {\n                $password.pwstrength(\n                    'addRule',\n                    'minPasswordLower',\n                    function (options, word, score) {\n                        if (word.replace(/[^a-z]/g, '').length < minPasswordLower) {\n                            return score;\n                        }\n                        return 0;\n                    },\n                    -100,\n                    true\n                );\n            }\n\n            $password.pwstrength(\n                'addRule',\n                'maxPasswordLength',\n                function (options, word, score) {\n                    if (word && word.length > MAX_PASSWORD_LENGTH) {\n                        return score;\n                    }\n\n                    return 0;\n                },\n                -100,\n                true\n            );\n        });\n    }),\n\n    removeBehavior: on('willDestroyElement', function () {\n        this.$('.pwstrength-container input:password').pwstrength('destroy');\n        // The plugin does not clean up these CSS classes.\n        this.$('.pwstrength-container').removeClass('has-error has-warning has-success');\n    })\n});\n\n/*\n\n {\n 'code': 400,\n 'detail': 'Failed to meet password requirements',\n 'payload': {\n 'code': 'PASSWORD_REQUIREMENTS',\n 'requirements': {\n 'minPasswordLetters': 10,\n 'minPasswordSpecials': 2\n }\n },\n 'reason': 'Bad Request'\n }\n\n */\n\nexport var maxPasswordLength = MAX_PASSWORD_LENGTH;\n\nexport function extractServerPasswordRulesMessages(response) {\n    const messages = [];\n\n    let errorMessage = get(response, 'payload.reason');\n    if (!errorMessage) {\n        errorMessage = get(response, 'detail');\n    }\n    if (errorMessage) {\n        messages.push(errorMessage);\n    }\n\n    const payload = get(response, 'payload');\n    const code = get(response, 'payload.code');\n    const requirements = get(response, 'payload.requirements');\n    if (code === 'PASSWORD_REQUIREMENTS' && requirements) {\n        const validationKey = name => `auth.password.validation.${name}`;\n        const {\n            maxAccountInactivity,\n            minPasswordUpper,\n            minPasswordLower,\n            minPasswordLength,\n            minPasswordDigits,\n            minPasswordLetters,\n            minPasswordSpecials,\n            minPasswordAge,\n            passwordExpirationTime\n        } = requirements;\n\n        if (maxAccountInactivity > 0) {\n            const age = moment.duration(maxAccountInactivity, 'days').humanize();\n            messages.push({\n                key: validationKey('maxAccountInactivity'),\n                options: { age }\n            });\n        }\n        if (minPasswordUpper > 0) {\n            messages.push({\n                key: validationKey('passwordUpperError'),\n                options: { minPasswordUpper }\n            });\n        }\n        if (minPasswordLower > 0) {\n            messages.push({\n                key: validationKey('passwordLowerError'),\n                options: { minPasswordLower }\n            });\n        }\n        if (minPasswordLength > 0) {\n            messages.push({\n                key: validationKey('minPasswordLength'),\n                options: { minPasswordLength }\n            });\n        }\n        if (minPasswordDigits > 0) {\n            messages.push({\n                key: validationKey('minPasswordDigits'),\n                options: { minPasswordDigits }\n            });\n        }\n        if (minPasswordLetters > 0) {\n            messages.push({\n                key: validationKey('minPasswordLetters'),\n                options: { minPasswordLetters }\n            });\n        }\n        if (minPasswordSpecials > 0) {\n            messages.push({\n                key: validationKey('minPasswordSpecials'),\n                options: { minPasswordSpecials }\n            });\n        }\n        if (minPasswordAge > 0) {\n            const age = moment.duration(minPasswordAge, 'seconds').humanize();\n            messages.push({\n                key: validationKey('minPasswordAge'),\n                options: { age }\n            });\n        }\n        if (passwordExpirationTime > 0) {\n            const age = moment.duration(passwordExpirationTime, 'days').humanize();\n            messages.push({\n                key: validationKey('passwordExpirationTime'),\n                options: { age }\n            });\n        }\n    } else if (code === 'REQUIRED_FIELD') {\n        const key = `auth.password.validation.required.${payload.field}`;\n        messages.push({\n            key,\n            options: {}\n        });\n    } else if (code === 'BAD_VALUE') {\n        let key = 'auth.password.validation.badValue.default';\n        if (payload.field === 'password') {\n            key = 'auth.password.validation.badValue.password';\n        }\n        messages.push({\n            key,\n            options: {}\n        });\n    }\n    return messages;\n}\n","import { reads } from '@ember/object/computed';\nimport Mixin from '@ember/object/mixin';\nimport { computed } from '@ember/object';\n\nexport default Mixin.create({\n    activeCall: null,\n    isHeld: reads('activeCall.isHeld'),\n    isMuted: reads('activeCall.isMuted'),\n    isRecording: reads('activeCall.isRecording'),\n    isActiveCallACD: computed('activeCall.{isAgentCall,myselfIsMonitor,myselfIsCoach,myselfIsBarged}', function () {\n        if (!this.activeCall) {\n            return false;\n        }\n        return (\n            this.get('activeCall.isAgentCall') &&\n            !this.get('activeCall.myselfIsMonitor') &&\n            !this.get('activeCall.myselfIsCoach') &&\n            !this.get('activeCall.myselfIsBarged')\n        );\n    }),\n    isOutsideCall: computed('activeCall.otherParty.purpose', function () {\n        const purpose = this.get('activeCall.otherParty.purpose');\n        return purpose === 'external';\n    }),\n    myself: computed('activeCall.myself', function () {\n        // TODO: can this be removed?\n        return this.get('activeCall.myself');\n    }),\n    onCall: reads('activeCall.onCall'),\n    setActiveCall(conversation) {\n        this.set('activeCall', conversation);\n        this.notifyPropertyChange('activeCall');\n    },\n    cleanupActiveCall() {\n        return this.setActiveCall(null);\n    }\n});\n","import { inject as service } from '@ember/service';\nimport { readOnly } from '@ember/object/computed';\nimport { deprecate, assert } from '@ember/debug';\nimport Mixin from '@ember/object/mixin';\nimport { Promise, all } from 'rsvp';\nimport { run } from '@ember/runloop';\nimport { computed, observer, get, set } from '@ember/object';\nimport _ from 'lodash';\n\nimport { task, timeout } from 'ember-concurrency';\nimport AutoSaveDevicesMixin from 'web-directory/mixins/webrtc-service/auto-save-devices';\nimport webrtcConversationTypes from 'web-directory/utils/webrtc-conversation-types';\n\nconst CALL_CONVERSATION_CREATED_EVENT = 'callConversationCreated';\n\nexport default Mixin.create(AutoSaveDevicesMixin, {\n    headset: service(),\n    session: service(),\n    webrtc: service(),\n    phone: service(),\n    store: service(),\n    webrtcSdkService: service('webrtcSdk'),\n    queue: service(),\n    preferences: service(),\n    commandNav: service('command-nav'),\n    names: service(),\n    permissions: service(),\n\n    // temp variables for user actions (merging, dialing)\n    attemptingToCall: null,\n    shouldPromptForMerge: false,\n    callToMergeInto: null,\n    mergeData: null,\n    enableDefaultQueues: false,\n    showAgentWorkspaceRedirectModal: false,\n    pendingCallNumber: null,\n    userPreferenceHideWorkspaceRedirectModal: false,\n\n    allowOutboundExternalCall: computed('permissions.allowOutboundExternalCall', function () {\n        return this.get('permissions.allowOutboundExternalCall');\n    }),\n\n    allowOutboundUserCall: computed('permissions.allowOutboundUserCall', function () {\n        return this.get('permissions.allowOutboundUserCall');\n    }),\n\n    toggleUserPreferenceHideWorkspaceRedirectModal() {\n        this.set('userPreferenceHideWorkspaceRedirectModal', !this.get('userPreferenceHideWorkspaceRedirectModal'));\n    },\n\n    openAgenWorkspaceRedirectModal() {\n        this.set('showAgentWorkspaceRedirectModal', true);\n    },\n\n    closeAgentWorkspaceRedirectModal() {\n        this.set('showAgentWorkspaceRedirectModal', false);\n    },\n\n    /**\n     * Redirects the user to the agent workspace and triggers a button click on the \"Make Call\" modal to open it\n     */\n    async redirectToAgentWorkspace() {\n        await this.get('commandNav').selectPanel('agent', true);\n        const showAgentWorkspaceRedirectModal = this.get('showAgentWorkspaceRedirectModal');\n        if (showAgentWorkspaceRedirectModal) {\n            this.closeAgentWorkspaceRedirectModal();\n        }\n\n        const button = document.querySelector('#interaction-new-call-outbound-target');\n        if (button) button.click();\n    },\n\n    /**\n     * When user is shown the redirect modal and confirm:\n     * 1. They have to be recdirected to the agent workspace\n     * 2. The user preference for \"Don't show this modal again\" needs to be updated\n     */\n    async confirmRedirectToAgentWorkspace() {\n        await this.redirectToAgentWorkspace();\n        this.get('preferences').setPreference(\n            'phone.userPreferenceHideWorkspaceRedirectModal',\n            this.get('userPreferenceHideWorkspaceRedirectModal')\n        );\n    },\n\n    setPendingCallNumber(pendingCallNumber) {\n        this.set('pendingCallNumber', pendingCallNumber);\n    },\n\n    /**\n     * This function determines the number that needs to be pre-populuated in the number field.\n     * If the type of phoneNumber is person it would be a GC user.\n     * If externalContactId has valid value, we would fetch the external contact using the externalContactId\n     * Else it's a number that is directly typed in by the user and is pre-populuated as it is.\n     */\n    async determinePendingCallNumber(phoneNumber, callingPerson, onbehalfOfQueue, externalContactId) {\n        if (phoneNumber && phoneNumber.get && phoneNumber.get('type') === 'person') {\n            this.setPendingCallNumber(phoneNumber);\n        } else {\n            let number = phoneNumber;\n            if (typeof phoneNumber !== 'string') {\n                number = this.get('addressformat').format(phoneNumber);\n            }\n            if (externalContactId) {\n                const response = await this.store.findRecord('externalcontacts/contact', externalContactId);\n                const participant = {\n                    id: externalContactId,\n                    name: this.get('names').fullName(response),\n                    value: number.replace('tel:', ''),\n                    type: 'external',\n                    phoneNumber: number.replace('tel:', '')\n                };\n                this.setPendingCallNumber(participant);\n            } else {\n                const participant = {\n                    phoneNumber: number.replace('tel:', '')\n                };\n                this.setPendingCallNumber(participant);\n            }\n        }\n    },\n\n    acdWarmConferencePhase1FT: readOnly('session.features.PURE-7349_acdConferenceMS3-phase-1'),\n    PURE_5487_require_queueFT: readOnly('session.features.PURE-5487_require_queue'),\n\n    useRecordersState: computed('session.features', function () {\n        return this.get('session.features.WEM-438_recorder-states');\n    }),\n\n    deviceMuteEvent(isMuted) {\n        const call = this.activeCall;\n        if (call && this.isMuted !== isMuted) {\n            this.mute(call);\n        }\n    },\n\n    deviceHoldEvent(holdRequested, toggle) {\n        const call = this.activeCall;\n        if (!call) {\n            return;\n        }\n\n        // this is because jabra sends an unmute request after the call ends. Presumably to get the headset in a vanilla state\n        if (toggle && !call.get('isConnected')) {\n            return;\n        }\n\n        if (toggle || call.get('isHeld') !== holdRequested) {\n            this.hold(call);\n        }\n    },\n\n    deviceCallRejectedEvent(conversationId) {\n        let conversation;\n        if (conversationId) {\n            conversation = this.conversations.findBy('id', conversationId);\n        } else {\n            conversation = this.conversations.find(conversation => {\n                return conversation.get('isDialing') && conversation.get('isIncoming');\n            });\n        }\n\n        this.sendToVoicemail(conversation);\n    },\n\n    deviceCallAnsweredEvent() {\n        if (!this.activeCall) {\n            return;\n        }\n\n        const incomingCall = this.get('incomingConversations.lastObject');\n        if (incomingCall && get(incomingCall, 'id') === this.get('activeCall.id')) {\n            this.logger.info('Active and incoming call are the same, answering via device event');\n            this.answer(incomingCall);\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n        run.next(() => {\n            if (this.isDestroyed || this.isDestroying) {\n                return;\n            }\n            if (this.get('webrtcSdkService.useSdk')) {\n                this.enableHeadsets(this.webrtcSdkService);\n            } else {\n                this.enableHeadsets(this.headset);\n            }\n        });\n\n        try {\n            this.get('preferences')\n                .getPreference('interactions.defaultQueuesEnabled')\n                .then(val => {\n                    if (!this.isDestroyed && !this.isDestroying) {\n                        this.set('enableDefaultQueues', val);\n                    }\n                });\n\n            this.get('preferences')\n                .getPreference('phone.userPreferenceHideWorkspaceRedirectModal')\n                .then(value => {\n                    if (!this.isDestroyed && !this.isDestroying) {\n                        this.set('userPreferenceHideWorkspaceRedirectModal', value ? value : false);\n                    }\n                });\n        } catch (err) {\n            this.logger.info('Error fetching user preferences', { err });\n        }\n    },\n\n    changeHeadsetSource: observer('webrtcSdkService.useSdk', function () {\n        if (this.get('webrtcSdkService.useSdk')) {\n            this.enableHeadsets(this.webrtcSdkService);\n        }\n    }),\n\n    enableHeadsets(headsetSource) {\n        const headset = headsetSource;\n        headset.on('deviceAnsweredCall', () => {\n            this.deviceCallAnsweredEvent();\n        });\n        headset.on('deviceEndedCall', () => {\n            this.endCall();\n        });\n        headset.on('deviceMuteStatusChanged', isMuted => {\n            this.deviceMuteEvent(isMuted);\n        });\n        headset.on('deviceHoldStatusChanged', (holdRequested, toggle) => {\n            this.deviceHoldEvent(holdRequested, toggle, true);\n        });\n        headset.on('deviceRejectedCall', conversationId => {\n            this.deviceCallRejectedEvent(conversationId, true);\n        });\n    },\n\n    callVoicemail() {\n        return this.makeCall('*86');\n    },\n\n    _handleValidationError(error) {\n        const validationError = {\n            valid: false,\n            validationError: error\n        };\n        this.logger.warn('Call validation failed', validationError);\n        return Promise.reject('Call validation failed', validationError);\n    },\n\n    webrtcPhoneWithIssues: computed(\n        'phone.station.{isWebrtc,webRtcRequireMediaHelper}',\n        'webrtc.webrtcAudioCallIssueKey',\n        function () {\n            return (\n                this.get('phone.station.isWebrtc') &&\n                this.get('webrtc.webrtcAudioCallIssueKey') &&\n                !this.get('phone.station.webRtcRequireMediaHelper')\n            );\n        }\n    ),\n\n    _callRequiresQueue(phoneNumber) {\n        const allowOutboundExternalCall = this.get('allowOutboundExternalCall');\n        const allowOutboundUserCall = this.get('allowOutboundUserCall');\n\n        const isGCUser =\n            phoneNumber.get && typeof phoneNumber.get === 'function' && phoneNumber.get('type') === 'person';\n\n        if (allowOutboundExternalCall && allowOutboundUserCall) {\n            // does not require queue for any user type\n            return false;\n        } else if (allowOutboundExternalCall && !allowOutboundUserCall) {\n            // require queue for GC user\n            return isGCUser;\n        } else if (!allowOutboundExternalCall && allowOutboundUserCall) {\n            // require queue for external user\n            return !isGCUser;\n        } else if (!allowOutboundExternalCall && !allowOutboundUserCall) {\n            // require queue for both external & GC users\n            return true;\n        }\n    },\n\n    async _validateCall(phoneNumber, callingPerson, onbehalfOfQueue, externalContactId, associatedConversationId) {\n        if (this.get('station.isWebrtc')) {\n            if (!this.carrierPigeonConnected) {\n                this.notification.error(\n                    null,\n                    this.intl.safestring('notification.purecloud.webrtcPhoneUnavailable').toString(),\n                    {\n                        hideAfter: 5,\n                        tag: 'webrtc-phone-unavailable'\n                    }\n                );\n\n                return this._handleValidationError('Station is webrtc and carrier pigeon is not connected');\n            } else if (this.webrtcPhoneWithIssues) {\n                const intl = this.intl;\n                const title = intl.t('notification.titles.callError').toString();\n                const message = intl.t(this.get('webrtc.webrtcAudioCallIssueKey'));\n                this.notification.info(title, message);\n                return this._handleValidationError('Station is webrtc and has audio issues');\n            }\n        }\n\n        let message = this.intl.safestring('notification.purecloud.nonACDOnQueue');\n        if (this.onQueue && (!onbehalfOfQueue || !onbehalfOfQueue.id)) {\n            message = this.intl.safestring('notification.purecloud.nonACDOnQueue');\n            this.notification.info(null, message.toString(), {\n                hideAfter: 5\n            });\n        }\n        let station = this.station;\n        let noStation = station === undefined || station === null;\n        if (noStation) {\n            this.set('needStation', true);\n            this.notifyPropertyChange('needStation');\n            message = this.intl.safestring('notification.purecloud.noStationSelected').toString();\n            this.notification.info(null, message, {\n                hideAfter: 5\n            });\n\n            return this._handleValidationError('No station selected');\n        }\n        if (this.phoneDisabled) {\n            this.set('needStation', true);\n            this.notifyPropertyChange('needStation');\n            message = this.intl.safestring('notification.purecloud.unsupportedStation').toString();\n            this.notification.info(null, message, {\n                hideAfter: 5\n            });\n\n            return this._handleValidationError('Phone service disabled');\n        }\n        const PURE_5487_require_queueFT = this.get('PURE_5487_require_queueFT');\n        if (PURE_5487_require_queueFT) {\n            if (onbehalfOfQueue && onbehalfOfQueue.id) {\n                return Promise.resolve(onbehalfOfQueue);\n            }\n\n            //if the number is a emergency number they should be able to place a call without a queue\n            if (!phoneNumber.get || !typeof phoneNumber.get === 'function' || phoneNumber.get('type') !== 'person') {\n                let number = phoneNumber;\n                if (typeof phoneNumber !== 'string') {\n                    number = this.get('addressformat').format(phoneNumber);\n                }\n                const formattedNumber = number.replace('tel:', '');\n                const isEmergencyNumber = this._isEmergencyNumber(formattedNumber);\n                if (isEmergencyNumber) {\n                    return Promise.resolve();\n                }\n            }\n\n            const requireQueue = this._callRequiresQueue(phoneNumber);\n            if (!requireQueue) return Promise.resolve();\n\n            // When enableDefaultQueues is enabled, if the user has a default queue, the call should just go through\n            // When enableDefaultQueues is enabled, if the user does not have a default queue, user has to be redirected to the agent workspace\n            if (this.get('enableDefaultQueues')) {\n                return this.get('queue')\n                    .getDefaultQueue('call')\n                    .then(async queue => {\n                        if (!queue) {\n                            // No default queue, so queue is required\n                            await this.determinePendingCallNumber(\n                                phoneNumber,\n                                callingPerson,\n                                onbehalfOfQueue,\n                                externalContactId,\n                                associatedConversationId\n                            );\n                            // if userPreferenceHideWorkspaceRedirectModal is true, user is directly taken to the agen workspace\n                            if (this.get('userPreferenceHideWorkspaceRedirectModal')) {\n                                this.redirectToAgentWorkspace();\n                                return new Promise(() => {});\n                            }\n                            // if userPreferenceHideWorkspaceRedirectModal false, user is shown the redirect modal\n                            this.set('showAgentWorkspaceRedirectModal', true);\n                            return new Promise(() => {});\n                        } else {\n                            await this.get('commandNav').selectPanel('agent', true);\n                            return Promise.resolve(queue); // Valid default queue, so call should go through with the default queue\n                        }\n                    });\n            } else {\n                // When enableDefaultQueues is disabled, queue is required\n                await this.determinePendingCallNumber(\n                    phoneNumber,\n                    callingPerson,\n                    onbehalfOfQueue,\n                    externalContactId,\n                    associatedConversationId\n                );\n                // if userPreferenceHideWorkspaceRedirectModal is true, user is directly taken to the agen workspace\n                if (this.get('userPreferenceHideWorkspaceRedirectModal')) {\n                    this.redirectToAgentWorkspace();\n                    return new Promise(() => {});\n                }\n                // if userPreferenceHideWorkspaceRedirectModal false, user is shown the redirect modal\n                this.set('showAgentWorkspaceRedirectModal', true);\n                return new Promise(() => {});\n            }\n        }\n        return Promise.resolve();\n    },\n\n    allEmergencyNumbers: computed.readOnly('phone.allEmergencyNumbers'),\n\n    _isEmergencyNumber(phoneNumber) {\n        if (!phoneNumber) return false;\n        const allEmergencyNumbers = this.get('allEmergencyNumbers') || [];\n        return allEmergencyNumbers.includes(phoneNumber);\n    },\n\n    _throttledHoldOtherConversations: task(function* (data) {\n        this._holdOtherActiveConversations(data);\n        yield timeout(1000);\n    }).drop(),\n\n    // Handles errors by logging and notifying the user, but re-throws the error for consumers\n    // to handle if they want to\n    async _makeCall(phoneNumber, callingPerson, onbehalfOfQueue, externalContactId, associatedConversationId) {\n        if (callingPerson && !_.isEmpty(callingPerson)) {\n            this.set('attemptingToCall', callingPerson);\n        } else {\n            this.set('attemptingToCall', phoneNumber);\n        }\n\n        let url;\n        let data = {};\n        let key = 'phoneNumber';\n        if (phoneNumber && phoneNumber.get && phoneNumber.get('type') === 'person') {\n            key = 'callUserId';\n        }\n        if (phoneNumber && phoneNumber.get && phoneNumber.get('type') === 'queue') {\n            key = 'callQueueId';\n        }\n        // if phoneNumber is a string, we can safely skip the formatting\n        // otherwise, the format method is required here to return an id\n        // or number from the model (phoneNumber).\n        if (typeof phoneNumber !== 'string') {\n            phoneNumber = this.addressformat.format(phoneNumber);\n        } else if (_.startsWith(phoneNumber, 'sip:')) {\n            phoneNumber = this.addressformat.formatSipAddress(phoneNumber);\n        }\n        data[key] = phoneNumber;\n        if (externalContactId) {\n            data.externalContactId = externalContactId;\n        }\n        url = this.pcUri(`api/v2/conversations/calls`);\n\n        const PURE_5487_require_queueFT = this.get('PURE_5487_require_queueFT');\n\n        if (PURE_5487_require_queueFT) {\n            // if PURE-5487_require_queue is enabled, we add the queue to the payload only if its a non-emergency number\n            const isEmergencyNumber = this._isEmergencyNumber(phoneNumber);\n            if (!isEmergencyNumber && onbehalfOfQueue && onbehalfOfQueue.id) {\n                data.callFromQueueId = onbehalfOfQueue.id;\n            }\n        } else {\n            if (onbehalfOfQueue && onbehalfOfQueue.id) data.callFromQueueId = onbehalfOfQueue.id;\n        }\n\n        if (phoneNumber === undefined || phoneNumber === null) {\n            let message = this.intl.safestring('notification.purecloud.unableToMakeCall').toString();\n            const error = Error('Failed to make call: PhoneNumber is not defined');\n\n            this.logger.error(error.message, error);\n            this.showErrorNotification({ message }, error);\n            return Promise.reject(error);\n        }\n\n        let promise;\n\n        // PURE-7349: We need to pass in the associatedConversationId (aka the id of the current conference conversation) to the backend to specify that we are making a soft consult call from within this conference. The absence of this option will result in a regular call.\n        if (this.acdWarmConferencePhase1FT && associatedConversationId) {\n            data.associatedConversationId = associatedConversationId;\n        }\n\n        // if this is a webrtc call, place it through the sdk\n        if (this.get('webrtcSdkService.useSdk') && this.get('station.isWebrtc')) {\n            promise = this.webrtcSdkService.startSoftphoneSession(data);\n        } else {\n            const options = { data: data, contentType: 'application/json' };\n            promise = this.makeRequest(url, options, 'post');\n        }\n\n        return promise\n            .then(data => {\n                this.conversationsMadeByClient.pushObject(data);\n                data.attemptingToCall = this.attemptingToCall;\n                const conversation = this.updateActiveConversationEntry(data);\n\n                if (!this.get('webrtcSdkService.useSdk')) {\n                    this.headset.outgoingCall({ conversationId: data.id });\n                }\n\n                if (onbehalfOfQueue && data && data.id) {\n                    this.trigger(CALL_CONVERSATION_CREATED_EVENT, { conversationId: data.id });\n                }\n\n                if (this.get('station.isWebrtc')) {\n                    // TODO: shouldnt this be automatic with we place a call?\n                    this._throttledHoldOtherConversations.perform(data);\n                }\n\n                return conversation || { id: data.id };\n            })\n            .catch(err => {\n                let responseJSON;\n                if (err.responseJSON) {\n                    responseJSON = err.responseJSON;\n                } else if (err.jqXHR && err.jqXHR.responseJSON) {\n                    responseJSON = err.jqXHR.responseJSON;\n                }\n\n                this.logger.error('Error making request to place call', { data, url, err });\n                this.showErrorNotification(responseJSON, err);\n                return Promise.reject(err);\n            });\n    },\n\n    // helper service method to validate and make a call, handling errors by notifying the user.\n    // Returns a promise that does not reject. All errors are handled and notified to user\n    // To consume the error from validation or placing call, call _validateCall and _makeCall directly\n    makeCall(/*phoneNumber, callingPerson, onbehalfOfQueue, externalContactId,  associatedConversationId*/) {\n        const callArgs = [...arguments];\n        return this._validateCall(...callArgs).then(queue => {\n            if (queue) callArgs[2] = queue;\n            return this._makeCall(...callArgs);\n        });\n    },\n\n    /**\n       @desc Starts a call with the user with the given ID.\n       @param {string} id\n       @returns {Promise}\n    */\n    async callPersonById(id) {\n        if (!this.phoneAvailable) {\n            return;\n        }\n\n        const person = await this.store.findRecord('person', id);\n        return this.makeCall(person);\n    },\n\n    mergeCalls(conversations) {\n        const conferences = _.filter(conversations, function (conversation) {\n            return conversation.get('onConference');\n        });\n        const data = {\n            conversationIds: []\n        };\n        const recordings = _.filter(conversations, function (conversation) {\n            return conversation.get('isRecording');\n        });\n        let callsToMerge, callToMergeInto;\n        if (conferences.length > 1) {\n            console.warn('phone service: You cannot merge two conferences');\n            return;\n        } else if (conferences.length === 1) {\n            callToMergeInto = _.head(conferences);\n            callsToMerge = _.reject(conversations, function (conversation) {\n                return conversation.get('onConference');\n            });\n            if (recordings.length && callToMergeInto.get('isRecording') !== true) {\n                this.set('shouldPromptForMerge', true);\n                console.warn('Your recording will end when merging a recording call into a conference call');\n            }\n        } else if (recordings.length > 0) {\n            callToMergeInto = _.head(recordings);\n            callsToMerge = _.reject(conversations, function (conversation) {\n                return conversation === callToMergeInto;\n            });\n        } else {\n            callToMergeInto =\n                conversations.findBy('id', this.get('activeCall.id')) || conversations.findBy('isIncoming', false);\n            callsToMerge = _.reject(conversations, function (conversation) {\n                return conversation === callToMergeInto;\n            });\n        }\n        _.each(callsToMerge, function (conversation) {\n            return data.conversationIds.push(conversation.id);\n        });\n        this.set('mergeData', data);\n        this.set('callToMergeInto', callToMergeInto);\n        if (this.shouldPromptForMerge === false) {\n            return this.makeMergeRequest();\n        }\n    },\n\n    toVoicemail(conversation) {\n        deprecate('Please use \"service:phone/sendToVoicemail\" for sending a call to voicemail', false, {\n            id: 'directory-core.deprecate-old-phone-service-methods',\n            until: '8.0.0',\n            url: 'https://bitbucket.org/inindca/web-directory/src/develop/DEPRECATIONS.md#markdown-header-old-phone-service-methods'\n        });\n        this.sendToVoicemail(conversation);\n    },\n\n    _throttledHandlePhoneStatusChange: task(function* () {\n        this.handlePhoneStatusChange(...arguments);\n        yield timeout(1000);\n    }).drop(),\n\n    sendToVoicemail(conversation) {\n        if (conversation) {\n            this._throttledHandlePhoneStatusChange.perform('sendToVoicemail', conversation);\n            !this.get('webrtcSdkService.useSdk') &&\n                this.headset.endCall(conversation.get('id'), this.get('connectedConversations.length') > 1);\n        }\n    },\n\n    makeMergeRequest() {\n        const callId = this.get('callToMergeInto.id');\n        const uri = this.communicationUri(callId, 'calls');\n        const data = this.mergeData;\n        return this.makeRequest(uri, { data }, 'patch').finally(() => {\n            return this.clearMergeData();\n        });\n    },\n\n    clearMergeData() {\n        this.set('mergeData', null);\n        this.set('callToMergeInto', null);\n        return this.set('shouldPromptForMerge', false);\n    },\n\n    makeConferenceCall(parties, queue) {\n        const uri = this.pcUri(`api/${this.convAPIVersion}/conversations/calls`);\n        const participants = _.map(parties, function (party) {\n            if (party.entity && party.entity.get) {\n                if (party.entity.get('type') === 'person') {\n                    return { userId: party.entity.get('guid') };\n                }\n                if (party.entity.get('type') === 'queue') {\n                    return { queueId: party.entity.get('id') };\n                }\n            }\n            return { address: party.value };\n        });\n        const options = { data: { participants } };\n        if (queue && queue.id) {\n            options.data.callFromQueueId = queue.id;\n        }\n\n        return this.makeRequest(uri, options, 'post')\n            .then(json => {\n                this.conversationsMadeByClient.pushObject(json);\n            })\n            .catch(err => {\n                console.error('Error making conference call number', { uri, error: err });\n                let responseJSON;\n                if (err.responseJSON) {\n                    responseJSON = err.responseJSON;\n                } else if (err.jqXHR && err.jqXHR.responseJSON) {\n                    responseJSON = err.jqXHR.responseJSON;\n                }\n                return this.showErrorNotification(responseJSON, err);\n            });\n    },\n\n    bulkAddParticipants(parties) {\n        const callId = this.activeCall.id;\n        const uri = `${this.communicationUri(callId, 'calls')}/participants`;\n        const participants = _.map(parties, function (party) {\n            if (party.entity && party.entity.get) {\n                if (party.entity.get('type') === 'person') {\n                    return { userId: party.entity.get('guid') };\n                }\n                if (party.entity.get('type') === 'queue') {\n                    return { address: party.entity.get('id') };\n                }\n            }\n            return { address: party.value };\n        });\n        const options = { data: { participants } };\n        return this.makeRequest(uri, options, 'post');\n    },\n\n    blindTransfer(participant) {\n        let type = 'person';\n        if (participant) {\n            // if participant exists, check the type\n            const participantType = get(participant, 'entity.type');\n\n            // if type is undefined or null, default to byAddress\n            // defaulting to byAddress will use the default '/transfer' api in 'replaceUri' method in conversation-uri-builder mixin\n            type = participantType ? participantType : 'byAddress';\n        }\n        const isExternal = type === 'external';\n        const isNumber = typeof participant.value === 'string';\n        const myselfId = this.get('myself.id');\n        const callId = this.get('activeCall.id');\n        const participantEntity = get(participant, 'entity');\n        const url = this.replaceUri(callId, myselfId, null, null, type);\n        const isQueue = type === 'queue';\n        let data = {};\n\n        if (isNumber) {\n            data.address = participant.value;\n        } else if (isQueue) {\n            data.queueId = participant.id;\n        } else if (isExternal) {\n            data = participant;\n        } else {\n            const personGuid = get(participantEntity, 'guid');\n            data.userId = personGuid;\n        }\n\n        const options = { data };\n\n        return this.makeRequest(url, options, 'post').then(() => {\n            this._handleCallTransferred();\n        });\n    },\n\n    _handleCallTransferred(interaction) {\n        // if the call gets routed back to the client later, we don't want it to appear already answered or placed by the client\n        const conversationId = interaction ? get(interaction, 'id') : this.get('activeCall.id');\n        const conversation = this.conversations.findBy('id', conversationId);\n        if (conversation) {\n            set(conversation, 'acceptedByClient', false);\n            set(conversation, 'shouldAutoProceedWebrtc', false);\n        }\n        if (interaction) {\n            set(interaction, 'acceptedByClient', false);\n            set(interaction, 'shouldAutoProceedWebrtc', false);\n        }\n        const conversationsMadeByClient = this.conversationsMadeByClient;\n        const placedConversation = conversationsMadeByClient.findBy('id', conversationId);\n        if (placedConversation) {\n            conversationsMadeByClient.removeObject(placedConversation);\n        }\n    },\n\n    consultTransfer(destination) {\n        const activeCall = this.activeCall;\n        const type = destination ? get(destination, 'entity.type') : '';\n        const isNumber = typeof destination.value === 'string';\n        const person = destination.entity;\n        const isQueue = type === 'queue';\n        const isExternal = type === 'external';\n        const currentCallId = get(activeCall, 'id');\n        const otherPartyId = get(activeCall, 'otherParty.id');\n        let url = this.consultUri(currentCallId, otherPartyId, 'calls', type);\n        if (!isNumber) {\n            if (!isQueue && !isExternal) {\n                return this.store.find('person', get(person, 'guid')).then(party => {\n                    return this.initiateTransfer(party, url);\n                });\n            }\n            return this.initiateTransfer(destination, url);\n        }\n        return this.initiateTransfer(destination.value, url);\n    },\n\n    initiateTransfer(destination, url) {\n        const type = destination ? get(destination, 'entity.type') : '';\n        const isQueue = type === 'queue';\n        const isExternal = type === 'external';\n        let addressee = {};\n        if (isQueue) {\n            addressee = { queueId: destination.id };\n        } else if (isExternal) {\n            addressee = destination;\n        } else if (typeof destination !== 'string' && _.isEmpty(destination.phoneNumber)) {\n            addressee = { userId: destination.get('guid') };\n        } else if (typeof destination === 'string') {\n            addressee = { address: destination };\n        }\n        let options = { data: addressee };\n        return this.makeRequest(url, options, 'post');\n    },\n\n    changeSpeakerForConsult(speakTo) {\n        const callId = this.get('activeCall.id');\n        const otherParty = this.get('activeCall.otherParties').find(function (party) {\n            return party.consultParticipantId != null;\n        });\n        const otherPartyId = get(otherParty, 'consultParticipantId');\n        const url = this.consultUri(callId, otherPartyId, 'calls', null, true);\n        const options = { data: { speakTo } };\n        return this.makeRequest(url, options, 'patch');\n    },\n\n    endConsult() {\n        const currentCallId = this.get('activeCall.id');\n        const otherPartyId = this.get('activeCall.myself.consultParticipantId');\n        const url = this.generateConversationsUrl(currentCallId, otherPartyId, 'consult');\n        const options = { dataType: 'text' };\n        return this.makeRequest(url, options, 'DELETE');\n    },\n\n    dialDtmfNumber(currentCallId, participantId, number) {\n        assert('phone:dialDtmfNumber must take a conversation id as the first argument', currentCallId !== undefined);\n        assert('phone:dialDtmfNumber must take a participant id as the second argument', participantId !== undefined);\n\n        let uri = this.pcUri(\n            `api/${this.convAPIVersion}/conversations/${currentCallId}/participants/${participantId}/digits`\n        );\n        this.logger.info('sendingDtmfTones', {\n            conversationId: currentCallId,\n            participantId,\n            number\n        });\n\n        this.ajax.post(uri, { data: { digits: number } });\n    },\n\n    _throttledAnsweredSoundIncomingConversationRing: task(function* () {\n        this._answeredSoundIncomingConversationRing();\n        yield timeout(1000);\n    }).drop(),\n\n    _throttledAnswerWebrtc: task(function* (conversation) {\n        this._answerWebrtc(conversation);\n        yield timeout(1000);\n    }).drop(),\n\n    _throttledAnswer: task(function* (conversation) {\n        this._answer(conversation);\n        yield timeout(1000);\n    }).drop(),\n\n    _throttledAnswerSoftphoneConversation: task(function* (conversationId) {\n        if (this.get('webrtcSdkService.useSdk')) {\n            this.webrtcSdkService.acceptPendingSession({ conversationId });\n        } else {\n            this.webrtc.answerSoftphoneConversation(conversationId);\n        }\n        yield timeout(1000);\n    }).drop(),\n\n    answer(conversation) {\n        conversation = conversation || this.activeCall;\n        if (!get(conversation, 'isAgentCall')) {\n            // Do not set an agent call to activeCall for communicate\n            this.set('activeCall', conversation);\n        }\n        this.logger.info('Attempting to answer the conversation', conversation.get('id'));\n        this._throttledAnsweredSoundIncomingConversationRing.perform();\n        if (this.noStationSelected) {\n            this.showNoStationSelected(conversation);\n            return false;\n        }\n\n        if (conversation) {\n            set(conversation, 'acceptedByClient', true);\n        }\n        if (this.get('station.isWebrtc')) {\n            this._throttledAnswerWebrtc.perform(conversation);\n            this._throttledHoldOtherConversations.perform(conversation);\n            return; // don't perform answer for webrtc\n        }\n        const task = this._throttledAnswer.perform(conversation);\n        return task;\n    },\n\n    _answerWebrtc(conversation) {\n        const conversationId = conversation.get('id');\n        const session = this._findPendingSessionsByConversationId(conversationId);\n        if (session === undefined) {\n            if (this.stationHasPersistentConnection) {\n                // This is a flag we can look at in case we end up getting proposes for this conversation *later*\n                set(conversation, 'shouldAutoProceedWebrtc', true);\n\n                this.logger.info('_answerWebrtc stationHasPersistentConnection', { conversationId });\n                const task = this._throttledAnswer.perform(conversation);\n                return task;\n            }\n\n            this.logger.info('Conversation is waiting for session', { conversationId });\n            conversation.set('waitingForSession', true); // when the session comes in, this should auto accept.\n            return;\n        }\n\n        return this._throttledAnswerSoftphoneConversation.perform(conversationId);\n    },\n\n    _answer(conversation) {\n        const conversationId = conversation.get('id');\n        this.logger.log('handling _answer status change for conversation', { conversationId });\n        this.handlePhoneStatusChange('answer', conversation)\n            .then(() => {\n                return this.communication.validateActionSucceeded(conversation, 'callState.state', 'CONNECTED');\n            })\n            .then(() => {\n                if (this.onQueue) {\n                    return this.checkForNonACD(conversation);\n                }\n            })\n            .catch(() => {\n                const message = this.intl.t('notification.purecloud.failedToAnswer', { conversationId });\n                const title = this.intl.t('notification.titles.callError');\n                this.notification.error(title, message);\n            });\n    },\n\n    _throttledMute: task(function* (conversation) {\n        this._mute(conversation);\n        yield timeout(1000);\n    }).drop(),\n\n    mute(conversation) {\n        conversation = conversation || this.activeCall;\n        if (conversation) {\n            return this._throttledMute.perform(conversation);\n        }\n    },\n\n    _mute(conversation) {\n        const isMuted = conversation.get('isMuted');\n        this.handlePhoneStatusChange('muted', conversation)\n            .then(() => {\n                // this.get('headset').setMute(!isMuted);\n                if (!this.get('webrtcSdkService.useSdk')) {\n                    this.headset.setMute(!isMuted);\n                }\n                return this.communication.validateActionSucceeded(conversation, 'isMuted', !isMuted);\n            })\n            .catch(err => {\n                this.logger.error(err);\n                const title = this.intl.t('notification.titles.callError');\n                const message = this.intl.t('purecloud.acdInteraction.calls.errors.mute');\n                return this.notification.error(title, message);\n            });\n    },\n\n    /**\n     * @param {object | undefined | null} conversation the conversation to hold, if not provided `activeCall` will be used\n     * @param {boolean} skipHoldAll `true` if we should skip holding all of the other calls`\n     */\n    hold(conversation, skipHoldAll = false) {\n        // bypasses throttling and other seemingly uneeded checks\n        if (this.get('session.useMultipanel')) {\n            conversation = conversation || this.activeCall;\n            if (!conversation) {\n                return Promise.resolve();\n            } else if (skipHoldAll) {\n                return this._held(conversation);\n            }\n\n            // if the conversation is held now, it's being unheld\n            // so if we're using webrtc, and there are more than one active\n            // call, we should hold all other calls that aren't already held\n            const isHeld = conversation.get('isHeld');\n            if (isHeld && this.get('station.isWebrtc') && this.get('activeConversations.length') > 1) {\n                this._holdOtherActiveConversations(conversation);\n            }\n            return this._held(conversation);\n        }\n\n        // if the conversation is held now, it's being unheld\n        // so if we're using webrtc, and there are more than one active\n        // call, we should hold all other calls that aren't already held\n        const isHeld = conversation.get('isHeld');\n        if (isHeld && this.get('station.isWebrtc') && this.get('activeConversations.length') > 1) {\n            this._holdOtherActiveConversations(conversation);\n        }\n        this.held(conversation);\n        return Promise.resolve();\n    },\n\n    _holdOtherActiveConversations(conversation) {\n        const conversationId = get(conversation, 'id');\n        const otherConversations = this.connectedConversations.filter(c => c.get('id') !== conversationId);\n        otherConversations.forEach(otherConversation => {\n            const isHoldable = !otherConversation.get('isHeld') && !otherConversation.get('isDisconnected');\n            if (isHoldable) {\n                const isWarmInviteCall = this.acdWarmConferencePhase1FT && otherConversation.get('isWarmInviteCall');\n                // When there is one participant on the warm-invite call left, don't attempt to hold anyone\n                if (\n                    isWarmInviteCall &&\n                    otherConversation.get('connectedParties') &&\n                    otherConversation.get('connectedParties').length <= 1\n                ) {\n                    return;\n                }\n                this._held(otherConversation);\n            }\n        });\n    },\n\n    held(conversation) {\n        conversation = conversation || this.activeCall;\n        if (conversation) {\n            this._throttledHeld.perform(conversation);\n        }\n    },\n\n    _throttledHeld: task(function* (conversation) {\n        this._held(conversation);\n        yield timeout(1000);\n    }).drop(),\n\n    _held(conversation) {\n        const isHeld = conversation.get('isHeld');\n        return this.handlePhoneStatusChange('held', conversation)\n            .then(() => {\n                if (!this.get('webrtcSdkService.useSdk')) {\n                    this.headset.setHold(conversation.get('id'), !isHeld);\n                }\n                return this.communication.validateActionSucceeded(conversation, 'isHeld', !isHeld);\n            })\n            .catch(err => {\n                this.logger.error(err);\n                const title = this.intl.t('notification.titles.callError');\n                const message = this.intl.t('purecloud.acdInteraction.calls.errors.hold');\n                this.notification.error(title, message);\n            });\n    },\n\n    record(conversation) {\n        conversation = conversation || this.activeCall;\n        if (conversation) {\n            this._throttledRecord.perform(conversation);\n        }\n    },\n\n    _throttledRecord: task(function* (conversation) {\n        this._record(conversation);\n        yield timeout(1000);\n    }).drop(),\n\n    _record(conversation) {\n        const isRecording = conversation.get('isRecording');\n        this.handlePhoneStatusChange('recording', conversation)\n            .then(() => {\n                return this.communication.validateActionSucceeded(conversation, 'isRecording', !isRecording);\n            })\n            .catch(() => {\n                const title = this.intl.t('notification.titles.callError');\n                const message = this.intl.t('purecloud.acdInteraction.calls.errors.record');\n                this.notification.error(title, message);\n            });\n    },\n\n    flagActiveInteraction(action, conversation) {\n        const call = conversation || this.activeCall;\n        const participant = call.get('myself');\n        if (!participant) {\n            this.logger.info('No \"myself\" participant on the call when handling flag change', {\n                conversationId: get(call, 'id')\n            });\n            return Promise.reject(new Error('Self participant missing'));\n        }\n\n        const isFlagged = !!conversation.get('myself.flaggedReason');\n        this.logger.debug('isFlagged:', isFlagged);\n\n        return this._makeFlagChange(conversation, participant, action)\n            .then(() => {\n                return this.communication.validateActionSucceeded(conversation, 'myself.flaggedReason', [\n                    isFlagged ? undefined : 'general'\n                ]);\n            })\n            .catch(err => {\n                const title = this.intl.t('notification.titles.callError');\n                const message = this.intl.t('purecloud.acdInteraction.calls.errors.flag');\n                this.notification.error(title, message);\n                this.logger.warn('Failed to validate interaction flagging', {\n                    conversationId: get(conversation, 'id'),\n                    err\n                });\n            });\n    },\n\n    flagCallHistoryInteraction(action, conversation, participants) {\n        return all(\n            participants.map(participant => {\n                return this._makeFlagChange(conversation, participant, action);\n            })\n        ).catch(err => {\n            const title = this.intl.t('notification.titles.callError');\n            const message = this.intl.t('purecloud.acdInteraction.calls.errors.flag');\n            this.notification.error(title, message);\n            this.logger.warn('Failed to validate history interaction flagging', {\n                conversationId: get(conversation, 'id'),\n                err\n            });\n        });\n    },\n\n    _makeFlagChange(call, participant, action) {\n        let url = this.pcUri(`api/v2/conversations/${call.id}/participants/${participant.id}/flaggedreason`);\n\n        let type;\n        if (action === 'flag') {\n            type = 'PUT';\n        } else if (action === 'unflag') {\n            type = 'DELETE';\n        } else {\n            return Promise.reject(new Error('Unwanted action for changing flag'));\n        }\n\n        return this.makeRequest(url, {}, type).then(() => {\n            if (action === 'flag') {\n                set(participant, 'flaggedReason', 'general');\n            } else {\n                set(participant, 'flaggedReason', undefined);\n            }\n        });\n    },\n\n    endCall(conversation = this.activeCall) {\n        if (conversation) {\n            return this._throttledEndCall.perform(conversation);\n        }\n    },\n\n    /**\n     * Ends the conversation call for ALL participants included.\n     * @param {object} conversation The conversation to end\n     */\n    endCallForAll(conversation = this.activeCall) {\n        if (conversation) {\n            return this._throttledEndCallForAll.perform(conversation);\n        }\n    },\n\n    endCallById(conversationId) {\n        const conversation = this.conversations.findBy('id', conversationId);\n        if (conversation) {\n            return this._throttledEndCall.perform(conversation);\n        }\n    },\n\n    _throttledEndCall: task(function* (conversation) {\n        this._endCall(conversation);\n        yield timeout(1000);\n    }).drop(),\n\n    _throttledEndCallForAll: task(function* (conversation) {\n        this._endCallForAll(conversation);\n        yield timeout(1000);\n    }).drop(),\n\n    async _endCall(conversation) {\n        return this.handlePhoneStatusChange('hangup', conversation)\n            .then(() => {\n                const conversationWithError = this.userCallSessionsWithErrors.findBy('id', conversation.get('id'));\n\n                const isDisconnected = get(conversation, 'isDisconnected');\n\n                // if the call is disconnected or has an error, remove it now.\n                if (!conversation.get('isAgentCall') && (isDisconnected || conversationWithError)) {\n                    run.next(this, this.removeConversationFromConversations, [conversation]);\n                } else if (conversation.get('isAgentCall') && isDisconnected && conversationWithError) {\n                    this.trigger('agentEndedCallWithError', conversation.get('id'));\n                }\n\n                if (this.get('webrtcSdkService.useSdk') && this.get('station.isWebrtc')) {\n                    this._endWebrtcCall(get(conversation, 'id'));\n                }\n\n                return this.communication.validateActionSucceeded(conversation, 'isDisconnected', true);\n            })\n            .catch(err => {\n                const title = this.intl.t('notification.titles.callError');\n                const message = this.intl.t('purecloud.acdInteraction.calls.errors.hangup');\n                this.notification.error(title, message);\n                this.logger.error(message, err);\n            });\n    },\n\n    async _endCallForAll(conversation) {\n        return this.handlePhoneStatusChange('end', conversation)\n            .then(() => {\n                const conversationWithError = this.userCallSessionsWithErrors.findBy('id', conversation.get('id'));\n\n                const isDisconnected = get(conversation, 'isDisconnected');\n\n                // if the call is disconnected or has an error, remove it now.\n                if (!conversation.get('isAgentCall') && (isDisconnected || conversationWithError)) {\n                    run.next(this, this.removeConversationFromConversations, [conversation]);\n                } else if (conversation.get('isAgentCall') && isDisconnected && conversationWithError) {\n                    this.trigger('agentEndedCallWithError', conversation.get('id'));\n                }\n\n                if (this.get('webrtcSdkService.useSdk') && this.get('station.isWebrtc')) {\n                    this._endWebrtcCall(get(conversation, 'id'));\n                }\n\n                return this.communication.validateActionSucceeded(conversation, 'isDisconnected', true);\n            })\n            .catch(err => {\n                const title = this.intl.t('notification.titles.callError');\n                const message = this.intl.t('purecloud.acdInteraction.calls.errors.hangup');\n                this.notification.error(title, message);\n                this.logger.error(message, err);\n            });\n    },\n\n    /**\n     * All webrtc softphone calls are ended through here.\n     */\n    _endWebrtcCall(conversationId) {\n        if (this.stationHasPersistentConnection) {\n            return;\n        }\n        if (this.get('station.isWebrtc') && conversationId) {\n            const data = {\n                conversationId,\n                conversationType: webrtcConversationTypes.SOFTPHONE,\n                // PCM-517 - this fallback disconnect was disconnecting conversations that\n                // got routed back to an agent after transfering to a queue, and were new, not old\n                pending: false, // don't end any new pending conversations\n                notAfter: new Date() // don't end any conversations created after now\n            };\n            // PCM-340 - pass false to throttle to run on tail end of the interval. This gives the API request to hangup\n            // one second to finish, before we explicitly tear down the connection. If the edge takes longer than\n            // one second to hangup, then we'll tear it down and the edge will detect an error, but that's expected\n            this._throttledEndWebrtcCall.perform(data);\n        }\n    },\n\n    _throttledEndWebrtcCall: task(function* (data) {\n        yield timeout(1000);\n        this.webrtc.endConversation(data);\n    }).drop(),\n\n    handlePhoneStatusChange(action, conversation) {\n        return new Promise((resolve, reject) => {\n            const call = conversation || this.activeCall;\n            const participant = call.get('myself');\n            if (!participant) {\n                this.logger.info('No \"myself\" participant on the call when handling status change', {\n                    conversationId: get(call, 'id')\n                });\n                return reject(new Error('Self participant missing'));\n            }\n            let type = 'patch';\n            let url = this.pcUri(`api/v2/conversations/calls/${call.id}/participants/${participant.id}`);\n            let data, toggle;\n\n            const useRecordersState = this.useRecordersState;\n\n            // Used to end the entirety of the conversation. Implemented for `endForAll` in conferencing.\n            if (action === 'end') {\n                data = {\n                    state: 'DISCONNECTED'\n                };\n                url = this.generateConversationUrl(call.get('id'));\n            } else if (action === 'hangup') {\n                data = {\n                    state: 'DISCONNECTED'\n                };\n\n                const conversationWithError = this.userCallSessionsWithErrors.findBy('id', conversation.get('id'));\n                const callbackConnected = _.get(participant, 'callbacks[0].state', '').toLowerCase() === 'connected';\n                const callConnected = _.get(participant, 'calls[0].state', '').toLowerCase() === 'connected';\n\n                if (\n                    (callConnected && callbackConnected) ||\n                    (!callConnected && callbackConnected && conversationWithError)\n                ) {\n                    type = 'patch';\n                    const communicationId = _.get(participant, 'calls[0].id');\n                    url = this.generateCommunicationUrl(call.get('id'), participant.id, communicationId);\n                }\n            } else if (action === 'answer') {\n                data = {\n                    state: 'CONNECTED'\n                };\n            } else if (action === 'sendToVoicemail') {\n                type = 'post';\n                const query = {\n                    voicemail: true\n                };\n                const mediaType = null;\n                const entityType = 'agent';\n                url = this.replaceUri(call.get('id'), participant.id, null, mediaType, entityType);\n                data = query;\n            } else if (action === 'held') {\n                if (!get(conversation, 'isConnected')) {\n                    this.logger.debug(\n                        `Attempted to set hold state for non-connected conversation: ${conversation.get('id')}`\n                    );\n                    return Promise.resolve();\n                }\n\n                toggle = _.head(participant.calls)[action];\n                data = {};\n                data[action] = !toggle;\n            } else if (action === 'recording' && useRecordersState) {\n                const participantCallState = _.head(participant.calls);\n                const adhocState = get(participantCallState || {}, 'recordersState.adhocState');\n                data = {};\n                if (adhocState) {\n                    data[action] = adhocState.toLowerCase() !== 'active';\n                } else {\n                    toggle = _.head(participant.calls)[action];\n                    data[action] = !toggle;\n                }\n            } else {\n                toggle = _.head(participant.calls)[action];\n                data = {};\n                data[action] = !toggle;\n            }\n\n            this.set('loading.' + action, true);\n            this.set('currentStatusChange', action);\n\n            if (!_.includes(['put', 'post', 'patch'], type)) {\n                reject();\n            }\n\n            this.makeRequest(url, { data }, type)\n                .then(response => {\n                    resolve(response);\n                })\n                .catch(({ jqXHR }) => {\n                    reject(jqXHR);\n\n                    if (jqXHR.status !== 202) {\n                        this.set(`loading.${action}`, false);\n                    }\n\n                    if (jqXHR.status === 403) {\n                        const response = JSON.parse(jqXHR.responseText);\n                        if (response.code.toLowerCase() === 'record_participant_forbidden') {\n                            const title = this.intl.t('notification.titles.callError');\n                            const message = this.intl.t('notification.purecloud.lackRecordingPermission');\n                            return this.notification.error(title, message);\n                        } else if (\n                            response.code.toLowerCase() === 'forbidden' &&\n                            response.message.includes('missing division permissions')\n                        ) {\n                            // division error\n                            const title = this.intl.t('notification.titles.callError');\n                            const message = this.intl.t('notification.purecloud.lackDivisionPermission');\n                            return this.notification.error(title, message);\n                        }\n                    }\n                })\n                .finally(() => {\n                    return this.set('loading.' + action, false);\n                });\n        });\n    },\n\n    handleOtherParticipantStatusChange(action, participant) {\n        const call = this.activeCall;\n        const url = this.generateConversationsUrl(call.get('id'), participant.id);\n        let method = 'patch';\n        let data = {};\n\n        if (action === 'hangup') {\n            data.state = 'disconnected';\n        } else {\n            const toggle = _.head(participant.calls)[action];\n            data[action] = !toggle;\n        }\n\n        const options = { method, data: JSON.stringify(data) };\n        return this.makeRequest(url, options, 'raw')\n            .then(data => {\n                return console.debug('Other Status Change: ' + action, data);\n            })\n            .catch(({ jqXHR }) => {\n                if (jqXHR.status !== 202) {\n                    this.set('loading.' + action, false);\n                }\n\n                if (jqXHR.status === 403) {\n                    const response = JSON.parse(jqXHR.responseText);\n                    if (response.code.toLowerCase() === 'record_participant_forbidden') {\n                        const title = this.intl.t('notification.titles.callError');\n                        const message = this.intl.t('notification.purecloud.lackRecordingPermission');\n                        return this.notification.error(title, message);\n                    }\n                }\n            });\n    }\n});\n","import Mixin from '@ember/object/mixin';\nimport _ from 'lodash';\n\nexport default Mixin.create({\n    callForwardingActive: false,\n    callForwardingNumber: null,\n    callForwardingExtension: null,\n\n    fetchCallForwarding() {\n        if (this.canCallForward) {\n            this.getCallForwarding()\n                .then(response => {\n                    return this._updateCallForwarding(response);\n                })\n                .catch(() => {\n                    this.set('callForwardingActive', false);\n                });\n        }\n    },\n\n    getCallForwarding() {\n        const url = this.application.pcV2Uri('api/v2/users/' + this.personGuid + '/callForwarding');\n        return this.ajax.ajaxGet(url);\n    },\n\n    _updateCallForwarding(response) {\n        const enabled = _.isEmpty(response) ? false : response.enabled;\n        this.set('callForwardingActive', enabled);\n        const phoneNumber = response.phoneNumber;\n        const hasPhoneNumber = !_.isEmpty(phoneNumber);\n        if (hasPhoneNumber) {\n            if (_.startsWith(phoneNumber, ';ext=')) {\n                const re = /^;ext=(\\d{1,})$/;\n                const number = _.last(re.exec(phoneNumber));\n                this.set('callForwardingExtension', number);\n                return this.set('callForwardingNumber', null);\n            } else {\n                this.set('callForwardingNumber', phoneNumber);\n                return this.set('callForwardingExtension', null);\n            }\n        }\n    }\n});\n","import { inject as service } from '@ember/service';\nimport { reads, gt, readOnly, gte } from '@ember/object/computed';\nimport { A } from '@ember/array';\nimport { getOwner } from '@ember/application';\nimport Mixin from '@ember/object/mixin';\nimport { observer, computed, get, set } from '@ember/object';\nimport { run } from '@ember/runloop';\nimport { task, timeout } from 'ember-concurrency';\nimport moment from 'web-directory/utils/dates';\nimport webrtcConversationTypes from 'web-directory/utils/webrtc-conversation-types';\nimport ConversationModel from 'web-directory/models/conversation-legacy';\nimport CallInteraction from 'web-directory/models/interaction/call-interaction';\nimport Interaction from 'web-directory/models/interaction/interaction';\nimport ERROR_WHITE_LIST from 'web-directory/utils/error-white-list';\nimport { isTesting } from 'web-directory/utils/testing';\nimport { setInteractionModelMetadata } from '../../utils/acd';\n\nexport default Mixin.create({\n    interaction: service(),\n    ring: service(),\n    externalContacts: service(),\n    chat: service(),\n\n    _contactObservers: null,\n\n    // holds all of the conversations\n    conversations: [],\n    conversationsMadeByClient: [],\n    activeConversations: reads('conversations'),\n    onMultipleCalls: gt('activeConversations.length', 1),\n    ringing: readOnly('ring._ringing'),\n\n    init() {\n        this._super(...arguments);\n        this.set('_contactObservers', {});\n    },\n\n    // TODO: unbind conversations and webrtc sessions\n    // This is only used in two places anyways. Might be able to remove.\n    activeAcdCalls: computed(\n        'activeConversations.[]',\n        'webrtc.pendingSessions.[]',\n        'webrtcSdkService.pendingSessions.[]',\n        'webrtc.conversationsWithConversationId.[]',\n        'station.isWebrtc',\n        function () {\n            return this.activeConversations.filter(conv => {\n                if (!this.get('station.isWebrtc')) {\n                    return conv.get('isAgentCall');\n                }\n                const callState = get(conv, 'callState.state');\n                const webrtcConversation = this.webrtc.getConversation({\n                    conversationId: conv.id,\n                    conversationType: webrtcConversationTypes.SOFTPHONE\n                });\n                const session = this._findPendingSessionsByConversationId(conv.id);\n                if (!callState || !webrtcConversation || !session) {\n                    return false;\n                }\n                const callIsAlreadyConnnected = ['connected', 'disconnected'].indexOf(callState.toLowerCase()) > -1;\n                const hasPendingSession = session ? get(session, 'id') || get(session, 'sid') : false; // seems redundant when checking for session above\n                const webrtcSessions = get(webrtcConversation, 'sessions');\n                const atLeastOneWebrtcConversation = this.isDefinedAndLengthGreaterThan(webrtcSessions, 0); // atLeastOneWebrtcConversation would be better here.\n                return (\n                    (callIsAlreadyConnnected || hasPendingSession || atLeastOneWebrtcConversation) &&\n                    conv.get('isAgentCall')\n                );\n            });\n        }\n    ),\n\n    // activeNonAcdCalls feeds all the components based on whether or not station is webrtc or not.\n    activeNonAcdCalls: computed('activeConversations.@each.connectedToStationAndNotConference', function () {\n        return this.activeConversations.filter(conv => {\n            // connecting to an auto conference, do not display.\n            if (conv.get('connectedToStationAndNotConference') && !conv.get('isGroupRing')) {\n                return false;\n            }\n            return !conv.get('isAgentCall');\n        });\n    }),\n\n    // conversations that are not 'disconnected' and not 'terminated'\n    connectedConversations: computed('conversations.@each.onCall', function () {\n        const conversations = this.conversations;\n        return conversations.filter(function (conversation) {\n            return conversation.get('onCall');\n        });\n    }),\n\n    /**\n     * Consumed by webrtc-conversation-manager behind toggle.\n     *\n     * Conversations for which the client should send the <proceed /> (i.e., webrtc.answerSoftphoneConversation())\n     * This would be conversations that the client initiated or conversations that were answered before the client received the <propose />\n     * or conversations that this browser was set to handle calls from with the thisBrowserIsTheOneToAnswerFrom toggle.\n     */\n    dialingOrContactingOrAlertingConversationsToProceed: computed(\n        'conversations.@each.waitingForSession',\n        'conversationsMadeByClient.@each.id',\n        'conversations.@each.isDialing',\n        'thisBrowserIsTheOneToAnswerFrom',\n        function () {\n            const conversations = this.conversations;\n            return conversations.filter(conversation => {\n                const thisClientMadeTheCall = this.conversationsMadeByClient.findBy('id', conversation.id);\n                const waitingForSession = conversation.get('waitingForSession');\n                // If we transfer a call we've placed and we're the target of the transfer, we do not want to auto answer/proceed.\n                if (!!conversation.recentTransfers) {\n                    this.conversationsMadeByClient.removeObject(conversation);\n                    return false;\n                }\n                if (thisClientMadeTheCall || waitingForSession) {\n                    return true;\n                }\n\n                const thisBrowserIsTheOneToAnswerFrom = this.thisBrowserIsTheOneToAnswerFrom;\n                const isDialing = conversation.get('isDialing');\n                const isOutbound = conversation.get('isOutbound');\n                return isOutbound && isDialing && thisBrowserIsTheOneToAnswerFrom;\n            });\n        }\n    ),\n\n    disconnectedConversations: computed('conversations.@each.onCall', function () {\n        return this.conversations.filter(conversation => {\n            const isDisconnected = this.isDisconnected(conversation);\n            if (conversation.get('isAgentCall')) {\n                return isDisconnected && conversation.get('isAfterCallWorkCompleted');\n            }\n            return isDisconnected;\n        });\n    }),\n\n    eligibleCallsToMerge: computed('activeConversations.@each.{isConnected,onConference}', 'activeCall', function () {\n        const onConference = this.get('activeCall.onConference');\n        return this.activeConversations.reject(conv => {\n            let thisCallIsConference = false;\n            if (!conv.get('isConnected')) {\n                return true;\n            }\n            if (conv.get('onConference')) {\n                thisCallIsConference = true;\n            }\n            return conv.id === this.get('activeCall.id') || (onConference && thisCallIsConference);\n        });\n    }),\n\n    _handleActiveConversationsUpdates: observer(\n        'activeConversations.[]',\n        'activeNonAcdCalls.[]',\n        'station.isWebrtc',\n        function () {\n            this._throttledHandleActiveConversations.perform();\n        }\n    ),\n\n    _throttledHandleActiveConversations: task(function* (throttle = 500) {\n        yield timeout(throttle);\n        this.handleActiveConversationsUpdates();\n    }).drop(),\n\n    handleActiveConversationsUpdates() {\n        const hasActiveCall = this.activeCall;\n        const activeNonAcdCalls = this.activeNonAcdCalls;\n\n        // activeNonAcdCalls could contain calls that have ended\n        const connectedNonAcdCalls = activeNonAcdCalls.filterBy('onCall');\n\n        const connectedConversations = this.connectedConversations || [];\n        const dialingOrIncomingConversation = connectedConversations.filter(function (conversation) {\n            return conversation.get('isDialing') || conversation.get('isIncoming');\n        });\n\n        let newActiveCall = undefined;\n\n        if (!hasActiveCall) {\n            // no active call\n            newActiveCall = (connectedNonAcdCalls && get(connectedNonAcdCalls, 'lastObject')) || null;\n        } else {\n            // active call might have finished\n            const activeCallOngoing = this.onCall;\n\n            if (!activeCallOngoing) {\n                const activeCallErrors = this.get('activeCall.errorInfoMessage');\n\n                if (activeCallErrors) {\n                    // something went wrong with the call\n                    this.set('lastConversationError', {\n                        id: this.get('activeCall.id'),\n                        errorInfo: this.get('activeCall.errorInfo')\n                    });\n                    console.warn('lastConversationError: ', this.lastConversationError);\n                } else {\n                    // call finished successfully - move to the next one\n                    newActiveCall = (connectedNonAcdCalls && get(connectedNonAcdCalls, 'lastObject')) || null;\n                }\n\n                // prioritize new dialed or incoming calls\n                if (dialingOrIncomingConversation && dialingOrIncomingConversation.length) {\n                    newActiveCall = get(dialingOrIncomingConversation, 'lastObject') || null;\n                }\n            } else {\n                const dialingOutboundConversations = connectedConversations.filter(function (conversation) {\n                    return conversation.get('isDialing') && !conversation.get('isIncoming');\n                });\n                const hasOutboundConversation = dialingOutboundConversations && dialingOutboundConversations.length;\n\n                if (hasOutboundConversation) {\n                    newActiveCall = get(dialingOrIncomingConversation, 'lastObject') || null;\n                }\n            }\n        }\n\n        // set the next active call appropriately\n        if (newActiveCall) {\n            this.set('activeCall', newActiveCall);\n        }\n    },\n\n    hasIncomingConversations: false,\n    _setHasIncomingConversations: observer('incomingConversations.[]', function () {\n        return run.once(this, this.set, 'hasIncomingConversations', this.get('incomingConversations.length') > 0);\n    }),\n\n    hasActiveNonAcdCalls: computed('incomingNonAcdConversations.[]', 'activeNonAcdCalls.[]', function () {\n        return this.get('incomingNonAcdConversations.length') > 0 || this.get('activeNonAcdCalls.length') > 0;\n    }),\n\n    incomingConversations: computed(\n        'conversations.[]',\n        'conversations.@each.isIncoming',\n        'station.isWebrtc',\n        'webrtc.pendingSessions.[]',\n        'webrtcSdkService.pendingSessions.[]',\n        'webrtc.conversationsWithConversationId.[]',\n        function () {\n            const conversations = this.conversations;\n            return conversations.filterBy('isIncoming');\n        }\n    ),\n\n    incomingNonAcdConversations: computed('incomingConversations.[]', function () {\n        const conversations = this.incomingConversations;\n        return conversations.rejectBy('isAgentCall');\n    }),\n\n    // TODO: only reference two places - in navbar.hbs & alerting-manager\n    isOnConnectedAcdCall: computed('activeConversations.@each.{isAgentCall,isConnected}', function () {\n        const acdCall = this.activeConversations.find(function (conv) {\n            return conv.get('isAgentCall') && conv.get('isConnected');\n        });\n        return !!acdCall;\n    }),\n\n    isOnConnectedCall: computed('activeConversations.@each.isConnected', function () {\n        return !!this.activeConversations.findBy('isConnected');\n    }),\n\n    mostRecentlyConnectedConferenceCalls() {\n        return this.activeConversations.filter(conversation => {\n            const isConferenceCall = get(conversation, 'onConference');\n            const isConnectedCall = get(conversation, 'onCall');\n            const myTime = moment(get(conversation, 'myself.connectedTime'));\n            const diff = moment().diff(myTime);\n            return isConferenceCall && isConnectedCall && diff < 3000;\n        });\n    },\n\n    // conversations that have the 'connected' state and are not agent calls.\n    onlyConnectedConversations: computed('conversations.@each.connected', function () {\n        return this.conversations.filter(conversation => {\n            return conversation.get('isConnected') && !conversation.get('isAgentCall');\n        });\n    }),\n\n    recentDisconnectedAgentCalls: computed('conversations.@each.connected', function () {\n        return this.conversations.reject(conversation => {\n            const isDisconnected = this.isDisconnected(conversation) && conversation.get('isAfterCallWorkCompleted');\n            const isAgentCall = conversation.get('isAgentCall');\n            return !isAgentCall || !isDisconnected;\n        });\n    }),\n\n    recentDisconnectedNonAcdCalls: computed('conversations.@each.onCall', function () {\n        return this.conversations.filter(conversation => {\n            const callState = get(conversation, 'callState');\n            const isDisconnected =\n                callState && callState.state\n                    ? ['disconnected', 'terminated'].indexOf(callState.state.toLowerCase()) > -1\n                    : false;\n            return isDisconnected && !conversation.get('isAgentCall');\n        });\n    }),\n\n    removeConversationFromConversations(calls) {\n        const conversations = this.conversations;\n        const conversationsMadeByClient = this.conversationsMadeByClient;\n        const userCallSessionsWithErrors = this.userCallSessionsWithErrors;\n        if (this.isDefinedAndLengthGreaterThan(conversations, 0)) {\n            calls.forEach(conversation => {\n                const conversationId = get(conversation, 'id');\n                if (!conversationId || !get(conversation, 'isDisconnected')) {\n                    return;\n                }\n\n                // weird case where a non acd call ends and gets transferred back immediately. conversation is no longer disconnected and shouldn't be removed\n                if (!conversation.get('isAgentCall') && !this._shouldRemoveNonAcdConversation(conversation)) {\n                    return;\n                }\n\n                const conversationMarker = conversationsMadeByClient.findBy('id', conversationId);\n                if (conversationMarker) {\n                    conversationsMadeByClient.removeObject(conversationMarker);\n                }\n                const conversationsToRemove = conversations.filterBy('id', conversationId);\n\n                if (conversation) {\n                    const callErrorToRemove = userCallSessionsWithErrors.filterBy('id', conversationId);\n                    userCallSessionsWithErrors.removeObjects(callErrorToRemove);\n\n                    if (conversation.id === this.get('activeCall.id')) {\n                        this.cleanupActiveCall();\n                    }\n\n                    // ownerInjection() must be the first arg in Ember 3.28\n                    const conversationModelTemp = ConversationModel.create(\n                        Object.assign({}, conversation.get('__interaction_metadata__'), getOwner(this).ownerInjection())\n                    );\n                    set(conversationModelTemp, 'type', 'call');\n\n                    const interactionModelTemp = CallInteraction.create(getOwner(this).ownerInjection());\n                    Object.keys(conversationModelTemp).forEach(key => {\n                        interactionModelTemp.set(key, conversationModelTemp[key]);\n                    });\n                    interactionModelTemp.set('conversation', conversationModelTemp);\n\n                    const { id } = conversation;\n                    this.externalContacts.removeContactChangeListenersForInteraction(\n                        interactionModelTemp,\n                        this.get(`_contactObservers.${id}`)\n                    );\n                    const acdCallService = this.get('acdcall');\n                    const activeCalls = acdCallService ? acdCallService.get('activeCalls') || A([]) : A([]);\n                    const customerIntentInteraction = activeCalls.findBy('id', id) || interactionModelTemp;\n                    this.get('customerIntent').removeCustomerIntentListenerForInteraction(customerIntentInteraction);\n                    this.set(`_contactObservers.${id}`, undefined);\n\n                    if (conversation.get('onConference') || conversation.get('onConsult')) {\n                        // we are treating UC conference/consult chat rooms as one offs\n                        // leave the room once the user is disconnected from the call\n                        const conferenceJid = `conference-${conversationId}@conference.${this.get(\n                            'session.org.shortName'\n                        )}.orgspan.com`;\n                        this.chat.leaveChatRoom(conferenceJid);\n                    }\n\n                    conversation.destroy();\n                    interactionModelTemp.destroy();\n                    conversationModelTemp.destroy();\n                }\n\n                conversations.removeObjects(conversationsToRemove);\n            });\n        }\n    },\n\n    _throttledRemoveDisconnectedConversations: task(function* (throttle = 500) {\n        yield timeout(throttle);\n        this._removeDisconnectedConversations();\n    }).drop(),\n\n    _shouldRemoveNonAcdConversation(conversation) {\n        const conversationHasErrors = this.userCallSessionsWithErrors.findBy('id', conversation.id);\n        const conversationMadeByClient = this.conversationsMadeByClient.findBy('id', conversation.id);\n        const conversationAcceptedOnClient = get(conversation, 'acceptedByClient');\n        const conversationWasMadeOrAcceptedOnClient = conversationAcceptedOnClient || conversationMadeByClient;\n\n        const participantsForUser = conversation.get('participants').filterBy('userId', this.personGuid);\n        let participantOnUpdatedConversation;\n\n        if (participantsForUser.length) {\n            participantOnUpdatedConversation = participantsForUser[participantsForUser.length - 1];\n        }\n        const updatedParticipantCall = this.getParticipantCall(participantOnUpdatedConversation);\n\n        let conversationWasTerminatedNotDisconnected = false;\n        if (updatedParticipantCall) {\n            conversationWasTerminatedNotDisconnected = updatedParticipantCall.state === 'terminated';\n\n            if (updatedParticipantCall.state === 'alerting') {\n                return false;\n            }\n        }\n\n        if (\n            !conversationWasMadeOrAcceptedOnClient ||\n            conversationWasTerminatedNotDisconnected ||\n            (conversationWasMadeOrAcceptedOnClient && !conversationHasErrors)\n        ) {\n            return true;\n        }\n        if (conversationHasErrors) {\n            return false;\n        }\n    },\n\n    _removeDisconnectedConversations() {\n        if (this.get('recentDisconnectedAgentCalls.length')) {\n            const disconnectedCalls = this.recentDisconnectedAgentCalls;\n            return run.next(this, this.removeConversationFromConversations, disconnectedCalls);\n        }\n        if (this.get('recentDisconnectedNonAcdCalls.length')) {\n            // remove conversations normally that were not made or accepted on this client\n            // remove conversations normally that do not have errors\n            const conversationsToRemove = this.recentDisconnectedNonAcdCalls.filter(conversation => {\n                return this._shouldRemoveNonAcdConversation(conversation);\n            });\n            let timeOutToRemove = this.timeOutToRemove;\n            if (!isTesting) {\n                const stationIsWebrtc = this.get('station.isWebrtc');\n                const thereArePendingSessions = this.get('webrtc.pendingSessions.length') > 0;\n                if (\n                    stationIsWebrtc &&\n                    thereArePendingSessions &&\n                    this.get('activeCall.connectedToStationAndNotConference')\n                ) {\n                    timeOutToRemove = 1;\n                }\n            }\n            if (conversationsToRemove.length) {\n                this._debouncedRemoveConversationFromConversations.perform(conversationsToRemove, timeOutToRemove);\n            }\n        }\n    },\n\n    _debouncedRemoveConversationFromConversations: task(function* (conversationsToRemove, debounceTime) {\n        yield timeout(debounceTime);\n        this.removeConversationFromConversations(conversationsToRemove);\n    }),\n\n    thereIsAConnectedConversation: gte('onlyConnectedConversations.length', 1),\n\n    /**\n     * Single insertion point for the `conversations` array, enforcing one\n     * ConversationModel instance per conversation id. If an entry with the same id\n     * already exists, the passed `model` is left untouched and the existing instance\n     * is returned; otherwise `model` is pushed and returned.\n     *\n     * Both phone's own processing chain and the Modes call chain process the same\n     * call events and would otherwise each create + push a ConversationModel for the\n     * same id. Routing every insertion through here guarantees they share one instance\n     * (the one WebRTC binds to). Note: this intentionally does NOT destroy a rejected\n     * candidate, since the caller may still reference it within the current chain step;\n     * callers that no longer need a rejected candidate are responsible for destroying it.\n     *\n     * @param {ConversationModel} model - candidate conversation model\n     * @returns {ConversationModel} the canonical instance held in `conversations`\n     */\n    addOrGetConversation(model) {\n        if (!model) {\n            return model;\n        }\n        const id = get(model, 'id');\n        const existing = id ? this.get('conversations').findBy('id', id) : null;\n        if (existing) {\n            return existing;\n        }\n        this.get('conversations').pushObject(model);\n        return model;\n    },\n\n    updateConversationArray(conversation, conversationDetails, isAgentCall) {\n        const conversationExists = conversationDetails != null ? true : false;\n        if (conversationExists) {\n            conversationDetails.setProperties(conversation);\n            setInteractionModelMetadata(conversationDetails, conversation);\n        } else {\n            // ownerInjection() must be the first arg in Ember 3.28\n            conversationDetails = ConversationModel.create(\n                Object.assign({}, conversation, getOwner(this).ownerInjection())\n            );\n            setInteractionModelMetadata(conversationDetails, conversation);\n\n            //Verify if we should process this update if agentCall\n            let isUpdateValid = true;\n            let interaction = null;\n            if (isAgentCall) {\n                set(conversationDetails, 'type', 'call');\n                interaction = Interaction.create(getOwner(this).ownerInjection());\n                Object.keys(conversationDetails).forEach(key => {\n                    interaction.set(key, conversationDetails[key]);\n                });\n                interaction.set('conversation', conversationDetails);\n                isUpdateValid = get(interaction, 'isInteractionActive');\n                interaction.destroy();\n            }\n            if (isUpdateValid) {\n                if (this.get('session.useModes')) {\n                    // Route through addOrGetConversation so we never create a duplicate instance\n                    // for an id the Modes call chain may have already registered.\n                    const canonical = this.addOrGetConversation(conversationDetails);\n                    if (canonical !== conversationDetails) {\n                        conversationDetails.destroy();\n                        conversationDetails = canonical;\n                    }\n                } else {\n                    this.get('conversations').pushObject(conversationDetails);\n                }\n            } else {\n                conversationDetails.destroy();\n            }\n        }\n        if (conversationDetails) {\n            this.trigger(`conversations.${conversationDetails.get('id')}`);\n            return conversationDetails;\n        } else {\n            return null;\n        }\n    },\n\n    monitoredConversationsForErrors: computed(\n        'conversations.@each.participants',\n        'interaction.activeConversations.[]',\n        function () {\n            const nonAcdCalls = this.conversations.reject(conversation => {\n                return get(conversation, 'participants').any(party =>\n                    party && party.purpose ? party.purpose === 'agent' || party.purpose === 'acd' : false\n                );\n            });\n            const acdCalls = this.get('interaction.activeConversations');\n            return A([].concat(nonAcdCalls || [], acdCalls || []));\n        }\n    ),\n\n    // returns an array of conversation objects for the current user:\n    // { id: conversationId,\n    //   calls: [] // All calls for this user's participant\n    // }\n    usersCallSessions: computed('monitoredConversationsForErrors.@each.participants', 'personGuid', function () {\n        let callSessions = [];\n        this.monitoredConversationsForErrors.forEach(conversation => {\n            get(conversation, 'participants').forEach(participant => {\n                const purpose = (get(participant, 'purpose') || '').toLowerCase();\n                const participantIsUserAgent = ['user', 'agent'].indexOf(purpose) > -1;\n                const participantIsCurrentUser = get(participant, 'userId') === this.personGuid;\n                const userParticipant = participantIsCurrentUser && participantIsUserAgent ? participant : null;\n                if (userParticipant && get(userParticipant, 'calls')) {\n                    callSessions.push({ id: conversation.id, calls: get(userParticipant, 'calls') });\n                }\n            });\n        });\n        return callSessions;\n    }),\n\n    // returns array of user's call sessions that have errors (errorInfo or disconnectType == 'error' or disconnectReasons with 3XX, 4XX, 5XX codes)\n    userCallSessionsWithErrors: computed(\n        'usersCallSessions.calls.@each.errorInfo',\n        'usersCallSessions.calls.@each.disconnectReasons',\n        'userCallSessionsWithErrors.calls.@each.disconnectType',\n        function () {\n            return this.usersCallSessions.filter(session => {\n                const calls = get(session, 'calls');\n                const callsWithErrors = calls.filter(call => {\n                    const disconnectReasons = get(call, 'disconnectReasons');\n                    const thereAreDisconnectReasons = this.isDefinedAndLengthGreaterThan(disconnectReasons, 0);\n                    if (thereAreDisconnectReasons) {\n                        const re = /[3|4|5|6]\\d{2}/;\n                        const disconnectErrors = disconnectReasons.filter(reason => {\n                            return re.exec(reason.code);\n                        });\n                        return this.isDefinedAndLengthGreaterThan(disconnectErrors, 0);\n                    }\n                    const errorInfo = get(call, 'errorInfo');\n                    const disconnectTypeIsError =\n                        typeof get(call, 'disconnectType') === 'string'\n                            ? call.disconnectType.toLowerCase() === 'error'\n                            : false;\n\n                    // UI-2567: Ignore white listed errors if they do not cause disconnect\n                    if (!disconnectTypeIsError && errorInfo && ERROR_WHITE_LIST.indexOf(errorInfo.code) !== -1) {\n                        return false;\n                    }\n\n                    return errorInfo || disconnectTypeIsError ? true : false;\n                });\n                return callsWithErrors.length > 0 ? true : false;\n            });\n        }\n    )\n});\n","import Mixin from '@ember/object/mixin';\nimport { observer, get, set } from '@ember/object';\nimport Ember from 'ember';\n\nconst { Logger } = Ember;\n\nexport default Mixin.create({\n    init() {\n        this._super(...arguments);\n        this.get('pigeon').on('my-conversations', this, this._onMyConversationEvent);\n        this.get('pigeon').on('connect', this, this._onPigeonConnect);\n        this.get('pigeon').on('callforwarding', this, this._updateCallForwarding); // in mixins/phone-service/call-forward\n        this.get('communication').on('endCall', this, this._endCall);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        if (this.communication.off) {\n            this.communication.off('endCall', this, this._endCall);\n        }\n        this.get('pigeon').off('my-conversations', this, this._onMyConversationEvent);\n        this.get('pigeon').off('connect', this, this._onPigeonConnect);\n        this.get('pigeon').off('callforwarding', this, this._updateCallForwarding);\n\n        // The station subscription is per-user (`v2.users.<id>.station`) and only made once\n        // `user.id` resolves, so its event name cannot be reconstructed here — it used to be\n        // removed as the literal 'station', which never matched what was subscribed. That left the\n        // real listener attached for the life of the service, and under Ember 3.28 removing a\n        // function listener that was never added asserts outright. Remove the exact name that was\n        // subscribed, and only when a subscription actually happened.\n        const stationEvent = this._stationEvent;\n        if (stationEvent) {\n            this.get('pigeon').off(stationEvent, this, this._updateStationEvent);\n        }\n    },\n\n    /**\n     * The exact pigeon event name the station listener was subscribed with, retained so willDestroy\n     * can remove that same listener. Null until `user.id` resolves and the subscription is made.\n     */\n    _stationEvent: null,\n\n    registerCPTopics: observer('user.id', function () {\n        const id = this.get('user.id');\n        const pigeon = this.pigeon;\n        let topics = [];\n        if (id && !this.registeredTopics) {\n            this.set('registeredTopics', true);\n            topics = [\n                'station',\n                'conversations',\n                'voicemail.messages',\n                'userrecordings',\n                'fax.documents',\n                'evaluations'\n            ];\n\n            const stationEvent = `v2.users.${id}.station`;\n            this.set('_stationEvent', stationEvent);\n            this.pigeon.on(stationEvent, this, this._updateStationEvent); // in mixins/phone-service/station\n            return topics.map(t => `v2.users.${id}.${t}`).forEach(t => pigeon.registerPriorityTopic(t));\n        }\n    }),\n\n    updateActiveConversationEntry(conversation) {\n        let type = this.getInteractionTypeFromCP(conversation);\n\n        if (!type.isCall || (type.isCall && type.isCallback) || type.isFax) {\n            return;\n        }\n\n        let conversationData;\n        let currentCallState;\n        const conversationDetails = this.conversations.findBy('id', conversation.id);\n        if (conversationDetails) {\n            const participantOnExistingConversation = conversationDetails\n                .get('participants')\n                .findBy('userId', this.personGuid);\n            if (!participantOnExistingConversation) {\n                Logger.error(\n                    `updateActiveConversationEntry: Expected to find person ${this.personGuid} on conversation ${conversation.id} but person was not found`\n                );\n            } else {\n                const participantCall = this.getParticipantCall(participantOnExistingConversation);\n                currentCallState = participantCall.state ? participantCall.state.toLowerCase() : null;\n            }\n        }\n\n        const participants = get(conversation, 'participants');\n        const isAgentCall = participants.any(party => (party.purpose ? party.purpose === 'agent' : false));\n\n        const participantsForUser = participants.filterBy('userId', this.personGuid);\n        let participantOnUpdatedConversation;\n\n        if (participantsForUser.length) {\n            participantOnUpdatedConversation = participantsForUser[participantsForUser.length - 1];\n        }\n        const updatedParticipantCall = this.getParticipantCall(participantOnUpdatedConversation);\n        const participantOnCall = updatedParticipantCall\n            ? ['alerting', 'contacting', 'dialing', 'connected'].indexOf(updatedParticipantCall.state.toLowerCase()) >\n              -1\n            : false;\n        const participantIsNotVoicemail = participantOnUpdatedConversation.purpose\n            ? participantOnUpdatedConversation.purpose.toLowerCase() !== 'voicemail'\n            : false;\n        const isActiveOnCall = updatedParticipantCall && participantOnCall && participantIsNotVoicemail;\n        const newCallState = updatedParticipantCall.state.toLowerCase();\n\n        if (isAgentCall && currentCallState !== 'connected' && newCallState === 'alerting') {\n            set(conversation, 'acceptedByClient', false);\n        }\n\n        if (\n            currentCallState &&\n            participantIsNotVoicemail &&\n            currentCallState !== 'connected' &&\n            newCallState === 'connected'\n        ) {\n            this.headset.answerCall(conversation.id, this.get('connectedConversations.length') >= 1);\n        }\n\n        if (currentCallState && currentCallState !== 'disconnected' && newCallState === 'disconnected') {\n            this.headset.endCall(conversation.id, this.get('connectedConversations.length') > 1);\n        }\n\n        const onCall = conversationDetails ? conversationDetails.get('onCall') : false;\n        if (isAgentCall || isActiveOnCall || onCall || newCallState === 'terminated') {\n            conversationData = this.updateConversationArray(conversation, conversationDetails, isAgentCall);\n        }\n        if (conversationData || newCallState === 'terminated') {\n            this.notifyPropertyChange('conversations');\n            this.notifyPropertyChange('recentDisconnectedAgentCalls');\n            this._logConversationDetails(conversationData);\n        }\n\n        conversationData = this._updateModelForConsult(conversationData, conversation);\n\n        return conversationData;\n    },\n\n    //TODO | SERVOPS-11175 | change this if/when service updates to include consultParticipant status for participants after customer departs\n    _updateModelForConsult(conversationData, conversation) {\n        if (conversation && conversation.participants) {\n            const consultParticipantId = conversation.participants\n                .filterBy('purpose', 'customer')\n                .mapBy('consultParticipantId')\n                .pop();\n\n            // the consultParticipantId needs to be retained even when the call is no longer\n            // on consult because of use cases identified in SERVOPS-11175\n            if (consultParticipantId) {\n                conversationData.consultParticipantId = consultParticipantId;\n            }\n        }\n        return conversationData;\n    }\n});\n","import { inject as service } from '@ember/service';\nimport { resolve } from 'rsvp';\nimport { readOnly } from '@ember/object/computed';\nimport Mixin from '@ember/object/mixin';\nimport { observer, get, set } from '@ember/object';\nimport { task, timeout } from 'ember-concurrency';\nimport { EVENTS } from 'web-directory/utils/hosted-context';\nimport moment from 'web-directory/utils/dates';\nimport _ from 'lodash';\n\nconst IGNORED_ERRORS = ['error.ininedgecontrol.session.inactive'];\nconst WEBRTC_DTLS_DISCONNECT_REASON = 'dtlsPeerCloseNotify';\n\nexport default Mixin.create({\n    session: service(),\n    webrtcSdkService: service('webrtcSdk'),\n\n    useMaxInboundVoiceCalls: readOnly('session.features.PURE-5128_MaxInboundVoiceCalls'),\n\n    displayIncomingNotification(conversation) {\n        let isHosted, applicationHasFocus;\n        const hosted = this.get('application.hostedContext');\n        if (hosted) {\n            isHosted = hosted.isHosted();\n            applicationHasFocus = hosted.applicationHasFocus();\n        }\n        if (this.get('application.browserHidden') || (isHosted && !applicationHasFocus)) {\n            const title = this.intl.safestring('notification.titles.incomingCall').toString();\n            const message = this.intl.safestring('notification.purecloud.incomingCall').toString();\n            const notificationOptions = {\n                fallbackToInBrowser: false,\n                hideAfter: 8,\n                tag: EVENTS.INCOMING_CALL,\n                meta: {\n                    conversation: conversation\n                },\n                clickHandler: (conversation, action) => {\n                    if (conversation && action) {\n                        if (_.includes(action, 'ignore')) {\n                            return this.toVoicemail(conversation);\n                        } else if (_.includes(action, 'answer')) {\n                            return this.answer(conversation);\n                        }\n                    }\n                }\n            };\n\n            notificationOptions.notificationOutputDeviceId = this.getNotificationOutputDeviceId();\n            this.notification.info(title, message, notificationOptions);\n        }\n    },\n\n    // handle errors on users session\n    handleParticipantCallError: observer(\n        'userCallSessionsWithErrors.@each.calls',\n        'userCallSessionsWithErrors.calls.@each.disconnectedTime',\n        'personGuid',\n        'webrtcSdkService.useSdk',\n        function () {\n            // we will use the sdk the determine and parse call errors\n            if (this.get('webrtcSdkService.useSdk')) {\n                return;\n            }\n\n            const callsWithErrors = this.callsWithErrors;\n            const userCallSessionsWithErrors = this.userCallSessionsWithErrors;\n            // are there any errors on any of the user's sessions?\n            _.each(userCallSessionsWithErrors, session => {\n                const calls = get(session, 'calls');\n                _.each(calls, call => {\n                    const endMoment = moment(call.disconnectedTime);\n                    const isRecent = moment().diff(endMoment) < 5000 ? true : false;\n                    const hasThrownError = get(call, '_hasThrownError');\n                    if (isRecent && !hasThrownError) {\n                        callsWithErrors.pushObject({ conversationId: session.id, call: call });\n\n                        // TODO: We should not be getting calls without error info here PCDWEBK-3674\n                        if (call.errorInfo && !_.includes(IGNORED_ERRORS, call.errorInfo.code)) {\n                            set(call, '_hasThrownError', true);\n                            this.showErrorNotification(call.errorInfo);\n                        }\n                    }\n                });\n            });\n\n            if ((this._testIsStationWebrtc || this.get('station.isWebrtc')) && callsWithErrors.length > 0) {\n                _.each(callsWithErrors, call => {\n                    const reason = get(call, 'call.disconnectReasons.firstObject');\n                    const endMoment = moment(call.disconnectedTime);\n                    const isRecent = moment().diff(endMoment) < 5000 ? true : false;\n                    if (reason && isRecent && get(reason, 'type') === 'SIP' && !get(call, 'call._hasThrownError')) {\n                        set(call, 'call._hasThrownError', true);\n                        this._throttledShowSipError.perform(reason);\n                    }\n                });\n            }\n        }\n    ),\n\n    _throttledShowSipError: task(function* (reason) {\n        yield timeout(1000);\n        this.showSipError(reason);\n    }).restartable(),\n\n    showSipError(response) {\n        const title = this.intl.safestring('notification.titles.callError').toString();\n        const prefix = this.get('application.urlprefix');\n        let messageText = this.intl.t('purecloud.error.sipError');\n        messageText = `${messageText} ${response.code} ${response.phrase}`;\n        this.notification.error(title, messageText, {\n            tag: 'call-error',\n            icon: `${prefix}assets/images/icons/png/close-circled.png`,\n            hideAfter: 5\n        });\n    },\n\n    showPersistentConnectionStateNotification() {\n        const title = this.get('intl').safestring('notification.titles.callError').toString();\n        const prefix = this.get('application.urlprefix');\n        const message = this.get('intl').t('purecloud.error.persistentConnectionFailure').toString();\n        return this.get('notification').error(title, message, {\n            tag: 'call-error',\n            icon: prefix + 'assets/images/icons/png/close-circled.png',\n            hideAfter: 5\n        });\n    },\n\n    translateServerErrors(response) {\n        const { message, messageParams, messageWithParams, code } = response;\n        const intl = this.intl;\n        switch (code) {\n            case 'providerapi.error.no.station.for.edge':\n            case 'providerapi.error.station.no.active.edge': {\n                return this.fetchStation(messageParams.stationId).then(response => {\n                    return messageWithParams.replace('{stationId}', `'${response.get('name')}'`);\n                });\n            }\n            case 'error.ininedgecontrol.connection.station.notReached': {\n                let newCode = code + '.physical';\n\n                if (this.get('station.isWebrtc')) {\n                    newCode = code + '.webrtc';\n                }\n\n                return resolve(intl.t(newCode));\n            }\n            default: {\n                if (code && intl.exists(code)) {\n                    return resolve(intl.t(code));\n                }\n                if (message) {\n                    const webrtcDisconnectKey = this._getWebrtcDisconnectTranslationKey(message);\n                    if (webrtcDisconnectKey) {\n                        return resolve(intl.t(webrtcDisconnectKey, { reason: WEBRTC_DTLS_DISCONNECT_REASON }));\n                    }\n                    return resolve(message);\n                }\n                return code;\n            }\n        }\n    },\n\n    _getWebrtcDisconnectTranslationKey(message) {\n        if (\n            typeof message === 'string' &&\n            message.toLowerCase().includes(WEBRTC_DTLS_DISCONNECT_REASON.toLowerCase())\n        ) {\n            return 'purecloud.error.webrtcEndpointDisconnect';\n        }\n        return null;\n    },\n\n    showErrorNotification(response, err) {\n        if (!response) {\n            if (!err) {\n                console.error(new Error('Cannot show error notification with no error information'));\n                return;\n            }\n            response = { message: err.message };\n        }\n        // GAUI-253: when PURE-5128_MaxInboundVoiceCalls enabled, ignore this error message\n        // this will be an expected error depending on the Admin configuration for utilization\n        if (\n            response.code &&\n            response.code === 'error.ininedgecontrol.connection.station.utilizationExceeded' &&\n            this.useMaxInboundVoiceCalls\n        ) {\n            console.debug('<phone-service/mixin/notifications> utilizationExceeded error caught and ignored!');\n            return;\n        }\n        const title = this.intl.safestring('notification.titles.callError').toString();\n        const prefix = this.get('application.urlprefix');\n        let messageText = this.intl.t('purecloud.error.dialpad.call');\n        messageText = this.translateServerErrors(response, err);\n        return messageText.then(text => {\n            return this.notification.error(title, text, {\n                tag: 'call-error',\n                icon: prefix + 'assets/images/icons/png/close-circled.png',\n                hideAfter: 5\n            });\n        });\n    },\n    showFeedbackErrorNotification(message) {\n        const title = this.intl.safestring('notification.titles.callError').toString();\n        message = '' + message;\n        return this.notification.error(title, message, {\n            target: this.applicationController,\n            tag: 'activeCall',\n            hideAfter: false,\n            actionHandlers: {\n                reportError: this.intl.safestring('components.navMenu.feedback.contactSupport').toString()\n            }\n        });\n    },\n\n    showNoStationSelected(conversation) {\n        console.error('Cannot answer conversation because there is no active station for the current user', {\n            conversationId: conversation.get('id')\n        });\n        const title = this.intl.safestring('notification.titles.callError').toString();\n        const message = this.intl.t('purecloud.station.noStationSelected').toString();\n        this.notification.error(title, message, {\n            tag: 'call-error'\n        });\n    },\n\n    checkForNonACD(conversation) {\n        let isAcdCall = this.isActiveCallACD;\n        if (conversation) {\n            isAcdCall = conversation.get('isAgentCall');\n        }\n        if (!isAcdCall) {\n            const message = this.intl.safestring('notification.purecloud.nonACDOnQueue').toString();\n            return this.notification.info(null, message, {\n                hideAfter: 5\n            });\n        }\n    }\n});\n","import { inject as service } from '@ember/service';\nimport { bool, not } from '@ember/object/computed';\nimport Mixin from '@ember/object/mixin';\nimport { computed, get, set } from '@ember/object';\nimport RSVP, { resolve } from 'rsvp';\nimport Ember from 'ember';\nimport webrtcConversationTypes from 'web-directory/utils/webrtc-conversation-types';\nimport { task, timeout } from 'ember-concurrency';\n\nexport default Mixin.create({\n    store: service(),\n    station: null,\n    needStation: false,\n    updateStationEventTimeout: 500,\n\n    freeSeatPreference: bool('session.org.orgPreferences.freeSeating'),\n\n    noStationSelected: not('station'),\n\n    defaultStation: computed('user.station.defaultStation', function () {\n        const user = this.user;\n        if (user && get(user, 'station.defaultStation')) {\n            return this.get('user.station.defaultStation');\n        }\n        return null;\n    }),\n\n    associatedStationNotDefault: computed('defaultStation', 'station', function () {\n        if (!(this.defaultStation || this.station)) {\n            return false;\n        }\n        return this.get('defaultStation.id') !== this.get('station.id');\n    }),\n\n    defaultStationNamePromise: computed('defaultStation', function () {\n        if (!this.defaultStation) {\n            return RSVP.resolve(null);\n        }\n\n        return this.store.find('station', this.get('defaultStation.id')).then(station => station.get('name'));\n    }),\n\n    // TODO: Remove this when API-2018 is ready because the calls to pub api for getting the user\n    // and setting the station will include station name and type.\n    fetchStation(selectedStation) {\n        const stationId = this.guidFromUri(selectedStation || this.get('user.station.lastAssociatedStation.id'));\n        return this.store\n            .find('station', stationId)\n            .then(station => {\n                this.set('station', station);\n                return station;\n            })\n            .catch(function (err) {\n                console.error('Failed to fetch station:', {\n                    error: err,\n                    stationId\n                });\n            });\n    },\n\n    disassociateStation() {\n        let url = this.applicationService.pcV2Uri(`api/v2/users/stations/me/associatedstation`);\n        return this.ajax.delete(url);\n    },\n\n    disconnectPersistentConnection() {\n        if (this.get('webrtcSdkService.useSdk')) {\n            return this.webrtcSdkService.endAllSoftphoneSessions();\n        }\n\n        const webrtc = this.webrtc;\n        const conversations = webrtc\n            .get('conversations')\n            .filterBy('conversationType', webrtcConversationTypes.SOFTPHONE)\n            .map(c => ({ conversationId: c.get('conversationId'), jid: c.get('jid') }));\n        if (conversations.length !== 1) {\n            console.warn('Disconnecting persistent connection with active conversations', {\n                conversations: conversations.map(c => get(c, 'id'))\n            });\n        } else {\n            console.info('disconnecting persistent connection', conversations[0]);\n        }\n        conversations.forEach(c => webrtc.endConversation(c));\n    },\n\n    chooseDefault() {\n        const user = this.user;\n        let defaultStation = get(user, 'station.defaultStation');\n        if (!defaultStation) {\n            defaultStation = get(user, 'station.associatedStation');\n        }\n        this.chooseStation(get(defaultStation, 'id'));\n        this.set('defaultStation', defaultStation);\n        set(user, 'station.defaultStation', defaultStation);\n    },\n\n    doLoginAssociationLogic() {\n        const isFreeSeatOrg = this.freeSeatPreference;\n        let promise;\n\n        if (isFreeSeatOrg) {\n            promise = this._loginAssociationFreeSeat();\n        } else {\n            promise = this._loginAssociation();\n        }\n\n        return promise;\n    },\n\n    doLogoutAssociationLogic() {\n        return resolve().then(() => {\n            const isFreeSeatOrg = this.freeSeatPreference && !this.get('session.features.never-free-seating');\n\n            // Non-free-seating: keep WebRTC users associated to their default phone across logout,\n            // but disassociate any other station type so it can be reclaimed.\n            if (!isFreeSeatOrg) {\n                const station = this.station;\n                const defaultStation = this.defaultStation;\n                const isAssociatedToDefault =\n                    station && defaultStation && this.get('station.id') === get(defaultStation, 'id');\n\n                if (this.get('station.isWebrtc') && isAssociatedToDefault) {\n                    return;\n                }\n            }\n\n            this.logger.info('Disassociating station on logout.', { isFreeSeatOrg });\n            return this.disassociateStation();\n        });\n    },\n\n    _loginAssociationFreeSeat() {\n        const user = this.user;\n        const associatedStation = get(user, 'station.associatedStation.id');\n        if (associatedStation) {\n            // user has an associated station, just fetch the station data\n            return this.fetchStation(associatedStation);\n        }\n        this.set('station', null);\n        this.logger.debug('Could not associate station on login because user does not have an associated Station');\n        return RSVP.resolve();\n    },\n\n    _loginAssociation() {\n        const user = this.user;\n        const associatedStation = get(user, 'station.associatedStation.id');\n        if (associatedStation) {\n            // user has an associated station, just fetch the station data\n            return this.fetchStation(associatedStation);\n        }\n        const lastAssociatedStation = get(user, 'station.lastAssociatedStation');\n        if (lastAssociatedStation) {\n            // user has no associated station, so we will pick the last station they used as long as it is not associated to another user\n            const lastAssociatedUser = get(lastAssociatedStation, 'associatedUser');\n            if (!lastAssociatedUser) {\n                return this.chooseStation(get(lastAssociatedStation, 'id'));\n            }\n        }\n        const defaultStation = get(user, 'station.defaultStation');\n        if (defaultStation) {\n            // user has no associated station or last used station, so pick their default as long as it is not associated to another user\n            const defaultStationUser = get(defaultStation, 'associatedUser');\n            if (!defaultStationUser) {\n                return this.chooseStation(get(defaultStation, 'id'));\n            }\n        }\n        const userStationSettings = get(user, 'station');\n        this.set('station', null);\n        this.logger.info('User did not have any stations to pick on login', { userStationSettings });\n        return RSVP.resolve();\n    },\n\n    chooseStation(selectedStation) {\n        let station = selectedStation.split('/').pop();\n\n        if (!station) {\n            return resolve();\n        }\n        let uri = this.application.pcUri(['api/v2/users/stations/me/associatedstation', station]);\n        const successHandler = data => {\n            this.fetchStation(station);\n            return data;\n        };\n        const errorHandler = jqXHR => {\n            Ember.onerror(jqXHR);\n            let message = get(jqXHR, 'responseJSON.message') || '';\n            message = this.intl.safestring('notification.purecloud.phoneFail').toString() + message;\n            return this.notification.info(null, message, {\n                hideAfter: 5\n            });\n        };\n        return this.ajax.put(uri).then(successHandler, errorHandler);\n    },\n\n    _updateStationEvent(eventBody, json) {\n        this._debouncedUpdateStationEvent.cancelAll();\n        this._debouncedUpdateStationEvent.perform(eventBody, json);\n    },\n\n    _debouncedUpdateStationEvent: task(function* (eventBody, json) {\n        yield timeout(this.updateStationEventTimeout);\n        this._handleUpdateStation(eventBody, json);\n    }),\n\n    _handleUpdateStation(eventBody, json) {\n        const metadata = get(json, 'metadata');\n        if (!metadata) {\n            return;\n        }\n        const stationId = this.station ? this.get('station.id') : null;\n        const newStation = get(eventBody, 'associatedStation');\n        const newStationId = newStation && newStation.id ? newStation.id : null;\n        const currentStationIsNewStation = !!(stationId && newStationId && stationId === newStationId);\n        const action = get(metadata, 'action') ? metadata.action.toLowerCase() : false;\n\n        if (action === 'associated' && currentStationIsNewStation) {\n            return;\n        } else if (action === 'disassociated') {\n            this.set('station', null);\n        } else if (action === 'associated') {\n            this.fetchStation(eventBody.stationUri || newStationId);\n        }\n    },\n\n    _testIsStationWebrtc: false // HACK: for testing\n});\n","import $ from 'jquery';\nimport { assert } from '@ember/debug';\nimport Mixin from '@ember/object/mixin';\n\nexport default Mixin.create({\n    addIndicatorForPromise: function (promise, target) {\n        assert('You must specify a valid target selector', target && typeof target === 'string');\n\n        if (promise && promise.then) {\n            var view = $('<div class=\"loading-indicator\"><i class=\"pc-moon pc-loading pc-spin\"></i></div>');\n            $(target).append(view);\n\n            promise.then(function () {\n                view.remove();\n            });\n        }\n    }\n});\n","import { inject as service } from '@ember/service';\nimport Evented from '@ember/object/evented';\nimport Mixin from '@ember/object/mixin';\nimport RSVP, { reject } from 'rsvp';\nimport { compareJids, isAcdJid } from 'web-directory/utils/jid-helpers';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nexport default Mixin.create(Evented, LoggerMixin, {\n    chat: service(),\n    favicon: service(),\n    application: service(),\n    session: service(),\n    permissions: service(),\n    ajax: service(),\n    intl: service(),\n\n    init() {\n        this._super(arguments);\n    },\n\n    getAllBadgeCounts(currentPageNumber = 1, isRetry = false) {\n        Object.keys(this.get('chat.rooms')).forEach(jid => {\n            const room = this.get('chat.rooms')[jid];\n\n            if (room.isOneToOneRoom()) {\n                room.set('unseen', 0);\n            }\n            room.set('mentions', 0);\n        });\n\n        const url = this.application.pcV2Uri(`api/v2/badges/chats?pageSize=100&pageNumber=${currentPageNumber}`);\n        return this.ajax.ajaxGet(url).then(\n            ({ pageNumber, pageCount, entities = [] }) => {\n                entities.forEach(badgeCount => this.handleBadgeCountUpdate(badgeCount));\n\n                if (pageNumber < pageCount) {\n                    return this.getAllBadgeCounts(currentPageNumber + 1);\n                }\n            },\n            err => {\n                if (!isRetry) {\n                    return this.getAllBadgeCounts(currentPageNumber, true);\n                }\n\n                return reject(err);\n            }\n        );\n    },\n\n    handleBadgeCountUpdate(badgeCount) {\n        const jid = badgeCount.entity.jabberId || badgeCount.entity.jid;\n        this.chat.getChatRoom(jid).then(room => {\n            if (badgeCount.unreadCount > 0 && this.chat.isRoomVisible(room.get('jid'))) {\n                return this.clearRoomNotificationCounts(room);\n            }\n\n            if (room.isOneToOneRoom()) {\n                room.set('unseen', badgeCount.unreadCount);\n            } else {\n                room.set('mentions', badgeCount.unreadCount);\n            }\n\n            this.updateBadges();\n        });\n    },\n\n    clearRoomNotificationCounts(room) {\n        if (!room.get('isSupervisorRoom')) {\n            return;\n        }\n        room.set('unseen', 0);\n        return RSVP.resolve();\n    },\n\n    incrementUnreadGroupMessage(message, room) {\n        const userJid = message.get('chatUser.jid');\n        const roomJid = room.get('jid');\n        if (\n            !compareJids(userJid, this.get('session.person.jid')) &&\n            !this.chat.isRoomVisible(roomJid) &&\n            !isAcdJid(roomJid) &&\n            message.get('unread') &&\n            !message.get('corrects') &&\n            (!room.get('muted') || message.get('hasPersonalMention'))\n        ) {\n            const roster = room.get('roster');\n            const isSupervisorRoom = room.get('isSupervisorRoom');\n\n            room.incrementProperty('unseen');\n\n            if (!isSupervisorRoom) {\n                if (roster) {\n                    roster.incrementProperty('unseenGroupMessages');\n                }\n            }\n\n            this.updateBadges();\n        }\n    },\n\n    updateBadges() {\n        if (!this.get('permissions.canViewBusinessChat')) {\n            return;\n        }\n        const hostedContext = this.get('application.hostedContext');\n        const unseen = this.unseenCount;\n        const mentions = this.mentionsCount;\n\n        let text = 0;\n\n        if (mentions > 0) {\n            hostedContext.setUnreadMessageCount(mentions);\n            if (mentions > 9) {\n                text = this.intl.t('chat.faviconLots');\n            } else {\n                text = this.intl.t('chat.faviconSome', { count: mentions });\n            }\n        } else if (unseen > 0) {\n            hostedContext.setUnreadMessageCount(-1);\n            text = ' ';\n        } else {\n            hostedContext.setUnreadMessageCount(0);\n        }\n\n        this.favicon.setFaviconBubbleText(text);\n    }\n});\n","import Mixin from '@ember/object/mixin';\nimport _ from 'lodash';\n\nconst presenceToRadixMapping = {\n    available: 1,\n    busy: 2,\n    away: 3,\n    idle: 3,\n    offline: 4,\n    on_queue: 5,\n    out_of_office: 6\n};\n\nconst radixMapping = function (user) {\n    if (user) {\n        return presenceToRadixMapping[user.get('presence')];\n    } else {\n        return null;\n    }\n};\n\nconst userName = function (user) {\n    return user.get('name') || '';\n};\n\nconst mapUserToSortable = function (user) {\n    return `${radixMapping(user)}${userName(user)}`;\n};\n\nconst mapRoomToSortable = function (room) {\n    let radix = radixMapping(room.get('oneToOneTarget'));\n    let name = room.get('subject');\n    return `${radix}${name}`;\n};\n\nconst SortChatUsersMixin = Mixin.create({\n    sortChatUsers(usersList) {\n        return _.sortBy(usersList, mapUserToSortable);\n    },\n\n    sortOneToOneRooms(rooms) {\n        return _.sortBy(rooms, mapRoomToSortable);\n    }\n});\n\nexport default SortChatUsersMixin;\n","import Mixin from '@ember/object/mixin';\n\nexport default Mixin.create({\n    beforeModel: function () {\n        // Skip call to super which is the authenticated-route-mixin\n        return null;\n    }\n});\n","import { not } from '@ember/object/computed';\nimport { scheduleOnce, run, debounce } from '@ember/runloop';\nimport Mixin from '@ember/object/mixin';\nimport $ from 'jquery';\nimport { computed } from '@ember/object';\n\nconst REFRESH_RATE = 200;\n\nfunction getScrollParent(comp) {\n    if (!comp || !comp.$) {\n        return null;\n    }\n    try {\n        return [...comp.$().parents()].find(el => {\n            const $el = $(el);\n            return /(auto|scroll)/.test($el.css('overflow') + $el.css('overflow-y') + $el.css('overflow-x'));\n        });\n    } catch (err) {\n        return null;\n    }\n}\n\nexport default Mixin.create({\n    enableViewport: true,\n\n    enteredViewport: computed('boundingClientRect', 'windowHeight', function () {\n        const rect = this.boundingClientRect;\n        const windowHeight = this.windowHeight;\n        const windowWidth = this.windowWidth;\n        if (!rect) {\n            return false;\n        }\n\n        return rect.top >= 0 && rect.left >= 0 && rect.bottom <= windowHeight && rect.right <= windowWidth;\n    }),\n\n    exitedViewport: not('enteredViewport'),\n\n    /**\n     * Implementers of these hooks are responsible for setting up their own run loop for\n     * scheduling, since this mixin is using request animation frame to handle events.\n     **/\n    didEnterViewport() {},\n    didExitViewport() {},\n\n    didInsertElement() {\n        this._super(...arguments);\n\n        if (this.enableViewport) {\n            scheduleOnce('afterRender', this, '_setup');\n        }\n    },\n\n    willDestroyElement() {\n        this._super(...arguments);\n        this._teardown();\n    },\n\n    _setup() {\n        run(() => {\n            if (this.isDestroying || this.isDestroyed) {\n                return;\n            }\n\n            this._bindEvents();\n            this._updateBoundingClientRect();\n            this.set('windowHeight', window.innerHeight || document.documentElement.clientHeight);\n            this.set('windowWidth', window.innerWidth || document.documentElement.clientWidth);\n        });\n    },\n\n    _teardown() {\n        // Always remove the window resize listener regardless of scroll parent\n        // state. If _bindEvents returned early (no scroll parent), the resize\n        // listener was never attached, but off() is a no-op in that case so\n        // this is safe. Without this, the listener fires on destroyed components\n        // causing \"Cannot modify dependent keys after destroyed\" errors.\n        $(window).off(`.${this.elementId}`);\n\n        if (!this.$()) {\n            return;\n        }\n\n        const scrollParent = getScrollParent(this);\n        if (!scrollParent) {\n            return;\n        }\n\n        const scrollParentRef = $(scrollParent);\n        if (scrollParentRef) {\n            scrollParentRef.off(`.${this.elementId}`);\n        }\n    },\n\n    _bindEvents() {\n        if (!this.$()) {\n            return;\n        }\n\n        const scrollParent = getScrollParent(this);\n        if (!scrollParent) {\n            return;\n        }\n\n        const $scrollParent = $(scrollParent);\n        const resizeHandler = this.resizeHandler.bind(this);\n        $scrollParent.on(`scroll.${this.elementId}`, this.scrollHandler.bind(this));\n        $(window).on(`resize.${this.elementId}`, resizeHandler);\n    },\n\n    _updateBoundingClientRect() {\n        if (this.isDestroyed || this.isDestroying) {\n            return;\n        }\n        const el = this.element;\n        if (el && el.getBoundingClientRect) {\n            this.set('boundingClientRect', el.getBoundingClientRect());\n        }\n    },\n\n    _updateWindowSize() {\n        if (this.isDestroyed || this.isDestroying) {\n            return;\n        }\n        this.set('windowHeight', window.innerHeight || document.documentElement.clientHeight);\n        this.set('windowWidth', window.innerWidth || document.documentElement.clientWidth);\n    },\n\n    scrollHandler() {\n        debounce(this, '_scrollHandler', REFRESH_RATE, false);\n    },\n\n    _scrollHandler() {\n        const run = window.requestAnimationFrame || run;\n        if (window.requestAnimationFrame) {\n            window.requestAnimationFrame(this._updateBoundingClientRect.bind(this));\n        } else {\n            debounce(this, '_updateBoundingClientRect', 100);\n        }\n\n        if (this.enteredViewport) {\n            run(this.didEnterViewport.bind(this));\n        } else {\n            run(this.didExitViewport.bind(this));\n        }\n    },\n\n    resizeHandler() {\n        debounce(this, '_resizeHandler', REFRESH_RATE, false);\n    },\n\n    _resizeHandler() {\n        const run = window.requestAnimationFrame || run;\n        if (window.requestAnimationFrame) {\n            window.requestAnimationFrame(this._updateWindowSize.bind(this));\n        } else {\n            debounce(this, '_updateWindowSize', 100);\n        }\n\n        if (this.enteredViewport) {\n            run(this.didEnterViewport.bind(this));\n        } else {\n            run(this.didExitViewport.bind(this));\n        }\n    }\n});\n","import { inject as service } from '@ember/service';\nimport { reads, or, and } from '@ember/object/computed';\nimport { scheduleOnce } from '@ember/runloop';\nimport Mixin from '@ember/object/mixin';\nimport { computed } from '@ember/object';\nimport BrowserUtils from 'web-directory/utils/browser';\n\nexport default Mixin.create({\n    interaction: reads('webrtc.interaction'),\n    webrtc: service(),\n    streaming: service(),\n    intl: reads('webrtc.intl'),\n    phone: service(),\n    mediaProviders: service(),\n    sessionService: service('session'),\n\n    videoTooltipTitle: computed('videoTooltipKey', 'haveNonPurecloudMediaProvider', function () {\n        let key = this.videoTooltipKey;\n        if (this.haveNonPurecloudMediaProvider) {\n            key = 'ewc.open';\n        }\n\n        const params = {};\n\n        if (key === 'ewc.userOffline' || key === 'ewc.userBusy') {\n            params.name = this.get('webrtcTarget.oneToOneTarget.name');\n        }\n\n        if (this._fixTooltips) {\n            scheduleOnce('afterRender', this, this._fixTooltips);\n        }\n        return this.intl.t(key, params);\n    }),\n\n    videoTooltipTitleSr: computed('videoTooltipTitle', 'videoTooltipeKey', 'activeRoom.videoPeers', function () {\n        let key = this.videoTooltipKey;\n\n        const numberOfParticipants = this.get('activeRoom.videoPeers');\n        if (key == 'ewc.open' && numberOfParticipants > 0) {\n            key = 'ewc.openSr';\n            return this.intl.t(key, { number: numberOfParticipants });\n        }\n\n        return this.videoTooltipTitle;\n    }),\n\n    oneToOneChat: computed('webrtcTarget.oneToOneTarget', function () {\n        const webrtcTarget = this.webrtcTarget;\n        return webrtcTarget && webrtcTarget.isOneToOneRoom();\n    }),\n\n    isFirefox: BrowserUtils.isFirefox,\n\n    webrtcTarget: or('activeRoom', 'entity.oneToOneRoom'),\n\n    webrtcPhoneWithIssues: computed(\n        'phone.station.{isWebrtc,webRtcRequireMediaHelper}',\n        'webrtc.webrtcAudioCallIssueKey',\n        function () {\n            return (\n                this.get('phone.station.isWebrtc') &&\n                this.get('webrtc.webrtcAudioCallIssueKey') &&\n                !this.get('phone.station.webRtcRequireMediaHelper')\n            );\n        }\n    ),\n\n    videoMediaProviders: computed('useMediaProviders', 'sessionService', 'mediaProviders.enabled', function () {\n        if (!this.useMediaProviders || !this.get('mediaProviders.enabled')) {\n            return [];\n        }\n\n        return this.mediaProviders.getVideoProviders(this.get('sessionService.user'), this.webrtcTarget);\n    }),\n\n    haveNonPurecloudMediaProvider: computed('videoMediaProviders.[]', function () {\n        return !!this.videoMediaProviders.find(provider => provider.get('id') !== 'purecloud');\n    }),\n\n    videoTooltipKey: computed(\n        'webrtc.{videoCallCapable,activeRoom.showingVideo,activeBridge,canConference,webrtcAudioCallIssueKey}',\n        'webrtcTarget.{showingVideo,videoRoomFull}',\n        'interaction.activeRealtimeInteractions.[]',\n        'isOneToOneOfflineOrBusy',\n        'isFirefox',\n        'mediaProviders.{enabled,usingVideoProvider}',\n        'useMediaProviders',\n        function () {\n            const openTooltip = 'ewc.open';\n            if (this.get('webrtc.webrtcAudioCallIssueKey')) {\n                return this.get('webrtc.webrtcAudioCallIssueKey');\n            }\n            if (!this.get('webrtc.videoCallCapable') && !this.useMediaProviders) {\n                return 'ewc.notCapable';\n            }\n            if (this.get('interaction.activeRealtimeInteractions.length')) {\n                return 'ewc.activeInteractions';\n            }\n            if (\n                this.get('webrtcTarget.showingVideo') ||\n                this.get('webrtc.activeRoom.showingVideo') ||\n                this.get('mediaProviders.usingVideoProvider')\n            ) {\n                if (this.get('webrtcTarget.jid') === this.get('webrtc.activeRoom.jid')) {\n                    return 'ewc.openActiveCall';\n                }\n                return 'ewc.anotherActiveCall';\n            }\n            if (this.get('webrtcTarget.videoRoomFull')) {\n                return 'ewc.atCapacity';\n            }\n            if (this.get('webrtcTarget.oneToOneTarget')) {\n                if (this.get('mediaProviders.enabled') && this.useMediaProviders) {\n                    return openTooltip;\n                }\n                if (!this.isOneToOneOfflineOrBusy) {\n                    return openTooltip;\n                }\n                if (this.get('webrtcTarget.oneToOneTarget.isOffline')) {\n                    return 'ewc.userOffline';\n                }\n                if (this.get('webrtcTarget.oneToOneTarget.isBusy')) {\n                    return 'ewc.userBusy';\n                }\n            }\n            if (!this.get('webrtc.canConference') && !this.useMediaProviders) {\n                return 'ewc.browserNotSupported';\n            }\n            return openTooltip;\n        }\n    ),\n\n    isOneToOneOfflineOrBusy: and('oneToOneChat', 'webrtcTarget', 'webrtcTarget.oneToOneTarget.isOfflineOrBusy'),\n\n    isVideoButtonEnabled: computed(\n        'videoTooltipKey',\n        'webrtc.webrtcAudioCallIssueKey',\n        'streaming.{connected,connectedV2}',\n        'haveNonPurecloudMediaProvider',\n        'useMediaProviders',\n        function () {\n            if (this.useMediaProviders && this.haveNonPurecloudMediaProvider) {\n                return true;\n            }\n\n            if (this.get('webrtc.webrtcAudioCallIssueKey')) {\n                return false;\n            }\n\n            const hawkIsAvailable = this.get('streaming.connectedV2');\n            const realtimeIsAvailable = this.get('streaming.connected');\n            if (!hawkIsAvailable && !realtimeIsAvailable) {\n                return false;\n            }\n\n            return this.videoTooltipKey === 'ewc.open' || this.videoTooltipKey === 'ewc.openActiveCall';\n        }\n    ),\n\n    videoButtonEnabled: computed('isVideoButtonEnabled', function () {\n        return this.isVideoButtonEnabled ? 'enabled' : 'disabled';\n    })\n});\n","import { inject as service } from '@ember/service';\nimport { A } from '@ember/array';\nimport Mixin from '@ember/object/mixin';\nimport EmberObject, { observer, computed, get } from '@ember/object';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nconst BANDWIDTH_LOSS_THRESHOLD = 15; // packet loss percentage\nconst BANDWIDTH_RTT_THRESHOLD = 200; // rtt is ms\nconst AUDIO_INPUT_LEVEL_THRESHOLD = 100;\n\nexport default Mixin.create(LoggerMixin, {\n    statReports: null,\n    trackStatsLastStart: null,\n    audioBitrateZero: false,\n    audioBitrateIndicatesMute: false,\n    wasMutedDuringLocalCheck: false,\n    talkingWhileMuted: false,\n    audioInputLevel: A([]),\n\n    webrtc: service(),\n\n    init() {\n        this._super(...arguments);\n        this.set('trackStatsLastStart', new Date());\n        this.set('statReports', {\n            [this.get('session.person.id')]: EmberObject.create({\n                name: this.get('session.person.name'),\n                lastTrackStatsStart: this.trackStatsLastStart,\n                lastTrackStatsEnd: this.trackStatsLastStart\n            })\n        });\n    },\n\n    hardwareAudioMute: computed(\n        'localParticipant.audioMuted',\n        'localParticipant.speaking',\n        'audioBitrateIndicatesMute',\n        'wasMutedDuringLocalCheck',\n        'wasMutedDuringLastCheck',\n        function () {\n            return (\n                !this.get('localParticipant.audioMuted') &&\n                this.audioBitrateIndicatesMute &&\n                !this.get('localParticipant.speaking') &&\n                !this.wasMutedDuringLocalCheck &&\n                !this.wasMutedDuringLastCheck\n            );\n        }\n    ),\n\n    // eslint-disable-next-line ember/no-observers\n    _logHardwareMute: observer('hardwareAudioMute', function () {\n        if (this.hardwareAudioMute) {\n            this.logger.info('webrtc audio bitrate indicates hardware mute for local participant.', {\n                remoteData: {\n                    conversationId: this.conversationId\n                }\n            });\n        }\n    }),\n\n    _sendLocalPerspective() {\n        const perspective = this.get(`statReports.${this.get('session.person.id')}`);\n\n        this.sendDirectlyToAll('stats', 'perspective', perspective);\n    },\n\n    _createNewPerspective(participantId) {\n        const participant = this.participants.findBy('person.id', participantId) || {};\n        return {\n            name: get(participant, 'person.name'),\n            trackStatsByTrackId: {}\n        };\n    },\n\n    _getLocalPerspectiveOfParticipant(participantId) {\n        let perspective = this.statReports[this.get('session.person.id')][participantId];\n\n        if (!perspective) {\n            perspective = this._createNewPerspective(participantId);\n            this.set(`statReports.${this.get('session.person.id')}.${participantId}`, perspective);\n        }\n\n        return perspective;\n    },\n\n    _checkLocalAudio(stats) {\n        if (this.isScreenRecording || this.isScreenShare) {\n            return;\n        }\n\n        const localAudio = stats.tracks.find(t => t.kind === 'audio');\n\n        if (!localAudio) {\n            return this.logger.info('_checkLocalAudio has no local audio tracks to check', {\n                remoteData: {\n                    conversationId: this.conversationId\n                }\n            });\n        }\n\n        const bitrate = localAudio.bitrate;\n\n        const audioInputLevel = localAudio.audioInputLevel;\n        const audioMuted = this.get('localParticipant.audioMuted');\n        if (audioInputLevel && audioMuted) {\n            this.audioInputLevel.addObject({\n                audioInputLevel\n            });\n            if (this.audioInputLevel.length > 2) {\n                const isPastMaxAudioInputLevelThreshold = this.audioInputLevel.filter(element => {\n                    return element.audioInputLevel > AUDIO_INPUT_LEVEL_THRESHOLD;\n                });\n                if (isPastMaxAudioInputLevelThreshold && isPastMaxAudioInputLevelThreshold.length > 2) {\n                    this.set('talkingWhileMuted', true);\n                }\n            }\n        } else {\n            this.set('audioInputLevel', A([]));\n            this.set('talkingWhileMuted', false);\n        }\n\n        if (bitrate === 0 && !this.audioBitrateZero) {\n            this.logger.warn('webrtc audio bitrate is zero which should never happen', {\n                remoteData: {\n                    conversationId: this.conversationId,\n                    kind: 'webrtcAudioBitrate'\n                }\n            });\n            if (!this.webrtc.isV2(this.room)) {\n                this.webrtc.showZeroAudioBitrateNotification();\n            }\n        }\n\n        this.setProperties({\n            audioBitrateZero: bitrate === 0,\n            audioBitrateIndicatesMute: bitrate === 10 || bitrate === 11, // normally muted is 10, but for some reason it's always 11 the next time someone leaves the call\n            wasMutedDuringLastCheck: this.wasMutedDuringLocalCheck,\n            wasMutedDuringLocalCheck: this.get('localParticipant.audioMuted')\n        });\n    },\n\n    _checkTracks(session, stats) {\n        if (!stats) {\n            return;\n        }\n\n        if (stats.tracks) {\n            this._checkLocalAudio(stats);\n        }\n\n        if (!stats.remoteTracks || !stats.remoteTracks.length) {\n            return;\n        }\n\n        const startTime = this.trackStatsLastStart;\n        const endTime = new Date();\n        this.set('trackStatsLastStart', endTime);\n\n        const participants = this.participants;\n        const participantsByVideoTrack = {};\n        participants.forEach(participant => {\n            participantsByVideoTrack[participant.get('videoTrack.id')] = participant;\n            if (participant.get('screenTrack')) {\n                participantsByVideoTrack[participant.get('screenTrack.id')] = participant;\n                if (participant.get('screenStream')) {\n                    const screenStream = participant.get('screenStream');\n                    const screenTracks = screenStream.getTracks();\n                    if (screenTracks.length === 1) {\n                        participantsByVideoTrack[screenTracks[0].id] = participant;\n                    }\n                }\n            }\n        });\n\n        const statsMap = {};\n        const participantsHavePositiveBitrate = {};\n\n        stats.remoteTracks.forEach(trackInfo => {\n            if (trackInfo.kind === 'audio') {\n                return; // no problem with 0 bitrate audio - it's just muted --- maybe later make sure it's supposed to be muted\n            }\n\n            const participant = participantsByVideoTrack[trackInfo.track];\n\n            if (!participant) {\n                statsMap.unknown = statsMap.unknown || {};\n                statsMap.unknown[trackInfo.track] = trackInfo;\n                this.logger.warn('Checking stream from unknown participant', {\n                    remoteData: {\n                        sid: session.sid,\n                        conversationId: this.conversationId,\n                        kind: 'webrtcTrackAnalysis',\n                        trackInfo\n                    }\n                });\n                return;\n            }\n\n            const id = participant.get('person.id') || participant.get('videoTrack.id');\n            statsMap[id] = statsMap[id] || {};\n            statsMap[id][trackInfo.track] = trackInfo;\n        });\n\n        Object.keys(statsMap).forEach(participantId => {\n            const trackInfos = statsMap[participantId];\n            if (participantId === 'unknown') {\n                return;\n            }\n\n            const participant = this.participants.find(p => {\n                return p.get('person.id') === participantId || p.get('videoTrack.id') === participantId;\n            });\n            let hasBitRate = false;\n            Object.keys(trackInfos).forEach(track => {\n                const trackInfo = trackInfos[track];\n                hasBitRate = hasBitRate || trackInfo.bitrate > 0;\n            });\n\n            if (hasBitRate) {\n                participant.set('zeroBitrateCount', 0);\n                participant.incrementProperty('positiveBitrateCount');\n                participantsHavePositiveBitrate[participantId] = true;\n                return;\n            }\n\n            // the rest of the analysis applies only to conferences, so return if this is a one to one call\n            if (this.isOneToOne) {\n                return;\n            }\n\n            const stream = participant.get('cameraStream');\n            const track = participant.get('videoTrack');\n\n            const logInfo = {\n                stream,\n                track,\n                person: {\n                    id: participantId\n                }\n            };\n\n            // this track has zero bitrate, but another one for the participant has a positive one.\n            if (participantsHavePositiveBitrate[participantId]) {\n                this.logger.warn('participant has both zero and non-zero bitrate tracks', {\n                    remoteData: {\n                        conversationId: this.conversationId,\n                        kind: 'webrtcTrackAnalysis',\n                        sid: session.sid,\n                        logInfo\n                    }\n                });\n                return;\n            }\n\n            participant.set('positiveBitrateCount', 0);\n\n            if (participant.get('inLastN') && !participant.get('videoMuted')) {\n                this.logger.warn('Not receiving bytes from participant who is in lastn', {\n                    remoteData: {\n                        conversationId: this.conversationId,\n                        kind: 'webrtcTrackAnalysis',\n                        sid: session.sid,\n                        logInfo\n                    }\n                });\n                participant.incrementProperty('zeroBitrateCount');\n            }\n        });\n\n        if (this.get('room.associatedInteraction')) {\n            this._checkBandwidthForInteraction(stats);\n        }\n\n        this._addLocalTrackStats(statsMap, startTime, endTime);\n        this._sendLocalPerspective();\n    },\n\n    _checkBandwidthForInteraction(stats) {\n        let hasBandwidthIssue;\n        stats.remoteTracks.forEach(track => {\n            hasBandwidthIssue =\n                hasBandwidthIssue ||\n                track.intervalLoss > BANDWIDTH_LOSS_THRESHOLD ||\n                (track.rtt && track.rtt > BANDWIDTH_RTT_THRESHOLD);\n        });\n\n        if (hasBandwidthIssue) {\n            if (!this.hasNotifiedBandwidthIssue) {\n                if (!this.webrtc.isV2(this.room)) {\n                    this.webrtc.showBandwidthNotification();\n                }\n                this.set('hasNotifiedBandwidthIssue', true);\n            }\n\n            this.logger.info('Bandwidth issue detected', {\n                remoteData: {\n                    remoteTracks: stats.remoteTracks,\n                    conversationId: this.conversationId\n                }\n            });\n        }\n    },\n\n    _addLocalTrackStats(statsMap, startTime, endTime) {\n        Object.keys(statsMap).forEach(participantId => {\n            const participantTrackInfos = statsMap[participantId];\n            const perspective = this._getLocalPerspectiveOfParticipant(participantId);\n            perspective.trackStatsByTrackId = participantTrackInfos;\n        });\n\n        const localPerspective = this.get(`statReports.${this.get('session.person.id')}`);\n        localPerspective.lastTrackStatsStart = startTime;\n        localPerspective.lastTrackStatsEnd = endTime;\n    },\n\n    mergeStatsPerspective(participant, perspective) {\n        const report = this.statReports;\n        report[participant.get('person.id')] = perspective;\n    }\n});\n","import { get } from '@ember/object';\nimport { A } from '@ember/array';\nimport { run } from '@ember/runloop';\nimport RSVP from 'rsvp';\nimport Mixin from '@ember/object/mixin';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport webrtcConversationTypes from '../utils/webrtc-conversation-types';\nimport { task, timeout } from 'ember-concurrency';\n\nexport default Mixin.create(LoggerMixin, {\n    _sessionInterruptedTimeout: 30000,\n\n    _handleConnectivityError() {\n        const conversationId = this.conversationId;\n        this.webrtc.endConversation({ jid: this.jid, conversationId, reason: 'failed-transport' });\n        if (this.isSoftphone && conversationId) {\n            this.get('webrtc.phone').endCallById(conversationId);\n        }\n\n        if (this.conversationType !== webrtcConversationTypes.ENGAGE_SCREEN_RECORDING) {\n            this.webrtc.connectivityError(this.conversationType);\n        }\n    },\n\n    _sendParticipantInfo() {\n        const msids = this.localMedia ? this.get('localMedia.localStreams').map(stream => stream.id) : [];\n        return this.sendDirectlyToAll('video', 'participantInfo', {\n            endpointId: this.webrtc.getEndpointId(),\n            msids\n        });\n    },\n\n    _onSessionConnectionTimeout(session) {\n        this.logger.warn('connection timed out waiting for session to activate', {\n            remoteData: {\n                conversationId: this.conversationId,\n                kind: 'webrtcSession'\n            }\n        });\n\n        if (this.isOneToOne || this.isConnectRetry || !this.isCollaborate) {\n            this._handleConnectivityError();\n        } else {\n            this.retrySessionThatFailedToConnect(session);\n        }\n    },\n\n    _removeParticipant: task(function* (participant, participants) {\n        if (this.usePcConversationModelParticipants) {\n            return;\n        }\n        yield timeout(1000);\n        if (!participant.get('cameraStream') && !participant.get('screenStream')) {\n            participants.removeObject(participant);\n\n            this._updateMajor();\n        }\n    }),\n\n    _connectionTimeout: task(function* (session) {\n        yield timeout(10000);\n        this._onSessionConnectionTimeout(session);\n    }),\n\n    _endOfCandidates: task(function* (session) {\n        const candidateBuffer = session.candidateBuffer || session.pc._candidateBuffer;\n\n        if (!candidateBuffer.find(c => c.type === 'relay')) {\n            yield timeout(10000);\n            if (session.connectionState !== 'connected' && !candidateBuffer.find(c => c.type === 'relay')) {\n                // dont handle this here\n                this.logger.warn('No relay ice candidates', {\n                    remoteData: {\n                        conversationId: this.conversationId,\n                        kind: 'webrtcSession',\n                        iceServers: this.iceServers\n                    },\n                    candidates: candidateBuffer\n                });\n            }\n        }\n    }),\n\n    _sessionInterrupted: task(function* (session, interrupted) {\n        // only log the the message if we are now interrupted or not longer interrupted\n        if (!interrupted && !session.wasInterrupted) {\n            return;\n        }\n        this.logger.info('session interrupted change', {\n            remoteData: {\n                kind: 'webrtcSession',\n                conversationId: this.conversationId,\n                conversationType: this.conversationType,\n                sid: session.sid,\n                interrupted\n            }\n        });\n        if (interrupted) {\n            this.incrementProperty('interruptions');\n            session.wasInterrupted = true;\n            yield timeout(this._sessionInterruptedTimeout);\n            if (this.get('sessions.length') === 1 && session.connectionState !== 'connected') {\n                this.webrtc.endConversation({ jid: this.jid, reason: 'interrupt-timeout' });\n            }\n        }\n    }).restartable(),\n\n    _setupSessionEvents(session) {\n        session.on('channelMessage', (session, channel, data) => {\n            this._getSessionPeer(session, null, data.creator).then(peer => {\n                this._handleChannelMessage(channel, data.type, peer, data.payload);\n            });\n        });\n\n        session.on('peerTrackAdded', (session, track) => {\n            if (!this.useTrackBasedActions) {\n                return;\n            }\n            this.logger.info('peerTrackAdded', {\n                remoteData: {\n                    kind: 'webrtcSession',\n                    conversationId: this.conversationId,\n                    sid: session.sid,\n                    trackId: track.id\n                }\n            });\n\n            this.handleRemoteTrackAdded(session, track);\n        });\n\n        if (session.pc.pc) {\n            session.on('change:connectionState', (s, connectionState) =>\n                this._handleSessionConnectionStateChange(session, connectionState)\n            );\n            session.on('peerStreamAdded', (s, stream) => this._handlePeerStreamAdded(session, stream));\n            session.on('peerStreamRemoved', (s, stream) => this._handlePeerStreamRemoved(session, stream));\n            session.on('mute', (s, opts) => this._handleMute(session, opts));\n            session.on('unmute', (s, opts) => this._handleUnmute(session, opts));\n            session.on('terminated', (s, reason) => this._handleTerminated(session, reason));\n        } else {\n            session.on('connectionState', connectionState =>\n                this._handleSessionConnectionStateChange(session, connectionState)\n            );\n            session.on('peerStreamAdded', stream => this._handlePeerStreamAdded(session, stream));\n            session.on('peerStreamRemoved', stream => this._handlePeerStreamRemoved(session, stream));\n            session.on('mute', opts => this._handleMute(session, opts));\n            session.on('unmute', opts => this._handleUnmute(session, opts));\n            session.on('terminated', reason => this._handleTerminated(session, reason));\n        }\n\n        session.on('hold', () => this._handleHold(session));\n        session.on('resumed', () => this._handleResumed(session));\n\n        session.startConnectionTimeout = () => {\n            session.connectionTimeout = this._connectionTimeout.perform(session);\n        };\n\n        session.on('lastNChange', collibriPayload => {\n            const message = collibriPayload.msgPayload || collibriPayload;\n            const endpoint = message.endpointId;\n\n            if (!this.room) {\n                this.logger.info('No room loaded for conversation, ignoring lastNChanges', {\n                    conversationId: this.conversationId\n                });\n                return;\n            }\n\n            if (message.dominantSpeakerEndpoint) {\n                const dominantSpeakerEndpoint = message.dominantSpeakerEndpoint.split('/')[0];\n                this._handleDominantSpeakerChange(dominantSpeakerEndpoint);\n            } else if (message.channelMessage) {\n                if (message.channelTopic === 'requestParticipantInfo') {\n                    return this._sendParticipantInfo();\n                }\n                this._getSessionPeer(session, null, endpoint).then(peer => {\n                    this._handleChannelMessage(message.channelMessage, message.channelTopic, peer, message.payload);\n                });\n            } else if (message.colibriClass === 'LastNEndpointsChangeEvent') {\n                const endpoints = message.lastNEndpoints ? message.lastNEndpoints.map(e => e.split('/')[0]) : [];\n                this.set('receivedLastN', true);\n                this.set('currentLastN', A(endpoints));\n            }\n        });\n\n        session.on('endOfCandidates', () => {\n            session.relayCandidatesTimeout = this._endOfCandidates.perform(session);\n        });\n\n        this.webrtc.gatherStatsForSession(session);\n\n        let setOnChannel = false;\n        const checkChannelState = resolve => {\n            if (session.lastNChannel && session.lastNChannel.readyState === 'open') {\n                resolve();\n            } else if (session.lastNChannel) {\n                session.lastNChannel.onopen = () => resolve();\n            } else {\n                if (setOnChannel) {\n                    return;\n                }\n                setOnChannel = true;\n                session.on('addChannel', checkChannelState.bind(this, resolve));\n            }\n        };\n\n        new RSVP.Promise(checkChannelState).then(() => {\n            this.sendDirectlyToAll('video', 'requestParticipantInfo');\n            this._sendParticipantInfo();\n        });\n    },\n\n    _handleSessionConnectionStateChange(session, connectionState) {\n        const conversationId = this.conversationId;\n        const conversationType = this.conversationType;\n        this.logger.info('connectionStateChanged', {\n            remoteData: {\n                connectionState,\n                kind: 'webrtcSession',\n                conversationId,\n                conversationType,\n                sid: session.sid\n            }\n        });\n\n        const interrupted = connectionState === 'interrupted';\n        session.interruptedTimeout = this._sessionInterrupted.perform(session, interrupted);\n\n        if (connectionState === 'failed' && session.wasInterrupted) {\n            this.logger.warn('Session failed to reconnect after interruption (ICE Failure)', {\n                remoteData: {\n                    kind: 'webrtcSession',\n                    conversationId,\n                    conversationType,\n                    sessionId: session.sid\n                }\n            });\n            if (this.isOneToOneCollaborate) {\n                if (this.get('sessions.length') === 1) {\n                    this.webrtc.endConversation({\n                        jid: this.jid,\n                        conversationId: this.conversationId\n                    });\n                }\n                this.webrtc.lostConnectionError(this.get('room.oneToOneTarget.name'));\n            } else {\n                this._handleConnectivityError();\n            }\n        }\n\n        if (this.isOneToOne && session.streams.length) {\n            const stream = session.streams[0];\n            const participant = this.participants.find(p => p.get('cameraStream.id') === stream.id);\n            if (participant) {\n                participant.set('connectionState', connectionState);\n            }\n        }\n        const isConnected = connectionState === 'connected';\n        if (isConnected) {\n            if (session.connectionTimeout) session.connectionTimeout.cancel();\n            if (session.relayCandidatesTimeout) session.relayCandidatesTimeout.cancel();\n\n            this.getNativePeerConnection(session).addEventListener('negotiationneeded', () => {\n                this.logger.info('webrtc renegotiation needed', {\n                    remoteData: {\n                        kind: 'webrtcSession',\n                        conversationId: this.conversationId,\n                        conversationType: this.conversationType,\n                        sid: session.sid\n                    }\n                });\n            });\n            this.outgoingSessionRequests.clear();\n            if (this.isCollaborate) {\n                this._sendMuteStates(session);\n            }\n\n            this._removeOutgoingSessionRequestById(session.sid);\n\n            session.wasInterrupted = false;\n            run.cancel(session.interruptedTimeout);\n            session.interruptedTimeout = null;\n            this.checkForListeners();\n        }\n        this.set('isConnected', isConnected);\n    },\n\n    _handlePeerStreamAdded(session, stream) {\n        if (this.useTrackBasedActions || stream.id === 'default' || !this.jid) {\n            return;\n        }\n\n        this.logger.info('peerStreamAdded', {\n            remoteData: {\n                kind: 'webrtcSession',\n                conversationId: this.conversationId,\n                sid: session.sid,\n                streamId: stream.id\n            }\n        });\n\n        this.handleRemoteStreamAdded(session, stream);\n    },\n\n    _handlePeerStreamRemoved(session, stream) {\n        if (this.useTrackBasedActions || stream.id === 'default' || !this.jid) {\n            return;\n        }\n\n        this.logger.info('peerStreamRemoved', {\n            remoteData: {\n                kind: 'webrtcSession',\n                conversationId: this.conversationId,\n                sid: session.sid,\n                streamId: stream.id\n            }\n        });\n\n        this.handleRemoteStreamRemoved(session, stream);\n    },\n\n    _handleMute(session, opts) {\n        if (this.usePcConversationModelParticipants) {\n            return;\n        }\n        const participant = this.participants.find(p => p.get('person.id') === opts.creator);\n\n        if (!participant) {\n            return this.logger.warn('received mute event for unknown participant', {\n                remoteData: {\n                    kind: 'webrtcSession',\n                    conversationId: this.conversationId,\n                    participant: opts.creator\n                }\n            });\n        }\n\n        participant.set(opts.name + 'Muted', true);\n    },\n\n    _handleUnmute(session, opts) {\n        if (this.usePcConversationModelParticipants) {\n            return;\n        }\n        const participant = this.participants.find(p => p.get('person.id') === opts.creator);\n\n        if (!participant) {\n            return this.logger.warn('received unmute event for unknown participant', {\n                remoteData: {\n                    kind: 'webrtcSession',\n                    conversationId: this.conversationId,\n                    participant: opts.creator\n                }\n            });\n        }\n\n        participant.set(opts.name + 'Muted', false);\n    },\n\n    _handleHold(session) {\n        if (session.callInfo) {\n            this.logger.log('WebRTC Hold event received. No streams will be removed.', {\n                remoteData: {\n                    conversationId: this.conversationId,\n                    kind: 'webrtcSession',\n                    sid: session.sid\n                }\n            });\n            this.localMedia.mute();\n            return;\n        }\n        this.logger.warn('WebRTC Hold info for a session not associated with a conversation', {\n            remoteData: {\n                sid: session.sid,\n                conversationId: this.conversationId,\n                kind: 'webrtcSession'\n            }\n        });\n    },\n\n    _handleResumed(session) {\n        if (session.callInfo) {\n            this.logger.log('WebRTC Resume event received. No streams will be added.', {\n                remoteData: {\n                    kind: 'webrtcSession',\n                    sid: session.sid,\n                    conversationId: this.conversationId\n                }\n            });\n\n            return;\n        }\n        this.logger.warn('WebRTC Hold info for a session not associated with a conversation', {\n            remoteData: {\n                conversationId: this.conversationId,\n                sid: session.sid\n            }\n        });\n    },\n\n    _handleTerminated(session, reason) {\n        this._removeOutgoingSessionRequestById(session.sid);\n\n        this._removeSession(session);\n        const webrtc = this.webrtc;\n        webrtc.removeMappedSessionConversation(session.sid);\n        webrtc.notifySessionEnded({ session, conversation: this, reason });\n        webrtc.get('videoConversationsMadeByClient').removeObject(this);\n\n        if (reason.condition === 'failed-transport' && !this.ending) {\n            this.logger.warn('session terminated due to connectivity error', {\n                remoteData: {\n                    conversationId: this.conversationId,\n                    kind: 'webrtcSession'\n                }\n            });\n            return this._handleConnectivityError();\n        }\n\n        if (this.isScreenShare && reason.condition === 'gone') {\n            webrtc.engageScreenShareError(this.conversationId);\n        } else if (reason.condition === 'gone' && !this.isOneToOne) {\n            // video bridge went down\n            webrtc.bridgeDownError();\n        } else if (reason.alternativeSession) {\n            webrtc.migrateVideoConversationToConference(this, reason.alternativeSession);\n        } else {\n            this.logger.info('session terminated', {\n                remoteData: {\n                    conversationId: this.conversationId,\n                    kind: 'webrtcSession'\n                }\n            });\n        }\n\n        if (\n            !this.get('sessions.length') &&\n            !this.hasPendingSessionRequest &&\n            reason.condition !== 'alternative-session'\n        ) {\n            if (get(session, 'callInfo')) {\n                return webrtc.endConversation({ conversation: this });\n            }\n            webrtc.endConversation({\n                jid: this.jid,\n                conversationId: this.conversationId,\n                conversationType: this.conversationType\n            });\n        }\n\n        if (this.room) {\n            this.set('room.invited', false);\n        }\n    }\n});\n","import { inject as service } from '@ember/service';\nimport Mixin from '@ember/object/mixin';\nimport { computed } from '@ember/object';\n\nexport default Mixin.create({\n    webrtc: service(),\n\n    selectedOutputDevice: computed('webrtc.defaultOutputDevice', {\n        get: function () {\n            return this.get('webrtc.defaultOutputDevice');\n        },\n        set: function (key, val) {\n            if (val && val !== this.get('webrtc.defaultOutputDevice')) {\n                this.webrtc.updateDefaultDevices({\n                    outputDevice: val\n                });\n                return val;\n            }\n\n            return this.get('webrtc.defaultOutputDevice');\n        }\n    }),\n\n    selectedMicrophone: computed('webrtc.defaultMicrophone', {\n        get: function () {\n            return this.get('webrtc.defaultMicrophone');\n        },\n        set: function (key, val) {\n            if (val && val !== this.get('webrtc.defaultMicrophone')) {\n                this.webrtc.updateDefaultDevices({\n                    microphone: val\n                });\n            }\n            return val;\n        }\n    }),\n\n    selectedCamera: computed('webrtc.defaultCamera', {\n        get: function () {\n            return this.get('webrtc.defaultCamera');\n        },\n        set: function (key, val) {\n            if (val && val !== this.get('webrtc.defaultCamera')) {\n                this.webrtc.updateDefaultDevices({\n                    camera: val\n                });\n            }\n            return val;\n        }\n    }),\n\n    selectedResolution: computed('webrtc.defaultResolution', {\n        get: function () {\n            return this.get('webrtc.defaultResolution');\n        },\n        set: function (key, val) {\n            if (val && val !== this.get('webrtc.defaultResolution')) {\n                this.webrtc.updateDefaultDevices({\n                    resolution: val\n                });\n            }\n            return val;\n        }\n    }),\n\n    selectedNotificationDevice: computed('webrtc.defaultNotificationDevice', {\n        get: function () {\n            return this.get('webrtc.defaultNotificationDevice');\n        },\n        set: function (key, val) {\n            if (val && val !== this.get('webrtc.defaultNotificationDevice')) {\n                this.webrtc.updateDefaultDevices({\n                    notificationDevice: val\n                });\n                return val;\n            }\n\n            return this.get('webrtc.defaultNotificationDevice');\n        }\n    })\n});\n","import { or, reads, alias, union, filterBy } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { getOwner } from '@ember/application';\nimport { A } from '@ember/array';\nimport Mixin from '@ember/object/mixin';\nimport { run, debounce } from '@ember/runloop';\nimport Evented from '@ember/object/evented';\nimport RSVP, { Promise, denodeify, reject } from 'rsvp';\nimport EmberObject, { computed, observer, get } from '@ember/object';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport WebrtcConversation from 'web-directory/models/webrtc-conversation';\nimport { EVENTS } from 'web-directory/utils/hosted-context';\nimport webrtcConversationTypes from 'web-directory/utils/webrtc-conversation-types';\nimport { task, timeout } from 'ember-concurrency';\nimport LocalMedia from 'localmedia';\n\nimport {\n    isPersonJid,\n    isRoomJid,\n    isSoftphoneJid,\n    isScreenRecordingJid,\n    isAcdJid\n} from 'web-directory/utils/jid-helpers';\n\nconst defaultAutoConferenceInterval = 100;\nconst maxAutoConferenceInterval = 5000;\nconst maxScreenRetryAttempts = 3;\n\nexport default Mixin.create(LoggerMixin, Evented, {\n    conversationModeService: service('modes/conversation-mode-service'),\n\n    conversations: null,\n    sessionConversationMap: null,\n    pendingSessions: null,\n\n    // setting this to true will prompt for screen selection for screen recording when we get a CP requesting screen recording\n    // this is really for debug purposes only and will typically be set manually through dev tools.\n    allowScreenRecordingInBrowser: null,\n\n    checkConversationStates: null,\n    requestReconnectCallback: null,\n\n    conversationCreatePromise: null,\n    hasShownHawkWarning: false,\n    conversationsWithConversationId: computed('conversations.[]', function () {\n        return this.conversations.filter(conversation => conversation.get('conversationId'));\n    }),\n\n    softphoneConversations: computed('conversations.@each.conversationType', function () {\n        return this.conversations.filterBy('conversationType', webrtcConversationTypes.SOFTPHONE);\n    }),\n\n    hasActiveOrPendingSessions: or('pendingSessions.length', 'conversations.length'),\n    videoConversationsMadeByClient: A(),\n    conversationsMadeByClient: reads('phone.conversationsMadeByClient', 'videoConversationsMadeByClient'),\n    phoneConversations: reads('phone.conversations'),\n    stationHasPersistentConnection: reads('phone.stationHasPersistentConnection'),\n\n    userId: reads('session.person.id'),\n\n    webrtcSessions: alias('streaming.connectionV2._webrtcSessions'),\n\n    shouldUseHawkByJid() {\n        return this.shouldUseHawkByConversationType();\n    },\n\n    shouldUseHawkByConversationType() {\n        if (!this.webrtcSessions) {\n            this.logger.error('Supposed to use hawk but hawk is not connected. Realtime fallback not allowed');\n            this.notification.error(null, this.intl.t('ewc.notConnectedToStreamingService'), {\n                tag: 'no-streaming-service',\n                hideAfter: 10,\n                forceBrowserNotification: true\n            });\n        }\n\n        return true;\n    },\n\n    shouldUseApiByJid(jid) {\n        if (isSoftphoneJid(jid)) {\n            return false;\n        }\n        if (isScreenRecordingJid(jid)) {\n            return true;\n        }\n        if (isAcdJid(jid)) {\n            return false;\n        }\n\n        // video is all that's left\n        if (isRoomJid(jid)) {\n            return true;\n        }\n        return false;\n    },\n\n    // timeouts\n    _defaultCallTimeoutLength: 20000,\n\n    // max timeout is 5 minutes\n    _softphoneCallTimeoutLength: 1000 * 60 * 5,\n\n    init() {\n        this._super(...arguments);\n        this.set('conversations', A());\n        this.set('checkConversationStates', A());\n        this.set('sessionConversationMap', {});\n        this.set('pendingSessions', A());\n        this.set('conversationCreatePromise', RSVP.resolve());\n        this.attachEvents();\n        this.pigeon.on('media', this, this._handleTalkerChangedEvent);\n    },\n\n    attachEvents() {\n        this.session.on('invalidatingAuthSession', this.invalidatingAuthSession.bind(this));\n    },\n\n    invalidatingAuthSession(cbFn) {\n        const blocker = 'activeConversations';\n        const isStationWebrtc = this.get('phone.station.isWebrtc');\n        const conversation = this.conversations.find(c => {\n            return c.get('_state') === 'active' && c.get('isSoftphone');\n        });\n        const persistentConnectionActive = this.get('phone.persistentConnectionActive');\n        const hasPhoneConversation = this.get('phone.activeConversations.length');\n        const idlePersistent = persistentConnectionActive && !hasPhoneConversation;\n        if (isStationWebrtc && !!conversation && (hasPhoneConversation || !persistentConnectionActive)) {\n            // prevent a logout since there are active webrtc calls\n            cbFn('add', blocker);\n        } else if (idlePersistent) {\n            this.endConversation({ conversation }).then(() => cbFn('remove', blocker));\n        } else {\n            cbFn('remove', blocker);\n        }\n    },\n\n    mapSessionToConversation(sid, conversation) {\n        this.set(`sessionConversationMap.${sid}`, conversation);\n    },\n\n    removeMappedSessionConversation(sid) {\n        const map = this.sessionConversationMap;\n        delete map[sid];\n    },\n\n    // ******************************************************\n    // helpers\n    // ******************************************************\n\n    _checkRequestReconnect() {\n        if (this.requestReconnectCallback && !this.hasActiveOrPendingSessions) {\n            this.requestReconnectCallback();\n            this.set('requestReconnectCallback', null);\n        }\n    },\n\n    // log streaming service/cp connection status\n    _logConnectionDetails(sessionId, conversationId) {\n        const carrierPigeonConnected = this.get('phone.carrierPigeonConnected') ? 'connected' : 'not connected';\n        const streamingServiceConnected = this.get('streaming.connected') ? 'connected' : 'not connected';\n        if (!carrierPigeonConnected || !streamingServiceConnected) {\n            this.logger.warn('connection warning: carrier pigeon connection change', {\n                kind: 'webrtcManager',\n                conversationId,\n                carrierPigeonConnected,\n                streamingServiceConnected,\n                sessionId\n            });\n        }\n    },\n\n    _jingleConversationDance({ sessionId, conversationId }) {\n        // find the CP conversation that matches the <propose />\n        const stationConversation = this.get('phone.conversations').findBy('id', conversationId);\n        if (stationConversation) {\n            // the conversation is a user -> station call that was just disconnected (probably an auto conference call). Check for a recently connected conference.\n            if (\n                stationConversation.get('connectedToStationAndNotConference') &&\n                stationConversation.get('isDisconnected')\n            ) {\n                this._autoConferenceLater.perform({ stationConversation, conversationId, sessionId });\n            }\n        }\n    },\n\n    // Check to see if there is a conversation that matches the fromJid's UUID. If so, bind the session to the other conversationId.\n    _bindAndCreatePendingSession(fromJid, sessionId, conversationId, autoAnswer, isIncoming) {\n        const conversation = this.conversationsMadeByClient.findBy('id', conversationId);\n        // if there is a conversationId on the session and no conversation object from CP, then possible conference call and must do some conversationId shuffling\n        if (conversationId && !conversation) {\n            const phone = this.phone;\n            phone.on(\n                `conversations.${conversationId}`,\n                this,\n                this._jingleConversationDance.bind(this, { sessionId, conversationId })\n            );\n            const incomingConferenceCall = fromJid.match(\n                /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}(?=@)/g\n            ); // matches a UUID\n            if (incomingConferenceCall && incomingConferenceCall[0] !== conversationId) {\n                // Need to do the conversationId swap because non-initiating participants of a conference will have a different conversationId (inin-cid) on the messages coming from the gateway,\n                // so we use the one in fromJid instead.\n                const phoneConversation = this.get('phone.conversations').findBy('id', incomingConferenceCall[0]);\n                conversationId = incomingConferenceCall[0];\n                if (phoneConversation) {\n                    this.logger.info('Incoming session is a conference call. Binding session with conversation', {\n                        remoteData: {\n                            kind: 'webrtcManager',\n                            sessionId,\n                            conversationId\n                        }\n                    });\n                } else {\n                    const rehandlebindAndCreate = function () {\n                        this.logger.info(\n                            'Incoming session is a conference call. Phone conversation has been created. Rehandling bind for pending session.',\n                            {\n                                remoteData: {\n                                    kind: 'webrtcManager',\n                                    sessionId,\n                                    conversationId\n                                }\n                            }\n                        );\n                        this._bindAndCreatePendingSession(fromJid, sessionId, conversationId, autoAnswer);\n                        phone.off(`conversations.${conversationId}`, rehandlebindAndCreate);\n                    };\n                    this.logger.info(\n                        'Incoming session is a conference call. Phone conversation does not yet exist. Defering until conversation creation',\n                        {\n                            remoteData: {\n                                kind: 'webrtcManager',\n                                sessionId,\n                                conversationId\n                            }\n                        }\n                    );\n                    phone.on(`conversations.${conversationId}`, this, rehandlebindAndCreate);\n                }\n            }\n        }\n\n        // handle the case where another request for an incoming session comes in when a pending session with the same conversationId already exists.\n        // PCDWEBK-3652\n        const existingPendingSession = this.pendingSessions.findBy('callInfo.conversationId', conversationId);\n        if (existingPendingSession) {\n            this.logger.info('pendingSession already exists', {\n                remoteData: {\n                    kind: 'webrtcManager',\n                    sessionId,\n                    conversationId,\n                    autoAnswer,\n                    isIncoming\n                }\n            });\n            existingPendingSession.set('id', sessionId);\n            return;\n        }\n        this.createPendingSession(null, {\n            id: sessionId,\n            autoAnswer: autoAnswer,\n            isIncoming,\n            callInfo: {\n                conversationId: conversationId\n            }\n        });\n    },\n\n    _cancelPendingSession(pendingSession) {\n        pendingSession.timeoutTask.cancel();\n\n        if (this.pendingSessions) {\n            this.pendingSessions.removeObject(pendingSession);\n            this._checkRequestReconnect();\n        }\n        if (!pendingSession.rejected && !pendingSession.requestForIncoming) {\n            if (this.shouldUseHawkByJid(pendingSession.roomJid)) {\n                this.webrtcSessions.cancelRtcSession(pendingSession.id);\n            } else {\n                this.get('streaming.connection').cancelRtcSession(pendingSession.id);\n            }\n        }\n    },\n\n    _noAnswer(pendingSession) {\n        this._cancelPendingSession(pendingSession);\n        this.endConversation({\n            jid: pendingSession.roomJid,\n            reason: 'timeout',\n            conversationId: pendingSession.callInfo ? pendingSession.callInfo.conversationId : null\n        });\n        this.chat.getChatRoom(pendingSession.roomJid).then(room => {\n            const message = this.intl.t('ewc.noAnswer', {\n                personName: room.get('participants.firstObject.name')\n            });\n            this.showNoAnswerNotification(message, 'info');\n        });\n    },\n\n    _notResponding(pendingSession) {\n        this._cancelPendingSession(pendingSession);\n\n        if (!isScreenRecordingJid(pendingSession.roomJid)) {\n            const message = this.intl.t('ewc.notResponding');\n            this.showNoAnswerNotification(message, 'error');\n        }\n\n        this.endConversation({\n            conversationType: pendingSession.conversationType,\n            jid: pendingSession.roomJid,\n            reason: 'timeout',\n            conversationId: pendingSession.callInfo ? pendingSession.callInfo.conversationId : null\n        });\n    },\n\n    _connectionTimeout(pendingSession) {\n        this._cancelPendingSession(pendingSession);\n        const { conversationId, autoAnswer } = pendingSession.callInfo || {};\n        this.logger.error('call connection timeout', {\n            remoteData: {\n                sessionId: pendingSession.id || pendingSession.sid,\n                conversationId,\n                autoAnswer\n            }\n        });\n        if (pendingSession.callInfo) {\n            this.trigger('callFailed', pendingSession.callInfo.conversationId);\n        }\n    },\n\n    _getSimpleJid(jid) {\n        if (jid.indexOf('/') >= 0) {\n            jid = jid.split('/')[0];\n        }\n\n        return jid;\n    },\n\n    _callTimeout: task(function* (pendingSession, jid, opts) {\n        let timeoutPendingSession;\n        let timeoutLength = this._defaultCallTimeoutLength;\n        if ((jid && isSoftphoneJid(jid)) || opts.callInfo) {\n            timeoutPendingSession = this._connectionTimeout;\n            timeoutLength = this._softphoneCallTimeoutLength;\n        } else if (jid && isPersonJid(jid)) {\n            timeoutPendingSession = this._noAnswer;\n        } else {\n            timeoutPendingSession = this._notResponding;\n        }\n\n        yield timeout(timeoutLength);\n        timeoutPendingSession.call(this, pendingSession);\n    }),\n\n    _lastInterval: defaultAutoConferenceInterval,\n    _generateInterval() {\n        let newInterval = Math.min(this._lastInterval * 2, maxAutoConferenceInterval);\n        this.set('_lastInterval', newInterval);\n        return newInterval;\n    },\n\n    _autoConferenceLater: task(function* (obj) {\n        yield timeout(this._generateInterval());\n        this.checkAutoConferenceLater(obj);\n    }),\n\n    _hangupSound() {\n        this.sound.playSound('hangup');\n    },\n\n    hangupSound() {\n        // Handle retained so willDestroy can cancel it — otherwise the sound plays up to 500ms after\n        // teardown, against a destroyed `sound` service.\n        this._hangupSoundTimer = debounce(this, this._hangupSound, 500);\n    },\n\n    willDestroy() {\n        // typeof checks rather than truthiness: backburner timer ids start at 0, so a truthy check\n        // skips cancelling the first timer scheduled in a page.\n        if (typeof this._hangupSoundTimer === 'number') {\n            run.cancel(this._hangupSoundTimer);\n            this._hangupSoundTimer = null;\n        }\n        if (typeof this._answerSoftphoneTimer === 'number') {\n            run.cancel(this._answerSoftphoneTimer);\n            this._answerSoftphoneTimer = null;\n        }\n        this._super(...arguments);\n    },\n\n    _createConversation(params) {\n        // ownerInjection() must be the first arg in Ember 3.28\n        const conversation = WebrtcConversation.create(Object.assign(params, getOwner(this).ownerInjection()));\n        this.trigger('conversation', conversation);\n        return conversation;\n    },\n\n    _getOrCreateConversation({ jid, conversationId, create }) {\n        if (!jid && !conversationId) {\n            const err = new Error('Cannot get conversation without jid or conversationId');\n            err.type = 'NOT_FOUND';\n            this.logger.warn(err.message, { remoteData: err });\n            return RSVP.reject(err);\n        }\n\n        let conversation = this.getConversation({ jid, conversationId });\n\n        if (conversation) {\n            return RSVP.resolve(conversation);\n        }\n\n        if (!create) {\n            this.logger.warn('could not find webrtc conversation', {\n                jid,\n                kind: 'webrtcManager'\n            });\n            return RSVP.resolve();\n        }\n\n        if (!jid) {\n            const err = new Error('Cannot create a webrtc conversation without a jid');\n            this.logger.error(err.message);\n            return RSVP.reject(err);\n        }\n\n        return this.chat\n            .getChatRoom(jid)\n            .then(room => {\n                return this._createConversation({ jid, conversationId, room });\n            })\n            .then(conversation => {\n                this.conversations.pushObject(conversation);\n                return conversation;\n            });\n    },\n\n    _handleTalkerChangedEvent(body) {\n        const { id, participants, speakers } = body;\n        const conversation = this.getConversation({ conversationId: id });\n        if (!conversation) {\n            this.logger.warn('talker change event for unknown conversation', { remoteData: { conversationId: id } });\n            return;\n        }\n\n        this.logger.debug('talker change event', body);\n\n        conversation.updateTrackOwners(participants);\n        conversation.updateSpeakers(speakers);\n    },\n\n    _startVideoViaApi({ jid, pendingSession }, isRetry) {\n        const data = JSON.stringify({\n            roomId: jid,\n            participant: {\n                address: this.get('session.person.jid'),\n                videoMuted: false,\n                audioMuted: false\n            }\n        });\n        return this.ajax\n            .post('/platform/api/v2/conversations/videos', { data })\n            .then(r => {\n                this.attachConversationId(jid, r.conversationId);\n                this.pigeon.registerPriorityTopic(`v2.conversations.${r.conversationId}.media`, 'media');\n            })\n            .catch(err => {\n                this.logger.error('Api request to start video failed', { remoteData: err });\n                // if request to start video fails, try one more time\n                if (!isRetry) {\n                    this.logger.info('Retrying request to start video');\n                    return this._startVideoViaApi({ jid, pendingSession }, true);\n                } else {\n                    this.endConversation({ jid });\n                    this.notification.error(null, this.intl.t('ewc.failedToConnectSession'));\n                }\n\n                if (pendingSession) {\n                    this._notResponding(pendingSession);\n                }\n            });\n    },\n\n    // ******************************************************\n    // Generic conversation APIs\n    // ******************************************************\n\n    getConversationTypeByJid(jid) {\n        if (isScreenRecordingJid(jid)) {\n            return webrtcConversationTypes.ENGAGE_SCREEN_RECORDING;\n        } else if (isSoftphoneJid(jid)) {\n            return webrtcConversationTypes.SOFTPHONE;\n        } else if (isAcdJid(jid)) {\n            // TODO: this needs to be verified\n            return webrtcConversationTypes.ENGAGE_SCREENSHARE;\n        } else {\n            return webrtcConversationTypes.COLLABORATE_VIDEO;\n        }\n    },\n\n    createPendingSession(jid, opts) {\n        this.logger.info('creating pending session', {\n            remoteData: {\n                sid: opts.id,\n                kind: 'webrtcManager',\n                conversationType: opts.conversationType,\n                conversationId: opts.conversationId,\n                autoAnswer: opts.autoAnswer,\n                isIncoming: opts.isIncoming\n            }\n        });\n        if (opts.callInfo && !opts.callInfo.constraints) {\n            opts.callInfo.constraints = {\n                mandatory: {\n                    OfferToReceiveAudio: true,\n                    OfferToReceiveVideo: false\n                }\n            };\n        }\n\n        const pendingSession = EmberObject.create({\n            id: opts.id,\n            roomJid: jid,\n            media: opts.media,\n            stream: opts.stream,\n            peerConstraints: opts.peerConstraints,\n            requestForIncoming: !!(opts.callInfo || isRoomJid(jid) || isSoftphoneJid(jid)),\n            callInfo: opts.callInfo,\n            autoAnswer: opts.autoAnswer,\n            isIncoming: opts.isIncoming,\n            conversationType: opts.conversationType\n        });\n\n        pendingSession.timeoutTask = this._callTimeout.perform(pendingSession, jid, opts);\n\n        this.pendingSessions.pushObject(pendingSession);\n        return pendingSession;\n    },\n\n    requestRtcSession(jid, opts = {}) {\n        const initiateOpts = {\n            jid,\n            conversationId: opts.conversationId,\n            sourceCommunicationId: opts.sourceCommunicationId,\n            stream: opts.stream,\n            mediaPurpose: opts.mediaPurpose\n        };\n\n        let pendingSession;\n        const useApi = this.shouldUseApiByJid(jid);\n        if (useApi && !opts.isOneToOne) {\n            // kick off async, but don't wait here\n            this._startVideoViaApi({ jid, pendingSession });\n            opts.id = -1;\n        } else {\n            opts.id = this.webrtcSessions.initiateRtcSession(initiateOpts);\n        }\n\n        pendingSession = this.createPendingSession(jid, opts);\n        return pendingSession;\n    },\n\n    attachConversationId(jid, conversationId) {\n        const conversation = this.getConversation({ jid });\n        let promise = RSVP.resolve(conversation);\n\n        if (!conversation) {\n            this.logger.log('conversation does not exist yet, waiting for event');\n            promise = new RSVP.Promise(resolve => {\n                const attach = conversation => {\n                    if (conversation.get('jid') === jid) {\n                        this.off('conversation', attach);\n                        resolve(conversation);\n                    }\n                };\n                this.on('conversation', attach);\n            });\n        }\n\n        promise.then(conversation => {\n            conversation.set('conversationId', conversationId);\n            this.videoConversationsMadeByClient.pushObject(conversation);\n        });\n    },\n\n    cancelPendingRtcSessions() {\n        const pendingSessions = this.pendingSessions.filter(session => !session.callInfo);\n        if (!pendingSessions.length) {\n            return;\n        }\n\n        const cancelPendingSession = this._cancelPendingSession.bind(this);\n        pendingSessions.forEach(cancelPendingSession);\n    },\n\n    getOrCreateConversation({ jid, conversationId, create }) {\n        const oldPromise = this.conversationCreatePromise;\n        const executeFn = this._getOrCreateConversation.bind(this, { jid, conversationId, create });\n\n        const newPromise = oldPromise.then(executeFn, executeFn);\n        this.set('conversationCreatePromise', newPromise);\n\n        return newPromise;\n    },\n\n    getConversation({ jid, conversationId, conversationType, inferConversationType = true }) {\n        if (!jid && !conversationId) {\n            this.logger.error('Cannot get a conversation without a jid or conversationId');\n            return null;\n        }\n\n        let conversations = this.conversations;\n        let searchConversationType = conversationType;\n\n        if (!searchConversationType && inferConversationType) {\n            searchConversationType = conversationType || (jid && this.getConversationTypeByJid(jid));\n        }\n\n        if (searchConversationType) {\n            conversations = A(conversations.filterBy('conversationType', searchConversationType));\n\n            // if we inferred the conversationType and didn't find anything, try finding the conversation without a conversationType\n            if (!conversations.length && inferConversationType && !conversationType) {\n                return this.getConversation({ jid, conversationId, inferConversationType: false });\n            }\n        }\n\n        if (conversationId) {\n            conversations = A(conversations.filterBy('conversationId', conversationId));\n        }\n\n        if (jid) {\n            conversations = A(conversations.filterBy('jid', jid));\n        }\n\n        if (!conversations.length) {\n            return null;\n        }\n        if (conversations.length === 1) {\n            return conversations[0];\n        }\n        if (jid) {\n            conversations = conversations.filterBy('jid', jid);\n            return conversations.length ? conversations[0] : null;\n        }\n        const error = new Error(\n            'getConversation found multiple conversations sharing a conversationId but no way retrieve a single conversation'\n        );\n        error.conversationId = conversationId;\n        this.logger.error(error.message, { remoteData: error });\n\n        return null;\n    },\n\n    endConversation({ jid, conversationId, conversation, reason, conversationType, pending, notAfter }) {\n        const pendingSessions = this.pendingSessions.filter(session => {\n            return (\n                (session.roomJid && session.roomJid === jid) ||\n                (conversationId && session.callInfo && session.callInfo.conversationId === conversationId)\n            );\n        });\n\n        if (pending !== false) {\n            // default to true, have to explicitly pass false to opt out of canceling pending sessions\n            const cancelPendingSession = this._cancelPendingSession.bind(this);\n            pendingSessions.forEach(cancelPendingSession);\n        }\n\n        if (!conversation) {\n            conversation = this.getConversation({ jid, conversationId, conversationType });\n            if (!conversation || conversation.get('isDestroyed') || conversation.get('isDestroying')) {\n                if (!notAfter) {\n                    this.logger.warn('No conversation found', {\n                        remoteData: { kind: 'webrtcManager', conversationId }\n                    });\n                }\n                return RSVP.Promise.resolve();\n            }\n        }\n\n        if (notAfter && conversation.get('conversationStart') > notAfter) {\n            this.logger.warn('Not ending conversation because it is newer than the notAfter timestamp provided');\n            return RSVP.Promise.resolve();\n        }\n\n        jid = conversation.get('jid');\n        conversationId = conversation.get('conversationId');\n\n        conversation.set('ending', true);\n\n        const leaveAcdRoom =\n            !!conversation.get('room.associatedInteraction.isCall') || isScreenRecordingJid(conversation.get('jid'));\n\n        if (conversation.get('endingPromise')) {\n            return conversation.get('endingPromise').then((opts = {}) => {\n                if (opts.leaveAcdRoom) {\n                    return; // The room was already left\n                }\n\n                if (leaveAcdRoom) {\n                    this.chat.leaveAcdRoom(jid, conversation.get('isScreenShare'));\n                }\n            });\n        }\n\n        reason = reason || 'success';\n\n        const deferred = RSVP.defer();\n        conversation.set('endingPromise', deferred.promise);\n\n        const logInfo = {\n            message: 'ending webrtc conversation',\n            conversationId,\n            reason,\n            interruptions: conversation.get('interruptions'),\n            conversationType: conversation.get('conversationType')\n        };\n\n        if (reason !== 'success') {\n            this.logger.warn(logInfo.message, { remoteData: logInfo });\n        } else {\n            this.logger.info(logInfo.message, { remoteData: logInfo });\n        }\n\n        if (conversation.get('room')) {\n            conversation.set('room.showingVideo', false);\n        }\n\n        if (this.activeConversation === conversation) {\n            this.set('activeConversation', null);\n        }\n\n        const activeSessions = conversation.get('sessions').filter(session => !session.ended);\n        if (!activeSessions.length) {\n            deferred.resolve();\n        } else if (isRoomJid(jid) && conversation.get('conversation.myVideos')) {\n            // TODO: and feature toggle\n            const pcConversation = conversation.get('conversation');\n            const videos = pcConversation.get('myVideos');\n            const disconnects = videos.map(video => {\n                const participantId = video.get('participant.id');\n                return this.ajax.patch(\n                    `/platform/api/v2/conversations/${conversationId}/participants/${participantId}`,\n                    {\n                        data: JSON.stringify({ state: 'disconnected' })\n                    }\n                );\n            });\n\n            Promise.all(disconnects)\n                .then(() => deferred.resolve({ leaveAcdRoom }))\n                .catch(deferred.reject);\n        } else {\n            activeSessions.forEach(session => {\n                if (!jid || session.peerID.startsWith(jid)) {\n                    session.end(reason);\n                }\n            });\n            if (conversation.get('isGroupCollaborate')) {\n                this.endSessionsForRoom({ jid, reason })\n                    .then(() => deferred.resolve({ leaveAcdRoom }))\n                    .catch(deferred.reject);\n            } else {\n                deferred.resolve({ leaveAcdRoom });\n            }\n        }\n\n        return deferred.promise.then(() => {\n            conversation.cleanup();\n\n            // leave the room regardless of success ending session\n            if (leaveAcdRoom) {\n                this.chat.leaveAcdRoom(jid, conversation.get('isScreenShare'));\n            }\n\n            if (conversation.get('isCollaborate')) {\n                this.pigeon.unRegisterPriorityTopic(`v2.conversations.${conversation.get('conversationId')}.media`);\n                this.hangupSound();\n                this.sidebar.openPanel('conversations');\n            }\n            this.trigger('conversationEnded', { jid, reason, conversationId });\n            this.conversations.removeObject(conversation);\n            this._checkRequestReconnect();\n        });\n    },\n\n    joinConversation(conversation, localMedia) {\n        conversation.set('preparingToJoin', false);\n        conversation.set('joinedWithoutMedia', !localMedia);\n        conversation.set('hasJoined', true);\n        conversation.set('conversationStart', new Date());\n        conversation.addLocalParticipant();\n        conversation.setLocalMedia(localMedia);\n\n        if (conversation.get('isCollaborate')) {\n            this.trigger('videoNotification', conversation.get('room'), 'join');\n        }\n\n        if (!conversation.get('sessions.length')) {\n            const pendingSessionRequest = this.requestRtcSession(conversation.get('jid'), {\n                conversationId: conversation.get('room.associatedInteraction.id'),\n                sourceCommunicationId: conversation.get('room.associatedInteraction.sourceCommunicationId'),\n                stream: localMedia && get(localMedia, 'localStreams.length') ? localMedia.localStreams[0] : null,\n                media: localMedia,\n                mediaPurpose: conversation.get('mediaPurpose'),\n                conversationType: conversation.get('conversationType'),\n                isOneToOne: conversation.get('isOneToOne')\n            });\n            conversation.get('outgoingSessionRequests').pushObject(pendingSessionRequest);\n        } else {\n            conversation.get('sessions').forEach(session => {\n                if (session.state === 'pending') {\n                    conversation.acceptSession(session);\n                }\n            });\n        }\n    },\n\n    endSessionsForRoom({ jid, reason }) {\n        let fn;\n\n        if (this.shouldUseHawkByJid(jid)) {\n            fn = this.webrtcSessions.endRtcSessions;\n        } else {\n            fn = this.get('streaming.connection').endRtcSessions;\n        }\n\n        const endRtcSessions = denodeify(fn);\n        return endRtcSessions({ jid }, reason);\n    },\n\n    // ******************************************************\n    // Softphone conversation APIs\n    // ******************************************************\n\n    /**\n     * _autoAnswer should run when the logged in user placed the webrtc call OR the incoming request had autoAnswer = true\n     * or the user accepted the call but no pending session was present at the time.\n     */\n    _autoAnswer() {\n        const conversationsIdsToAutoAnswer = this.allConversationsToAutoAnswer.map(conversation =>\n            conversation.get('id')\n        );\n        const conversationProposesReceived = this.pendingSessions.map(pendingSession =>\n            pendingSession.get('callInfo.conversationId')\n        );\n        this.logger.info('Checking conversations to auto answer', {\n            conversationsIdsToAutoAnswer,\n            conversationProposesReceived\n        });\n\n        let conversationsToAutoAnswer = this.allConversationsToAutoAnswer;\n        conversationsToAutoAnswer.forEach(conversation => {\n            if (conversation) {\n                const pendingSessions = this.pendingSessions;\n                let sessionToAccept = pendingSessions.findBy('callInfo.conversationId', get(conversation, 'id'));\n                if (\n                    sessionToAccept &&\n                    sessionToAccept.get('conversationType') === webrtcConversationTypes.ENGAGE_SCREEN_RECORDING\n                ) {\n                    return;\n                }\n\n                if (this.get('session.webrtcPersistentConnectionPeerCid')) {\n                    const stationHasPersistentConnection = this.stationHasPersistentConnection;\n                    if (!sessionToAccept && stationHasPersistentConnection) {\n                        sessionToAccept = pendingSessions.length === 1 && pendingSessions[0];\n                        sessionToAccept.callInfo.conversationId = get(conversation, 'id');\n                    }\n                }\n                if (sessionToAccept && !sessionToAccept.accepted) {\n                    this.logger.info('attempting to auto answer session', {\n                        remoteData: {\n                            kind: 'webrtcManager',\n                            sessionId: sessionToAccept.id,\n                            conversationId: get(conversation, 'id')\n                        }\n                    });\n\n                    if (conversation.get('isCollaborate')) {\n                        run.throttle(this, this.answerVideoConversation, conversation, sessionToAccept.id, 500);\n                    } else {\n                        if (\n                            !conversation.get('myself.callbacks.length') > 0 &&\n                            !conversation.get('isOutbound') &&\n                            !conversation.get('acceptedByClient') &&\n                            !conversation.get('shouldAutoProceedWebrtc')\n                        ) {\n                            this.trigger('autoAnswer', get(conversation, 'id'));\n                        }\n                        // Handle retained so willDestroy can cancel it; the trailing invocation would\n                        // otherwise auto-answer up to 500ms after teardown.\n                        this._answerSoftphoneTimer = run.throttle(\n                            this,\n                            this.answerSoftphoneConversation,\n                            get(conversation, 'id'),\n                            500\n                        );\n                    }\n                }\n            }\n        });\n    },\n\n    _handleIncomingWebrtcSoftphoneRequest(sessionInfo) {\n        const { fromJid, sessionId, conversationId, autoAnswer } = sessionInfo;\n\n        this.logger.info('handling incoming webrtc softphone request', {\n            remoteData: {\n                sessionId,\n                conversationId,\n                kind: 'webrtcManager'\n            }\n        });\n\n        this._logConnectionDetails(sessionId, conversationId);\n        this._bindAndCreatePendingSession(fromJid, sessionId, conversationId, autoAnswer);\n    },\n\n    getMostRecentlyConnectedConferenceCall: function () {\n        const phone = this.phone;\n        const mostRecentlyConnectedConferenceCalls = phone.mostRecentlyConnectedConferenceCalls();\n        if (mostRecentlyConnectedConferenceCalls && mostRecentlyConnectedConferenceCalls.length) {\n            return mostRecentlyConnectedConferenceCalls[0];\n        }\n        return false;\n    },\n\n    checkAutoConferenceLater({ stationConversation, conversationId, sessionId }) {\n        const mostRecentlyConnectedConferenceCall = this.getMostRecentlyConnectedConferenceCall();\n        if (mostRecentlyConnectedConferenceCall) {\n            // there are recently connected conference calls. See if we need to do the swap\n            const conversationAlreadySwapped =\n                mostRecentlyConnectedConferenceCall.get('webrtcSession.callInfo.conversationId') === conversationId;\n            if (!conversationAlreadySwapped) {\n                // transfer the webrtc session and change the conversationId on the session\n                const conferenceCallId = mostRecentlyConnectedConferenceCall.get('id');\n                stationConversation.set('webrtcSession.callInfo.conversationId', conferenceCallId);\n                mostRecentlyConnectedConferenceCall.set('webrtcSession', stationConversation.get('webrtcSession'));\n                this._autoConferenceLater.cancelAll();\n                this.set('_lastInterval', defaultAutoConferenceInterval);\n                this.logger.info(\n                    'Auto-conference: Moving webrtc session from user-station conversation {conversationId} to conference {conferenceCallId}',\n                    {\n                        remoteData: {\n                            message: ``,\n                            sessionId,\n                            conversationId,\n                            conferenceCallId,\n                            kind: 'webrtcManager'\n                        }\n                    }\n                );\n            }\n        } else {\n            this._autoConferenceLater.perform({ stationConversation, conversationId });\n        }\n    },\n\n    // Auto answer feature https://inindca.atlassian.net/browse/PURE-738\n    inboundAcdCallsToAutoAnswer: computed('phone.incomingConversations.[]', function () {\n        const incomingConversations = this.get('phone.incomingConversations');\n        if (!incomingConversations) {\n            return A();\n        }\n        return A(\n            incomingConversations.filter(conversation => {\n                const session = this.pendingSessions.findBy('callInfo.conversationId', get(conversation, 'id'));\n                return session && get(session, 'autoAnswer');\n            })\n        );\n    }),\n\n    incomingCallbackCallsToAutoAnswer: computed(\n        'session.useModes',\n        'conversationModeService.incomingCallbackCallsToAutoAnswer.[]',\n        'acdcallback.incomingCallbackCallsToAutoAnswer.[]',\n        function () {\n            if (this.get('session.useModes')) {\n                return this.get('conversationModeService.incomingCallbackCallsToAutoAnswer') || [];\n            }\n            return this.get('acdcallback.incomingCallbackCallsToAutoAnswer') || [];\n        }\n    ),\n\n    videoConversationsToAutoAnswer: computed(\n        'videoConversationsMadeByClient.[]',\n        'pendingSessions.@each.callInfo',\n        function () {\n            const ret = A();\n\n            this.pendingSessions.forEach(pendingSession => {\n                const conversationId = pendingSession.callInfo && pendingSession.callInfo.conversationId;\n                if (conversationId) {\n                    const conversation = this.videoConversationsMadeByClient.findBy('conversationId', conversationId);\n                    if (conversation) {\n                        ret.pushObject(conversation);\n                    }\n                }\n            });\n\n            return ret;\n        }\n    ),\n\n    bargeMonitorCoachConversationsToAutoAnswer: computed('phone.conversations.[]', function () {\n        const conversations = this.get('phone.conversations');\n        const userId = this.userId;\n        if (!conversations) {\n            return A();\n        }\n        const pendingConversation = A(\n            conversations.filter(conversation => {\n                return this.pendingSessions.findBy('callInfo.conversationId', get(conversation, 'id'));\n            })\n        );\n        if (!pendingConversation.length || !pendingConversation[0].participants) {\n            return A();\n        }\n        // There will only be one pending conversation matching the conversation ID, we need to make sure its a barge-in session.\n        const bargeMonitorCoachSession = pendingConversation[0].participants.find(\n            participant =>\n                participant.bargedParticipantId ||\n                participant.coachedParticipantId ||\n                participant.monitoredParticipantId\n        );\n        return bargeMonitorCoachSession && bargeMonitorCoachSession.userId === userId ? pendingConversation : A();\n    }),\n\n    // PCM-2099 - This is somewhat of a hack in order to handle delayed proposes when using persistent connection. We\n    // normally hide the interaction buttons until we have a conversation update *and* a pending session, however\n    // in the case of persistent connection, we don't know if that connection already exists somewhere else so we can't\n    // gate the answer/decline buttons waiting for the pending session. If someone manages to answer before\n    // the pending session is received, we make assumptions and try and answer via pub api, then when the delayed\n    // propose comes in, we do nothing and the call goes unanswered. Whenever we get a new pending session, we need\n    // to look at the answered conversations and auto answer it (assuming station has persistent connection).\n    manuallyAnsweredSoftphoneConversationsWithLatePropose: computed(\n        'pendingSessions.[]',\n        'phone.station.persistentConnection',\n        function () {\n            if (!this.get('phone.station.persistentConnection')) {\n                return [];\n            }\n\n            const manuallyAnsweredSoftphoneConversationsWithLatePropose = this.get('phone.conversations').filter(c => {\n                return (\n                    c.get('shouldAutoProceedWebrtc') &&\n                    this.pendingSessions.find(pendingSession => {\n                        const isSoftphone =\n                            pendingSession.conversationType === webrtcConversationTypes.SOFTPHONE ||\n                            pendingSession.callInfo;\n                        return isSoftphone && pendingSession.get('callInfo.conversationId') === c.get('id');\n                    })\n                );\n            });\n\n            if (manuallyAnsweredSoftphoneConversationsWithLatePropose.length) {\n                const conversationIds = manuallyAnsweredSoftphoneConversationsWithLatePropose.map(c => c.get('id'));\n                this.logger.info('Found answered conversation(s) for which we received a late propose', {\n                    remoteData: { conversationIds }\n                });\n            }\n\n            return manuallyAnsweredSoftphoneConversationsWithLatePropose;\n        }\n    ),\n\n    allConversationsToAutoAnswer: union(\n        'inboundAcdCallsToAutoAnswer',\n        'phone.dialingOrContactingOrAlertingConversationsToProceed',\n        'incomingCallbackCallsToAutoAnswer',\n        'videoConversationsToAutoAnswer',\n        'bargeMonitorCoachConversationsToAutoAnswer',\n        'manuallyAnsweredSoftphoneConversationsWithLatePropose'\n    ),\n\n    // eslint-disable-next-line ember/no-observers\n    autoAnswer: observer('allConversationsToAutoAnswer.@each.id', 'pendingSessions.@each.callInfo', function () {\n        run.once(this, '_autoAnswer');\n    }),\n\n    answerSoftphoneConversation(conversationId) {\n        // local helper method to log events creating a closure around sessionId and conversationId\n        let sessionId;\n        const logIt = (info, level = 'info') => {\n            let remoteData = {};\n            if (typeof info === 'string') {\n                remoteData.message = info;\n            }\n            remoteData.kind = 'webrtcManager';\n            remoteData.sessionId = sessionId;\n            remoteData.conversationId = conversationId;\n            this.logger[level](remoteData.message, { remoteData });\n        };\n\n        if (!conversationId) {\n            this.logger.error('Cannot answerSoftphoneConversation without conversationId');\n            return;\n        }\n\n        const sessionToAccept = this.pendingSessions.findBy('callInfo.conversationId', conversationId);\n        if (!sessionToAccept) {\n            return reject(new Error('Tried to answer a softphone conversation with no pending session'));\n        }\n\n        sessionId = sessionToAccept.id;\n        if (sessionToAccept.accepted) {\n            logIt('session has already been answered, but trying again');\n        }\n\n        const activeConversation = this.activeConversation;\n        if (activeConversation && activeConversation.get('isCollaborate')) {\n            this.endConversation({\n                jid: activeConversation.get('jid'),\n                conversationId: activeConversation.get('conversationId')\n            });\n        }\n\n        let conversation = this.get('phone.conversations').findBy('id', conversationId);\n        if (conversation) {\n            conversation.set('acceptedByClient', true);\n        }\n\n        sessionToAccept.accepted = true;\n\n        logIt('sending proceed');\n        this._logConnectionDetails(sessionId);\n        const webrtcSessions = this.webrtcSessions;\n        if (webrtcSessions) {\n            return webrtcSessions.acceptRtcSession(sessionId).then(() => logIt('sent proceed'));\n        } else {\n            logIt('streaming client not connected, cannot send proceed');\n        }\n    },\n\n    // ******************************************************\n    // Screen Recording conversation APIs\n    // ******************************************************\n\n    screenRecordingConversations: filterBy(\n        'conversations',\n        'conversationType',\n        webrtcConversationTypes.ENGAGE_SCREEN_RECORDING\n    ),\n\n    _startScreenRecordingTask: task(function* (screenRecordingConversation, conversation) {\n        try {\n            const conversationId = conversation.get('conversationId');\n\n            const data = JSON.stringify({\n                participantJid: this.get('session.person.jid'),\n                roomId: conversation.get('jid'),\n                conversationId: conversationId\n            });\n\n            this.createPendingSession(conversation.get('jid'), {\n                autoAnswer: true,\n                id: -1,\n                conversationType: webrtcConversationTypes.ENGAGE_SCREEN_RECORDING\n            });\n            yield this.ajax.post(`/platform/api/v2/recordings/screensessions/acknowledge`, { data });\n        } catch (err) {\n            this.endConversation({ conversation });\n            const conversationId = screenRecordingConversation.get('id');\n            this.logger.error('failed to start screenrecording task', { remoteData: { err, conversationId } });\n        }\n    }),\n\n    restartScreenTrackOnFailure(webrtcConversation, track, screenId, mid, transceiver, attempts = 1) {\n        const conversationId = webrtcConversation.get('conversationId');\n\n        track.addEventListener('ended', () => {\n            const shouldRestartTrack = !!this.get(\n                'conversationService.conversationsWithActiveScreenRecordingForCurrentUser'\n            ).findBy('id', webrtcConversation.get('conversationId'));\n\n            if (!shouldRestartTrack) {\n                this.logger.info('Conversation not expecting a screen recording, not restarting screen stream', {\n                    remoteData: { screenId, conversationId }\n                });\n                return;\n            }\n\n            if (attempts >= maxScreenRetryAttempts) {\n                this.logger.info('Retry count limit for screen recording', {\n                    remoteData: { screenId, conversationId }\n                });\n                return;\n            }\n\n            return this.getVideoTrackForScreenId(screenId, conversationId).then(newTrack => {\n                if (!newTrack) {\n                    this.logger.info('No track received for screen', { remoteData: { screenId, conversationId } });\n                    return;\n                }\n\n                this.restartScreenTrackOnFailure(webrtcConversation, newTrack, screenId, mid, attempts + 1);\n\n                const session = webrtcConversation.get('session');\n                if (!session) {\n                    this.logger.error('No session for the replacement screen track', {\n                        remoteData: { conversationId: webrtcConversation.get('conversationId'), screenId }\n                    });\n                }\n\n                const streamRef = webrtcConversation.get('screenRecordingStream');\n                if (!streamRef) {\n                    this.logger.error('No stream to store the replacement screenTrack', {\n                        remoteData: { conversationId: webrtcConversation.get('conversationId'), screenId }\n                    });\n                }\n\n                if (!session || !streamRef) {\n                    this.logger.info('Cleaning up replacement track', {\n                        remoteData: { conversationId: webrtcConversation.get('conversationId'), screenId }\n                    });\n                    newTrack.stop();\n                }\n\n                streamRef.addTrack(newTrack);\n                return transceiver.sender.replaceTrack(newTrack);\n            });\n        });\n    },\n\n    _debugScreenRecordingInBrowser() {\n        const localMedia = new LocalMedia();\n        this.set('debugScreenSelectionOpen', true);\n        return new Promise((resolve, reject) => {\n            this.set('debugScreenSelectionOpen', false);\n            localMedia.startScreenShare((err, stream) => {\n                if (err) {\n                    reject(err);\n                }\n\n                resolve(stream);\n            });\n        });\n    },\n\n    // ******************************************************\n    // Video conversation APIs\n    // ******************************************************\n\n    _handleIncomingVideoSessionRequest(sessionInfo, roomJid, isIncoming) {\n        const { fromJid, sessionId, conversationId } = sessionInfo;\n\n        // find pending conversation and attach conversationId to it or create a new pending session\n        const existingSession = this.pendingSessions.findBy('roomJid', roomJid);\n        if (existingSession) {\n            if (existingSession.get('id') === -1) {\n                existingSession.set('id', sessionId);\n            }\n            existingSession.set('callInfo', existingSession.get('callInfo') || EmberObject.create());\n            existingSession.set('callInfo.conversationId', conversationId);\n        } else {\n            this.createPendingSession(fromJid, {\n                id: sessionId,\n                isIncoming,\n                callInfo: {\n                    conversationId\n                }\n            });\n        }\n\n        if (!isScreenRecordingJid(roomJid)) {\n            this.get('streaming.connection').setActive(roomJid);\n\n            this.chat.loadRoomAndUser(roomJid, fromJid).then(({ room, person }) => {\n                if (room.isOneToOne()) {\n                    this.sendVideoInvitation(room, person, sessionInfo.sessionId);\n                }\n            });\n        }\n    },\n\n    answerVideoByInvitation(invitation) {\n        this.get('application.hostedContext').sendEventToDesktop(EVENTS.WEBRTC_CONNECTION_ANSWERED, invitation);\n\n        this.incomingInvitations.removeObject(invitation);\n        this.answerVideo({ room: invitation.get('room'), sessionId: invitation.get('sessionId') });\n    },\n\n    answerVideoConversation(conversation, sessionId) {\n        return this.chat.getChatRoom(conversation.get('jid')).then(room => {\n            this.answerVideo({ room, sessionId });\n        });\n    },\n\n    answerVideo({ room, sessionId }) {\n        if (!this.videoCallCapable) {\n            this.logger.error('Video error: attempted answer when not videoCallCapable');\n            return;\n        }\n\n        if (!this.isV2(room)) {\n            if (this.get('activeRoom.showingVideo') && this.activeRoom !== room) {\n                this.set('activeRoom.showingVideo', false);\n            }\n\n            return;\n        }\n\n        // if video is active in another room, leave all video sessions and turn off video in that room\n        const activeConversation = this.activeConversation;\n        if (\n            activeConversation &&\n            room.get('jid') !== activeConversation.get('jid') &&\n            activeConversation.get('isCollaborate')\n        ) {\n            this.endConversation({\n                jid: this.get('activeConversation.jid'),\n                conversationId: activeConversation.get('conversationId')\n            });\n        }\n\n        if (!sessionId) {\n            this.logger.error('tried to answer video without a valid sessionId');\n            return;\n        }\n\n        this._logConnectionDetails(sessionId);\n\n        this.logger.info('sending jingle proceed', { remoteData: { sessionId } });\n        if (this.shouldUseHawkByJid(room.get('jid'))) {\n            this.webrtcSessions.acceptRtcSession(sessionId);\n        } else {\n            this.get('streaming.connection').acceptRtcSession(sessionId);\n        }\n    },\n\n    declineVideo(invitation) {\n        this.get('application.hostedContext').sendEventToDesktop(EVENTS.WEBRTC_CONNECTION_DECLINED, invitation);\n\n        this.incomingInvitations.removeObject(invitation);\n\n        const sessionId = invitation.get('sessionId');\n        if (sessionId) {\n            this.webrtcSessions.rejectRtcSession(invitation.get('sessionId'));\n            const cancelPendingSession = this._cancelPendingSession.bind(this);\n            const pendingSessions = this.pendingSessions.filter(s => s.id, sessionId);\n            pendingSessions.forEach(cancelPendingSession);\n        }\n\n        this.chat.sendVideoNotificationWidget(invitation.room, 'reject');\n        invitation.room.set('invited', false);\n    },\n\n    handleVideoInvitation(activeRoom) {\n        const invitations = this.incomingInvitations;\n\n        if (invitations && invitations.length) {\n            invitations.forEach(invitation => {\n                if (get(invitation, 'room') === activeRoom) {\n                    this.answerVideoByInvitation(invitation);\n                } else {\n                    this.declineVideo(invitation);\n                }\n            });\n        }\n        this.trigger('videoJoin', activeRoom);\n    },\n\n    cancelInvitationBySession(sessionId) {\n        const existing = this.incomingInvitations.findBy('sessionId', sessionId);\n        const pending = this.pendingSessions.findBy('id', sessionId);\n        if (existing) {\n            this.incomingInvitations.removeObject(existing);\n        }\n        if (pending) {\n            this._cancelPendingSession(pending);\n            this._checkRequestReconnect();\n        }\n    },\n\n    startVideoConversation(conversation, room, localMedia) {\n        this.chat.syncPendingRoomWithStreamingService(room).then(() => {\n            conversation.set('room', room);\n            conversation.set('preparingToJoin', false);\n            this.conversations.pushObject(conversation);\n            this.set('activeConversation', conversation);\n            this.set('activeRoom', room);\n            this.joinConversation(conversation, localMedia);\n            this.trigger('videoJoin', room);\n        });\n    },\n\n    prepareVideoCall(jid) {\n        return this.getOrCreateConversation({ jid, create: true }).then(conversation => {\n            if (!conversation.get('hasJoined')) {\n                conversation.set('preparingToJoin', true);\n            }\n            conversation.addLocalParticipant();\n            conversation.set('hasPrepared', true);\n            this.set('activeConversation', conversation);\n            return conversation;\n        });\n    },\n\n    migrateVideoConversationToConference(conversation, newJid) {\n        this.logger.log('migrating to new room', newJid);\n\n        this.showMigratingNotification();\n\n        const joinImmediately = conversation.get('hasJoined');\n        const startVideoMuted = conversation.get('localParticipant.videoMuted');\n        const startAudioMuted = conversation.get('localParticipant.audioMuted');\n\n        if (!conversation.get('ending')) {\n            this.endConversation({ jid: conversation.get('jid') });\n        }\n\n        return this.chat.getChatRoom(newJid).then(room => {\n            room.setProperties({\n                showingVideo: true,\n                joinCallImmediately: joinImmediately,\n                startVideoMuted,\n                startAudioMuted\n            });\n\n            this.chat.changeActiveRoom(room);\n            this.sidebar.openPanel('webrtc');\n        });\n    }\n});\n","/* global RTCRtpTransceiver, RTCRtpReceiver, RTCRtpSender, MediaStreamTrack */\n\nimport { reads } from '@ember/object/computed';\n\nimport { A } from '@ember/array';\nimport Mixin from '@ember/object/mixin';\nimport { on } from '@ember/object/evented';\nimport { run } from '@ember/runloop';\nimport RSVP from 'rsvp';\nimport EmberObject, { computed, observer, get } from '@ember/object';\n\nfunction _extractProperties(obj, properties) {\n    const ret = {};\n    properties.forEach(prop => {\n        ret[prop] = obj[prop];\n    });\n\n    return ret;\n}\n\nexport default Mixin.create({\n    recording: false,\n    snapshots: null,\n    recordingTimeout: null,\n    recordingDurationTimeout: null,\n    options: null,\n    clientInfo: null,\n    debugInfos: null,\n    debugTimeout: null,\n\n    init() {\n        this._super(...arguments);\n        this.set('snapshots', A());\n    },\n\n    hideAudioTracks: computed('options.audio', function () {\n        return this.get('options.audio') === false;\n    }),\n\n    hideVideoTracks: computed('options.video', function () {\n        return this.get('options.video') === false;\n    }),\n\n    participants: reads('activeConversation.participants'),\n\n    hasParticipants: computed('participants.[]', function () {\n        return this.get('participants.length');\n    }),\n\n    debugWebrtc(options) {\n        this._cleanup();\n\n        options = options || {};\n        this.set('options', options);\n\n        console.log('starting webrtc-debugger');\n        if (window.Orgspan) {\n            window.Orgspan.webrtcDebugger = this;\n        }\n\n        const browserInfo = navigator.userAgent;\n        let browserInfoPrefix = 'Browser: ';\n        const hostedContext = this.get('applicationService.hostedContext');\n        if (hostedContext && hostedContext.isHosted()) {\n            browserInfoPrefix = 'Desktop App: ';\n        }\n        this.set('clientInfo', browserInfoPrefix + browserInfo);\n\n        if (!this.activeConversation) {\n            this.logger.warn('No active webrtc conversation to debug');\n            if (options.json) {\n                return RSVP.resolve({});\n            }\n        }\n\n        this._buildInfos();\n\n        if (options.json) {\n            const deferred = RSVP.defer();\n            this.set('deferred', deferred);\n            return deferred.promise;\n        } else if (options.record) {\n            const deferred = RSVP.defer();\n\n            this.set('recording', true);\n            this.set(\n                'recordingDurationTimeout',\n                run.later(() => {\n                    this.set('recording', false);\n                    this.logger.log('recorded snapshots', this.snapshots);\n                    deferred.resolve(this.snapshots);\n                }, options.record * 1000)\n            );\n            return deferred.promise;\n        }\n        this.set('showDebugModal', true);\n        return RSVP.resolve();\n    },\n\n    _cleanup: on('willDestroy', function () {\n        console.log('cleaning up debug info loop');\n        this.set('debugInfos', A());\n        run.cancel(this.debugTimeout);\n        run.cancel(this.recordingTimeout);\n        this.set('recording', false);\n        console.log('cleanup complete');\n    }),\n\n    _cleanupDebugInfo(debugInfo) {\n        debugInfo.setProperties({\n            sessionInfos: A(),\n            streamInfos: A(),\n            trackInfos: A()\n        });\n    },\n\n    _addColorToParticipants(conversationInfo) {\n        conversationInfo.get('webrtcConversation.participants').forEach(p => {\n            if (!p.get('colorHex')) {\n                this.rerollParticipantColor(p);\n            }\n\n            const streamInfo = conversationInfo.get('streamInfos').find(i => i.streamId === p.get('cameraStream.id'));\n            if (streamInfo) {\n                streamInfo.set('participant', p);\n            }\n        });\n    },\n\n    _associateStreamWithParticipant(conversationInfo) {\n        conversationInfo.get('webrtcConversation.participants').forEach(p => {\n            const streamInfos = conversationInfo.get('streamInfos').filter(s => {\n                return s.get('streamId') === p.get('cameraStream.id') || s.get('streamId') === p.get('screenStream.id');\n            });\n            streamInfos.forEach(stream => {\n                stream.set('participant', p);\n            });\n        });\n    },\n\n    _stringifyMedia(key, value) {\n        if (value instanceof RTCRtpTransceiver) {\n            return _extractProperties(value, ['currentDirection', 'direction', 'mid', 'sender', 'receiver']);\n        } else if (value instanceof RTCRtpReceiver || value instanceof RTCRtpSender) {\n            return _extractProperties(value, ['track']);\n        } else if (value instanceof MediaStreamTrack) {\n            return _extractProperties(value, ['id', 'label', 'kind', 'enabled', 'muted', 'readystate']);\n        }\n\n        return value;\n    },\n\n    createSnapshot() {\n        const snapshots = [];\n        this.conversations.forEach(conversation => {\n            let info = this.debugInfos.find(dInfo => dInfo.get('webrtcConversation') === conversation);\n\n            const participants = conversation.get('participants').map(p => {\n                return p.getProperties(\n                    'person.name',\n                    'person.id',\n                    'inLastN',\n                    'audioMuted',\n                    'videoMuted',\n                    'local',\n                    'person.presence'\n                );\n            });\n            const sessions = JSON.parse(JSON.stringify(info.get('sessionInfos')));\n            const streamString = JSON.stringify(info.get('streamInfos'), (key, value) => {\n                if (key === 'participant') {\n                    return participants.find(p => get(p, 'person.id') === value.get('person._id'));\n                }\n                return value;\n            });\n            const streams = JSON.parse(streamString);\n\n            const transceivers = [];\n            conversation.get('sessions').forEach(session => {\n                transceivers.push(\n                    ...JSON.parse(\n                        JSON.stringify(this.getNativePeerConnection(session).getTransceivers(), this._stringifyMedia)\n                    )\n                );\n            });\n\n            snapshots.push({\n                type: 'webrtcDmp',\n                roomJid: conversation.get('jid'),\n                date: new Date(),\n                clientInfo: this.clientInfo,\n                conversationId: conversation.get('conversationId'),\n                transceivers,\n                participants,\n                sessions,\n                streams,\n                speakers: conversation.get('rawSpeakers'),\n                trackOwners: conversation.get('trackOwners'),\n                dominantTracks:\n                    conversation.get('dominantStream') &&\n                    JSON.parse(JSON.stringify(conversation.get('dominantStream').getTracks(), this._stringifyMedia)),\n                camera: this.defaultCamera,\n                microphone: this.defaultMicrophone,\n                outputDevice: this.defaultOutputDevice\n            });\n        });\n\n        return snapshots;\n    },\n\n    _recordSnapshots() {\n        const recordingTimeout = run.later(() => {\n            this.snapshots.pushObject(this.createSnapshot());\n            this._recordSnapshots();\n        }, 500);\n\n        this.set('recordingTimeout', recordingTimeout);\n    },\n\n    // eslint-disable-next-line ember/no-observers\n    _handleRecording: observer('recording', function () {\n        if (this.recording) {\n            this.set('snapshots', A());\n            this._recordSnapshots();\n        } else {\n            run.cancel(this.recordingTimeout);\n            this.logger.log('snapshots', this.snapshots);\n        }\n    }),\n\n    rerollParticipantColor(participant) {\n        const maxHexDecimalVal = 16777215;\n        const hex = Math.floor(Math.random() * maxHexDecimalVal).toString(16);\n        participant.set('colorHex', '#' + hex);\n    },\n\n    getConversationDebugInfo(webrtcConversation) {\n        let info = this.debugInfos.find(dInfo => dInfo.get('webrtcConversation') === webrtcConversation);\n\n        if (!info) {\n            info = EmberObject.create({\n                webrtcConversation: webrtcConversation,\n                sessionInfos: A(),\n                streamInfos: A()\n            });\n\n            this.debugInfos.pushObject(info);\n        }\n\n        return info;\n    },\n\n    _buildInfos() {\n        this.debugInfos.forEach(debugInfo => {\n            if (!this.conversations.some(conversation => conversation === debugInfo.get('webrtcConversation'))) {\n                this._cleanupDebugInfo(debugInfo);\n            }\n        });\n\n        this.conversations.forEach(webrtcConversation => {\n            const conversationInfo = this.getConversationDebugInfo(webrtcConversation);\n            const sessionInfos = conversationInfo.get('sessionInfos');\n            const streamInfos = conversationInfo.get('streamInfos');\n\n            const activeSessions = webrtcConversation.get('sessions');\n\n            // prune old sessions and streams belonging to those sessions\n            sessionInfos.forEach(sessionInfo => {\n                if (!activeSessions.any(s => s.sid === sessionInfo.get('sid'))) {\n                    sessionInfos.removeObject(sessionInfo);\n\n                    const streamInfosToRemove = streamInfos.filter(stream => stream.sid === sessionInfo.get('sid'));\n\n                    streamInfos.removeObjects(streamInfosToRemove);\n                }\n            });\n\n            if (webrtcConversation.get('localMedia')) {\n                this._addUpdateStreamInfos(streamInfos, webrtcConversation.get('localMedia.localStreams'), 'local');\n            }\n\n            // add/update sessions and their streams\n            activeSessions.forEach(activeSession => {\n                let sessionInfo = sessionInfos.findBy('sid', activeSession.sid);\n\n                if (!sessionInfo) {\n                    sessionInfo = EmberObject.create({\n                        sid: activeSession.sid,\n                        peerID: activeSession.peerID,\n                        isInitiator: activeSession.isInitiator\n                    });\n                    sessionInfos.addObject(sessionInfo);\n                }\n\n                sessionInfo.setProperties({\n                    connectionState: activeSession._connectionState,\n                    state: activeSession.state,\n                    ended: activeSession.ended\n                });\n\n                this._addUpdateStreamInfos(streamInfos, activeSession.streams, activeSession.sid);\n            });\n\n            this._checkRemoteTracks(conversationInfo);\n            this._addColorToParticipants(conversationInfo);\n            this._associateStreamWithParticipant(conversationInfo);\n        });\n\n        this.set('debugTimeout', run.later(this, this._buildInfos, 500));\n    },\n\n    _addUpdateStreamInfos(streamInfos, streams, sid) {\n        const existingStreamInfosForSession = A(streamInfos).filterBy('sid', sid);\n\n        // remove old stream info that are no longer valid\n        const existingToRemove = existingStreamInfosForSession.filter(existing => {\n            return !streams.any(stream => existing.get('streamId') === stream.id);\n        });\n        streamInfos.removeObjects(existingToRemove);\n\n        // add/update streamInfos\n        streams.forEach(stream => {\n            let streamInfo = existingStreamInfosForSession.find(s => s.streamId === stream.id);\n\n            if (!streamInfo) {\n                streamInfo = EmberObject.create({\n                    sid: sid,\n                    trackInfos: A(),\n                    streamId: stream.id\n                });\n                streamInfos.addObject(streamInfo);\n            }\n\n            streamInfo.setProperties({\n                active: stream.active,\n                hasVideo: stream.getVideoTracks().length > 0,\n                hasAudio: stream.getAudioTracks().length > 0\n            });\n\n            let tracks = stream.getTracks();\n            if (this.hideAudioTracks) {\n                tracks = tracks.filter(t => t.kind === 'video');\n            }\n            if (this.hideVideoTracks) {\n                tracks = tracks.filter(t => t.kind === 'audio');\n            }\n            this._buildTrackInfo(streamInfo, tracks);\n        });\n    },\n\n    _buildTrackInfo(streamInfo, tracks) {\n        const trackInfos = streamInfo.get('trackInfos');\n\n        // prune old tracks\n        trackInfos.forEach(trackInfo => {\n            if (!tracks.any(s => s.id === trackInfo.get('trackId'))) {\n                trackInfos.removeObject(trackInfo);\n            }\n        });\n\n        tracks.forEach(track => {\n            let trackInfo = trackInfos.findBy('trackId', track.id);\n\n            if (!trackInfo) {\n                trackInfo = EmberObject.create({\n                    trackId: track.id,\n                    kind: track.kind,\n                    bytesReceived: 0,\n                    local: streamInfo.get('sid') === 'local'\n                });\n                trackInfos.addObject(trackInfo);\n            }\n\n            trackInfo.setProperties({\n                enabled: track.enabled,\n                muted: track.muted,\n                state: track.readyState\n            });\n        });\n    },\n\n    _checkRemoteTracks(conversationInfo) {\n        conversationInfo.get('webrtcConversation.sessions').forEach(session => {\n            session.pc.getStats((err, stats) => {\n                this._processStats(err, stats, conversationInfo);\n            });\n        });\n    },\n\n    _processStats(err, stats, conversationInfo) {\n        if (err) {\n            console.warn('Error reading stats for debug', { err });\n        }\n\n        const trackStats = Array.from(stats.values()).filter(s => s.type === 'ssrc');\n\n        conversationInfo.get('streamInfos').forEach(streamInfo => {\n            if (streamInfo.get('sid') !== 'local') {\n                streamInfo.get('trackInfos').forEach(trackInfo => {\n                    const stat = trackStats.find(s => s.googTrackId === trackInfo.get('trackId'));\n\n                    if (stat) {\n                        const received = parseInt(stat.bytesReceived);\n                        trackInfo.set('activelyReceiving', received > trackInfo.get('bytesReceived'));\n                        trackInfo.set('bytesReceived', received);\n                    } else {\n                        trackInfo.set('activelyReceiving', false);\n                    }\n                });\n            }\n        });\n\n        if (this.get('options.json')) {\n            this.deferred.resolve(this.createSnapshot());\n        }\n    }\n});\n","import { inject as service } from '@ember/service';\nimport Mixin from '@ember/object/mixin';\nimport RSVP from 'rsvp';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport webrtcConversationTypes from 'web-directory/utils/webrtc-conversation-types';\nimport StreamingService from 'web-directory/services/streaming';\nimport uuid from 'web-directory/utils/uuid';\nimport { isSoftphoneJid, compareJids, isScreenRecordingJid, isAcdJid } from 'web-directory/utils/jid-helpers';\n\nconst { streamingEvent } = StreamingService;\n\nexport default Mixin.create(LoggerMixin, {\n    chat: service(),\n    session: service(),\n    streaming: service(),\n    webrtcSdk: service(),\n\n    shouldIgnoreEvent(eventName, fromJid, sessionId) {\n        // volt one to one video\n        if (fromJid.startsWith('peer-')) {\n            this.logger.info('Ignoring jids that start with `peer-`', { remoteData: { fromJid } });\n            return true;\n        }\n\n        // ignore softphone events if we should be using the sdk built into web dir\n        if (isSoftphoneJid(fromJid) && this.get('webrtcSdk.useSdk')) {\n            this.logger.info('ewc: useSdk is enabled', {\n                remoteData: { eventName }\n            });\n            return true;\n        }\n\n        if (isScreenRecordingJid(fromJid)) {\n            this.logger.info('Ignoring screen recording event', {\n                remoteData: { eventName }\n            });\n            return true;\n        }\n\n        if (!isAcdJid(fromJid) && !isSoftphoneJid(fromJid)) {\n            this.logger.info('Ignoring event because it is not ACD or Softphone session', { remoteData: { fromJid } });\n            return true;\n        }\n\n        if (this.disableSoftphone && this.getConversationTypeByJid(fromJid) === webrtcConversationTypes.SOFTPHONE) {\n            this.logger.info(\n                `Running with 'disableSoftphone', ignoring event: '${eventName}' for session: ${sessionId}`\n            );\n            return true;\n        }\n    },\n\n    onV2Connected: streamingEvent('*', 'connected', function () {\n        this.refreshIceServers()\n            .then(iceServers => this.logger.debug('initial iceservers', iceServers))\n            .catch(e => this.logger.error('Failed to fetch initial ice servers', { remoteData: { error: e } }));\n    }),\n\n    // mediaChange is a realtime only event\n    mediaChange: streamingEvent(function (mediaData) {\n        const { room, from, mediaInfo } = mediaData;\n        this.chat.loadRoomAndUser(room, from).then(info => {\n            const { room, person } = info;\n            const hasMedia = mediaInfo.find(function (media) {\n                return media.audio || media.video || media.listener;\n            });\n\n            if (!hasMedia) {\n                person.set('mediaPresence', null);\n                return;\n            }\n\n            if (mediaInfo[0].listener) {\n                mediaInfo[0].msid = `listener_${person.get('id')}`;\n            }\n\n            const existingMedia = person.get('mediaPresence');\n            const mediaPresence = {\n                roomJid: room.get('jid'),\n                media: mediaInfo\n            };\n            const hasMsid = mediaInfo.find(function (media) {\n                return media.msid;\n            });\n\n            const hasExistingMsid =\n                existingMedia &&\n                existingMedia.media.find(function (media) {\n                    return media.msid;\n                });\n\n            if (JSON.stringify(existingMedia) !== JSON.stringify(mediaPresence)) {\n                person.set('mediaPresence', mediaPresence);\n\n                const conversation = this.getConversation({ jid: room.get('jid') });\n                if (mediaInfo[0].listener && conversation && conversation.get('isActive')) {\n                    conversation.checkForListeners();\n                }\n\n                this.get('streaming.connection').setActive(room.get('jid'));\n                // we can't actually connect unless they have an msid, so otherwise don't alert yet\n                if (hasMsid && !hasExistingMsid && person !== this.get('session.person')) {\n                    this.sendVideoInvitation(room, person);\n                }\n            }\n\n            this.trigger('mediaChange', { personId: person.get('id'), media: mediaInfo });\n        });\n    }),\n\n    realtimeRequestReconnect: streamingEvent(null, 'requestReconnect', function (cbFn) {\n        this.requestReconnect(cbFn);\n    }),\n\n    hawkRequestReconnect: streamingEvent('*', 'requestReconnect', function (cbFn) {\n        this.requestReconnect(cbFn);\n    }),\n\n    requestReconnect(cbFn) {\n        if (this.hasActiveOrPendingSessions) {\n            cbFn({ pending: true });\n            return this.set('requestReconnectCallback', () => cbFn({ done: true }));\n        }\n\n        cbFn({ done: true });\n    },\n\n    // realtime only event\n    requestWebrtcDump: streamingEvent(function (requestId) {\n        return this.debugWebrtc({ json: true }).then(snapshot => {\n            snapshot.requestId = requestId;\n            this.logger.info(snapshot);\n        });\n    }),\n\n    // realtime only event\n    upgradeMediaError: streamingEvent(function (error) {\n        this.set('activeRoom.showingVideo', false);\n\n        this.notification.error(null, this.intl.t('ewc.bridgeDownError'));\n\n        this.logger.error('Videobridge unavailable', {\n            kind: 'webrtcEvent',\n            error: error.stack\n        });\n        this.trigger('upgradeMediaError');\n    }),\n\n    realtimeOnCancel: streamingEvent(null, 'cancelIncomingRtcSession', function (sessionId) {\n        this.logger.debug('webrtcEvent realtimeOnCancel');\n        this.onCancel(sessionId);\n    }),\n\n    hawkOnCancel: streamingEvent('webrtcSessions', 'cancelIncomingRtcSession', function (sessionId) {\n        const pending = this.pendingSessions.findBy('id', sessionId);\n        this.logger.debug('webrtcEvent hawkOnCancel', {\n            remoteData: { sid: sessionId, conversationId: pending ? pending.conversationId : null }\n        });\n        this.onCancel(sessionId);\n    }),\n\n    onCancel: function (sessionId) {\n        this.handleMissedCall(sessionId);\n        this.cancelInvitationBySession(sessionId);\n    },\n\n    realtimeOnHandled: streamingEvent(null, 'handledIncomingRtcSession', function (sessionId) {\n        this.logger.debug('webrtcEvent realtimeOnHandled');\n        const pending = this.pendingSessions.findBy('id', sessionId);\n        if (pending) {\n            if (pending.conversationType && this.shouldUseHawkByConversationType(pending.conversationType)) {\n                return;\n            }\n            if (pending.callInfo && this.shouldUseHawkByConversationType(webrtcConversationTypes.SOFTPHONE)) {\n                return;\n            }\n            if (pending.roomJid && this.shouldUseHawkByJid(pending.roomJid)) {\n                return;\n            }\n        }\n        this.onHandled(sessionId);\n    }),\n\n    hawkOnHandled: streamingEvent('webrtcSessions', 'handledIncomingRtcSession', function (sessionId) {\n        const pending = this.pendingSessions.findBy('id', sessionId);\n        if (pending) {\n            this.logger.debug('webrtcEvent hawkOnHandled', {\n                remoteData: { sid: sessionId, conversationId: pending.conversationId }\n            });\n            if (pending.conversationType && !this.shouldUseHawkByConversationType(pending.conversationType)) {\n                return;\n            }\n            if (pending.callInfo && !this.shouldUseHawkByConversationType(webrtcConversationTypes.SOFTPHONE)) {\n                return;\n            }\n            if (pending.roomJid && !this.shouldUseHawkByJid(pending.roomJid)) {\n                return;\n            }\n        }\n        this.onHandled(sessionId);\n    }),\n\n    onHandled: function (sessionId) {\n        this.cancelInvitationBySession(sessionId);\n    },\n\n    _realtimeOnPropose: streamingEvent(null, 'requestIncomingRtcSession', function (sessionInfo) {\n        this.logger.info('Incoming propose from realtime', { remoteData: { sid: sessionInfo.sessionId } });\n        const jid = this._getSimpleJid(sessionInfo.fromJid);\n        if (!this.shouldUseHawkByJid(jid)) {\n            this._onPropose(sessionInfo);\n            const webrtcSessions = this.webrtcSessions;\n            if (webrtcSessions) {\n                webrtcSessions.rejectRtcSession(sessionInfo.sessionId, true); // tell hawk to ignore this session entirely\n            }\n        } else {\n            this.get('streaming.connection').rejectRtcSession(sessionInfo.sessionId, true); // tell realtime to ignore this session entirely\n        }\n    }),\n\n    _hawkOnPropose: streamingEvent('webrtcSessions', 'requestIncomingRtcSession', function (sessionInfo) {\n        this.logger.info('Incoming propose from hawk', {\n            remoteData: { sid: sessionInfo.sessionId, conversationId: sessionInfo.conversationId }\n        });\n        const jid = this._getSimpleJid(sessionInfo.fromJid);\n        if (this.shouldUseHawkByJid(jid)) {\n            this._onPropose(sessionInfo);\n        } else {\n            const webrtcSessions = this.webrtcSessions;\n            if (webrtcSessions) {\n                webrtcSessions.rejectRtcSession(sessionInfo.sessionId, true); // tell hawk to ignore this session entirely\n            }\n        }\n    }),\n\n    _onPropose: function (sessionInfo) {\n        const { roomJid, fromJid, conversationId, sessionId, autoAnswer } = sessionInfo;\n        if (this.shouldIgnoreEvent('propose', fromJid, sessionId)) {\n            return;\n        }\n\n        this.logger.info('handling propose', { remoteData: { sessionId, conversationId, autoAnswer } });\n\n        const isRequestFromGjoll = fromJid.match(/@gjoll/);\n        if (!conversationId && isRequestFromGjoll && sessionId) {\n            if (!this.get('webrtc.phone.station.persistentConnection')) {\n                this.logger.warn(\n                    'Received rtc session from gjoll without a conversationId when not configured for persistent connection',\n                    {\n                        remoteData: {\n                            sessionId,\n                            conversationId\n                        }\n                    }\n                );\n            }\n            const tmpConversationId = uuid.generate();\n            this.logger.info(\n                'propose has no conversationId but is from the gateway, assuming request for persistent connection',\n                {\n                    remoteData: {\n                        sessionId,\n                        tmpConversationId\n                    }\n                }\n            );\n            this.createPendingSession(null, {\n                id: sessionId,\n                callInfo: {\n                    conversationId: tmpConversationId\n                }\n            });\n            return this.answerSoftphoneConversation(tmpConversationId);\n        }\n        if (conversationId && isRequestFromGjoll && sessionId) {\n            return this._handleIncomingWebrtcSoftphoneRequest(sessionInfo);\n        }\n\n        if (!isSoftphoneJid(roomJid)) {\n            this._handleIncomingVideoSessionRequest(sessionInfo, roomJid);\n        }\n\n        if (isScreenRecordingJid(roomJid) && this.canDoScreenRecording()) {\n            this.logger.info('sending proceed', {\n                remoteData: {\n                    sessionId,\n                    conversationId\n                }\n            });\n            return this.webrtcSessions.acceptRtcSession(sessionId).then(() => {\n                this.logger.info('proceed sent', {\n                    remoteData: {\n                        sessionId,\n                        conversationId\n                    }\n                });\n            });\n        }\n    },\n\n    hawkIncomingSession: streamingEvent('webrtcSessions', 'incomingRtcSession', function (session) {\n        this.logger.info('Incoming session from hawk', {\n            remoteData: { sid: session.sid, conversationId: session.conversationId }\n        });\n        const jid = this._getSimpleJid(session.peerID);\n        if (this.shouldUseHawkByJid(jid)) {\n            this.handleIncomingSession(session);\n            this.webrtcSessions.rtcSessionAccepted(session.sid);\n        } else {\n            session.end('alternative-session', true); // end silently\n            const webrtcSessions = this.webrtcSessions;\n            if (webrtcSessions) {\n                webrtcSessions.rejectRtcSession(session.sid, true); // tell hawk to ignore this session entirely\n            }\n        }\n    }),\n\n    realtimeIncomingSession: streamingEvent(null, 'incomingRtcSession', function (session) {\n        this.logger.info('Incoming session from realtime', { remoteData: { sid: session.sid } });\n        const jid = this._getSimpleJid(session.peerID);\n        if (!this.shouldUseHawkByJid(jid)) {\n            this.handleIncomingSession(session);\n        } else {\n            session.end('alternative-session', true); // end silently\n            this.get('streaming.connection').rejectRtcSession(session.sid, true); // tell realtime to ignore this session entirely\n        }\n    }),\n\n    handleIncomingSession(session) {\n        const jid = this._getSimpleJid(session.peerID);\n\n        if (this.shouldIgnoreEvent('session-init', jid, session.sid)) {\n            return;\n        }\n\n        this.logger.info('Handling incoming session', {\n            remoteData: { sid: session.sid, conversationId: session.conversationId }\n        });\n        const pendingSessions = this.pendingSessions;\n        let pendingSession = pendingSessions.findBy('id', session.sid);\n        let acceptImmediately = false;\n        let conversationId = null;\n\n        if (isScreenRecordingJid(jid) && pendingSessions.findBy('roomJid', jid)) {\n            pendingSession = pendingSessions.findBy('roomJid', jid);\n            pendingSession.timeoutTask.cancel();\n            pendingSessions.removeObject(pendingSession);\n            acceptImmediately = true;\n        } else if (!pendingSession && pendingSessions.length === 1 && pendingSessions[0].requestForIncoming === true) {\n            // we have an incoming session, but we also have a pending outgoing - this was our request to jitsi or\n            // the edge for a webrtc session.\n            // grab the session request call info and attach it to the new session\n            session.callInfo = pendingSessions[0].callInfo;\n\n            if (session.callInfo) {\n                conversationId = pendingSessions[0].callInfo.conversationId;\n                const conversation = this.get('phone.conversations').findBy('id', conversationId);\n                if (conversation) {\n                    conversation.set('webrtcSession', session);\n                }\n            }\n            pendingSessions[0].timeoutTask.cancel();\n            pendingSessions.removeAt(0);\n            acceptImmediately = true;\n        } else if (pendingSession && !pendingSession.isIncoming) {\n            if (pendingSession.callInfo && pendingSession.callInfo.conversationId) {\n                session.callInfo = pendingSession.callInfo;\n                conversationId = pendingSession.callInfo.conversationId;\n\n                const conversation = this.get('phone.conversations').findBy('id', conversationId);\n                if (conversation) {\n                    conversation.set('webrtcSession', session);\n                    conversation.set('conversationId', conversationId);\n                }\n            } else {\n                this.logger.warn('Got an incoming session for a pending outgoing session - conflict warning');\n            }\n            acceptImmediately = true;\n            pendingSession.timeoutTask.cancel();\n        }\n\n        if (pendingSession) {\n            pendingSessions.removeObject(pendingSession);\n        }\n\n        if (conversationId) {\n            this.logger.info('processing incoming session for conversation', {\n                remoteData: {\n                    sid: session.sid,\n                    conversationId\n                }\n            });\n        }\n\n        let conversation;\n        let screenMetaData;\n        return this.getOrCreateConversation({ jid, conversationId, create: true })\n            .then(c => {\n                conversation = c;\n                conversationId = conversationId || c.get('conversationId');\n\n                if (conversation.get('conversationType') === webrtcConversationTypes.ENGAGE_SCREENSHARE) {\n                    return;\n                }\n\n                if (conversation.get('conversationType') === webrtcConversationTypes.ENGAGE_SCREEN_RECORDING) {\n                    // this is screenRecordingViaApi and we need create media now\n                    if (!pendingSession.stream) {\n                        return this.getScreenRecordingMedia(conversationId).then(({ stream, metas }) => {\n                            conversation.set('screenRecordingStream', stream);\n\n                            if (!metas.length) {\n                                this.logger.error('No metadata found for screen information', {\n                                    remoteData: { conversationId }\n                                });\n                                return;\n                            }\n\n                            screenMetaData = metas;\n                        });\n                    }\n                } else if (conversationId) {\n                    const existingMedia = pendingSession ? pendingSession.media || pendingSession.stream : null;\n                    let promise = RSVP.resolve(existingMedia);\n\n                    if (!conversation.get('conversationType')) {\n                        conversation.set('conversationType', webrtcConversationTypes.SOFTPHONE);\n                    }\n\n                    if (!existingMedia) {\n                        this.logger.info('creating user media', { remoteData: { conversationId } });\n\n                        promise = this.createMedia({ requestVideo: false })\n                            .catch(err => {\n                                pendingSession.createMediaError = err;\n                                this.notification.error(null, this.intl.t('ewc.failedToStartMedia'));\n\n                                err.sessionId = session.sid;\n                                err.conversationId = conversationId;\n                                this.logger.error('error creating media', { remoteData: { err, conversationId } });\n\n                                return RSVP.reject(err);\n                            })\n                            .then(m => {\n                                this.logger.info('media created', { remoteData: { conversationId } });\n                                return m;\n                            });\n                    }\n\n                    return promise.then(media => {\n                        conversation.addLocalParticipant();\n                        conversation.setLocalMedia(media);\n                    });\n                }\n            })\n            .then(() => {\n                return conversation.addSession(session, acceptImmediately || conversation.get('hasJoined')).then(() => {\n                    if (conversation.get('conversationType') === webrtcConversationTypes.ENGAGE_SCREEN_RECORDING) {\n                        if (!this.screenRecordingViaApi) {\n                            return;\n                        }\n\n                        const stream = conversation.get('screenRecordingStream');\n\n                        stream.getTracks().forEach(track => {\n                            const meta = screenMetaData.find(meta => meta.trackId === track.id);\n\n                            const transceiver = conversation\n                                .getNativePeerConnection(session)\n                                .getTransceivers()\n                                .find(t => t.sender.track && t.sender.track.id === track.id);\n\n                            if (!transceiver) {\n                                this.logger.error('Failed to find transceiver for screenTrack', {\n                                    remoteData: {\n                                        conversationId: conversation.get('conversationId'),\n                                        trackId: track.id\n                                    }\n                                });\n                                return;\n                            }\n\n                            // TODO: when public api has been fixed:\n                            // remove the _trackId property, don't modify the trackId property\n                            meta._trackId = meta.trackId;\n                            meta.mid = meta.trackId = transceiver.mid;\n                            this.restartScreenTrackOnFailure(conversation, track, meta.screenId, meta.mid, transceiver);\n                        });\n\n                        const data = JSON.stringify({\n                            participantJid: this.get('session.person.jid'),\n                            metaData: screenMetaData,\n                            roomId: conversation.get('jid'),\n                            conversationId: conversationId\n                        });\n\n                        return this.ajax.post(`/platform/api/v2/recordings/screensessions/metadata`, {\n                            data,\n                            dataType: 'text'\n                        });\n                    }\n                });\n            })\n            .then(() => {\n                if (pendingSession && !pendingSession.callInfo && !conversation.get('isScreenRecording')) {\n                    this.sidebar.openPanel('webrtc');\n                }\n            })\n            .catch(err => {\n                this.logger.error('Error from getOrCreateConversation when handling incoming session', {\n                    remoteData: { err, session: session.sid, conversationId }\n                });\n            });\n    },\n\n    realtimeOutgoingRtcSession: streamingEvent(null, 'outgoingRtcSession', function (session) {\n        if (!this.shouldUseHawkByJid(session.jid)) {\n            this.outgoingRtcSession(session);\n        }\n    }),\n\n    hawkOutgoingRtcSession: streamingEvent('webrtcSessions', 'outgoingRtcSession', function (session) {\n        if (this.shouldUseHawkByJid(session.jid)) {\n            this.outgoingRtcSession(session);\n        }\n    }),\n\n    outgoingRtcSession(session) {\n        this.logger.info('outgoing rtc session');\n        const pendingSessions = this.pendingSessions;\n        const pendingSession = pendingSessions.findBy('id', session.sid);\n        if (!pendingSession) {\n            this.logger.error('Outgoing jingle session does not match any pending outgoing call');\n            return;\n        }\n        pendingSessions.removeObject(pendingSession);\n\n        const bareJid = this._getSimpleJid(session.peerID);\n\n        const conversation = this.getConversation({ jid: bareJid });\n        conversation.addSession(session);\n    },\n\n    // realtime only for now\n    outgoingRtcSessionRejected: streamingEvent(function (sessionId) {\n        this.logger.info('outgoing rtc session rejected');\n        const pendingSession = this.pendingSessions.findBy('id', sessionId);\n        pendingSession.rejected = true;\n        this._noAnswer(pendingSession);\n    }),\n\n    realtimeOutgoingRtcSessionProceed: streamingEvent(\n        null,\n        'outgoingRtcSessionProceed',\n        function (sessionId, targetJid) {\n            const jid = this._getSimpleJid(targetJid);\n            if (!this.shouldUseHawkByJid(jid)) {\n                this.outgoingRtcSessionProceed(sessionId, targetJid);\n            }\n        }\n    ),\n\n    hawkOutgoingRtcSessionProceed: streamingEvent(\n        'webrtcSessions',\n        'outgoingRtcSessionProceed',\n        function (sessionId, targetJid) {\n            const jid = this._getSimpleJid(targetJid);\n            if (this.shouldUseHawkByJid(jid)) {\n                this.outgoingRtcSessionProceed(sessionId, targetJid, true);\n            }\n        }\n    ),\n\n    outgoingRtcSessionProceed(sessionId, targetJid, useHawk) {\n        this.logger.info('outgoing proceed');\n        const pendingSession = this.pendingSessions.findBy('id', sessionId);\n        if (!pendingSession) {\n            this.logger.error('Got a proceed event for a nonexistant or incorrect session');\n            return;\n        }\n\n        const timeout = pendingSession.timeoutTask;\n        if (timeout) {\n            timeout.cancel();\n        }\n\n        const peerConnectionConstraints = this.peerConnectionConstraints;\n        if (useHawk) {\n            this.webrtcSessions.createRtcSession({\n                jid: targetJid,\n                sid: sessionId,\n                stream: pendingSession.stream,\n                peerConstraints: pendingSession.peerConstraints,\n                peerConnectionConstraints\n            });\n        } else {\n            this.get('streaming.connection').createRtcSession(\n                targetJid,\n                sessionId,\n                pendingSession.stream,\n                pendingSession.peerConstraints,\n                peerConnectionConstraints\n            );\n        }\n    },\n\n    HawkRtcSessionError: streamingEvent('webrtcSessions', 'rtcSessionError', function () {\n        this.rtcSessionError(...arguments);\n    }),\n\n    hawkTraceRtcSession: streamingEvent('webrtcSessions', 'traceRtcSession', function () {\n        this.traceRtcSession(...arguments);\n    }),\n\n    traceRtcSession: streamingEvent(function (level, message, data) {\n        let sid = '';\n        let messageWithoutSession;\n\n        if (typeof message === 'string') {\n            const sessionRegex = /([a-f0-9-]{24,}|[a-f0-9]{16,}): (.+)/;\n            const matches = sessionRegex.exec(message);\n\n            if (matches) {\n                sid = matches[1];\n                messageWithoutSession = matches[2];\n            } else {\n                sid = data;\n            }\n        } else if (message.msg) {\n            data = message;\n            sid = data.sid;\n            message = message.msg;\n            messageWithoutSession = message;\n            delete data.msg;\n        } else {\n            sid = data;\n            messageWithoutSession = message;\n        }\n\n        let conversation = this.get(`sessionConversationMap.${sid}`);\n        let conversationId;\n        let conversationType;\n        let jid;\n        if (conversation) {\n            conversationId = conversation.get('conversationId');\n            conversationType = conversation.get('conversationType');\n            jid = conversation.get('jid');\n        } else {\n            const pendingSessions = this.pendingSessions;\n            if (\n                pendingSessions.length === 1 &&\n                (pendingSessions[0].requestForIncoming || pendingSessions[0].id === sid) &&\n                pendingSessions[0].callInfo\n            ) {\n                conversationId = pendingSessions[0].callInfo.conversationId;\n                conversationType = 'softphone';\n                jid = pendingSessions[0].callInfo.jid;\n            }\n        }\n\n        if (!conversationId) {\n            const conversations = this.conversations;\n            conversation =\n                conversations &&\n                conversations.find(c => {\n                    const knownSessions = c.get('knownSessions');\n                    return knownSessions && knownSessions.includes(sid);\n                });\n            if (conversation) {\n                conversationId = conversation.get('conversationId');\n                conversationType = conversation.get('conversationType');\n                jid = conversation.get('jid');\n            }\n        }\n\n        if (message === 'Unknown session') {\n            level = 'debug';\n        }\n\n        if (messageWithoutSession === 'Discovered new ICE candidate') {\n            level = 'debug'; // override down to debug so it doesn't go to sumo\n        }\n\n        if (messageWithoutSession === 'Processing ice candidate') {\n            // stringified ice candidate log so that selenium can log it\n            this.logger[level](`${messageWithoutSession}: ${data}`);\n            return;\n        }\n\n        this.logger[level](messageWithoutSession, {\n            kind: 'RtcSession Log',\n            jid,\n            conversationId,\n            conversationType,\n            sid,\n            data\n        });\n    }),\n\n    hawkOnIceServers: streamingEvent('webrtcSessions', 'rtcIceServers', function (iceServers) {\n        this.logger.debug('streaming-client ice servers', iceServers);\n        this.set('iceServers', iceServers);\n\n        this.probeNetwork();\n    }),\n\n    // TODO: ft streaming service\n    rtcSessionError: streamingEvent(function (message) {\n        let error;\n        if (typeof message === 'string') {\n            if (message.toLowerCase().indexOf('cannot reject') === 0) {\n                return; // suppress this error during realtime/hawk toggle crossover period\n            }\n            error = new Error(message);\n        } else {\n            error = { kind: 'rtcSessionError', message };\n        }\n        this.logger.error(error.message, { remoteData: { error } });\n    }),\n\n    // TODO: remove when v1 is deprecated\n    videoJoin: streamingEvent(function (videoInfo) {\n        const { from, room } = videoInfo;\n        if (compareJids(from, this.get('session.person.jid'))) {\n            return; // don't notify about your own join event\n        }\n        this.chat.loadRoomAndUser(room, from).then(info => {\n            const { room, person } = info;\n            this.get('streaming.connection').setActive(room.get('jid'));\n            this.sendVideoInvitation(room, person);\n        });\n    }),\n\n    // TODO: remove when v1 is deprecated\n    videoLeave: streamingEvent(function (videoInfo) {\n        const { room, from } = videoInfo;\n        if (compareJids(from, this.get('session.person.jid'))) {\n            return; // don't notify about your own leave event\n        }\n        this.chat.loadRoomAndUser(room, from).then(info => {\n            const { room, person } = info;\n            this.get('streaming.connection').setActive(room.get('jid'));\n            this.cancelInvitation(room, person);\n        });\n    })\n});\n","/* global MediaStream */\n\nimport { reads } from '@ember/object/computed';\n\nimport { assign } from '@ember/polyfills';\nimport { on } from '@ember/object/evented';\nimport { A } from '@ember/array';\nimport Mixin from '@ember/object/mixin';\nimport RSVP from 'rsvp';\nimport { run } from '@ember/runloop';\nimport EmberObject, { observer, computed } from '@ember/object';\n\nimport Ember from 'ember';\nimport BrowserUtils from 'web-directory/utils/browser';\nimport LocalMedia from 'localmedia';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nexport default Mixin.create(LoggerMixin, {\n    canListDevices: false,\n    waitingForMedia: null,\n\n    // this is so we can better tell if media permissions havent been given yet or if they are denied\n    mediaRequestAnswered: false,\n    localVideoNotReceived: false,\n    orphanedScreenStreams: null,\n    pendingCreateMediaPromise: null,\n\n    notificationOutputDeviceId: reads('defaultNotificationDevice.deviceId'),\n\n    // default to true\n    micAutoGain: computed('micPrefs.autoGain', {\n        get() {\n            if (this.get('micPrefs.autoGain') !== undefined) {\n                return this.get('micPrefs.autoGain');\n            }\n\n            return true;\n        },\n        set(key, value) {\n            this.updateMicPref('autoGain', value);\n            return value;\n        }\n    }),\n\n    // default to true\n    echoCancellation: computed('micPrefs.echoCancellation', {\n        get() {\n            if (this.get('micPrefs.echoCancellation') !== undefined) {\n                return this.get('micPrefs.echoCancellation');\n            }\n\n            return true;\n        },\n        set(key, value) {\n            this.updateMicPref('echoCancellation', value);\n            return value;\n        }\n    }),\n\n    // default to true\n    noiseSuppression: computed('micPrefs.noiseSuppression', {\n        get() {\n            if (this.get('micPrefs.noiseSuppression') !== undefined) {\n                return this.get('micPrefs.noiseSuppression');\n            }\n\n            return true;\n        },\n        set(key, value) {\n            this.updateMicPref('noiseSuppression', value);\n            return value;\n        }\n    }),\n\n    initializeRetryDelay: 2000,\n\n    t: function () {\n        return this.intl.t(...arguments);\n    },\n\n    cameraList: A(),\n    microphoneList: A(),\n    outputDeviceList: A(),\n    resolutionList: A(),\n\n    _isInitialized: false,\n\n    init() {\n        this._super(...arguments);\n        this.set('orphanedScreenStreams', A());\n    },\n\n    _createEmberDevice(device) {\n        if (!device) {\n            return null;\n        }\n\n        return EmberObject.create({\n            deviceId: device.deviceId,\n            kind: device.kind,\n            groupId: device.groupId,\n            label: device.label\n        });\n    },\n\n    defaultMicrophone: computed('deviceProfilesV2.microphone', function () {\n        return this._createEmberDevice(this.get('deviceProfilesV2.microphone'));\n    }),\n\n    defaultCamera: computed('deviceProfilesV2.camera', function () {\n        return this._createEmberDevice(this.get('deviceProfilesV2.camera'));\n    }),\n\n    defaultOutputDevice: computed('deviceProfilesV2.outputDevice', function () {\n        return this._createEmberDevice(this.get('deviceProfilesV2.outputDevice'));\n    }),\n\n    defaultNotificationDevice: computed('deviceProfilesV2.notificationDevice', function () {\n        return this._createEmberDevice(this.get('deviceProfilesV2.notificationDevice'));\n    }),\n\n    enumerateDevicesWhenAuthed: on(\n        'init',\n        // eslint-disable-next-line ember/no-observers\n        observer('session.isAuthenticated', function () {\n            if (!Ember.testing && this.get('session.isAuthenticated')) {\n                this.enumerateDevices()\n                    .then(() => this.ensureAudioPermissions())\n                    .then(() => this.ensureInitialized());\n            }\n        })\n    ),\n\n    updateMicPref(name, value) {\n        this.logger.info(`updating pref for ${name} to be ${value}`);\n        let micPrefs = this.micPrefs || this.set('micPrefs', EmberObject.create());\n\n        micPrefs.set(name, value);\n\n        // TODO: PCM-1545 remove this someday\n        this.preferences.setPreference('webrtc.advancedMicControls', micPrefs);\n\n        // update new webrtc settings\n        const advancedMicSettings = micPrefs.getProperties(['autoGain', 'echoCancellation', 'noiseSuppression']);\n        this.webrtcSettings.updateSetting('generalSettings.advancedMicSettings', advancedMicSettings);\n    },\n\n    endOrphanedScreenStreams() {\n        this.orphanedScreenStreams.forEach(stream => {\n            stream.getTracks().forEach(track => track.stop());\n        });\n\n        this.set('orphanedScreenStreams', A());\n    },\n\n    ensureInitialized() {\n        if (this._initializePromise) {\n            return this._initializePromise;\n        }\n\n        if (this.isDestroyed || this.isDestroying || this.disableProactiveDevicePermissions) {\n            return RSVP.resolve();\n        }\n\n        const preferences = this.preferences;\n        if (!preferences) {\n            this.logger.warn('Preferences not available to webrtc service');\n            return RSVP.resolve();\n        }\n\n        if (this.cameraList.length === 0 && this.microphoneList.length === 0) {\n            return new RSVP.Promise((resolve, reject) => {\n                const initializeLater = run.later(\n                    this,\n                    function () {\n                        this.ensureInitialized().then(resolve).catch(reject);\n                    },\n                    this.initializeRetryDelay\n                );\n\n                this.set('initializeAfterEnumeration', initializeLater);\n            });\n        }\n\n        const resolutionPromise = preferences\n            .getPreference('webrtc.resolutionPresetId')\n            .then(savedResolutionPresetId => {\n                const resolutions = this.resolutionList;\n                const savedResolution = resolutions.findBy('presetId', savedResolutionPresetId);\n                this.set('defaultResolution', savedResolution || resolutions[resolutions.length - 1]);\n            })\n            .catch(err => this.logger.error('Error getting resolution preference:', { remoteData: { err } }));\n\n        this.trigger('defaultDeviceChange');\n\n        let micPreferencesPromise = RSVP.resolve();\n        const promise = RSVP.all([resolutionPromise, micPreferencesPromise]).then(() => {\n            if (this.isDestroyed || this.isDestroying) {\n                return;\n            }\n\n            this.set('_isInitialized', true);\n            this.trigger('defaultDeviceChange');\n        });\n\n        this.set('_initializePromise', promise);\n        return promise;\n    },\n\n    // eslint-disable-next-line ember/no-observers\n    _micPrefsFromWebrtcSettings: observer('webrtcSettings.settings.generalSettings.advancedMicSettings', function () {\n        const micSettings = this.get('webrtcSettings.settings.generalSettings.advancedMicSettings');\n        this.set('micPrefs', EmberObject.create(micSettings));\n    }),\n\n    resetDefaultDevices() {\n        this.updateDefaultDevices({\n            camera: this.get('cameraList.firstObject'),\n            microphone: this.get('microphoneList.firstObject')\n        });\n    },\n\n    ensureAudioPermissions() {\n        if (!this.hasMicPermission) {\n            const existingPendingPromise = this.pendingCreateMediaPromise;\n            if (existingPendingPromise) {\n                return existingPendingPromise;\n            }\n\n            const newPendingPromise = this.createMedia({ audio: true, requestVideo: false }).then(media => {\n                return this.enumerateDevices().then(() =>\n                    media.localStreams.forEach(stream => media.stopStream(stream))\n                );\n            });\n\n            this.set('pendingCreateMediaPromise', newPendingPromise);\n            return newPendingPromise;\n        }\n\n        return RSVP.resolve();\n    },\n\n    ensureFullMediaPermissions() {\n        if (!this.hasMicPermission || !this.hasCameraPermission) {\n            return this.createMedia({ audio: true, video: true }).then(media => {\n                return this.enumerateDevices().then(() =>\n                    media.localStreams.forEach(stream => media.stopStream(stream))\n                );\n            });\n        }\n\n        return RSVP.resolve();\n    },\n\n    updateDefaultDevices(devices) {\n        // logging error object so we get a stack trace\n        this.logger.warn(new Error('`updateDefaultDevices` was called but we should be using only the sdk devices'));\n\n        const { camera, microphone, resolution, outputDevice, notificationDevice } = devices;\n        let devicesActuallyChanged = false;\n\n        if (camera && this.get('defaultCamera.deviceId') !== camera.deviceId) {\n            this.set('defaultCamera', camera);\n            devicesActuallyChanged = true;\n        }\n        if (microphone && this.get('defaultMicrophone.deviceId') !== microphone.deviceId) {\n            this.set('defaultMicrophone', microphone);\n            devicesActuallyChanged = true;\n        }\n        if (resolution) {\n            this.set('defaultResolution', resolution);\n        }\n        if (outputDevice && this.get('defaultOutputDevice.deviceId') !== outputDevice.deviceId) {\n            this.set('defaultOutputDevice', outputDevice);\n            devicesActuallyChanged = true;\n        }\n        if (notificationDevice && this.get('defaultNotificationDevice.deviceId') !== notificationDevice.deviceId) {\n            this.set('defaultNotificationDevice', notificationDevice);\n            devicesActuallyChanged = true;\n        }\n\n        if (devicesActuallyChanged) {\n            this.trigger('defaultDeviceChange', devices);\n        }\n\n        // TODO: PCM-1545 we shouldn't need this because all this should be saved as part of the device profile. This seems like a relic\n        // Ember.RSVP.Promise.resolve().then(() => {\n        //   if (camera) {\n        //     return preferences.setPreference('webrtc.cameraId', camera.getProperties('deviceId', 'label'));\n        //   }\n        // }).then(() => {\n        //   if (microphone) {\n        //     return preferences.setPreference('webrtc.microphoneId', microphone.getProperties('deviceId', 'label'));\n        //   }\n        // }).then(() => {\n        //   if (resolution) {\n        //     return preferences.setPreference('webrtc.resolutionPresetId', resolution.presetId);\n        //   }\n        // }).then(() => {\n        //   if (outputDevice) {\n        //     return preferences.setPreference('webrtc.outputDeviceId', outputDevice.getProperties('deviceId', 'label'));\n        //   }\n        // }).then(() => {\n        //   if (notificationDevice) {\n        //     return preferences.setPreference('webrtc.notificationDeviceId', notificationDevice.getProperties('deviceId', 'label'));\n        //   }\n        // });\n        return true; // tell the addon this has been extended\n    },\n\n    getHostedScreenMedia(screenId) {\n        return window.navigator.mediaDevices.getUserMedia({\n            audio: false,\n            video: {\n                mandatory: {\n                    chromeMediaSource: 'desktop',\n                    chromeMediaSourceId: screenId,\n                    maxFrameRate: 3\n                }\n            }\n        });\n    },\n\n    /**\n     * @param {} conversationId\n     * @returns {\n     *  stream: MediaStream,\n     *  metas: [\n     *    {\n     *      trackId: string,\n     *      screenId: string,\n     *      originX: number,\n     *      originY: number,\n     *      resolutionX: number,\n     *      resolutionY: number,\n     *      primary: boolean,\n     *      main: boolean\n     *    }\n     *  ]\n     * }\n     */\n    getScreenRecordingMedia(conversationId) {\n        const metas = [];\n        let stream;\n\n        let streamPromise;\n        if (this.allowScreenRecordingInBrowser) {\n            streamPromise = this._debugScreenRecordingInBrowser().then(s => {\n                stream = s;\n            });\n        } else {\n            streamPromise = this.get('application.hostedContext')\n                .getShareableScreens()\n                .then(screens => {\n                    screens = screens || [];\n\n                    // if not multimonitor, filter out the others\n                    if (!this.multiMonitorScreenRecording) {\n                        screens = screens.filter(screen => screen.isPrimary);\n                    }\n\n                    stream = this.getMediaStream();\n                    const promises = [];\n\n                    screens.forEach(screen => {\n                        const screenId = screen.shareid;\n                        const promise = this.getVideoTrackForScreenId(screenId, conversationId).then(track => {\n                            if (!track) {\n                                this.logger.info('No track received for screen', { remoteData: { screenId } });\n                                return;\n                            }\n\n                            stream.addTrack(track);\n                            metas.push(this.createTrackMetadata(screen, track));\n                        });\n\n                        promises.push(promise);\n                    });\n\n                    return RSVP.all(promises).then(() => {\n                        if (!stream.getTracks().length) {\n                            this.logger.error('No tracks for screenRecording were created', {\n                                remoteData: { conversationId, screens }\n                            });\n                            throw new Error('Failed to start screen recording media');\n                        }\n                    });\n                });\n        }\n\n        return streamPromise.then(() => ({ stream, metas }));\n    },\n\n    getMediaStream() {\n        return new MediaStream();\n    },\n\n    createTrackMetadata(screenInfo, track) {\n        const isWindows = navigator.platform.indexOf('Win') > -1;\n        // purecloud-mac uses the bottom-left corner of the screen as its origin, with positive numbers representing higher origins\n        // purecloud-directory-window uses the top-left corner of the screen as its origin, with positive numbers representing lower origins\n        return {\n            trackId: track.id,\n            screenId: screenInfo.shareid,\n            originX: screenInfo.x,\n            originY: isWindows ? screenInfo.y : -1 * screenInfo.y,\n            resolutionX: screenInfo.width,\n            resolutionY: screenInfo.height,\n            primary: !!screenInfo.isPrimary,\n            main: !!screenInfo.isMain\n        };\n    },\n\n    // tries 3 times to add a screen to the media stream\n    getVideoTrackForScreenId(screenId, conversationId, attemptsRemaining = 3) {\n        return this.getHostedScreenMedia(screenId)\n            .catch(err => {\n                if (!attemptsRemaining) {\n                    this.logger.error('Failed to initialize screen recording for screen', {\n                        remoteData: { screenId, conversationId, error: err }\n                    });\n                    return;\n                }\n            })\n            .then(stream => {\n                if (stream && stream.getVideoTracks().length) {\n                    return stream.getVideoTracks()[0];\n                }\n            });\n    },\n\n    getMediaOptions(options) {\n        const constraints = {};\n        options = options || {};\n\n        options.camera = options.camera || this.defaultCamera;\n        options.microphone = options.microphone || this.defaultMicrophone;\n        options.resolution = options.resolution || this.defaultResolution;\n        options.video = this.hasCamera && this.videoCallCapable && options.requestVideo !== false;\n        options.audio = this.hasMicrophone && this.audioCallCapable && options.requestAudio !== false;\n\n        if (!options.video && !options.audio) {\n            this.logger.warn('Requesting media without audio or video. This is probably an error', {\n                remoteData: {\n                    options,\n                    videoCallCapable: this.videoCallCapable,\n                    audioCallCapable: this.audioCallCapable\n                }\n            });\n            if (options.requestAudio === false && options.requestVideo === false) {\n                throw new Error('No Media requested');\n            }\n            throw new Error('Requesting media when not capable');\n        }\n\n        if (options.video === false || (!this.videoCallCapable && this.get('webrtc.hasCamera'))) {\n            constraints.video = false;\n        } else {\n            if (BrowserUtils.isChromeOrChromium) {\n                constraints.video = {\n                    googNoiseReduction: true\n                };\n            } else {\n                constraints.video = {};\n            }\n\n            const camera = options.camera;\n            if (camera && camera.deviceId !== 'default') {\n                constraints.video.deviceId = {\n                    exact: camera.deviceId\n                };\n            } else if (options.preferences) {\n                constraints.video.deviceId = {\n                    exact: this.get('defaultCamera.deviceId')\n                };\n            }\n            if (options.resolution) {\n                assign(constraints.video, options.resolution.constraints.video);\n            } else if (options.preferences) {\n                assign(constraints.video, this.get('defaultResolution.constraints.video'));\n            }\n        }\n\n        if (options.audio === false || !this.audioCallCapable || !this.hasMicrophone) {\n            constraints.audio = false;\n        } else {\n            if (BrowserUtils.isChromeOrChromium) {\n                constraints.audio = {\n                    googAudioMirroring: false,\n                    autoGainControl: this.micAutoGain,\n                    echoCancellation: this.echoCancellation,\n                    noiseSuppression: this.noiseSuppression,\n                    googDucking: false,\n                    googHighpassFilter: true\n                };\n            } else {\n                constraints.audio = {};\n            }\n\n            const microphone = options.microphone;\n            if (microphone === true) {\n                constraints.audio = true;\n            } else if (microphone && microphone.deviceId !== 'default') {\n                constraints.audio.deviceId = {\n                    exact: microphone.deviceId\n                };\n            } else if (options.preferences) {\n                constraints.audio.deviceId = {\n                    exact: this.get('defaultMicrophone.deviceId')\n                };\n            }\n        }\n\n        return constraints;\n    },\n\n    getMediaErrorMessage(error) {\n        if (error.name === 'PermissionDeniedError' || error.name === 'NotAllowedError') {\n            return this.intl.t('ewc.browserMediaErrors.PermissionDeniedError').toString();\n        } else if (error.name === 'ConstraintNotSatisfiedError') {\n            return this.intl.t('ewc.browserMediaErrors.ConstraintNotSatisfiedError').toString();\n        } else if (error.name === 'noVideoTrack') {\n            return this.intl.t('ewc.noCameraDetected').toString();\n        }\n        return this.intl.t('ewc.browserMediaErrors.generalError').toString();\n    },\n\n    createMedia(config = {}, retries = 2) {\n        let promise = RSVP.resolve();\n        if (config.requestVideo) {\n            promise = this.webrtcSdkService.ensureVideoPermissions();\n        }\n\n        if (config.requestAudio) {\n            promise = promise.then(() => this.webrtcSdkService.ensureAudioPermissions());\n        }\n\n        return promise.then(() => {\n            return new RSVP.Promise((resolve, reject) => {\n                this.set(\n                    'waitingForMediaTimeout',\n                    run.later(() => {\n                        if (this.isDestroying || this.isDestroyed) {\n                            return;\n                        }\n                        this.set('waitingForMedia', !this.mediaRequestAnswered);\n                    }, 2500)\n                );\n\n                const media = new LocalMedia({\n                    detectSpeakingEvents: true,\n                    harkOptions: {\n                        interval: 200\n                    }\n                });\n\n                let mediaOptions;\n                try {\n                    mediaOptions = this.getMediaOptions({\n                        camera: config.camera,\n                        microphone: config.microphone,\n                        resolution: config.resolution,\n                        requestVideo: config.requestVideo,\n                        requestAudio: config.requestAudio\n                    });\n                } catch (err) {\n                    return reject(err);\n                }\n\n                media.on('localStream', () => {\n                    if (this.waitingForMediaTimeout) {\n                        run.cancel(this.waitingForMediaTimeout);\n                        this.set('waitingForMediaTimeout', null);\n                    }\n                    this.set('waitingForMedia', false);\n                    this.set('mediaRequestAnswered', true);\n                    resolve(media);\n                });\n\n                media.start(mediaOptions, err => {\n                    this.enumerateDevices();\n\n                    if (!err) {\n                        return;\n                    }\n\n                    this.logger.error(err.message, { remoteData: { err } });\n\n                    if (err.name === 'NotFoundError' && retries > 0) {\n                        if (config.requestVideo !== false && !this.hasCameraPermission) {\n                            this.logger.info('Browser does not have camera permissions, creating media without video');\n                            err.translationCode = 'ewc.noCameraPermissions';\n                        }\n\n                        if (config.requestAudio !== false && !this.hasMicPermission) {\n                            this.logger.info('Browser does not have mic permissions, creating media without audio');\n                            err.translationCode = 'ewc.noMicPermissions';\n                        }\n\n                        return reject(err);\n                    }\n\n                    if (err.name === 'NotAllowedError') {\n                        if (mediaOptions.audio) {\n                            this.set('hasMicPermission', false);\n                            err.translationCode = 'ewc.noMicPermissions';\n                        }\n\n                        if (mediaOptions.video) {\n                            this.set('hasCameraPermission', false);\n                            err.translationCode = 'ewc.noCameraPermissions';\n                        }\n\n                        if (mediaOptions.audio && mediaOptions.video) {\n                            err.translationCode = 'ewc.devicePermissionsNeeded';\n                        }\n\n                        return reject(err);\n                    }\n\n                    if (\n                        err.name !== 'DevicesNotFoundError' &&\n                        err.name !== 'OverconstrainedError' &&\n                        err.constructor.name !== 'OverconstrainedError'\n                    ) {\n                        let error = new Error('Unknown UserMediaError');\n                        error.translation = this.getMediaErrorMessage(err);\n                        this.logger.error(err.message, { remoteData: { err } });\n                        return reject(error);\n                    }\n\n                    this.logger.warn('user media error', { remoteData: { error: err } });\n                    if (err.name === 'OverconstrainedError' || err.constructor.name === 'OverconstrainedError') {\n                        if (config.requestVideo !== false) {\n                            if (retries > 0) {\n                                config.resolution = { constraints: { video: {} } };\n                                return this.createMedia(config, retries - 1)\n                                    .then(resolve)\n                                    .catch(reject);\n                            }\n                            this.logger.error('OverconstrainedError (retries exceeded) - video', {\n                                remoteData: { err }\n                            });\n                            return reject(err);\n                        }\n                        if (!config.requestVideo && err.constraint === 'deviceId') {\n                            if (retries > 0) {\n                                // error specifically with deviceId constraint for audio, try again with default microphone\n                                config.microphone = true;\n                                config.preferences = null;\n                                return this.createMedia(config, retries - 1)\n                                    .then(resolve)\n                                    .catch(reject);\n                            }\n                            this.logger.error('OverconstrainedError (retries exceeded) - audio', {\n                                remoteData: { err }\n                            });\n                            return reject(err);\n                        }\n                        this.logger.error('OverconstrainedError - general (no retry)', { remoteData: { err } });\n                        return reject(err);\n                    }\n\n                    // DevicesNotFoundError means we should reset and try again with defaults\n                    if (this.waitingForMediaTimeout) {\n                        run.cancel(this.waitingForMediaTimeout);\n                        this.set('waitingForMediaTimeout', null);\n                    }\n                    this.resetDefaultDevices();\n                    config.camera = null;\n                    config.microphone = null;\n                    this.createMedia(config).then(resolve).catch(reject);\n                });\n            });\n        });\n    },\n\n    handleScreenShareError(err, requestedTime) {\n        this.showScreenShareError(requestedTime);\n        this.logger.warn(err.message, { remoteData: { err } });\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        run.cancel(this.waitingForMediaTimeout);\n        run.cancel(this.initializeAfterEnumeration);\n    }\n});\n","import { inject as service } from '@ember/service';\nimport { reads } from '@ember/object/computed';\nimport { A } from '@ember/array';\nimport Mixin from '@ember/object/mixin';\nimport EmberObject, { computed, observer } from '@ember/object';\nimport { EVENTS } from '../../utils/hosted-context';\n\nexport default Mixin.create({\n    session: service(),\n    incomingInvitations: A(),\n    intl: service(),\n    ring: service(),\n\n    ringtoneSelection: reads('ring.ringtoneSelection'),\n\n    enableAlertablePresencesOverrides: computed('session.features', function () {\n        const features = this.get('session.features');\n        return features && features['PURE-5149_ui_enableAlertablePresencesOverrides'];\n    }),\n\n    // eslint-disable-next-line ember/no-observers\n    _handleIncomingConversationsUpdates: observer('incomingInvitations.[]', function () {\n        const sound = this.sound;\n        const ring = this.ring;\n        // when enableAlertablePresencesOverrides is true, the backend will handle\n        // the events based on presence\n        if (!this.enableAlertablePresencesOverrides && this.get('session.person.presence') === 'busy') {\n            return;\n        }\n        const invitationsWithSound = this.incomingInvitations.filter(function (item) {\n            // indvidual rooms only\n            const room = item.get('room');\n            return room.isOneToOneRoom() || (!room.get('group') && !room.get('oneToOneTarget'));\n        });\n        if (!invitationsWithSound) {\n            return;\n        }\n        if (invitationsWithSound.length > 0 && !sound.isRinging()) {\n            sound.playRingtone(ring.ringerVolume, ring.getRingerOutputDeviceId(), this.ringtoneSelection || 'phone');\n        } else if (invitationsWithSound.length === 0 && sound.isRinging()) {\n            sound.stopRingtone(this.ringtoneSelection || 'phone');\n        }\n    }),\n\n    // eslint-disable-next-line ember/no-observers\n    _handleStartingVideo: observer('activeRoom.showingVideo', function () {\n        if (!this.get('activeRoom.showingVideo')) {\n            return;\n        }\n        const existingInvitation = this.incomingInvitations.findBy('room', this.activeRoom);\n        if (existingInvitation) {\n            this.incomingInvitations.removeObject(existingInvitation);\n        }\n    }),\n\n    getInvitationMessage(room, person, count) {\n        const intl = this.intl;\n        if (room.isOneToOneRoom()) {\n            return intl\n                .t('ewc.singleInvitation', {\n                    personName: person.get('name')\n                })\n                .toString();\n        } else if (count) {\n            return intl.t('ewc.countInvitation', {\n                count: count,\n                roomName: room.getRawDisplaySubject()\n            });\n        }\n        return intl\n            .t('ewc.groupInvitation', {\n                personName: person.get('name'),\n                roomName: room.getRawDisplaySubject()\n            })\n            .toString();\n    },\n\n    createInvitation(room, person, sessionId) {\n        const existing = this.incomingInvitations.findBy('entity', person);\n        if (existing && existing.get('room') === room) {\n            // same person and room\n            return existing;\n        } else if (existing) {\n            // same person, different room\n            this.incomingInvitations.removeObject(existing);\n        }\n\n        const existingForRoom = this.incomingInvitations.filterBy('room', room);\n        let count;\n        if (existingForRoom.length > 0) {\n            count = existingForRoom.length + 1;\n        }\n\n        if (room.isOneToOneRoom()) {\n            room.set('invited', true);\n        }\n\n        return EmberObject.create({\n            entity: person,\n            room: room,\n            message: this.getInvitationMessage(room, person, count),\n            sessionId: sessionId\n        });\n    },\n\n    sendVideoInvitation(room, person, sessionId) {\n        const invitation = this.createInvitation(room, person, sessionId);\n        if (this.chat.isActiveRoom(room) && room.get('showingVideo')) {\n            this.answerVideoByInvitation(invitation);\n            return;\n        }\n\n        if (room.isOneToOneRoom()) {\n            const context = this.get('application.hostedContext');\n            this.incomingInvitations.pushObject(invitation);\n            if (context && context.isHosted()) {\n                context.sendEventToDesktop(EVENTS.WEBRTC_CONNECTION_INCOMING, room);\n            }\n        }\n    },\n\n    pendingSession: null,\n\n    getNotificationTitle(room, chatUser) {\n        if (room.isOneToOneRoom()) {\n            return chatUser.get('name');\n        } else {\n            let personName = chatUser.get('name');\n            let roomName = room.getRawDisplaySubject();\n            return this.intl\n                .t('ewc.notification.titles.chatRoomMessage', {\n                    personName: personName,\n                    roomName: roomName\n                })\n                .toString();\n        }\n    }\n});\n","import { capitalize } from '@ember/string';\nimport { assign } from '@ember/polyfills';\nimport { run } from '@ember/runloop';\nimport Mixin from '@ember/object/mixin';\nimport { EVENTS } from 'web-directory/utils/hosted-context';\nimport { addPageAction } from 'web-directory/utils/newrelic';\nimport webrtcConversationTypes from 'web-directory/utils/webrtc-conversation-types';\n\nexport default Mixin.create({\n    translateCandidatePairDetails(data) {\n        const candidateType = data.oCandidatePairDetails.local.candidateType;\n        if (candidateType === 'relay') {\n            const turnServerAddress = data.candidatePairDetails.local.ipAddress;\n            data.candidatePairDetails.remote.ipAddress = turnServerAddress;\n        }\n\n        this.logger.debug('Translated localIp', {\n            old: data.oCandidatePairDetails.local,\n            new: data.candidatePairDetails.local\n        });\n    },\n\n    _onStats(session, data) {\n        if (data.name === 'connect') {\n            if (!data.devices) {\n                data.devices = {\n                    selected: {\n                        microphone: this.get('defaultMicrophone.label'),\n                        camera: this.get('defaultCamera.label')\n                    },\n                    all: {\n                        microphones: this.microphoneList.mapBy('label'),\n                        cameras: this.cameraList.mapBy('label')\n                    }\n                };\n            }\n\n            const webrtcMediaDscp = this.get('phone.station.webrtcMediaDscp');\n            const conversationType = this.get(`sessionConversationMap.${session.sid}.conversationType`);\n            if (webrtcMediaDscp && conversationType === 'softphone') {\n                data.webrtcMediaDscp = webrtcMediaDscp;\n            }\n\n            try {\n                const local = data.candidatePairDetails.local;\n                const remote = data.candidatePairDetails.remote;\n                local.ipAddress = local.ipAddress || local.ip || local.address;\n                local.portNumber = local.portNumber || local.port;\n                remote.ipAddress = remote.ipAddress || remote.ip || remote.address;\n                remote.portNumber = remote.portNumber || remote.port;\n            } catch (e) {\n                this.logger.debug('Error copying connection information to old ipAddress/portNumber fields', e);\n            }\n\n            data.oCandidatePairDetails = data.candidatePairDetails;\n            data.candidatePairDetails = JSON.parse(JSON.stringify(data.oCandidatePairDetails));\n            data.session = session.sid;\n\n            // only do crazy translation bit if we are in hosted context and it's not a host candidate already\n            if (\n                data.oCandidatePairDetails.local.candidateType !== 'host' &&\n                this.get('application.hostedContext').isHosted()\n            ) {\n                this.translateCandidatePairDetails(data, session);\n            }\n\n            this.logger.debug('sending webrtc stats to hostedContext', data);\n            this.get('application.hostedContext').sendEventToDesktop(EVENTS.WEBRTC_CONNECTION_STARTED, data);\n        }\n\n        this.logger.debug('webrtcStats', data);\n    },\n\n    gatherStatsForSession(session) {\n        session.on('stats', data => {\n            run(() => {\n                this._onStats(session, data);\n            });\n        });\n    },\n\n    _onTrace(session, data) {\n        const conversation = this.get(`sessionConversationMap.${session.sid}`);\n        if (!conversation) {\n            this.logger.debug('Could not find matching conversation for session', { remoteData: { sid: session.sid } });\n            return;\n        }\n        data.conversationId =\n            conversation.get('conversationId') || (session.callInfo && session.callInfo.conversationId);\n        data.conversationType = conversation.get('conversationType') || 'unknown';\n        addPageAction('webrtcStats', this.flattenWebrtcObject(data, conversation));\n        this.logger.warn('webrtcTraces', {\n            webrtcTraces: data\n        });\n    },\n\n    flattenWebrtcObject(data, conversation) {\n        if (!data) {\n            this.logger.info('Cannot flatten undefined object');\n            return data;\n        }\n\n        let conference = data.conference && data.conference.toString();\n        const conversationType = data.conversationType || (conversation && conversation.get('conversationType'));\n        if (conversationType === webrtcConversationTypes.SOFTPHONE) {\n            conference = '<value hidden>';\n        }\n\n        const flatData = {\n            webrtcEventName: data.name,\n            localAudioMuted: conversation && conversation.get('localParticipant.audioMuted'),\n            localVideoMuted: conversation && conversation.get('localParticipant.videoMuted'),\n            interruptions: conversation && conversation.get('interruptions')\n        };\n\n        Object.keys(data).forEach(key => {\n            const value = data[key];\n            if (value === null || typeof value !== 'object') {\n                flatData[key] = value;\n            }\n        });\n\n        flatData.conference = conference;\n\n        if (data.name === 'getStats') {\n            const audioTrack = data.tracks && data.tracks.find(t => t.kind === 'audio');\n            const videoTrack = data.tracks && data.tracks.find(t => t.kind === 'video');\n\n            const remoteTracks = data.remoteTracks || [];\n            let remoteAudioBitrateAverage = 0;\n            let remoteVideoBitrateAverage = 0;\n            let remoteAudioLossAverage = 0;\n            let remoteVideoLossAverage = 0;\n            let remoteAudioLostTotal = 0;\n            let remoteVideoLostTotal = 0;\n\n            if (remoteTracks.length) {\n                const remoteAudioTracks = remoteTracks.filter(t => t.kind === 'audio');\n                const remoteVideoTracks = remoteTracks.filter(t => t.kind === 'video');\n                const remoteAudioTrackCount = remoteAudioTracks.length;\n                const remoteVideoTrackCount = remoteVideoTracks.length;\n                const sum = (a, b) => a + b;\n\n                if (remoteAudioTracks.length) {\n                    remoteAudioBitrateAverage =\n                        remoteAudioTracks.map(t => t.bitrate).reduce(sum) / remoteAudioTrackCount;\n\n                    remoteAudioLossAverage = remoteAudioTracks.map(t => t.loss).reduce(sum) / remoteAudioTrackCount;\n\n                    remoteAudioLostTotal = remoteAudioTracks.map(t => t.lost).reduce(sum);\n                }\n\n                if (remoteVideoTracks.length) {\n                    remoteVideoBitrateAverage =\n                        remoteVideoTracks.map(t => t.bitrate).reduce(sum) / remoteVideoTrackCount;\n\n                    remoteVideoLossAverage = remoteVideoTracks.map(t => t.loss).reduce(sum) / remoteVideoTrackCount;\n\n                    remoteVideoLostTotal = remoteVideoTracks.map(t => t.lost).reduce(sum);\n                }\n            }\n\n            assign(flatData, {\n                remoteAudioBitrateAverage,\n                remoteAudioLossAverage,\n                remoteAudioLostTotal,\n                remoteVideoBitrateAverage,\n                remoteVideoLossAverage,\n                remoteVideoLostTotal,\n                remoteTracks: remoteTracks && remoteTracks.length\n            });\n\n            if (audioTrack) {\n                Object.keys(audioTrack).forEach(key => {\n                    const value = audioTrack[key];\n                    if (value === null || typeof value !== 'object') {\n                        flatData[`localAudio${capitalize(key)}`] = value;\n                    }\n                });\n            }\n            if (videoTrack) {\n                Object.keys(videoTrack).forEach(key => {\n                    const value = videoTrack[key];\n                    if (value === null || typeof value !== 'object') {\n                        flatData[`localVideo${capitalize(key)}`] = value;\n                    }\n                });\n            }\n        } else if (data.name === 'trace') {\n            const lastEvent = data.traces[data.traces.length - 1];\n            assign(flatData, {\n                lastEventTime: lastEvent && lastEvent.time,\n                lastEventValue: lastEvent && JSON.stringify(lastEvent.value),\n                lastEventKind: lastEvent && lastEvent.kind\n            });\n        } else if (data.name === 'sessionEnded') {\n            flatData.reason = data.reason && data.reason.condition ? data.reason.condition : data.reason;\n        }\n\n        return flatData;\n    },\n\n    _logConnectionEnded({ session, conversation, reason }) {\n        const start = conversation.get('conversationStart');\n        const duration = start ? Date.now() - new Date(start).getTime() : 0;\n        const data = {\n            conversationId: conversation.get('conversationId') || 'unknown',\n            conversationType: conversation.get('conversationType') || 'unknown',\n            conversationDuration: duration,\n            session: session.sid,\n            initiator: session.isInitiator,\n            conference: session.peerJid,\n            reason,\n            name: 'sessionEnded'\n        };\n        addPageAction('webrtcStats', this.flattenWebrtcObject(data, conversation));\n        return data;\n    }\n});\n","import { isPresent, typeOf } from '@ember/utils';\nimport { copy } from '@ember/object/internals';\nimport EmberObject, { computed } from '@ember/object';\nimport { assign } from '@ember/polyfills';\n\nexport const APPS_API_PROTOCOL = 'purecloud-client-apps';\nconst PROTOCOL_FIELD_NAME = 'protocol';\n\n// ----- Inbound Message Properties\nconst PROTOCOL_AGENT_FIELD_NAME = 'protocolAgentName';\nconst PROTOCOL_AGENT_VERSION_FIELD_NAME = 'protocolAgentVersion';\nconst API_ACTION_FIELD_NAME = 'action';\n\n// ----- Outbound Message Properties\nconst OUTBOUND_MSG_EVENT_TYPE_FIELD_NAME = 'purecloudEventType';\n\n/**\n * Model representing an inbound API call from the Apps SDK or from an internal app/frame utilizing direct\n * postMessage calls.\n */\nconst AppApiCall = EmberObject.extend({\n    internalPcCall: false,\n    srcApp: null,\n    srcAppInstance: null,\n    protocol: null,\n    protocolAgentName: null,\n    protocolAgentVersion: null,\n    action: null,\n    actionDetails: null,\n\n    appId: computed('srcApp', 'srcAppInstance', function () {\n        let result = this.get('srcAppInstance.appId');\n\n        if (!result) {\n            result = this.get('srcApp.id');\n        }\n\n        return result || null;\n    })\n});\n\n/**\n * Parses and validates the provided messagePayload into an AppApiCall instance.\n *\n * actionDetails will only contain properties which are applicable to the specific api call.  i.e.\n * metadata props like the action, protocol, protocol agent, etc. will only exist in their\n * specific instance variables.\n *\n * @param {object} messagePayload - The payload to parse; fails if not an object\n * @param {boolean} requireProtocol - If the validation should fail on protocol fields\n *\n * @returns an AppApiCall if the message is valid\n * @throws Error if the payload structure is invalid;\n *  the protocol is missing/incorrect (in strict mode);\n *  the action is missin/incorrect\n */\nexport function parseMessage(messagePayload, requireProtocol) {\n    let result = null;\n\n    if (typeOf(messagePayload) !== 'object') {\n        throw new Error('invalidPayload');\n    } else {\n        let protocol = messagePayload[PROTOCOL_FIELD_NAME];\n        if (requireProtocol) {\n            if (\n                !Object.prototype.hasOwnProperty.call(messagePayload, PROTOCOL_FIELD_NAME) ||\n                typeOf(protocol) !== 'string' ||\n                !isPresent(protocol)\n            ) {\n                throw new Error('missingProtocol');\n            }\n\n            if (protocol !== APPS_API_PROTOCOL) {\n                throw new Error('invalidAppsProtocol');\n            }\n        }\n\n        let action = messagePayload[API_ACTION_FIELD_NAME];\n        if (\n            !Object.prototype.hasOwnProperty.call(messagePayload, API_ACTION_FIELD_NAME) ||\n            typeOf(action) !== 'string' ||\n            !isPresent(action)\n        ) {\n            throw new Error('missingAction');\n        }\n\n        let actionDetails = copy(messagePayload, true);\n\n        // Prune metadata and control fields from the actionDetails\n        [\n            PROTOCOL_FIELD_NAME,\n            PROTOCOL_AGENT_FIELD_NAME,\n            PROTOCOL_AGENT_VERSION_FIELD_NAME,\n            API_ACTION_FIELD_NAME\n        ].forEach(fieldToPrune => {\n            delete actionDetails[fieldToPrune];\n        });\n\n        result = AppApiCall.create({\n            protocol,\n            protocolAgentName: messagePayload[PROTOCOL_AGENT_FIELD_NAME],\n            protocolAgentVersion: messagePayload[PROTOCOL_AGENT_VERSION_FIELD_NAME],\n            action,\n            actionDetails\n        });\n    }\n\n    return result;\n}\n\n/**\n * Constructs the full payload of a message to be sent to an Embedded Client App.\n * Metadata fields will be appended to any provided custom payload to create the normalized\n * event structure.\n *\n * @param {string} eventType - The eventType of this message.\n * @param {object|null|undefined} [customPayload={}] - Additional payload to send to the the app\n *\n * @throws Error if eventType is not a non-blank string\n * @throws Error if the customPayload is not null, undefined, or an object\n * @throws Error if any of the reserved, metadata keys are provided in the customPayload\n *\n * @returns A normalized payload with all necessary metadata suitable to dispatch to an Embedded Client App\n */\nexport function buildOutboundMsgPayload(eventType, customPayload = {}) {\n    if (typeOf(eventType) !== 'string' || eventType.trim().length === 0) {\n        throw new Error('Non-empty string must be provided as the eventType');\n    }\n\n    let payloadType = typeOf(customPayload);\n    if (payloadType !== 'null' && payloadType !== 'object') {\n        throw new Error('Payload must be null, undefined, or an object');\n    }\n\n    // Ensure no metadata fields are in the provided customPayload\n    [PROTOCOL_FIELD_NAME, OUTBOUND_MSG_EVENT_TYPE_FIELD_NAME].forEach(currMetadataFieldName => {\n        if (customPayload && Object.prototype.hasOwnProperty.call(customPayload, currMetadataFieldName)) {\n            throw new Error(`Payload contains reserved metadata prop '${currMetadataFieldName}'`);\n        }\n    });\n\n    return assign(\n        {\n            [PROTOCOL_FIELD_NAME]: APPS_API_PROTOCOL,\n            [OUTBOUND_MSG_EVENT_TYPE_FIELD_NAME]: eventType\n        },\n        customPayload || {}\n    );\n}\n\nexport default AppApiCall;\n","import { guidFor } from '@ember/object/internals';\nimport Evented from '@ember/object/evented';\nimport { run } from '@ember/runloop';\nimport EmberObject, { get, computed } from '@ember/object';\nimport config from '../config/environment';\nimport _ from 'lodash';\nimport { addPageAction } from '../utils/newrelic';\nimport InternallyHostedApp from './internally-hosted-app';\n\nlet AppState = EmberObject.extend({\n    name: null,\n    ordinal: 0,\n    compareTo(anotherState) {\n        if (!anotherState) {\n            return 1;\n        } else if (Object.getPrototypeOf(anotherState) !== Object.getPrototypeOf(this)) {\n            let errorMsg = 'Cannot compare AppState another object type';\n            console.error(errorMsg);\n            throw new Error(errorMsg);\n        }\n\n        return this.ordinal - anotherState.get('ordinal');\n    }\n});\n\n/**\n * List of lifecycle-oredered, AppState instances\n *\n * Callers can use the @see AppState#copareTo method to test for state order\n */\nexport const APP_STATES = {\n    LOADING: AppState.create({\n        ordinal: 100\n    }),\n    BOOTSTRAPPING: AppState.create({\n        ordinal: 200\n    }),\n    RUNNING: AppState.create({\n        ordinal: 300\n    }),\n    STOPPING: AppState.create({\n        ordinal: 400\n    }),\n    STOPPED: AppState.create({\n        ordinal: 500\n    })\n};\n\n/**\n * The event name (internal eventing) that will be fired when the\n * lifecycle is changing (opt-in).  The primary consumer of this event will\n * be the app-instance component for re-broadcasting to app iframes.\n */\nexport const LIFECYCLE_HOOK_EVENT = 'appLifecycleHook';\n\n/**\n * The event payload values for @see {LIFECYCLE_HOOK_EVENT} that will\n * notify of a new lifecycle state (opt-in).  Again, this will typically be used\n * by the app-instance componet for re-broadcasting to app iframes.\n */\nexport const LIFECYCLE_HOOKS = {\n    BOOTSTRAP: 'bootstrap',\n    FOCUS: 'focus',\n    BLUR: 'blur',\n    STOP: 'stop'\n};\n\n/**\n * The callback types utilized by the Apps SDK (or app devs directly) as the\n * postMessage payload confirming the succes of app-side work within a lifecycle\n * phase.\n */\nexport const APP_LIFECYCLE_CALLBACKS = {\n    BOOTSTRAPPED: 'bootstrapped',\n    STOPPED: 'stopped'\n};\n\n/**\n * The list of problems which can affect this app-instance\n */\nexport const APP_PROBLEMS = {\n    APP_UPDATED: 'updated',\n    APP_DELETED: 'deleted',\n    LICENSE_UNAVAILABLE: 'licenseUnavailable'\n};\n\n/*\n * Internal, configuration details of each app lifecycle state which will be ordered by ordinal.\n *\n * Heads up, this config is not validated internally.  So you break it, you bought it.\n */\nconst STATE_CONFIGS = {\n    [APP_STATES.LOADING]: {\n        lifecycleDetails: {\n            maxDurationMillis: get(config, 'purecloud-apps.lifecycle.transitionalStateTimeouts.loading')\n        }\n    },\n    [APP_STATES.BOOTSTRAPPING]: {\n        lifecycleDetails: {\n            stateOptInPropName: 'hooks.bootstrap',\n            maxDurationMillis: get(config, 'purecloud-apps.lifecycle.transitionalStateTimeouts.bootstrapping'),\n            broadcastHookName: LIFECYCLE_HOOKS.BOOTSTRAP,\n            appCallbackEventName: APP_LIFECYCLE_CALLBACKS.BOOTSTRAPPED\n        }\n    },\n    [APP_STATES.RUNNING]: {},\n    [APP_STATES.STOPPING]: {\n        lifecycleDetails: {\n            stateOptInPropName: 'hooks.stop',\n            maxDurationMillis: get(config, 'purecloud-apps.lifecycle.transitionalStateTimeouts.stopping'),\n            broadcastHookName: LIFECYCLE_HOOKS.STOP,\n            appCallbackEventName: APP_LIFECYCLE_CALLBACKS.STOPPED\n        }\n    },\n    [APP_STATES.STOPPED]: {}\n};\n\n// Ordered list of lifecycle states\nconst LIFECYCLE_ORDERED_APP_STATES = Object.keys(APP_STATES)\n    .map(currStateName => APP_STATES[currStateName])\n    .sort((state1, state2) => state1.compareTo(state2));\n\n/**\n * An app-instance manages the runtime state of a particular instance of an app.\n * It contains the current lifecyle state, tracks transitional states, stores\n * any problems that might be affecting this instance, provides an api to\n * manipulate the lifecycle, and broadcasts events to integrate\n * with the rendering portion of the lifecycle.\n *\n * Important Notes:\n * app-instances are managed by an app-pool and must also be rendered with\n * an app-pool (transitively: app-instance and app-embed) component to ensure the\n * lifecycle correctly accounts for rendering and callbacks.\n *\n * Problems can occur at any state and may or may not exclusively affect state.  Therefore,\n * there is no app-state \"PROBLEM\".  Rather, users should consult the problem attribute\n * in addition to state.\n *\n * Instance Lifecycle States:\n *  <ol>\n *      <li>LOADING - The app's iframe is loading</li>\n *      <li>BOOTSTRAPPING - App-specific startup activities (Opt-in)\n *          <ul>\n *              <li>'bootstrap' hook (event fired)</li>\n *              <li>Awaits 'bootstrapped' app callback (Will timeout)</li>\n *          </ul>\n *      </li>\n *      <li>RUNNING\n *          <ul>\n *              <li>'blur' hook (event fired) on app blur (Opt-in)</li>\n *              <li>'focus' hook (event fired) on subsequent app focus (Opt-in)</li>\n *          </ul>\n *      </li>\n *      <li>STOPPING - App-specific startup activities (Opt-in)\n *          <ul>\n *              <li>'stop' hook (event fired) after stop requested</li>\n *              <li>Awaits 'stopped' app callback (Will timeout)</li>\n *          </ul>\n *      </li>\n *      <li>STOPPED - The app has shut down and the instance can safely be removed from PureCloud</li>\n *  </ol>\n *\n * Lifecycle Hooks (Opt In):\n * If an app is so configured, this class will broadcast lifecyle events out.  The\n * primary consumer of these events will be the app-instance component who will re-broadcast\n * the event onto the app's iframe.\n *\n * <ul>\n *   <li>bootstrap</li>\n *   <li>focus</li>\n *   <li>blur</li>\n *   <li>stop</li>\n * </ul>\n *\n * Lifecycle Callbacks:\n * App developers can acknowledge completion of certain app-side work via callbacks.\n * Callbacks are opt-in and will eventually time out to prevent an app from locking up\n * <ul>\n *   <li>bootstrapped</li>\n *   <li>stopped</li>\n * </ul>\n */\nconst AppInstance = EmberObject.extend(Evented, {\n    instanceId: null,\n    app: null,\n\n    currState: null,\n    _currStateStartTimestamp: null,\n    problem: {\n        name: null,\n        details: null\n    },\n\n    lastUserAccessTimestamp: null,\n\n    _stateTimeoutTimer: null,\n\n    // sets a badging count for the app instance\n    attentionCount: 0,\n\n    init() {\n        this._super(...arguments);\n\n        this.set('instanceId', guidFor(this));\n\n        this.set('problem', {\n            name: null,\n            details: null\n        });\n\n        // Attach to beforeunload event to get instrumentation on app shutdown\n        // Note: beforeunload listeners should not be attached via jquery\n        if (window && window.addEventListener) {\n            let reportStoppedInteraction = () => {\n                run(() => {\n                    // Inactive app integrations will have already been reported\n                    if (this._inAppInteraction()) {\n                        this._appendAppInteraction('windowUnload', true);\n                    }\n                });\n            };\n            this.set('reportStoppedInteraction', reportStoppedInteraction);\n            window.addEventListener('beforeunload', reportStoppedInteraction);\n        }\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n\n        let timeout = this._stateTimeoutTimer;\n        if (timeout) {\n            run.cancel(timeout);\n            this.set('_stateTimeoutTimer', null);\n        }\n\n        let reportStoppedInteraction = this.reportStoppedInteraction;\n        if (reportStoppedInteraction) {\n            window.removeEventListener('beforeunload', reportStoppedInteraction);\n        }\n    },\n\n    appId: computed('app.id', function () {\n        let appId = this.get('app.id');\n\n        return appId || null;\n    }),\n\n    start() {\n        this._startAppInteraction('start');\n        this._advanceState(APP_STATES.LOADING);\n        this.set('lastUserAccessTimestamp', Date.now());\n    },\n\n    loaded() {\n        this._advanceState(APP_STATES.BOOTSTRAPPING);\n    },\n\n    bootstrapped() {\n        this._advanceState(APP_STATES.RUNNING);\n    },\n\n    focus() {\n        this._startAppInteraction('focus');\n        this.set('lastUserAccessTimestamp', Date.now());\n\n        if (this.get('app.lifecycle.hooks.focus')) {\n            this._triggerLifecycleHookEvent(LIFECYCLE_HOOKS.FOCUS);\n        }\n    },\n\n    blur() {\n        this.set('lastUserAccessTimestamp', Date.now());\n\n        if (this.get('app.lifecycle.hooks.blur')) {\n            this._triggerLifecycleHookEvent(LIFECYCLE_HOOKS.BLUR);\n        }\n\n        this._appendAppInteraction('blur', true);\n    },\n\n    stop() {\n        this._advanceState(APP_STATES.STOPPING);\n    },\n\n    stopped() {\n        this._advanceState(APP_STATES.STOPPED);\n    },\n\n    setProblem(name, details = null) {\n        this.set('problem.name', name);\n        this.set('problem.details', details);\n        this.notifyPropertyChange('problem');\n    },\n\n    _advanceState(requestedState) {\n        let currState = this.currState;\n        if (!requestedState || requestedState.compareTo(currState) <= 0) {\n            // Invalid next state\n            return;\n        }\n\n        // if monitoring ... cancel\n        let timeout = this._stateTimeoutTimer;\n        if (timeout) {\n            run.cancel(timeout);\n            this.set('_stateTimeoutTimer', null);\n        }\n\n        let requestedStateConfig = STATE_CONFIGS[requestedState];\n        let nextState = this._getNextState(requestedState);\n\n        if (\n            requestedStateConfig.lifecycleDetails &&\n            requestedStateConfig.lifecycleDetails.stateOptInPropName &&\n            !this.get(`app.lifecycle.${requestedStateConfig.lifecycleDetails.stateOptInPropName}`) &&\n            nextState\n        ) {\n            // App doesn't need this transitional state ... move to the next\n\n            this._advanceState(nextState);\n            return;\n        }\n\n        this.set('currState', requestedState);\n        this.set('_currStateStartTimestamp', Date.now());\n\n        if (this._inAppInteraction()) {\n            this._appendAppInteraction(\n                this._convertStateToLifecycleEvent(requestedState),\n                requestedState === APP_STATES.STOPPED\n            );\n        } else if (requestedState === APP_STATES.STOPPED) {\n            // Because an app will likely be hidden when stopped, there is no\n            // active interaction; however, this event represents a user dismissing\n            // an app (updated/deleted) or a pool eviction; so it's important to log\n            this._logInactiveAppStopped();\n        }\n\n        if (requestedStateConfig.lifecycleDetails) {\n            if (requestedStateConfig.lifecycleDetails.broadcastHookName) {\n                this._triggerLifecycleHookEvent(requestedStateConfig.lifecycleDetails.broadcastHookName);\n            }\n\n            if (requestedStateConfig.lifecycleDetails.maxDurationMillis) {\n                // Start transitional state timeout\n                this.set(\n                    '_stateTimeoutTimer',\n                    run.later(\n                        this,\n                        '_monitorTransitionalState',\n                        requestedStateConfig.lifecycleDetails.maxDurationMillis + 1\n                    )\n                );\n            }\n        }\n    },\n\n    _triggerLifecycleHookEvent(hook) {\n        this.trigger(LIFECYCLE_HOOK_EVENT, {\n            hook\n        });\n    },\n\n    _monitorTransitionalState() {\n        if (this.isDestroying || this.isDestroyed) {\n            return;\n        }\n\n        let currState = this.currState;\n        let currStateConfig = STATE_CONFIGS[currState];\n        let nextState = this._getNextState(currState);\n        let currStateEntryTimestamp = this._currStateStartTimestamp;\n        let maxDuration = currStateConfig ? get(currStateConfig, 'lifecycleDetails.maxDurationMillis') : undefined;\n\n        if (currStateConfig && currStateEntryTimestamp !== null && maxDuration) {\n            let timeInState = Date.now() - currStateEntryTimestamp;\n\n            if (timeInState < maxDuration) {\n                // Should not occur, but will re-kick the timer to wait until the state has expired\n                this.set('_stateTimeoutTimer', run.later(this, '_monitorTransitionalState', 100));\n            } else if (nextState) {\n                // The transitional state has expired and can be moved to the next state\n                this._advanceState(nextState);\n            }\n        }\n    },\n\n    _getNextState(currState) {\n        let result = null;\n\n        let currStateIndex = _.findIndex(LIFECYCLE_ORDERED_APP_STATES, currState);\n        if (currStateIndex >= 0 && LIFECYCLE_ORDERED_APP_STATES.length > currStateIndex + 1) {\n            result = LIFECYCLE_ORDERED_APP_STATES[currStateIndex + 1];\n        }\n\n        return result;\n    },\n\n    // Instrumentation\n    _interactionStartTimestamp: null,\n    _latestInteractionTimestamp: null,\n    _inAppInteraction() {\n        return !!this._interactionStartTimestamp;\n    },\n    _startAppInteraction(lifecycleEvent) {\n        let startTimestamp = Date.now();\n        this.set('_interactionStartTimestamp', startTimestamp);\n        this.set('_latestInteractionTimestamp', startTimestamp);\n\n        this._logAppInteraction(lifecycleEvent, {\n            interactionStart: startTimestamp\n        });\n    },\n    _appendAppInteraction(lifecycleEvent, complete) {\n        let startTimestamp = this._interactionStartTimestamp;\n        if (!startTimestamp) {\n            console.error('Attempted to append to an unknown app interaction');\n            return;\n        }\n\n        let now = Date.now();\n        let interactionDetails = {\n            interactionStart: startTimestamp,\n            timeSinceInteractionStart: now - startTimestamp,\n            timeSincePrevInteraction: now - this._latestInteractionTimestamp\n        };\n\n        if (complete) {\n            interactionDetails.interactionEnd = now;\n            interactionDetails.interactionDuration = now - startTimestamp;\n            this.set('_interactionStartTimestamp', null);\n            this.set('_latestInteractionTimestamp', null);\n        } else {\n            this.set('_latestInteractionTimestamp', Date.now());\n        }\n\n        this._logAppInteraction(lifecycleEvent, interactionDetails);\n    },\n    /**\n     * logs an app shutdown as a single pageAction regardless of interaction\n     * state due to the importance of this event.  Usually, this will be\n     * the result of a user dismissal (update/deleted app) or pool\n     * eviction.\n     */\n    _logInactiveAppStopped() {\n        let now = Date.now();\n        this._logAppInteraction(this._convertStateToLifecycleEvent(APP_STATES.STOPPED), {\n            interactionStart: now,\n            timeSinceInteractionStart: 0,\n            timeSincePrevInteraction: 0,\n            interactionEnd: now,\n            interactionDuration: 0\n        });\n    },\n    _logAppInteraction(lifecycleEvent, interactionDetails) {\n        let commonAttrs = {\n            lifecycleEvent,\n            pcAppTypeId: this.get('app.typeId'),\n            pcAppId: this.appId,\n            pcAppInstanceId: this.instanceId,\n            pcAppDisplayType: this.get('app.displayType'),\n            pcAppInternallyHosted: this.app instanceof InternallyHostedApp,\n            pcAppFeatureCategory: this.get('app.featureCategory'),\n            pcAppProblemName: this.get('problem.name'),\n            interactionId: this.get('app.interactionId')\n        };\n        for (const queryParam of this.app.getURLTemplateQueryParams()) {\n            commonAttrs[`${queryParam}UrlReplacement`] = true;\n        }\n        addPageAction('clientAppInteraction', _.merge({}, interactionDetails, commonAttrs));\n    },\n    _convertStateToLifecycleEvent(appState) {\n        switch (appState) {\n            case APP_STATES.LOADING:\n                return 'loading';\n            case APP_STATES.BOOTSTRAPPING:\n                return 'bootstrapping';\n            case APP_STATES.RUNNING:\n                return 'running';\n            case APP_STATES.STOPPING:\n                return 'stopping';\n            case APP_STATES.STOPPED:\n                return 'stopped';\n            default:\n                return 'unknownAppState';\n        }\n    }\n});\n\nexport default AppInstance;\n","import { alias, bool } from '@ember/object/computed';\nimport { typeOf } from '@ember/utils';\nimport Evented from '@ember/object/evented';\nimport EmberObject, { computed } from '@ember/object';\nimport RSVP from 'rsvp';\nimport { isAbortError, isAjaxError } from 'ember-ajax/errors';\nimport { task, timeout } from 'ember-concurrency';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport find from 'lodash/find';\nimport findIndex from 'lodash/findIndex';\nimport isEqual from 'lodash/isEqual';\nimport merge from 'lodash/merge';\nimport omitBy from 'lodash/omitBy';\nimport orderBy from 'lodash/orderBy';\nimport reduce from 'lodash/reduce';\nimport { addPageAction } from '../utils/newrelic';\nimport AppInstance, { APP_PROBLEMS, APP_STATES } from './app-instance';\n\n/**\n * An AppPool manages a collection of apps, appInstances, and their lifecycles.  This object must\n * be used in conjuction with an app-pool component to handle the rendering lifecycle\n * of the appInstances.  Because it handles lifecycles and is render aware, it should also\n * be used for ephemeral apps that need lifecycle hooks called.\n *\n * If a getMaxActive size is set, then the pool will limit the number of concurrent\n * apps; however, apps transitioning into/out of active state will still be\n * included in renderedApps and must still be rendered to the dom to afford the\n * apps time to boot and shutdown appropriately.\n *\n * Top level pool state such as app loading state, if an app is being shown, or\n * if a requested app is unavailable will be represented in currState and the\n * details will contain applicable details.\n *\n * Individual app state such as loading, bootstrapping, app config changes,\n * runtime problems, etc. will be stored in the instance.\n *\n * Only one instance of an app can be \"active\" (loading, booting, or running)\n * at a given time; however, there may be other instances of the same app that are\n * transitioning out of the pool (e.g. stopping, stopped).\n *\n * Top-level Pool States\n *\n * LOADING - Apps are being loaded for the first time or a load failure is being\n *  retried.  Note that this state is NOT re-entered when apps are periodically\n *  refreshed; Instead, the pool will merge running apps behind the scenes.  See\n *  the AppInstance model for details.\n *  {\n *    loadRetryAttempt: true|false, // Indicates that this is an initial load retry attempt\n *    autoAttempt: true|false, // The loading request was made automatically by the pool\n *  }\n *\n * LOAD_FAILED - Initial load of the pool failed.  This state is recoverable\n *  automatically if loadRetryBaseMillis is configured or manually via the\n *  reloadApps call.  If an app was previously\n *  attempted to be shown, that state will attempt to be restored if the load\n *  eventually succeeds.\n *\n *  This state will not occur if a reloadApps fails after a successful init.  In\n *  this case, the pool will remain with the existing apps until a successful\n *  reload.\n *\n *  {\n *      loadRetryScheduled: true|false\n *  }\n *\n * IDLE - Apps are successfully loaded, but no app is being used\n *  null - No Details\n *\n * APP_NOT_FOUND - The requested app is not known to this pool\n *  {\n *      appId: <id> // The attempted app Id\n *  }\n *\n * ALLOCATING_SPACE - Space is being made for the requested instance\n *  {\n *    // the pending instance's details\n *    appId: app.id,\n *    instanceId: pendingInstance.instanceId,\n *    instance: pendingInstance\n *  }\n *\n * SHOWING_APP - An app is active.  Note: App may be loading or have a problem.\n *  @see {app-instance} for the enumerated states of an instance\n *  {\n *    // active instance details\n *    appId: app.id,\n *    instanceId: pendingInstance.instanceId,\n *    instance: pendingInstance\n *  }\n *\n * ALLOCATION_FAILED - Space could not be made for the requested instance\n *  {\n *    // the failed instance's details\n *    appId: app.id,\n *    app\n *  }\n *\n * Events:\n *  appPoolReloaded - Triggered when this pool's apps have been reloaded either\n *      manually or via a scheduled refresh\n *\n * @see {app-instance} For details on lifecylce, hooks, events, etc.\n */\n\nexport const APPS_RELOADED_EVENT = 'appPoolReloaded';\n\nexport const POOL_STATES = {\n    IDLE: 'idle',\n    LOADING: 'loading',\n    APP_NOT_FOUND: 'appNotFound',\n    ALLOCATING_SPACE: 'allocating',\n    SHOWING_APP: 'showingApp',\n    ALLOCATION_FAILED: 'allocationFailed',\n    LOAD_FAILED: 'loadFailed'\n};\n\nconst AppPool = EmberObject.extend(Evented, LoggerMixin, {\n    // Public params\n    /**\n     * Optional, dev-friendly pool name used for logging purposes.\n     */\n    poolName: null,\n\n    /**\n     * A function that returns the maximum number of concurrent running\n     * apps (does not include apps shutting down). The app pool size is not dynamic and\n     * will not properly respond to changing the value this function returns.\n     */\n    getMaxActive: null,\n    /**\n     * Function to fetch apps for this pool.  Must return a Promise.  Will be used\n     * to load and refresh the pool.\n     */\n    fetchAppsFn: null,\n\n    /**\n     * Base millis for incremental backoff retries (with jitter) of initial apps load failures.\n     * Set <= 0 to disable auto retry and allow manual retry.\n     */\n    loadRetryBaseMillis: -1,\n\n    /**\n     * Max base millis to use in the initial apps load retry backoff.  If not specified,\n     * retry will grow without bound.  If specified and reached, retry will be\n     * loadRetryMaxBackoffMillis + random([0, .1loadRetryMaxBackoffMillis]).\n     */\n    loadRetryMaxBackoffMillis: -1,\n\n    /**\n     * Millis to wait until refreshing the list of apps in the pool.\n     * Apps will be smartly merged per logic in reloadApps.\n     */\n    reloadAppsIntervalMillis: -1,\n\n    /**\n     * Base millis for exponential backoff of reload retries if the initial interval attempt fails.\n     * Full jitter will be applied until reloadAppsIntervalMillis is hit.  Once reached,\n     * retry will be reloadAppsIntervalMillis + random([0, .1reloadAppsIntervalMillis]).\n     */\n    reloadAppsRetryBaseMillis: 1000,\n\n    /**\n     * The number of millis to wait between checks for stopped instances.\n     *\n     * Primarily configurable for testing purposes.\n     */\n    stoppedInstanceRemovalInterval: 500,\n\n    // Public Props\n    currState: {\n        name: null,\n        details: null\n    },\n    /**\n     * A list of app instances whose iframe elements MUST be rendered.\n     * This list will include transitional apps and, therefore, is not suitable to query\n     * for which apps are actively being used by the user.\n     */\n    renderedAppInstances: alias('_renderedInstances'),\n\n    // Private Props\n    _loadAppsPromise: null, // Holds the initial apps load promise (and reload promise if the initial load fails)\n    _showFailureRestoreAppId: null, // Holds attempted show appId in case the load fails and needs reloaded\n    _loadRetryAttempts: 0, // Holds the number of load retry attempts (Used to calculate backoff)\n    _loadRetryScheduled: bool('_loadRetryTask.isRunning'), // Computed indicating if a retry is scheduled\n\n    _reloadFailureCount: 0, // Failure attempts since last successful reload\n\n    skipLongRunningTasks: false,\n\n    appAttentionCounts: computed('_renderedInstances.[]', '_renderedInstances.@each.attentionCount', function () {\n        let counts = EmberObject.create({});\n        let runningInstances = this._searchInstances(this._renderedInstances, {\n            appId: null,\n            maxState: APP_STATES.RUNNING\n        });\n\n        runningInstances.forEach(currInstance => {\n            counts.set(currInstance.get('app.id'), currInstance.get('attentionCount'));\n        });\n\n        return counts;\n    }),\n\n    totalAttentionCount: computed('appAttentionCounts', function () {\n        let keys = Object.keys(this.appAttentionCounts);\n        let sum = 0;\n        keys.forEach(key => {\n            sum += this.get(`appAttentionCounts.${key}`);\n        });\n        return sum;\n    }),\n\n    init() {\n        this._super(...arguments);\n        this.setProperties({\n            _apps: [],\n            _renderedInstances: [],\n            currState: {\n                name: null,\n                details: null\n            },\n            _fetchFailureLog: {\n                abortedCount: 0,\n                endpointFailureCount: 0\n            }\n        });\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n\n        let instances = this._renderedInstances;\n        if (instances && instances.length > 0) {\n            instances.forEach(currInstance => {\n                if (currInstance && !currInstance.isDestroying && !currInstance.isDestroyed) {\n                    currInstance.destroy();\n                }\n            });\n        }\n    },\n\n    /**\n     * Returns a promise resolving with the list of loaded apps or rejected due to load failure\n     */\n    findAllApps() {\n        return this._loadApps().then(() => {\n            return this._apps;\n        });\n    },\n\n    /**\n     * Returns a promise that will be resolved with the newly shown instance if successful\n     * or rejected if the show operation could not be performed (See pool failure states)\n     */\n    showApp(appId) {\n        return this._findApp(appId)\n            .then(app => {\n                let [existingInstance] = this._searchInstances(this._renderedInstances, {\n                    appId,\n                    maxState: APP_STATES.RUNNING\n                });\n\n                return new RSVP.Promise(resolve => {\n                    if (existingInstance) {\n                        existingInstance.focus();\n\n                        this._setState(POOL_STATES.SHOWING_APP, {\n                            appId,\n                            instanceId: existingInstance.instanceId,\n                            instance: existingInstance\n                        });\n\n                        resolve(this.currState);\n                    } else {\n                        resolve(this._allocateNewInstance(app));\n                    }\n                });\n            })\n            .catch(reason => {\n                if (reason && typeof reason === 'object' && Object.prototype.hasOwnProperty.call(reason, 'name')) {\n                    // A promise already rejected with state\n\n                    if (reason.name === POOL_STATES.LOAD_FAILED) {\n                        // store the attempted appId here incase the user wants to reload\n                        this.set('_showFailureRestoreAppId', appId);\n                    }\n\n                    // reject it on through\n                    return RSVP.reject(reason);\n                } else {\n                    this._setState(POOL_STATES.APP_NOT_FOUND, {\n                        appId\n                    });\n\n                    return RSVP.reject(this.currState);\n                }\n            });\n    },\n\n    /**\n     * Hides the specified running instance, sets it's last used ts, and sets the pool to idle\n     *\n     * @returns a promise that will be resolved with the hidden instance\n     * details or rejected if the instance could not be found, was not running,\n     * or was not shown.\n     * (See pool failure states)\n     */\n    hideApp(instanceId) {\n        return this._loadApps().then(() => {\n            if (!instanceId) {\n                return RSVP.reject(this.currState);\n            }\n\n            let [runningInstance] = this._searchInstances(this._renderedInstances, {\n                instanceId,\n                maxState: APP_STATES.STOPPING\n            });\n\n            if (\n                runningInstance &&\n                this.get('currState.name') === POOL_STATES.SHOWING_APP &&\n                this.get('currState.details.instance.instanceId') === runningInstance.get('instanceId')\n            ) {\n                runningInstance.blur();\n                this._setState(POOL_STATES.IDLE);\n                return {\n                    appId: runningInstance.get('appId'),\n                    instanceId: runningInstance.instanceId,\n                    instance: runningInstance\n                };\n            } else {\n                return RSVP.reject(this.currState);\n            }\n        });\n    },\n\n    /**\n     * Stops the specified running instance, if available.  The instance will\n     * still complete its lifecycle as configured.  The pool state will not be\n     * modified.\n     *\n     * @returns a promise that will be resolved with the stopped instance\n     * details or rejected if the instance could not be found or was not running.\n     * (See pool failure states)\n     */\n    stopApp(instanceId) {\n        return this._loadApps().then(() => {\n            if (!instanceId) {\n                return RSVP.reject(this.currState);\n            }\n\n            let [runningInstance] = this._searchInstances(this._renderedInstances, {\n                instanceId,\n                maxState: APP_STATES.RUNNING\n            });\n\n            if (runningInstance) {\n                runningInstance.stop();\n\n                this._monitorAppLifecycles();\n\n                return {\n                    appId: runningInstance.get('appId'),\n                    instanceId: runningInstance.instanceId,\n                    instance: runningInstance\n                };\n            } else {\n                return RSVP.reject(this.currState);\n            }\n        });\n    },\n\n    /**\n     * Reattempt a failed app load or fetch and merge latest apps with current apps.\n     * Note: if the pool is configured for auto-reload attempts on failure, calling this\n     * manually while in a LOAD_FAILED state will have no effect and always reject\n     * with LOAD_FAILED status.\n     *\n     * If an instance is running and its backing app is updated/removed, the current\n     * app version will be used/retained.  Once the app instance is no longer running,\n     * (i.e. the user confirms removal) a subsequent reloadApps call will\n     * replace/remove the app.\n     *\n     * @returns a promise which resolves/rejects with the current pool state.  Note that\n     * the promise may reject but the pool state will be a success state.  This indicates\n     * that the reload failed, but the existing apps are still being used.\n     */\n    reloadApps() {\n        return this._reloadApps();\n    },\n\n    /**\n     * Helper method to differentiate internal and external requests\n     *\n     * @private\n     */\n    _reloadApps(internalLoadRetry = false) {\n        return this._loadApps()\n            .then(() => {\n                // Fetch current apps and overlay with any running, existing apps\n                return this.__fetchApps().then(latestApps => {\n                    let mergedApps = [];\n\n                    this._searchInstances(this._renderedInstances, {\n                        appId: null,\n                        maxState: APP_STATES.RUNNING\n                    }).forEach(runningInstance => {\n                        let newApp = find(latestApps, { id: runningInstance.get('appId') });\n\n                        let problem = null;\n                        if (!newApp) {\n                            problem = APP_PROBLEMS.APP_DELETED;\n                        } else if (!isEqual(newApp, runningInstance.app)) {\n                            problem = APP_PROBLEMS.APP_UPDATED;\n                        }\n\n                        if (problem) {\n                            // App has been removed or changed, keep the existing until\n                            // the user shuts down the running app\n                            runningInstance.setProblem(problem);\n                            mergedApps.push(runningInstance.app);\n                        }\n                    });\n\n                    // Add all latestApps that have not been overridden by current apps\n                    latestApps.forEach(currNewApp => {\n                        if (findIndex(mergedApps, { id: currNewApp.id }) < 0) {\n                            mergedApps.push(currNewApp);\n                        }\n                    });\n\n                    this.set('_apps', mergedApps);\n\n                    return this.currState;\n                });\n            })\n            .catch(reason => {\n                if (\n                    reason &&\n                    reason.name &&\n                    reason.name === POOL_STATES.LOAD_FAILED &&\n                    (!this._loadRetryScheduled || internalLoadRetry)\n                ) {\n                    // Initial load previously failed\n                    // OK to retry; this is an manual or internal, automatic reload request\n                    // Reload success will be broadcast in handler below or pass rejection/pool state on through\n                    return this._loadApps(true, internalLoadRetry);\n                }\n\n                // Failed on subsequent app reload\n                // Leave the current pool-state and/or apps alone and just reject this function's promise\n                return RSVP.reject(this.currState);\n            })\n            .then(loadResult => {\n                this.trigger(APPS_RELOADED_EVENT);\n\n                let restoreAppId = this._showFailureRestoreAppId;\n                if (restoreAppId) {\n                    // reload attempt succeeded; retry appId one more time\n                    this.set('_showFailureRestoreAppId', null);\n\n                    return this.showApp(restoreAppId);\n                } else {\n                    return loadResult;\n                }\n            });\n    },\n\n    _setState(name, details = null) {\n        this.set('currState.name', name);\n        this.set('currState.details', details);\n        this.notifyPropertyChange('currState');\n        this._logPoolEvent('stateUpdate');\n    },\n\n    _findApp(appId) {\n        return this._loadApps().then(() => {\n            let app = find(this._apps, { id: appId });\n            return app || RSVP.reject('appNotFound');\n        });\n    },\n\n    /**\n     * Singleton initial load of apps.  All calls wait on this initial load\n     * to ensure a base state of the pool (loaded or failure).\n     *\n     * LOAD SUCCESS:\n     * Sets the pool state to idle and will initiate automatic app refresh\n     * if the pool owner has configured it via reloadAppsIntervalMillis.  If the\n     * owner has not configured automatic refresh, it can be manually triggered\n     * via reloadApps.\n     *\n     * LOAD FAILURE:\n     * In the event of load failure, load can be retried by passing true for\n     * the forceReload argument. Note that forceReload will still only allow\n     * one concurrent reload call. The pool can be configured to automatically\n     * attempt reloads via loadRetryBaseMillis.\n     *\n     * @private\n     */\n    _loadApps(forceReload = false, autoLoadRetry = false) {\n        this.logger.debug('app-pool:_loadApps', { remoteData: { forceReload, autoLoadRetry } });\n        let result = this._loadAppsPromise;\n\n        if (result === null || (forceReload && this.get('currState.name') === POOL_STATES.LOAD_FAILED)) {\n            this._setState(POOL_STATES.LOADING, {\n                loadRetryAttempt: forceReload,\n                autoAttempt: autoLoadRetry\n            });\n            this.set(\n                '_loadAppsPromise',\n                (result = this.__fetchApps()\n                    .then(apps => {\n                        this.logger.debug('app-pool:_loadApps __fetchApps succeeded', {\n                            apps,\n                            remoteData: { apps: apps.map(app => app.get('id')) }\n                        });\n                        this.set('_apps', apps);\n                        this._setState(POOL_STATES.IDLE);\n                        if (!this.skipLongRunningTasks) {\n                            this._scheduleAppReload();\n                        }\n                        return this.currState;\n                    })\n                    .catch(e => {\n                        this.logger.debug('app-pool:_loadApps __fetchApps threw exception', e);\n                        let autoRetry = this.loadRetryBaseMillis > 0;\n                        this._setState(POOL_STATES.LOAD_FAILED, {\n                            loadRetryScheduled: autoRetry\n                        });\n                        if (autoRetry) {\n                            this._retryInitialAppLoad();\n                        }\n                        return RSVP.reject(this.currState);\n                    }))\n            );\n        }\n\n        return result;\n    },\n\n    /**\n     * Schedules an app load retry in the future based on attempt state (backoff, jitter, etc.)\n     *\n     * @private\n     */\n    _retryInitialAppLoad() {\n        let retryBase = this.loadRetryBaseMillis;\n        if (retryBase > 0) {\n            // pool owner requested automatic retry\n            let retryAttempts = this.incrementProperty('_loadRetryAttempts');\n\n            let retryInterval = retryBase * Math.pow(2, retryAttempts - 1);\n\n            let maxRetryDuration = this.loadRetryMaxBackoffMillis;\n            if (maxRetryDuration > 0 && retryInterval >= maxRetryDuration) {\n                // Max specified and reached; use max and a little jitter\n                retryInterval = maxRetryDuration + Math.floor(Math.random() * (maxRetryDuration * 0.1));\n            } else {\n                // Standard retry, Using \"full jitter\"\n                retryInterval = Math.floor(Math.random() * retryInterval);\n            }\n\n            this._loadRetryTask.perform(retryInterval);\n        }\n    },\n\n    _loadRetryTask: task(function* (retryInterval) {\n        let timeoutVal = retryInterval;\n        this.logger.debug('app-pool:_loadRetryTask Pausing before retry', { remoteData: { timeoutVal } });\n        yield timeout(timeoutVal);\n        try {\n            yield this._reloadApps(true);\n        } catch (e) {\n            let abortedAttempts = this.get('_fetchFailureLog.abortedCount');\n            let endpointAttempts = this.get('_fetchFailureLog.endpointFailureCount');\n            if (abortedAttempts + endpointAttempts === 6) {\n                const msg =\n                    'Apps Initial load and 5 retry attempts failed. Continuing to retry but should be investigated';\n                console.warn(this._decorateLogStatement(msg), {\n                    remoteData: { abortedAttempts, endpointAttempts }\n                });\n            }\n        }\n    }),\n\n    /**\n     * Handles scheduling, rescheduling, and backoff of app refreshes per pool config\n     *\n     * @private\n     */\n    _scheduleAppReload() {\n        let reloadInterval = this.reloadAppsIntervalMillis;\n        this.logger.debug('app-pool:_scheduleAppReload', { remoteData: { reloadInterval } });\n        if (reloadInterval > 0) {\n            // pool owner requested automatic refresh\n\n            let reloadWait = reloadInterval;\n\n            let reloadFailureCount = this._reloadFailureCount;\n            this.logger.debug('app-pool:_scheduleAppReload', { remoteData: { reloadFailureCount } });\n            if (reloadFailureCount > 0) {\n                // Previous reload failed; backoff and retry\n                reloadWait = Math.min(\n                    reloadInterval,\n                    this.reloadAppsRetryBaseMillis * Math.pow(2, reloadFailureCount - 1)\n                );\n                if (reloadWait === this.reloadAppsIntervalMillis) {\n                    // Max reached; use max and a little jitter\n                    reloadWait += Math.floor(Math.random() * (reloadWait * 0.1));\n                } else {\n                    // Standard retry, Using \"full jitter\"\n                    reloadWait = Math.floor(Math.random() * reloadWait);\n                }\n            }\n            this.logger.debug('app-pool:_scheduleAppReload Kicking off reloadTimer', { remoteData: { reloadWait } });\n            this._reloadTimerTask.perform(reloadWait);\n        }\n    },\n\n    _reloadTimerTask: task(function* (reloadWait) {\n        yield timeout(reloadWait);\n        try {\n            yield this.reloadApps();\n            this.set('_reloadFailureCount', 0);\n        } catch (e) {\n            this.incrementProperty('_reloadFailureCount');\n            if (this.get('_fetchFailureLog.endpointFailureCount') === 6) {\n                console.warn(\n                    this._decorateLogStatement(\n                        'Apps Reload and 5 retry attempts failed. Continuing to retry but should be investigated'\n                    )\n                );\n            } else if (this.get('_fetchFailureLog.abortedCount') === 11) {\n                console.info(\n                    this._decorateLogStatement(\n                        'Apps Reload and 10 retry attempts have been cancelled. This could indicate a lost network connection or CORS issue. Continuing to retry but should be investigated'\n                    )\n                );\n            }\n        } finally {\n            if (!this.skipLongRunningTasks) {\n                this._scheduleAppReload();\n            }\n        }\n    }),\n\n    /**\n     * Internal utility to fetch the apps via the fetchAppsFn\n     *\n     * Important Note: __fetchApps will fetch regardless of pool state.  It is free of side effects,\n     * but will be wasteful if invoked at the wrong state of the pool.  Specifically,\n     * it is only applicable (and should only be called) during the initial apps\n     * load, load failure retries, and apps reloads after successful, initial load\n     * has occurred.\n     *\n     * @returns A promise that resolves with the list of apps or rejects with the reason\n     *\n     * @private\n     */\n    __fetchApps() {\n        return new RSVP.Promise((resolve, reject) => {\n            this.logger.debug('app-pool:__fetchApps entry');\n            let fetchAppsFn = this.fetchAppsFn;\n            if (typeof fetchAppsFn !== 'function') {\n                console.error(this._decorateLogStatement('No/Invalid App Fetch function'));\n                reject('badFetchFunction');\n            } else {\n                try {\n                    fetchAppsFn()\n                        .then(apps => {\n                            this.logger.debug('app-pool:__fetchApps fetchAppsFn returned', apps);\n                            this.set('_fetchFailureLog.abortedCount', 0);\n                            this.set('_fetchFailureLog.endpointFailureCount', 0);\n\n                            if (!Array.isArray(apps)) {\n                                console.error(\n                                    this._decorateLogStatement('Invalid App Fetch Payload. Expected Array.'),\n                                    { remoteData: { typeOfApps: typeOf(apps) } }\n                                );\n                                reject('invalidFetchPayload');\n                            } else {\n                                resolve(apps);\n                            }\n                        })\n                        .catch(reason => {\n                            this.logger.debug('app-pool:__fetchApps apps fetch failed', reason);\n                            if (isAjaxError(reason) && isAbortError(reason)) {\n                                // Skipping logging to avoid flooding sumo with false positives related to the browser sleeping.\n                                // Will log excessive cancelled retries which might indicate a cors issue\n                                this.incrementProperty('_fetchFailureLog.abortedCount');\n                                reject('abortedRequest');\n                            } else {\n                                console.info(this._decorateLogStatement('App fetch request failed.'), { reason });\n                                this.incrementProperty('_fetchFailureLog.endpointFailureCount');\n                                reject('endpointFailure');\n                            }\n                        });\n                } catch (error) {\n                    console.error(this._decorateLogStatement('Failed to invoke App Fetch function.'), { error });\n                    reject('fetchFunctionRuntimeError');\n                }\n            }\n        });\n    },\n\n    _allocateNewInstance(app) {\n        let pendingInstance = AppInstance.create({\n            app\n        });\n\n        this._setState(POOL_STATES.ALLOCATING_SPACE, {\n            appId: app.id,\n            instanceId: pendingInstance.instanceId,\n            instance: pendingInstance\n        });\n\n        return new RSVP.Promise((resolve, reject) => {\n            this._allocateSpace()\n                .then(() => {\n                    // Room at the inn\n                    pendingInstance.start();\n                    this._renderedInstances.pushObject(pendingInstance);\n\n                    this._setState(POOL_STATES.SHOWING_APP, {\n                        appId: app.id,\n                        instanceId: pendingInstance.instanceId,\n                        instance: pendingInstance\n                    });\n\n                    resolve(this.currState);\n                })\n                .catch(() => {\n                    pendingInstance.destroy();\n\n                    this._setState(POOL_STATES.ALLOCATION_FAILED, {\n                        appId: app.id,\n                        app\n                    });\n\n                    reject(this.currState);\n                });\n        });\n    },\n\n    _allocateSpace() {\n        let getMaxActive = this.getMaxActive;\n        if (getMaxActive) {\n            let renderedInstances = this._renderedInstances;\n\n            let existingInstances = this._searchInstances(renderedInstances, {\n                appId: null,\n                maxState: APP_STATES.RUNNING\n            });\n\n            if (existingInstances.length >= getMaxActive()) {\n                // Make way\n                let sortedInstances = orderBy(\n                    existingInstances,\n                    ['app.lifecycle.ephemeral', 'lastUserAccessTimestamp'],\n                    ['desc', 'asc']\n                );\n\n                let instanceToEvict = sortedInstances[0];\n                instanceToEvict.stop();\n                this._logPoolEvent('eviction', { evictedAppId: instanceToEvict.get('appId') });\n                this._monitorAppLifecycles();\n            }\n        }\n\n        return RSVP.resolve();\n    },\n\n    _searchInstances(instances, { instanceId = null, appId = null, states = [], maxState = null } = {}) {\n        let result = [];\n\n        if (instances && Array.isArray(instances) && instances.length > 0) {\n            if (states && Array.isArray(states) && states.length > 0) {\n                result = instances.filter(currInstance => {\n                    let instanceState = currInstance.get('currState');\n                    return states.indexOf(instanceState) >= 0;\n                });\n            } else if (maxState) {\n                result = instances.filter(currInstance => {\n                    let currInstanceState = currInstance.get('currState');\n                    return maxState.compareTo(currInstanceState) >= 0;\n                });\n            } else {\n                result = instances;\n            }\n\n            if (instanceId) {\n                let specificInstance = find(result, { instanceId });\n                result = specificInstance ? [specificInstance] : [];\n            } else if (appId) {\n                result = result.filter(instance => appId === instance.get('appId'));\n            }\n        }\n\n        return result;\n    },\n\n    _monitorAppLifecycles() {\n        if (this._removeStopped() && !this.skipLongRunningTasks) {\n            this._monitorAppLifecyclesTask.perform();\n        }\n    },\n\n    _monitorAppLifecyclesTask: task(function* () {\n        yield timeout(this.stoppedInstanceRemovalInterval);\n        this._monitorAppLifecycles();\n    }),\n\n    _removeStopped() {\n        let renderedInstances = this._renderedInstances;\n\n        let stoppedInstances = this._searchInstances(renderedInstances, {\n            states: [APP_STATES.STOPPED]\n        });\n        stoppedInstances.forEach(currInstance => {\n            currInstance.destroy();\n            renderedInstances.removeObject(currInstance);\n        });\n\n        return (\n            this._searchInstances(renderedInstances, {\n                states: [APP_STATES.STOPPING]\n            }).length > 0\n        );\n    },\n\n    _decorateLogStatement(logText) {\n        let prefix = 'AppPool';\n        let poolName = this.poolName;\n        if (poolName && typeOf(poolName) === 'string') {\n            prefix += ` (${poolName})`;\n        }\n\n        return `${prefix}: ${logText}`;\n    },\n\n    _logPoolEvent(poolEvent, poolEventDetails = {}) {\n        const getMaxActive = this.getMaxActive;\n        const attrs = {\n            poolEvent,\n            poolName: this.poolName,\n            poolState: this.get('currState.name'),\n            maxPoolSize: getMaxActive && getMaxActive(),\n            renderedApps: this.get('renderedAppInstances.length'),\n            totalAttentionCount: this.totalAttentionCount\n        };\n\n        // Only grab primitive fields from the current pool state details\n        // to avoid trying to send NR full app/app-instance models\n        const primitivePoolStateDetails = omitBy(\n            this.get('currState.details'),\n            prop => prop && typeof prop === 'object'\n        );\n        const poolStateDetails = reduce(\n            primitivePoolStateDetails,\n            (acc, val, key) => {\n                acc[`poolState.${key}`] = val;\n                return acc;\n            },\n            {}\n        );\n\n        addPageAction('clientAppPoolEvent', merge({}, poolEventDetails, poolStateDetails, attrs));\n    }\n});\n\nexport default AppPool;\n","import EmberObject, { computed } from '@ember/object';\nimport { copy } from '@ember/object/internals';\nimport { getOwner } from '@ember/application';\nimport { isPresent, typeOf } from '@ember/utils';\nimport Ember from 'ember';\nimport _ from 'lodash';\nimport appUtils from '../utils/apps';\n\nconst { Copyable } = Ember;\n\nconst LIFECYCLE_DEFAULTS = {\n    ephemeral: false,\n    hooks: {\n        bootstrap: false,\n        focus: false,\n        blur: false,\n        stop: false\n    }\n};\n\nexport const DISPLAY_TYPES = {\n    STANDALONE: 'standalone',\n    WIDGET: 'widget',\n    INTERAPPTION: 'interactionWidget'\n};\n\nexport const FEATURE_CATEGORIES = {\n    DIRECTORY: 'directory',\n    CONTACT_CENTER_INSIGHTS: 'contactCenterInsights'\n};\n\nexport const ASSET_CATEGORIES = ['icon', 'monochromicIcon'];\n\nconst URL_REPLACEMENT_PREFIX = '{{';\nconst URL_REPLACEMENT_SUFFIX = '}}';\n// PC\nconst LANG_TAG_URL_REPLACEMENT_VAR_NAME = 'pcLangTag';\nexport const LANG_TAG_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${LANG_TAG_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst PC_ENV_URL_REPLACEMENT_VAR_NAME = 'pcEnvironment';\nexport const PC_ENV_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${PC_ENV_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst PC_CONVERSATION_ID_URL_REPLACEMENT_VAR_NAME = 'pcConversationId';\nexport const PC_CONVERSATION_ID_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${PC_CONVERSATION_ID_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst USE_POPUP_AUTH_URL_REPLACEMENT_VAR_NAME = 'pcUsePopupAuth';\nexport const USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${USE_POPUP_AUTH_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\n// GC\nconst GC_LANG_TAG_URL_REPLACEMENT_VAR_NAME = 'gcLangTag';\nexport const GC_LANG_TAG_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${GC_LANG_TAG_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst GC_INTERACTION_ID_URL_REPLACEMENT_VAR_NAME = 'gcInteractionId';\nexport const GC_INTERACTION_ID_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${GC_INTERACTION_ID_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst GC_CONVERSATION_ID_URL_REPLACEMENT_VAR_NAME = 'gcConversationId';\nexport const GC_CONVERSATION_ID_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${GC_CONVERSATION_ID_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst GC_WORKITEM_ID_URL_REPLACEMENT_VAR_NAME = 'gcWorkitemId';\nexport const GC_WORKITEM_ID_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${GC_WORKITEM_ID_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst GC_INTERACTION_TYPE_URL_REPLACEMENT_VAR_NAME = 'gcInteractionType';\nexport const GC_INTERACTION_TYPE_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${GC_INTERACTION_TYPE_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst GC_USE_POPUP_AUTH_URL_REPLACEMENT_VAR_NAME = 'gcUsePopupAuth';\nexport const GC_USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${GC_USE_POPUP_AUTH_URL_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst GC_HOST_ORIGIN_REPLACEMENT_VAR_NAME = 'gcHostOrigin';\nexport const GC_HOST_ORIGIN_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${GC_HOST_ORIGIN_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\nconst GC_TARGET_ENV_REPLACEMENT_VAR_NAME = 'gcTargetEnv';\nexport const GC_TARGET_ENV_REPLACEMENT_TOKEN = `${URL_REPLACEMENT_PREFIX}${GC_TARGET_ENV_REPLACEMENT_VAR_NAME}${URL_REPLACEMENT_SUFFIX}`;\n\nconst TOKEN_REPLACEMENTS = {\n    // PC\n    [LANG_TAG_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: LANG_TAG_URL_REPLACEMENT_VAR_NAME,\n        replacementProp: 'langTag'\n    },\n    [PC_ENV_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: PC_ENV_URL_REPLACEMENT_VAR_NAME,\n        replacementProp: 'envTld'\n    },\n    [PC_CONVERSATION_ID_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: PC_CONVERSATION_ID_URL_REPLACEMENT_VAR_NAME,\n        replacementProp: 'interactionId'\n    },\n    [USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: USE_POPUP_AUTH_URL_REPLACEMENT_VAR_NAME,\n        replacementProp: 'usePopupAuth'\n    },\n    // GC\n    [GC_LANG_TAG_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: GC_LANG_TAG_URL_REPLACEMENT_VAR_NAME,\n        replacementProp: 'langTag'\n    },\n    [GC_INTERACTION_ID_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: GC_INTERACTION_ID_URL_REPLACEMENT_VAR_NAME,\n        replacementProp: 'interactionId'\n    },\n    [GC_CONVERSATION_ID_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: GC_CONVERSATION_ID_URL_REPLACEMENT_VAR_NAME,\n        replacementValue: (interactionId, interactionType) => {\n            return interactionType === 'conversation' ? interactionId : '';\n        }\n    },\n    [GC_WORKITEM_ID_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: GC_WORKITEM_ID_URL_REPLACEMENT_VAR_NAME,\n        replacementValue: (interactionId, interactionType) => {\n            return interactionType === 'workitem' ? interactionId : '';\n        }\n    },\n    [GC_INTERACTION_TYPE_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: GC_INTERACTION_TYPE_URL_REPLACEMENT_VAR_NAME,\n        replacementProp: 'interactionType'\n    },\n    [GC_USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN]: {\n        queryParamName: GC_USE_POPUP_AUTH_URL_REPLACEMENT_VAR_NAME,\n        replacementProp: 'usePopupAuth'\n    },\n    [GC_HOST_ORIGIN_REPLACEMENT_TOKEN]: {\n        queryParamName: GC_HOST_ORIGIN_REPLACEMENT_VAR_NAME,\n        replacementProp: 'gcHostOrigin'\n    },\n    [GC_TARGET_ENV_REPLACEMENT_TOKEN]: {\n        queryParamName: GC_TARGET_ENV_REPLACEMENT_VAR_NAME,\n        replacementProp: 'gcTargetEnv'\n    }\n};\n\nexport const URL_REPLACEMENTS = Object.entries(TOKEN_REPLACEMENTS).map(\n    ([replacementToken, { queryParamName, replacementProp, replacementValue }]) => {\n        return {\n            regExp: new RegExp(replacementToken, 'g'),\n            queryParamName,\n            replacementProp,\n            replacementValue\n        };\n    }\n);\n\nexport const INTERAPPTION_PRIMARY_MEDIA_TYPE_FILTERS = ['chat', 'call', 'callback', 'email'];\nexport const INTERAPPTION_MESSAGE_SUB_TYPE_FILTERS = [\n    'apple',\n    'sms',\n    'line',\n    'facebook',\n    'open',\n    'instagram',\n    'twitter',\n    'webmessaging',\n    'whatsapp'\n];\nexport const INTERAPPTION_COMMUNICATION_TYPE_FILTERS = [\n    ...INTERAPPTION_PRIMARY_MEDIA_TYPE_FILTERS,\n    ...INTERAPPTION_MESSAGE_SUB_TYPE_FILTERS\n];\nexport const NO_SUPPORTED_COMMUNICATION_TYPE_FILTER = 'none';\n\nconst App = EmberObject.extend(Copyable, {\n    typeId: null,\n    id: null,\n    name: null,\n    urlTemplate: null,\n    langTag: null,\n    envTld: null,\n    usePopupAuth: false,\n    displayType: null, // The type of app which dictates how an app behaves, where an app is displayed, etc. - standalone, widget, etc.\n    featureCategory: null, // The category of an app's behavior for grouping purposes - directory, performance, help, etc.\n    permissionsPolicy: null,\n    // sandbox, assets, lifecycle, permissionsPolicy - set in init\n\n    // Interapption specific properties\n    interactionId: null,\n    interactionType: null,\n    /**\n     * When not empty (>= 1 entry), will restrict the interapption to the specified queues\n     */\n    enabledQueueIds: null,\n    /**\n     * When not empty (>= 1 entry), will restrict the interapption to the specified communication types.\n     * Currently, this only includes the initial communication type (it does not include elevations).\n     * When it includes 'none', it will not display the interapption for any communication type.\n     */\n    enabledCommunicationTypes: null,\n    enableWorkitem: null,\n    gcHostOrigin: null,\n    gcTargetEnv: null,\n\n    init() {\n        this._super(...arguments);\n\n        if (!this.sandbox) {\n            this.set('sandbox', []);\n        }\n\n        if (!this.assets) {\n            this.set('assets', {});\n        }\n\n        if (!this.permissionsPolicy) {\n            this.set('permissionsPolicy', []);\n        }\n\n        this.set('lifecycle', _.merge(copy(LIFECYCLE_DEFAULTS, true), this.lifecycle));\n    },\n\n    url: computed('urlTemplate', 'langTag', 'envTld', 'interactionId', 'usePopupAuth', 'gcHostOrigin', 'gcTargetEnv', {\n        get() {\n            let result = this.urlTemplate;\n            if (typeOf(result) === 'string' && isPresent(result)) {\n                URL_REPLACEMENTS.forEach(currReplacement => {\n                    let replacementValue = '';\n                    if (currReplacement.replacementValue) {\n                        if (this.interactionId && this.interactionType)\n                            replacementValue = currReplacement.replacementValue(\n                                this.interactionId,\n                                this.interactionType\n                            );\n                    } else {\n                        const rawValue = this.get(currReplacement.replacementProp);\n                        replacementValue = isPresent(rawValue) ? rawValue : '';\n                    }\n                    if (encodeURIComponent) {\n                        replacementValue = encodeURIComponent(replacementValue);\n                        result = result.replace(currReplacement.regExp, replacementValue);\n                    }\n                });\n            } else {\n                result = '';\n            }\n            return result;\n        },\n        set() {\n            console.error(\n                appUtils.buildLogMsg('Set called on derived url property instead of new urlTemplate property.'),\n                {\n                    urlTemplate: this.urlTemplate,\n                    remoteData: {\n                        appId: this.id\n                    }\n                }\n            );\n\n            throw new Error('Cannot directly set url.  Use urlTemplate property.');\n        }\n    }),\n\n    getURLTemplateQueryParams() {\n        const result = [];\n        const urlTemplate = this.urlTemplate;\n        if (typeOf(urlTemplate) === 'string' && isPresent(urlTemplate)) {\n            URL_REPLACEMENTS.forEach(currReplacement => {\n                if (urlTemplate.search(currReplacement.regExp) !== -1) {\n                    result.push(currReplacement.queryParamName);\n                }\n            });\n        }\n        return result;\n    },\n\n    copy(deep) {\n        let owner = getOwner(this);\n        let ownerMixin = {};\n\n        if (owner) {\n            ownerMixin = owner.ownerInjection();\n        }\n\n        return App.create(ownerMixin, {\n            typeId: this.typeId,\n            id: this.id,\n            name: this.name,\n            urlTemplate: this.urlTemplate,\n            langTag: this.langTag,\n            envTld: this.envTld,\n            usePopupAuth: this.usePopupAuth,\n            displayType: this.displayType,\n            featureCategory: this.featureCategory,\n            sandbox: deep ? _.cloneDeep(this.sandbox) : this.sandbox,\n            assets: deep ? _.cloneDeep(this.assets) : this.assets,\n            lifecycle: deep ? _.cloneDeep(this.lifecycle) : this.lifecycle,\n            permissionsPolicy: deep ? _.cloneDeep(this.permissionsPolicy) : this.permissionsPolicy,\n            // interapption props\n            interactionId: this.interactionId,\n            interactionType: this.interactionType,\n            enabledQueueIds: deep ? _.cloneDeep(this.enabledQueueIds) : this.enabledQueueIds,\n            enabledCommunicationTypes: deep\n                ? _.cloneDeep(this.enabledCommunicationTypes)\n                : this.enabledCommunicationTypes,\n            enableWorkitem: this.enableWorkitem,\n            gcHostOrigin: this.gcHostOrigin,\n            gcTargetEnv: this.gcTargetEnv\n        });\n    }\n});\n\nexport default App;\n","import DS from 'ember-data';\nimport Communication from './communication';\n\nexport default Communication.extend({\n    // ----------------------------------------------------------------------------\n    // Raw Properties\n    // ----------------------------------------------------------------------------\n\n    recording: DS.attr(),\n    recordingState: DS.attr(),\n    muted: DS.attr(),\n    confined: DS.attr(),\n    held: DS.attr(),\n    direction: DS.attr(),\n    self: DS.attr(),\n    other: DS.attr(),\n\n    update(comUpdate) {\n        this._super(...arguments);\n        const updatableAttrs = [\n            'recording',\n            'recordingState',\n            'muted',\n            'confined',\n            'held',\n            'direction',\n            'self',\n            'other'\n        ];\n\n        const updateProperties = {};\n        for (const updatable of updatableAttrs) {\n            const updatedValue = comUpdate[updatable];\n            if (typeof updatedValue !== 'undefined') {\n                updateProperties[updatable] = updatedValue;\n            }\n        }\n\n        this.setProperties(updateProperties);\n    }\n});\n","import { equal } from '@ember/object/computed';\nimport DS from 'ember-data';\n\nconst { attr, Model } = DS;\n\nexport default Model.extend({\n    enabled: attr(),\n    phoneNumber: attr(),\n\n    calls: attr(),\n\n    voicemail: attr(),\n\n    isExternalVoicemail: equal('voicemail', 'LASTCALL')\n});\n","import DS from 'ember-data';\nimport Communication from './communication';\n\nexport default Communication.extend({\n    // ----------------------------------------------------------------------------\n    // Raw Properties\n    // ----------------------------------------------------------------------------\n\n    held: DS.attr(),\n    callbackNumbers: DS.attr(),\n    callbackUserName: DS.attr(),\n\n    update(comUpdate) {\n        this._super(...arguments);\n        const updatableAttrs = ['held', 'callbackNumbers', 'callbackUserName'];\n\n        const updateProperties = {};\n        for (const updatable of updatableAttrs) {\n            const updatedValue = comUpdate[updatable];\n            if (typeof updatedValue !== 'undefined') {\n                updateProperties[updatable] = updatedValue;\n            }\n        }\n\n        this.setProperties(updateProperties);\n    }\n});\n","import Ember from 'ember';\nimport { A } from '@ember/array';\nimport { computed, get, set } from '@ember/object';\nimport { inject } from '@ember/service';\nimport DS from 'ember-data';\nimport cloneDeep from 'lodash/cloneDeep';\nimport { isScreenMonitoringParticipant } from 'web-directory/utils/acd';\nimport RSVP from 'rsvp';\n\nconst { attr } = DS;\n\nfunction hasSipErrors(party: any) {\n    const codes = get(party, 'sipResponseCodes');\n    if (!codes || codes.length === 0) {\n        return false;\n    }\n    // 487 is Voicemail Not Available, which is not treated as an error\n    // 486 means 'Callee is busy', but we still want to see that participant.\n    // 480 means 'Callee currently unavailable'. but We still want to see that participant\n    // 410 is a queue call that gets transfered to an agent for some reason\n    const ignoredCodes = [410, 480, 486, 487];\n    return !!party.sipResponseCodes.filter((c: number) => c >= 300 && !ignoredCodes.includes(c)).length;\n}\n\n/**\n *  Determine if the party interacted with the call\n */\nfunction verifyParticipantInteracted(party: any): boolean {\n    try {\n        const callSegments = (party.calls || [])\n            .map((call: any) => call.segments)\n            .reduce((acc: any[], item: any[]) => {\n                return acc.concat(item);\n            }, []);\n        const callSegmentsTypes = callSegments.map((segment: any) => segment.type.toLowerCase());\n        return callSegmentsTypes.includes('interact');\n    } catch {\n        return false;\n    }\n}\n\nexport default DS.Model.extend({\n    // required services\n    session: inject('session'),\n    addressformat: inject('addressformat'),\n    application: inject('application'),\n    ajax: inject('ajax'),\n    intl: inject('intl'),\n\n    /**\n     * The conversation (with the same id as this call)\n     * Fetched when we need to distinguish between participants (if there are 2 or more valid otherParties)\n     * Raw object - Not the EPC model\n     */\n    conversation: null,\n\n    //  The relevant part of conversation. Each participant in this list corresponds to participants on callv2, but has\n    //  extra properties such as monitorParticipantId or coachedParticipantId\n    conversationParticipants: computed('conversation.participants', function () {\n        const conversationParties: any[] = this.get('conversation.participants') || [];\n        return conversationParties;\n    }),\n\n    participants: attr(),\n    startTime: attr('date'),\n    direction: attr('string'),\n    missedCall: attr('boolean'),\n    wasConference: attr('boolean'),\n    wasCallback: attr('boolean'),\n    wasOutboundCampaign: attr('boolean'),\n    /**\n     * call went to voicemail\n     */\n    wentToVoicemail: attr('boolean'),\n\n    callStart: computed.alias('startTime'),\n\n    sentToVoicemail: computed('wentToVoicemail', 'voicemailParticipant', function () {\n        // sent to my voicemail\n        if (!this.get('wentToVoicemail')) {\n            return false;\n        }\n        return this.get('voicemailParticipant.user.id') === this.get('myGuid');\n    }),\n    reachedVoicemail: computed.and('wentToVoicemail', 'isOutbound'), // went to other user's voicemail\n\n    /**\n     * For outbound calls 'callAnswered' will be true if the other party answerd.\n     * For inbound calls, it will be true if the logged in User answered OR if the call was a 'Group' call and someone else answered\n     */\n    callAnswered: computed('missedCall', 'groupParticipantsWhoInteracted', 'myGuid', 'groupRingCaller.id', function () {\n        const groupRingCallerId = this.get('groupRingCaller.id') || '';\n        const myGuid = this.get('myGuid');\n\n        const missedCall = this.get('missedCall');\n\n        switch (missedCall) {\n            case false:\n                return true;\n            case true:\n                const internalParticpantsWhoInteracted = this.get('groupParticipantsWhoInteracted').filter(\n                    (participant: any) => ![myGuid, groupRingCallerId].includes(participant.id)\n                );\n                return internalParticpantsWhoInteracted.length > 0;\n            default:\n                throw new Error('non boolean value for missedCall');\n        }\n    }),\n\n    /**\n     *  True if the logged in User did not ansswer the call, but someone else did (must be a Group call)\n     */\n    callAnsweredBySomeoneElse: computed('callAnswered', 'missedCall', function () {\n        return this.get('missedCall') ? this.get('callAnswered') : false;\n    }),\n\n    // my participant computeds\n    myGuid: computed.reads('session.person.guid'),\n    callEnd: computed.reads('myParticipant.endTime'),\n    isOutbound: computed.equal('myParticipant.direction', 'outbound'),\n    isMultiParty: computed.or(\n        'isOutboundCampaign',\n        'isIvrTransfer',\n        'isBlindTransfer',\n        'isGroupRing',\n        'isConsultTransfer',\n        'wasConference'\n    ),\n    myself: computed.reads('myParticipant'), // convenience for call-history-entity backward compat\n    allParticipants: computed.union(\n        'internalParticipants',\n        'externalParticipants',\n        'stationParticipants',\n        'ivrParticipants',\n        'queueParticipants'\n    ),\n\n    // an acd call is where any participant is an agent\n    isAcdCall: computed('participants.[]', function () {\n        return A(this.get('participants')).any((participant: any) => participant && participant.purpose === 'agent');\n    }),\n\n    // begin participant computed props: myParticipant, internalParticipants, externalParticipants, voicemailParticipant, otherParties\n    myParticipant: computed('participants.[]', 'myGuid', function () {\n        const nonVoicemail = this.get('participants').rejectBy('purpose', 'voicemail') || A([]);\n        let me = nonVoicemail.findBy('user.id', this.get('myGuid'));\n        if (!me) {\n            me = nonVoicemail.findBy('purpose', 'station');\n        }\n        return me;\n    }),\n\n    // internalParticipants and externalParticipants and combined in allParticipants computed above.\n    internalParticipants: computed('participants.[]', function () {\n        return (this.get('participants') || []).filter(\n            (party: any) => party.user !== undefined && party.monitoredCallId === undefined\n        );\n    }),\n\n    externalParticipants: computed('participants.[]', function () {\n        const participants = this.get('participants').reject(\n            (p: any) => get(p, 'dnis') === 'unknown' || hasSipErrors(p)\n        );\n\n        let externalParticipants = A([\n            ...participants.filterBy('purpose', 'external'),\n            ...participants.filterBy('purpose', 'customer')\n        ]);\n\n        // the edge does dumb stuff like add participants with no error code when\n        // the call gets redirected to another edge. See if there are two identical\n        // participants where both didn't interact, and if so, filter one out.\n        if (\n            externalParticipants.length === 2 &&\n            externalParticipants.filterBy('didInteract').length < 2 &&\n            externalParticipants[0].ani === externalParticipants[1].ani\n        ) {\n            externalParticipants = A([externalParticipants[0]]);\n        }\n        return externalParticipants;\n    }),\n\n    stationParticipants: computed('participants.[]', function () {\n        return this.get('participants')\n            .reject((p: any) => get(p, 'dnis') === 'unknown' || hasSipErrors(p))\n            .filterBy('purpose', 'station');\n    }),\n\n    voicemailParticipant: computed('participants.[]', function () {\n        return this.get('participants').findBy('purpose', 'voicemail');\n    }),\n\n    ivrParticipants: computed('participants.[]', function () {\n        return this.get('participants').filterBy('purpose', 'ivr');\n    }),\n\n    queueParticipants: computed('participants.[]', function () {\n        return this.get('participants').filterBy('purpose', 'acd');\n    }),\n\n    groupParticipantsWhoInteracted: computed('isGroupRing', 'conversationParticipants', function () {\n        const isGroupRing = Boolean(this.get('isGroupRing'));\n        const conversationParticipants = this.get('conversationParticipants');\n\n        if (isGroupRing) {\n            return conversationParticipants.filter(\n                (participant: any) =>\n                    ['user', 'agent'].includes(participant.purpose.toLowerCase()) && // Check the particpant is a User or Agent\n                    verifyParticipantInteracted(participant) && // Check if the participant interacted\n                    participant.calls[0].direction === 'inbound' // Ensure that the participant was not the caller\n            );\n        }\n        return [];\n    }),\n\n    // All participants that aren't the current user, or a monitor, coach, or barged participant\n    otherParties: computed('allParticipants.[]', 'myGuid', 'conversationParticipants.[]', function () {\n        const conversationParticipants = this.get('conversationParticipants');\n        return this.get('allParticipants')\n            .rejectBy('user.id', this.get('myGuid'))\n            .reject((party: any) => get(party, 'startTime') === get(party, 'endTime') || hasSipErrors(party))\n            .filter((party: any) => {\n                //  Only filter out monitors, coaches, or barged participants (if found from conversation.participants)\n                const partyFromConversation = conversationParticipants.find(\n                    (participant: any) => participant.id === party.id\n                );\n                if (partyFromConversation) {\n                    return !(\n                        get(partyFromConversation, 'monitoredParticipantId') ||\n                        get(partyFromConversation, 'coachedParticipantId') ||\n                        get(partyFromConversation, 'bargedParticipantId') ||\n                        isScreenMonitoringParticipant(partyFromConversation)\n                    );\n                }\n                return true;\n            });\n    }),\n\n    callParties: computed('otherParties.[]', 'conversationParticipants', 'isGroupRing', 'initiator', function () {\n        const otherParties = this.get('otherParties');\n        const addressformat = this.get('addressformat');\n        const conversationParticipants: any[] = this.get('conversationParticipants');\n\n        return otherParties\n            .rejectBy('purpose', 'voicemail')\n            .filter((party: any) => {\n                if (get(party, 'id') === this.get('initiator.id')) {\n                    return true; //Dont filter the initiator out, even if they didn't interact. Maybe no one answered them\n                }\n                const participant = conversationParticipants.find(participant => participant.id === party.id);\n\n                if (participant) {\n                    return (\n                        !['user', 'agent'].includes(participant.purpose.toLowerCase()) ||\n                        verifyParticipantInteracted(participant)\n                    ); // If the party is a User or Agent, filter them out if they did not interact\n                }\n                return true;\n            })\n            .map((p: any) => {\n                const party = cloneDeep(p); // no side effects\n                if (party.purpose === 'user' || party.purpose === 'agent') {\n                    const promise = this.get('store').findRecord('person', party.user.id);\n                    promise.then((data: any) => {\n                        set(party, 'name', data.get('name'));\n                    });\n                    return promise.catch(() => party);\n                }\n\n                if (party.purpose === 'acd') {\n                    const promise = this.get('store').findRecord('queue', party.queue.id);\n                    promise.then((data: any) => {\n                        set(party, 'name', data.get('name'));\n                        set(party, 'address', `sip:${data.get('id')}`);\n                    });\n                    return promise.catch(() => party);\n                }\n\n                if (party.purpose === 'ivr') {\n                    set(party, 'address', get(party, 'dnis'));\n                } else if (party.direction === 'outbound') {\n                    const dnis = get(party, 'dnis');\n                    set(party, 'isOutbound', true);\n                    //  Sometimes in conference calls the address of a participant is not resolved correctly when accessed from the 'history' bulk endpoint\n                    //  In that case we try to fallback on the same participant taken fron the GET conversation/{conversationId} endpoint which may be resolved correctly\n                    if (party.address && party.address.startsWith('sip:')) {\n                        const participant = conversationParticipants.find(participant => participant.id === party.id);\n\n                        // If the participant address is also available from the more detailed 'conversationParticipants', use it\n                        if (participant) {\n                            set(party, 'address', get(participant, 'address'));\n                        } else {\n                            // Otherwise fallback to DNIS\n                            set(party, 'address', dnis);\n                        }\n                    } else {\n                        set(party, 'address', dnis);\n                    }\n                } else {\n                    set(party, 'address', get(party, 'ani'));\n                }\n\n                set(party, 'address', addressformat.formatAddressForDisplay(get(party, 'address')));\n                return RSVP.resolve(party);\n            });\n    }),\n\n    initiator: computed('allParticipants.[]', function () {\n        const all = this.get('allParticipants');\n        const outboundParticipant = all.findBy('direction', 'outbound');\n\n        if (outboundParticipant) {\n            return outboundParticipant;\n        }\n\n        const external = this.get('externalParticipants');\n        const inboundExternal = external.findBy('direction', 'inbound');\n        if (inboundExternal) {\n            return inboundExternal;\n        }\n\n        // Sometimes the initiator is indeterminate based on the data we get\n        // but it's not really necessary for rendering the component\n        return null;\n    }),\n\n    disconnectReason: computed('myParticipant.disconnectType', 'isOutbound', 'wentToVoicemail', function () {\n        const intl = this.get('intl');\n\n        const disconnectType = this.get('myParticipant.disconnectType') || 'unknown';\n        let disconnectTypeKey = 'other';\n\n        if (disconnectType === 'client') {\n            disconnectTypeKey = 'you';\n        } else if (disconnectType === 'endpoint') {\n            disconnectTypeKey = 'otherParty';\n        } else if (disconnectType === 'system') {\n            disconnectTypeKey = 'system';\n        } else if (disconnectType && disconnectType.indexOf('transfer') > -1) {\n            if (!this.get('isOutbound') && this.get('wentToVoicemail')) {\n                disconnectTypeKey = 'youDeclined';\n            } else {\n                disconnectTypeKey = 'transfer';\n            }\n        } else if (disconnectType === 'error') {\n            disconnectTypeKey = 'error';\n        }\n\n        return intl.safestring(`purecloud.disconnectReason.${disconnectTypeKey}`);\n    }),\n\n    isIvrTransfer: computed('myParticipant.disconnectType', 'otherParties.[]', function () {\n        return !!this.get('otherParties').filter((p: any) => {\n            const purpose = get(p, 'purpose');\n            return purpose === 'ivr' || purpose === 'acd';\n        }).length;\n    }),\n\n    isOutboundCampaign: computed.readOnly('wasOutboundCampaign'),\n\n    isBlindTransfer: computed('sentToVoicemail', 'myParticipant.disconnectType', function () {\n        // if I'm an agent and there were other agents, it's a transfer situation. We can't\n        // distinguish between consult or blind based on analytics or conversation data\n        if (this.get('myParticipant.purpose') === 'agent') {\n            return this.get('participants').filterBy('purpose', 'agent').length > 1;\n        }\n\n        const participants = this.get('participants').filter((p: any) => {\n            const purpose = get(p, 'purpose');\n            return purpose !== 'ivr' && purpose !== 'acd';\n        });\n\n        if (!participants.any((p: any) => get(p, 'disconnectType') === 'transfer')) {\n            return false;\n        }\n\n        return !this.get('wentToVoicemail');\n    }),\n\n    isConsultTransfer: computed('isBlindTransfer', 'wasConference', 'callParties.[]', function () {\n        // multiple parties, but not marked as a transfer or a conference means consult\n        const parties = this.get('callParties').filter((p: any) => {\n            const purpose = get(p, 'purpose');\n            return (\n                typeof purpose === 'string' && !['ivr', 'acd', 'voicemail', 'station'].includes(purpose.toLowerCase())\n            );\n        });\n        return !this.get('isBlindTransfer') && !this.get('wasConference') && parties.length > 1;\n    }),\n\n    isPersonalVoicemail: computed('voicemailParticipant.dnis', function () {\n        return this.get('voicemailParticipant')\n            ? this.get('voicemailParticipant.dnis').indexOf('user=voicemailbox') > -1\n            : false;\n    }),\n\n    // This an outbound call initiated by the queue - NOT true for normal inbound/outbound ACD calls\n    isQueueCall: computed('initiator', function () {\n        const queueId = this.get('myParticipant.queue.id') || this.get('myParticipant.queueId');\n        return (\n            !!(\n                this.get('initiator.dnis') &&\n                queueId &&\n                this.get('initiator.dnis').indexOf(queueId > -1) &&\n                this.get('isOutbound')\n            ) && !this.get('isAcdCall')\n        );\n    }),\n\n    invalidNumber: computed('myParticipant.{disconnectType,dnis}', function () {\n        return (\n            this.get('myParticipant.disconnectType') === 'error' && this.get('myParticipant.dnis') === 'Invalidnumber'\n        );\n    }),\n\n    groupRingParticipant: computed('participants.[]', function () {\n        return this.get('participants').find((p: any) => get(p, 'groupId') || get(p, 'group.id'));\n    }),\n\n    isGroupRing: computed.bool('groupRingParticipant'),\n\n    groupRingId: computed('groupRingParticipant', function () {\n        const participant = this.get('groupRingParticipant');\n        if (!participant) {\n            return undefined;\n        }\n        return get(participant, 'groupId') || get(participant, 'group.id');\n    }),\n\n    isOutboundGroupRing: computed('isOutbound', 'groupRingCaller.guid', 'isGroupRing', 'myGuid', function () {\n        return !!(\n            this.get('isOutbound') &&\n            this.get('isGroupRing') &&\n            this.get('groupRingCaller.guid') === this.get('myGuid')\n        );\n    }),\n\n    groupRingGroup: computed('groupRingId', function () {\n        if (this.get('groupRingId')) {\n            return this.get('store').findRecord('group', this.get('groupRingId'), {\n                reload: false,\n                backgroundReload: false\n            });\n        }\n        return RSVP.Promise.resolve(null);\n    }),\n\n    groupRingCaller: computed('isGroupRing', 'initiator', function () {\n        const initiator = this.get('initiator');\n        if (this.get('groupRingParticipant') && initiator) {\n            if (!get(initiator, 'user')) {\n                return RSVP.resolve(initiator);\n            }\n\n            return this.get('store').findRecord('person', get(initiator, 'user.id'), {\n                reload: false,\n                backgroundReload: false\n            });\n        }\n        return RSVP.Promise.resolve(null);\n    }),\n\n    //  If there are more than 2 parties (or its a group call) fetch the conversation individually to distinguish them\n    loadConversation: function () {\n        const personParticipants = this.get('participants').filter((participant: any) =>\n            ['user', 'agent', 'external', 'customer'].includes(participant.purpose.toLowerCase())\n        );\n\n        const isGroupCall = this.get('isGroupRing');\n        const fetchConversation = personParticipants.length > 2 || isGroupCall;\n\n        let promise = Ember.RSVP.Promise.resolve([]);\n        if (!this.get('conversation') && fetchConversation) {\n            let id = this.get('id');\n            let url = this.get('application').pcV2Uri(`api/v2/conversations/${id}`);\n            promise = this.get('ajax')\n                .request(url)\n                .then(res => {\n                    this.set('conversation', res);\n                    return !!res ? res.participants : [];\n                })\n                .catch(() => []);\n        }\n        return promise;\n    }\n});\n","import DS from 'ember-data';\nimport Communication from './communication';\n\nexport default Communication.extend({\n    // ----------------------------------------------------------------------------\n    // Raw Properties\n    // ----------------------------------------------------------------------------\n\n    roomId: DS.attr(),\n    held: DS.attr(),\n\n    update(comUpdate) {\n        this._super(...arguments);\n        const updatableAttrs = ['roomId', 'held'];\n\n        const updateProperties = {};\n        for (const updatable of updatableAttrs) {\n            const updatedValue = comUpdate[updatable];\n            if (typeof updatedValue !== 'undefined') {\n                updateProperties[updatable] = updatedValue;\n            }\n        }\n\n        this.setProperties(updateProperties);\n    }\n});\n","import { cancel, later } from '@ember/runloop';\nimport EmberObject, { computed } from '@ember/object';\nimport moment from '../utils/dates';\nimport ChatMessageMixin from '../mixins/chat-message-mixin';\nimport ChatMessageMedia from '../mixins/chat-message-media';\nimport { compareJids } from 'web-directory/utils/jid-helpers';\n\nconst SECOND_TO_EDIT = 60;\n\nconst ChatMessage = EmberObject.extend(ChatMessageMedia, ChatMessageMixin, {\n    /**\n    Any new functionality that needs to be added to the Chat Message Model must\n    be added to the ChatMessageMixin instead. Adding functionality to the model\n    instead of the mixin will cause chat messages to break, and cant guarantee\n    that message will render as they should.\n    */\n\n    // Start of chat message attrs\n    id: null,\n    oid: null,\n    from: null,\n    to: null,\n    time: null,\n    corrects: null,\n    raw: null,\n    links: null,\n    stanza: null,\n    files: null,\n    // End of chat message attrs\n\n    // set in services/chat.processNewChatMessage()\n    chatUser: null,\n    messageBody: null,\n    hasMentionLinks: false,\n\n    // set in services/chat.markAsHistory()\n    history: false,\n\n    // set in services/chat.setMessageReadState()\n    unread: false,\n\n    // set in chat-room.processCorrections()\n    correction: null,\n    startOfBlock: null,\n    endOfBlock: null,\n\n    // set in chat-room.addSelfReference()\n    room: null,\n\n    // set in chat-room.addMessage()/markConversationBlockBoundaries()\n    isYourLastMessage: false,\n\n    //set by services/chat.parseWidgetData()\n    widget: null,\n    widgetType: 'default',\n\n    //set by chat-room.processSplitMessage()\n    splitMessageIndex: null,\n\n    init() {\n        this._super(...arguments);\n        this.determineMessageEditability();\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        cancel(this.isEditableTimeout);\n    },\n\n    isSplitMessage: computed('stanza', function () {\n        const children = this.get('stanza.children');\n        return children.findBy('name', 'multipart-message') !== undefined;\n    }),\n\n    isEditable: false,\n\n    editableEndTime: computed('time', function () {\n        const time = this.time;\n        if (time) {\n            return moment(time).add(SECOND_TO_EDIT, 'seconds');\n        }\n        return time;\n    }),\n\n    isEditing: computed('widgetType', function () {\n        return 'editor' === this.widgetType;\n    }),\n\n    canEdit: computed(\n        'isEditable',\n        'isYou',\n        'isYourLastMessage',\n        'endOfBlock',\n        'pending',\n        'files.[]',\n        'correction.{isYou,isYourLastMessage,pending}',\n        'room.isAcdRoom',\n        function () {\n            if (!this.isEditable || this.get('files.length') || this.get('room.isAcdRoom')) {\n                return false;\n            }\n\n            const message = this.messageDisplay;\n            return (\n                !message.get('pending') &&\n                message.get('isYou') &&\n                message.get('endOfBlock') &&\n                message.get('isYourLastMessage')\n            );\n        }\n    ),\n\n    meAction: computed('raw', 'correction.raw', function () {\n        const raw = this.get('correction.raw') || this.raw;\n        if (raw && raw.indexOf('/me ') === 0) {\n            return raw.substr(4, raw.length);\n        }\n        return null;\n    }),\n\n    startEditing() {\n        this.set('_originalWidgetType', this.widgetType);\n        this.set('widgetType', 'editor');\n    },\n\n    stopEditing() {\n        const originalWidgetType = this._originalWidgetType;\n        if (originalWidgetType && 'editor' === this.widgetType) {\n            this.set('widgetType', originalWidgetType);\n        }\n    },\n\n    determineMessageEditability() {\n        if (!this.corrects && compareJids(this.from, this.get('session.person.jid'))) {\n            const now = moment();\n            const seconds = SECOND_TO_EDIT - now.diff(this.time, 'seconds');\n            const isEditable = seconds > 0;\n            this.set('isEditable', isEditable);\n            if (isEditable) {\n                const isEditableTimeout = later(\n                    this,\n                    () => {\n                        this.stopEditing();\n                        this.set('isEditable', false);\n                    },\n                    seconds * 1000\n                );\n                this.set('isEditableTimeout', isEditableTimeout);\n            }\n        }\n    }\n});\n\nexport default ChatMessage;\n","import { getOwner } from '@ember/application';\nimport { readOnly, reads } from '@ember/object/computed';\nimport { A } from '@ember/array';\nimport { on } from '@ember/object/evented';\nimport { inject as service } from '@ember/service';\nimport EmberObject, { computed, observer, set, get } from '@ember/object';\nimport { later, join } from '@ember/runloop';\nimport _ from 'lodash';\nimport moment from '../utils/dates';\nimport SortChatUsersMixin from '../mixins/sort-chat-users';\nimport SplitMessage from './split-message';\nimport {\n    compareJids,\n    isAcdJid,\n    isGroupJid,\n    isPersonJid,\n    isRoomJid,\n    isSoftphoneJid,\n    isSupervisorJid\n} from 'web-directory/utils/jid-helpers';\n\nconst POPOUT_HEIGHT = 800;\nconst POPOUT_WIDTH = 500;\nconst POPOUT_LOCATION = -2000;\n\nconst haveGroupData = group => {\n    const haveId = !_.isEmpty(group.get('id'));\n    const haveName = !_.isEmpty(group.get('name'));\n    const groupId =\n        group.getFieldValue && group.getFieldValue('general.name') && group.getFieldValue('general.name')._id;\n    const isApiFieldConfigName = groupId && !_.isEmpty(groupId);\n    return haveId && haveName && isApiFieldConfigName;\n};\n\n// TODO: Find a better Ember way/spot for this view oriented behavior.\n// This === shared by all chat-room models on purpose.  Rooms decide based\n// mute setting to animate ||!.\n// Similar code exist in interaction.js service\nconst MAX_WAIT = 8000;\nconst animateChatIcon = _.debounce(\n    () => {\n        document.querySelectorAll('.action-item.chat a').forEach(el => el.classList.add('faa-horizontal', 'animated'));\n        later(() => {\n            document\n                .querySelectorAll('.action-item.chat a')\n                .forEach(el => el.classList.remove('faa-horizontal', 'animated'));\n        }, MAX_WAIT);\n    },\n    MAX_WAIT,\n    { leading: true, trailing: false, maxWait: MAX_WAIT }\n);\n\n// This size mirrors the 'messagesPerHistoryRequest' property in services/chat\nconst PRUNE_SIZE = 25;\n\nconst ChatRoom = EmberObject.extend(SortChatUsersMixin, {\n    session: service('session'),\n    webrtc: service('webrtc'),\n    batchDataRequests: service(),\n    chat: service('chat'),\n    chatFrame: service('chatFrame'),\n    videoConferenceDetails: service(),\n\n    jid: null,\n    objectId: null,\n    group: null,\n    oneToOneTarget: null,\n    rawSubject: null,\n    pendingRoom: false,\n\n    firstMessageTime: null,\n    lastMessageTime: null,\n    lastMessageTimeRadix: 0,\n    roomClosedTimeRadix: 0,\n\n    mentions: 0,\n    unseen: 0,\n    messageActivity: 0,\n    userActivity: 0,\n\n    loadingHistory: false,\n    moreHistoryAvailable: false,\n    moreForwardHistoryAvailable: false,\n\n    activated: false,\n\n    participants: null,\n    acdCustomerParticipant: null,\n    messages: null,\n    messageCache: null,\n    splitMessageCache: null,\n    inputCache: null,\n\n    isInRoster: false,\n    participantsVisible: false,\n\n    isFavorite: false,\n\n    invited: false,\n    showingVideo: false,\n    joinCallImmediately: false,\n    joinScreenshareImmediately: false,\n\n    type: 'room',\n\n    deferredParticipants: null,\n\n    roomOwners: [],\n\n    setupProperties: on('init', function () {\n        this.setProperties({\n            participants: [],\n            messages: [],\n            messageCache: EmberObject.create({}),\n            splitMessageCache: EmberObject.create({}),\n            firstMessageTime: moment(0),\n            lastMessageTime: moment(0),\n            deferredParticipants: A([])\n        });\n    }),\n\n    authenticatedUserIsRoomOwner: computed('session.person', function () {\n        const group = this.group;\n        return group && group.isPersonOwner(this.get('session.person'));\n    }),\n\n    showingVideoObserver: observer('showingVideo', function () {\n        this.chatFrame.notifyCollaborateChat('collaborate-chat-host-toggled-showing-video', {\n            roomJid: this.jid,\n            showingVideo: this.showingVideo\n        });\n    }),\n\n    resizeNewPopout: observer('popout', function () {\n        const popout = this.popout;\n        if (popout) {\n            popout.resizeTo(POPOUT_WIDTH, POPOUT_HEIGHT);\n            popout.moveTo(POPOUT_LOCATION, POPOUT_LOCATION);\n            popout.focus();\n        }\n    }),\n\n    videoPeers: readOnly('videoConferenceDetails.activeCount'),\n\n    videoConversation: computed('webrtc.conversations.[]', function () {\n        let conversations = this.get('webrtc.conversations');\n        if (conversations) {\n            return conversations.findBy('room.jid', this.jid);\n        }\n        return null;\n    }),\n\n    videoRoomFull: false,\n\n    subject: computed('rawSubject', 'group.{id,name}', 'oneToOneTarget.name', function () {\n        const group = this.group;\n\n        if (!group) {\n            return this.get('oneToOneTarget.name') || this.rawSubject || this.get('oneToOneTarget.email_main') || '';\n        }\n\n        const haveId = !_.isEmpty(group.id);\n        const haveName = !_.isEmpty(group.get('name'));\n        const groupId = group.getFieldValue && group.getFieldValue('general.name') && group.id;\n        const isApiFieldConfigName = groupId && !_.isEmpty(groupId);\n        if (haveId && haveName && isApiFieldConfigName) {\n            return this.groupName;\n        } else {\n            return this.get('oneToOneTarget.name') || this.rawSubject || this.get('oneToOneTarget.email_main') || '';\n        }\n    }),\n\n    mapCanRemoveParticipant(participantList) {\n        const group = this.group;\n        const personId = this.get('session.person.id');\n        return participantList.map(participant => {\n            const isMember = group && group.isPersonIndividual(participant);\n            const canRemove = !isMember && !this.isRoomOwner(participant) && participant.id !== personId;\n\n            set(participant, 'canBeRemovedFromRoom', canRemove);\n            return participant;\n        });\n    },\n\n    sortedParticipants: computed('participants.@each.presence', function () {\n        const list = this.mapCanRemoveParticipant(this.get('participants'));\n        return this.sortChatUsers(list);\n    }),\n\n    groupName: reads('group.name'),\n\n    isAdhocRoom: computed('jid', function () {\n        const jid = this.jid;\n        return isRoomJid(jid) && _.isEmpty(this.groupName);\n    }),\n\n    isAcdRoom: computed('jid', function () {\n        return isAcdJid(this.jid);\n    }),\n\n    isSupervisorRoom: computed('jid', function () {\n        return isSupervisorJid(this.jid);\n    }),\n\n    isSoftphoneRoom: computed('jid', function () {\n        return isSoftphoneJid(this.jid);\n    }),\n\n    isOneToOne: computed('jid', function () {\n        return this.isOneToOneRoom();\n    }),\n\n    processRoomDetails({ owners }) {\n        this.set('roomOwners', owners);\n    },\n\n    isRoomOwner(person) {\n        const group = this.group;\n        const isGroupOwner = !!group && group.isPersonOwner(person);\n        const personId = get(person, 'id');\n        const isOwner = this.roomOwners.some(owner => owner.id === personId);\n\n        return isOwner || isGroupOwner;\n    },\n\n    getRawDisplaySubject() {\n        // Get a version of the room subject that has! been decorated with markdown, for usages in places where the\n        // data will show up without being html rendered (such as mentions)\n        const group = this.get('group');\n        if (group && haveGroupData(group)) {\n            return this.get('groupName');\n        }\n        return this.get('oneToOneTarget.name') || this.rawSubject || this.get('oneToOneTarget.email_main') || '';\n    },\n\n    clearMessageCache() {\n        this.set('activated', false);\n        this.set('messages', []);\n        this.set('messageCache', EmberObject.create({}));\n    },\n\n    pruneMessages() {\n        const messages = this.messages;\n        if (messages.length > PRUNE_SIZE) {\n            const messageCache = this.messageCache;\n            const splitMessageCache = this.splitMessageCache;\n            const removeCachedItemsCount = messages.length - PRUNE_SIZE;\n            for (let i = 0; i < removeCachedItemsCount; i++) {\n                const message = messages[i];\n\n                if (message.get('splitMessage')) {\n                    message.get('messageArray').forEach(message => {\n                        delete messageCache[message.get('id')];\n                        delete messageCache[message.get('oid')];\n                        message.destroy();\n                    });\n                    delete splitMessageCache[message.get('splitMessageId')];\n                }\n                delete messageCache[message.get('oid')];\n                delete messageCache[message.get('id')];\n                message.destroy();\n            }\n            this.set('messages', _.takeRight(messages, PRUNE_SIZE));\n            this.set('moreHistoryAvailable', true);\n            this.reconcileMessages();\n        }\n    },\n\n    addHistoryMessages(messages) {\n        if (messages && messages.length > 0) {\n            this.processHistoryModels(messages);\n        }\n    },\n\n    processHistoryModels(history) {\n        history = this.filterSeenMessages(_.uniqBy(history, 'id'));\n        this.addSelfReference(history);\n        this.insertHistory(history);\n        this.reconcileMessages();\n    },\n\n    reconcileMessages() {\n        this.sortChatMessages();\n        this.processCorrections();\n        this.processSplitMessageHistory();\n        this.markConversationBlockBoundaries();\n        this.updateFirstUnread();\n        this.updateMessageTimes();\n    },\n\n    filterSeenMessages(history) {\n        const cache = this.messageCache;\n        return _.filter(history, message => {\n            return !Object.prototype.hasOwnProperty.call(cache, message.get('id'));\n        });\n    },\n\n    addSelfReference(history) {\n        _.each(history, message => message.set('room', this));\n        return null;\n    },\n\n    bumpActivityCount(message) {\n        this.incrementProperty('messageActivity');\n        if (compareJids(message.get('chatUser.jid'), this.get('session.person.jid'))) {\n            this.incrementProperty('userActivity');\n        }\n    },\n\n    insertHistory(historyMessages) {\n        this.messages.unshiftObjects(historyMessages);\n\n        const cache = this.messageCache;\n        _.each(historyMessages, message => {\n            cache.set(message.get('id'), message);\n        });\n    },\n\n    sortChatMessages() {\n        const messages = _.sortBy(this.messages, message => {\n            return message.get('time').valueOf();\n        });\n        this.set('messages', messages);\n    },\n\n    processSplitMessageHistory() {\n        const messages = this.messages\n            .map(message => {\n                if (message.get('isSplitMessage')) {\n                    const splitMessage = this.processSplitMessage(message);\n                    // processSplitMessage returns the original message unchanged when the multipart\n                    // metadata can't be parsed; such a message has no messageArray, so keep it rather\n                    // than drop it.\n                    if (!splitMessage.get('messageArray') || splitMessage.get('messageArray.length') <= 1) {\n                        return splitMessage;\n                    }\n                    return null;\n                }\n                return message;\n            })\n            .filter(message => !!message);\n        this.set('messages', messages);\n    },\n\n    processCorrections() {\n        const messages = this.messages;\n        _.each(messages, message => {\n            if (message.get('corrects')) {\n                const correctedMessage = _.find(messages, m => {\n                    return m.get('id') === message.get('corrects');\n                });\n                if (correctedMessage) {\n                    correctedMessage.set('correction', message);\n                }\n            } else if (message.get('isEdited')) {\n                message.set('correction', message);\n            }\n        });\n        this.set('messages', messages);\n    },\n\n    markConversationBlockBoundaries() {\n        const messages = this.messages;\n\n        if (messages.length === 0) {\n            return;\n        }\n\n        _.head(messages).setProperties({\n            startOfBlock: true,\n            endOfBlock: true,\n            isLastMessage: false,\n            isYourLastMessage: false\n        });\n\n        _.last(messages).setProperties({\n            endOfBlock: true,\n            isLastMessage: true\n        });\n\n        if (messages.length === 1) {\n            const message = messages[0];\n            message.set('isYourLastMessage', message.get('isYou'));\n        }\n\n        if (messages.length === 1) {\n            return;\n        }\n\n        let isYourLastMessage = null;\n\n        for (let i = 0; i <= messages.length - 2; i++) {\n            const last = messages[i];\n            const next = messages[i + 1];\n\n            if (last.get('isYou')) {\n                isYourLastMessage = last;\n            } else {\n                last.set('isYourLastMessage', false);\n            }\n\n            if (next.get('isYou')) {\n                isYourLastMessage = next;\n            } else {\n                next.set('isYourLastMessage', false);\n            }\n\n            if (this.shouldGroupMessages(last, next)) {\n                last.set('endOfBlock', false);\n                next.set('startOfBlock', false);\n            } else {\n                last.set('endOfBlock', true);\n                next.set('startOfBlock', true);\n            }\n        }\n\n        if (isYourLastMessage) {\n            isYourLastMessage.set('isYourLastMessage', true);\n        }\n    },\n\n    updateFirstUnread() {\n        if (this.firstUnread) {\n            this.set('firstUnread.firstUnread', false);\n            this.set('firstUnread', null);\n        }\n\n        const messages = this.messages;\n        for (let i = 0; i < messages.length; i++) {\n            const message = messages[i];\n            if (message.get('unread')) {\n                message.set('firstUnread', true);\n                this.set('firstUnread', message);\n                return;\n            }\n        }\n    },\n\n    processSplitMessage(message) {\n        const splitMessageCache = this.splitMessageCache;\n        const stanza = message.get('stanza.children').findBy('name', 'multipart-message');\n\n        // The multipart metadata is a JSON string stored on the child node's `contents` (see\n        // mixins/chat-service/message-splitting.js, which both writes and reads `children.lastObject\n        // .contents`). Reading `children.lastObject` gave JSON.parse the node object itself, which it\n        // coerced to \"[object Object]\" and threw \"... is not valid JSON\". This runs on the inbound\n        // XMPP/streaming callback (fire-and-forget, no caller try/catch), so the throw surfaced as an\n        // uncaught error between tests / in production. Parse the correct property and guard it so a\n        // malformed stanza logs instead of leaking.\n        let splitMessageData;\n        try {\n            splitMessageData = JSON.parse(get(stanza, 'children.lastObject.contents'));\n        } catch (error) {\n            console.warn('chat-room: failed to parse multipart-message metadata; treating as a normal message', {\n                error\n            });\n            return message;\n        }\n\n        const splitMessageParentExists = Object.prototype.hasOwnProperty.call(splitMessageCache, splitMessageData.id);\n        if (!splitMessageParentExists) {\n            const owner = getOwner(this);\n            // ownerInjection() must be the first arg in Ember 3.28\n            let splitMessage = SplitMessage.create(\n                Object.assign(\n                    {\n                        id: message.id,\n                        oid: message.oid,\n                        from: message.from,\n                        to: message.to,\n                        time: message.time,\n                        chatUser: message.chatUser,\n                        splitMessageId: splitMessageData.id,\n                        totalMessages: splitMessageData.messageCount\n                    },\n                    owner.ownerInjection()\n                )\n            );\n            this.addSelfReference([splitMessage]);\n            splitMessageCache.set(splitMessageData.id, splitMessage);\n        }\n        let splitMessage = splitMessageCache.get(splitMessageData.id);\n        message.set('splitMessageIndex', splitMessageData.index);\n        splitMessage.addSplitMessage(message);\n        return splitMessage;\n    },\n\n    addMessage(message) {\n        const messages = this.messages;\n        const cache = this.messageCache;\n        const msgId = message.get('id') || message.get('oid');\n\n        this.addSelfReference([message]);\n\n        if (Object.prototype.hasOwnProperty.call(cache, msgId)) {\n            message.set('duplicate', true);\n            return;\n        }\n        cache.set(msgId, message);\n\n        if (message.get('isSplitMessage')) {\n            const splitMessage = this.processSplitMessage(message);\n            if (splitMessage.get('messageArray.length') > 1) {\n                return;\n            }\n            message = splitMessage;\n        }\n\n        const roomJid = message.get('room.jid');\n        const isSupervisor = this.isSupervisorRoom;\n        const isAcd = this.isAcdRoom;\n\n        if (!isAcd && !isSupervisor) {\n            this.bumpActivityCount(message);\n        }\n\n        if (message.get('unread') && !message.get('corrects')) {\n            if (!this.muted) {\n                if (roomJid && !isAcd && !isSupervisor) {\n                    animateChatIcon();\n                }\n            }\n\n            if (!this.firstUnread) {\n                message.set('firstUnread', true);\n                this.set('firstUnread', message);\n            }\n        }\n\n        // default message to its own block\n        message.set('startOfBlock', true);\n        message.set('endOfBlock', true);\n\n        const lastMessage = _.last(messages);\n        messages.pushObject(message);\n\n        this.updateMessageTimes();\n\n        if (message.get('isYou')) {\n            const yourLast = _.findLast(messages, message => message.get('isYourLastMessage'));\n            if (yourLast) {\n                yourLast.set('isYourLastMessage', false);\n            }\n            message.set('isYourLastMessage', true);\n        }\n\n        if (!lastMessage) {\n            return;\n        }\n\n        if (message.get('time').isBefore(lastMessage.get('time'))) {\n            console.warn('chat-room : Message came in out of order');\n            this.reconcileMessages();\n            return;\n        }\n\n        if (message.get('corrects')) {\n            this.processCorrections();\n        }\n\n        if (this.shouldGroupMessages(lastMessage, message)) {\n            lastMessage.set('endOfBlock', false);\n            message.set('startOfBlock', false);\n        }\n    },\n\n    shouldGroupMessages(oldMessage, newMessage) {\n        return (\n            oldMessage &&\n            newMessage &&\n            oldMessage.get('from') === newMessage.get('from') &&\n            oldMessage.get('unread') === newMessage.get('unread') &&\n            !oldMessage.get('corrects') &&\n            2 >= Math.abs(newMessage.get('time').diff(oldMessage.get('time'), 'minutes'))\n        );\n    },\n\n    updateMessageTimes() {\n        const first = this.get('messages.firstObject');\n        const last = this.get('messages.lastObject');\n        const firstMessageTime = moment(first ? first.get('time') : 0);\n        const lastMessageTime = moment(last ? last.get('time') : 0);\n\n        this.setProperties({ firstMessageTime, lastMessageTime });\n        return this.updateMessageTimeRadix();\n    },\n\n    updateMessageTimeRadix() {\n        // sort messages by last message sent\n        const messages = this.messages;\n        const lastMessage = messages[messages.length - 1];\n        return this.set('lastMessageTimeRadix', lastMessage ? lastMessage.get('time').valueOf() : 0);\n    },\n\n    updateClosedTimeRadix() {\n        this.set('roomClosedTimeRadix', moment().valueOf());\n    },\n\n    addParticipant(person) {\n        if (person) {\n            this.participants.addObject(person);\n        }\n    },\n\n    removeParticipant(person) {\n        this.participants.removeObject(person);\n    },\n\n    clearUnreadMessages() {\n        if (this.firstUnread) {\n            this.firstUnread.set('firstUnread', false);\n        }\n        this.set('firstUnread', null);\n        const messages = this.messages;\n\n        for (let i = 0; i < messages.length; i++) {\n            const message = messages[i];\n            message.set('unread', false);\n        }\n\n        return this.markConversationBlockBoundaries();\n    },\n\n    isOneToOneRoom() {\n        return isPersonJid(this.jid);\n    },\n\n    isGroupRoom() {\n        return isGroupJid(this.jid);\n    },\n\n    isUserInRoom(userjid) {\n        return this.participants.findBy('jid', userjid);\n    },\n\n    clearPending(message) {\n        const existingMessage = this.get(`messageCache.${message.oid}`);\n        if (existingMessage && typeof message === 'object') {\n            existingMessage.set('id', message.id);\n            existingMessage.set('time', moment(message.time));\n            existingMessage.set('pending', false);\n\n            this.set(`messageCache.${message.oid}`, null);\n            this.set(`messageCache.${message.id}`, existingMessage);\n        }\n    },\n\n    setSendError(messageId) {\n        const message = this.get(`messageCache.${messageId}`);\n        if (message) {\n            message.set('pending', false);\n            message.set('sendError', true);\n        }\n    },\n\n    addDeferredParticipant(jid) {\n        this.deferredParticipants.addObject(jid);\n    },\n\n    loadDeferredParticipants() {\n        let deferred = A([...this.deferredParticipants]);\n        deferred.forEach(jid => {\n            this.batchDataRequests.getChatUser(jid).then(person => {\n                this.addParticipant(person);\n            });\n            // Semi-deferred to run loop\n            join(() => this.deferredParticipants.removeObject(jid));\n        });\n    }\n});\n\nexport default ChatRoom;\n","import EmberObject from '@ember/object';\n\nexport default EmberObject.extend({\n    id: null,\n    name: null,\n    markedAsRead: false,\n    actionType: null,\n    relationship: null,\n    dateStart: null,\n    lengthInMinutes: null,\n    status: null,\n\n    appointment: {\n        id: null,\n        selfUri: null,\n        isOverdue: false\n    }\n});\n","import { getOwner } from '@ember/application';\nimport EmberObject, { computed, set } from '@ember/object';\nimport {\n    AppsService,\n    ChatService,\n    InboxService,\n    InteractionService,\n    PermissionsService,\n    PhoneService,\n    SessionService,\n    VoltService,\n    WebrtcService\n} from '@web-directory/services';\nimport { PanelId } from 'web-directory/components/command-panel/panel-definition';\nimport { AcdWorkitemService } from 'web-directory/services/acdworkitem';\nimport { CommandNavService } from 'web-directory/services/command-nav';\nimport { PigeonService } from 'web-directory/services/pigeon';\n\nexport interface CommandState {\n    state: string;\n    ariaLabel: string;\n    tooltip: string;\n    iconName: string;\n    secondaryIconName?: string;\n    showIconTooltip: boolean;\n    colorProfile?: string;\n}\n\nexport interface CommandButton {\n    id: string;\n    dataPanelToggleId?: string;\n    label: string;\n    panel?: PanelId;\n    persistentSpinner?: boolean; // Only Use For Phone\n    badge?: boolean;\n    canHaveNumberBadge?: boolean;\n    noUnreadText?: string;\n    badgeNumber?: number; // Unread Messages\n    states?: Array<CommandState>;\n    currentState: CommandState;\n    canSee?: boolean; // Permissions + Feature Toggles\n    accent?: string;\n    iconOnly?: boolean;\n}\n\nconst chatCommandStates: Array<CommandState> = [\n    {\n        state: 'default',\n        ariaLabel: 'navBar.commandView.chat',\n        tooltip: 'navBar.commandView.chat',\n        iconName: 'toolbar-chat',\n        showIconTooltip: false,\n        colorProfile: ''\n    },\n    {\n        state: 'connected',\n        ariaLabel: 'navBar.commandView.chatState.connectedAria',\n        tooltip: 'navBar.commandView.chatState.connectedTooltip',\n        iconName: 'toolbar-video',\n        showIconTooltip: true,\n        colorProfile: 'green-command-state'\n    },\n    {\n        state: 'error',\n        ariaLabel: 'navBar.commandView.chatState.errorAria',\n        tooltip: 'navBar.commandView.chatState.errorTooltip',\n        iconName: 'toolbar-chat-disable',\n        showIconTooltip: true,\n        colorProfile: 'disable-command-state'\n    },\n    {\n        state: 'error-connection',\n        ariaLabel: 'navBar.commandView.chatState.errorConnectionAria',\n        tooltip: 'navBar.commandView.chatState.errorConnectionTooltip',\n        iconName: 'toolbar-chat-disable',\n        showIconTooltip: true,\n        colorProfile: 'disable-command-state'\n    },\n    {\n        state: 'error-no-video-support',\n        ariaLabel: 'navBar.commandView.chatState.errorNoVideoSupportAria',\n        tooltip: 'navBar.commandView.chatState.errorNoVideoSupportTooltip',\n        iconName: 'toolbar-chat-disable',\n        showIconTooltip: true,\n        colorProfile: 'disable-command-state'\n    }\n];\n\nconst callsCommandStates: Array<CommandState> = [\n    {\n        state: 'default',\n        ariaLabel: 'navBar.commandView.calls',\n        tooltip: 'navBar.commandView.calls',\n        iconName: 'toolbar-phone',\n        showIconTooltip: false,\n        colorProfile: ''\n    },\n    {\n        state: 'connected',\n        ariaLabel: 'navBar.commandView.callsState.connectedAria',\n        tooltip: 'navBar.commandView.callsState.connectedTooltip',\n        iconName: 'toolbar-phone-active-3',\n        showIconTooltip: true,\n        colorProfile: 'green-command-state'\n    },\n    {\n        state: 'persistent-connection',\n        ariaLabel: 'navBar.commandView.callsState.persistentConnectionAria',\n        tooltip: 'navBar.commandView.callsState.persistentConnectionTooltip',\n        iconName: 'toolbar-phone',\n        showIconTooltip: true,\n        colorProfile: ''\n    },\n    {\n        state: 'persistent-connection-forwarding',\n        ariaLabel: 'navBar.commandView.callsState.persistentConnectionAria',\n        tooltip: 'navBar.commandView.callsState.forwardingTooltip',\n        iconName: 'phone-forward',\n        showIconTooltip: true,\n        colorProfile: 'disable-command-state'\n    },\n    {\n        state: 'forwarding',\n        ariaLabel: 'navBar.commandView.callsState.forwardingAria',\n        tooltip: 'navBar.commandView.callsState.forwardingTooltip',\n        iconName: 'phone-forward',\n        showIconTooltip: true,\n        colorProfile: 'disable-command-state'\n    },\n    {\n        state: 'error',\n        ariaLabel: 'navBar.commandView.callsState.errorAria',\n        tooltip: 'navBar.commandView.callsState.errorTooltip',\n        iconName: 'toolbar-phone-disable',\n        showIconTooltip: true,\n        colorProfile: 'disable-command-state'\n    },\n    {\n        state: 'error-connection',\n        ariaLabel: 'navBar.commandView.callsState.errorConnectionAria',\n        tooltip: 'navBar.commandView.callsState.errorConnectionTooltip',\n        iconName: 'toolbar-phone-disable',\n        showIconTooltip: true,\n        colorProfile: 'disable-command-state'\n    },\n    {\n        state: 'error-no-station',\n        ariaLabel: 'navBar.commandView.callsState.errorNoStationAria',\n        tooltip: 'navBar.commandView.callsState.errorNoStationTooltip',\n        iconName: 'toolbar-phone-disable',\n        showIconTooltip: true,\n        colorProfile: 'disable-command-state'\n    }\n];\n\nconst agentCommandStates: Array<CommandState> = [\n    {\n        state: 'default',\n        ariaLabel: 'components.navMenu.agent',\n        tooltip: 'components.navMenu.agent',\n        iconName: 'toolbar-interactions',\n        showIconTooltip: false,\n        colorProfile: ''\n    },\n    {\n        state: 'connected',\n        ariaLabel: 'navBar.commandView.agentState.connectedAria',\n        tooltip: 'navBar.commandView.agentState.connectedTooltip',\n        iconName: 'toolbar-interactions',\n        showIconTooltip: true,\n        colorProfile: 'green-command-state'\n    },\n    {\n        state: 'error',\n        ariaLabel: 'navBar.commandView.agentState.errorAria',\n        tooltip: 'navBar.commandView.agentState.errorTooltip',\n        iconName: 'toolbar-interactions-disable',\n        showIconTooltip: true,\n        colorProfile: 'disable-command-state'\n    },\n    {\n        state: 'error-connection',\n        ariaLabel: 'navBar.commandView.agentState.errorConnectionAria',\n        tooltip: 'navBar.commandView.agentState.errorConnectionTooltip',\n        iconName: 'toolbar-interactions-disable',\n        showIconTooltip: true,\n        colorProfile: 'disable-command-state'\n    }\n];\n\nconst helpButtonTemplate: CommandButton = {\n    id: 'command-bar-help-button',\n    dataPanelToggleId: 'help',\n    label: 'components.navMenu.help',\n    panel: 'help',\n    currentState: {\n        state: 'default',\n        ariaLabel: 'components.navMenu.help',\n        tooltip: 'components.navMenu.help',\n        iconName: 'help',\n        showIconTooltip: false\n    } as CommandState,\n    canSee: true // if not agentUiExpanded\n};\n\nconst callsButtonTemplate: CommandButton = {\n    id: 'command-bar-calls',\n    dataPanelToggleId: 'voice',\n    label: 'navBar.commandView.calls',\n    panel: 'voice',\n    states: callsCommandStates,\n    currentState: {\n        state: 'default',\n        ariaLabel: 'navBar.commandView.calls',\n        tooltip: 'navBar.commandView.calls',\n        iconName: 'toolbar-phone',\n        showIconTooltip: false\n    } as CommandState,\n    canSee: false // if phone.enabled\n};\n\nconst chatButtonTemplate: CommandButton = {\n    id: 'command-bar-chat',\n    dataPanelToggleId: 'chats',\n    label: 'navBar.commandView.chat',\n    panel: 'chats',\n    states: chatCommandStates,\n    currentState: {\n        state: 'default',\n        ariaLabel: 'navBar.commandView.chat',\n        tooltip: 'navBar.commandView.chat',\n        iconName: 'toolbar-chat',\n        showIconTooltip: false\n    } as CommandState,\n    canSee: false //if (and session.org.hasChatEnabled permissions.canViewBusinessChat session.person.jid)\n};\n\nconst appsButtonTemplate: CommandButton = {\n    id: 'command-bar-apps',\n    dataPanelToggleId: 'apps',\n    label: 'components.navMenu.apps',\n    panel: 'apps',\n    canHaveNumberBadge: true,\n    noUnreadText: 'navBar.emptyAlertLink',\n    currentState: {\n        state: 'default',\n        ariaLabel: 'components.navMenu.apps',\n        tooltip: 'components.navMenu.apps',\n        iconName: 'toolbar-apps',\n        showIconTooltip: false\n    } as CommandState,\n    canSee: false //if isWidgetAppsEnabled\n};\n\nconst inboxButtonTemplate: CommandButton = {\n    id: 'command-bar-inbox',\n    dataPanelToggleId: 'inbox',\n    label: 'components.navMenu.inbox',\n    panel: 'inbox',\n    canHaveNumberBadge: true,\n    noUnreadText: 'navBar.emptyAlertLink',\n    currentState: {\n        state: 'default',\n        ariaLabel: 'components.navMenu.inbox',\n        tooltip: 'components.navMenu.inbox',\n        iconName: 'fa/inbox-regular',\n        showIconTooltip: false\n    } as CommandState,\n    canSee: false // if not isNotificationsEnabled (legacy inbox)\n};\n\nconst bookmarksButtonTemplate: CommandButton = {\n    id: 'command-bar-bookmark',\n    label: 'components.navMenu.bookmarks.title',\n    currentState: {\n        state: 'default',\n        ariaLabel: 'components.navMenu.bookmarks.title',\n        tooltip: 'components.navMenu.bookmarks.title',\n        iconName: 'fa/bookmark-regular',\n        secondaryIconName: 'fa/bookmark-solid',\n        showIconTooltip: true\n    } as CommandState,\n    canSee: true\n};\n\nconst notificationsButtonTemplate: CommandButton = {\n    id: 'command-bar-notifications',\n    dataPanelToggleId: 'notifications',\n    label: 'components.navMenu.notifications',\n    panel: 'notifications',\n    canHaveNumberBadge: true,\n    noUnreadText: 'navBar.emptyAlertLink',\n    currentState: {\n        state: 'default',\n        ariaLabel: 'components.navMenu.notifications',\n        tooltip: 'components.navMenu.notifications',\n        iconName: 'bell',\n        showIconTooltip: false\n    } as CommandState,\n    canSee: false // if isNotificationsEnabled\n};\n\nconst agentButtonTemplate: CommandButton = {\n    id: 'command-bar-agent',\n    dataPanelToggleId: 'agent',\n    label: 'components.navMenu.agent',\n    panel: 'agent',\n    canHaveNumberBadge: true,\n    noUnreadText: 'navBar.noActiveConversations',\n    states: agentCommandStates,\n    currentState: {\n        state: 'default',\n        ariaLabel: 'components.navMenu.agent',\n        tooltip: 'components.navMenu.agent',\n        iconName: 'toolbar-interactions',\n        showIconTooltip: false\n    } as CommandState,\n    canSee: false //if isInteractionsEnabled\n};\n\nconst copilotButtonTemplate: CommandButton = {\n    id: 'command-bar-copilot-framework',\n    dataPanelToggleId: 'copilot-framework',\n    label: 'components.navMenu.copilotFramework',\n    panel: 'copilot-framework',\n    accent: 'copilot',\n    iconOnly: true,\n    currentState: {\n        state: 'default',\n        ariaLabel: 'components.navMenu.copilotFramework',\n        tooltip: 'components.navMenu.copilotFramework',\n        iconName: 'restricted/custom/sparkles-solid',\n        showIconTooltip: false\n    } as CommandState,\n    canSee: false //if isCopilotFrameworkEnabled\n};\n\nconst accountSwitcherButtonTemplate: CommandButton = {\n    id: 'command-bar-account-switcher',\n    dataPanelToggleId: 'account-switcher',\n    label: 'components.navMenu.accountSwitcher',\n    panel: 'account-switcher',\n    currentState: {\n        state: 'default',\n        ariaLabel: 'components.navMenu.accountSwitcher',\n        tooltip: 'components.navMenu.accountSwitcher',\n        iconName: 'fa/building-regular',\n        showIconTooltip: false\n    } as CommandState,\n    canSee: false // Controlled by accountSwitcherButtonData computed property based on session.showAccountSwitcher\n};\n\nconst FT_COPILOT_FRAMEWORK = 'AI-1223_copilot-framework';\nconst FT_INBOX_UI = 'PURE-6632_inbox-ui';\n\ntype ButtonType =\n    | 'help'\n    | 'calls'\n    | 'chats'\n    | 'apps'\n    | 'inbox'\n    | 'notifications'\n    | 'bookmarks'\n    | 'agent'\n    | 'copilot'\n    | 'account-switcher'\n    | '';\n\nconst CommandButtonFactory = EmberObject.extend({\n    _buttonType: '' as ButtonType,\n\n    session: null as SessionService | null,\n    chat: null as ChatService | null,\n    webrtc: null as WebrtcService | null,\n    permissions: null as PermissionsService | null,\n    phone: null as PhoneService | null,\n    mediaProviders: null,\n    pigeon: null as PigeonService | null,\n    interaction: null as InteractionService | null,\n    roster: null,\n    acdworkitem: null as AcdWorkitemService | null,\n    inbox: null as InboxService | null,\n    apps: null as AppsService | null,\n    commandNav: null as CommandNavService | null,\n    volt: null as VoltService | null,\n\n    init() {\n        this._super(...arguments);\n        const owner = getOwner(this);\n        this.set('session', owner.lookup('service:session'));\n        this.chat = owner.lookup('service:chat');\n        this.webrtc = owner.lookup('service:webrtc');\n        this.permissions = owner.lookup('service:permissions');\n        this.phone = owner.lookup('service:phone');\n        this.mediaProviders = owner.lookup('service:mediaProviders');\n        this.pigeon = owner.lookup('service:pigeon');\n        this.interaction = owner.lookup('service:interaction');\n        this.acdworkitem = owner.lookup('service:acdworkitem');\n        this.roster = owner.lookup('service:roster');\n        this.inbox = owner.lookup('service:inbox');\n        this.apps = owner.lookup('service:apps');\n        this.commandNav = owner.lookup('service:commandNav');\n        this.volt = owner.lookup('service:volt');\n    },\n    /**\n     * Command Button State Lists\n     */\n    chatCommandStates: chatCommandStates,\n    callsCommandStates: callsCommandStates,\n    agentCommandStates: agentCommandStates,\n    helpButtonTemplate: helpButtonTemplate,\n    callsButtonTemplate: callsButtonTemplate,\n    chatButtonTemplate: chatButtonTemplate,\n    appsButtonTemplate: appsButtonTemplate,\n    inboxButtonTemplate: inboxButtonTemplate,\n    bookmarksButtonTemplate: bookmarksButtonTemplate,\n    notificationsButtonTemplate: notificationsButtonTemplate,\n    agentButtonTemplate: agentButtonTemplate,\n    copilotButtonTemplate: copilotButtonTemplate,\n    accountSwitcherButtonTemplate: accountSwitcherButtonTemplate,\n\n    /**\n     * @computed\n     * Flag for if user has apps enabled\n     */\n    isWidgetAppsEnabled: computed('apps.widgetAppPool._apps', 'apps.widgetAppPool._apps.[]', function (): boolean {\n        const apps = this.get('apps.widgetAppPool._apps') || [];\n        return !!apps.length;\n    }),\n\n    /**\n     * @computed\n     * Flag for if the user has access to Agent Workspace/UI\n     */\n    isInteractionsEnabled: computed(\n        'showAgentUIUnreadNumber',\n        'permissions.canGoOnQueue',\n        'session.hasTrusteeAccess',\n        function (): boolean {\n            const hasInteractions = !!this.get('showAgentUIUnreadNumber');\n            const canGoOnQueue = this.get('permissions.canGoOnQueue');\n            const hasTrusteeAccess = this.get('session.hasTrusteeAccess');\n            return hasInteractions || (canGoOnQueue && !hasTrusteeAccess);\n        }\n    ),\n\n    /**\n     * @computed\n     * Flag for if the user has access to Chat\n     */\n    isChatEnabled: computed.and('session.org.hasChatEnabled', 'session.person.jid', 'permissions.canViewBusinessChat'),\n\n    /**\n     * @computed\n     * Flag for if the user has access to Copilot\n     */\n    isCopilotFrameworkEnabled: computed.and(\n        `session.features.${FT_COPILOT_FRAMEWORK}`,\n        'permissions.canViewCopilotFrameworkMessage'\n    ),\n\n    /**\n     * @computed\n     * Flag for if the new Inbox UI (notifications) feature is enabled.\n     * When on, the notifications button is shown; when off, the legacy inbox button is shown.\n     */\n    isNotificationsEnabled: computed(`session.features.${FT_INBOX_UI}`, function (this: any): boolean {\n        return !!this.get(`session.features.${FT_INBOX_UI}`);\n    }),\n\n    /**\n     * @computed\n     * Flag for if we have a pigeon connection\n     */\n    pigeonConnection: computed.reads('pigeon.connected'),\n\n    /**\n     * @computed\n     * Flag for is the user is currently in seeing a video\n     */\n    showingVideo: computed(\n        'webrtc.activeRoom.{showingVideo,isAcdRoom}',\n        'volt.shouldPopout',\n        'mediaProviders.usingVideoProvider',\n        function (): boolean {\n            const showingPurecloudVideo =\n                this.get('webrtc.activeRoom.showingVideo') &&\n                !this.get('webrtc.activeRoom.isAcdRoom') &&\n                !this.get('volt.shouldPopout');\n            const showingMediaProvider = this.get('mediaProviders.usingVideoProvider');\n            return showingPurecloudVideo || showingMediaProvider;\n        }\n    ),\n\n    /**\n     * @computed\n     * Flag for is the user is allowed to and is currently in seeing a video\n     */\n    isVideoState: computed.and('showingVideo', 'permissions.canViewCollaborateVideo'),\n\n    /**\n     * @computed\n     * Determines current chat state to display correct indicators or errors\n     */\n    chatCommandState: computed('chat.connected', 'webrtc.videoCallCapable', 'isVideoState', function () {\n        if (!this.get('chat.connected')) {\n            return this.get('chatCommandStates').find((item: CommandState) => item.state === 'error-connection');\n        }\n\n        if (this.get('isVideoState')) {\n            if (this.get('webrtc.videoCallCapable')) {\n                return this.get('chatCommandStates').find((item: CommandState) => item.state === 'connected');\n            } else {\n                return this.get('chatCommandStates').find(\n                    (item: CommandState) => item.state === 'error-no-video-support'\n                );\n            }\n        }\n\n        return this.get('chatCommandStates').find((item: CommandState) => item.state === 'default');\n    }),\n\n    /**\n     * @computed\n     * Determines current calls state to display correct indicators or errors\n     */\n    callsCommandState: computed(\n        'pigeonConnection',\n        'noStationSelected',\n        'webrtc.{webrtcAudioCallIssueKey,webrtcAudioCallIssueAriaKey}',\n        'phone.{phoneDisabled,phoneDisabledMessage,webrtcPhoneWithIssues,callForwardingActive,persistentConnectionActive,noStationSelected}',\n        function () {\n            /**\n             * Errors\n             */\n            if (!this.get('pigeonConnection')) {\n                return this.get('callsCommandStates').find((item: CommandState) => item.state === 'error-connection');\n            }\n            if (this.get('phone.webrtcPhoneWithIssues')) {\n                let customError = this.get('callsCommandStates').find((item: CommandState) => item.state === 'error');\n                customError.ariaLabel = this.get('webrtc.webrtcAudioCallIssueAriaKey');\n                customError.tooltip = this.get('webrtc.webrtcAudioCallIssueKey');\n                return customError;\n            }\n            if (this.get('phone.noStationSelected')) {\n                return this.get('callsCommandStates').find((item: CommandState) => item.state === 'error-no-station');\n            }\n            if (this.get('phone.phoneDisabled')) {\n                let customError = this.get('callsCommandStates').find((item: CommandState) => item.state === 'error');\n                customError.ariaLabel = this.get('phone.phoneDisabledMessage'); // Not sure this tells the sr what they are on\n                customError.tooltip = this.get('phone.phoneDisabledMessage');\n                return customError;\n            }\n\n            /**\n             * Success States\n             */\n            if (this.get('phone.persistentConnectionActive') && !this.get('phone.callForwardingActive')) {\n                return this.get('callsCommandStates').find(\n                    (item: CommandState) => item.state === 'persistent-connection'\n                );\n            }\n            if (this.get('phone.callForwardingActive') && !this.get('phone.persistentConnectionActive')) {\n                return this.get('callsCommandStates').find((item: CommandState) => item.state === 'forwarding');\n            }\n            if (this.get('phone.callForwardingActive') && this.get('phone.persistentConnectionActive')) {\n                return this.get('callsCommandStates').find(\n                    (item: CommandState) => item.state === 'persistent-connection-forwarding'\n                );\n            }\n            return this.get('callsCommandStates').find((item: CommandState) => item.state === 'default');\n        }\n    ),\n\n    /**\n     * @computed\n     * Determines current agent state to display correct indicators or errors\n     */\n    agentCommandState: computed('pigeonConnection', 'showAgentUIUnreadNumber', function () {\n        if (!this.get('pigeonConnection')) {\n            return this.get('agentCommandStates').find((item: CommandState) => item.state === 'error-connection');\n        }\n\n        if (this.get('showAgentUIUnreadNumber')) {\n            return this.get('agentCommandStates').find((item: CommandState) => item.state === 'connected');\n        }\n        return this.get('agentCommandStates').find((item: CommandState) => item.state === 'default');\n    }),\n\n    /**\n     * @computed\n     * Flag for if calls should have a unread notification badge\n     */\n    showCallsUnreadBadge: computed.reads('phone.hasActiveNonAcdCalls'),\n\n    /**\n     * @computed\n     * Flag for if chat should have a unread notification badge\n     */\n    showChatUnreadBadge: computed('chat.collabChatShowChatSplat', function (): boolean {\n        return this.get('chat').get('collabChatShowChatSplat');\n    }),\n\n    /**\n     * @computed\n     * Count for if apps should have a unread notification badge\n     * returning the number to be displayed\n     */\n    showAppsUnreadNumber: computed('apps.widgetAppPool', 'apps.widgetAppPool.totalAttentionCount', function (): number {\n        const widgetAppPool = this.get('apps.widgetAppPool');\n        if (!widgetAppPool) {\n            return 0;\n        }\n        const totalAttentionCount = Math.max(Math.floor(this.get('apps.widgetAppPool.totalAttentionCount') || 0), 0);\n        return totalAttentionCount;\n    }),\n\n    /**\n     * @computed\n     * Count for if agent should have a unread notification badge\n     * returning the number to be displayed\n     */\n    showAgentUIUnreadNumberLegacy: computed('interaction.acdCount', 'acdworkitem.activeWorkitems', function (): number {\n        const acdCount = this.get('interaction.acdCount') || 0;\n        const workitemCount = this.get('acdworkitem.activeWorkitems.length') || 0;\n        return acdCount + workitemCount;\n    }),\n\n    /**\n     * @todo PURE-7222: figure out a better way to determine the badge count\n     */\n    showAgentUIUnreadNumber: computed('session.useModes', 'showAgentUIUnreadNumberLegacy', function (): number {\n        if (this.get('session.useModes')) {\n            console.warn('PURE-7222 [command-button-factory]: showAgentUIUnreadNumber is currently not supported.');\n            return 0;\n        }\n        return this.get('showAgentUIUnreadNumberLegacy');\n    }),\n\n    /**\n     * @computed\n     * Count for if inbox should have a unread notification badge\n     * returning the number to be displayed\n     */\n    showInboxUnreadNumber: computed('inbox.totalUnread', function (): number {\n        const inbox = this.get('inbox');\n        const totalUnread = inbox.get('totalUnread') || 0;\n        return totalUnread;\n    }),\n\n    /**\n     * @computed\n     * Count for if notifications should have an unread notification badge,\n     * returning the number to be displayed. Shows 99+ for values greater than 99.\n     */\n    showNotificationsUnreadNumber: computed('commandNav.notificationsAttentionCount', function (this: any):\n        | string\n        | number {\n        const count = this.get('commandNav.notificationsAttentionCount') || 0;\n        if (count > 99) {\n            return '99+';\n        }\n        return count;\n    }),\n\n    /**\n     * @computed\n     * Processing for the help button\n     * this keeps the model for display up to date if any state changes\n     */\n    helpButtonData: computed(\n        'helpButtonTemplate',\n        'commandNav.currentPanel',\n        'commandNav.expanded',\n        function (this: any): any {\n            let helpButtonData = this.get('helpButtonTemplate');\n            // agent ui does not have a help page - do not show help if it is fully expanded\n            if (this.get('commandNav.currentPanel') === 'agent' && this.get('commandNav.expanded')) {\n                set(helpButtonData, 'canSee', false);\n            } else {\n                set(helpButtonData, 'canSee', true);\n            }\n            return helpButtonData;\n        }\n    ),\n\n    /**\n     * @computed\n     * Processing for the calls button\n     * this keeps the model for display up to date if any state changes\n     */\n    callsButtonData: computed(\n        'callsButtonTemplate',\n        'phone.enabled',\n        'showCallsUnreadBadge',\n        'callsCommandState',\n        function (this: any): any {\n            let callsButtonData = this.get('callsButtonTemplate');\n            if (this.get('phone')?.get('enabled')) {\n                set(callsButtonData, 'canSee', true);\n            } else set(callsButtonData, 'canSee', false);\n            if (this.get('callsCommandState')) set(callsButtonData, 'currentState', this.get('callsCommandState'));\n\n            // Calls is badge only\n            set(callsButtonData, 'badge', !!this.get('showCallsUnreadBadge'));\n\n            /* Persistence Spinner */\n            if (\n                callsButtonData.currentState.state === 'persistent-connection' ||\n                callsButtonData.currentState.state === 'persistent-connection-forwarding'\n            )\n                set(callsButtonData, 'persistentSpinner', true);\n            else set(callsButtonData, 'persistentSpinner', false);\n            return callsButtonData;\n        }\n    ),\n\n    /**\n     * @computed\n     * Processing for the chat button\n     * this keeps the model for display up to date if any state changes\n     */\n    chatButtonData: computed(\n        'chatButtonTemplate',\n        'isChatEnabled',\n        'chatCommandState',\n        'showChatUnreadBadge',\n        function (this: any): any {\n            let chatButtonData = this.get('chatButtonTemplate');\n            if (this.get('isChatEnabled')) {\n                set(chatButtonData, 'canSee', true);\n            } else set(chatButtonData, 'canSee', false);\n            if (this.get('chatCommandState')) set(chatButtonData, 'currentState', this.get('chatCommandState'));\n\n            // Chat is badge only\n            set(chatButtonData, 'badge', !!this.get('showChatUnreadBadge'));\n\n            return chatButtonData;\n        }\n    ),\n\n    /**\n     * @computed\n     * Processing for the apps button\n     * this keeps the model for display up to date if any state changes\n     */\n    appsButtonData: computed(\n        'appsButtonTemplate',\n        'isWidgetAppsEnabled',\n        'showAppsUnreadNumber',\n        function (this: any): any {\n            let appsButtonData = this.get('appsButtonTemplate');\n            if (this.get('isWidgetAppsEnabled')) {\n                set(appsButtonData, 'canSee', true);\n            } else set(appsButtonData, 'canSee', false);\n\n            // Apps has a numbered badge (like Agent Workspace)\n            if (this.get('showAppsUnreadNumber')) {\n                set(appsButtonData, 'badge', true);\n                set(appsButtonData, 'badgeNumber', this.get('showAppsUnreadNumber'));\n            } else {\n                set(appsButtonData, 'badge', false);\n                set(appsButtonData, 'badgeNumber', 0);\n            }\n\n            return appsButtonData;\n        }\n    ),\n\n    /**\n     * @computed\n     * Processing for the inbox button\n     * this keeps the model for display up to date if any state changes\n     */\n    inboxButtonData: computed(\n        'inboxButtonTemplate',\n        'showInboxUnreadNumber',\n        'isNotificationsEnabled',\n        function (this: any): any {\n            let inboxButtonData = this.get('inboxButtonTemplate');\n\n            // Legacy inbox is only shown when the new notifications UI is off\n            set(inboxButtonData, 'canSee', !this.get('isNotificationsEnabled'));\n\n            // Inbox has a numbered badge\n            if (this.get('showInboxUnreadNumber')) {\n                set(inboxButtonData, 'badge', true);\n                set(inboxButtonData, 'badgeNumber', this.get('showInboxUnreadNumber'));\n            } else {\n                set(inboxButtonData, 'badge', false);\n                set(inboxButtonData, 'badgeNumber', 0);\n            }\n            return inboxButtonData;\n        }\n    ),\n\n    bookmarksButtonData: computed('bookmarksButtonTemplate', function (this: any): any {\n        let bookmarksButtonData = this.get('bookmarksButtonTemplate');\n        return bookmarksButtonData;\n    }),\n\n    /**\n     * @computed\n     * Processing for the notifications button\n     * this keeps the model for display up to date if any state changes\n     */\n    notificationsButtonData: computed(\n        'notificationsButtonTemplate',\n        'showNotificationsUnreadNumber',\n        'isNotificationsEnabled',\n        function (this: any): any {\n            let notificationsButtonData = this.get('notificationsButtonTemplate');\n\n            // Notifications button is only shown when the new notifications UI is on\n            set(notificationsButtonData, 'canSee', this.get('isNotificationsEnabled'));\n\n            // Notifications has a numbered badge\n            if (this.get('showNotificationsUnreadNumber')) {\n                set(notificationsButtonData, 'badge', true);\n                set(notificationsButtonData, 'badgeNumber', this.get('showNotificationsUnreadNumber'));\n            } else {\n                set(notificationsButtonData, 'badge', false);\n                set(notificationsButtonData, 'badgeNumber', 0);\n            }\n\n            return notificationsButtonData;\n        }\n    ),\n\n    /**\n     * @computed\n     * Processing for the org name\n     * this keeps the model for display up to date if any state changes\n     */\n    orgName: computed(\n        'session.org.name',\n        'session.user.isTrustee',\n        'session.publicApiUser.organization.name',\n        function () {\n            if (this.get('session.user.isTrustee')) {\n                return this.get('session.publicApiUser.organization.name');\n            }\n            return this.get('session.org.name');\n        }\n    ),\n\n    /**\n     * @computed\n     * Processing for the account switcher button\n     * this keeps the model for display up to date if any state changes\n     */\n    accountSwitcherButtonData: computed(\n        'accountSwitcherButtonTemplate',\n        'orgName',\n        'session.showAccountSwitcher',\n        function (this: any): CommandButton {\n            let accountSwitcherButtonData = this.get('accountSwitcherButtonTemplate');\n            const orgName = this.get('orgName');\n            set(accountSwitcherButtonData, 'label', orgName);\n\n            // Wrap async check in function invocation\n            (async () => {\n                const showAccountSwitcher = await this.get('session.showAccountSwitcher');\n                set(accountSwitcherButtonData, 'canSee', showAccountSwitcher === true);\n            })();\n\n            return accountSwitcherButtonData;\n        }\n    ),\n\n    /**\n     * @computed\n     * Processing for the agent button\n     * this keeps the model for display up to date if any state changes\n     */\n    agentButtonData: computed(\n        'agentButtonTemplate',\n        'isInteractionsEnabled',\n        'agentCommandState',\n        'showAgentUIUnreadNumber',\n        function () {\n            let agentButtonData = this.get('agentButtonTemplate');\n            if (this.get('isInteractionsEnabled')) {\n                set(agentButtonData, 'canSee', true);\n            } else set(agentButtonData, 'canSee', false);\n\n            if (this.get('agentCommandState')) set(agentButtonData, 'currentState', this.get('agentCommandState'));\n\n            if (this.get('showAgentUIUnreadNumber')) {\n                set(agentButtonData, 'badge', true);\n                set(agentButtonData, 'badgeNumber', this.get('showAgentUIUnreadNumber'));\n            } else {\n                set(agentButtonData, 'badge', false);\n                set(agentButtonData, 'badgeNumber', 0);\n            }\n            return agentButtonData;\n        }\n    ),\n\n    /**\n     * @computed\n     * Processing for the copilot button\n     * this keeps the model for display up to date if any state changes\n     */\n    copilotButtonData: computed('copilotButtonTemplate', 'isCopilotFrameworkEnabled', function (this: any): any {\n        let copilotButtonData = this.get('copilotButtonTemplate');\n        if (this.get('isCopilotFrameworkEnabled')) {\n            set(copilotButtonData, 'canSee', true);\n        } else set(copilotButtonData, 'canSee', false);\n        return copilotButtonData;\n    }),\n\n    buttonData: computed(\n        '_buttonType',\n        'helpButtonData',\n        'callsButtonData',\n        'chatButtonData',\n        'appsButtonData',\n        'inboxButtonData',\n        'bookmarksButtonData',\n        'notificationsButtonData',\n        'agentButtonData',\n        'copilotButtonData',\n        'accountSwitcherButtonData',\n        function (this: any): any {\n            switch (this.get('_buttonType')) {\n                case 'help':\n                    return this.get('helpButtonData');\n                case 'calls':\n                    return this.get('callsButtonData');\n                case 'chats':\n                    return this.get('chatButtonData');\n                case 'apps':\n                    return this.get('appsButtonData');\n                case 'inbox':\n                    return this.get('inboxButtonData');\n                case 'bookmarks':\n                    return this.get('bookmarksButtonData');\n                case 'notifications':\n                    return this.get('notificationsButtonData');\n                case 'agent':\n                    return this.get('agentButtonData');\n                case 'account-switcher':\n                    return this.get('accountSwitcherButtonData');\n                case 'copilot':\n                    return this.get('copilotButtonData');\n                default:\n                    throw new Error('Unknown button type');\n            }\n        }\n    )\n});\n\nexport default CommandButtonFactory;\n","import { reads } from '@ember/object/computed';\nimport DS from 'ember-data';\n\nexport default DS.Model.extend({\n    // ----------------------------------------------------------------------------\n    // Raw Properties\n    // ----------------------------------------------------------------------------\n\n    participant: DS.belongsTo('participant', { async: false }),\n    state: DS.attr(),\n    connectedTime: DS.attr(),\n    provider: DS.attr(),\n    additionalProperties: DS.attr(),\n    segments: DS.attr(),\n\n    update(comUpdate) {\n        const updatableAttrs = ['state', 'connectedTime', 'additionalProperties', 'provider'];\n\n        const updateProperties = {};\n        for (const updatable of updatableAttrs) {\n            const updatedValue = comUpdate[updatable];\n            if (typeof updatedValue !== 'undefined') {\n                updateProperties[updatable] = updatedValue;\n            }\n        }\n\n        this.setProperties(updateProperties);\n    },\n\n    conversationId: reads('participant.conversation.id')\n});\n","import { inject as service } from '@ember/service';\nimport { sort, reads, bool, or, readOnly, and, not } from '@ember/object/computed';\nimport { resolve } from 'rsvp';\nimport EmberObject, { observer, get, computed } from '@ember/object';\nimport { on } from '@ember/object/evented';\nimport { run } from '@ember/runloop';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport ExternalContactsMixin from 'web-directory/mixins/external-contacts';\nimport PersonModel from '../models/person';\nimport moment from '../utils/dates';\nimport { userGuidFromParticipant } from '../utils/conversation';\nimport { isScreenMonitoringParticipant } from '../utils/acd';\n\nfunction maybeLowerCase(str) {\n    return str && str.toLowerCase();\n}\n\nexport default EmberObject.extend(ExternalContactsMixin, {\n    application: service(),\n    intl: service(),\n    session: service(),\n    chat: service(),\n    phone: service(),\n    interaction: service(),\n    addressformat: service(),\n    permissions: service(),\n    names: service(),\n    store: service(),\n\n    id: null,\n    conversationId: null,\n    participants: null,\n    maxParticipants: 0,\n    selfUri: null,\n    acwNotes: null,\n    selectedWrapupCode: null,\n    conversationIsAConsult: false,\n    conversationInitiator: null,\n    lastPartyTalkingTo: null,\n    attemptingToCall: null,\n    webrtcSession: null,\n    lastConfinedParty: null,\n\n    hasDisplayedDesktopNotification: false,\n    acceptedByClient: false,\n\n    willDestroy() {\n        run.cancel(this._recomputePartiesTimer);\n        this._super(...arguments);\n    },\n\n    dialingTime: computed('isDialing', 'isContacting', 'participants.[]', function () {\n        if (this.isContacting) {\n            return moment();\n        } else if (this.isDialing && this.get('participants.length') > 1) {\n            return moment();\n        }\n    }),\n\n    otherPartyJid: null,\n    setOtherPartyJid: on(\n        'init',\n        observer('onCall', 'otherPartyModel', 'otherParty', function () {\n            const promise = resolve(this.get('otherPartyModel'));\n            promise.then(person => {\n                const isOtherPartyPerson = person instanceof PersonModel;\n                if (\n                    person &&\n                    isOtherPartyPerson &&\n                    this.get('onCall') &&\n                    this.get('otherParty') &&\n                    this.get('otherParty.purpose') !== 'customer'\n                ) {\n                    this.set('otherPartyJid', person.get('jid'));\n                } else {\n                    this.set('otherPartyJid', null);\n                }\n            });\n        })\n    ),\n\n    startTime: computed('myself.connectedTime', 'isDialing', 'dialingTime', function () {\n        const connectedTime = this.get('myself.connectedTime');\n        if (this.isDialing && connectedTime === undefined) {\n            return this.dialingTime;\n        }\n        if (!this.onCall) {\n            return null;\n        }\n        if (connectedTime) {\n            return connectedTime;\n        }\n    }),\n\n    connectedDuration: computed('myself.{endTime,connectedTime}', function () {\n        const connectedTime = this.get('myself.connectedTime');\n        const endTime = this.get('myself.endTime') || moment();\n        if (connectedTime && endTime) {\n            return moment(endTime).diff(moment(connectedTime));\n        }\n        return null;\n    }),\n\n    iAmInitiatorOfConsult: computed('conversationInitiator', 'conversationIsAConsult', 'myself', function () {\n        return this.get('conversationInitiator.userId') === this.myGuid;\n    }),\n\n    otherPartyThatIsNotTheInitiator: computed('participants.[]', 'conversationInitiator', 'myGuid', function () {\n        const initiator = this.conversationInitiator;\n        const otherParties = _.reject(this.participants, party => {\n            const partyId = party && party.userId;\n            const initiatorId = initiator && initiator.userId;\n            return partyId === initiatorId || partyId === this.myGuid;\n        });\n        return _.last(otherParties);\n    }),\n\n    otherParticipantsThatAreNotTheInitiator: computed(\n        'participants.[]',\n        'conversationInitiator',\n        'myGuid',\n        function () {\n            const initiator = this.conversationInitiator;\n            const otherParties = _.reject(this.participants, party => {\n                const partyId = party && party.userId;\n                const initiatorId = initiator && initiator.userId;\n                return partyId === initiatorId || partyId === this.myGuid;\n            });\n            return _.map(otherParties, participant => {\n                const name = participant.name || participant.aniName;\n                const model = { name };\n                return Object.assign(participant, { model });\n            });\n        }\n    ),\n\n    otherPartyThatIsNotTheInitiatorModel: computed('otherPartyThatIsNotTheInitiator', function () {\n        const guid = userGuidFromParticipant(this.otherPartyThatIsNotTheInitiator);\n        if (guid) {\n            return this.get('application.store').find('person', guid);\n        }\n        return this.otherPartyThatIsNotTheInitiator;\n    }),\n\n    setLastPartyTalkingTo: observer('connectedParties.[]', function () {\n        const connectedParties = _.reject(this.connectedParties, party => {\n            return party && party.userId === this.myGuid;\n        });\n        if (connectedParties.length > 0) {\n            return this.set('lastPartyTalkingTo', _.head(connectedParties));\n        }\n    }),\n\n    lastPartyTalkingToModel: computed('lastPartyTalkingTo', function () {\n        const guid = userGuidFromParticipant(this.lastPartyTalkingTo);\n        if (guid) {\n            return this.get('application.store').find('person', guid);\n        }\n        return this.lastPartyTalkingTo;\n    }),\n\n    consultOtherParty: computed(\n        'participants.[]',\n        'onCall',\n        'lastDisconnectedPartyModel',\n        'lastPartyTalkingToModel',\n        'otherParties.[]',\n        'conversationIsAConsult',\n        'conversationInitiator',\n        'sortedDisconnectedParties',\n        'connectedParties',\n        'iAmInitiatorOfConsult',\n        'initiatorModel',\n        'otherPartyThatIsNotTheInitiator',\n        function () {\n            const initiatorModel = this.initiatorModel;\n            const initiator = _.find(this.participants, party => {\n                return party && party.userId === this.get('conversationInitiator.userId');\n            });\n            const initiatorCall = _.head(initiator && initiator.calls);\n            const initiatorConnected = initiatorCall && initiatorCall.state.toLowerCase() === 'connected';\n            const otherPartyThatIsNotTheInitiatorCall = this.get('otherPartyThatIsNotTheInitiator.calls')\n                ? this.get('otherPartyThatIsNotTheInitiator.calls')[0]\n                : null;\n            const otherPartyThatIsNotTheInitiatorConnected =\n                otherPartyThatIsNotTheInitiatorCall &&\n                otherPartyThatIsNotTheInitiatorCall.state.toLowerCase() === 'connected';\n            if (this.iAmInitiatorOfConsult) {\n                if (this.onCall) {\n                    return _.head(this.otherParties);\n                }\n                if (this.get('connectedParties.length') < 1) {\n                    return this.lastDisconnectedPartyModel;\n                }\n\n                const lastConfinedParty = this.lastConfinedParty;\n                if (lastConfinedParty) {\n                    return this.otherParties.find(party => {\n                        return party.userId !== lastConfinedParty.userId;\n                    });\n                }\n                return _.head(this.connectedParties);\n            } else {\n                if (initiatorConnected) {\n                    return initiatorModel;\n                }\n                if (otherPartyThatIsNotTheInitiatorConnected) {\n                    return this.otherPartyThatIsNotTheInitiatorModel;\n                }\n                if (this.otherPartyModel === undefined) {\n                    return this.lastPartyTalkingToModel;\n                }\n                return this.otherPartyModel;\n            }\n        }\n    ),\n\n    consultOtherPartyModel: computed('consultOtherParty', 'participants.[]', 'onCall', function () {\n        const guid = userGuidFromParticipant(this.consultOtherParty);\n        if (guid) {\n            return this.get('application.store').find('person', guid);\n        }\n        return this.consultOtherParty;\n    }),\n\n    participantModels: computed('participants.[]', function () {\n        const participants = _.reject(this.participants, participant => {\n            const guid = userGuidFromParticipant(participant);\n            const communication = _.head(participant.calls) || _.head(participant.callbacks) || {};\n            const isTerminated = maybeLowerCase(communication.state) !== 'terminated';\n            const isNotSelf = this.get('application.session.person.guid') !== guid;\n            return isTerminated && isNotSelf;\n        });\n        return _.map(participants, participant => {\n            const guid = userGuidFromParticipant(participant);\n            const name = participant && participant.name;\n            const model = guid ? this.get('application.store').find('person', guid) : { name };\n            return Object.assign(participant, { model });\n        });\n    }),\n\n    otherPartyModel: computed('otherParty', function () {\n        const otherParty = this.otherParty;\n        const guid = userGuidFromParticipant(otherParty);\n        const store = this.get('application.store');\n        if (!guid) {\n            return otherParty;\n        }\n        // running phone service test in isolation always threw an Ember Error:\n        // No model was found for 'person'\n        let personFromStore;\n        try {\n            personFromStore = store.findRecord('person', guid, { reload: false, backgroundReload: false });\n            if (personFromStore.catch) {\n                personFromStore.catch(() => otherParty);\n            }\n        } catch (e) {\n            personFromStore = otherParty;\n        }\n        return personFromStore;\n    }),\n\n    otherPartyNumber: computed('otherParty.address', function () {\n        const number = this.get('otherParty.address');\n        if (number && 'user' !== this.get('otherParty.purpose')) {\n            return this.addressformat.formatAddressForDisplay(number, null, { doLookup: true });\n        }\n    }),\n\n    otherParties: computed('participants.[]', function () {\n        const otherParties = _.filter(this.participants, participant => {\n            const guid = userGuidFromParticipant(participant);\n            const communication = _.head(participant.calls) || _.head(participant.callbacks) || {};\n            const purpose = maybeLowerCase(participant.purpose);\n            const state = maybeLowerCase(communication.state);\n            const notTerminatedOrDisconnected = state !== 'terminated' && state !== 'disconnected';\n            const isSelf = this.myGuid === guid;\n            const isMonitor = !!participant.monitoredParticipantId;\n            const isCoach = !!participant.coachedParticipantId;\n            const isBarge = !!participant.bargedParticipantId;\n            const isScreenMonitor = isScreenMonitoringParticipant(participant);\n\n            if (notTerminatedOrDisconnected && !isMonitor && !isCoach && !isBarge && !isScreenMonitor) {\n                return !isSelf || (isSelf && purpose !== 'user');\n            }\n            return false;\n        });\n        return otherParties;\n    }),\n\n    disconnectedParties: computed('participants.[]', 'participants.@each.endTime', function () {\n        return _.filter(this.participants, participant => {\n            const communication = _.head(participant.calls) || _.head(participant.callbacks) || {};\n            const isDisconnected =\n                maybeLowerCase(communication.state) === 'disconnected' ||\n                maybeLowerCase(communication.state) === 'terminated';\n            return (\n                isDisconnected &&\n                participant.userId !== this.myGuid &&\n                participant.purpose !== 'ivr' &&\n                participant.purpose !== 'group'\n            );\n        });\n    }),\n\n    sortedDisconnectedParties: sort('disconnectedParties', function (a, b) {\n        return moment(a.endTime).valueOf() - moment(b.endTime).valueOf();\n    }),\n\n    lastDisconnectedPartyModel: computed('sortedDisconnectedParties', function () {\n        const last = _.last(this.sortedDisconnectedParties);\n        const guid = userGuidFromParticipant(last);\n        if (guid) {\n            return this.get('application.store').find('person', guid);\n        }\n    }),\n\n    selfIsDisconnectedOrTerminated: function () {\n        const myself = this.myself;\n        if (!myself) {\n            return false;\n        }\n\n        const communication = _.head(myself.calls) || _.head(myself.callbacks) || {};\n        if (!communication) {\n            return false;\n        }\n\n        const myState = maybeLowerCase(communication.state);\n        return myState === 'disconnected' || myState === 'terminated';\n    },\n\n    otherParty: computed('otherParties.[]', 'connectedParties.[]', 'onConsult', function () {\n        const useDisconnectedParties = this.selfIsDisconnectedOrTerminated();\n        let parties = useDisconnectedParties ? this.sortedDisconnectedParties : this.connectedParties;\n\n        parties = parties.reject(\n            p =>\n                p.purpose === 'ivr' ||\n                p.purpose === 'group' ||\n                p.userId === this.myGuid ||\n                !!p.coachedParticipantId ||\n                !!p.monitoredParticipantId ||\n                !!p.bargedParticipantId || // Both ACD and Communicate should not display monitor/coached or barged in users\n                isScreenMonitoringParticipant(p)\n        );\n\n        if (parties.length > 0) {\n            return parties.get('lastObject');\n        }\n        const otherParties = this.otherParties.reject(p => p.purpose === 'ivr' || p.purpose === 'group');\n        return otherParties.get('lastObject');\n    }),\n\n    allParties: computed('participants.[]', function () {\n        return _.filter(this.participants, participant => {\n            const communication = _.head(participant.calls) || _.head(participant.callbacks) || {};\n            return communication.state && communication.state !== 'terminated';\n        });\n    }),\n\n    connectedParties: computed('participants.[]', function () {\n        return _.filter(this.participants, participant => {\n            const communication = _.head(participant.calls) || _.head(participant.callbacks) || {};\n            return maybeLowerCase(communication.state) === 'connected';\n        });\n    }),\n\n    connectedOnConsult: computed('connectedParties.[]', function () {\n        return _.reject(this.connectedParties, participant => {\n            const communication = _.head(participant.calls) || _.head(participant.callbacks) || {};\n            return communication.confined === 'true';\n        });\n    }),\n\n    callParties: computed('onConference', 'onConsult', 'allParties.[]', 'otherParties.[]', 'otherParty', function () {\n        if (!this.onConference) {\n            return this.onConsult ? this.otherParties : [this.otherParty];\n        }\n        const firstCall = party => _.head(party.calls) || _.head(party.callbacks);\n        const isDisconnected = call =>\n            call && (call.state.toLowerCase() === 'disconnected' || call.state.toLowerCase() === 'terminated');\n        const sortedParties = this.allParties.sort((a, b) => {\n            const state = 'disconnected';\n            const callStateA = _.head(a.calls).state.toLowerCase() === state ? 0 : 1;\n            const callStateB = _.head(b.calls).state.toLowerCase() === state ? 0 : 1;\n            return callStateA - callStateB;\n        });\n        const parties = _.reject(sortedParties, party => {\n            const disconnected = isDisconnected(firstCall(party));\n            return disconnected && moment().isAfter(moment(party.endTime).add(20, 'seconds'));\n        });\n        const arePartiesDisconnected = _.some(parties, party => {\n            return isDisconnected(firstCall(party));\n        });\n        if (arePartiesDisconnected) {\n            const timer = run.debounce(this, this.recomputeParties, 12000);\n            this.set('_recomputePartiesTimer', timer);\n        }\n        return parties;\n    }),\n\n    otherDisconnectedParty: computed(\n        'participants.[]',\n        'conversationIsAConsult',\n        'iAmInitiatorOfConsult',\n        'lastPartyTalkingToModel',\n        'sortedDisconnectedParties',\n        function () {\n            const isConsult = this.conversationIsAConsult;\n            if (isConsult && !this.iAmInitiatorOfConsult) {\n                return this.lastPartyTalkingToModel;\n            }\n            const otherParties = _.filter(this.participants, party => {\n                const guid = userGuidFromParticipant(party);\n                const isSelf = guid === this.myGuid;\n                const isOngoing = party.endTime === undefined;\n                const isGroup = party.purpose === 'group';\n                const isStation = party.purpose === 'station';\n                const isIvr = party.purpose === 'ivr';\n                return !isSelf && (isConsult ? isOngoing : true) && !isGroup && !isStation && !isIvr;\n            });\n\n            // Check if it was a blind transfer. If blind, other participants HAVE endtime, so get the one that left last\n            const recentTransfers = this.recentTransfers;\n            if (recentTransfers && recentTransfers.length) {\n                const mostRecentTransfer = _.last(recentTransfers);\n                if (mostRecentTransfer && mostRecentTransfer.transferType === 'unattended') {\n                    return _.maxBy(otherParties, party => moment(party.endTime).valueOf());\n                }\n            }\n\n            if (otherParties.length > 1) {\n                /**\n                 * When group ring call ends, there's a period where the endTime properties are set on some\n                 * of the participants but not all. This can cause the display to be incorrect.\n                 */\n                const otherPartiesNoEndTime = otherParties.filter(otherParty => !get(otherParty, 'endTime'));\n                if (otherPartiesNoEndTime.length > 0) {\n                    return _.head(otherPartiesNoEndTime);\n                }\n                // when a call between 2 users is declined & goes to voicemails, the call is being rejected immediately. Because of this the end time is set immediately.\n                // Due to this otherPartiesNoEndTime is undefined when call end between 2 users. So when otherPartiesNoEndTime length is 0 a fall back logic is needed.\n                // This will return the last participant to disconnect\n                return _.maxBy(otherParties, party => moment(party.endTime).valueOf());\n            }\n            return _.head(otherParties);\n        }\n    ),\n\n    otherDisconnectedPartyModel: computed('otherDisconnectedParty', function () {\n        const participant = this.otherDisconnectedParty;\n        if (participant) {\n            if (get(participant, 'purpose') === 'acd') {\n                return this.get('application.store').find('queue', participant.queueId);\n            }\n            const guid = userGuidFromParticipant(participant);\n            return guid ? this.get('application.store').find('person', guid) : participant;\n        }\n    }),\n\n    recomputeParties() {\n        return this.notifyPropertyChange('callParties');\n    },\n\n    initiator: computed(\n        'participants.[]',\n        'otherParties.[]',\n        'onConsult',\n        'participants.@each.consultParticipantId',\n        function () {\n            return _.find(this.participants, party => {\n                const initiator = get(party, 'attributes.consultInitiator');\n                return initiator === 'true' || initiator === true;\n            });\n        }\n    ),\n\n    initiatorModel: computed('conversationInitiator', 'initiator', function () {\n        const participant = this.conversationInitiator;\n        const guid = userGuidFromParticipant(participant);\n        return guid ? this.get('application.store').find('person', guid) : participant;\n    }),\n\n    isDisconnectedQueueCall: computed('otherDisconnectedParty', function () {\n        return this.get('otherDisconnectedParty.purpose') === 'acd';\n    }),\n\n    setConsultInitiator: observer('initiator', 'conversationIsAConsult', function () {\n        const initiator = this.initiator;\n        if (!_.isEmpty(initiator) && this.conversationIsAConsult) {\n            return this.set('conversationInitiator', initiator);\n        }\n    }),\n\n    nonInitiatorNumber: computed('otherParties.[]', 'onConsult', 'myself', function () {\n        const myConsultId = this.get('myself.consultParticipantId');\n        const consultParty = _.filter(this.otherParties, party => {\n            return party.id === myConsultId;\n        });\n        const nonInitiator = _.last(consultParty);\n        return this.addressformat.formatAddressForDisplay(nonInitiator.address);\n    }),\n\n    hasActiveAgent: computed('participants.@each.purpose', 'myGuid', function () {\n        // Check to see if the current user has an agent participant\n        // that is not currently wrapped up.\n        return _.some(this.participants, participant => {\n            const isMe = this.myGuid === userGuidFromParticipant(participant);\n            const isAgent = participant.purpose.toLowerCase() === 'agent';\n            const needsWrapup = !!participant.wrapupRequired && participant.wrapup === undefined;\n            return isMe && isAgent && needsWrapup;\n        });\n    }),\n\n    myGuid: reads('session.person.guid'),\n    myself: computed('participants.[]', 'myGuid', 'hasActiveAgent', function () {\n        const hasActiveAgent = this.hasActiveAgent;\n        return _.findLast(this.participants, participant => {\n            const isMe = this.myGuid === userGuidFromParticipant(participant);\n            const purpose = (participant.purpose || '').toLowerCase();\n            const isAgent = purpose === 'agent';\n            const isUser = purpose === 'user';\n            const needsWrapup = !!participant.wrapupRequired && participant.wrapup === undefined;\n            let isAlerting = false;\n\n            try {\n                const state = participant.calls[0].state.toLowerCase();\n                isAlerting = state === 'alerting';\n            } catch (e) {\n                isAlerting = false;\n            }\n\n            // Screen monitoring participant should not be treated as \"myself\"\n            if (isScreenMonitoringParticipant(participant)) {\n                return false;\n            }\n\n            // If the user has an unwrapped up agent participant, set that as their\n            // current participant.\n            if (hasActiveAgent) {\n                return isMe && isAgent && (needsWrapup || isAlerting);\n            }\n\n            // Otherwise, we just use the last participant for the user\n            // to represent their state.\n            return isMe && (isAgent || isUser);\n        });\n    }),\n\n    myselfIsMonitor: bool('myself.monitoredParticipantId'),\n    myselfIsCoach: bool('myself.coachedParticipantId'),\n\n    myselfIsBarged: computed('myself.bargedParticipantId', function () {\n        const bargedParticipantId = this.get('myself.bargedParticipantId');\n        const bargedParticipant =\n            (this.participants || []).find(participant => participant.id === bargedParticipantId) || {};\n\n        const disconnectType = get(bargedParticipant, 'calls.firstObject.disconnectType');\n        return bargedParticipantId && !disconnectType;\n    }),\n\n    myselfIsMCB: or('myselfIsMonitor', 'myselfIsCoach', 'myselfIsBarged'),\n\n    monitoredParticipant: computed('myselfIsMonitor', 'myself.monitoredParticipantId', 'allParties', function () {\n        if (this.myselfIsMonitor) {\n            return this.allParties.findBy('id', this.get('myself.monitoredParticipantId'));\n        }\n        return null;\n    }),\n\n    coachedParticipant: computed('myselfIsCoach', 'myself.coachedParticipantId', 'allParties', function () {\n        if (this.myselfIsCoach) {\n            return this.allParties.findBy('id', this.get('myself.coachedParticipantId'));\n        }\n        return null;\n    }),\n\n    bargedParticipant: computed('myselfIsBarged', 'myself.bargedParticipantId', 'allParties', function () {\n        if (this.myselfIsBarged) {\n            return this.allParties.findBy('id', this.get('myself.bargedParticipantId'));\n        }\n        return null;\n    }),\n\n    monitoredParticipantPerson: computed('monitoredParticipant', function () {\n        const monitoredParticipant = this.monitoredParticipant;\n        const guid = userGuidFromParticipant(monitoredParticipant);\n        const store = this.get('application.store');\n        if (!guid) {\n            return monitoredParticipant;\n        }\n        let personFromStore;\n        try {\n            personFromStore = store.findRecord('person', guid, { reload: false, backgroundReload: false });\n            if (personFromStore.catch) {\n                personFromStore.catch(() => monitoredParticipant);\n            }\n        } catch (e) {\n            personFromStore = monitoredParticipant;\n        }\n        return personFromStore;\n    }),\n\n    coachedParticipantPerson: computed('coachedParticipant', function () {\n        const coachedParticipant = this.coachedParticipant;\n        const guid = userGuidFromParticipant(coachedParticipant);\n        const store = this.get('application.store');\n        if (!guid) {\n            return coachedParticipant;\n        }\n        let personFromStore;\n        try {\n            personFromStore = store.findRecord('person', guid, { reload: false, backgroundReload: false });\n            if (personFromStore.catch) {\n                personFromStore.catch(() => coachedParticipant);\n            }\n        } catch (e) {\n            personFromStore = coachedParticipant;\n        }\n        return personFromStore;\n    }),\n    bargedParticipantPerson: computed('bargedParticipant', function () {\n        const bargedParticipant = this.bargedParticipant;\n        const guid = userGuidFromParticipant(bargedParticipant);\n        const store = this.get('application.store');\n        if (!guid) {\n            return bargedParticipant;\n        }\n        let personFromStore;\n        try {\n            personFromStore = store.findRecord('person', guid, { reload: false, backgroundReload: false });\n            if (personFromStore.catch) {\n                personFromStore.catch(() => bargedParticipant);\n            }\n        } catch (e) {\n            personFromStore = bargedParticipant;\n        }\n        return personFromStore;\n    }),\n\n    acdWarmConferencePhase1FT: bool('session.features.PURE-7349_acdConferenceMS3-phase-1'),\n    isWarmInviteCall: bool('associatedConversation'),\n    isAgentCall: computed(\n        'participants.[]',\n        'myself',\n        'myselfIsMCB',\n        'isWarmInviteCall',\n        'acdWarmConferencePhase1FT',\n        function () {\n            const isSelfMCB = this.myselfIsMCB;\n            const isWarmInviteCall = this.acdWarmConferencePhase1FT && this.isWarmInviteCall;\n\n            // Otherwise, if there is another agent on the call, I want to view this conversation in ACD.\n            const participants = this.participants || [];\n            return participants.some(user => maybeLowerCase(user.purpose) === 'agent') || isSelfMCB || isWarmInviteCall;\n        }\n    ),\n\n    isAfterCallWorkCompleted: computed('myself.wrapup', 'myself.wrapupRequired', function () {\n        const result = this.get('myself.wrapup') || !this.get('myself.wrapupRequired');\n        return result;\n    }),\n\n    isAfterCallWorkForcedTimeout: computed('myself.{wrapupPrompt,wrapupTimeoutMs}', function () {\n        const prompt = maybeLowerCase(this.get('myself.wrapupPrompt'));\n        return this.get('myself.wrapupTimeoutMs') && prompt === 'forcedtimeout';\n    }),\n    isAfterCallWorkTimeout: computed('myself.{wrapupPrompt,wrapupTimeoutMs}', function () {\n        const prompt = maybeLowerCase(this.get('myself.wrapupPrompt'));\n        return this.get('myself.wrapupTimeoutMs') && prompt === 'timeout';\n    }),\n\n    canUseCommunicationACW: readOnly('interaction.orgLevelConversationsSettings.communicationBasedACW'),\n\n    isWrapupPromptAgentRequested: computed(\n        'myself.{wrapupPrompt,wrapupTimeoutMs}',\n        'canUseCommunicationACW',\n        function () {\n            if (this.canUseCommunicationACW) {\n                const prompt = maybeLowerCase(this.get('myself.wrapupPrompt'));\n                return !!this.get('myself.wrapupTimeoutMs') && prompt === 'agentrequested';\n            } else {\n                return false;\n            }\n        }\n    ),\n\n    isNonDiscretionaryCompletion: or(\n        'isWrapupPromptAgentRequested',\n        'isAfterCallWorkForcedTimeout',\n        'isAfterCallWorkTimeout'\n    ),\n\n    isAfterCallWorkMandatory: computed('myself.wrapupPrompt', 'isNonDiscretionaryCompletion', function () {\n        const prompt = maybeLowerCase(this.get('myself.wrapupPrompt'));\n        return prompt === 'mandatory' || this.isNonDiscretionaryCompletion;\n    }),\n\n    callState: reads('myself.calls.firstObject'),\n    peerDisconnectedCall: computed('callState.disconnectType', function () {\n        const disconnectType = maybeLowerCase(this.get('callState.disconnectType'));\n        return disconnectType === 'peer';\n    }),\n\n    myselfDisconnectedCall: computed('callState.disconnectType', function () {\n        const disconnectType = maybeLowerCase(this.get('callState.disconnectType'));\n        return disconnectType === 'client';\n    }),\n\n    errorInfo: reads('callState.errorInfo'),\n    errorInfoMessage: reads('errorInfo.message'),\n\n    isIncoming: computed('callState.state', function () {\n        return maybeLowerCase(this.get('callState.state')) === 'alerting';\n    }),\n\n    isDialing: computed('callState.state', function () {\n        const state = maybeLowerCase(this.get('callState.state'));\n        return state === 'alerting' || state === 'contacting' || state === 'dialing';\n    }),\n\n    isRinging: computed('callState.state', function () {\n        const state = maybeLowerCase(this.get('callState.state'));\n        return state === 'alerting';\n    }),\n\n    isDialingOrContacting: computed('callState.state', function () {\n        const state = maybeLowerCase(this.get('callState.state'));\n        return state === 'contacting' || state === 'dialing';\n    }),\n\n    isContacting: computed('callState.state', function () {\n        const state = maybeLowerCase(this.get('callState.state'));\n        return state === 'contacting';\n    }),\n\n    justMyselfOnCall: computed('participants.[]', 'myGuid', 'isContacting', function () {\n        const iAmContacting = this.get('participants.firstObject.userId') === this.myGuid && this.isContacting;\n        return this.participants.length === 1 && iAmContacting;\n    }),\n\n    theOtherPartyWhileContacting: computed('justMyselfOnCall', 'attemptingToCall', function () {\n        if (!this.justMyselfOnCall) {\n            return;\n        }\n        const address = this.attemptingToCall;\n        if (address) {\n            const userId = get(address, 'userId');\n            const calls = [{ state: 'ALERTING' }];\n            return { userId, address, calls };\n        }\n    }),\n\n    isOutbound: computed('callState.direction', function () {\n        const direction = this.get('callState.direction');\n        return maybeLowerCase(direction) === 'outbound';\n    }),\n\n    isMissed: computed('callState.segments', 'isOutbound', function () {\n        const segments = this.get('callState.segments');\n        if (_.size(segments) === 1 && !this.isOutbound) {\n            const segment = _.last(segments);\n            const { type, howEnded } = segment;\n            const lowType = type.toLowerCase();\n            const endedWithDisconnect = maybeLowerCase(howEnded) === 'disconnect';\n            return (lowType === 'dialing' || lowType === 'alert') && endedWithDisconnect;\n        }\n        return false;\n    }),\n\n    isActive: computed('phone.activeCall', function () {\n        return this.id === this.get('phone.activeCall.id');\n    }),\n\n    isHeld: and('callState.held', 'onCall'),\n    isConfined: and('callState.confined', 'onCall', 'onConsult'),\n    isMuted: and('callState.muted', 'onCall'),\n    useRecordersState: computed('session.features', function () {\n        return this.get('session.features.WEM-438_recorder-states');\n    }),\n    isRecording: computed(\n        'onCall',\n        'callState.recording',\n        'callState.recordersState',\n        'useRecordersState',\n        function () {\n            if (this.useRecordersState) {\n                const adhocState = this.get('callState.recordersState.adhocState');\n                return adhocState && adhocState.toLowerCase() === 'active';\n            }\n            return this.get('callState.recording') && this.onCall;\n        }\n    ),\n    isDisconnected: not('onCall'),\n    wentToVoicemail: computed('allParties.@each.purpose', function () {\n        const parties = this.allParties;\n        if (!parties) {\n            return false;\n        }\n        const voicemail = parties.findBy('purpose', 'Voicemail') || parties.findBy('purpose', 'voicemail');\n        return !_.isEmpty(voicemail);\n    }),\n\n    voicemailParties: computed('wentToVoicemail', function () {\n        return _.filter(this.allParties, party => {\n            return party && party.purpose === 'voicemail';\n        });\n    }),\n\n    onCall: computed('callState', function () {\n        const state = maybeLowerCase(this.get('callState.state'));\n        return state !== 'disconnected' && state !== 'terminated';\n    }),\n\n    isConnected: computed('callState.state', function () {\n        const state = maybeLowerCase(this.get('callState.state'));\n        return state === 'connected';\n    }),\n\n    onConsult: computed('otherParties.@each.calls', function () {\n        const others = this.otherParties;\n        const consultParties = others.filter(other => !!other.consultParticipantId);\n        if (consultParties.length !== 2) {\n            return false;\n        }\n        const found = _.find(others, other => other.consultParticipantId);\n        return !_.isEmpty(found);\n    }),\n\n    markCallAsConsult: observer('onConsult', 'participants.@each.consultParticipantId', 'participants.[]', function () {\n        const consult = _.find(this.participants, participant => {\n            return participant.consultParticipantId;\n        });\n        if (this.onConsult || consult) {\n            return this.set('conversationIsAConsult', true);\n        }\n    }),\n\n    /**\n     * @deprecated use `isActiveConference` from the interaction model instead\n     */\n    onConference: computed('maxParticipants', function () {\n        return this.maxParticipants > 0;\n    }),\n\n    canUpdateConsult: computed('onConsult', 'participants.@each.attributes', function () {\n        const person = this.get('application.session.person');\n        const initiator = _.find(this.participants, participant => {\n            const initiator = participant.attributes.consultInitiator;\n            return initiator === 'true' || initiator === true;\n        });\n        return get(initiator, 'userId') === person.get('guid');\n    }),\n\n    groupRingId: computed('participants.@each.purpose', function () {\n        // grab most recent group participant with endTime\n        // if no endTime, then that group participant is most recent\n        let mostRecentEndTime = null;\n        let groupParticipant = null;\n        for (const participant of this.participants) {\n            const groupId = get(participant, 'groupId') || get(participant, 'group.id');\n            if (groupId) {\n                const currentTimestamp = moment(get(participant, 'endTime'));\n                // Compare with the current most recent timestamp\n                if (mostRecentEndTime === null || currentTimestamp.isAfter(mostRecentEndTime)) {\n                    mostRecentEndTime = currentTimestamp;\n                    groupParticipant = participant;\n                }\n            }\n        }\n        if (groupParticipant) {\n            return groupParticipant.groupId;\n        }\n        return null;\n    }),\n\n    isGroupRing: computed('groupRingId', function () {\n        return !!this.groupRingId;\n    }),\n\n    groupRingGroup: computed('groupRingId', function () {\n        const groupId = this.groupRingId;\n        if (groupId) {\n            let promise = this.get('application.store').findRecord('group', groupId, {\n                reload: false,\n                backgroundReload: false\n            });\n            return DS.PromiseObject.create({ promise });\n        }\n    }),\n\n    _groupRingCaller: computed('isGroupRing', 'participants', 'connectedParties.@each.purpose', function () {\n        if (!this.isGroupRing) {\n            return null;\n        }\n\n        // We are going to mimic the callv2 behavior, for consistency\n        let participants = this.participants;\n        const outboundParticipant = participants.findBy('calls.firstObject.direction', 'outbound');\n\n        if (outboundParticipant) {\n            return outboundParticipant;\n        }\n\n        const externalParticipants = participants\n            .reject(p => {\n                return get(p, 'dnis') === 'unknown';\n            })\n            .filter(p => p.purpose === 'external' || p.purpose === 'customer');\n        const inboundExternal = externalParticipants.findBy('calls.firstObject.direction', 'inbound');\n        if (inboundExternal) {\n            return inboundExternal;\n        }\n\n        // Sometimes the initiator is indeterminate based on the data we get\n        // but it's not really necessary for rendering the component\n        return null;\n    }),\n\n    isOutboundGroupRing: computed('isOutbound', '_groupRingCaller', 'myGuid', function () {\n        return this.isOutbound && this.get('_groupRingCaller.userId') === this.myGuid;\n    }),\n\n    groupRingCaller: computed('_groupRingCaller', function () {\n        const actualCaller = this._groupRingCaller;\n        let caller = actualCaller;\n\n        if (caller && caller.userId) {\n            let promise = this.store.findRecord('person', caller.userId, {\n                reload: false,\n                backgroundReload: false\n            });\n            caller = DS.PromiseObject.create({ promise });\n        }\n        return caller;\n    }),\n\n    connectedToStationAndNotConference: computed('participants.[]', 'onConference', function () {\n        const participants = this.participants;\n        const anotherPartyIsStation = !!participants.find(p => {\n            const isStation = get(p, 'purpose') === 'station';\n            if (!isStation) {\n                return false;\n            }\n            const isStandaloneStation = get(p, 'name');\n            if (isStandaloneStation) {\n                return false;\n            }\n            return get(p, 'calls.firstObject.disconnectType') !== 'transfer.forward';\n        });\n        const anotherPartyIsVoicemail = !!participants.findBy('purpose', 'voicemail');\n        return anotherPartyIsStation && !this.onConference && !anotherPartyIsVoicemail;\n    }),\n\n    _doesParticipantHaveActiveSessionShare: function (participant) {\n        const screenShares = get(participant, 'screenShares') || get(participant, 'screenshares');\n        const cobrowsesessions = get(participant, 'cobrowsesessions');\n        const videos = get(participant, 'videos');\n\n        let allMedia = [];\n        if (screenShares) {\n            allMedia = allMedia.concat(screenShares);\n        }\n        if (cobrowsesessions) {\n            allMedia = allMedia.concat(cobrowsesessions);\n        }\n        if (videos) {\n            allMedia = allMedia.concat(videos);\n        }\n\n        let connectedMedia = _.find(allMedia, media => media.state.toLowerCase() === 'connected');\n        return !!connectedMedia;\n    },\n\n    agentParticipants: computed('participants.[]', 'myGuid', function () {\n        return _.filter(this.participants, participant => {\n            const guid = userGuidFromParticipant(participant);\n            const purpose = participant.purpose.toLowerCase();\n            return this.myGuid === guid && (purpose === 'agent' || purpose === 'user');\n        });\n    }),\n\n    conversationHasActiveSessionShare: computed('agentParticipants.[]', function () {\n        let hasActiveMedia = _.some(this.agentParticipants, participant => {\n            return this._doesParticipantHaveActiveSessionShare(participant);\n        });\n        return hasActiveMedia;\n    }),\n\n    trackConfinedParty: observer('participants.@each.confined', function () {\n        const participants = this.participants || [];\n        const confinedParty = participants.find(party => {\n            const call = _.head(party.calls);\n            return call && call.confined;\n        });\n\n        if (confinedParty) {\n            this.set('lastConfinedParty', confinedParty);\n        }\n    }),\n\n    consultInitiatorLeftCall: computed('peerDisconnectedCall', function () {\n        return this.iAmInitiatorOfConsult ? this.connectedParties.length === 2 : false;\n    })\n});\n","import { reads } from '@ember/object/computed';\nimport { A } from '@ember/array';\nimport EmberObject, { computed, get } from '@ember/object';\nimport { capitalize } from '@ember/string';\nimport DS from 'ember-data';\nimport ChatsMixin from '../mixins/conversation/chats';\nimport EmailsMixin from '../mixins/conversation/emails';\n\nfunction findMedias(participantSelection, mediaType) {\n    return computed(`${participantSelection}.@each.${mediaType}`, function () {\n        return this.get(participantSelection).reduce((a, b) => {\n            const items = b.get(mediaType);\n            if (items && Array.isArray(items)) {\n                return a.concat(items);\n            }\n            if (items && typeof items.toArray === 'function') {\n                return a.concat(items.toArray());\n            }\n            return a;\n        }, []);\n    });\n}\n\nconst MEDIA_TYPES = ['calls', 'chats', 'screenShares', 'videos', 'vrs', 'emails', 'callbacks', 'messages'];\n\nconst MEDIA_TYPE_COMPUTEDS = {};\nMEDIA_TYPES.forEach(mediaType => {\n    const all = findMedias('participants', mediaType);\n    const my = findMedias('myParticipants', mediaType);\n\n    MEDIA_TYPE_COMPUTEDS[mediaType] = all;\n    const myMediaTypeKey = `my${capitalize(mediaType)}`;\n    MEDIA_TYPE_COMPUTEDS[myMediaTypeKey] = my;\n});\n\nconst mixins = [ChatsMixin, EmailsMixin];\n\nconst ConversationModel = DS.Model.extend(MEDIA_TYPE_COMPUTEDS, ...mixins, {\n    // ----------------------------------------------------------------------------\n    // Raw Properties\n    // ----------------------------------------------------------------------------\n\n    startTime: DS.attr(),\n    endTime: DS.attr(),\n    address: DS.attr(),\n    participants: DS.hasMany('participant', { async: false }),\n    recordings: DS.hasMany('recording', { async: true }),\n    recordingState: DS.attr(),\n    selfUri: DS.attr(),\n\n    // ----------------------------------------------------------------------------\n    // Update handles a raw update coming in from carrier pigeon\n    // ----------------------------------------------------------------------------\n\n    update(conversation) {\n        // Set all primitives from the update on the model\n        Object.keys(conversation).forEach(key => {\n            const value = conversation[key];\n            const type = typeof conversation[key];\n            if (value === null || type === 'string' || type === 'number' || type === 'boolean') {\n                this.set(key, value);\n            }\n        });\n\n        if (conversation.participants) {\n            conversation.participants.forEach(participant => {\n                const existingParticipant = this.participants.findBy('id', participant.id);\n\n                if (existingParticipant) {\n                    existingParticipant.update(participant);\n                } else {\n                    const normalized = this.store.normalize('participant', participant);\n                    const newParticipant = this.store.push(normalized);\n                    this.participants.pushObject(newParticipant);\n                }\n            });\n        }\n    },\n\n    // ----------------------------------------------------------------------------\n    // Raw Computed Properties (computed only from Raw properties)\n    // ----------------------------------------------------------------------------\n\n    participantsScreenRecording: computed('participants.@each.screenRecordingState', function () {\n        const activeStates = ['requested', 'active', 'paused', 'timeout'];\n\n        return this.participants.filter(participant => {\n            const state = participant.get('screenRecordingState');\n            return state && activeStates.includes(state);\n        });\n    }),\n\n    activeCommunications: computed('participants.@each.activeCommunications', function () {\n        const allActiveCommunications = EmberObject.create();\n\n        this.participants.forEach(participant => {\n            if (!participant.get('userId')) {\n                return;\n            }\n\n            let allActiveUserCommunications = allActiveCommunications.get(participant.get('userId'));\n            if (!allActiveUserCommunications) {\n                allActiveUserCommunications = allActiveCommunications.set(\n                    participant.get('userId'),\n                    EmberObject.create()\n                );\n            }\n\n            const participantComs = participant.get('activeCommunications');\n\n            for (const comType of Object.keys(participantComs)) {\n                const activeUserCommunications = allActiveUserCommunications.get(comType);\n\n                if (!activeUserCommunications) {\n                    allActiveUserCommunications.set(comType, participantComs.get(comType));\n                } else {\n                    activeUserCommunications.pushObjects(participantComs.get(comType));\n                }\n            }\n        });\n\n        return allActiveCommunications;\n    }),\n\n    // ----------------------------------------------------------------------------\n    // Assigned properties - properties provided upon initialization\n    //                        used for computed properties\n    // ----------------------------------------------------------------------------\n\n    userId: null,\n\n    // ----------------------------------------------------------------------------\n    // Assigned Computed properties - properties computed from Raw and Assigned\n    // ----------------------------------------------------------------------------\n\n    /*\n     * myParticipants\n     * returns: Array Participant - matching userId (guid)\n     * notes: Old assumption of single participant for the current user is not 100%, so this is now an array\n     */\n    myParticipants: computed('userId', 'participants.[]', function () {\n        return this.participants.filterBy('userId', this.userId);\n    }),\n\n    /*\n     * isAfterCallWorkRequired\n     * returns Bool\n     * notes: returns True if there are no self participants with wrapup required\n     */\n    isAfterCallWorkRequired: computed('myParticipants.@each.wrapupRequired', function () {\n        return !!this.myParticipants.any(p => get(p, 'wrapupRequired'));\n    }),\n\n    /*\n     * isAfterCallWorkCompleted\n     * returns Bool\n     * notes: returns True if there are no self participants with (wrapup required and no wrapup set)\n     */\n    isAfterCallWorkCompleted: computed('myParticipants.@each.wrapup', function () {\n        return !this.myParticipants.any(p => get(p, 'wrapupRequired') && !get(p, 'wrapup'));\n    }),\n\n    // ----------------------------- //\n    // Added from conversation-v2.js //\n    // ----------------------------- //\n    currentUserId: null,\n    room: null,\n    customerName: reads('customerDetails.name'),\n    queuId: reads('currentUserParticipant.queueId'),\n\n    userParticipants: computed('participants.@each.userId', 'currentUserId', function () {\n        const currentUserId = this.currentUserId;\n        const participants = this.participants;\n        const userParticipants = [];\n        participants.forEach(participant => {\n            const participantIsCurrentUser = !!currentUserId && currentUserId === participant.get('userId');\n            if (participantIsCurrentUser) {\n                userParticipants.push(participant);\n            }\n        });\n        return A(userParticipants);\n    }),\n\n    currentUserParticipant: computed('userParticipants.[]', function () {\n        const error = new Error(\n            'DEPRECATION WARNING: ember-purecloud-components > conversation.currentUserParticipant is deprecated'\n        );\n        console.warn(error.message, {\n            stack: error.stack\n        });\n\n        const userParticipants = [...(this.userParticipants || [])].reverse();\n        return userParticipants ? userParticipants.find(participant => !participant.get('wrapup')) : null;\n    }),\n\n    acdParticipants: computed('particpants.@each.purpose', function () {\n        const participants = this.participants;\n        const filteredParticipants = [];\n        participants.forEach(participant => {\n            if (participant.get('purpose') === 'acd') {\n                filteredParticipants.push(participant);\n            }\n        });\n        return filteredParticipants;\n    }),\n\n    lastAcdParticipant: computed('acdParticipants.[]', function () {\n        const error = new Error(\n            'DEPRECATION WARNING: ember-purecloud-components > conversation.lastAcdParticipant is deprecated'\n        );\n        console.warn(error.message, {\n            stack: error.stack\n        });\n\n        const acdParticipants = this.acdParticipants;\n        return [].concat(acdParticipants).pop();\n    }),\n\n    customerParticipant: computed('participants.@each.purpose', function () {\n        const error = new Error(\n            'DEPRECATION WARNING: ember-purecloud-components > conversation.customerParticipant is deprecated'\n        );\n        console.warn(error.message, {\n            stack: error.stack\n        });\n\n        const participants = this.participants;\n        let result;\n        participants.forEach(participant => {\n            if (participant.get('purpose') === 'customer') {\n                result = participant;\n            }\n        });\n\n        return result;\n    }),\n\n    customerDetails: computed('customerParticipant', function () {\n        const error = new Error(\n            'DEPRECATION WARNING: ember-purecloud-components > conversation.customerParticipant is deprecated'\n        );\n        console.warn(error.message, {\n            stack: error.stack\n        });\n\n        const customer = this.customerParticipant;\n        let details = {};\n\n        if (customer && customer.get('name')) {\n            details.name = customer.get('name');\n        } else if (this.formattedCustomerPhoneNumber) {\n            details.name = this.formattedCustomerPhoneNumber;\n        }\n\n        if (customer && customer.get('attributes')) {\n            for (let [property, value] of Object.entries(customer.get('attributes'))) {\n                let parts = property.split('.');\n                property = parts[parts.length - 1];\n                details[property] = value;\n            }\n        }\n\n        return details;\n    }),\n\n    wrapupRequired: computed('currentUserParticipant.wrapupRequired', function () {\n        const currentUserParticipant = this.currentUserParticipant;\n        const required = currentUserParticipant.get('wrapupRequired');\n        return required === 'true';\n    }),\n\n    wrapupPrompt: computed('currentUserParticipant.wrapupPrompt', function () {\n        const currentUserParticipant = this.currentUserParticipant;\n        return currentUserParticipant.get('wrapupPrompt');\n    }),\n\n    wrapup: computed('currentUserParticipant.wrapup', function () {\n        const currentUserParticipant = this.currentUserParticipant;\n        return currentUserParticipant.get('wrapup');\n    }),\n\n    wrapupComplete: computed('wrapup.code', 'wrapupRequired', function () {\n        const wrapupRequired = this.wrapupRequired;\n        const wrapupCode = this.get('wrapup.code');\n        return !wrapupRequired || !!wrapupCode;\n    })\n}).reopenClass({ MediaTypes: MEDIA_TYPES });\n\nexport default ConversationModel;\n","import DS from 'ember-data';\nimport Communication from './communication';\n\nexport default Communication.extend({\n    held: DS.attr(),\n    subject: DS.attr(),\n    messagesSent: DS.attr(),\n    direction: DS.attr(),\n    recordingId: DS.attr(),\n    errorInfo: DS.attr(),\n    disconnectType: DS.attr(),\n    startHoldTime: DS.attr(),\n    disconnectedTime: DS.attr(),\n    autoGenerated: DS.attr(),\n    scriptId: DS.attr(),\n    peerId: DS.attr(),\n    messageId: DS.attr(),\n\n    update(comUpdate) {\n        this._super(...arguments);\n        const updatableAttrs = [\n            'held',\n            'subject',\n            'messagesSent',\n            'direction',\n            'errorInfo',\n            'disconnectType',\n            'startHoldTime',\n            'disconnectedTime',\n            'autoGenerated'\n        ];\n\n        const updateProperties = {};\n        for (const updatable of updatableAttrs) {\n            const updatedValue = comUpdate[updatable];\n            if (typeof updatedValue !== 'undefined') {\n                updateProperties[updatable] = updatedValue;\n            }\n        }\n\n        this.setProperties(updateProperties);\n    }\n});\n","import EmberObject, { computed } from '@ember/object';\n\nexport default EmberObject.extend({\n    id: null,\n    agent: null,\n    agentHasRead: null,\n    assignedDate: null,\n    releaseDate: null,\n    changedDate: null,\n    conversation: null,\n    evaluationForm: null,\n    evaluator: null,\n    status: null,\n    redacted: false,\n    selected: false,\n    rescore: false,\n    mediaType: [],\n    conversationDate: null,\n    assignee: null,\n    dateAssigneeChanged: null,\n    declinedReview: false,\n\n    displayThumbnail: computed('agent.userImages', function () {\n        if (this.get('agent.userImages.length')) {\n            return this.get('agent.userImages.firstObject');\n        }\n        return { imageUri: null };\n    })\n});\n","import { computed } from '@ember/object';\nimport DS from 'ember-data';\nimport EntityMixin from '../mixins/entity';\n\nexport default DS.Model.extend(EntityMixin, {\n    title: computed('general.title.@each.value', function () {\n        const field = this.getFieldValue('general.title');\n        return field && field.value;\n    }),\n\n    department: computed('general.department.@each.value', function () {\n        const field = this.getFieldValue('general.department');\n        return field && field.value;\n    }),\n\n    organization: computed('general.organization.@each.value', function () {\n        const field = this.getFieldValue('general.organization');\n        return field && field.value;\n    }),\n\n    description: computed('general.notes.@each.value', function () {\n        const field = this.getFieldValue('general.notes')[0];\n        return field && field.value;\n    }),\n\n    phone: computed('contactInfo.phone.@each.value', function () {\n        const field = this.getFieldValue('contactInfo.phone');\n        return field && field[0];\n    }),\n\n    email: computed('contactInfo.email.@each.value', function () {\n        const field = this.getFieldValue('contactInfo.email');\n        return field && field.value;\n    })\n});\n","import DS from 'ember-data';\n\n// This is like a \"union\" type pf the various Relate domain messaging ID types (see the FacebookId, LineId, TwitterId\n// and WhatsApp domain classes in the Relate contact-service project).\n//\n// Also refer to the *_id models in this directory\n//\n// An Ember DS record of this type is built from the inbound message to help detect changes between the message's info, and\n// channel info from an external contact in Relate for the same channel.\nexport default DS.Model.extend({\n    type: DS.attr('string'), // Meta info about the channel\n    channelIdProperty: DS.attr('string'), // Meta info about the domain class property name for the channel (e.g. \"lineId\" or \"twitterId\")\n    isNewChannel: DS.attr('boolean'), // Meta info -- true if this is a new channel for an external contact\n    changesIgnoredByAgent: DS.attr('boolean'), // Meta info -- true if the agent was prompted to accept or ignore detected channel info changes, and they elected to ignore\n    agentRespondedToPrompt: DS.attr('boolean'), // Meta info -- true if the agent was prompted to accept or ignore detected channel info changes, and they responded\n    userId: DS.attr('string'), // The ID of the user from the channel\n    ids: DS.attr(), // An array of strings representing an array of user IDs for the channel (for Facebook or LINE)\n    name: DS.attr('string'), // The name of the user (for Twitter)\n    displayName: DS.attr('string'), // For display name of the user (for LINE, Facebook, and WhatsApp)\n    screenName: DS.attr('string'), // The screen name (AKA handle) of the user (for Twitter)\n    phoneNumber: DS.attr() // Includes e164: an e164-formatted phone number, and display: a display-friendly phone number (for Whatsapp),\n});\n","import { bool, alias } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { computed } from '@ember/object';\nimport DS from 'ember-data';\nimport moment from '../../utils/dates';\n\nexport const PreferredPhoneContactOrder = ['workPhone', 'homePhone', 'cellPhone', 'otherPhone', 'whatsAppId'];\nexport const PreferredEmailContactOrder = ['workEmail', 'personalEmail', 'otherEmail'];\nexport const ENTITY_TYPE = 'externalcontacts/contact';\n\nexport default DS.Model.extend({\n    ajax: service(),\n    intl: service(),\n    session: service(),\n    names: service(),\n    permissions: service(),\n    schemaType: 'contact',\n    type: ENTITY_TYPE,\n    externalDataSources: DS.attr(),\n    externalOrganizationId: DS.attr('string'),\n    createDate: DS.attr('string'),\n    modifyDate: DS.attr('string'),\n    firstName: DS.attr('string'),\n    middleName: DS.attr('string'),\n    lastName: DS.attr('string'),\n    title: DS.attr('string'),\n    address: DS.attr(),\n    workPhone: DS.attr(),\n    cellPhone: DS.attr(),\n    homePhone: DS.attr(),\n    otherPhone: DS.attr(),\n    workEmail: DS.attr('string'),\n    personalEmail: DS.attr('string'),\n    otherEmail: DS.attr('string'),\n    twitterId: DS.attr(),\n    lineId: DS.attr(),\n    facebookId: DS.attr(),\n    whatsAppId: DS.attr(),\n    surveyOptOut: DS.attr('boolean', { defaultValue: false }),\n\n    schema: DS.attr(),\n    customFields: DS.attr(),\n\n    division: DS.attr(),\n\n    contactType: DS.attr(),\n    mergedTo: DS.attr(),\n    mergedFrom: DS.attr(),\n    canonicalContact: DS.attr(),\n    mergeSet: DS.attr(),\n\n    isCurated: computed('contactType', function () {\n        return this.contactType === 'curated';\n    }),\n    isIdentified: computed('contactType', function () {\n        return this.contactType === 'identified';\n    }),\n\n    canonicalId: alias('canonicalContact.id'),\n    divisionName: alias('division.name'),\n    isCanonical: computed('id', 'canonicalId', function () {\n        const { canonicalId, id } = this;\n        return canonicalId === id;\n    }),\n\n    phoneNumber: null, // Set by the entity-mini/external-contact/component as the phone number the user selected\n    phoneType: null, // Set by the entity-mini/external-contact/component as the phone numbers type the user selected\n    externalOrganization: DS.belongsTo('externalcontacts/externalOrganization', { async: false }),\n    externalSystemUrl: DS.attr('string'),\n\n    createdDate: computed('createDate', function () {\n        return moment(this.createDate).format('L');\n    }),\n    lastUpdated: computed('modifyDate', function () {\n        return moment(this.modifyDate).format('L');\n    }),\n\n    hasEmailAddresses: bool('bestEmailAddress'),\n\n    //these aliases are used to aid in validation.\n    address1: alias('address.address1'),\n    address2: alias('address.address2'),\n    city: alias('address.city'),\n    state: alias('address.state'),\n    postalCode: alias('address.postalCode'),\n    countryCode: alias('address.countryCode'),\n\n    twitter: alias('twitterId.screenName'),\n\n    isSalesForce: bool('salesforceLink'),\n\n    init() {\n        this._super(...arguments);\n        PreferredPhoneContactOrder.forEach(phoneName => {\n            const featureKey =\n                phoneName === 'whatsAppId' ? phoneName.replace('Id', 'Number') : phoneName.replace('Phone', 'Number');\n            const featureKeyExt = `${featureKey}Ext`;\n            const featureKeyAcceptsSMS = `${featureKey}AcceptsSMS`;\n\n            this.set(featureKey, alias(`${phoneName}.display`));\n            this.set(featureKeyExt, alias(`${phoneName}.extension`));\n            this.set(featureKeyAcceptsSMS, alias(`${phoneName}.acceptsSMS`));\n        });\n    },\n\n    initials: computed('firstName', 'lastName', function () {\n        return this.names.initials(this);\n    }),\n    name: computed('firstName', 'lastName', 'middleName', function () {\n        return this.names.fullName(this);\n    }),\n    /**\n     * Gets the best email available for this contact, or undefined if there is none\n     */\n    bestEmailAddress: computed(...PreferredEmailContactOrder, function () {\n        const preferredEmailType = this._bestEmailType();\n        return preferredEmailType ? this.get(preferredEmailType) : null;\n    }),\n\n    /**\n     * Gets the best email type available for this contact, or undefined if there is none\n     */\n    bestEmailType: computed(...PreferredEmailContactOrder, function () {\n        return this._bestEmailType();\n    }),\n\n    /**\n     * Gets the best number available for this contact, or undefined if there is none\n     */\n    bestPhoneNumber: computed('phoneNumber', ...PreferredPhoneContactOrder, function () {\n        const phoneType = this._bestPhoneType(PreferredPhoneContactOrder);\n        return phoneType === 'whatsAppId'\n            ? this.get(`${phoneType}.phoneNumber.e164`) || this.get(`${phoneType}.phoneNumber.display`)\n            : this.get(`${phoneType}.e164`) || this.get(`${phoneType}.display`);\n    }),\n\n    /**\n     * Gets the best number available for this contact, or undefined if there is none\n     */\n    bestPhoneNumberDisplay: computed('phoneNumber', ...PreferredPhoneContactOrder, function () {\n        const phoneType = this._bestPhoneType(PreferredPhoneContactOrder);\n        return phoneType === 'whatsAppId'\n            ? this.get(`${phoneType}.phoneNumber.display`) || this.get(`${phoneType}.phoneNumber.e164`)\n            : this.get(`${phoneType}.display`) || this.get(`${phoneType}.e164`);\n    }),\n\n    /**\n     * Gets the best phone type localized string available for this contact, or undefined if there is none\n     */\n    bestPhoneType: computed(...PreferredPhoneContactOrder, function () {\n        const bestPhoneType = this._bestPhoneType(PreferredPhoneContactOrder);\n        if (bestPhoneType === 'whatsAppId') return this.intl.t('purecloud.acdInteraction.relate.channelTypes.whatsapp');\n        return bestPhoneType ? this.intl.t(`purecloud.acdInteraction.relate.phoneTypes.${bestPhoneType}`) : undefined;\n    }),\n\n    /**\n     * Gets the best phone type parameter key available for this contact, or undefined if there is none\n     */\n    bestPhoneTypeKey: computed(...PreferredPhoneContactOrder, function () {\n        const bestPhoneType = this._bestPhoneType(PreferredPhoneContactOrder);\n        return bestPhoneType ? bestPhoneType : undefined;\n    }),\n\n    adapterDidCommit() {\n        return; // Does nothing but prevent \"TypeError: _this.adapterDidCommit is not a function(�)\" when canceling an edit due to a EntityMixin call to that method\n    },\n\n    getEmailTitleFor(emailType) {\n        return emailType\n            ? this.intl.t(`purecloud.acdInteraction.relate.emailTypes.${emailType}`)\n            : this.intl.t('purecloud.acdInteraction.relate.phoneTypes.otherEmail');\n    },\n\n    getPhoneTitleFor(phoneType) {\n        if (phoneType === 'whatsAppId') return this.intl.t('purecloud.acdInteraction.relate.channelTypes.whatsapp');\n        return phoneType\n            ? this.intl.t(`purecloud.acdInteraction.relate.phoneTypes.${phoneType}`)\n            : this.intl.t('purecloud.acdInteraction.relate.phoneTypes.otherPhone');\n    },\n\n    _bestEmailType() {\n        return PreferredEmailContactOrder.find(emailType => this.get(emailType));\n    },\n\n    _bestPhoneType(types) {\n        return (\n            this.phoneType ||\n            types.find(type => {\n                return this.get(`${type}.e164`) || this.get(`${type}.display`);\n            }) ||\n            types.find(type => {\n                return this.get(`${type}.phoneNumber.e164`) || this.get(`${type}.phoneNumber.display`);\n            })\n        );\n    },\n\n    /**\n     * Returns the non-translated best phoneType key. non-translated phoneType\n     * @returns {String} Non-translated string representing a type of phone.\n     */\n    _bestPhoneTypeKey(types) {\n        return (\n            this.phoneTypeKey ||\n            types.find(type => {\n                return this.get(`${type}.e164`) || this.get(`${type}.display`);\n            }) ||\n            types.find(type => {\n                return this.get(`${type}.phoneNumber.e164`) || this.get(`${type}.phoneNumber.display`);\n            })\n        );\n    },\n\n    /**\n     * Returns the non-translated type for phone.\n     * @returns {String} Non-translated string representing a type of phone.\n     */\n    getRawPhoneType() {\n        return this._bestPhoneTypeKey(PreferredPhoneContactOrder);\n    },\n\n    hasEmailAddress(address) {\n        return PreferredEmailContactOrder.some(emailType => this.get(emailType) && this.get(emailType) === address);\n    },\n\n    externalDataSourcesAlert: computed('externalDataSources', function () {\n        const externalDataSources = this.externalDataSources || [];\n        return externalDataSources.any(externalDataSource => externalDataSource.platform === '');\n    }),\n\n    salesforceLink: computed('externalDataSources', function () {\n        const externalDataSources = this.externalDataSources || [];\n        return externalDataSources\n            .filter(externalDataSource => externalDataSource.platform === 'SALESFORCE')\n            .mapBy('url')\n            .get('firstObject');\n    }),\n\n    /**\n     * Resolves the schema title string for this contact's custom fields schema.\n     * Returns a Promise<string> — use the {{await}} helper in templates.\n     * Collapses the former expandedSchema + schemaTitle async computed chain, which\n     * was broken in Ember 2.x: async computeds return a raw Promise, so awaiting\n     * this.get('expandedSchema') inside schemaTitle yielded the Promise object\n     * itself rather than the resolved value, causing replaceData DOM errors.\n     */\n    schemaTitle: computed('schema.id', 'permissions.hasExternalContactsViewSchemaAccess', function () {\n        const id = this.get('schema.id');\n        if (!id || !this.get('permissions.hasExternalContactsViewSchemaAccess')) {\n            return Promise.resolve('');\n        }\n\n        return this.get('ajax')\n            .ajaxGet(`/platform/api/v2/externalcontacts/contacts/schemas/${id}?expand=none`)\n            .then(schema => (schema ? schema.name || '' : ''))\n            .catch(() => '');\n    })\n});\n","import { bool, alias } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { computed } from '@ember/object';\nimport DS from 'ember-data';\nimport moment from '../../utils/dates';\n\nexport const PreferredPhoneContactOrder = ['phoneNumber', 'faxNumber'];\nconst getSetter = function (index) {\n    return {\n        get() {\n            const websites = this.websites;\n            return websites ? websites[index] : null;\n        },\n        set(key, value) {\n            const websites = this.websites;\n            websites[index] = value;\n            return websites[index];\n        }\n    };\n};\n\nexport default DS.Model.extend({\n    isOrganization: true,\n    ajax: service('ajax'),\n    session: service(),\n    permissions: service(),\n    schemaType: 'external-org',\n    type: 'externalcontacts/externalOrganization',\n    name: DS.attr('string'),\n    createDate: DS.attr('string'),\n    modifyDate: DS.attr('string'),\n    companyType: DS.attr('string'),\n    industry: DS.attr('string'),\n    primaryContactId: DS.attr('string'),\n    address: DS.attr(),\n    phoneNumber: DS.attr(),\n    faxNumber: DS.attr(),\n    employeeCount: DS.attr('number'),\n    revenue: DS.attr('number'),\n    tags: DS.attr(),\n    tickers: DS.attr(),\n    websites: DS.attr(),\n    twitterId: DS.attr(),\n    contact: DS.hasMany('externalcontacts/contact', { async: false }),\n    externalDataSources: DS.attr(),\n    externalSystemUrl: DS.attr('string'),\n    isSalesForce: bool('salesforceLink'),\n    schema: DS.attr(),\n    customFields: DS.attr(),\n\n    init() {\n        this._super(...arguments);\n        PreferredPhoneContactOrder.forEach(phoneName => {\n            const featureKey = phoneName.replace('Number', '');\n            const featureKeyExt = `${featureKey}Ext`;\n            const featureKeyAcceptsSMS = `${featureKey}AcceptsSMS`;\n\n            this.set(featureKey, alias(`${phoneName}.display`));\n            this.set(featureKeyExt, alias(`${phoneName}.extension`));\n            this.set(featureKeyAcceptsSMS, alias(`${phoneName}.acceptsSMS`));\n        });\n    },\n\n    createdDate: computed('createDate', function () {\n        return moment(this.createDate).format('L');\n    }),\n    lastUpdated: computed('modifyDate', function () {\n        return moment(this.modifyDate).format('L');\n    }),\n\n    website1: computed('websites.[]', getSetter.call(this, 0)),\n    website2: computed('websites.[]', getSetter.call(this, 1)),\n    //these aliases are used to aid in validation.\n\n    address1: alias('address.address1'),\n    address2: alias('address.address2'),\n    city: alias('address.city'),\n    state: alias('address.state'),\n    postalCode: alias('address.postalCode'),\n    countryCode: alias('address.countryCode'),\n\n    twitter: alias('twitterId.screenName'),\n\n    externalDataSourcesAlert: computed('externalDataSources', function () {\n        const externalDataSources = this.externalDataSources || [];\n        return externalDataSources.any(externalDataSource => externalDataSource.platform === '');\n    }),\n\n    salesforceLink: computed('externalDataSources', function () {\n        const externalDataSources = this.externalDataSources || [];\n        return externalDataSources\n            .filter(externalDataSource => externalDataSource.platform === 'SALESFORCE')\n            .mapBy('url')\n            .get('firstObject');\n    }),\n\n    /**\n     * Resolves the schema title string for this organization's custom fields schema.\n     * Returns a Promise<string> — use the {{await}} helper in templates.\n     * See externalcontacts/contact.js schemaTitle for explanation of why the former\n     * double-async-computed pattern (expandedSchema + schemaTitle) was removed.\n     */\n    schemaTitle: computed('schema.id', 'permissions.hasExternalContactsViewSchemaAccess', function () {\n        const id = this.get('schema.id');\n        if (!id || !this.get('permissions.hasExternalContactsViewSchemaAccess')) {\n            return Promise.resolve('');\n        }\n\n        return this.get('ajax')\n            .ajaxGet(`/platform/api/v2/externalcontacts/organizations/schemas/${id}?expand=none`)\n            .then(schema => (schema ? schema.name || '' : ''))\n            .catch(() => '');\n    })\n});\n","import { inject as service } from '@ember/service';\nimport EmberObject, { computed } from '@ember/object';\n\nexport default EmberObject.extend({\n    intl: service(),\n\n    id: null,\n    name: null,\n    dateCreated: null,\n    dateModified: null,\n    contentUri: null,\n    workspace: null,\n    createdBy: null,\n    contentType: null,\n    contentLength: null,\n    filename: null,\n    read: false,\n    thumbnails: null,\n    selfUri: null,\n    callerAddress: '',\n    receiverAddress: '',\n    selected: false,\n\n    isDefaultName: computed('name', 'callerAddress', function () {\n        let name = this.name;\n        if (!name) {\n            return false;\n        }\n        return name.toLowerCase().indexOf('fax from ') === 0;\n    }),\n\n    faxName: computed('isDefaultName', 'name', 'callerAddress', function () {\n        if (this.isDefaultName) {\n            return this.intl.t('notification.inbox.faxFrom', { callerAddress: this.callerAddress }).toString();\n        }\n        return this.name;\n    }),\n\n    faxFrom: computed('callerAddress', 'createdBy', function () {\n        const callerAddress = this.callerAddress;\n        if (callerAddress) {\n            return callerAddress;\n        }\n        return this.intl.safestring('notification.inbox.unknownSender');\n    }),\n\n    faxFile: computed('filename', 'name', function () {\n        const name = this.name;\n        if (name) {\n            return name;\n        }\n        return this.filename;\n    }),\n    displayThumbnail: computed('thumbnails.[]', function () {\n        const thumbnails = this.thumbnails;\n        return (\n            thumbnails[0] || {\n                imageUri: null\n            }\n        );\n    }),\n    /**\n     *  Converts 'this' into an object that can be passed to the faxes standalone app\n     * @returns An object with all of the properties of 'this' that are specified in props\n     */\n    getProperties: function () {\n        const props = [\n            'id',\n            'name',\n            'dateCreated',\n            'dateModified',\n            'contentUri',\n            'workspace',\n            'createdBy',\n            'contentType',\n            'contentLength',\n            'filename',\n            'read',\n            'thumbnails',\n            'pageCount',\n            'selfUri',\n            'callerAddress',\n            'receiverAddress',\n            'selected'\n        ];\n        return props.reduce((accumulator, prop) => {\n            return Object.assign(accumulator, { [prop]: this.get(prop) });\n        }, {});\n    }\n});\n","import DS from 'ember-data';\n\nexport default DS.Model.extend({\n    enabled: DS.attr()\n});\n","import DS from 'ember-data';\n\nexport default DS.Model.extend({\n    longitude: DS.attr(),\n    latitude: DS.attr(),\n    type: DS.attr(),\n    primary: DS.attr()\n});\n","import { inject as service } from '@ember/service';\nimport { equal } from '@ember/object/computed';\nimport EmberObject, { observer, computed, setProperties } from '@ember/object';\nimport _ from 'lodash';\n\nconst ISSUE_REGEX = /http(?:s)?:\\/\\/github\\.com\\/[a-zA-Z0-9_\\-.]+\\/[a-zA-Z0-9\\-.]+\\/issues\\/([0-9]+)$/i;\n\nexport default EmberObject.extend({\n    intl: service(),\n    preferences: service(),\n\n    mediaType: null,\n\n    username: null,\n    url: null,\n    repo: null,\n    link: null,\n\n    data: null,\n\n    settings: {},\n    showEmbedConfirmation: false,\n\n    init() {\n        this._super(...arguments);\n\n        this.get('preferences.widgets.githubRepo'); // setup observer\n\n        this.preferences.getPreference('widgets.githubRepo').then(settings => {\n            if (settings === undefined) {\n                this.set('showEmbedConfirmation', true);\n            } else {\n                let showEmbed = false;\n                if (settings.showEmbedConfirmation === undefined) {\n                    showEmbed = true;\n                }\n                this.set('settings', settings);\n                this.set('showEmbedConfirmation', showEmbed);\n            }\n        });\n    },\n\n    isRepo: equal('mediaType', 'github-repo'),\n    isGist: equal('mediaType', 'github-gist'),\n\n    isIssue: computed('link', 'isRepo', function () {\n        if (!this.isRepo) {\n            return false;\n        }\n\n        return ISSUE_REGEX.test(this.link);\n    }),\n\n    issueNumber: computed('link', function () {\n        return _.last(this.link.match(ISSUE_REGEX));\n    }),\n\n    title: computed('username', 'repo', 'isRepo', 'isGist', 'isIssue', function () {\n        const intl = this.intl;\n        const username = this.username;\n        if (this.isGist) {\n            return intl.t('chat.inlineMedia.gistTitle', { username }).toString();\n        } else if (this.isRepo) {\n            const repo = this.repo;\n            if (this.isIssue) {\n                const issue = this.issueNumber;\n                return intl.t('chat.inlineMedia.githubIssueTitle', { issue, repo }).toString();\n            }\n            return intl.t('chat.inlineMedia.githubRepoTitle', { username, repo }).toString();\n        }\n    }),\n\n    embedString: computed(function () {\n        return this.intl.safestring('chat.inlineMedia.githubItems.embedSupport');\n    }),\n\n    shouldEmbed: computed('settings.embed', function () {\n        return this.get('settings.embed') || false;\n    }),\n\n    onSettingsChange: observer('preferences.widgets.githubRepo', function () {\n        this.preferences.getPreference('widgets.githubRepo').then(settings => {\n            this.set('settings', settings);\n            this.set('showEmbedConfirmation', settings.showEmbedConfirmation);\n        });\n    }),\n\n    setEmbedPreference(pref) {\n        let settings = this.settings;\n        setProperties(settings, {\n            embed: pref,\n            showEmbedConfirmation: false\n        });\n\n        this.set('showEmbedConfirmation', false);\n\n        this.preferences.setPreference('widgets.githubRepo', settings);\n    }\n});\n","import DS from 'ember-data';\n\nexport default DS.Model.extend({\n    group: DS.attr(),\n    enabled: DS.attr(),\n    groupAlertType: DS.attr(),\n    overflowGroupId: DS.attr(),\n    rotateCallsSecs: DS.attr(),\n    sendEmailNotifications: DS.attr(),\n    disableEmailPii: DS.attr(),\n    stopRingingAfterRotations: DS.attr(),\n    includeEmailTranscriptions: DS.attr(),\n    languagePreference: DS.attr()\n});\n","import { resolve, Promise } from 'rsvp';\nimport { computed, get, observer, set } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nimport EntityMixin from '../mixins/entity';\nimport EntityImageComponent from 'web-directory/components/entity-image/component';\n\nexport const BASE_GROUP_FIELDS = [\n    'general',\n    'owners',\n    'membership',\n    'individuals',\n    'images.activeProfilePicture',\n    'extMongoId',\n    'contactInfo'\n];\n\nexport const BASE_GROUP = BASE_GROUP_FIELDS.join(',');\n\nconst COMPARATORS = {\n    EqualTo: {\n        label: 'equals (==)',\n        value: 'EqualTo',\n        op: '=='\n    },\n    NotEqualTo: {\n        label: 'not equals (!=)',\n        value: 'NotEqualTo',\n        op: '!='\n    },\n    GreaterThan: {\n        label: 'greater than (>)',\n        value: 'GreaterThan',\n        op: '>'\n    },\n    GreaterThanOrEqualTo: {\n        label: 'greater than or equal to (>=)',\n        value: 'GreaterThanOrEqualTo',\n        op: '>='\n    },\n    LessThan: {\n        label: 'less than (<)',\n        value: 'LessThan',\n        op: '<'\n    },\n    LessThanOrEqualTo: {\n        label: 'less than or equal to (<=)',\n        value: 'LessThanOrEqualTo',\n        op: '<='\n    }\n};\n\nconst PROFICIENCIES = [\n    { name: '0', value: 0 },\n    { name: '1', value: 1 },\n    { name: '2', value: 2 },\n    { name: '3', value: 3 },\n    { name: '4', value: 4 },\n    { name: '5', value: 5 }\n];\n\nvar GroupModel = DS.Model.extend(EntityMixin, {\n    ajax: service(),\n    logger: service('stash-logger'),\n    application: service(),\n    session: service(),\n    notification: service(),\n    permissions: service(),\n\n    meta: DS.attr(),\n    policy: DS.belongsTo('group-policy'),\n\n    acdSkills: null,\n\n    lastSavedExpression: null,\n\n    expression: computed('_expression.content', function () {\n        if (!this.get('_expression.content')) {\n            return null;\n        }\n        return this.parseExpression(this.get('_expression.content.skillConditions'));\n    }),\n\n    isDynamicGroup: computed('expression', 'permissions.canViewGroups', function () {\n        return this.get('permissions.canViewGroups') ? !!this.expression : false;\n    }),\n\n    reload() {\n        this.notifyPropertyChange('greeting');\n        this.policy.then(policy => {\n            if (policy) {\n                policy.reload();\n            }\n        });\n        return this._super(...arguments);\n    },\n\n    rollbackAttributes() {\n        this.notifyPropertyChange('greeting');\n        this.notifyPropertyChange('individuals');\n        this.policy.then(policy => {\n            if (policy) {\n                policy.rollbackAttributes();\n            }\n        });\n        return this._super(...arguments);\n    },\n\n    // convert to attribute on Ember-Data upgrades\n    greeting: computed('guid', function () {\n        const path = `api/v2/groups/${this.guid}/greetings/defaults`;\n        const url = this.application.pcV2Uri(path);\n\n        return DS.PromiseObject.create({\n            promise: this.ajax.request(url)\n        });\n    }),\n\n    _expression: computed('guid', 'permissions.canViewGroups', function () {\n        if (this.get('permissions.canViewGroups')) {\n            const path = `api/v2/groups/${this.guid}/dynamicsettings`;\n            const url = this.application.pcV2Uri(path);\n            return DS.PromiseObject.create({\n                promise: this.ajax\n                    .ajaxGet(url, {\n                        retry: true\n                    })\n                    .then(res => {\n                        return resolve(res.query);\n                    })\n                    .catch(err => {\n                        if (err.status === 404) {\n                            //this group is confirmed not a dynamic group\n                            return resolve(null);\n                        } else if (\n                            err.status === 403 && // check and see if it's a permission issue\n                            err.payload.code === 'missing.any.permissions' &&\n                            err.payload.message.indexOf('directory:group:view') > 0\n                        ) {\n                            // this user needs the updated group:view permissions\n                            this.logger.error('Error trying to load dynamic expression for group', {\n                                err\n                            });\n                            this.notification.error(\n                                this.intl.t('groups.expressions.loadErrorTitle'),\n                                this.intl.t('groups.expressions.permissionErrorMessage')\n                            );\n                        } else {\n                            //actual error\n                            this.logger.error('Error trying to load dynamic expression for group', {\n                                err\n                            });\n                            this.notification.error(\n                                this.intl.t('groups.expressions.loadErrorTitle'),\n                                this.intl.t('groups.expressions.loadErrorMessage')\n                            );\n                            return resolve(null);\n                        }\n                    })\n            });\n        }\n    }),\n\n    description: computed('general.description.@each.value', function () {\n        return this.getFieldValue('general.description').value;\n    }),\n\n    groupType: computed('general.groupType', function () {\n        var groupTypeValue = this.getFieldValue('general.groupType').value;\n        if (groupTypeValue) {\n            var actualType = groupTypeValue.split('.')[1];\n            var key = `group_general_groupType_value_${actualType}`;\n\n            return this.intl.t(key, {}, true).toString();\n        }\n\n        return '';\n    }),\n\n    memberCount: computed('general.memberCount.@each.value', function () {\n        if (this.get('general.memberCount')) {\n            return this.getFieldValue('general.memberCount').value;\n        }\n\n        return 0;\n    }),\n\n    profilePictureURL: computed('images.activeProfilePicture', function () {\n        var images = this.images;\n\n        if (images && images.activeProfilePicture && images.activeProfilePicture[0].ref) {\n            return images.activeProfilePicture[0].ref.x128;\n        } else {\n            return EntityImageComponent.placeholderImageForSize(this, 'x200');\n        }\n    }),\n\n    uploadedProfilePictures: computed('images.profilePictures', function () {\n        var field = this.getFieldValue('images.profilePictures');\n        if (field && field.length && field[0].value) {\n            return field;\n        }\n\n        return [];\n    }),\n\n    uploadedInformalPhotos: computed('images.gallery', function () {\n        var field = this.getFieldValue('images.gallery');\n        if (field && field.length && field[0].value) {\n            return field;\n        }\n\n        return [];\n    }),\n\n    groupVisibility: computed('privacy.groupVisibility', function () {\n        return this.getFieldValue('privacy.groupVisibility').value;\n    }),\n\n    membershipVisible: computed('privacy.membershipVisible', function () {\n        return this.getFieldValue('privacy.membershipVisible').value;\n    }),\n\n    includeOwners: computed('membership.includeOwners', function () {\n        var visible = this.getFieldValue('membership.includeOwners').value;\n        return this.intl.safestring(`entity.fieldTypes.boolean.checked-${visible}`).toString();\n    }),\n\n    areOwnersIncluded: computed('membership.includeOwners', function () {\n        return this.getFieldValue('membership.includeOwners').value;\n    }),\n\n    groupEmailAddress: computed('general.exchangeNameOverride', {\n        get() {\n            return this.getFieldValue('general.exchangeNameOverride').value;\n        },\n        set(key, value) {\n            if (value === undefined) {\n                value = '';\n            }\n            return this.set('general.exchangeNameOverride', value)[0].value;\n        }\n    }),\n\n    needsCommit: computed('general.needsCommit', function () {\n        return this.getFieldValue('general.needsCommit').value;\n    }),\n\n    membershipSearchQuery: computed('membership.compiledQuery.[]', function () {\n        var compiledQuery = this.getFieldValue('membership.compiledQuery');\n        var query = get(compiledQuery, 'value.q');\n        if (query && query.length) {\n            return query[0].value;\n        }\n\n        return '';\n    }),\n\n    generalSearchQuery: computed('id', 'general.groupType', function () {\n        var groupType = this.getFieldValue('general.groupType').value;\n        return `${groupType}:${this.guid}`;\n    }),\n\n    isActive: computed('state', function () {\n        return this.state === 'active';\n    }),\n\n    isDeleted: computed('state', function () {\n        return this.state === 'deleted';\n    }),\n\n    jid: computed('_id', function () {\n        const id = this._id;\n        var org = this.get('application.session.org');\n        var name = get(org, 'general.shortName')[0].value;\n        return `${id}@conference.${name}.orgspan.com`;\n    }),\n\n    readWritePermissions: computed(function () {\n        return DS.PromiseArray.create({\n            promise: resolve()\n        });\n    }),\n\n    // -- Handles Grants and Roles Associated with the Group --\n\n    allowPermissionGroup: computed('general.allowPermissionGroup', {\n        get() {\n            return this.getFieldValue('general.allowPermissionGroup').value;\n        },\n        set(key, value) {\n            return this.set('general.allowPermissionGroup', value)[0].value;\n        }\n    }),\n\n    uniqueRoleCount: 0,\n    grantVersion: -1,\n\n    getGrants() {\n        return new Promise(resolve => {\n            const path = `api/v2/authorization/subjects/${this.guid}`;\n            const url = this.application.pcV2Uri(path);\n            this.ajax.ajaxGet(url).then(data => {\n                let rolesMap = {};\n                let uniqueRoleCount = 0;\n                data.grants.forEach(grant => {\n                    if (!rolesMap[grant.role.id]) {\n                        rolesMap[grant.role.id] = true;\n                        uniqueRoleCount++;\n                    }\n                });\n                this.set('uniqueRoleCount', uniqueRoleCount);\n                this.set('grantVersion', data.version);\n                resolve(data.grants);\n            });\n        });\n    },\n\n    // --\n\n    number: computed('contactInfo.groupNumber.@each.value', 'contactInfo.groupNumber.@each.rel', function () {\n        return this.getFieldValue('contactInfo.groupNumber');\n    }),\n\n    membershipChange: observer('membership.inclusions.[]', 'membership.exclusions.[]', function () {\n        var membership = this.membership;\n        this.set('membershipDraft', membership);\n    }),\n\n    isPersonOwner(person) {\n        if (!person) {\n            return false;\n        }\n\n        let owner = this.getFieldValue('owners.owners').findBy('value', person.get('id'));\n        let guidOwner = this.getFieldValue('owners.owners').findBy('guid', person.get('id'));\n        return !_.isEmpty(owner) || !_.isEmpty(guidOwner);\n    },\n\n    isPersonIndividual(person) {\n        if (!person) {\n            return false;\n        }\n\n        var individual = this.getFieldValue('individuals.individuals').findBy('value', person.get('id'));\n        var guidIndividual = this.getFieldValue('individuals.individuals').findBy('guid', person.get('id'));\n        return !_.isEmpty(individual) || !_.isEmpty(guidIndividual);\n    },\n\n    getReadableSections() {\n        return this.fieldConfig.get('sections').mapBy('key');\n    },\n\n    getWriteableSections() {\n        var currentPerson = this.get('application.session.person');\n        var ownerIds = this.get('owners.owners').mapBy('value');\n        var sections = this.fieldConfig.get('sections').mapBy('key');\n\n        if (currentPerson && currentPerson.get('isAdmin')) {\n            return sections;\n        }\n\n        if (currentPerson && ownerIds.indexOf(currentPerson.get('id')) !== -1) {\n            return sections;\n        }\n\n        return [];\n    },\n\n    getReadableFieldsForSection(section) {\n        return section.get('fieldList').mapBy('key');\n    },\n\n    setProfilePicture(image) {\n        var profileImageSection = this.get('images.activeProfilePicture');\n\n        if (profileImageSection === undefined) {\n            this.set('images.activeProfilePicture', {});\n            profileImageSection = this.get('images.activeProfilePicture');\n        }\n\n        if (profileImageSection && profileImageSection.length) {\n            var profileImage = profileImageSection[0];\n\n            set(profileImage, 'ref', image.value);\n            set(profileImage, 'value.fieldId', image._id);\n            set(profileImage, 'value.fieldPath', 'images.profilePictures');\n\n            this.notifyPropertyChange('profilePicture');\n        }\n    },\n\n    deleteGrant(grant) {\n        const path = `api/v2/authorization/subjects/${this.id}/scopes/${grant.get('scope.id')}/roles/${grant.get(\n            'role.id'\n        )}`;\n        const url = this.application.pcV2Uri(path);\n        return this.ajax.del(url);\n    },\n\n    parseExpression(input) {\n        let output = [];\n\n        if (!input || input.length === 0) {\n            //no need to parse an empty array\n            return output;\n        }\n\n        // childConditions are all nested, so we gotta recurse\n        const addRule = function (condition, rule) {\n            let newSkill =\n                rule.routingSkillConditions.length === 0\n                    ? {\n                          name: rule.languageSkillConditions[0].languageSkill,\n                          type: 'language'\n                      }\n                    : {\n                          name: rule.routingSkillConditions[0].routingSkill,\n                          type: 'routing'\n                      };\n            let skill =\n                rule.routingSkillConditions.length === 0\n                    ? rule.languageSkillConditions[0]\n                    : rule.routingSkillConditions[0];\n            let children = skill.childConditions;\n            let op = rule.operation ? rule.operation.toUpperCase() : null;\n            if (\n                children &&\n                (!_.isEmpty(children.routingSkillConditions) || !_.isEmpty(children.languageSkillConditions))\n            ) {\n                op = children.operation.toUpperCase();\n            }\n\n            condition.rules.pushObject({\n                comparator: COMPARATORS[skill.comparator],\n                proficiency: PROFICIENCIES[skill.proficiency],\n                operation: op,\n                opAnd: op == 'AND' ? true : false,\n                skill: newSkill\n            });\n\n            if (\n                children &&\n                (!_.isEmpty(children.routingSkillConditions) || !_.isEmpty(children.languageSkillConditions))\n            ) {\n                addRule(condition, children);\n            }\n        };\n\n        // so here we'll go through each top-level condition and check recursively for children\n        input.forEach(condition => {\n            let conOp = condition.operation ? condition.operation.toUpperCase() : null;\n\n            let newCondition = {\n                rules: [],\n                lastCondition: false,\n                operation: conOp,\n                opAnd: conOp == 'AND' ? true : false\n            };\n\n            addRule(newCondition, condition);\n\n            newCondition.rules.set('lastObject.lastRule', true);\n            newCondition.rules.set('lastObject.operation', 'OR');\n            newCondition.rules.set('lastObject.opAnd', false);\n            output.pushObject(newCondition);\n        });\n        output.set('lastObject.lastCondition', true);\n        output.set('lastObject.operation', 'OR');\n        output.set('lastObject.opAnd', false);\n        return output;\n    }\n});\n\nGroupModel.reopenClass({\n    apiEndpoint: 'v2/groups'\n});\n\nexport default GroupModel;\n","import { bool, readOnly } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport Evented from '@ember/object/evented';\nimport { get, computed } from '@ember/object';\nimport Interaction from 'web-directory/models/interaction/interaction';\nimport _ from 'lodash';\nimport { isScreenMonitoringParticipant } from 'web-directory/utils/acd';\nimport SessionShareMixin from 'web-directory/mixins/acd/session-share';\n\nexport default Interaction.extend(SessionShareMixin, Evented, {\n    type: 'call',\n    conversation: null,\n\n    acdcallback: service(),\n    session: service(),\n\n    // consult transfer\n\n    onConsult: computed(\n        'conversation.connectedOnConsult.[]',\n        'conversation.connectedOnConsult.@each.consultParticipantId',\n        function () {\n            const connectedOnConsultArr = this.get('conversation.connectedOnConsult') || [];\n            return connectedOnConsultArr.some(p => p.consultParticipantId);\n        }\n    ),\n\n    iAmConsultInitiator: computed('consultInitiator.userId', 'onConsult', 'session.person.guid', function () {\n        return this.onConsult && this.get('consultInitiator.userId') === this.get('session.person.guid');\n    }),\n\n    iAmConsulted: computed('consultAgentParticipant.userId', 'onConsult', 'session.person.guid', function () {\n        return this.onConsult && this.get('consultAgentParticipant.userId') === this.get('session.person.guid');\n    }),\n\n    iAmConsultObject: computed('consultParticipant.userId', 'onConsult', 'session.person.guid', function () {\n        return this.onConsult && this.get('consultParticipant.userId') === this.get('session.person.guid');\n    }),\n\n    consultInitiator: computed('participants.[]', 'participantForCurrentUser', function () {\n        const currParticipant = this.participantForCurrentUser;\n        const disconnectType = get(currParticipant, 'calls.firstObject.disconnectType');\n\n        if (\n            !!currParticipant &&\n            !!currParticipant.attributes &&\n            !!currParticipant.attributes.consultInitiator &&\n            !disconnectType\n        ) {\n            return currParticipant;\n        }\n\n        const participants = this.participants || [];\n        return participants.find(participant => {\n            const disconnectType = get(participant, 'calls.firstObject.disconnectType');\n\n            if (\n                !!participant &&\n                !!participant.attributes &&\n                !!participant.attributes.consultInitiator &&\n                !disconnectType\n            ) {\n                return participant;\n            }\n        });\n    }),\n\n    consultParticipant: computed('participants.[]', function () {\n        const participant = _.find(this.participants, function (participant) {\n            if (participant.consultParticipantId) {\n                return (\n                    participant.id === participant.consultParticipantId &&\n                    participant.calls &&\n                    participant.calls[0].disconnectType === undefined\n                );\n            }\n            return false;\n        });\n        return participant;\n    }),\n\n    isThereAConsultAgentParticipant: bool('consultAgentParticipant'),\n\n    consultAgentParticipant: computed(\n        'onConsult',\n        'participants.[]',\n        'participants.@each.consultParticipantId',\n        function () {\n            if (this.onConsult) {\n                const participant = _.findLast(this.participants, function (participant) {\n                    const attributes = participant.attributes;\n                    if (\n                        _.isEqual('true', attributes.consultInitiator) ||\n                        participant.id === participant.consultParticipantId ||\n                        participant.monitoredParticipantId !== undefined ||\n                        participant.coachedParticipantId !== undefined ||\n                        participant.bargedParticipantId !== undefined ||\n                        isScreenMonitoringParticipant(participant) ||\n                        (participant.calls && participant.calls[0].disconnectType !== undefined)\n                    ) {\n                        return false;\n                    }\n                    return true;\n                });\n                return participant;\n            }\n            return false;\n        }\n    ),\n\n    /**\n     * `true` if the consulting agent has been confined by the initiating agent in a consult. Confinement\n     * takes precedent over hold in the UI.\n     */\n    isConsultAgentParticipantConfined: readOnly('consultAgentParticipant.calls.firstObject.confined'),\n\n    /**\n     * `true` if the consulting agent has placed themselves on hold.\n     */\n    isConsultAgentParticipantHeld: readOnly('consultAgentParticipant.calls.firstObject.held'),\n\n    /**\n     * `true` if the consulting agent has muted themselves on the call\n     */\n    isConsultAgentParticipantMuted: bool('consultAgentParticipant.calls.firstObject.muted'),\n\n    /**\n     * @deprecated confinement and holding are being separated so we should use the `isConsultAgentParticipantConfined` and `isConsultAgentParticipantHeld` instead based on the exact use case.\n     */\n    isConsultAgentParticipantHolding: computed(\n        'consultAgentParticipant.calls.firstObject.confined',\n        'consultAgentParticipant.calls.firstObject.held',\n        function () {\n            if (\n                this.get('consultAgentParticipant.calls.firstObject.confined') ||\n                this.get('consultAgentParticipant.calls.firstObject.held')\n            ) {\n                return true;\n            }\n            return false;\n        }\n    ),\n\n    /**\n     * `true` if the initiating agent has confined the consulting participant. Do to customers not\n     * using the UI, we only track their hold state based on if they have been confined or not by\n     * the initiating agent.\n     */\n    isConsultParticipantHolding: bool('consultParticipant.calls.firstObject.confined'),\n\n    /**\n     * `true` if the consulting participant has muted themselves are we are able to detect that.\n     * We are not always able to reliably tell if a user has muted themselves or not.\n     */\n    isConsultParticipantMuted: bool('consultParticipant.calls.firstObject.muted'),\n\n    /**\n     * `true` if the consult initaor has muted themselves\n     */\n    isConsultInitiatorMuted: bool('consultInitiator.calls.firstObject.muted'),\n\n    /**\n     * `true` if the intiating agent has been confined\n     */\n    isConsultInitiatorHolding: bool('consultInitiator.calls.firstObject.confined'),\n\n    // TODO (ACE-4539): keeping this for now b/c we need to discuss scenarios where we might not want to display the \"Secure Pause\" button\n    canTogglePause: true,\n\n    formattedCustomerPhoneNumber: computed(\n        'participantForCustomer.address',\n        '{isCall,isCallback,currentCallback}',\n        function () {\n            const addressformat = this.addressformat;\n            const format = property => addressformat.formatAddressForDisplay(this.get(property));\n            if (this.isCallback) {\n                return format('currentCallback.callbackNumbers.firstObject');\n            }\n            if (this.isCall) {\n                if (this.get('participantForCustomer.address')) {\n                    return format('participantForCustomer.address');\n                }\n                if (this.get('participantForCustomer.calls.firstObject.self.addressNormalized')) {\n                    return format('participantForCustomer.calls.firstObject.self.addressNormalized');\n                }\n                if (this._isOutbound()) {\n                    return format('participantForCurrentUser.calls.firstObject.other.addressNormalized');\n                }\n                return null;\n            }\n            return null;\n        }\n    ),\n\n    _isOutbound: function () {\n        const direction = this.get('participantForCurrentUser.calls.firstObject.direction') || '';\n        return this.get('customerParticipants.length') === 0 && direction.toUpperCase() === 'OUTBOUND';\n    },\n\n    needsCallWrapUp: computed('acdcallback.callbacksRequiringCallWrapUp.[]', function () {\n        return this.acdcallback.needsCallWrapUp(this);\n    })\n});\n","import { reads, not, bool } from '@ember/object/computed';\nimport { observer, computed, get } from '@ember/object';\nimport _ from 'lodash';\nimport moment from '../../utils/dates';\nimport CallInteraction from 'web-directory/models/interaction/call-interaction';\nimport participantStatus from 'web-directory/utils/acdParticipantStatuses';\n\nfunction _distinguishPhoneType(phoneColumns) {\n    if (phoneColumns.length > 1) {\n        _.forEach(phoneColumns, phoneColumn => {\n            phoneColumn.displayType = this.intl.t('purecloud.acdInteraction.phoneNumberDisplayType', {\n                phoneType: phoneColumn.type,\n                columnName: phoneColumn.columnName\n            });\n        });\n    } else if (phoneColumns.length === 1) {\n        phoneColumns[0].displayType = phoneColumns[0].type;\n    }\n}\n\nfunction _createCallbackNumber(contactData, phoneColumn) {\n    return {\n        name: this.intl.t('purecloud.acdInteraction.phoneNumber', {\n            phoneNumber: contactData[phoneColumn.columnName],\n            phoneType: phoneColumn.displayType\n        }),\n        number: contactData[phoneColumn.columnName],\n        phoneColumn: phoneColumn.columnName\n    };\n}\n\nexport default CallInteraction.extend({\n    type: 'callback',\n    campaignId: null,\n    contact: null,\n    contactId: null,\n    skipEnabled: true,\n    callbackTimeoutTime: null,\n\n    currentCallback: reads('participantForCurrentUser.callbacks.firstObject'),\n    dialerPreview: reads('participantForCurrentUser.callbacks.firstObject.dialerPreview'),\n    skipDisabled: not('participantForCurrentUser.callbacks.firstObject.skipEnabled'),\n    timeoutSeconds: reads('participantForCurrentUser.callbacks.firstObject.timeoutSeconds'),\n    isCampaignCallback: bool('currentCallback.dialerPreview.campaignId'),\n    hasVoicemail: bool('participantForCurrentUser.callbacks.firstObject.voicemail'),\n    isNotCampaignCallback: not('isCampaignCallback'),\n    isExternalCampaign: bool('participantForCurrentUser.callbacks.firstObject.externalCampaign'),\n\n    /**\n     * An array of calls that the agent has already placed.\n     */\n    placedCalls: reads('participantForCurrentUser.calls'),\n\n    /**\n     * An array of phone numbers associated with the callback. If a dialer preview\n     * is present, the phone number type is include in the phone number name.\n     * {\n     *     name: 317-222-2222 (Work)\n     *     number: 317-222-2222\n     * }\n     */\n    callbackNumbers: computed(\n        'isCampaignCallback',\n        'agentAddedCallbackNumbers',\n        'currentCallback.callbackNumbers',\n        'dialerPreview.phoneNumberColumns',\n        'contact',\n        'placedCalls',\n        'placedBlockedCalls',\n        function () {\n            const contactData = this.get('contact.data');\n            const currentCallback = this.currentCallback;\n\n            let phoneNumbers = [];\n            let placedBlockedCalls = this.placedBlockedCalls;\n\n            if (contactData && this.get('dialerPreview.phoneNumberColumns.length') > 0) {\n                phoneNumbers = _.chain(this.get('dialerPreview.phoneNumberColumns'))\n                    .filter(phoneColumn => _.has(contactData, phoneColumn.columnName))\n                    // distinguish the phone columns by columnName if a type occurs more than once\n                    .groupBy('type')\n                    .values()\n                    .forEach(_distinguishPhoneType.bind(this))\n                    .flatten()\n                    .map(_createCallbackNumber.bind(this, contactData))\n                    .value();\n            } else if (currentCallback) {\n                phoneNumbers = _.map(currentCallback.callbackNumbers, number => {\n                    return {\n                        name: number,\n                        number: number\n                    };\n                });\n                let agentAddedCallbackNumbers = this.agentAddedCallbackNumbers || [];\n\n                //\n                // Please note when multipanel is ON the agentAddedCallbackNumbers is of the format:\n                //          {name: '555-555-5555', value: '555-555-5555'}\n                // Older V1 callback-add-number flows stored agentAddedCallbackNumbers as:\n                //          {name: '555-555-5555', number: '555-555-5555'}\n                //\n                // We then will tolerate both formats for now.\n\n                agentAddedCallbackNumbers = agentAddedCallbackNumbers\n                    .map(entry => {\n                        return {\n                            name: entry.name,\n                            number: entry.value || entry.number\n                        };\n                    })\n                    .filter(entry => {\n                        return !!entry.name && !!entry.number;\n                    });\n                phoneNumbers = phoneNumbers.concat(agentAddedCallbackNumbers);\n            }\n\n            let parseAddress = address => this.addressformat.formatAddress(address || '');\n\n            let dialedNumbers = [];\n\n            if (this.isCampaignCallback) {\n                dialedNumbers = _.flatten(\n                    _.map(this.placedCalls, call => [\n                        parseAddress(get(call, 'other.addressRaw')),\n                        parseAddress(get(call, 'other.addressNormalized'))\n                    ])\n                );\n            }\n\n            return _.filter(\n                phoneNumbers,\n                phoneNumber =>\n                    phoneNumber.number &&\n                    !_.includes(dialedNumbers, this.addressformat.formatAddress(phoneNumber.number)) &&\n                    !_.includes(placedBlockedCalls, phoneNumber.number)\n            );\n        }\n    ),\n\n    dialedNumbers: computed('placedCalls', 'placedCalls.[]', function () {\n        return _.map(this.placedCalls, call => {\n            const normalized = get(call, 'other.addressNormalized');\n            const raw = get(call, 'other.addressRaw');\n            const numberToFormat = normalized || raw;\n            if (numberToFormat) {\n                return this.addressformat.formatAddressForDisplay(numberToFormat);\n            } else {\n                return null;\n            }\n        });\n    }),\n\n    setCallbackTimeoutTime: observer(\n        'callbackNumbers.length',\n        'timeoutSeconds',\n        'participantForCurrentUser.connectedTime',\n        'participantForCurrentUser.wrapup.endTime',\n        function () {\n            const startTime =\n                this.get('participantForCurrentUser.wrapup.endTime') ||\n                this.get('participantForCurrentUser.connectedTime');\n            if (this.get('callbackNumbers.length') > 0 && this.timeoutSeconds > 0 && startTime) {\n                this.set('callbackTimeoutTime', moment(startTime).add(this.timeoutSeconds, 'seconds'));\n            } else {\n                this.set('callbackTimeoutTime', null);\n            }\n        }\n    ),\n\n    isCurrentUserInConversation: computed('participants.@each.{purpose,userId}', 'session.person.guid', function () {\n        return _.some(this.participants, participant => {\n            const purpose = participant.purpose;\n            const participantUserId = participant.userId;\n            const userId = this.get('session.person.guid');\n            return userId === participantUserId && (purpose === 'user' || purpose === 'agent');\n        });\n    }),\n\n    isAfterCallWorkCompleted: computed(\n        'participantForCurrentUser.wrapup',\n        'participantForCurrentUser.wrapupRequired',\n        'skipAfterCallWork',\n        'needsCallWrapUp',\n        function () {\n            if (this.needsCallWrapUp) {\n                return false;\n            } else if (!this.get('participantForCurrentUser.wrapupRequired')) {\n                return true;\n            } else if (this.get('participantForCurrentUser.wrapup') || this.skipAfterCallWork) {\n                return true;\n            }\n            return false;\n        }\n    ),\n\n    hasActiveCall: computed('participantForCurrentUser.calls.firstObject.state', function () {\n        const state = this.get('participantForCurrentUser.calls.firstObject.state');\n        if (_.isEmpty(state)) {\n            return false;\n        }\n        return (\n            state.toLowerCase() === participantStatus.CONNECTED.toLowerCase() ||\n            state.toLowerCase() === participantStatus.DIALING.toLowerCase() ||\n            state.toLowerCase() === participantStatus.CONTACTING.toLowerCase()\n        );\n    }),\n\n    hasActiveCallback: computed('participantForCurrentUser.callbacks.firstObject.state', function () {\n        const state = this.get('participantForCurrentUser.callbacks.firstObject.state');\n        if (_.isEmpty(state)) {\n            return false;\n        }\n        return (\n            state.toLowerCase() === participantStatus.CONNECTED.toLowerCase() ||\n            state.toLowerCase() === participantStatus.ALERTING.toLowerCase()\n        );\n    }),\n\n    init() {\n        this._super(...arguments);\n        this.setCallbackTimeoutTime();\n        this.set('placedBlockedCalls', []);\n        this.set('agentAddedCallbackNumbers', []);\n    }\n});\n","import { reads, equal } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { computed, observer } from '@ember/object';\nimport Evented from '@ember/object/evented';\nimport moment from 'web-directory/utils/dates';\nimport Interaction from 'web-directory/models/interaction/interaction';\nimport SessionShareMixin from 'web-directory/mixins/acd/session-share';\nimport { getEntityObjectId, compareJids } from 'web-directory/utils/jid-helpers';\n\nexport default Interaction.extend(SessionShareMixin, Evented, {\n    type: 'chat',\n    jid: null,\n    room: null,\n\n    interaction: service(),\n\n    provider: reads('participantForCurrentUser.chats.firstObject.provider'),\n    isInternalProvider: computed('provider', function () {\n        const provider = this.provider || '';\n        return provider.indexOf('PureCloud') > -1;\n    }),\n    isV2Provider: equal('provider', 'PureCloud Webchat v2'),\n\n    roomId: computed('participantForCurrentUser.chats.firstObject.roomId', function () {\n        return this.get('participantForCurrentUser.chats.firstObject.roomId');\n    }),\n\n    chatTimer: computed('lastMessageTime', function () {\n        let lastMessageTime = this.lastMessageTime;\n        let start;\n\n        if (moment(lastMessageTime).isBefore(moment(this.connectedTime))) {\n            lastMessageTime = null;\n        }\n\n        if (lastMessageTime && !moment(lastMessageTime).isBefore(this.connectedTime)) {\n            start = lastMessageTime;\n        } else {\n            start = this.connectedTime;\n        }\n\n        return start;\n    }),\n\n    animateChatNotifications: observer('lastMessageWasCustomer', function () {\n        // React to incoming customer chat messages\n        if (!this.get('interaction.isInteractionViewOpen') && this.lastMessageWasCustomer) {\n            this.interaction.animateAcdIcon();\n        }\n    }),\n\n    lastMessageText: computed('messages.lastObject', 'room.messages.lastObject', 'isChat', function () {\n        let message;\n        const last = this.get('room.messages.lastObject.messageBody');\n\n        if (last && !this.isV2Provider) {\n            message = last;\n        } else if (this.isV2Provider) {\n            message = this.get('messages.lastObject.body');\n        }\n\n        // TODO: Handle non-text types\n        if (message) {\n            return message.replace(/(<([^>]+)>)/gi, '');\n        }\n    }),\n\n    lastMessageWasCustomer: computed('messages.lastObject', 'room.messages.lastObject', 'isChat', function () {\n        const last = this.get('room.messages.lastObject');\n        if (last && !this.isV2Provider) {\n            const address = this.get('participantForCustomer.address');\n            const customerId = getEntityObjectId(address);\n            // test is relying on the fact that there is no chatUser to return false, so need to add this if starting Ember 2.6\n            if (last.get('chatUser')) {\n                const chatUserId = last.get('chatUser.id');\n                return compareJids(customerId, chatUserId);\n            }\n        } else if (this.isV2Provider) {\n            const customerId = this.get('participantForCustomer.chats.0.id');\n            const messageId = this.get('messages.lastObject.sender.id');\n            return customerId === messageId;\n        }\n        return false;\n    })\n});\n","import { reads, equal } from '@ember/object/computed';\nimport { computed } from '@ember/object';\nimport _ from 'lodash';\nimport Interaction from 'web-directory/models/interaction/interaction';\nimport participantStatus from 'web-directory/utils/acdParticipantStatuses';\n\nexport default Interaction.extend({\n    type: 'email',\n    draft: null,\n\n    // hack: property change notifications on this property are used to trigger the active email to refetch its messages\n    _shouldReloadMessages: null,\n\n    inlineAttachments: null,\n\n    currentEmail: computed('participantForCurrentUser.emails.[]', function () {\n        return _.head(this.get('participantForCurrentUser.emails'));\n    }),\n\n    provider: reads('participantForCurrentUser.emails.firstObject.provider'),\n    isInternalProvider: equal('provider', 'PureCloud Email'),\n\n    hasMessages: computed('messages.[]', function () {\n        const messages = this.messages;\n        if (messages && messages.length > 0) {\n            return true;\n        }\n        return false;\n    }),\n\n    /**\n     * The Email Send workflow participant on the conversation, if any.\n     *\n     * Filtering by email-communication state (rather than array order or `endTime`) is required\n     * because backend may produce multiple workflow participants across abort/retry cycles\n     * and within a single participant the email-communications array can carry\n     * past disconnected runs.\n     *\n     */\n    activeWorkflowParticipant: computed(\n        'session.features.PURE-7059_Architect-EmailFlows',\n        'participants.@each.{purpose,emails}',\n        function () {\n            if (!this.get('session.features.PURE-7059_Architect-EmailFlows')) return undefined;\n            const participants = this.get('participants') || [];\n            return participants.find(participant => {\n                if (participant.purpose !== 'workflow') return false;\n                const emails = participant.emails || [];\n                return emails.some(\n                    email => (email.state || '').toLowerCase() === participantStatus.CONNECTED.toLowerCase()\n                );\n            });\n        }\n    ),\n\n    /**\n     * `true` while an Email Send Flow is actively executing for this conversation. The agent's\n     * email-communication is in `transmitting` state AND a workflow participant exists with a\n     * connected email-communication. Both signals are required because the agent transitions\n     * through `transmitting` momentarily even for non-flow sends.\n     */\n    isFlowExecuting: computed('isTransmitting', 'activeWorkflowParticipant', function () {\n        return !!(this.get('isTransmitting') && this.get('activeWorkflowParticipant'));\n    }),\n\n    /**\n     * `true` when the most recent Email Send Flow execution aborted, returning the draft to the\n     * agent with an error. The agent's email-communication is back in `connected` state AND the\n     * communication carries an `errorInfo` with the flow-abort code.\n     *\n     */\n    flowFailed: computed(\n        'session.features.PURE-7059_Architect-EmailFlows',\n        'participantForCurrentUser.emails.firstObject.{state,errorInfo}',\n        function () {\n            if (!this.get('session.features.PURE-7059_Architect-EmailFlows')) return false;\n            const agentEmail = this.get('participantForCurrentUser.emails.firstObject');\n            if (!agentEmail) return false;\n            const state = (agentEmail.state || '').toLowerCase();\n            const errorInfo = agentEmail.errorInfo;\n            return (\n                state === participantStatus.CONNECTED.toLowerCase() && !!errorInfo && errorInfo.code === 'flow.abort'\n            );\n        }\n    ),\n\n    /**\n     * `true` when a send flow appears stuck: the agent is still `transmitting`, a `workflow`\n     * participant ran on the conversation, but none is currently connected (e.g. Automate disconnected\n     * the workflow without an abort, or the launch timed out with no response).\n     *\n     * Distinct from `isFlowExecuting` (which needs a connected workflow participant) and `flowFailed`\n     * (which needs the `flow.abort` code). Plain, non-flow sends have no workflow participant at all,\n     * so they never register as stuck — this keeps ordinary sends from flashing the flow controls.\n     */\n    flowStuck: computed(\n        'session.features.PURE-7059_Architect-EmailFlows',\n        'isTransmitting',\n        'activeWorkflowParticipant',\n        'participants.@each.purpose',\n        function () {\n            if (!this.get('session.features.PURE-7059_Architect-EmailFlows')) return false;\n            if (!this.get('isTransmitting')) return false;\n            if (this.get('activeWorkflowParticipant')) return false;\n            const participants = this.get('participants') || [];\n            return participants.some(participant => participant.purpose === 'workflow');\n        }\n    ),\n\n    init() {\n        this._super(...arguments);\n        this.set('messages', []);\n        this.set('inlineAttachments', []);\n    }\n});\n","import { or, readOnly, bool, equal, reads, and } from '@ember/object/computed';\nimport EmberObject, { computed, get } from '@ember/object';\nimport { cancel } from '@ember/runloop';\nimport { inject } from '@ember/service';\nimport { pluralize } from 'ember-inflector';\nimport { camelize } from 'web-directory/utils/string-transforms';\nimport each from 'lodash/each';\nimport ACWMixin from 'web-directory/mixins/acd/after-call-work';\nimport InteractionStateMixin from 'web-directory/mixins/acd/interaction-state';\nimport TimersMixin from 'web-directory/mixins/acd/interaction-timers';\nimport ParticipantMixin from 'web-directory/mixins/acd/participants';\nimport { getTrueCustomerIfMultipleCustomersExist } from 'web-directory/utils/acd';\nimport participantStatuses from 'web-directory/utils/acdParticipantStatuses';\nimport moment from 'web-directory/utils/dates';\n\nexport const MEDIA_TYPES = [\n    'chats',\n    'calls',\n    'callbacks',\n    'emails',\n    'screenshares',\n    'cobrowsesessions',\n    'videos',\n    'messages'\n];\n\nconst mixins = [ParticipantMixin, InteractionStateMixin, ACWMixin, TimersMixin];\n\nfunction isGuid(id) {\n    if (!id) {\n        return false;\n    }\n\n    return !!id.match(/^[a-z0-9-]{36}$/i);\n}\n\nexport default EmberObject.extend(...mixins, {\n    /*\n     * Things not created by the ember container typically cannot use injection.\n     * We've 'hacked' this to keep it working by setting the container locally\n     * on this object from the creating object. Ideally, our model objects would be\n     * more lightweight than this and service calls would be made from components or\n     * services that use this model.\n     *\n     * TL;DR this class is in need of some refactoring.\n     */\n    session: inject(),\n    intl: inject(),\n    addressformat: inject(),\n    interaction: inject(),\n    permissions: inject(),\n    agentAssistChecks: inject(),\n\n    logger: inject('stash-logger'),\n\n    externalContactId: or('participantForCustomer.externalContactId', 'participantForCustomer.externalContact.id'),\n\n    type: '',\n    notes: '',\n    participants: null,\n\n    _verifiedOnDisconnect: false,\n\n    callbackScheduled: false,\n    callbackDate: undefined,\n    callbackTime: null,\n    callbackTimeZone: null,\n    callbackPhone: null,\n    preferMyself: false,\n    agentOwned: false,\n    isInternalProvider: true,\n    timeCreated: null,\n    callbackQueue: null,\n\n    isHoldLoading: false,\n    isMuteLoading: false,\n    isConsultConfineLoading: false,\n    isConsultDisconnectLoading: false,\n    isConsultTransferLoading: false,\n    isConsultConferenceLoading: false,\n    isSecurePauseLoading: false,\n    isSnippetRecordLoading: false,\n    isMergeLoading: false,\n    isMergeComplete: false,\n\n    /**\n     * transient flag to track if the takeover notification has been displayed for the interaction in\n     * the users current session.\n     */\n    takeoverNotified: false,\n\n    /**\n     * @attribute\n     * The FT for the warm conferencing feature\n     */\n    acdWarmConferencePhase1FT: readOnly('session.features.PURE-7349_acdConferenceMS3-phase-1'),\n\n    /**\n     * The max amount of participants that can be added into a conference.\n     * This is currently the only concrete indicator that a conversation has been converted\n     * into a conference. This will only be provided if the conversation is, or has been, a conference.\n     */\n    conferenceMaxParticipants: readOnly('__interaction_metadata__.maxParticipants'),\n\n    /**\n     * `true` if the conversation was a conference at any point or if still is a conference.\n     * Todo: Update this when the backend provides additional information detailing conferencing\n     */\n    wasConference: bool('conferenceMaxParticipants'),\n\n    isChat: equal('type', 'chat'),\n    isCall: equal('type', 'call'),\n    isCallback: equal('type', 'callback'),\n    isEmail: equal('type', 'email'),\n    isRealtimeInteraction: or('isCall', 'isCallback', 'isChat'),\n    isSms: equal('type', 'message'),\n\n    startTimestamp: computed('participantForCurrentUser.connectedTime', 'timeCreated', function () {\n        const connectedTime = this.get('participantForCurrentUser.connectedTime');\n        const timeCreated = this.timeCreated;\n        if (connectedTime) {\n            return moment(connectedTime).valueOf();\n        } else if (timeCreated) {\n            return timeCreated.valueOf();\n        }\n        return moment().valueOf();\n    }),\n\n    communicationId: computed(\n        'customerParticipants.[]',\n        'participants.[]',\n        'type',\n        'consultParticipantId',\n        function () {\n            const PURPOSE = 'purpose';\n            const participants = this.customerParticipants;\n            const type = this.type;\n\n            if (participants) {\n                let participant = getTrueCustomerIfMultipleCustomersExist(this);\n\n                if (!participant) {\n                    const consultParticipantId =\n                        this.consultParticipantId || participants.mapBy('consultParticipantId').pop();\n\n                    if (this.isCall && participants.length > 1 && consultParticipantId) {\n                        participant = participants.findBy('id', consultParticipantId);\n                    } else {\n                        participant =\n                            participants.findBy(PURPOSE, 'customer') || participants.findBy(PURPOSE, 'external');\n                    }\n                }\n\n                if (participant) {\n                    try {\n                        const mediaName = camelize(pluralize(type));\n                        const communicationForMedia = participant[mediaName] || [];\n                        const communication = communicationForMedia[0];\n                        return communication ? communication.id : null;\n                    } catch (e) {\n                        return null;\n                    }\n                }\n            }\n            return null;\n        }\n    ),\n\n    connectedCommunication: computed(\n        'type',\n        'participantForCurrentUser.{calls,chats,emails,messages,callbacks}',\n        function () {\n            let mediaChannels = null;\n            switch (this.type) {\n                case 'call':\n                    mediaChannels = this.get('participantForCurrentUser.calls');\n                    break;\n                case 'chat':\n                    mediaChannels = this.get('participantForCurrentUser.chats');\n                    break;\n                case 'email':\n                    mediaChannels = this.get('participantForCurrentUser.emails');\n                    break;\n                case 'message':\n                    mediaChannels = this.get('participantForCurrentUser.messages');\n                    break;\n                case 'callback':\n                    mediaChannels =\n                        this.get('participantForCurrentUser.callbacks') || this.get('participantForCurrentUser.calls');\n                    break;\n                default:\n                    mediaChannels = [];\n            }\n            const connectedMedia = mediaChannels.find(entry => {\n                return entry.state === 'connected';\n            });\n\n            return connectedMedia;\n        }\n    ),\n\n    agentCommunicationId: reads('connectedCommunication.id'),\n\n    /**\n     * Returns a boolean value based on if the selected interaction is an active conference.\n     * An active conference is if there are 3 or more connected or connecting participants on a conversation.\n     * If a participant has not yet connected, then this is still considered an active conference as far as the\n     * UI is concerned. We can detect if the conversation was morphed into a conference based on `maxParticipants`\n     * but that doesn't indicate if it's considered an active one (i.e. showing the conference indicator).\n     */\n    isActiveConference: computed(\n        'allConferenceParticipants.[]',\n        'participantForCurrentUser.consultParticipantId',\n        function () {\n            if (\n                this.onConsult ||\n                // Todo: replace this check with a more explicit check detailing what is a conference\n                !this.conferenceMaxParticipants\n            ) {\n                return false;\n            }\n\n            // Note that `allConferenceParticipants` actually includes participants that are still connecting\n            const participants = this.allConferenceParticipants || [];\n            return participants.length >= 2 && !!this.conferenceMaxParticipants;\n        }\n    ),\n\n    isAgentAssistACWEnabled: computed(\n        'session.features',\n        'agentAssistChecks.assistantState',\n        'permissions.canViewSummary',\n        'type',\n        function () {\n            const supportedMediaTypes = ['message', 'call', 'callback'];\n            const isMediaTypeSupported = supportedMediaTypes.includes(this.type);\n            const assistantState = this.get('agentAssistChecks.assistantState') || new Map();\n            return assistantState.get(this.id) && isMediaTypeSupported && this.get('permissions.canViewSummary');\n        }\n    ),\n\n    associatedConversationId: and('acdWarmConferencePhase1FT', 'conversation.associatedConversation.id'),\n\n    isWarmInviteCall: computed(\n        'acdWarmConferencePhase1FT',\n        'associatedConversationId',\n        'conversation.id',\n        'isCall',\n        'isDisconnected',\n        function () {\n            if (!this.acdWarmConferencePhase1FT) return false;\n            return (\n                this.associatedConversationId &&\n                this.associatedConversationId !== this.get('conversation.id') &&\n                this.isCall &&\n                !this.isDisconnected\n            );\n        }\n    ),\n\n    myselfIsMonitor: bool('conversation.myselfIsMonitor'),\n    myselfIsCoach: bool('conversation.myselfIsCoach'),\n    myselfIsBarged: bool('conversation.myselfIsBarged'),\n    myselfIsMCB: or('conversation.myselfIsMonitor', 'conversation.myselfIsCoach', 'conversation.myselfIsBarged'),\n    monitoredParticipant: readOnly('conversation.monitoredParticipant'),\n    coachedParticipant: readOnly('conversation.coachedParticipant'),\n    bargedParticipant: readOnly('conversation.bargedParticipant'),\n    monitoredParticipantPerson: readOnly('conversation.monitoredParticipantPerson'),\n    coachedParticipantPerson: readOnly('conversation.coachedParticipantPerson'),\n    bargedParticipantPerson: readOnly('conversation.bargedParticipantPerson'),\n\n    /**\n     * `true` if any participant in the conversation is monitoring, coaching, or barging into this conversation.\n     */\n    isMCB: computed(\n        'acdWarmConferencePhase1FT',\n        'participants.[]',\n        'participants.@each.{endTime,monitoredParticipantId,coachedParticipantId,bargedParticipantId}',\n        function () {\n            if (!this.acdWarmConferencePhase1FT) return false;\n            const participants = this.participants;\n            return participants.some(\n                participant =>\n                    (participant.monitoredParticipantId && !participant.endTime) ||\n                    (participant.bargedParticipantId && !participant.endTime) ||\n                    (participant.coachedParticipantId && !participant.endTime)\n            );\n        }\n    ),\n\n    /**\n     * `true` if any participant in the conversation is in a group ring.\n     *  Note: This is currently not supported in ACD, but is added as a safe-check for PURE-7349.\n     */\n    isGroupRing: computed(\n        'acdWarmConferencePhase1FT',\n        'participants.[]',\n        'participants.@each.{groupId,group}',\n        function () {\n            if (!this.acdWarmConferencePhase1FT) return false;\n            const participants = this.participants;\n            return participants.some(participant => participant.groupId || (participant.group && participant.group.id));\n        }\n    ),\n\n    /**\n     * `true` if the current user is monitoring an agent - digital only at this point\n     */\n    myselfIsMonitorV2: and('participantForCurrentUser.monitoredParticipantId', 'isSms'),\n    /**\n     * Returns the most recent transfer object from the `recentTransfers` array on the interaction object.\n     * The `recentTransfers` object is created in descending order from when it was created so the most recent\n     * is the last in the list.\n     */\n    mostRecentTransfer: readOnly('recentTransfers.lastObject'),\n\n    /**\n     * This will return the currently active attended transfer is one is available. If none is returned then the conversation\n     * is not being actively transferred. If one is found, then this conversation is currently an attended transfer.\n     *\n     * Note: all conversations transferred from the queue are \"technically\" attended. However we only want the attended transfers\n     * from agent-to-agent thus we look for a `userId` on the initiator object to make sure we are not referencing a queue transfer.\n     */\n    activeAttendedTransfer: computed('mostRecentTransfer.{transferType,state,initiator}', function () {\n        const mostRecentTransfer = this.mostRecentTransfer || {};\n        if (mostRecentTransfer) {\n            const type = (mostRecentTransfer.transferType || '').toLowerCase();\n            const state = (mostRecentTransfer.state || '').toLowerCase();\n            const initiator = !!mostRecentTransfer.initiator ? mostRecentTransfer.initiator.userId : null;\n\n            if (initiator && type === 'attended' && state === 'active') {\n                return mostRecentTransfer;\n            }\n        }\n\n        return null;\n    }),\n\n    /**\n     * Returns `true` if the most recent transfer was canceled by the other agent being transferred to or\n     * by the agent who initiated the transfer.\n     *\n     * Todo: update with logic to differentiate between when the initial agent cancels vs the other agent\n     * declining the invite. Currently there is no way to tell the difference without comparing against user\n     * UI action which seems too hacky/over engineering.\n     */\n    wasTransferCanceled: computed('recentTransfers.[]', 'participantForCurrentUser', function () {\n        const participantForCurrentUser = this.participantForCurrentUser;\n        const recentTransfer = this.get('recentTransfers.lastObject');\n        return (\n            recentTransfer.transferType === 'attended' &&\n            recentTransfer.state === 'canceled' &&\n            recentTransfer.initiator.userId === participantForCurrentUser.userId\n        );\n    }),\n\n    /**\n     * Returns `true` if the most recent transfer was canceled by the other agent being transferred to or\n     * by the agent who initiated the transfer.\n     *\n     * Todo: update with logic to differentiate between when the initial agent cancels vs the other agent\n     * declining the invite. Currently there is no way to tell the difference without comparing against user\n     * UI action which seems too hacky/over engineering.\n     */\n    wasTransferCompleted: computed('recentTransfers.[]', 'participantForCurrentUser', function () {\n        const participantForCurrentUser = this.participantForCurrentUser;\n        const recentTransfer = this.get('recentTransfers.lastObject');\n        if (!recentTransfer) return false;\n\n        return (\n            recentTransfer.transferType === 'attended' &&\n            recentTransfer.state === 'complete' &&\n            recentTransfer.initiator.userId === participantForCurrentUser.userId\n        );\n    }),\n\n    /**\n     * Returns `true` if the most recent transfer was completed by the other agent being transferred to or\n     */\n    wasTransferredTo: computed('recentTransfers.[]', 'participantForCurrentUser', function () {\n        const participantForCurrentUser = this.participantForCurrentUser;\n        const recentTransfer = this.get('recentTransfers.lastObject');\n        if (!recentTransfer) return false;\n\n        return (\n            recentTransfer.transferType === 'attended' &&\n            recentTransfer.state === 'complete' &&\n            recentTransfer.destination.userId === participantForCurrentUser.userId\n        );\n    }),\n\n    /**\n     * `true` if the interaction is currently being transferred to another participant.\n     * Will return `false` if the interaction has been answered by another participant or\n     * if the current user has not initiated a transfer.\n     */\n    isAttendedTransferring: computed(\n        'type',\n        'activeAttendedTransfer',\n        'transferringToParticipant.{calls,chats,emails,messages,callbacks}.firstObject.{state}',\n        'participantForCurrentUser.{calls,chats,emails,messages,callbacks}.firstObject.{state}',\n        function () {\n            // if there is an active attended transfer then this conversation is being transferred\n            const isActiveAttendedTransfer = !!this.activeAttendedTransfer;\n            const currentUserParticipant = this.participantForCurrentUser;\n            if (currentUserParticipant && isActiveAttendedTransfer) {\n                const type = this.type;\n                const currentParticipantState = this.communicationState(currentUserParticipant, type);\n                return (\n                    currentParticipantState !== participantStatuses.DISCONNECTED.toLowerCase() &&\n                    currentParticipantState !== participantStatuses.TERMINATED.toLowerCase()\n                );\n            }\n            return false;\n        }\n    ),\n\n    customerDetails: computed(\n        'participantForCurrentUser',\n        'participantForCustomer',\n        'participantForCustomer.name',\n        'isEmail',\n        'draft',\n        'messages.[]',\n        'draft.to',\n        'draft.to.@each.email',\n        function () {\n            let details = {};\n            const customer = this.participantForCustomer;\n            const NO_NAME_LOCALE_KEY = `purecloud.acdInteraction.noName`;\n            let noName;\n\n            if (customer && customer.name) {\n                details.name = customer.name;\n            } else if (this.formattedCustomerPhoneNumber) {\n                details.name = this.formattedCustomerPhoneNumber;\n            } else {\n                noName = true;\n                details.name = this.intl.safestring(NO_NAME_LOCALE_KEY);\n            }\n\n            if (customer && customer.attributes) {\n                each(customer.attributes, function (value, property) {\n                    let parts = property.split('.');\n                    property = parts[parts.length - 1];\n                    details[property] = value;\n                });\n            }\n\n            if (this.isEmail && noName) {\n                const fromEmail = this.get('messages.firstObject.from.email');\n                const fromName = this.get('messages.firstObject.from.name');\n                const from = fromName || fromEmail;\n\n                if (from) {\n                    // Outbound emails can use the first\n                    // to address in the first message\n                    details.name = from;\n                } else {\n                    const messageTo = this.get('messages.firstObject.to.firstObject.email');\n                    const draftTo = this.get('draft.to.firstObject.email');\n                    details.name = draftTo || messageTo;\n                }\n            } else if (this.isSms && noName) {\n                // this is true for web messaging as well as SMS\n                const toAddress = this.get(\n                    'participantForCurrentUser.messages.firstObject.toAddress.addressNormalized'\n                );\n                const fromAddress = this.get(\n                    'participantForCustomer.messages.firstObject.fromAddress.addressNormalized'\n                );\n                details.isSmsDefault = true;\n                if (!isGuid(fromAddress)) {\n                    details.name = this.addressformat.formatAddressForDisplay(fromAddress);\n                } else if (!isGuid(toAddress)) {\n                    details.name = this.addressformat.formatAddressForDisplay(toAddress);\n                } else {\n                    details.name = this.intl.safestring(NO_NAME_LOCALE_KEY);\n                }\n            }\n\n            return details;\n        }\n    ),\n\n    isInteractionActive: computed(\n        'isAfterCallWorkCompleted',\n        'isDisconnected',\n        'isTerminated',\n        'participantsForCurrentUser.[]',\n        'isActive',\n        function () {\n            let isCallStillActive = () => {\n                const isCompleted = this.isAfterCallWorkCompleted && (this.isDisconnected || this.isTerminated);\n                return !isCompleted;\n            };\n            const type = this.type;\n            let result = false;\n            if (type === 'call') {\n                result = isCallStillActive();\n            } else {\n                result = this.isActive;\n            }\n            this.logger.debug(\n                `ACD: isInteractionActive id: ${this.id} isActive: ${result}. Update will be ignored if isActive is false.`\n            );\n            return result;\n        }\n    ),\n\n    isActive: computed(\n        'participantForCurrentUser',\n        'isDisconnected',\n        'isParked',\n        'isTerminated',\n        'isAfterCallWorkCompleted',\n        function () {\n            if (!this.participantForCurrentUser || this.isParked) {\n                return false;\n            }\n            const isActive = !(this.isDisconnected || this.isTerminated) || !this.isAfterCallWorkCompleted;\n            return isActive;\n        }\n    ),\n\n    active: reads('isActive'),\n\n    modelSet(property, value) {\n        if (!this.isDestroyed && !this.isDestroying) {\n            this.set(property, value);\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n        this.set('timeCreated', moment());\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n\n        this.cleanup();\n    },\n\n    cleanup() {\n        if (this.isPlacingCallTimer) {\n            cancel(this.isPlacingCallTimer);\n        }\n    },\n\n    /**\n     * Returns whatever the communication state of the given participant is in context of a conversation.\n     *\n     * @param {Participant} participant the participant object to check against\n     * @param {CommunicationType} type the type of communication media that is being displayed\n     * @returns the current state of the latest media item of the participant or null if not determined\n     */\n    communicationState(participant, type) {\n        const state = get(participant, `${type}s.firstObject.state`);\n        return state ? state : null;\n    }\n});\n","import { bool, map } from '@ember/object/computed';\nimport { computed, get, setProperties } from '@ember/object';\nimport { inject } from '@ember/service';\nimport Interaction from 'web-directory/models/interaction/interaction';\nimport { isScreenMonitoringParticipant } from 'web-directory/utils/acd';\nimport moment from 'web-directory/utils/dates';\n\nconst MESSENGER_TYPE = ['apple', 'facebook', 'twitter', 'webmessaging', 'whatsapp', 'instagram', 'open'];\n\nexport default Interaction.extend({\n    type: 'message',\n\n    acdsms: inject(),\n    session: inject(),\n\n    /**\n     * The time that this interaction will be automatically ended if it is inactive\n     *\n     * @example\n     * { \"inactivityTimeout\": \"yyyy-mm-ddThh:mm:ss.sssZ\" }\n     */\n    inactivityTimeout: null,\n\n    onConsult: computed(\n        'participants.[]',\n        'participants.@each.internalMessages',\n        'session.features.PURE-5007_digitalConsult',\n        function () {\n            if (!this.get('session.features.PURE-5007_digitalConsult')) return false;\n\n            const participants = this.participants || [];\n            return participants.some(participant => {\n                const [head] = get(participant, 'internalMessages') || [];\n                if (!head || !head.state) return false;\n                return head.state.toLowerCase() === 'connected';\n            });\n        }\n    ),\n\n    iAmConsulted: computed('consultAgentParticipant.userId', 'onConsult', 'session.person.guid', function () {\n        if (this.isDestroyed || this.isDestroying) return false;\n        return this.onConsult && this.get('consultAgentParticipant.userId') === this.get('session.person.guid');\n    }),\n\n    iAmConsultInitiator: computed(\n        'onConsult',\n        'session.person.guid',\n        'consultInitiator.userId',\n        'session.features.PURE-5007_digitalConsult',\n        function () {\n            if (!this.get('session.features.PURE-5007_digitalConsult')) return false;\n            return this.onConsult && this.get('consultInitiator.userId') === this.get('session.person.guid');\n        }\n    ),\n\n    consultInitiator: computed(\n        'participants.[]',\n        'participantForCurrentUser',\n        'participants.@each.internalMessages',\n        'session.features.PURE-5007_digitalConsult',\n        function () {\n            if (!this.get('session.features.PURE-5007_digitalConsult')) return null;\n\n            const participants = this.participants || [];\n            return participants.find(participant => {\n                const internalMessages = get(participant, 'internalMessages') || [];\n                // bypass any participant without internal messaging\n                if (!internalMessages.length) return false;\n\n                const [head] = internalMessages;\n                return head && head.state.toLowerCase() !== 'disconnected';\n            });\n        }\n    ),\n\n    consultAgentParticipant: computed(\n        'onConsult',\n        'participants.[]',\n        'participants.@each.internalMessages',\n        'session.features.PURE-5007_digitalConsult',\n        function () {\n            if (this.isDestroyed || this.isDestroying) return null;\n            if (!this.get('session.features.PURE-5007_digitalConsult') || !this.onConsult) return null;\n\n            const initiator = this.consultInitiator;\n\n            const participants = this.participants || [];\n            // break reference to initial array for mutable reverse\n            return [...participants].reverse().find(p => {\n                if (\n                    p.monitoredParticipantId !== undefined ||\n                    p.coachedParticipantId !== undefined ||\n                    p.bargedParticipantId !== undefined ||\n                    isScreenMonitoringParticipant(p) ||\n                    // the initiator cannot be the same as the consultant\n                    get(initiator, 'id') === p.id\n                ) {\n                    return false;\n                }\n\n                const [head] = get(p, 'internalMessages') || [];\n                return head && head.state.toLowerCase() !== 'disconnected';\n            });\n        }\n    ),\n\n    isInternalMessagingConnected: computed(\n        'onConsult',\n        'consultInitiator.internalMessages.firstObject.state',\n        'consultAgentParticipant.internalMessages.firstObject.state',\n        function () {\n            if (!this.onConsult) return false;\n\n            const consultInitiatorState = this.get('consultInitiator.internalMessages.firstObject.state');\n            const consultAgentParticipantState = this.get('consultAgentParticipant.internalMessages.firstObject.state');\n\n            if (!consultInitiatorState && !consultAgentParticipantState) return false;\n\n            return (\n                consultInitiatorState.toLowerCase() === 'connected' ||\n                consultAgentParticipantState.toLowerCase() === 'connected'\n            );\n        }\n    ),\n\n    /**\n     * For the context of messaging consults, the consult participant and the consult agent participant should\n     * be the same user. This is due to the messaging consult only allowing internal users as the consulting agent\n     *\n     * @todo expand this to support other user types if that ever becomes a use case.\n     */\n\n    isThereAConsultAgentParticipant: bool('consultAgentParticipant'),\n\n    getLatestMessage(messageArray) {\n        const messages = (messageArray || []).filter(m => !!m);\n        if (messages.length === 0) {\n            return null;\n        }\n\n        const msg = messages.reduce((a, b) => {\n            const timestampA = moment(a.messageTime || a.timestamp).valueOf();\n            const timestampB = moment(b.messageTime || b.timestamp).valueOf();\n            return timestampA >= timestampB ? a : b;\n        });\n\n        const id = msg.id || msg.messageId;\n        const messagesCurrentlyLoaded = this.acdsms.getInteractionMessages(this.id);\n        const messageDetails = messagesCurrentlyLoaded.find(message => message.id === id);\n        if (messageDetails) {\n            setProperties(msg, messageDetails);\n        }\n        return msg;\n    },\n\n    allowedInboundMedia: map('supportedContent.mediaTypes.allow.inbound.[]', function (item) {\n        item.type = /(?:(?!;).)*/.exec(item.type);\n        return item.type[0];\n    }),\n\n    allowedOutboundMedia: map('supportedContent.mediaTypes.allow.outbound.[]', function (item) {\n        item.type = /(?:(?!;).)*/.exec(item.type);\n        return item.type[0];\n    }),\n\n    /**\n     * The engagement source for the customer participant.\n     */\n    engagementSource: computed(\n        'participantForCustomer',\n        'participantForCustomer.messages.[]',\n        'participantForCustomer.messages.firstObject',\n        'participantForCustomer.messages.firstObject.engagementSource',\n        'session.features.PURE-5534_OpenMessagingEngagementSourceTagging',\n        'subMessageType',\n        function () {\n            if (this.get('session.features.PURE-5534_OpenMessagingEngagementSourceTagging')) {\n                if (\n                    this.get('participantForCustomer.messages') &&\n                    this.get('participantForCustomer.messages.firstObject') &&\n                    this.get('participantForCustomer.messages.firstObject.engagementSource')\n                ) {\n                    return this.get('participantForCustomer.messages.firstObject.engagementSource');\n                }\n            }\n            return null;\n        }\n    ),\n\n    lastCustomerMessage: computed(\n        'participantForCustomer.messages.[]',\n        'participantForCustomer.messages.@each.messages',\n        'id',\n        function () {\n            const messages = (this.get('participantForCustomer.messages') || []).reduce((value, element) => {\n                if (element.messages && element.messages.length) {\n                    value.push(...element.messages);\n                }\n                return value;\n            }, []);\n            return this.getLatestMessage(messages);\n        }\n    ),\n\n    lastAgentMessage: computed(\n        'participantForCurrentUser.messages.[]',\n        'participantForCurrentUser.messages.@each.messages',\n        'id',\n        function () {\n            const messages = (this.get('participantForCurrentUser.messages') || []).reduce((value, element) => {\n                if (element.messages && element.messages.length) {\n                    value.push(...element.messages);\n                }\n                return value;\n            }, []);\n            return this.getLatestMessage(messages);\n        }\n    ),\n\n    latestMessage: computed('lastCustomerMessage', 'lastAgentMessage', function () {\n        const latestMessage = this.getLatestMessage([this.lastCustomerMessage, this.lastAgentMessage]);\n        return latestMessage;\n    }),\n\n    latestMessageRegardlessOfParticipant: computed('participants', function () {\n        const messages = (this.participants || [])\n            .flatMap(participant => (participant ? participant.messages : []))\n            .flatMap(entry => (entry ? entry.messages : []))\n            .filter(entry => !!entry);\n\n        return this.getLatestMessage(messages);\n    }),\n\n    smsTimer: computed('lastMessageTime', 'connectedTime', function () {\n        let lastMessageTime = this.lastMessageTime;\n        let start;\n\n        if (moment(lastMessageTime).isBefore(moment(this.connectedTime))) {\n            lastMessageTime = null;\n        }\n\n        if (lastMessageTime && !moment(lastMessageTime).isBefore(this.connectedTime)) {\n            start = lastMessageTime;\n        } else {\n            start = this.connectedTime;\n        }\n\n        return start;\n    }),\n\n    subMessageType: computed(\n        'participantForCustomer.messages.firstObject.type',\n        'participantForCurrentUser.messages.firstObject.type',\n        function () {\n            return (\n                this.get('participantForCustomer.messages.firstObject.type') ||\n                this.get('participantForCurrentUser.messages.firstObject.type') ||\n                'sms'\n            );\n        }\n    ),\n\n    isThirdPartyMessenger: computed('subMessageType', function () {\n        return MESSENGER_TYPE.includes(this.subMessageType);\n    }),\n\n    lastMessageWasCustomer: computed('latestMessage.direction', function () {\n        const direction = this.get('latestMessage.direction');\n        return direction && direction.toLowerCase() === 'inbound' ? true : false;\n    }),\n\n    latestMessageRegardlessOfParticipantWasCustomer: computed(\n        'latestMessageRegardlessOfParticipant.direction',\n        function () {\n            const direction = this.get('latestMessageRegardlessOfParticipant.direction');\n            return direction && direction.toLowerCase() === 'inbound' ? true : false;\n        }\n    )\n});\n","import { getOwner } from '@ember/application';\nimport { computed } from '@ember/object';\nimport { copy } from '@ember/object/internals';\nimport { isPresent, typeOf } from '@ember/utils';\nimport _ from 'lodash';\nimport App, {\n    PC_ENV_URL_REPLACEMENT_TOKEN,\n    GC_HOST_ORIGIN_REPLACEMENT_TOKEN,\n    GC_TARGET_ENV_REPLACEMENT_TOKEN,\n    GC_LANG_TAG_URL_REPLACEMENT_TOKEN,\n    GC_USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN\n} from './app';\nimport appUtils from '../utils/apps';\nimport netUtils from '../utils/net';\n\n/**\n * An internally-built PureCloud Client App that is hosted on PureCloud's own infrastructure.\n *\n * The url will be dynamically generated based on the specified config:\n *\n * subdomain=apps: Optional. Subdomain to be prepended to the current purecloud domain.\n * envDetails: Required.  The environment details to build the PureCloud domain.\n * path: Required. The path to the app.  Leading slash will be prepended if omitted.\n * query=?gcHostOrigin={{gcHostOrigin}}&gcTargetEnv={{gcTargetEnv}}&gcLangTag={{gcLangTag}}&gcUsePopupAuth={{gcUsePopupAuth}}: Optional. The querystring for the app. Leading ? will be prepended if omitted.\n *\n * [SECURITY NOTE]: Because these apps will have the same purecloud env tld as the host PureCloud app,\n * they can elevate out of the iframe sandbox.  Because of this, this must always be internal code.\n * This is NOT a hosting option for external apps.\n */\nconst InternallyHostedApp = App.extend({\n    subdomain: null,\n    envDetails: null,\n    path: null,\n    query: null,\n    urlTemplate: computed('subdomain', 'envDetails', 'path', 'query', 'gcHostOrigin', 'gcTargetEnv', {\n        get() {\n            let result = null;\n\n            let subdomain = this.subdomain || netUtils.getPcApplicationsSubdomain();\n            let envDetails = this.envDetails;\n            let path = this.path;\n            let query = this.query;\n\n            if (typeOf(path) === 'string' && isPresent(path) && envDetails) {\n                result = `https://${subdomain}.${envDetails.runtime.currentDomainName}`;\n\n                path = path.trim();\n                if (path.charAt(0) !== '/') {\n                    result += '/';\n                }\n                result += path;\n\n                if (query && typeOf(query) === 'string') {\n                    query = query.trim();\n                    if (query.charAt(0) !== '?') {\n                        result += '?';\n                    }\n                    result += query;\n                } else {\n                    result += `?gcHostOrigin=${GC_HOST_ORIGIN_REPLACEMENT_TOKEN}&gcTargetEnv=${GC_TARGET_ENV_REPLACEMENT_TOKEN}&pcEnvironment=${PC_ENV_URL_REPLACEMENT_TOKEN}&pcLangTag=${GC_LANG_TAG_URL_REPLACEMENT_TOKEN}&pcUsePopupAuth=${GC_USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN}&gcLangTag=${GC_LANG_TAG_URL_REPLACEMENT_TOKEN}&gcUsePopupAuth=${GC_USE_POPUP_AUTH_URL_REPLACEMENT_TOKEN}`;\n                }\n            }\n\n            return result;\n        },\n        set() {\n            console.error(\n                appUtils.buildLogMsg('Set called on derrived urlTemplate property instead of path property.'),\n                {\n                    path: this.path,\n                    remoteData: {\n                        appId: this.id\n                    }\n                }\n            );\n\n            throw new Error('Cannot directly set urlTemplate. Use path property.');\n        }\n    }),\n\n    copy(deep) {\n        let owner = getOwner(this);\n        let ownerMixin = {};\n\n        if (owner) {\n            ownerMixin = owner.ownerInjection();\n        }\n\n        return InternallyHostedApp.create(ownerMixin, {\n            typeId: this.typeId,\n            id: this.id,\n            name: this.name,\n            subdomain: this.subdomain,\n            envDetails: copy(this.envDetails, deep),\n            path: this.path,\n            query: this.query,\n            langTag: this.langTag,\n            envTld: this.envTld,\n            usePopupAuth: this.usePopupAuth,\n            displayType: this.displayType,\n            featureCategory: this.featureCategory,\n            sandbox: deep ? copy(this.sandbox, true) : this.sandbox,\n            assets: copy(this.assets, deep),\n            lifecycle: copy(this.lifecycle, deep),\n            permissionsPolicy: deep ? copy(this.permissionsPolicy, true) : this.permissionsPolicy,\n            // interapption props\n            interactionId: this.interactionId,\n            interactionType: this.interactionType,\n            enabledQueueIds: deep ? _.cloneDeep(this.enabledQueueIds) : this.enabledQueueIds,\n            enabledCommunicationTypes: deep\n                ? _.cloneDeep(this.enabledCommunicationTypes)\n                : this.enabledCommunicationTypes,\n            enableWorkitem: this.enableWorkitem,\n            gcHostOrigin: this.gcHostOrigin,\n            gcTargetEnv: this.gcTargetEnv\n        });\n    }\n});\n\nexport default InternallyHostedApp;\n","import { resolve } from 'rsvp';\nimport { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nexport const BASE_LOCATION_FIELDS = ['name', 'address', 'images', 'contactPersonId', 'sublocationOrder'];\nexport const BASE_LOCATION = {\n    fl: BASE_LOCATION_FIELDS.join(',')\n};\n\nvar LocationModel = DS.Model.extend({\n    ajax: service(),\n    session: service(),\n\n    _id: DS.attr(),\n    name: DS.attr(),\n    address: DS.attr(),\n    imageHistory: DS.attr(),\n    contactPersonId: DS.attr(),\n    notes: DS.attr(),\n    sublocationOrder: DS.attr(),\n    images: DS.attr(),\n\n    profileImage: DS.attr(),\n\n    path: DS.attr(),\n    orgId: DS.attr(),\n\n    version: DS.attr(),\n\n    _entity: DS.attr(),\n\n    floors: DS.attr(),\n\n    init() {\n        this._super(...arguments);\n    },\n\n    profilePicture: computed('profileImage', 'parent.{images,isFulfilled}', 'images', function () {\n        let profileImages = this.profileImage;\n\n        if (!_.isEmpty(profileImages)) {\n            let imagex48 = profileImages.find(image => image.resolution === 'x48');\n            let imagex96 = profileImages.find(image => image.resolution === 'x96');\n            let imagex128 = profileImages.find(image => image.resolution === 'x128');\n            let imagex200 = profileImages.find(image => image.resolution === 'x200');\n\n            if (imagex48 && imagex96 && imagex128 && imagex200) {\n                return {\n                    x48: `${imagex48.imageUri}`,\n                    x96: `${imagex96.imageUri}`,\n                    x128: `${imagex128.imageUri}`,\n                    x200: `${imagex200.imageUri}`\n                };\n            }\n        } else if (this.images) {\n            let images = this.images;\n            return images;\n        }\n\n        return undefined;\n    }),\n\n    floorCount: computed('sublocationOrder', function () {\n        var subs = this.sublocationOrder;\n\n        if (_.isEmpty(subs)) {\n            return 0;\n        }\n\n        return subs.length;\n    }),\n\n    type: computed('path', function () {\n        var path = this.path;\n\n        if (path && Array.isArray(path) && path.length > 0) {\n            return 'floor';\n        }\n\n        return 'location';\n    }),\n\n    isFloor: computed('type', function () {\n        return this.type === 'floor';\n    }),\n\n    deleted: computed('state', function () {\n        return this.state === 'deleted';\n    }),\n\n    hasContactPerson: computed('contactPersonId', function () {\n        return this.contactPersonId !== null && this.contactPersonId !== undefined;\n    }),\n\n    contactPerson: computed('contactPersonId', function () {\n        var id = this.contactPersonId;\n        if (id) {\n            return this.store.find('person', id);\n        }\n    }),\n\n    _parent: null,\n    parent: computed('type', 'path', function () {\n        if (this.type === 'floor') {\n            let promise;\n            if (this._parent) {\n                promise = this._parent;\n            } else {\n                promise = this.store.findRecord('location', this.path[0]);\n                this.set('_parent', promise);\n            }\n            return DS.PromiseObject.create({\n                promise\n            });\n        }\n\n        return DS.PromiseObject.create({\n            promise: resolve(undefined)\n        });\n    }),\n\n    containsRichAddress: computed('address', function () {\n        let address = this.address;\n        return typeof address !== 'string';\n    }),\n\n    setFloor() {\n        return;\n    }\n});\n\nexport default LocationModel;\n","import DS from 'ember-data';\nimport Communication from './communication';\n\nexport default Communication.extend({\n    // ----------------------------------------------------------------------------\n    // Raw Properties\n    // ----------------------------------------------------------------------------\n\n    textBody: DS.attr(),\n    messages: DS.attr(),\n\n    update(comUpdate) {\n        this._super(...arguments);\n        const updatableAttrs = ['textBody', 'messages'];\n        const updateProperties = {};\n        for (const updatable of updatableAttrs) {\n            const updatedValue = comUpdate[updatable];\n            if (typeof updatedValue !== 'undefined') {\n                updateProperties[updatable] = updatedValue;\n            }\n        }\n\n        this.setProperties(updateProperties);\n    }\n});\n","import { reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { computed } from '@ember/object';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport EntityMixin from '../mixins/entity';\n\nexport default DS.Model.extend(EntityMixin, {\n    ajax: service(),\n    application: service(),\n\n    name: computed('general.name.@each.value', function () {\n        const name = this.getFieldValue('general.name');\n        if (name.value) {\n            return name.value;\n        }\n        return '';\n    }),\n\n    shortName: computed('general.shortName.@each.value', function () {\n        const shortName = this.getFieldValue('general.shortName');\n        if (shortName.value) {\n            return shortName.value;\n        }\n        return '';\n    }),\n\n    hasUnifiedCommunications: computed('enabledFeatures.unifiedCommunications.@each.value', function () {\n        const comms = this.getFieldValue('enabledFeatures.unifiedCommunications');\n        if (_.isEmpty(comms)) {\n            return false;\n        }\n        return comms.value;\n    }),\n\n    hasChatEnabled: computed('enabledFeatures.chat.@each.value', function () {\n        const chat = this.getFieldValue('enabledFeatures.chat');\n        return chat.value;\n    }),\n\n    hasHipaaEnabled: computed('enabledFeatures.hipaa.@each.value', function () {\n        const hipaa = this.getFieldValue('enabledFeatures.hipaa');\n        return hipaa.value;\n    }),\n\n    _orgDetails: computed('id', function () {\n        const path = 'api/v2/organizations/me';\n        const url = this.application.pcV2Uri(path);\n        const promise = this.ajax.request(url);\n        return DS.PromiseObject.create({ promise });\n    }),\n\n    orgDefaultCountryCode: computed(\n        'general.defaultCountryCode.@each.value',\n        '_orgDetails.content.defaultCountryCode',\n        function () {\n            const fieldValue = this.getFieldValue('general.defaultCountryCode');\n            const orgDetails = this.get('_orgDetails.content');\n\n            if (fieldValue && fieldValue.value) {\n                return fieldValue.value;\n            }\n\n            if (orgDetails && orgDetails.defaultCountryCode) {\n                return orgDetails.defaultCountryCode;\n            }\n\n            return null;\n        }\n    ),\n\n    _orgPreferences: computed('id', function () {\n        const path = 'api/v2/organizations/settings';\n        const url = this.application.pcV2Uri(path);\n        const promise = this.ajax.request(url);\n\n        return DS.PromiseObject.create({ promise });\n    }),\n\n    orgPreferences: reads('_orgPreferences.content')\n});\n","import EmberObject, { computed } from '@ember/object';\nimport DS from 'ember-data';\n\nconst communicationMappings = {\n    videos: 'video-communication',\n    screenshares: 'screenshare-communication',\n    calls: 'call-communication',\n    chats: 'chat-communication',\n    emails: 'email-communication',\n    callbacks: 'callback-communication',\n    messages: 'message-communication'\n};\n\nexport default DS.Model.extend({\n    // ----------------------------------------------------------------------------\n    // Raw Properties\n    // ----------------------------------------------------------------------------\n\n    conversation: DS.belongsTo('conversation', { async: false }),\n    startTime: DS.attr(),\n    connectedTime: DS.attr(),\n    userUri: DS.attr(),\n    userId: DS.attr(),\n    externalContactId: DS.attr(),\n    name: DS.attr(),\n    purpose: DS.attr(),\n    wrapupRequired: DS.attr(),\n    wrapup: DS.attr(),\n    attributes: DS.attr(),\n    screenRecordingState: DS.attr(),\n    ani: DS.attr(),\n    dnis: DS.attr(),\n    address: DS.attr(),\n    videos: DS.hasMany(communicationMappings.videos, { async: false }),\n    screenshares: DS.hasMany(communicationMappings.screenshares, { async: false }),\n    calls: DS.hasMany(communicationMappings.calls, { async: false }),\n    chats: DS.hasMany(communicationMappings.chats, { async: false }),\n    emails: DS.hasMany(communicationMappings.emails, { async: false }),\n    callbacks: DS.hasMany(communicationMappings.callbacks, { async: false }),\n    messages: DS.hasMany(communicationMappings.messages, { async: false }),\n\n    update(participantUpdate) {\n        const updatableAttrs = [\n            'purpose',\n            'attributes',\n            'startTime',\n            'connectedTime',\n            'wrapupRequired',\n            'wrapup',\n            'screenRecordingState'\n        ];\n\n        const updateProperties = {};\n        for (const updatable of updatableAttrs) {\n            const updatedValue = participantUpdate[updatable];\n            if (typeof updatedValue !== 'undefined') {\n                updateProperties[updatable] = updatedValue;\n            }\n        }\n\n        this.setProperties(updateProperties);\n\n        for (const comType of Object.keys(communicationMappings)) {\n            const updatedCommunications = participantUpdate[comType];\n\n            if (updatedCommunications) {\n                updatedCommunications.forEach(update => {\n                    const existing = this.get(comType).findBy('id', update.id);\n\n                    if (existing) {\n                        existing.update(update);\n                    } else {\n                        const newCommunication = this.store.createRecord(communicationMappings[comType], update);\n                        this.get(comType).pushObject(newCommunication);\n                    }\n                });\n            }\n        }\n    },\n\n    activeCommunications: computed(\n        'videos.@each.state',\n        'calls.@each.state',\n        'screenshares.@each.state',\n        'chats.@each.state',\n        'emails.@each.state',\n        'callbacks.@each.state',\n        'messages.@each.state',\n        function () {\n            const activeCommunications = EmberObject.create();\n\n            for (const comType of Object.keys(communicationMappings)) {\n                const active = this.get(comType).filter(communication => {\n                    return communication.get('state') !== 'disconnected' && communication.get('state') !== 'terminated';\n                });\n\n                if (active.length) {\n                    activeCommunications.set(comType, active);\n                }\n            }\n\n            return activeCommunications;\n        }\n    )\n});\n","import { Promise, resolve } from 'rsvp';\nimport { A } from '@ember/array';\nimport { reads, alias } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { computed, set, get } from '@ember/object';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport { getEntityObjectId } from 'web-directory/utils/jid-helpers';\n\nimport EntityMixin from '../mixins/entity';\nimport ChatUserMixin from '../mixins/chat-user';\nimport EntityPresenceMixin from '../mixins/entity-presence';\n\nimport { BASE_GROUP } from '../models/group';\n\n/* /platform/api/v2/users/{id}/profile (or /platform/api/v2/profiles/users) default field list (fl query parameter) */\nexport const BASE_PERSON_FIELDS = [\n    'extMongoId',\n    'general',\n    'contactInfo',\n    'primaryContactInfo',\n    'images.profile',\n    'version'\n];\n/* /platform/api/users expand query parameter list */\nexport const BASE_PERSON_EXPANDS = [\n    'routingStatus',\n    'primaryPresence',\n    'conversationSummary',\n    'outOfOffice',\n    'geolocation',\n    'presence',\n    'locations',\n    'authorization'\n];\nexport const BASE_PERSON = {\n    fl: BASE_PERSON_FIELDS.join(','),\n    expand: BASE_PERSON_EXPANDS.join(',')\n};\n\nexport const FULL_PERSON = {\n    fl: '*',\n    expand: BASE_PERSON_EXPANDS.join(',')\n};\n\n// We need to change how data gets merged in Ember-Data to support our field\n// config...not sure of a way around this...\nfunction merge(original, updates) {\n    if (!original) original = {};\n    _.forEach(updates, (sectionValue, sectionKey) => {\n        if (typeof sectionValue !== 'object' || Array.isArray(sectionValue)) {\n            original[sectionKey] = sectionValue;\n            return;\n        }\n\n        _.forEach(sectionValue, (fieldValue, fieldKey) => {\n            if (!original[sectionKey]) {\n                original[sectionKey] = {};\n            }\n\n            set(original[sectionKey], fieldKey, fieldValue);\n        });\n    });\n}\n\nfunction clearProperties(original, updates, changedKeys, type) {\n    const originalKeys = Object.keys(original);\n    originalKeys.forEach(sectionKey => {\n        if (updates[sectionKey] === undefined) {\n            set(original, sectionKey, {});\n            changedKeys.push(sectionKey);\n        } else {\n            if (type === 'group') {\n                const sectionData = original[sectionKey];\n                const fieldKeys = Object.keys(sectionData);\n                fieldKeys.forEach(fieldKey => {\n                    const pathKey = `${sectionKey}.${fieldKey}`;\n                    if (get(updates, pathKey) === undefined) {\n                        set(original, pathKey, {});\n                        changedKeys.push(pathKey);\n                    }\n                });\n            }\n        }\n    });\n}\n\n/**\n * @param {object | number} contactCenter contact center conversations\n * @param {object | number} enterprise enterprise  conversations\n * @returns {number} The sum of the active conversations for the two arguments, or 0.\n */\nfunction activityCounter(contactCenter, enterprise) {\n    const contactCenterCount = typeof contactCenter === 'object' ? contactCenter.active : contactCenter || 0;\n    const enterpriseCount = typeof enterprise === 'object' ? enterprise.active : enterprise || 0;\n    return contactCenterCount + enterpriseCount;\n}\n\nlet Internal = DS.InternalModel.prototype;\nlet _setupData = Internal.setupData;\nInternal.setupData = function (data) {\n    const type = data.modelName || data.type;\n    if (type === 'person' || type === 'group') {\n        let changedKeys = [];\n        const recordData = this._recordData;\n\n        if (this.hasRecord) {\n            changedKeys = recordData._changedKeys(data.attributes) || [];\n        }\n\n        merge(recordData._data, data.attributes);\n\n        if (recordData.__attributes) {\n            recordData._updateChangedAttributes();\n        }\n\n        // Partial reloading is not a thing for people/groups\n        // So we've gotta clear the data that no longer exists\n        const record = this._record;\n        if (record && record.get('isReloading')) {\n            clearProperties(recordData._data, data.attributes, changedKeys, type);\n        }\n\n        this.send('pushedData');\n\n        if (record) {\n            record._notifyProperties(changedKeys);\n        }\n    } else {\n        _setupData.apply(this, arguments);\n    }\n};\n\nlet PersonModel = DS.Model.extend(EntityMixin, ChatUserMixin, EntityPresenceMixin, {\n    ajax: service(),\n    search: service(),\n    logger: service('stash-logger'),\n    session: service(),\n    application: service(),\n    preferences: service(),\n    permissions: service(),\n    presenceSubscription: service(),\n\n    _readWritePermissions: null,\n\n    _directReports: null,\n    _siblings: null,\n    _superiors: null,\n\n    namedPermissions: reads('application.session.namedPermissions'),\n\n    // attributes guaranteed to be on models\n    parent: DS.attr(),\n    path: DS.attr(),\n    children: DS.attr(),\n    roleIds: DS.attr(),\n    expands: DS.attr(),\n    version: DS.attr(),\n    divisionId: DS.attr(),\n\n    _activities: alias('expands'),\n    activities: alias('_activities'),\n\n    // private values just used to simplify computed functions\n    _activityCall: reads('activities.conversationSummary.call'),\n    _activityCallback: reads('activities.conversationSummary.callback'),\n    _activityChat: reads('activities.conversationSummary.message'),\n    _activityWebChat: reads('activities.conversationSummary.chat'),\n    _activityEmail: reads('activities.conversationSummary.email'),\n\n    guid: reads('id'),\n\n    // this computed is used in ember-purecloud-components (EPC) addon\n    // to reduce changes across deprecated projects, we are defaulting this to true.\n    // Once EPC is removed, we can remove this property.\n    showConversationSummaryIndicator: true,\n\n    presenceList: null,\n\n    // We will want to switch completely to 'default' as the only default presence source\n    // but will be blocked until the Presence Service is only returning 'default'.\n    currentPresenceSource: 'PURECLOUD',\n\n    futurePresence: computed.reads('primaryPresence.futurePresenceDefinition'),\n\n    init: function () {\n        this._super(...arguments);\n        this.set('presenceList', A());\n\n        // convert current presence source to 'default'\n        this.set('currentPresenceSource', 'default');\n    },\n\n    totalCalls: computed('_activityCall', function () {\n        const contactCenter = this.get('_activityCall.contactCenter.active');\n        const enterprise = this.get('_activityCall.enterprise.active');\n        return activityCounter(contactCenter, enterprise);\n    }),\n\n    totalCallbacks: computed('_activityCallback', function () {\n        const contactCenter = this.get('_activityCallback.contactCenter.active');\n        const enterprise = this.get('_activityCallback.enterprise.active');\n        return activityCounter(contactCenter, enterprise);\n    }),\n\n    totalChats: computed('_activityChat', function () {\n        const contactCenter = this.get('_activityChat.contactCenter.active');\n        const enterprise = this.get('_activityChat.enterprise.active');\n        return activityCounter(contactCenter, enterprise);\n    }),\n\n    totalWebChats: computed('_activityWebChat', function () {\n        const contactCenter = this.get('_activityWebChat.contactCenter.active');\n        const enterprise = this.get('_activityWebChat.enterprise.active');\n        return activityCounter(contactCenter, enterprise);\n    }),\n\n    totalEmails: computed('_activityEmail', function () {\n        const contactCenter = this.get('_activityEmail.contactCenter.active');\n        const enterprise = this.get('_activityEmail.enterprise.active');\n        return activityCounter(contactCenter, enterprise);\n    }),\n\n    activityValues: computed('totalCalls', 'totalCallbacks', 'totalChats', 'totalEmails', function () {\n        return {\n            calls: this.totalCalls + this.totalCallbacks,\n            emails: this.totalEmails,\n            chats: this.totalChats + this.totalWebChats\n        };\n    }),\n\n    title: computed('general.title.@each.value', function () {\n        var field = this.getFieldValue('general.title');\n        return field === undefined ? '' : get(field, 'value');\n    }),\n\n    department: computed('general.department.@each.value', function () {\n        var field = this.getFieldValue('general.department');\n        return field === undefined ? '' : get(field, 'value');\n    }),\n\n    email: computed('primaryContactInfo', function () {\n        var field = this.getFieldValue('primaryContactInfo.email');\n        return field === undefined ? '' : get(field, 'value');\n    }),\n\n    email_main: computed('contactInfo.email_main', function () {\n        var field = this.getFieldValue('contactInfo.email_main');\n        return field === undefined ? '' : get(field, 'value');\n    }),\n\n    phone: computed('primaryContactInfo', function () {\n        var field = this.getFieldValue('primaryContactInfo.voice');\n\n        return field === undefined ? '' : get(field, 'value');\n    }),\n\n    integrationPhone: computed('contactInfo.phone_other', function () {\n        let otherPhones = this.get('contactInfo.phone_other');\n        if (otherPhones && otherPhones.length > 0) {\n            return otherPhones.find(phone => phone && phone.value && phone.value.integration);\n        }\n        return null;\n    }),\n\n    agentName: computed('agent', function () {\n        var field = this.getFieldValue('agent.name');\n\n        return field === undefined ? '' : get(field, 'value');\n    }),\n\n    uploadedProfilePictures: computed('uploads.images', function () {\n        var field = this.getFieldValue('uploads.images');\n        if (field && field.length && field[0].value) {\n            return field;\n        }\n\n        return [];\n    }),\n\n    uploadedInformalPhotos: computed('images.informal', function () {\n        var field = this.getFieldValue('images.informal');\n\n        if (field && field.length && field[0].value) {\n            return field;\n        }\n\n        return [];\n    }),\n\n    rawGroupIds: computed('groups.social.[]', 'groups.official.[]', function () {\n        const rawSocialGroups = this.get('groups.social') ? this.get('groups.social') : [];\n        const rawOfficialGroups = this.get('groups.official') ? this.get('groups.official') : [];\n        return [...rawSocialGroups.map(g => get(g, 'guid')), ...rawOfficialGroups.map(g => get(g, 'guid'))];\n    }),\n\n    socialGroups: computed('groups.social.[]', function () {\n        return this.getGroupsByType('groups.social');\n    }),\n\n    officialGroups: computed('groups.official.[]', function () {\n        return this.getGroupsByType('groups.official');\n    }),\n\n    distributionGroups: computed('purecloud.distributionGroups', function () {\n        return this.getGroupsByType('purecloud.distributionGroups');\n    }),\n\n    ownedGroups: computed('id', function () {\n        const promise = new Promise((resolve, reject) => {\n            this.search\n                .performSearch(this.guid, 0, 'groups', [], ['owners.owners.guid'], 'EXACT', [], 100)\n                .then(function ({ results }) {\n                    if (results) {\n                        resolve(results);\n                    } else {\n                        resolve([]);\n                    }\n                })\n                .catch(function (err) {\n                    reject(err);\n                });\n        });\n\n        return DS.PromiseArray.create({\n            promise\n        });\n    }),\n\n    manager: computed('relationships.manager.[]', 'relationships.manager.@each.value', function () {\n        var field = this.getFieldValue('relationships.manager');\n        var managerId = get(field, 'guid') || get(field, 'value');\n        var promise;\n\n        if (managerId) {\n            promise = this.store.findRecord('person', managerId, BASE_PERSON);\n        } else {\n            promise = resolve({});\n        }\n\n        return DS.PromiseObject.create({\n            promise: promise\n        });\n    }),\n\n    managerSiblings: computed('manager', 'manager.isFulfilled', function () {\n        var field = this.getFieldValue('relationships.manager');\n        var managerId = get(field, 'value');\n        var promise;\n\n        if (managerId) {\n            promise = this.manager\n                .then(function (person) {\n                    return person.get('siblings');\n                })\n                .then(function (siblings) {\n                    if (siblings.get('length')) {\n                        return siblings.filterBy('state', 'active');\n                    }\n\n                    return [];\n                });\n        } else {\n            promise = resolve([]);\n        }\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    }),\n\n    otherRelationships: computed('relationships.relationships.[]', function () {\n        let values = this.getFieldValue('relationships.relationships');\n        let ids = values.mapBy('value');\n        let promise = resolve([]);\n        if (ids && !_.isEmpty(ids) && ids[0]) {\n            promise = this.store.findByIds('person', ids, BASE_PERSON);\n        }\n\n        return DS.PromiseArray.create({\n            promise\n        });\n    }),\n\n    groupedOtherRelationships: computed('relationships.relationships', function () {\n        var fieldValue = this.getFieldValue('relationships.relationships');\n\n        if (!fieldValue) {\n            return resolve([]);\n        }\n\n        var ids = fieldValue.mapBy('value');\n        var promise;\n\n        if (ids && !_.isEmpty(ids) && ids[0]) {\n            promise = this.store.findByIds('person', ids).then(function (persons) {\n                // Group relationships by label key.\n                var groupedRelationships = [];\n\n                _.each(fieldValue, function (personEntry) {\n                    var person = persons.findBy('id', personEntry.value);\n                    if (person.get('state') === 'deleted') {\n                        return;\n                    }\n\n                    var relationship = groupedRelationships.findBy('labelKey', personEntry.labelKey);\n                    if (relationship) {\n                        relationship.people.push(person);\n                    } else {\n                        groupedRelationships.push({\n                            labelKey: personEntry.labelKey,\n                            i18nKey:\n                                'person_relationships_relationships_labelKey_' + personEntry.labelKey.replace('.', '_'),\n                            people: [person]\n                        });\n                    }\n                });\n\n                return groupedRelationships;\n            });\n        } else {\n            promise = resolve([]);\n        }\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    }),\n\n    adminAssistants: computed('relationships.administrativeAssistant.[]', function () {\n        if (this._adminAssistantsRequest) {\n            return this._adminAssistantsRequest;\n        }\n\n        let promise = resolve([]);\n        let field = this.getFieldValue('relationships.administrativeAssistant');\n\n        if (!field) {\n            return DS.PromiseArray.create({ promise });\n        }\n\n        if (typeof field.mapBy !== 'function') {\n            console.warn('adminAssistants had unexpected value', { field });\n            return DS.PromiseArray.create({ promise });\n        }\n\n        let ids = field.mapBy('value');\n        let cachedData = this._adminAssistants;\n\n        // Check cached data and resolve with it if it matches\n        if (!!cachedData && cachedData.length > 0) {\n            let cachedIds = A(cachedData).mapBy('id');\n            if (cachedIds.length === ids.length) {\n                let sameIds = cachedIds.filter(id => ids.includes(id));\n                if (sameIds.length === cachedIds.length) {\n                    return DS.PromiseArray.create({\n                        promise: resolve(cachedData)\n                    });\n                }\n            }\n        }\n\n        if (ids && !_.isEmpty(ids) && ids[0]) {\n            promise = this.store.findMany('person', ids, BASE_PERSON);\n        }\n\n        let promiseArray = DS.PromiseArray.create({\n            promise\n        });\n\n        this.set('_adminAssistantsRequest', promiseArray);\n\n        promiseArray\n            .then(results => {\n                this.set('_adminAssistants', results);\n            })\n            .finally(() => this.set('_adminAssistantsRequest', null));\n\n        return promiseArray;\n    }),\n\n    superiors: computed(\n        '_superiors',\n        'path.[]',\n        'relationships.manager.[]',\n        'relationships.manager.@each.value',\n        function () {\n            if (this._loadingSuperiors && this._superiors) {\n                return this._superiors;\n            }\n\n            const cache = this._superiors;\n            if (cache) {\n                return cache.then(people => {\n                    const manager = this.getFieldValue('relationships.manager');\n                    if (!manager || _.isEmpty(manager)) {\n                        this.set('_superiors', null);\n                        return [];\n                    } else if (people.length === 0 && manager.value) {\n                        this.set('_superiors', null);\n                        return this.store\n                            .findSuperiors('person', this.id, BASE_PERSON)\n                            .finally(() => (this._loadingSuperiors = false));\n                    }\n                    return people;\n                });\n            }\n\n            this._loadingSuperiors = true;\n\n            var superiors = this.store\n                .findSuperiors('person', this.id, BASE_PERSON)\n                .finally(() => (this._loadingSuperiors = false));\n            this.set('_superiors', superiors);\n            return superiors;\n        }\n    ),\n\n    directReports: computed('children.[]', function () {\n        if (this._currentReportsRequest) {\n            return DS.PromiseArray.create({\n                promise: this._currentReportsRequest\n            });\n        }\n\n        const id = this.id;\n        this.logger.info('Refreshing direct reports:', { id });\n\n        let promise = resolve([]);\n\n        let children = this.children;\n        if (!Array.isArray(children)) {\n            children = [];\n        }\n        const directReportCount = this.getFieldValue('relationships.directReportCount');\n        const cachedReports = this.get('_directReports.content') || [];\n        const attemptedToLoad = !!this._directReports;\n\n        // Check for the existence of the children prop\n        const dataDiscrepancy = !_.isEmpty(this.children) && children.length !== directReportCount.value;\n\n        const noDirectReports = directReportCount.value === 0 && cachedReports.length === 0;\n\n        let doNotLoad = dataDiscrepancy ? children.length === 0 : noDirectReports && attemptedToLoad;\n\n        const cachedIsSame = _.isEqual(A(children).sort(), A(cachedReports).mapBy('id').sort());\n\n        if (doNotLoad) {\n            this.logger.info('No direct reports needed to be loaded:', { id });\n        } else if (cachedIsSame && this._directReports) {\n            this.logger.info('Resolving with cached direct reports:', { id });\n            promise = this._directReports || resolve([]);\n        } else {\n            this.logger.info('Loading fresh direct reports', { id });\n            promise = this.store.findDirectReports('person', this.id, BASE_PERSON);\n            this.set(\n                '_directReports',\n                DS.PromiseArray.create({\n                    promise\n                })\n            );\n\n            // We don't use the promise array because we want to keep cached results\n            // and request tracking separate (don't want to clear results)\n            this.set('_currentReportsRequest', promise);\n            promise.finally(() => {\n                this.set('_currentReportsRequest', null);\n            });\n        }\n\n        return DS.PromiseArray.create({\n            promise\n        });\n    }),\n\n    totalReports: computed('jid', function () {\n        const jid = this.jid;\n        const entityId = getEntityObjectId(jid);\n        const id = entityId || this.id;\n        const promise = this.search.performSearch(id, 0, 'users', [], ['path'], 'EXACT').then(results => {\n            if (results && results.results && results.results._meta) {\n                return results.results._meta.total;\n            }\n        });\n\n        return DS.PromiseObject.create({\n            promise: promise\n        });\n    }),\n\n    siblings: computed('manager', 'selfAndSiblings', function () {\n        var promise = this.selfAndSiblings\n            .then(siblings => {\n                return siblings.filter(person => {\n                    return person.get('id') !== this.id && person.get('state') === 'active';\n                });\n            })\n            .catch(function () {\n                return [];\n            });\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    }),\n\n    selfAndSiblings: computed('manager', function () {\n        var promise = this.manager\n            .then(function (person) {\n                if (person && person.get) {\n                    return person.get('directReports');\n                }\n\n                return [];\n            })\n            .catch(function () {\n                return [];\n            });\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    }),\n\n    descendants: computed(function () {\n        return DS.PromiseArray.create({\n            promise: resolve([])\n        });\n    }),\n\n    readWritePermissions: computed(function () {\n        let promise = new Promise(resolve => {\n            resolve({\n                read: [],\n                write: []\n            });\n        });\n        return DS.PromiseObject.create({ promise });\n    }),\n\n    roles: reads('application.session.roleNames'),\n\n    /* TODO: Start moving these to permissions service */\n    isAdmin: computed('application.session.roleNames', 'application.session.user.isSuper', function () {\n        if (this.get('application.session.user.isSuper')) {\n            return true;\n        }\n\n        return _.filter(this.get('application.session.roleNames'), 'isAdmin').length > 0;\n    }),\n\n    /* TODO: Start moving these to permissions service */\n    isContentUser: computed('application.session.namedPermissions', function () {\n        return _.indexOf(this.get('application.session.namedPermissions'), 'content_management_user') > -1;\n    }),\n\n    /* TODO: Start moving these to permissions service */\n    isContentAdmin: computed('application.session.namedPermissions', function () {\n        return _.indexOf(this.get('application.session.namedPermissions'), 'content_management_admin') > -1;\n    }),\n\n    isNotBusy: computed('application.session.person.presence', function () {\n        if (this.get('application.session.person.presence') !== 'busy') {\n            return true;\n        }\n        return false;\n    }),\n\n    /* TODO: Start moving these to permissions service */\n    isEngageUser: computed('isEngageAgent', 'isEngageSupervisor', function () {\n        return this.isEngageAgent || this.isEngageSupervisor;\n    }),\n\n    /* TODO: Start moving these to permissions service */\n    isEngageSupervisor: alias('permissions.hasSupervisorAccess'),\n\n    isEngageAgent: alias('permissions.canGoOnQueue'),\n\n    /* TODO: Start moving these to permissions service */\n    isCommunicateUser: computed('application.session.namedPermissions', function () {\n        return _.includes(this.get('application.session.namedPermissions'), 'unified_communications');\n    }),\n\n    clearDirectReportsCache() {\n        this.set('_directReports', null);\n        this.set('children', []);\n    },\n\n    setProfilePicture: function (image) {\n        this.setPicture(image, 'images.profile');\n        this.notifyPropertyChange('images.profile');\n        this.notifyPropertyChange('profilePicture');\n    },\n\n    setAgentPicture(image) {\n        this.setPicture(image, 'agent.profileImage');\n        this.notifyPropertyChange('agent.profileImage');\n    },\n\n    setPicture(image, path) {\n        let imageSection = this.get(path);\n        if (imageSection === undefined) {\n            this.set(path, {});\n            imageSection = this.get(path);\n        }\n\n        if (imageSection && imageSection.length) {\n            let profileImage = imageSection[0];\n\n            set(profileImage, 'ref', image.value);\n            set(profileImage, 'value.fieldId', image._id);\n            set(profileImage, 'value.fieldPath', 'uploads.images');\n        }\n    },\n\n    getGroupsByType: function (type) {\n        const field = this.fieldConfig.getFieldByKey(type);\n        if (!field) {\n            return DS.PromiseArray.create({\n                promise: resolve([])\n            });\n        }\n\n        var membershipIds;\n        var memberships = this.getFieldValue(type);\n        var promise;\n\n        if (!_.isEmpty(memberships) && memberships[0].value && memberships[0].value.length) {\n            membershipIds = memberships.mapBy('value').filter(id => {\n                if (this.store.hasRecordForId('group', id)) {\n                    return !this.store.recordForId('group', id).get('isDeleted');\n                }\n                return true;\n            });\n\n            promise = this.store.findMany('group', membershipIds, BASE_GROUP).then(groups => {\n                if (!groups) {\n                    return [];\n                }\n\n                return groups.rejectBy('state', 'deleted');\n            });\n        } else {\n            promise = resolve([]);\n        }\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    },\n\n    getFieldPathForFieldValue: function (fieldValue, type) {\n        if (type === 'sms' || type === 'voice') {\n            type = 'phone';\n        }\n\n        var fieldPaths = this.fieldConfig.getFieldListByType(type).mapBy('fieldPath');\n\n        return _.find(fieldPaths, path => {\n            var value = this.getFieldValue(path);\n            if (Array.isArray(value)) {\n                var found = _.find(value, function (actual) {\n                    if (fieldValue.value && fieldValue.value.fieldId) {\n                        return actual._id === fieldValue.value.fieldId;\n                    }\n                    return actual._id === fieldValue._id;\n                });\n\n                return !_.isEmpty(found);\n            } else {\n                if (fieldValue.value && fieldValue.value.fieldId) {\n                    return value._id === fieldValue.value.fieldId;\n                }\n                return value._id === fieldValue._id;\n            }\n        });\n    },\n\n    getContactFieldValuesByType: function (type) {\n        var fieldType = type;\n        var collection = [];\n\n        if (type === 'sms' || type === 'voice') {\n            fieldType = 'phone';\n        }\n\n        var fields = this.fieldConfig.getFieldListByType(fieldType);\n\n        var values = _.map(fields, field => {\n            var path = field.getFieldPath();\n            var value = this.getFieldValue(path);\n\n            if (!Array.isArray(value)) {\n                value = [value];\n            }\n\n            var filteredEntries = _.filter(value, function (value) {\n                if (type === 'email') {\n                    return get(value, 'value.length') > 0;\n                }\n                return get(value, 'value.number.length') > 0 || get(value, 'value.extension.length') > 0;\n            });\n\n            if (type === 'sms') {\n                filteredEntries = filteredEntries.filterBy('value.acceptsSMS');\n            }\n\n            return filteredEntries;\n        });\n\n        _.forEach(values, function (value) {\n            if (Array.isArray(value)) {\n                collection = collection.concat(value);\n            } else if (value && typeof value === 'object') {\n                collection.push(value);\n            }\n        });\n\n        return collection;\n    },\n\n    getPermissableSections: function (permissions) {\n        var sections = _.map(permissions, function (fieldPath) {\n            return fieldPath.split('.')[0];\n        });\n\n        return _.uniq(sections);\n    },\n\n    getReadableSections: function () {\n        var permissions = this.get('_readWritePermissions.read');\n        return this.getPermissableSections(permissions);\n    },\n\n    getWriteableSections: function () {\n        var permissions = this.get('_readWritePermissions.write');\n        return this.getPermissableSections(permissions);\n    },\n\n    getReadableFieldsForSection: function (section) {\n        var permissions = this.get('_readWritePermissions.read');\n        var filteredPaths = _.filter(permissions, function (fieldPath) {\n            return fieldPath.indexOf(section.key) === 0;\n        });\n\n        return _.map(filteredPaths, function (fieldPath) {\n            return fieldPath.split('.')[1];\n        });\n    },\n\n    getWriteableFieldsForSection: function (sectionKey) {\n        var permissions = this.get('_readWritePermissions.write');\n        var filteredPaths = _.filter(permissions, function (fieldPath) {\n            return fieldPath.indexOf(sectionKey) === 0;\n        });\n\n        return _.map(filteredPaths, function (fieldPath) {\n            return fieldPath.split('.')[1];\n        });\n    },\n\n    setPrimaryContact(type, entry, fieldPath = null, fieldData = null) {\n        if (type === 'phone') {\n            type = 'voice';\n        }\n\n        let path = `primaryContactInfo.${type}`;\n        let primary = this.getFieldValue(path, true);\n        if (!fieldPath) {\n            fieldPath = this.getFieldPathForFieldValue(entry, type);\n        }\n\n        if (Array.isArray(primary)) {\n            primary = primary[0];\n        }\n\n        let fieldId = entry._id || entry.tempId;\n        if (fieldData) {\n            fieldId = fieldData.get('value._id') || fieldId;\n        }\n\n        set(primary, '_id', null);\n        set(primary, 'ref', entry.value);\n        set(primary, 'value', {\n            fieldId,\n            fieldPath: fieldPath\n        });\n\n        delete primary._id;\n        delete primary.rel;\n\n        set(this, path, [primary], { overwrite: true });\n    },\n\n    integrationContactInfo(key) {\n        let phones = this.get('contactInfo.phone_other');\n        if (phones && phones.length > 0) {\n            return phones.find(phone => {\n                return phone && phone.value && phone.value.integration === key;\n            });\n        }\n        return null;\n    }\n});\n\nPersonModel.reopenClass({\n    apiEndpoint: 'v2/people'\n});\n\nexport default PersonModel;\n","import { A } from '@ember/array';\nimport EmberObject, { computed, get } from '@ember/object';\nimport { reads, readOnly } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { camelize } from '@ember/string';\nimport { formatPresenceLanguageLabelLocale } from 'web-directory/utils/intl';\nimport isEmpty from 'lodash/isEmpty';\n\nexport default EmberObject.extend({\n    intl: service(),\n    presenceService: service('presence'),\n    session: service('session'),\n\n    presence: null,\n    acdDivisionPresenceProfileToggle: readOnly('session.features.acdDivisionPresenceProfileToggle'),\n\n    init() {\n        this._super(...arguments);\n\n        const presence = this.presence;\n        if (presence && !presence.systemPresence) {\n            this.set('presence', this.getPresenceDefinition(presence));\n        }\n    },\n\n    id: reads('presence.id'),\n    deactivated: reads('presence.deactivated'),\n\n    key: computed('presence.systemPresence', function () {\n        return this.get('presence.systemPresence').toLowerCase();\n    }),\n\n    isSecondaryPresence: computed(\n        'id',\n        'presence.type',\n        'presenceService.primaryPresences.@each.id',\n        'acdDivisionPresenceProfileToggle',\n        function () {\n            const presenceDef = this.presence;\n            if (this.acdDivisionPresenceProfileToggle && Object.prototype.hasOwnProperty.call(presenceDef, 'type')) {\n                return presenceDef.type.toLowerCase() === 'user';\n            }\n            if (Object.prototype.hasOwnProperty.call(presenceDef, 'type')) {\n                return presenceDef.type === 'user';\n            }\n            const primaryIds = this.get('presenceService.primaryPresences').map(presence => presence.get('id'));\n            return !A(primaryIds).includes(this.id);\n        }\n    ),\n\n    label: computed(\n        'key',\n        'intl.locale',\n        'presence.languageLabels',\n        'isSecondaryPresence',\n        'acdDivisionPresenceProfileToggle',\n        function () {\n            const intl = this.intl;\n            const isSecondary = this.isSecondaryPresence;\n            let locale = formatPresenceLanguageLabelLocale(this.get('intl.locale.0'));\n            let builtIn = this.get(`presence.languageLabels.${locale}`);\n            if (this.acdDivisionPresenceProfileToggle && !builtIn) {\n                builtIn = this.get(`presence.languageLabels.${locale.toLowerCase()}`);\n            }\n            const enBuiltIn = this.get('presence.languageLabels.en_US');\n            let key = this.key;\n\n            if (key === 'idle') {\n                // Idle always displays as 'Away'\n                return intl.t('chat.presence.away').toString();\n            }\n\n            if (!builtIn) {\n                // We need to default to the English provided translation\n                // when dealing with a secondary presence\n                if (isSecondary && enBuiltIn) {\n                    return enBuiltIn.toString();\n                }\n                key = camelize(key);\n                const lookupKey = `chat.presence.${key}`;\n                if (intl.exists(lookupKey)) {\n                    return intl.t(lookupKey).toString();\n                }\n                return enBuiltIn.toString();\n            }\n            return builtIn.toString();\n        }\n    ),\n\n    primaryLabel: computed('label', 'isSecondaryPresence', 'parentPresence.label', function () {\n        if (this.isSecondaryPresence) {\n            return this.get('parentPresence.label');\n        }\n\n        return this.label;\n    }),\n\n    secondaryPresences: computed('key', 'presenceService.secondaryPresences', function () {\n        const secondary = this.get('presenceService.secondaryPresences');\n        const key = this.key;\n\n        if (get(secondary, key)) {\n            return get(secondary, key).sort((a, b) => {\n                const createdAtA = new Date(get(a, 'presence.createdDate')).valueOf();\n                const createdAtB = new Date(get(b, 'presence.createdDate')).valueOf();\n                return createdAtA > createdAtB ? 1 : createdAtB > createdAtA ? -1 : 0;\n            });\n        }\n        return [];\n    }),\n\n    hasSecondaryPresences: computed('presence.type', 'secondaryPresences', function () {\n        const secondary = this.secondaryPresences;\n        return !isEmpty(secondary) && this.get('presence.type').toLowerCase() === 'system';\n    }),\n\n    parentPresence: computed('presence', 'isSecondaryPresence', 'presenceService.primaryPresences.[]', function () {\n        const primaries = this.get('presenceService.primaryPresences');\n        return primaries.find(\n            primary => primary.get('presence.systemPresence') === this.get('presence.systemPresence')\n        );\n    }),\n\n    getPresenceDefinition(presence = {}) {\n        const presenceMap = this.get('presenceService.presenceDefinitions');\n        return presenceMap.find(mapPresence => {\n            return mapPresence.id === presence.id;\n        });\n    }\n});\n","import { inject as service } from '@ember/service';\nimport { reads, bool } from '@ember/object/computed';\nimport { computed } from '@ember/object';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport moment from '../utils/dates';\n\nconst { attr } = DS;\n\nexport default DS.Model.extend({\n    name: attr(),\n    chat: attr(),\n    department: attr(),\n    email: attr(),\n    primaryContactInfo: attr(),\n    addresses: attr(),\n    state: attr(),\n    title: attr(),\n    username: attr(),\n    images: attr(),\n    version: attr(),\n    station: attr(),\n    authorization: attr(),\n    fieldConfigs: attr(),\n    selfUri: attr(),\n    outOfOffice: attr(),\n    presence: attr(),\n    token: attr(),\n    logCapture: attr(),\n    type: 'public-api-user',\n\n    intl: service(),\n    session: service(),\n\n    isSuper: false, // set by session service\n    isTrustee: false, // set by session service\n\n    person: reads('session.person'),\n\n    isCloned: bool('token.clonedUser'),\n\n    logCaptureEnabled: computed('logCapture.dateExpired', function () {\n        let expiration = this.get('logCapture.dateExpired');\n\n        return expiration && moment().isBefore(moment.utc(expiration));\n    }),\n\n    profile: DS.belongsTo('person', { async: true }),\n\n    // Legacy properties\n    // Here for computed parity with connect-api user\n    // Deprecated. To be phased out soon.\n    userType: computed('isSuper', 'isTrustee', 'isAdmin', function () {\n        if (this.isSuper) {\n            return 'super';\n        } else if (this.isTrustee) {\n            return 'trustee';\n        } else if (this.isAdmin) {\n            return 'admin';\n        } else {\n            return 'employee';\n        }\n    }),\n\n    isAdmin: computed('authorization.roles.@each.name', 'isSuper', function () {\n        if (this.isSuper) {\n            return true;\n        }\n\n        const roles = this.get('authorization.roles') || [];\n        const names = roles.mapBy('name');\n        return _.includes(names, 'admin');\n    }),\n\n    userState: computed('state', function () {\n        return this.intl.safestring(`item.state.${this.state}`);\n    }),\n\n    inviteLastSent: computed('welcomeSent', function () {\n        var date = moment(new Date(this.welcomeSent * 1000));\n        return date.format('L');\n    })\n});\n","import DS from 'ember-data';\n\nvar QueueModel = DS.Model.extend({\n    name: DS.attr(),\n    type: DS.attr(),\n    memberCount: DS.attr('number'),\n    outboundMessagingAddresses: DS.attr(),\n    outboundEmailAddress: DS.attr(),\n    directRouting: DS.attr(),\n    // Ember Data does not allow a shared object literal as defaultValue (it would be shared across\n    // every instance); a factory function must be used instead so each record gets its own object.\n    cannedResponseLibraries: DS.attr({ defaultValue: () => ({ mode: 'All' }) })\n});\n\nexport default QueueModel;\n","import { inject as service } from '@ember/service';\nimport { or } from '@ember/object/computed';\nimport { computed } from '@ember/object';\nimport RSVP from 'rsvp';\nimport { run } from '@ember/runloop';\nimport DS from 'ember-data';\nimport BrowserUtils from 'web-directory/utils/browser';\n\n// CM-4671 : max retry count and retry timeout values for loading user audio recording in inbox\nconst maxNumFetchAudioRetry = 10,\n    retryAfterMs = 6000;\n\nlet recordingRetryCountMap = new Map(); // CM-4671 : map to store retry count of each user recording api call\n\nexport default DS.Model.extend({\n    ajaxService: service('ajax'),\n\n    callerAddress: DS.attr(),\n    callerName: DS.attr(),\n    name: DS.attr(),\n    dateCreated: DS.attr(),\n    dateModified: DS.attr(),\n    contentUri: DS.attr(),\n    workspace: DS.attr(),\n    createdBy: DS.attr(),\n    conversation: DS.belongsTo('conversation'),\n    contentLength: DS.attr(),\n    durationMilliseconds: DS.attr(),\n    thumbnails: DS.attr(),\n    read: DS.attr(),\n    selfUri: DS.attr(),\n\n    date: computed('dateCreated', function () {\n        return this.dateCreated;\n    }),\n\n    mediaUri: or('media.contentLocationUri', 'media.resultUri'), // CM-5777 : media uri computed from contentLocationUri / resultUri response parameter from API\n\n    otherParty: computed('conversation', function () {\n        const model = this.conversation;\n        return model.get('otherPartyModel');\n    }),\n\n    audioSource: computed('id', function () {\n        const formatId = BrowserUtils.getSuggestedAudioTypeFrom(['webm', 'wav']);\n        return this.fetchAudio(formatId).then(function (response) {\n            // CM-5777 : media uri computed from contentLocationUri / resultUri response parameter from API\n            let callRecordingUri = response.contentLocationUri || response.resultUri;\n            return callRecordingUri;\n        });\n    }),\n\n    fetchAudio: function (formatId, reload = false) {\n        let resolver, pollingTimeout;\n        const media = this.media;\n        if (media) {\n            resolver = function (resolve) {\n                resolve(media);\n            };\n        } else {\n            const adapter = this.store.adapterFor('recorded-call');\n            const apiName = '/transcoding';\n            const endpoint = adapter.buildURL('recordedCall', this.id + apiName);\n            // CM-4671: User Recording Inbox UI: Use async flow to download long-duration user recordings\n            resolver = (resolve, reject) => {\n                this.ajaxService\n                    .raw(endpoint, {\n                        data: { formatId, async: true },\n                        headers: adapter.headers,\n                        contentType: 'application/json; charset=UTF-8',\n                        cache: false\n                    })\n                    .then(\n                        res => {\n                            let status = res.jqXHR.status,\n                                userRecRetryCountKey = 'userrec_' + this.id + '_retrycount', // map variable to check indivitual user recording api retry count\n                                userRecRetryCurrent = recordingRetryCountMap.get(userRecRetryCountKey) || 0,\n                                response = res.response;\n                            if (status === 200) {\n                                let recordingUri = response.resultUri || response.contentLocationUri; // CM-5713: to set the uri location as audio source. ( resultUri - response param from transcoding api , contentLocationUri - response param from deprecated media api)\n                                recordingRetryCountMap.delete(userRecRetryCountKey); // remove the map variable when the api returns 200 status\n                                this.set('media', response);\n                                this.set('audioSource', recordingUri); // to update the source of the audio player\n                                return run(null, resolve, response); // resolving the promise immediately after 200 response\n                            } else if (++userRecRetryCurrent < maxNumFetchAudioRetry && status === 202) {\n                                recordingRetryCountMap.set(userRecRetryCountKey, userRecRetryCurrent);\n                                pollingTimeout = setTimeout(() => {\n                                    return this.fetchAudio(formatId, reload);\n                                }, retryAfterMs); // retry after 6 secs to fetch audio call until the api request returns 200 status\n                            } else if (userRecRetryCurrent >= maxNumFetchAudioRetry && status === 202) {\n                                // stop the retry fetch audio call once it reaches the max retry count of 10\n                                if (pollingTimeout) clearTimeout(pollingTimeout);\n                                if (userRecRetryCountKey) recordingRetryCountMap.delete(userRecRetryCountKey);\n                                this.set('audioSource', ''); // setting the audiosource to empty to show the error in audio player when the maximum retry count is done and still receive the 202 resource\n                                return RSVP.reject(new Error('Failed to load user recording'));\n                            }\n                        },\n                        reason => {\n                            this.set('media', {\n                                failed: 'Failed to load user recording'\n                            });\n                            reject(reason);\n                        }\n                    );\n            };\n        }\n\n        return new RSVP.Promise(resolver);\n    }\n}).reopenClass({\n    apiEndpoint: 'v2/userrecordings'\n});\n","import { equal, or } from '@ember/object/computed';\nimport { setProperties, get } from '@ember/object';\nimport RSVP from 'rsvp';\nimport moment from 'moment';\nimport DS from 'ember-data';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nconst thirtyDaysFromNow = () => moment().add(30, 'days').toISOString();\n\nexport default DS.Model.extend(LoggerMixin, {\n    name: DS.attr(),\n    conversation: DS.belongsTo('conversation'),\n    path: DS.attr(),\n    startTime: DS.attr(),\n    endTime: DS.attr(),\n    originalRecordingStartTime: DS.attr(),\n    media: DS.attr(),\n    annotations: DS.attr(),\n    transcript: DS.attr(),\n    emailTranscript: DS.attr(),\n    fileState: DS.attr(),\n    restoreExpirationTime: DS.attr(),\n    mediaUris: DS.attr(),\n    estimatedTranscodeTimeMs: DS.attr(),\n    actualTranscodeTimeMs: DS.attr(),\n    archiveDate: DS.attr(),\n    archiveMedium: DS.attr(),\n    deleteDate: DS.attr(),\n    maxAllowedRestorationsForOrg: DS.attr(),\n    remainingRestorationsAllowedForOrg: DS.attr(),\n    users: DS.attr(),\n    creationTime: DS.attr(),\n\n    isArchived: equal('fileState', 'ARCHIVED'),\n    isDeleted: equal('fileState', 'DELETED'),\n    isRestored: equal('fileState', 'RESTORED'),\n    isRestoring: equal('fileState', 'RESTORING'),\n    isAvailable: equal('fileState', 'AVAILABLE'),\n    isViewable: or('isAvailable', 'isRestored'),\n\n    /**\n     * restore - Restore a recording\n     *\n     * @param {string} archiveDate ISO date for recording re-archival, 30 day default.\n     *\n     * @returns {Promise}\n     */\n    restore(archiveDate = thirtyDaysFromNow()) {\n        const isValid = moment(archiveDate, moment.ISO_8601).isValid();\n        if (isValid) {\n            setProperties(this, { archiveDate });\n            return this.save();\n        } else {\n            const reason = 'Attempted to restore a recording with an invalid date string';\n            this.logger.debug(reason, {\n                archiveDate\n            });\n            return RSVP.reject(reason);\n        }\n    },\n\n    /**\n     * download - Download a recording.\n     *\n     * @returns {Promise}\n     */\n    download() {\n        const conversationId = get(this, 'conversation.id');\n        const id = this.id;\n\n        return this.store\n            .queryRecord('recording', { id, conversationId, download: true })\n            .then(res => {\n                const media = get(res, 'media');\n                // audio recordings have two channels that get merged together\n                // when downloading.  The merged mediaUri is keyed under\n                // 'S' (presumably for 'S'ingle channel/file)\n                const key = media && media === 'audio' ? 'S' : '0';\n                const downloadUrl = get(res, `mediaUris.${key}.mediaUri`);\n                this._setLocation(downloadUrl);\n                return downloadUrl;\n            })\n            .catch(err => {\n                this.logger.error('RECORDING: Error downloading recording', {\n                    id,\n                    err,\n                    remoteData: {\n                        conversationId\n                    }\n                });\n                throw err;\n            });\n    },\n\n    /**\n     * downloadAllMediaUris - Download all mediaUris of a recording.\n     *\n     * @returns {Promise}\n     */\n    downloadAllMediaUris() {\n        const conversationId = get(this, 'conversation.id');\n        const id = this.id;\n\n        return this.store\n            .queryRecord('recording', { id, conversationId, download: true })\n            .then(res => {\n                const downloadUrls = [];\n                for (const mediaUriObject of Object.values(get(res, 'mediaUris'))) {\n                    const downloadUrl = mediaUriObject.mediaUri;\n                    downloadUrls.push(downloadUrl);\n                    this._setLocInNewIFrame(downloadUrl);\n                }\n                return downloadUrls;\n            })\n            .catch(err => {\n                this.logger.error('RECORDING: Error downloading recording', {\n                    id,\n                    err,\n                    remoteData: {\n                        conversationId\n                    }\n                });\n            });\n    },\n\n    /**\n     * _setLocation - Sets window location.\n     *\n     * @param {string} loc URL of target.\n     *\n     * @returns {undefined}\n     */\n    _setLocation(loc) {\n        window.location = loc;\n    },\n\n    /**\n     * _setLocInNewIFrame - Builds a new hidden IFrame for the target location.\n     *\n     * @param {string} loc URL of target.\n     *\n     * @returns {undefined}\n     */\n    _setLocInNewIFrame(loc) {\n        const iframe = document.createElement('iframe');\n        iframe.style.display = 'none';\n        document.body.appendChild(iframe);\n        iframe.src = loc;\n        // The hidden IFrame cleans itself up after 60 seconds, preventing it\n        // from lingering on the DOM indefinitely\n        setTimeout(() => document.body.removeChild(iframe), 60000);\n    }\n});\n","import { computed } from '@ember/object';\nimport DS from 'ember-data';\n\nfunction singularize(type) {\n    type = type.replace('resource_', '');\n    type = type.replace(/s$/, '');\n    return type;\n}\n\nexport default DS.Model.extend({\n    title: DS.attr(),\n    link: DS.attr(),\n    excerpt: DS.attr(),\n    _type: DS.attr(),\n\n    type: computed('_type', function () {\n        const type = this._type;\n        return singularize(type);\n    })\n});\n","import DS from 'ember-data';\nimport Communication from './communication';\n\nexport default Communication.extend({\n    // ----------------------------------------------------------------------------\n    // Raw Properties\n    // ----------------------------------------------------------------------------\n\n    context: DS.attr(),\n    sharing: DS.attr(),\n    mediaType: DS.attr(),\n\n    update(comUpdate) {\n        this._super(...arguments);\n        const updatableAttrs = ['context', 'sharing', 'mediaType'];\n\n        const updateProperties = {};\n        for (const updatable of updatableAttrs) {\n            const updatedValue = comUpdate[updatable];\n            if (typeof updatedValue !== 'undefined') {\n                updateProperties[updatable] = updatedValue;\n            }\n        }\n\n        this.setProperties(updateProperties);\n    }\n});\n","import { reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { computed, set } from '@ember/object';\nimport { resolve } from 'rsvp';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nconst COMPARATORS = {\n    EqualTo: {\n        label: 'equals (==)',\n        value: 'EqualTo',\n        op: '=='\n    },\n    NotEqualTo: {\n        label: 'not equals (!=)',\n        value: 'NotEqualTo',\n        op: '!='\n    },\n    GreaterThan: {\n        label: 'greater than (>)',\n        value: 'GreaterThan',\n        op: '>'\n    },\n    GreaterThanOrEqualTo: {\n        label: 'greater than or equal to (>=)',\n        value: 'GreaterThanOrEqualTo',\n        op: '>='\n    },\n    LessThan: {\n        label: 'less than (<)',\n        value: 'LessThan',\n        op: '<'\n    },\n    LessThanOrEqualTo: {\n        label: 'less than or equal to (<=)',\n        value: 'LessThanOrEqualTo',\n        op: '<='\n    }\n};\n\nconst PROFICIENCIES = [\n    { name: '0', value: 0 },\n    { name: '1', value: 1 },\n    { name: '2', value: 2 },\n    { name: '3', value: 3 },\n    { name: '4', value: 4 },\n    { name: '5', value: 5 }\n];\n\nvar SkillGroupModel = DS.Model.extend({\n    ajax: service(),\n    logger: service('stash-logger'),\n    intl: service(),\n    application: service(),\n    notification: service(),\n    session: service(),\n\n    description: DS.attr(),\n    division: DS.attr(),\n    memberCount: DS.attr(),\n    name: DS.attr(),\n    selfUri: DS.attr(),\n    skillConditions: DS.attr(),\n    type: 'group',\n\n    expression: computed('_expression', function () {\n        return this.parseExpression(this._expression);\n    }),\n\n    _expression: reads('skillConditions'),\n    membership: [],\n    nextMembersPage: null,\n\n    _memberDivisions: computed('division', 'id', function () {\n        const path = `api/v2/routing/skillgroups/${this.id}/members/divisions`;\n        const url = this.application.pcV2Uri(path);\n        const data = {\n            expand: 'entities'\n        };\n        const promise = this.ajax\n            .ajaxGet(url, { data })\n            .then(res => {\n                return res.entities.map(div => {\n                    if (div.id === '*') {\n                        return {\n                            name: this.intl.t('skillgroups.divisions.all'),\n                            id: '*'\n                        };\n                    } else {\n                        set(div, 'deleteable', div.id !== this.division.id);\n                        return div;\n                    }\n                });\n            })\n            .catch(error => {\n                this.logger.error('Error fetching memberDivisions on skillgroup', {\n                    error\n                });\n\n                const title = this.intl.t('skillgroups.divisions.fetchErrorTitle');\n                const message = this.intl.t('skillgroups.divisions.fetchErrorMessage');\n                this.notification.error(title, message);\n                return [];\n            });\n\n        return DS.PromiseObject.create({ promise });\n    }),\n\n    memberDivisions: reads('_memberDivisions.content'),\n\n    loadMembership() {\n        if (this.membership.length === this.memberCount) {\n            return resolve();\n        }\n        if (this._skillGroupMembersRequest) {\n            return this._skillGroupMembersRequest;\n        }\n\n        let path = `api/v2/routing/skillgroups/${this.id}/members`;\n        if (this.nextMembersPage) {\n            path = this.nextMembersPage.substring(1); // we need to remove a leading `/` character\n        }\n        const url = this.application.pcV2Uri(path);\n\n        const pending = this.ajax\n            .request(url)\n            .then(res => {\n                this.membership.pushObjects(res.entities);\n                this.set('nextMembersPage', res.nextUri);\n                // Notify even when nextUri stays null (single page) so UI runs one profiles/users batch per response\n                this.notifyPropertyChange('nextMembersPage');\n                this.notifyPropertyChange('membership');\n            })\n            .catch(error => {\n                this.logger.error('Error fetching membership for skillgroup', {\n                    error\n                });\n\n                let title = this.intl.t('skillgroups.membership.errorTitle');\n                let message = this.intl.t('skillgroups.membership.errorMessage');\n                if (error.status === 403) {\n                    title = this.intl.t('skillgroups.membership.permissionErrorTitle');\n                    message = this.intl.t('skillgroups.membership.permissionErrorMessage');\n                }\n                this.notification.error(title, message);\n            });\n\n        this._skillGroupMembersRequest = pending;\n        pending.finally(() => {\n            this._skillGroupMembersRequest = null;\n        });\n\n        return pending;\n    },\n\n    parseExpression(input) {\n        let output = [];\n\n        if (!input || input.length === 0) {\n            //no need to parse an empty array\n            return output;\n        } else if (input[0].routingSkillConditions.length === 0 && input[0].languageSkillConditions.length === 0) {\n            return output;\n        }\n\n        // childConditions are all nested, so we gotta recurse\n        const addRule = function (condition, rule) {\n            let newSkill =\n                rule.routingSkillConditions.length === 0\n                    ? {\n                          name: rule.languageSkillConditions[0].languageSkill,\n                          type: 'language'\n                      }\n                    : {\n                          name: rule.routingSkillConditions[0].routingSkill,\n                          type: 'routing'\n                      };\n            let skill =\n                rule.routingSkillConditions.length === 0\n                    ? rule.languageSkillConditions[0]\n                    : rule.routingSkillConditions[0];\n            let children = skill.childConditions;\n            let op = rule.operation;\n\n            condition.rules.pushObject({\n                comparator: COMPARATORS[skill.comparator],\n                proficiency: PROFICIENCIES[skill.proficiency],\n                operation: op,\n                skill: newSkill\n            });\n\n            if (children) {\n                children.forEach(child => {\n                    if (!_.isEmpty(child.routingSkillConditions) || !_.isEmpty(child.languageSkillConditions)) {\n                        addRule(condition, child);\n                    }\n                });\n            }\n        };\n\n        // so here we'll go through each top-level condition and check recursively for children\n        input.forEach(condition => {\n            let conOp = condition.operation;\n\n            let newCondition = {\n                rules: [],\n                lastCondition: false,\n                operation: conOp\n            };\n\n            addRule(newCondition, condition);\n\n            newCondition.rules.set('lastObject.lastRule', true);\n            output.pushObject(newCondition);\n        });\n        output.set('lastObject.lastCondition', true);\n        return output;\n    },\n\n    reload() {\n        this._skillGroupMembersRequest = null;\n        this.set('membership', []);\n        this.set('nextMembersPage', null);\n        this.notifyPropertyChange('nextMembersPage');\n        return this._super(...arguments);\n    },\n\n    rollbackAttributes() {\n        this.set('expression', this.parseExpression(this._expression));\n        return this._super(...arguments);\n    },\n\n    delete() {\n        const uri = this.application.pcV2Uri(`platform/api/v2/routing/skillgroups/${this.id}`);\n        return this.ajax.delete(uri);\n    },\n\n    save() {\n        const uri = this.application.pcV2Uri(`platform/api/v2/routing/skillgroups/${this.id}`);\n        const data = {\n            name: this.name,\n            description: this.description,\n            skillConditions: this.skillConditions\n        };\n        return this.ajax.patch(uri, { data });\n    }\n});\n\nSkillGroupModel.reopenClass({\n    apiEndpoint: 'v2/routing/skillgroups'\n});\n\nexport default SkillGroupModel;\n","import { gt } from '@ember/object/computed';\nimport { A } from '@ember/array';\nimport EmberObject, { computed } from '@ember/object';\nimport moment from 'moment';\nimport _ from 'lodash';\nimport { markdownToHtml } from '../utils/markdown';\nimport ChatMessageMedia from '../mixins/chat-message-media';\nimport ChatMessageMixin from '../mixins/chat-message-mixin';\n\nexport default EmberObject.extend(ChatMessageMedia, ChatMessageMixin, {\n    //must support default streaming service attributes, but most of these must be overridden to allow\n    //split message functionality, these will be the static streaming service attributes\n    id: null,\n    oid: null,\n    from: null,\n    to: null,\n    time: null,\n    // End of required chat message attrs\n\n    //beginning of split message attributes\n    messageArray: null,\n    splitMessageId: null,\n    splitMessage: true,\n    totalMessages: null,\n    //end of split message attributes\n\n    // set in services/chat.processNewChatMessage()\n    chatUser: null,\n\n    // set in services/chat.markAsHistory()\n    history: false,\n\n    // set in services/chat.setMessageReadState()\n    unread: false,\n\n    // set in chat-room.processCorrections()\n    startOfBlock: null,\n    endOfBlock: null,\n\n    // set in chat-room.addSelfReference()\n    room: null,\n\n    // set in chat-room.addMessage()/markConversationBlockBoundaries()\n    isYourLastMessage: false,\n    //split messages cannot be edited due to the nature of them, so these are all static\n    isEditable: false,\n    isEditing: false,\n    canEdit: false,\n\n    widgetType: 'default',\n\n    init() {\n        this._super(...arguments);\n        this.set('time', moment(this.time));\n        this.set('messageArray', A([]));\n    },\n\n    //required streaming service attributes, these are put back together from the individual models.\n    raw: computed('messageArray.@each.raw', function () {\n        return this.messageArray.map(message => message.get('raw')).join('');\n    }),\n\n    links: computed('messageArray.@each.links', function () {\n        return _.chain(this.messageArray)\n            .map(message => message.get('links'))\n            .flatten()\n            .value();\n    }),\n\n    files: computed('messageArray.@each.files', function () {\n        return _.chain(this.messageArray)\n            .map(message => message.get('files'))\n            .flatten()\n            .filter()\n            .value();\n    }),\n\n    mentions: computed('raw', function () {\n        let match;\n        let mentions = [];\n        const mentionRegex = /\\[@.*\\]\\(#\\/person\\/(.*)\\)/g;\n        const raw = this.raw;\n        while ((match = mentionRegex.exec(raw))) {\n            let mention = match[0];\n            let oid = match[1];\n            mentions.push(\n                EmberObject.create({\n                    mention: mention,\n                    oid: oid\n                })\n            );\n        }\n        return mentions;\n    }),\n\n    hasMentionLinks: gt('mentions.length', 0),\n\n    //unfortunately we have to remarkdown the message since these were all individual parts of a message\n    messageBody: computed('raw', function () {\n        return markdownToHtml(this.raw);\n    }),\n\n    editableEndTime: computed('time', function () {\n        return moment(this.time);\n    }),\n\n    failedMessages: computed('messageArray.@each.{sendError}', function () {\n        return _.chain(this.messageArray)\n            .filter(message => message.get('sendError'))\n            .value();\n    }),\n\n    sendError: gt('failedMessages.length', 0),\n\n    pending: computed('history', 'messageArray.@each.pending', 'totalMessages', function () {\n        if (this.history) {\n            return false;\n        } else {\n            return this.get('messageArray.length') < this.totalMessages;\n        }\n    }),\n\n    addSplitMessage(message) {\n        const messages = this.messageArray;\n\n        messages.pushObject(message);\n        messages.sort((a, b) => (a.get('splitMessageIndex') < b.get('splitMessageIndex') ? -1 : 1));\n\n        this.notifyPropertyChange('messageArray');\n    }\n});\n","import { equal } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { computed } from '@ember/object';\nimport DS from 'ember-data';\n\nconst StationModel = DS.Model.extend({\n    intl: service(),\n\n    userId: DS.attr(),\n    stationId: DS.attr(),\n    name: DS.attr(),\n    status: DS.attr(),\n    type: DS.attr(),\n    webrtcMediaDscp: DS.attr(),\n    webrtcForceTurn: DS.attr(),\n    persistentConnection: DS.attr(),\n    webRtcUserId: DS.attr(),\n    webRtcCallAppearances: DS.attr(),\n    webRtcRequireMediaHelper: DS.attr(),\n\n    state: computed('status', function () {\n        return this.intl.safestring(`purecloud.station.status.${this.status.toLowerCase()}`);\n    }),\n\n    available: computed('status', function () {\n        return this.status.toLowerCase() === 'available';\n    }),\n\n    isWebrtc: computed('type', 'name', function () {\n        return this.type === 'inin_webrtc_softphone';\n    }),\n\n    isRemoteStation: equal('type', 'inin_remote')\n});\n\nStationModel.reopenClass({\n    apiEndpoint: 'v2/stations'\n});\n\nexport default StationModel;\n","import { hasKey, includes } from 'web-directory/utils/types';\n\nconst GeneralUnrecoverableAppFailureTypes = [\n    'invalidEnv',\n    'timeMachineFailure',\n    'missingAuthenticator',\n    'generalAuthenticationFailure',\n    'sessionInvalidationFailure',\n    'profileFetchServerFailure'\n] as const;\n\nexport type GeneralUnrecoverableAppFailure = {\n    type: (typeof GeneralUnrecoverableAppFailureTypes)[number];\n};\n\nconst SessionBootstrapSteps = [\n    'loadFeatureToggles',\n    'setupTheme',\n    'setupUserAndTrustee',\n    'setupLogCapture',\n    'establishDirectorySession',\n    'initServerTranslations',\n    'loadPresences',\n    'loadUserDetails',\n    'loadUserFavorites',\n    'setupCarrierPigeon',\n    'initAppSession',\n    'loadOrgPermissions',\n    'loadOrgTranscriptSettings',\n    'loadPerson'\n] as const;\n\nexport type SessionBootstrapFailure = {\n    type: 'sessionBootstrapError';\n    status?: number;\n    failedStep: (typeof SessionBootstrapSteps)[number];\n};\n\nexport function isGeneralUnrecoverableAppFailure(toCheck: unknown): toCheck is GeneralUnrecoverableAppFailure {\n    if (!toCheck || typeof toCheck !== 'object') {\n        return false;\n    }\n\n    if (!hasKey(toCheck, 'type') || typeof toCheck.type !== 'string') {\n        return false;\n    }\n\n    return includes(GeneralUnrecoverableAppFailureTypes, toCheck.type);\n}\n\nexport function isSessionBootstrapFailure(toCheck: unknown): toCheck is SessionBootstrapFailure {\n    if (!toCheck || typeof toCheck !== 'object') {\n        return false;\n    }\n\n    if (!hasKey(toCheck, 'type') || toCheck.type !== 'sessionBootstrapError') {\n        return false;\n    }\n\n    if (hasKey(toCheck, 'status') && !['undefined', 'number'].includes(typeof toCheck.status)) {\n        return false;\n    }\n\n    if (!hasKey(toCheck, 'failedStep') || typeof toCheck.failedStep !== 'string') {\n        return false;\n    }\n\n    return includes(SessionBootstrapSteps, toCheck.failedStep);\n}\n\nexport function isUnrecoverableAppFailure(toCheck: unknown): toCheck is UnrecoverableAppFailure {\n    return isGeneralUnrecoverableAppFailure(toCheck) || isSessionBootstrapFailure(toCheck);\n}\n\ntype UnrecoverableAppFailure = GeneralUnrecoverableAppFailure | SessionBootstrapFailure;\n\nexport default UnrecoverableAppFailure;\n","import { computed } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport DS from 'ember-data';\nimport { formatDateForDisplay } from 'web-directory/utils/date-time';\n\nvar UserModel = DS.Model.extend({\n    _id: DS.attr(),\n    lang: DS.attr(),\n    personId: DS.attr(),\n    personGuid: DS.attr(),\n    state: DS.attr(),\n    version: DS.attr(),\n    mt: DS.attr(),\n    email: DS.attr(),\n    welcomeSent: DS.attr(),\n    lastLogin: DS.attr(),\n    clientVersions: DS.attr(),\n    userType: DS.attr(),\n    passwordSaved: DS.attr(),\n    orgId: DS.attr(),\n\n    intl: service(),\n\n    person: computed('personGuid', function () {\n        return this.store.find('person', this.get('personGuid'));\n    }),\n\n    isAdmin: computed('userType', function () {\n        return this.get('userType') === 'admin';\n    }),\n\n    isSuper: computed('userType', function () {\n        return this.get('userType') === 'super';\n    }),\n\n    userState: computed('state', function () {\n        return this.get('intl').safestring(`item.state.${this.get('state')}`);\n    }),\n\n    inviteLastSent: computed('welcomeSent', function () {\n        const welcomeSent = this.get('welcomeSent');\n        if (welcomeSent == null) {\n            return '';\n        }\n        // welcomeSent is a Unix timestamp in seconds; convert to milliseconds for Date\n        const date = new Date(welcomeSent * 1000);\n        return formatDateForDisplay(date.toISOString(), 'short');\n    })\n});\n\nUserModel.reopenClass({\n    apiEndpoint: 'v2/users'\n});\n\nexport default UserModel;\n","import DS from 'ember-data';\nimport Communication from './communication';\n\nexport default Communication.extend({\n    // ----------------------------------------------------------------------------\n    // Raw Properties\n    // ----------------------------------------------------------------------------\n\n    context: DS.attr(),\n    audioMuted: DS.attr(),\n    videoMuted: DS.attr(),\n    sharingScreen: DS.attr(),\n    peerCount: DS.attr(),\n    msids: DS.attr(),\n\n    update(comUpdate) {\n        this._super(...arguments);\n\n        const updatableAttrs = ['context', 'audioMuted', 'videoMuted', 'sharingScreen', 'peerCount', 'msids'];\n\n        const updateProperties = {};\n        for (const updatable of updatableAttrs) {\n            const updatedValue = comUpdate[updatable];\n            if (typeof updatedValue !== 'undefined') {\n                updateProperties[updatable] = updatedValue;\n            }\n        }\n\n        this.setProperties(updateProperties);\n    }\n});\n","import { reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport EmberObject, { computed } from '@ember/object';\nimport RSVP from 'rsvp';\n\nconst ZERO_BITRATE_THRESHOLD = 2;\n\nexport default EmberObject.extend({\n    webrtc: service(),\n    intl: reads('webrtc.intl'),\n    store: service(),\n\n    // passed in on creation\n    currentUserId: null,\n    pcParticipant: null,\n    pcConversation: null,\n    conversation: null,\n\n    // local state\n    major: false,\n    domId: null,\n    hasConnected: false,\n\n    zeroBitrateCount: 0,\n    positiveBitrateCount: 0,\n\n    selected: computed('conversation.pinnedParticipantId', function () {\n        const pinnedId = this.get('conversation.pinnedParticipantId');\n\n        return pinnedId === this.get('pcParticipant.id');\n    }),\n\n    // computed based on conversation state\n    local: computed('pcParticipant.userId', 'currentUserId', function () {\n        return this.get('pcParticipant.userId') === this.currentUserId;\n    }),\n    person: computed('pcParticipant.userId', function () {\n        const userId = this.get('pcParticipant.userId');\n        if (!userId) {\n            return RSVP.resolve(null);\n        }\n        const p = this.store.peekRecord('person', userId);\n        return p || this.store.findRecord('person', userId);\n    }),\n    jid: reads('person.jid'),\n    name: computed('person.name', 'pcParticipant.name', function () {\n        return this.get('person.name') || this.get('pcParticipant.name') || this.intl.t('ewc.unknownParticipant');\n    }),\n    audioMuted: computed('pcParticipant.videos.@each.audioMuted', function () {\n        return this.pcParticipant && !!this.get('pcParticipant.videos').findBy('audioMuted', true);\n    }),\n    videoMuted: computed('pcParticipant.videos.@each.videoMuted', function () {\n        return this.pcParticipant && !!this.get('pcParticipant.videos').findBy('videoMuted', true);\n    }),\n    sharingScreen: computed('pcParticipant.videos.@each.sharingScreen', function () {\n        return this.pcParticipant && !!this.get('pcParticipant.videos').findBy('sharingScreen', true);\n    }),\n    connectionState: computed('pcParticipant.videos.@each.state', function () {\n        return this.get('pcParticipant.videos.firstObject.state') || 'disconnected';\n    }),\n    getIncomingTracks(kind) {\n        const tracks = this.get('conversation.sessions.firstObject.tracks');\n        if (tracks && tracks.length) {\n            return tracks.filter(track => track.kind === kind);\n        }\n\n        return [];\n    },\n    participantTrackInfo: computed('conversation.trackOwners', 'pcParticipant.userId', function () {\n        const trackOwners = this.get('conversation.trackOwners');\n\n        if (!trackOwners) {\n            return null;\n        }\n\n        return trackOwners.find(info => info.userId === this.get('pcParticipant.userId'));\n    }),\n    // determines whether this participant is active on the incoming track (showing video for video track or speaking for audio track)\n    isParticipantOnIncomingTrack(mediaTypes, incomingTrackId) {\n        const participantInfo = this.participantTrackInfo;\n        const participantIsOnTrack =\n            participantInfo &&\n            participantInfo.tracks.some(trackInfo => {\n                return (\n                    mediaTypes.includes(trackInfo.mediaType) &&\n                    trackInfo.sinks &&\n                    trackInfo.sinks.includes(incomingTrackId)\n                );\n            });\n\n        return participantIsOnTrack;\n    },\n    isOnIncomingVideoTrack: computed('conversation.trackOwners', function () {\n        const incomingVideoTracks = this.getIncomingTracks('video');\n        const videoTrack = incomingVideoTracks.length && incomingVideoTracks[0];\n\n        if (!videoTrack) {\n            return null;\n        }\n\n        return this.isParticipantOnIncomingTrack(['video'], videoTrack.id);\n    }),\n    speaking: computed('conversation.trackOwners', 'audioMuted', function () {\n        const incomingAudioTracks = this.getIncomingTracks('audio');\n        const audioTrack = incomingAudioTracks.length && incomingAudioTracks[0];\n\n        if (!audioTrack) {\n            return null;\n        }\n\n        return !this.audioMuted && this.isParticipantOnIncomingTrack(['audio'], audioTrack.id);\n    }),\n    screenStream: null, // todo: computed\n    screenStreamStart: computed('screenStream', function () {\n        return this.get('screenStream') ? Date.now() : null;\n    }),\n    showAvatar: computed(\n        'videoMuted',\n        'sharingScreen',\n        'connectionState',\n        'isOffline',\n        'screenStream',\n        'zeroBitrateCount',\n        'positiveBitrateCount',\n        'local',\n        'pcParticipant.purpose',\n        function () {\n            if (this.get('pcParticipant.purpose') !== 'user' || this.local) {\n                return this.videoMuted;\n            }\n\n            const videoMuted = this.videoMuted;\n            const sharingScreen = this.sharingScreen || this.screenStream;\n            const state = this.connectionState;\n            const isOffline = this.isOffline;\n            const zeroBitrateCount = this.zeroBitrateCount;\n\n            if (\n                ['failed', 'checking', 'starting'].includes(state) ||\n                isOffline ||\n                zeroBitrateCount >= ZERO_BITRATE_THRESHOLD\n            ) {\n                return true;\n            }\n\n            return !sharingScreen && videoMuted;\n        }\n    ),\n\n    avatarDisplay: computed('showAvatar', function () {\n        return this.showAvatar ? 'avatar-visible' : 'avatar-hidden';\n    }),\n\n    isOffline: computed('connectionState', 'person.presence', 'zeroBitrateCount', 'pcParticipant.purpose', function () {\n        if (this.local || this.get('pcParticipant.purpose') !== 'user') {\n            return false;\n        }\n\n        const connectionState = this.connectionState;\n        const presence = this.get('person.presence');\n        const hasOfflinePresence = this.person && (!presence || presence === 'offline');\n        const zeroBitrateCount = this.zeroBitrateCount;\n\n        return (\n            connectionState === 'disconnected' ||\n            connectionState === 'interrupted' ||\n            hasOfflinePresence ||\n            zeroBitrateCount >= ZERO_BITRATE_THRESHOLD\n        );\n    }),\n\n    connectionStatus: computed('connectionState', 'isOffline', 'zeroBitrateCount', function () {\n        const intl = this.intl;\n        const state = this.connectionState;\n        if (state === 'connected' || state === 'completed') {\n            this.set('hasConnected', true);\n        }\n        if (\n            (state === 'checking' || this.isOffline || this.zeroBitrateCount >= ZERO_BITRATE_THRESHOLD) &&\n            this.hasConnected\n        ) {\n            return intl.t('ewc.callStatus.recovering').toString();\n        } else if (state) {\n            return intl.t(`ewc.callStatus.${state}`).toString();\n        }\n    }),\n\n    canBeMuted: computed('audioMuted', 'local', 'pcParticipant.purpose', function () {\n        return !!(!this.audioMuted && !this.local && this.pcParticipant);\n    })\n});\n","import { reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport EmberObject, { computed } from '@ember/object';\n\nconst ZERO_BITRATE_THRESHOLD = 2;\n\nexport default EmberObject.extend({\n    webrtc: service(),\n    intl: reads('webrtc.intl'),\n\n    local: false,\n    person: null,\n    audioMuted: false,\n    videoMuted: false,\n    sharingScreen: false, // deprecated. V1 only\n    major: false,\n    selected: false,\n    connectionState: null,\n    domId: null,\n    hasConnected: false,\n    inLastN: false,\n    cameraStream: null,\n    screenStream: null,\n    tracks: [],\n    sessionId: null,\n    isV1: false,\n    startedVideoMuted: false, // HACK: PCDWEBK-3216; bridge doesn't play well with people who don't join with video\n    associatedInteraction: null,\n    zeroBitrateCount: 0,\n    positiveBitrateCount: 0,\n    screenTrack: null,\n\n    cameraTrack: computed('tracks.[]', function () {\n        return this.tracks.find(track => track.kind === 'video');\n    }),\n\n    audioTrack: computed('tracks.[]', function () {\n        return this.tracks.find(track => track.kind === 'audio');\n    }),\n\n    jid: reads('person.jid'),\n\n    name: computed('person.name', 'associatedInteraction.customerName', function () {\n        return (\n            this.get('person.name') ||\n            this.get('associatedInteraction.customerName') ||\n            this.intl.t('ewc.unknownParticipant')\n        );\n    }),\n\n    useTrackBasedActions: computed('associatedInteraction.isScreenShare', function () {\n        return this.webrtc.canUseTrackBasedActions(this.associatedInteraction);\n    }),\n\n    screenStreamStart: computed('screenStream', function () {\n        return this.get('screenStream') ? Date.now() : null;\n    }),\n\n    // HACK PCDWEBK-2982: remove when video bridge send video when you dont provide it\n    noVideoTrack: computed('cameraStream', 'isV1', 'useTrackBasedActions', function () {\n        if (this.isV1 || this.useTrackBasedActions) {\n            return false;\n        }\n\n        const stream = this.cameraStream;\n        return !(stream && stream.getVideoTracks().length);\n    }),\n\n    speaking: false,\n\n    mediaPresence: reads('person.mediaPresence'),\n\n    _getInteractionAvatarDisplay() {\n        if (this.videoMuted) {\n            return true;\n        }\n        return false;\n    },\n\n    showAvatar: computed(\n        'videoMuted',\n        'sharingScreen',\n        'connectionState',\n        'inLastN',\n        'isOffline',\n        'noVideoTrack',\n        'screenStream',\n        'zeroBitrateCount',\n        'positiveBitrateCount',\n        function () {\n            if (this.associatedInteraction) {\n                return this._getInteractionAvatarDisplay();\n            }\n\n            const videoMuted = this.videoMuted;\n            const sharingScreen = this.sharingScreen || this.screenStream;\n            const state = this.connectionState;\n            const isOffline = this.isOffline;\n            const inLastN = this.inLastN;\n            const noVideo = this.noVideoTrack && !sharingScreen;\n            const zeroBitrateCount = this.zeroBitrateCount;\n\n            if (\n                ['failed', 'checking', 'starting'].includes(state) ||\n                isOffline ||\n                noVideo ||\n                zeroBitrateCount >= ZERO_BITRATE_THRESHOLD\n            ) {\n                return true;\n            }\n            if (!inLastN) {\n                if (this.positiveBitrateCount > 3) {\n                    console.warn('hiding avatar for !inLastN && positiveBitrateCount > 3', {\n                        remoteData: {\n                            id: this.get('person.id'),\n                            conversationId: this.get('associatedInteraction.id')\n                        }\n                    });\n                    return false;\n                }\n                return true;\n            }\n            return !sharingScreen && videoMuted;\n        }\n    ),\n\n    avatarDisplay: computed('showAvatar', function () {\n        return this.showAvatar ? 'avatar-visible' : 'avatar-hidden';\n    }),\n\n    isOffline: computed('connectionState', 'person.presence', 'zeroBitrateCount', function () {\n        if (this.local || this.associatedInteraction) {\n            return false;\n        }\n\n        const connectionState = this.connectionState;\n        const presence = this.get('person.presence');\n        const hasOfflinePresence = this.person && (!presence || presence === 'offline');\n        const zeroBitrateCount = this.zeroBitrateCount;\n\n        return (\n            connectionState === 'disconnected' ||\n            connectionState === 'interrupted' ||\n            hasOfflinePresence ||\n            zeroBitrateCount >= ZERO_BITRATE_THRESHOLD\n        );\n    }),\n\n    connectionStatus: computed('connectionState', 'isOffline', 'zeroBitrateCount', function () {\n        const intl = this.intl;\n        const state = this.connectionState;\n        if (state === 'connected' || state === 'completed') {\n            this.set('hasConnected', true);\n        }\n        if (\n            (state === 'checking' || this.isOffline || this.zeroBitrateCount >= ZERO_BITRATE_THRESHOLD) &&\n            this.hasConnected\n        ) {\n            return intl.t('ewc.callStatus.recovering').toString();\n        } else if (state) {\n            return intl.t(`ewc.callStatus.${state}`).toString();\n        }\n    }),\n\n    canBeMuted: computed('audioMuted', 'local', 'associatedInteraction', function () {\n        return !this.audioMuted && !this.local && !this.associatedInteraction;\n    })\n});\n","import { Promise } from 'rsvp';\nimport { run } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport { computed } from '@ember/object';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport moment from '../utils/dates';\nimport BrowserUtils from 'web-directory/utils/browser';\n\nvar VoicemailMessageModel = DS.Model.extend({\n    conversation: DS.attr(),\n    read: DS.attr(),\n    audioRecordingDurationSeconds: DS.attr(),\n    audioRecordingSizeBytes: DS.attr(),\n    createdDate: DS.attr(),\n    modifiedDate: DS.attr(),\n    callerAddress: DS.attr(),\n    callerName: DS.attr(),\n    callerUser: DS.attr(),\n    name: DS.attr(),\n    selfUri: DS.attr(),\n    parentIds: DS.attr(),\n    group: DS.attr(),\n    note: DS.attr(),\n    copiedTo: DS.attr(),\n    copiedFrom: DS.attr(),\n    otherParties: DS.attr(),\n    displayName: DS.attr(),\n    dnis: DS.attr(),\n\n    ajax: service(),\n    session: service(),\n\n    init() {\n        this._super(...arguments);\n        // we will call this method in inbox service when loading voicemails when this feature toggle is enabled.\n        // no need to call here while toggle is enabled.\n        this.loadParticipants();\n    },\n\n    type: 'voicemail',\n\n    date: computed('createdDate', function () {\n        return this.createdDate;\n    }),\n\n    mediaUri: computed('media.mediaFileUri', function () {\n        return this.get('media.mediaFileUri');\n    }),\n\n    caller: computed('callerAddress', 'callerName', function () {\n        return this.callerName || this.callerAddress || 'Not Available';\n    }),\n\n    dateFromNow: computed('createdDate', function () {\n        var createdDate = this.createdDate;\n        if (createdDate) {\n            return moment(createdDate).fromNow();\n        }\n    }),\n\n    audioSource: computed('id', function () {\n        const formatId = BrowserUtils.getSuggestedAudioTypeFrom(['webm', 'wav']);\n        return this.fetchAudio(formatId).then(({ mediaFileUri }) => mediaFileUri);\n    }),\n\n    isGroupVoicemail: computed('group.{id,name}', function () {\n        const group = this.group;\n        return !_.isEmpty(group) && group.id && group.name;\n    }),\n\n    groupEntity: computed('group.entity', function () {\n        const id = this.get('group.id');\n        return this.store.findRecord('group', id, { reload: false, backgroundReload: false });\n    }),\n\n    loadParticipants: function () {\n        if (this.callerUser || this.isGroupVoicemail) {\n            return;\n        }\n        const conversationId = this.get('conversation.id');\n        if (this.conversation) {\n            return this.loadEPCConversation(conversationId);\n        }\n    },\n\n    loadEPCConversation: async function (conversationId) {\n        let conversation;\n        try {\n            conversation = await this.store.findRecord('conversation', conversationId);\n        } catch (err) {\n            console.warn('Failed to load conversation for voicemail', { err });\n            return;\n        }\n\n        const participants = conversation.get('participants');\n        const userId = this.get('session.person.guid');\n        const participant = participants.find(participant => {\n            return participant.get('userId') !== userId;\n        });\n\n        if (participant) {\n            const userId = participant.get('userId');\n            if (userId) {\n                this.set('callerUser', { id: userId });\n            }\n\n            let callerName = participant.get('name');\n            if (!callerName) {\n                callerName = await this.fetchCallerName(userId);\n            }\n\n            this.set('callerName', callerName);\n        }\n\n        this.set('participants', participants);\n    },\n\n    fetchCallerName: function (userId) {\n        return this.store\n            .findRecord('public-api-user', userId)\n            .then(user => user.get('name'))\n            .catch(err => {\n                console.warn('Failed to fetch person name for voicemail', { err });\n                return '';\n            });\n    },\n\n    fetchAudio: function (formatId, forceReload) {\n        forceReload = forceReload || false;\n\n        var resolver;\n        var media = this.media;\n        if (media && !forceReload) {\n            resolver = function (resolve) {\n                resolve(media);\n            };\n        } else {\n            var adapter = this.store.adapterFor('voicemail-message');\n            var endpoint = adapter.buildURL('voicemailMessage', this.id + '/media');\n\n            resolver = (resolve, reject) => {\n                this.ajax\n                    .ajaxGet(endpoint, {\n                        data: { formatId },\n                        headers: adapter.headers,\n                        contentType: 'application/json; charset=UTF-8',\n                        cache: false\n                    })\n                    .then(\n                        data => {\n                            this.set('media', data);\n\n                            run(null, resolve, data);\n                        },\n                        reason => {\n                            // var msg = Ember.get(reason, 'responseJSON.message');\n                            this.set('media', {\n                                failed: 'Failed to load voicemail message'\n                            });\n                            reject(reason);\n                        }\n                    );\n            };\n        }\n\n        return new Promise(resolver);\n    }\n});\n\nVoicemailMessageModel.reopenClass({\n    apiEndpoint: 'v2/voicemail/messages'\n});\n\nexport default VoicemailMessageModel;\n\n/*\nVoicemailMessage {\nconversation (UserCall, optional),\nread (boolean, optional),\naudioRecordingDurationSeconds (integer, optional),\naudioRecordingSizeBytes (integer, optional),\ncreatedDate (string, optional),\nmodifiedDate (string, optional),\ncallerAddress (string, optional),\ncallerName (string, optional),\ncallerUser (User, optional),\nname (string, optional),\nid (string, optional),\nselfUri (URI, optional),\nparentIds (array[Object], optional)\n}\n*/\n\n/*\n    this is separate endpiont from the message list????\n\nVoicemailMediaInfo {\nmediaFileUri (URI, optional),\nmediaImageUri (URI, optional),\nname (string, optional),\nselfUri (URI, optional),\nid (string, optional),\nparentIds (array[Object], optional)\n}\n*/\n","import { inject as service } from '@ember/service';\nimport { reads, equal, notEmpty, and, not } from '@ember/object/computed';\nimport { A } from '@ember/array';\nimport { getOwner } from '@ember/application';\nimport EmberObject, { observer, computed, set } from '@ember/object';\nimport Evented from '@ember/object/evented';\nimport { run, debounce } from '@ember/runloop';\nimport RSVP from 'rsvp';\nimport Participant from './video-participant';\nimport ParticipantV2 from './video-participant-v2';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport ConversationSessionEvents from 'web-directory/mixins/webrtc-conversation-session-events';\nimport ConversationAnalysis from 'web-directory/mixins/webrtc-conversation-analysis';\nimport webrtcConversationTypes from 'web-directory/utils/webrtc-conversation-types';\n\nconst PENDING_SESSION_WAIT = 3000;\n\nconst conversationStates = {\n    PREPARING: 'preparing',\n    PENDING: 'pending',\n    ACTIVE: 'active',\n    IDLE: 'idle',\n    ENDING: 'ending',\n    ENDED: 'ended'\n};\n\nexport default EmberObject.extend(LoggerMixin, Evented, ConversationSessionEvents, ConversationAnalysis, {\n    id: reads('pcConversation.id'),\n    room: null,\n    conversationId: null,\n    conversationType: null,\n    localMedia: null,\n    currentCameraTrack: null,\n    currentMicTrack: null,\n    currentScreenTrack: null,\n    sessions: null,\n    knownSessions: null,\n    pendingStreamInfos: null,\n    conversationStart: null,\n    hasPrepared: false,\n    hasJoined: false,\n    joinedWithoutMedia: false,\n    preparingToJoin: false,\n    outgoingSessionRequests: null,\n    isOneToOne: false,\n    isConnected: false,\n    ending: false,\n    interruptions: 0,\n    foundedVideoNotifications: null,\n    unfoundedVideoNotifications: null,\n    currentLastN: null,\n    screenRecordingStream: null,\n    trackOwners: null,\n    waitingForScreenStream: false,\n    pinnedParticipantId: null,\n    jid: null,\n\n    application: reads('webrtc.application'),\n    intl: reads('webrtc.intl'),\n    session: reads('webrtc.session'),\n    presenceSubscription: reads('webrtc.presenceSubscription'),\n    webrtc: service(),\n    ajax: service(),\n    conversationService: reads('webrtc.conversationService'),\n    notification: reads('webrtc.notification'),\n    participantPurpose: reads('conversation.myParticipants.firstObject.purpose'),\n\n    localCameraStream: null,\n    localScreenStream: null,\n\n    _participants: null,\n    participants: computed(\n        'usePcConversationModelParticipants',\n        'pcConversation.participants.@each.activeCommunications',\n        '_participants',\n        'isOneToOne',\n        'isScreenShare',\n        function () {\n            if (!this.usePcConversationModelParticipants) {\n                return this._participants;\n            }\n\n            const conversation = this.pcConversation;\n            if (!conversation) {\n                return [];\n            }\n            const owner = getOwner(this) ? getOwner(this).ownerInjection() : null;\n            return A(\n                conversation\n                    .get('participants')\n                    .filter(p => {\n                        const videos = p.get('activeCommunications.videos');\n                        const screenshares = this.isAcdScreenShareViaHawk\n                            ? p.get('activeCommunications.screenshares')\n                            : null;\n                        return (videos && videos.length > 0) || (screenshares && screenshares.length > 0);\n                    })\n                    .map(p =>\n                        ParticipantV2.create(\n                            {\n                                pcParticipant: p,\n                                pcConversation: conversation,\n                                currentUserId: this.get('session.person.guid'),\n                                conversation: this\n                            },\n                            owner\n                        )\n                    )\n            ).sortBy('person.name');\n        }\n    ),\n\n    pinnedParticipant: computed('participants', 'pinnedParticipantId', function () {\n        return this.participants.findBy('selected', true);\n    }),\n\n    useTrackBasedActions: computed('jid', 'isScreenShare', function () {\n        return this.webrtc.canUseTrackBasedActions(this);\n    }),\n\n    usePcConversationModelParticipants: computed('isOneToOne', 'jid', 'isScreenShare', function () {\n        if (this.isScreenShare) {\n            return true;\n        }\n\n        return this.webrtc.shouldUseApiByJid(this.jid) && !this.isOneToOne;\n    }),\n\n    pcConversation: computed('conversationId', 'conversationService.activeConversations.[]', function () {\n        const conversationService = this.conversationService;\n        const conversationId = this.conversationId;\n        if (conversationId) {\n            return conversationService.get('activeConversations').findBy('id', conversationId);\n        }\n    }),\n\n    isPreparing: equal('_state', conversationStates.PREPARING),\n    isIdle: equal('_state', conversationStates.IDLE),\n    isActive: equal('_state', conversationStates.ACTIVE),\n    isPending: equal('_state', conversationStates.PENDING),\n    isEnding: equal('_state', conversationStates.ENDING),\n    isEnded: equal('_state', conversationStates.ENDED),\n\n    _state: computed('preparingToJoin', 'isConnected', 'sessions.[]', 'ending', function () {\n        const sessions = this.sessions || A();\n        if (this.preparingToJoin) {\n            return conversationStates.PREPARING;\n        }\n        if (this.ending) {\n            return conversationStates.ENDING;\n        }\n        if (!sessions.length) {\n            return conversationStates.IDLE;\n        }\n        if (sessions.findBy('active', true) || sessions.findBy('pending', true)) {\n            return conversationStates.ACTIVE;\n        }\n        if (sessions.findBy('ended', true)) {\n            return conversationStates.ENDED;\n        }\n    }),\n\n    hasPendingSessionRequest: notEmpty('outgoingSessionRequests'),\n\n    _removeOutgoingSessionRequestById(sessionId) {\n        let pending;\n        const outgoing = this.outgoingSessionRequests;\n        if (outgoing.length === 1 && outgoing[0].id === -1) {\n            pending = outgoing[0];\n        } else {\n            pending = outgoing.find(r => r.id === sessionId);\n        }\n        if (pending) {\n            this.outgoingSessionRequests.removeObject(pending);\n        }\n    },\n\n    issue: computed(\n        'mutedByOther',\n        'hardwareAudioMute',\n        'audioBitrateZero',\n        'bridgeDownError',\n        'failedToConnectSession',\n        'talkingWhileMuted',\n        function () {\n            if (this.mutedByOther) {\n                return {\n                    name: 'userMute',\n                    info: this.mutedByOther\n                };\n            }\n            if (this.hardwareAudioMute) {\n                return {\n                    name: 'hardwareMute',\n                    info: null\n                };\n            }\n            if (this.audioBitrateZero) {\n                return {\n                    name: 'bitrateZero',\n                    info: null\n                };\n            }\n            if (this.bridgeDownError || this.failedToConnectSession) {\n                return {\n                    name: 'networkIssue',\n                    info: null\n                };\n            }\n            if (this.talkingWhileMuted) {\n                return {\n                    name: 'talkingWhileMuted',\n                    info: this.talkingWhileMuted\n                };\n            }\n            return null;\n        }\n    ),\n\n    hasPeers: computed('participants.[]', function () {\n        const participants = this.participants;\n        return participants.length && participants.find(p => !p.get('local'));\n    }),\n\n    localParticipant: computed('participants.[]', function () {\n        return this.participants.find(p => p.get('local'));\n    }),\n\n    // PCM-244 translates to the media purpose used by media controller to determine type\n    mediaPurpose: computed('isScreenRecording', 'isScreenShare', function () {\n        if (this.isScreenRecording) {\n            return 'screenRecording';\n        }\n\n        return undefined;\n    }),\n\n    init() {\n        this._super(...arguments);\n        if (this.room) {\n            this.set('isOneToOne', this.room.isOneToOneRoom());\n        }\n\n        this.set('pendingStreamInfos', {}); // {msid: {stream, session, timeout}}\n        this.set('_participants', A());\n        this.set('outgoingSessionRequests', A());\n        this.set('sessions', A());\n        this.set('foundedVideoNotifications', A());\n        this.set('unfoundedVideoNotifications', A());\n        this.set('knownSessions', A());\n\n        this.webrtc.on('mediaChange', this, this._handleMediaChange);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        this.webrtc.off('mediaChange', this, this._handleMediaChange);\n\n        // Cancel the debounced listener-peer removal so a pending ~1s timer cannot fire after\n        // teardown and leak into a later test. See .kiro/skills/fix-timer-leaks.md. Use != null\n        // rather than a truthy check: backburner timer ids start at 0, so a falsy check would skip\n        // cancelling the first timer ever scheduled.\n        if (this._removeListenerPeerTimer != null) {\n            run.cancel(this._removeListenerPeerTimer);\n            this._removeListenerPeerTimer = null;\n        }\n    },\n\n    cleanupLocalMedia() {\n        if (this.localMedia) {\n            this.localMedia.stop();\n            this.localMedia.stopScreenShare();\n            this.set('localMedia', null);\n        }\n    },\n\n    isScreenShare: equal('conversationType', webrtcConversationTypes.ENGAGE_SCREENSHARE),\n    isSoftphone: equal('conversationType', webrtcConversationTypes.SOFTPHONE),\n    isScreenRecording: equal('conversationType', webrtcConversationTypes.ENGAGE_SCREEN_RECORDING),\n    isCollaborate: equal('conversationType', webrtcConversationTypes.COLLABORATE_VIDEO),\n    isOneToOneCollaborate: and('isCollaborate', 'isOneToOne'),\n    isGroupCollaborate: computed('isCollaborate', 'isOneToOne', function () {\n        return this.isCollaborate && !this.isOneToOne;\n    }),\n\n    isAcdScreenShareViaHawk: computed('isScreenShare', 'jid', function () {\n        return this.isScreenShare && this.webrtc.shouldUseHawkByJid(this.jid);\n    }),\n\n    // eslint-disable-next-line ember/no-observers\n    _updateMajorByLastN: observer('participants.@each.inLastN', function () {\n        this._updateMajor();\n    }),\n\n    rawTrackOwners: computed('trackOwners', function () {\n        if (this.trackOwners) {\n            return JSON.stringify(this.trackOwners, null, 2);\n        }\n\n        return 'None';\n    }),\n\n    getNativePeerConnection(session) {\n        if (session.pc.pc) {\n            return session.pc.pc;\n        }\n\n        return session.pc;\n    },\n\n    _updateMajor() {\n        const participants = this.participants;\n        if (!this.usePcConversationModelParticipants) {\n            if (participants.length && !participants.findBy('major', true)) {\n                const majorParticipant =\n                    participants.find(participant => !participant.get('local')) || this.localParticipant;\n                return majorParticipant.set('major', true);\n            }\n        } else {\n            if (participants.length === 1) {\n                participants[0].set('major', true);\n            } else if (participants.length > 1) {\n                let newMajor = participants.find(p => p.get('inLastN') && !p.get('local'));\n                if (!newMajor) {\n                    newMajor = participants[0];\n                }\n                newMajor.set('major', true);\n                participants.forEach(p => {\n                    if (p !== newMajor) {\n                        p.set('major', false);\n                    }\n                });\n            }\n        }\n    },\n\n    _getSessionPeer(session, msid, personId) {\n        return new RSVP.Promise((resolve, reject) => {\n            if (this.isOneToOne) {\n                resolve(this.get('room.oneToOneTarget'));\n            } else {\n                run.later(\n                    this,\n                    this._getPerson,\n                    {\n                        deferred: { resolve, reject },\n                        msid,\n                        personId,\n                        retryCount: 20\n                    },\n                    500\n                );\n            }\n        });\n    },\n\n    _getPerson(options) {\n        const { deferred, msid, personId, retryCount, repaired } = options;\n        if (!this.room) {\n            return;\n        }\n        const participants = this.get('room.participants');\n        const person = participants.find(participant => {\n            if (personId) {\n                return participant.get('id') === personId;\n            }\n            if (msid) {\n                const participantMediaActiveInRoom = participant.get('mediaPresence.roomJid') === this.get('room.jid');\n                const participantMedia = participant.get('mediaPresence.media');\n                const matchingMsid = participantMedia && participantMedia.find(mediaInfo => mediaInfo.msid === msid);\n\n                return participantMediaActiveInRoom && matchingMsid;\n            }\n\n            this.logger.warn('No msid or personId provided');\n            return false;\n        });\n\n        if (person) {\n            if (person === this.get('session.person')) {\n                this.logger.warn('getting session peer for self');\n            }\n            return deferred.resolve(person);\n        }\n        if (retryCount > 0) {\n            options.retryCount--;\n            return run.later(this, this._getPerson, options, 500);\n        }\n        const participantInfos = participants.map(function (participant) {\n            return {\n                id: participant.get('id'),\n                mediaPresence: participant.get('mediaPresence')\n            };\n        });\n        this.logger.error('Failed to get session peer for person', {\n            kind: 'participantError',\n            msid,\n            personId,\n            participantInfos\n        });\n        if (!repaired) {\n            return this.webrtc.repairRoomPresences().then(() => {\n                options.repaired = true;\n                options.retryCount = 3;\n                run.later(this, this._getPerson, options, 500);\n            });\n        }\n        return deferred.reject(new Error('Participant Error'));\n    },\n\n    _addParticipant(peer) {\n        let videoMuted = false;\n        let audioMuted = false;\n\n        if (peer) {\n            const oneToOne = this.isOneToOne;\n            const videoPresence = peer.get('mediaPresence.media.firstObject.video');\n            const audioPresence = peer.get('mediaPresence.media.firstObject.audio');\n            videoMuted = oneToOne ? false : !videoPresence || videoPresence === 'muted';\n            audioMuted = oneToOne ? false : !audioPresence || audioPresence === 'muted';\n        }\n\n        const owner = getOwner(this) ? getOwner(this).ownerInjection() : null;\n        const newParticipant = Participant.create(\n            {\n                videoMuted,\n                audioMuted,\n                person: peer,\n                associatedInteraction: this.get('room.associatedInteraction'),\n                inLastN: this.get('participants.length') <= 3 // TODO: this should be unified when last n is configurable\n            },\n            owner\n        );\n\n        this._participants.pushObject(newParticipant);\n\n        if (peer && this.isCollaborate) {\n            const knownParticipants = A(this.participants.filterBy('person'));\n\n            peer.reload().then(() => this.presenceSubscription.autoSubscribe(knownParticipants.mapBy('person'), this));\n        }\n        return newParticipant;\n    },\n\n    _handleDominantSpeakerChange(endpoint) {\n        const participants = this.participants;\n        const localParticipant = this.localParticipant;\n        const participant = participants.find(p => p.get('person.jid') === endpoint);\n\n        if (localParticipant === participant) {\n            return;\n        }\n\n        if (!participants.findBy('selected', true)) {\n            participants.forEach(p => p.set('major', p === participant && p !== localParticipant));\n        }\n        if (!participants.findBy('major', true)) {\n            const majorParticipant = participants.findBy('local', false) || this.localParticipant;\n            if (majorParticipant) {\n                majorParticipant.set('major', true);\n            }\n        }\n    },\n\n    _handleChannelMessage(channel, messageType, peer, data) {\n        if (!this.isCollaborate) {\n            this.logger.debug('Ignoring channel message for non-collaborate-video conversation');\n            return;\n        }\n\n        const participants = this.participants;\n        const peerId = peer.get('id');\n        let participant = participants.findBy('person.id', peerId);\n\n        if (!participant && messageType !== 'participantInfo') {\n            this.logger.warn('[Participant Error] Could not find participant for peer', {\n                remoteData: {\n                    peerId: peer.get('id'),\n                    kind: 'webrtcConversation'\n                }\n            });\n            this.webrtc.repairRoomPresences();\n            return;\n        }\n\n        if (channel === 'hark' && messageType === 'speaking') {\n            participant.set('speaking', true);\n            if (!participants.findBy('selected', true)) {\n                participants.forEach(p => p.set('major', p === participant));\n            }\n        } else if (channel === 'hark' && messageType === 'stoppedSpeaking') {\n            participant.set('speaking', false);\n        } else if (channel === 'video' && messageType === 'filter') {\n            participant.set('filter', data);\n        } else if (channel === 'video' && messageType === 'participantInfo') {\n            if (!participant) {\n                data.msids.forEach(msid => {\n                    const pending = this.get(`pendingStreamInfos.${msid}`);\n                    if (pending) {\n                        this.handleRemoteStreamIdentified(pending.stream, pending.session, peer.get('id'));\n                    }\n                });\n\n                participant = participants.findBy('person.id', peerId);\n\n                if (!participant) {\n                    return this.logger.warn('Could not identify or match participant info with any pending streams', {\n                        remoteData: {\n                            peerId: peer.get('id'),\n                            kind: 'webrtcConversation'\n                        }\n                    });\n                }\n            }\n\n            participant.set('endpointId', data.endpointId);\n        } else if (channel === 'audio' && messageType === 'requestMute') {\n            if (this.get('localParticipant.audioMuted') === false) {\n                this.toggleAudioMuted();\n            }\n\n            this.set('mutedByOther', participant.get('person.name'));\n        } else if (channel === 'stats') {\n            if (messageType === 'perspective') {\n                this.mergeStatsPerspective(participant, data);\n            }\n        }\n    },\n\n    // eslint-disable-next-line ember/no-observers\n    _checkLastN: observer('participants.@each.jid', 'currentLastN', function () {\n        if (this.usePcConversationModelParticipants) {\n            return;\n        }\n        const participants = this.participants;\n        const localParticipant = this.localParticipant;\n        participants.forEach(participant => {\n            const currentLastN = this.currentLastN;\n            const personJid = participant.get('person.jid') || '';\n            const inLastN =\n                this.isOneToOne ||\n                (currentLastN && currentLastN.find(personId => personJid.indexOf(personId) >= 0)) ||\n                participant === localParticipant;\n\n            participant.set('inLastN', !!inLastN);\n\n            if (!inLastN) {\n                participant.set('major', false);\n            }\n        });\n\n        if (!participants.any(p => p.get('major'))) {\n            const newMajor = participants.find(p => !p.get('local')) || this.localParticipant;\n            if (newMajor) {\n                newMajor.set('major', true);\n            }\n        }\n    }),\n\n    // eslint-disable-next-line ember/no-observers\n    _removeListenerPeer: observer(\n        'participants.@each.mediaPresence',\n        'usePcConversationModelParticipants',\n        function () {\n            if (this.usePcConversationModelParticipants) {\n                return;\n            }\n\n            // Don't schedule timers during teardown — they can't be cancelled\n            // by the test's afterEach and leak into the next test module.\n            if (this.isDestroying || this.isDestroyed) {\n                return;\n            }\n\n            if (!this.get('isOneToOne')) {\n                // Debounce rather than arm a fresh run.later on every mediaPresence change. A group\n                // call fires this observer once per participant per presence change, so an\n                // uncancelled run.later left one ~1s timer queued per change — each one leaking into\n                // a later test and forcing settled() to wait out the full second (the reason\n                // QUnit.config.testTimeout was raised to 6s). debounce coalesces the burst into a\n                // single handle we retain so willDestroy can cancel it.\n                this._removeListenerPeerTimer = debounce(this, this._removeListenerPeers, 1000);\n            }\n        }\n    ),\n\n    /**\n     * Removes participants that have no mediaPresence (listener-only peers) from the internal\n     * participants list. Invoked debounced from the participants.@each.mediaPresence observer.\n     */\n    _removeListenerPeers() {\n        if (this.isDestroying || this.isDestroyed) {\n            return;\n        }\n\n        const participants = this.participants;\n        if (!participants) {\n            return;\n        }\n\n        // Match the live Participant instances to remove. The previous implementation mapped to\n        // freshly-built { userId } plain objects and passed those to removeObjects, which compares by\n        // identity — so nothing was ever a member of _participants and the call was a silent no-op,\n        // meaning listener peers were never actually removed.\n        const listenerPeers = participants.filter(\n            participant =>\n                !participant.get('local') && participant.get('person') && !participant.get('person.mediaPresence')\n        );\n\n        if (listenerPeers.length) {\n            this.logger.info('removing listeners', {\n                remoteData: {\n                    participantsWithoutMediaPresence: listenerPeers.map(p => ({ userId: p.get('person.id') }))\n                }\n            });\n            this._participants.removeObjects(listenerPeers);\n        }\n    },\n\n    _sendMuteStates(session) {\n        const localMedia = this.localMedia;\n\n        run.later(\n            this,\n            function () {\n                if (!localMedia) {\n                    session.mute(this.get('session.person.id'), 'audio');\n                    session.mute(this.get('session.person.id'), 'video');\n                } else {\n                    const hasVideoTrack = localMedia.localStreams.some(stream => stream.getVideoTracks().length);\n                    const hasAudioTrack = localMedia.localStreams.some(stream => stream.getAudioTracks().length);\n\n                    if (!hasVideoTrack || !localMedia.isVideoEnabled()) {\n                        session.mute(this.get('session.person.id'), 'video');\n                    }\n\n                    if (!hasAudioTrack || !localMedia.isAudioEnabled()) {\n                        session.mute(this.get('session.person.id'), 'audio');\n                    }\n                }\n            },\n            500\n        );\n    },\n\n    _selectEndpoint(endpointId) {\n        const pinnedEndpointMessage = {\n            colibriClass: 'PinnedEndpointChangedEvent',\n            pinnedEndpoint: endpointId\n        };\n        const sessions = this.sessions;\n        if (sessions.length === 1 && sessions[0].connected && sessions[0].lastNChannel) {\n            sessions[0].lastNChannel.send(JSON.stringify(pinnedEndpointMessage));\n        }\n    },\n\n    _removeSession(session) {\n        session.callbacks = {};\n        this.sessions.removeObject(session);\n        if (session.connectionTimeout) session.connectionTimeout.cancel();\n        if (session.relayCandidatesTimeout) session.relayCandidatesTimeout.cancel();\n        if (session.interruptedTimeout) session.interruptedTimeout.cancel();\n    },\n\n    _addScreenStream(stream) {\n        let sessions = this.sessions;\n        sessions.forEach(function (session) {\n            session.addStream2(stream);\n        });\n    },\n\n    _updateMediaToPeers(media) {\n        let promise = RSVP.resolve();\n        this.sessions.forEach(session => {\n            if (this.getNativePeerConnection(session).connectionState === 'connected' && this.useTrackBasedActions) {\n                // remove all track and only use what's on the new media\n                const clearPromises = this.getNativePeerConnection(session)\n                    .getSenders()\n                    .map(sender => {\n                        if (sender.track) {\n                            return sender.replaceTrack(null);\n                        }\n\n                        return RSVP.resolve();\n                    });\n\n                promise = promise\n                    .then(() => RSVP.all(clearPromises))\n                    .then(() => {\n                        let newTrackPromises = [];\n                        media.localStreams.forEach(stream => {\n                            const promises = stream.getTracks().map(track => session.addTrack(track));\n                            newTrackPromises.push(...promises);\n                        });\n\n                        return RSVP.all(newTrackPromises);\n                    });\n            } else if (\n                this.getNativePeerConnection(session).connectionState === 'connected' &&\n                media.localStreams &&\n                media.localStreams[0]\n            ) {\n                let oldStream = session.pc.getLocalStreams()[0];\n\n                const screenStream = this.localScreenStream;\n                if (screenStream) {\n                    oldStream = session.pc.getLocalStreams().find(stream => stream !== screenStream);\n                }\n\n                if (oldStream) {\n                    promise = promise.then(() => session.switchStream(oldStream, media.localStreams[0]));\n                } else {\n                    promise = promise.then(() => session.addStream(media.localStreams[0]));\n                }\n            }\n        });\n\n        return promise;\n    },\n\n    _addVideoBack() {\n        return this.webrtc.createMedia({ requestAudio: false }).then(media => {\n            const videoTrack = media.localStreams[0].getVideoTracks()[0];\n            this.get('localMedia.localStreams.firstObject').addTrack(videoTrack);\n            this._updateLocalStreams();\n            return this.get('sessions.firstObject').addTrack(videoTrack);\n        });\n    },\n\n    _removeLocalVideoTrack() {\n        const localMedia = this.localMedia;\n        if (!localMedia) {\n            return;\n        }\n\n        const promises = [RSVP.resolve()];\n        localMedia.localStreams[0].getVideoTracks().forEach(track => {\n            promises.push(this.get('sessions.firstObject').removeTrack(track));\n            track.stop();\n            localMedia.localStreams[0].removeTrack(track);\n        });\n\n        this._updateLocalStreams();\n        return RSVP.all(promises);\n    },\n\n    _addEventsToLocalMedia(newMedia) {\n        if (!this.usePcConversationModelParticipants) {\n            if (newMedia.localStreams.length) {\n                this.set('localParticipant.cameraStream', newMedia.localStreams[0]);\n            } else {\n                newMedia.on('localStream', stream => {\n                    this.set('localParticipant.cameraStream', stream);\n                    this._updateLocalStreams();\n                });\n            }\n        }\n\n        newMedia.on('localScreen', stream => {\n            this.set('localScreenStream', stream);\n            this._removeLocalVideoTrack().then(() => {\n                const session = this.get('sessions.firstObject');\n                session.addTrack(stream.getVideoTracks()[0]);\n\n                if (!this.isOneToOne && this.get('webrtc.webrtcSessions').notifyScreenShareStart) {\n                    this.get('webrtc.webrtcSessions').notifyScreenShareStart(session);\n                }\n                this._updateLocalStreams();\n            });\n        });\n\n        newMedia.on('speaking', () => {\n            if (newMedia.hardMuted) {\n                return;\n            }\n            const localParticipant = this.localParticipant;\n            if (localParticipant) {\n                localParticipant.set('speaking', true);\n            }\n            return this.sendDirectlyToAll('hark', 'speaking');\n        });\n        newMedia.on('stoppedSpeaking', () => {\n            const localParticipant = this.localParticipant;\n            if (localParticipant) {\n                localParticipant.set('speaking', false);\n            }\n            return this.sendDirectlyToAll('hark', 'stoppedSpeaking');\n        });\n\n        const creatorId = this.get('session.person.id');\n        newMedia.on('audioOn', () => {\n            this.sessions.forEach(session => {\n                session.unmute(creatorId, 'audio');\n            });\n        });\n\n        newMedia.on('audioOff', () => {\n            const localParticipant = this.localParticipant;\n            localParticipant.set('speaking', false);\n            this.sessions.forEach(session => {\n                session.mute(creatorId, 'audio');\n            });\n        });\n\n        newMedia.on('videoOn', () => {\n            this.sessions.forEach(session => {\n                session.unmute(creatorId, 'video');\n            });\n        });\n\n        newMedia.on('videoOff', () => {\n            this.sessions.forEach(session => {\n                session.mute(creatorId, 'video');\n            });\n        });\n\n        const removeScreenStream = stream => {\n            stream.getTracks().forEach(track => track.stop());\n\n            this.set('localScreenStream', null);\n\n            const session = this.get('sessions.firstObject');\n\n            if (session.pc.getSenders().some(sender => sender.track && sender.track === stream.getVideoTracks()[0])) {\n                session.removeTrack(stream.getVideoTracks()[0]);\n            }\n\n            if (this.get('webrtc.webrtcSessions').notifyScreenShareStop) {\n                this.get('webrtc.webrtcSessions').notifyScreenShareStop(session);\n            }\n\n            if (this.shouldRestoreCameraStream) {\n                this.toggleVideoMuted();\n            }\n        };\n\n        // debounce this in case it's evented multiple times - only want to process the remove once\n        newMedia.on('localScreenStopped', stream => debounce(this, removeScreenStream, stream, 500));\n\n        if (newMedia.localScreens.length) {\n            return this._addScreenStream(newMedia.localScreens[0]);\n        }\n    },\n\n    applyFilter(filter) {\n        this.sendDirectlyToAll('video', 'filter', filter);\n        if (this.localParticipant) {\n            this.set('localParticipant.filter', filter);\n        }\n    },\n\n    canMuteOthers: not('conversation.isOneToOne'),\n\n    checkForListeners() {\n        if (!this.isActive || !this.room || this.usePcConversationModelParticipants) {\n            return;\n        }\n\n        const listeners = this.get('room.sortedParticipants').filter(person => {\n            const mediaPresence = person.get('mediaPresence');\n            return mediaPresence && mediaPresence.media[0].listener;\n        });\n\n        listeners.forEach(listener => {\n            if (!this.participants.any(p => p.get('person') === listener)) {\n                const participant = this._addParticipant(listener);\n                participant.setProperties({\n                    videoMuted: true,\n                    audioMuted: true,\n                    connectionState: 'listening'\n                });\n            }\n        });\n    },\n\n    updateTrackOwners(participants) {\n        this.set('trackOwners', participants);\n    },\n\n    updateSpeakers(speakers) {\n        this.set('rawSpeakers', speakers);\n    },\n\n    addLocalParticipant() {\n        if (this.localParticipant) {\n            return;\n        }\n\n        const owner = getOwner(this) ? getOwner(this).ownerInjection() : null;\n        const participant = Participant.create(\n            {\n                local: true,\n                major: true,\n                person: this.get('session.person'),\n                domId: 'local-video-container',\n                inLastN: true,\n                videoMuted: !this.get('webrtc.hasCamera'),\n                audioMuted: !this.get('webrtc.hasMicrophone')\n            },\n            owner\n        );\n\n        this._participants.unshiftObject(participant);\n    },\n\n    addSession(session, acceptImmediately) {\n        this.webrtc.mapSessionToConversation(session.sid, this);\n        const screenshare =\n            session.streams.length &&\n            session.streams[0].getVideoTracks().length >= 1 &&\n            !session.streams[0].getAudioTracks().length;\n\n        const pendingRequest = this.outgoingSessionRequests.findBy('id', session.sid);\n        if (pendingRequest) {\n            this.logger.info('Found pending outgoing session request for new session', {\n                remoteData: { sid: session.sid, conversationId: this.conversationId }\n            });\n            pendingRequest.get('timeoutTask').cancel();\n            this.outgoingSessionRequests.removeObject(pendingRequest);\n        }\n\n        this._setupSessionEvents(session);\n        this.sessions.pushObject(session);\n\n        let promise = RSVP.resolve();\n        if (session.state === 'pending' && (acceptImmediately || screenshare)) {\n            promise = this.acceptSession(session);\n        }\n\n        return promise.then(() => {\n            this.knownSessions.pushObject(session.sid);\n        });\n    },\n\n    muteParticipant(participant) {\n        if (this.get('session.person') === participant.person) {\n            this.toggleAudioMuted();\n        } else if (!this.canMuteOthers || !participant.get('canBeMuted')) {\n            // TODO: why is this case blank?\n        } else {\n            this.sendDirectly(participant.get('endpointId'), 'audio', 'requestMute');\n        }\n    },\n\n    _addStreamToParticipant(stream, participant, session) {\n        if (this.usePcConversationModelParticipants) {\n            return;\n        }\n        this.trigger('peerStreamAdded', stream);\n\n        const audioTracks = stream.getAudioTracks();\n        const videoTracks = stream.getVideoTracks();\n        const assumeScreenshareStream = videoTracks.length === 1 && !audioTracks.length;\n\n        if (!this.isOneToOne) {\n            participant.set('connectionState', 'connected');\n        } else {\n            participant.set('connectionState', session.connectionState);\n        }\n        participant.set('zeroBitrateCount', 0);\n\n        if (assumeScreenshareStream) {\n            participant.set('screenStream', stream);\n            this.trigger('screenStream', participant);\n\n            if (!this.participants.findBy('selected', true)) {\n                this.selectParticipant(participant);\n            }\n            participant.set('screenTrack', videoTracks[0]);\n        } else {\n            participant.set('cameraStream', stream);\n            this.trigger('cameraStream', participant);\n            participant.set('audioTrack', audioTracks[0]);\n            participant.set('videoTrack', videoTracks[0]);\n        }\n\n        if (this.get('localParticipant.major') && !this.get('localParticipant.selected')) {\n            this.set('localParticipant.major', false);\n            participant.set('major', true);\n        }\n    },\n\n    handleRemoteStreamIdentified(stream, session, personId) {\n        if (this.usePcConversationModelParticipants) {\n            return;\n        }\n        const pending = this.get(`pendingStreamInfos.${stream.id}`);\n\n        if (!pending) {\n            return;\n        }\n\n        run.cancel(pending.timeout);\n        delete this.pendingStreamInfos[stream.id];\n\n        let participant = this.participants.find(p => {\n            return (\n                p.get('person.id') === personId || p.get('cameraStream') === stream || p.get('screenStream') === stream\n            );\n        });\n\n        const person = this.get('room.participants').find(participant => participant.get('id') === personId);\n\n        if (!person) {\n            this.logger.warn('stream was identified but user was not found', {\n                remoteData: {\n                    personId,\n                    conversationId: this.conversationId\n                }\n            });\n        }\n\n        if (!participant) {\n            participant = this._addParticipant(person);\n        } else if (!participant.get('person')) {\n            participant.set('person', person);\n        }\n\n        this._addStreamToParticipant(stream, participant, session);\n    },\n\n    _handleMediaChange({ personId, media }) {\n        media.forEach(m => {\n            const pending = this.get(`pendingStreamInfos.${m.msid}`);\n            if (pending) {\n                this.handleRemoteStreamIdentified(pending.stream, pending.session, personId);\n            }\n        });\n    },\n\n    _updateDominantStream() {\n        const stream = this.get('sessions.firstObject.streams.firstObject');\n\n        this.set('_dominantStream', stream);\n    },\n\n    _updateLocalStreams() {\n        let cameraStream = this.get('localMedia.localStreams.firstObject');\n        if (!cameraStream || !cameraStream.getVideoTracks().length) {\n            cameraStream = null;\n        }\n\n        let screenStream = this.localScreenStream;\n\n        this.setProperties({\n            localCameraStream: cameraStream,\n            localScreenStream: screenStream\n        });\n\n        this.notifyPropertyChange('localCameraStream');\n    },\n\n    dominantStream: computed(\n        'participants.length',\n        '_dominantStream',\n        'localCameraStream',\n        'localScreenStream',\n        function () {\n            if (!this.usePcConversationModelParticipants) {\n                return;\n            }\n\n            if (this.get('participants.length') <= 1) {\n                return this.localScreenStream || this.localCameraStream;\n            }\n\n            return this._dominantStream;\n        }\n    ),\n\n    dominantStreamIsLocal: computed('dominantStream', function () {\n        return [this.localCameraStream, this.localScreenStream].includes(this.dominantStream);\n    }),\n\n    dominantParticipant: computed('participants.@each.isOnIncomingVideoTrack', function () {\n        this.logger.info('dominant participant change', this.dominantStream);\n        if (!this.dominantStream) {\n            return null;\n        }\n\n        return this.participants.findBy('isOnIncomingVideoTrack', true);\n    }),\n\n    dominantStreamIsScreenShare: reads('dominantParticipant.sharingScreen'),\n\n    showAvatarForDominantParticipant: reads('dominantParticipant.showAvatar'),\n\n    handleRemoteTrackAdded(session, track) {\n        if (this.usePcConversationModelParticipants) {\n            this._updateDominantStream();\n\n            if (!this.isOneToOne) {\n                return;\n            }\n        }\n\n        if (this.isSoftphone || this.isScreenRecording) {\n            return;\n        }\n\n        if (!this.isOneToOne && !this.isAcdScreenShareViaHawk) {\n            throw new Error('webrtc conferences v2 is deprecated');\n        }\n\n        const person = this.get('room.oneToOneTarget');\n        const personId = person ? person.get('id') : undefined;\n\n        if (!person) {\n            this.logger.warn('stream was identified but user was not found', {\n                remoteData: {\n                    personId,\n                    conversationId: this.conversationId\n                }\n            });\n        }\n\n        let participant = this.participants.find(p => p.get('person.id') === personId);\n\n        if (!participant) {\n            participant = this._addParticipant(person);\n        }\n\n        participant.tracks.push(track);\n    },\n\n    handleRemoteStreamAdded(session, stream) {\n        if (this.usePcConversationModelParticipants) {\n            this._updateDominantStream();\n            return;\n        }\n        if (stream.id === 'default' || this.get(`pendingStreamInfos.${stream.id}`)) {\n            return;\n        }\n\n        const timeout = run.later(\n            this,\n            () => {\n                const participant = this._addParticipant();\n                this._addStreamToParticipant(stream, participant, session);\n            },\n            PENDING_SESSION_WAIT\n        );\n\n        this.set(`pendingStreamInfos.${stream.id}`, { stream, session, timeout });\n\n        let owner;\n\n        if (this.isOneToOne) {\n            owner = this.get('room.oneToOneTarget');\n        } else {\n            owner = this.get('room.participants').find(participant => {\n                return (\n                    participant.get('mediaPresence.media') &&\n                    participant.get('mediaPresence.media').find(media => media.msid === stream.id)\n                );\n            });\n        }\n\n        if (owner) {\n            this.handleRemoteStreamIdentified(stream, session, owner.get('id'));\n        }\n    },\n\n    handleRemoteStreamRemoved(session, stream) {\n        if (this.usePcConversationModelParticipants) {\n            this._updateDominantStream();\n            return;\n        }\n\n        this.trigger('peerStreamRemoved', stream, session);\n\n        const participants = this.participants;\n        const participant = participants.find(p => {\n            return p.get('cameraStream') === stream || p.get('screenStream') === stream;\n        });\n\n        if (!participant) {\n            return this._updateMajor();\n        }\n\n        if (participant.get('screenStream') === stream) {\n            participant.set('screenStream', null);\n            participant.set('selected', false);\n        } else if (participant.get('cameraStream') === stream) {\n            participant.set('cameraStream', null);\n            participant.set('audioTrack', null);\n            participant.set('videoTrack', null);\n            this._removeParticipant.perform(participant, participants);\n        }\n    },\n\n    _getSessionAcceptParams(session) {\n        if (session.callInfo && session.callInfo.constraints) {\n            return {\n                constraints: session.callInfo.constraints\n            };\n        } else if (this.isScreenRecording) {\n            return {\n                constraints: {\n                    mandatory: {\n                        OfferToReceiveAudio: false,\n                        OfferToReceiveVideo: false\n                    }\n                }\n            };\n        }\n    },\n\n    _acceptSessionWithTrackBasedActions(session) {\n        this.logger.info('preparing to accept session with track based actions', {\n            remoteData: { sid: session.sid, conversationId: this.conversationId }\n        });\n        const localMedia = this.localMedia;\n        let promise = RSVP.resolve();\n\n        if (this.isCollaborate) {\n            if (!localMedia || !localMedia.localStreams[0].getVideoTracks().length) {\n                let videoTransceiver = this.getNativePeerConnection(session)\n                    .getTransceivers()\n                    .find(\n                        transceiver =>\n                            !transceiver.sender.track &&\n                            transceiver.receiver.track &&\n                            transceiver.receiver.track.kind === 'video'\n                    );\n\n                // make sure there's a video transceiver and the direction is sendrecv so we don't have to renego later\n                if (this.isOneToOne && !videoTransceiver) {\n                    this.getNativePeerConnection(session).addTransceiver('video', { direction: 'sendrecv' });\n                }\n\n                videoTransceiver.direction = 'sendrecv';\n            }\n        }\n\n        if (localMedia) {\n            localMedia.localStreams[0].getTracks().forEach(track => {\n                promise = promise.then(() => session.addTrack(track));\n            });\n        }\n\n        if (this.screenRecordingStream) {\n            // only add as many senders as we have\n            const senderCount = this.getNativePeerConnection(session).getSenders().length;\n            let tracks = this.screenRecordingStream.getVideoTracks();\n\n            if (senderCount < tracks.length) {\n                this.logger.error('More video tracks than available senders', {\n                    remoteData: { senderCount, trackCount: tracks.length }\n                });\n                tracks = tracks.slice(0, senderCount);\n            }\n\n            for (const track of tracks) {\n                promise = promise.then(() => {\n                    this.logger.info('Adding track to session', { remoteData: { track: track.id } });\n                    return session.addTrack(track);\n                });\n            }\n        }\n\n        return promise\n            .then(() => {\n                const isScreenRecording = this.isScreenRecording;\n                // for some reason this is needed in ff\n                this.getNativePeerConnection(session)\n                    .getTransceivers()\n                    .forEach(transceiver => {\n                        if (!isScreenRecording || (isScreenRecording && transceiver.sender.track)) {\n                            transceiver.direction = 'sendrecv';\n                        }\n                    });\n\n                this.logger.info('sending session-accept', {\n                    remoteData: { sid: session.sid, conversationId: this.conversationId }\n                });\n\n                return session.accept();\n            })\n            .then(() => {\n                this.logger.info('session-accept sent', {\n                    remoteData: { sid: session.sid, conversationId: this.conversationId }\n                });\n                const tracks = this.getNativePeerConnection(session)\n                    .getReceivers()\n                    .filter(receiver => receiver.track)\n                    .map(receiver => receiver.track);\n                tracks.forEach(track => this.handleRemoteTrackAdded(session, track));\n            });\n    },\n\n    _acceptSessionWithStreamBasedActions(session) {\n        this.logger.info('preparing to accept session with stream based actions', {\n            remoteData: { sid: session.sid, conversationId: this.conversationId }\n        });\n        const localMedia = this.localMedia;\n\n        if (localMedia && !this.isScreenRecording) {\n            localMedia.localStreams.forEach(stream => session.addStream(stream));\n        }\n\n        if (this.screenRecordingStream) {\n            session.addStream(this.screenRecordingStream);\n        }\n\n        // wait for all the tracks to actually get added before we accept the session\n        this.logger.info('sending session-accept', {\n            remoteData: { sid: session.sid, conversationId: this.conversationId }\n        });\n        return session.accept(this._getSessionAcceptParams(session)).then(() => {\n            this.logger.info('session-accept sent', {\n                remoteData: { sid: session.sid, conversationId: this.conversationId }\n            });\n            session.streams.forEach(stream => this.handleRemoteStreamAdded(session, stream));\n        });\n    },\n\n    acceptSession(session) {\n        const conversationStart = this.conversationStart;\n        if (!conversationStart) {\n            this.set('conversationStart', new Date());\n        }\n\n        let promise = RSVP.resolve();\n\n        if (this.useTrackBasedActions) {\n            promise = this._acceptSessionWithTrackBasedActions(session);\n        } else {\n            if (this.webrtc.streamBasedActionsFallback(this)) {\n                if (this.isGroupCollaborate) {\n                    const key = this.get('application.hostedContext.isHostedProp')\n                        ? 'ewc.cantFallbackToStreamsDesktopApp'\n                        : 'ewc.cantFallbackToStreamsBrowser';\n\n                    this.notification.error(null, this.intl.t(key));\n                    const error = new Error('trackBasedActions are required but not supported but this client');\n                    this.logger.error(error, { remoteData: { conversationId: this.conversationId } });\n                    session.end();\n                    return RSVP.reject(error);\n                } else if (!this.get('webrtc.hasShownStreamFallbackWarning')) {\n                    this.set('webrtc.hasShownStreamFallbackWarning', true);\n                    const key = this.get('application.hostedContext.isHostedProp')\n                        ? 'ewc.fallingBackToStreamsDesktopApp'\n                        : 'ewc.fallingBackToStreamsBrowser';\n                    this.notification.info(null, this.intl.t(key));\n                    this.logger.warn(\n                        'Falling back to streamBasedActions since trackBasedActions were requested but not supported',\n                        { remoteData: { conversationId: this.conversationId } }\n                    );\n                }\n            }\n            promise = this._acceptSessionWithStreamBasedActions(session);\n        }\n        session.startConnectionTimeout();\n        return promise;\n    },\n\n    retrySessionThatFailedToConnect(session) {\n        this.set('isConnectRetry', true);\n\n        this.logger.warn('session failed, retrying', {\n            remoteData: {\n                sessionId: session.id,\n                conversationId: this.conversationId\n            }\n        });\n\n        return this.webrtc\n            .endSessionsForRoom({ jid: this.jid, reason: 'alternative-session' })\n            .then(() => this.webrtc.joinConversation(this, this.localMedia));\n    },\n\n    sendDirectlyToAll() {\n        this.sendDirectly('', ...arguments);\n    },\n\n    sendDirectly(to, channelName, topic, payload) {\n        const sessions = this.sessions;\n        const colibriPayload = {\n            colibriClass: 'EndpointMessage',\n            to: to || '',\n            msgPayload: {\n                channelMessage: channelName,\n                channelTopic: topic,\n                endpointId: this.get('session.person.id'),\n                payload: payload\n            }\n        };\n        sessions.forEach(session => {\n            if (this.getNativePeerConnection(session).connectionState === 'connected' && session.sendDirectly) {\n                session.sendDirectly(channelName, topic, this.get('session.person.id'), payload);\n            } else if (this.getNativePeerConnection(session).connectionState === 'connected' && session.lastNChannel) {\n                session.lastNChannel.send(JSON.stringify(colibriPayload));\n            }\n        });\n    },\n\n    toggleSharingScreen(opts) {\n        opts = opts || {};\n\n        if (\n            this.waitingForScreenStream ||\n            this.preparingToJoin ||\n            (this.isOneToOne && this.get('participants.length') <= 1)\n        ) {\n            return;\n        }\n\n        const localMedia = this.localMedia;\n        if (!localMedia) {\n            return this.logger.error('Screenshare as a listener is not yet implemented');\n        }\n\n        // stop\n        if (opts.forceStop || this.localScreenStream) {\n            if (this.useTrackBasedActions) {\n                const stream = localMedia.localScreens[0];\n                localMedia._removeStream(stream);\n            } else {\n                if (!this.get('localParticipant.videoMuted')) {\n                    localMedia.resumeVideo();\n                }\n\n                localMedia.stopScreenShare();\n                this.set('localScreenStream', null);\n            }\n            this.set('localParticipant.screenStream', null);\n            return;\n        }\n\n        // start\n        const requestedTime = window.performance.now();\n        this.set('waitingForScreenStream', true);\n        return localMedia.startScreenShare((err, stream) => {\n            this.set('waitingForScreenStream', false);\n            if (err) {\n                this.webrtc\n                    .handleScreenShareError(err, requestedTime)\n                    .then(this.toggleSharingScreen)\n                    .catch(err => this.logger.error(err.message, { remoteData: { err } }));\n            } else {\n                this.set('_screenSharingDuration', new Date());\n\n                this.set('localScreenStream', stream);\n                // replace the camera stream and add audio\n                if (this.useTrackBasedActions) {\n                    this.set('shouldRestoreCameraStream', !this.get('localParticipant.videoMuted'));\n                } else {\n                    this._addScreenStream(stream);\n                }\n\n                if (!this.get('localParticipant.videoMuted')) {\n                    this.toggleVideoMuted();\n                }\n            }\n        });\n    },\n\n    disallowVideoUnmute: and('localParticipant.videoMuted', 'localScreenStream'),\n\n    toggleVideoMuted() {\n        if (this.disallowVideoUnmute) {\n            return;\n        }\n\n        if (!this.get('webrtc.hasCamera')) {\n            if (this.localParticipant) {\n                this.set('localParticipant.videoMuted', true);\n            }\n        } else {\n            if (this.localParticipant) {\n                this.toggleProperty('localParticipant.videoMuted');\n            }\n        }\n\n        const localMedia = this.localMedia;\n        if (localMedia) {\n            if (this.get('localParticipant.videoMuted')) {\n                this._removeLocalVideoTrack();\n                localMedia.pauseVideo();\n            } else {\n                this._addVideoBack().then(() => localMedia.resumeVideo());\n            }\n        }\n    },\n\n    setLocalMedia(newMedia) {\n        const localMedia = this.localMedia;\n        if (localMedia && localMedia === newMedia) {\n            return this.logger.info('setLocalMedia called with same media');\n        }\n\n        if (localMedia) {\n            this.cleanupLocalMedia();\n        }\n\n        if (newMedia) {\n            if (this.get('localParticipant.audioMuted')) {\n                newMedia.mute();\n            }\n            if (this.get('localParticipant.videoMuted')) {\n                newMedia.pauseVideo();\n            }\n\n            if (!this.isSoftphone && this.localMedia !== newMedia) {\n                this._addEventsToLocalMedia(newMedia);\n            }\n\n            this.set('localMedia', newMedia);\n            let localParticipant = this.localParticipant;\n            if (localParticipant) {\n                if (this.useTrackBasedActions) {\n                    set(localParticipant, 'tracks', newMedia.localStreams[0].getTracks());\n                } else {\n                    set(localParticipant, 'cameraStream', newMedia.localStreams[0]);\n                }\n            }\n\n            this._updateLocalStreams();\n            return this._updateMediaToPeers(newMedia);\n        }\n    },\n\n    toggleAudioMuted() {\n        const localMedia = this.localMedia;\n        if (!this.get('webrtc.hasMicrophone')) {\n            if (this.localParticipant) {\n                this.set('localParticipant.audioMuted', true);\n            }\n        } else {\n            this.toggleProperty('localParticipant.audioMuted');\n        }\n        if (localMedia) {\n            if (this.get('localParticipant.audioMuted')) {\n                localMedia.mute();\n            } else {\n                localMedia.unmute();\n                this.set('mutedByOther', false);\n            }\n        }\n    },\n\n    muteAudio() {\n        const localMedia = this.localMedia;\n        if (this.localParticipant) {\n            this.set('localParticipant.audioMuted', true);\n        }\n        if (localMedia) {\n            localMedia.mute();\n        }\n    },\n\n    unmuteAudio() {\n        if (this.localParticipant) {\n            this.set('localParticipant.audioMuted', false);\n        }\n        const localMedia = this.localMedia;\n        if (localMedia) {\n            localMedia.unmute();\n        }\n    },\n\n    setParticipantPin(shouldPin, participant) {\n        const targetParticipantId = participant.get('pcParticipant.id');\n        const participantId = this.get('localParticipant.pcParticipant.id');\n        const conversationId = this.conversationId;\n\n        const uri = `/platform/api/v2/conversations/videos/${conversationId}/participants/${participantId}/pin`;\n\n        let promise;\n        if (!shouldPin) {\n            promise = this.ajax.delete(uri).then(() => {\n                if (this.pinnedParticipantId === targetParticipantId) {\n                    this.set('pinnedParticipantId', null);\n                }\n            });\n        } else {\n            promise = this.ajax\n                .post(uri, {\n                    dataType: 'text',\n                    data: {\n                        targetParticipantId,\n                        streamType: 'video'\n                    }\n                })\n                .then(() => {\n                    this.set('pinnedParticipantId', targetParticipantId);\n                });\n        }\n\n        const originalValue = participant.get('selected');\n        participant.set('selected', shouldPin);\n\n        return promise.catch(err => {\n            this.logger.error(err);\n            if (shouldPin) {\n                this.notification.error(this.intl.t('ewc.failedToPin', { name: participant.get('name') }));\n            } else {\n                this.notification.error(this.intl.t('ewc.failedToUnpin', { name: participant.get('name') }));\n            }\n            participant.set('selected', originalValue);\n        });\n    },\n\n    selectParticipant(participant) {\n        if (this.usePcConversationModelParticipants) {\n            // if pinning, we need to remove the other participant pins\n            const shouldPin = !participant.get('selected');\n\n            if (shouldPin) {\n                // unpin selected participants\n                const selectedParticipants = this.participants.filterBy('selected', true);\n                selectedParticipants.forEach(selectedParticipant => this.setParticipantPin(false, selectedParticipant));\n            }\n\n            return this.setParticipantPin(shouldPin, participant);\n        }\n\n        if (participant.get('selected')) {\n            participant.set('selected', false);\n            return this._selectEndpoint('');\n        }\n\n        const endpointId = participant.get('endpointId');\n        if (endpointId) {\n            this._selectEndpoint(endpointId);\n        }\n        const participants = this.participants;\n        participants.forEach(otherParticipant => {\n            if (otherParticipant === participant) {\n                otherParticipant.set('selected', true);\n                otherParticipant.set('major', true);\n            } else {\n                otherParticipant.set('selected', false);\n                otherParticipant.set('major', false);\n            }\n        });\n    },\n\n    dumpCurrentState(requestId) {\n        this.webrtc.debugWebrtc({ json: true }).then(snapshots => {\n            let snapshot = snapshots.find(snap => snap.conversationId === this.conversationId);\n            snapshot = snapshot || snapshots.find(snap => snap.roomJid === this.jid);\n\n            this.logger.info('webrtc state dump', {\n                requestId,\n                snapshot\n            });\n        });\n    },\n\n    cleanup() {\n        this.webrtc.endFullScreen();\n        this.get('webrtc.videoConversationsMadeByClient').removeObject(this);\n        this.presenceSubscription.autoSubscribe(null, this);\n        this.set('isConnected', false);\n        this._participants.clear();\n        const sessions = this.sessions;\n        sessions.forEach(s => {\n            s.callbacks = {}; // remove all event callbacks on all sessions\n        });\n        sessions.clear();\n        this.cleanupLocalMedia();\n        if (this.screenRecordingStream) {\n            this.get('webrtc.orphanedScreenStreams').pushObject(this.screenRecordingStream);\n\n            if (this.get('webrtc.screenRecordingConversations.length') <= 1) {\n                this.webrtc.endOrphanedScreenStreams();\n            }\n        }\n\n        this.set('preparingToJoin', false);\n        this.set('hasJoined', false);\n\n        for (const key of Object.keys(this.pendingStreamInfos)) {\n            run.cancel(this.get(`pendingStreamInfos.${key}.timeout`));\n        }\n\n        this.destroy();\n    }\n});\n","import EmberObject from '@ember/object';\n\nexport default EmberObject.extend({\n    id: null,\n    mutableGroupId: null,\n    timestamp: null,\n    type: null,\n    shiftTrade: null,\n    alternativeShift: null,\n    timeOffRequest: null,\n    markedAsRead: null,\n    agentNotification: null,\n    otherNotificationIdsInGroup: null,\n    adherenceExplanation: null\n});\n","import { inject as service } from '@ember/service';\nimport Route from '@ember/routing/route';\nimport { run } from '@ember/runloop';\n\nexport default Route.extend({\n    chat: service(),\n    sidebar: service(),\n\n    afterModel() {\n        this._super(...arguments);\n        run.scheduleOnce('afterRender', this, function () {\n            const sidebar = this.sidebar;\n            sidebar.expandCommunicationSidebar();\n            sidebar.openPanel('callControls');\n        });\n    }\n});\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"f948Zl5j\",\"block\":\"[[[46,[28,[37,1],null,null],null,null,null]],[],false,[\\\"component\\\",\\\"-outlet\\\"]]\",\"moduleName\":\"web-directory/phone/template.hbs\",\"isStrictMode\":false});","import Resolver from 'ember-resolver';\n\nconst centerStageRouteRegex = /^route:center-stage-frame-[\\w-]+/;\nconst centerStageShortRegex = /^center-stage-frame-[\\w-]+/;\n\nexport default Resolver.extend({\n    /**\n     * This intercepts route resolution and maps lookups of routes of the form\n     * `center-stage-frame-${clientId}` to a lookup of `center-stage-frame` so\n     * that we get a single implementation for all iframe-coordinator client apps.\n     *\n     * @param {*} routeInfo details about the route to be looked up.\n     */\n    resolveRoute(routeInfo) {\n        this._transformCenterStageRoutes(routeInfo);\n        return this._super(...arguments);\n    },\n\n    _transformCenterStageRoutes(routeInfo) {\n        let routeName = routeInfo.fullName;\n\n        // If this is a center-stage route\n        if (centerStageRouteRegex.test(routeName)) {\n            //Replace all the fields with the route name in them so Ember maps to our center-stage route implementation\n            routeInfo.fullName = routeInfo.fullName.replace(centerStageRouteRegex, 'route:center-stage-frame');\n            routeInfo.fullNameWithoutType = routeInfo.fullNameWithoutType.replace(\n                centerStageShortRegex,\n                'center-stage-frame'\n            );\n            routeInfo.name = routeInfo.name.replace(centerStageShortRegex, 'center-stage-frame');\n        }\n    }\n});\n","import { scheduleOnce } from '@ember/runloop';\nimport { on } from '@ember/object/evented';\nimport { inject as service } from '@ember/service';\nimport EmberRouter from '@ember/routing/router';\nimport config from './config/environment';\nimport { centerStageClients, modalClients } from './iframe-client-config';\n\nexport const NOOP_TRANSITION = 'NOOP_TRANSITION';\nexport const TRANSITION_EVENT = 'TRANSITION_EVENT';\n\nconst Router = EmberRouter.extend({\n    session: service(),\n    application: service(),\n    logCapture: service('log-capture'),\n    rollingLogCapture: service('rolling-log-capture'),\n    sidebar: service(),\n    events: service(),\n\n    location: config.locationType,\n    rootURL: config.rootURL,\n\n    titleDivider: '-',\n\n    transitionTo: function () {\n        const transition = this._super(...arguments);\n        if (transition && transition.then && typeof transition.then === 'function') {\n            transition.then(() => {\n                this.trigger(TRANSITION_EVENT);\n                if (transition.isActive && !transition.isAborted) {\n                    // Trigger an event if the route is already active\n                    // Useful to notify on noop transition attempts (e.g. sidebar collapse)\n                    this.trigger(NOOP_TRANSITION);\n                }\n            });\n        }\n        return transition;\n    }\n});\n\nRouter.map(function () {\n    this.route('maintenance');\n\n    this.route('login');\n    this.route('login-oauth');\n    this.route('signup', { path: 'signup/:token' });\n    this.route('reset-password', { path: 'reset-password/:token' });\n\n    this.route('download');\n\n    this.route('skillgroup', { resetNamespace: true }, function () {\n        this.route('detail', { path: ':skillgroup_id' }, function () {\n            this.route('edit');\n        });\n    });\n\n    this.route('admin', { resetNamespace: true, path: 'admin/*adminPath' });\n    this.route('admin-emergency-group-list-redirect', { path: 'admin/routing/emergencies' });\n    this.route('admin-emergency-group-detail-redirect', { path: 'admin/routing/emergencies/:emergencyGroupId' });\n\n    this.route('admin-entry', { path: 'admin' });\n\n    this.route('custom-fields-contacts-redirect', { path: 'admin/custom-fields/contacts' });\n    this.route('custom-fields-orgs-redirect', { path: 'admin/custom-fields/external-orgs' });\n\n    this.route('partners.clients', {\n        path: 'partners/clients',\n        resetNamespace: true\n    });\n\n    this.route('interaction-detail-redirect', { path: 'engage/admin/interactions/:interactionId/' });\n    this.route('interaction-detail-redirect', {\n        path: 'engage/admin/interactions/:interactionId/*interactionDetailPath'\n    });\n    this.route('interaction-detail-redirect-agent', { path: 'engage/agent/interactions/:interactionId/' });\n    this.route('interaction-detail-redirect-agent', {\n        path: 'engage/agent/interactions/:interactionId/*interactionDetailPath'\n    });\n\n    this.route('engage.recording-management-redirect', {\n        resetNamespace: true,\n        path: 'quality/screenrecordings/inprogress'\n    });\n    this.route('engage.recording-management-redirect', {\n        path: 'admin/quality/recordings/screensessions',\n        resetNamespace: true\n    });\n\n    this.route('engage', function () {\n        this.route('quality', function () {\n            this.route('engage.inprogress-screenrecordings-redirect', {\n                path: 'recordings/screensessions',\n                resetNamespace: true\n            });\n            this.route('engage.interaction-screenrecordings-redirect', {\n                path: 'interactions/:interaction_id/screen-recordings',\n                resetNamespace: true\n            });\n            this.route('engage.interaction-videorecordings-redirect', {\n                path: 'interactions/:interaction_id/video-recordings',\n                resetNamespace: true\n            });\n        });\n\n        this.route('queue-activity-summary-redirect', { path: 'queues/activity' });\n        this.route('queue-activity-detail-redirect', { path: 'queues/activity/:queueId' });\n        this.route('queue-performance-summary-redirect', { path: 'queues/performance' });\n        this.route('queue-performance-detail-redirect', { path: 'queues/performance/:queueId' });\n        this.route('interaction-search-redirect', { path: 'interactions' });\n        this.route('interaction-search-redirect', { path: 'admin/interactions' });\n        this.route('interaction-search-redirect', { path: 'admin/interactions/search' });\n        this.route('did-assignment-redirect', { path: 'telephonyAdmin/did/assignments' });\n        this.route('telephony-admin-extensions-redirect', { path: 'telephonyAdmin/extensions' });\n        this.route('telephony-admin-redirect', { path: 'telephonyAdmin/*telephonyPath' });\n        this.route('wfm-admin-redirect', { path: 'wfm/admin/*wfmPath' });\n        this.route('quality-redirect', { path: 'admin/*qualityPath' });\n        this.route('quality-redirect', { path: 'quality/admin/*qualityPath' });\n\n        this.route('embedded', { path: '*engagePath' });\n    });\n\n    this.route('content-management', { path: 'content-management/*cmPath' });\n\n    this.route('conversations');\n\n    this.route('feedback');\n\n    this.route('internal-logs');\n\n    this.route('no-access');\n    this.route('policy-access-denied');\n\n    this.route('region-chooser');\n\n    this.route('about', { resetNamespace: true }, function () {});\n\n    this.route('timeline');\n\n    this.route('relate.contacts-ui-redirect', { path: 'contact/:contact_id' }); // Todo : rewrite route instead of redirecting\n\n    this.route('chat-room', { path: 'chat-room/:roomJid' });\n\n    this.route('interaction', { path: 'interaction/:interactionId' });\n    this.route('interactions');\n\n    this.route('time-machine', { path: 'timemachine/*buildTag' });\n\n    this.route('third-party', { path: '/apps' }, function () {\n        this.route('app-embed', { path: ':app_id' });\n    });\n\n    this.route('screen-share', { path: 'screen-share/:roomJid' });\n\n    this.route('phone');\n\n    /* IFRAME COORDINATOR ROUTES\n     * Each frame needs a separate logical route to handle the base path\n     * and internal paths separately for routing to work correctly.\n     *\n     * The lookup of the named paths is mapped to a single implementation in\n     * app/resover.js\n     */\n    Object.entries(centerStageClients).forEach(([clientId, clientInfo]) => {\n        let baseClientPath = clientInfo.assignedRoute;\n        let clientPath = baseClientPath.replace(/\\/$/, '') + '/*clientPath';\n        this.route(`center-stage-frame-${clientId}`, { path: baseClientPath });\n        this.route(`center-stage-frame-${clientId}.internal`, { path: clientPath });\n    });\n\n    Object.entries(modalClients).forEach(([clientId, clientInfo]) => {\n        let baseClientPath = clientInfo.assignedRoute;\n        let clientPath = baseClientPath.replace(/\\/$/, '') + '/*clientPath';\n        this.route(`modal-${clientId}`, { path: baseClientPath });\n        this.route(`modal-${clientId}.internal`, { path: clientPath });\n    });\n\n    // Not-Found redirects to the user profile.\n});\n\nRouter.reopen({\n    currentRouteDidTransition: on('didTransition', function () {\n        const prevRouteName = this._prevRouteName;\n        this.set('_prevRouteName', this.currentRouteName);\n\n        this.sidebar.instrumentSidebarPanel('routeDidChange', {\n            prevRouteName,\n            newRouteName: this.currentRouteName\n        });\n        // this.get('sidebar').ensureRouteVisibility();\n        let currentRoute = window.location.hash.substring(2);\n        scheduleOnce('afterRender', this, () => {\n            $('meta[name=apple-itunes-app]').attr(\n                'content',\n                'app-id=777864400, app-argument=purecloud-collaborate://' + currentRoute\n            );\n\n            this.logCapture.restart();\n            this.rollingLogCapture.refresh();\n        });\n    })\n});\n\nexport default Router;\n","import Route from '@ember/routing/route';\n\nexport default Route.extend({\n    redirect(model) {\n        return this.replaceWith(`/admin/routing/emergency-groups/${model.emergencyGroupId}`);\n    }\n});\n","import Route from '@ember/routing/route';\n\nexport default Route.extend({\n    beforeModel() {\n        return this.replaceWith('/admin/routing/emergency-groups');\n    }\n});\n","import { resolve } from 'rsvp';\nimport { inject as service } from '@ember/service';\nimport Route from '@ember/routing/route';\n\nexport default Route.extend({\n    adminui: service(),\n    adminAccess: service(),\n    session: service(),\n\n    beforeModel(transition) {\n        // replaceWith for better history preservation\n        return resolve(this._super(...arguments)).then(() => {\n            if (transition.isActive) {\n                return this.get('adminui.loadingPromise').then(() => {\n                    if (this.get('adminAccess.userHasAdminAccess')) {\n                        this.replaceWith('admin', { adminPath: 'welcomeV2' });\n                    } else {\n                        this.replaceWith('index');\n                    }\n                });\n            }\n        });\n    }\n});\n","import { resolve } from 'rsvp';\nimport { inject as service } from '@ember/service';\nimport Route from '@ember/routing/route';\n\nexport default Route.extend({\n    adminuiService: service('adminui'),\n    sidebar: service(),\n    session: service(),\n    ajax: service(),\n    application: service(),\n\n    beforeModel(transition) {\n        this._super(...arguments);\n\n        if (transition.isActive === false) {\n            // Route canceled for auth\n            return;\n        }\n\n        const url = transition.intent.url;\n        const contexts = transition.intent.contexts;\n\n        // replace either welcomeV2 or base admin (which redirects to the welcome wall) with index in New IA\n        const toAdminHome =\n            url === '/admin/welcomeV2' || (!!contexts && !!contexts[0] && contexts[0].adminPath === 'welcomeV2');\n        if (toAdminHome && this.get('session.useNewNav')) {\n            this.replaceWith('index');\n        }\n\n        if (url && url.indexOf('/admin/interactions') === 0) {\n            this.replaceWith('/analytics/interactions');\n        }\n\n        // PAUI-80: people decomp work\n        // Remap legacy iframe routes peopleV2 and peopleV3 to the new Users-UI\n        // (This allows the browser URL to be automatically updated to the correct new URL).\n        // depends on FT PAUI-80.PeopleUiDecomposition\n        if (\n            this.get('session.features')['PAUI-80.PeopleUiDecomposition'] &&\n            url &&\n            url.includes('/admin/directory/peopleV')\n        ) {\n            const newAdminUrl = url.replace(/^\\/admin\\/directory\\/peopleV[23](\\/|$|\\?)/, '/admin/users$1');\n            this.replaceWith(newAdminUrl);\n        }\n\n        return this.loadFreeTrial();\n    },\n\n    // Loads information used for displaying how many days are left in a free trial\n    loadFreeTrial() {\n        if (this.session.get('freeTrial')) {\n            return resolve();\n        }\n\n        const url = this.application.pcV2Uri('api/v2/billing/freetrial');\n        return this.ajax\n            .request(url, { retry: false })\n            .then(data => this.session.set('freeTrial', data))\n            .catch(() => {\n                this.session.set('freeTrial', {});\n\n                // This request is allowed to fail, as we don't want missing\n                // free trial info to trigger the maintenance page\n                return resolve();\n            });\n    },\n\n    actions: {\n        didTransition() {\n            this.sidebar.ensureRouteVisibility();\n            return true;\n        },\n        gotoRoute(route) {\n            this.transitionTo(route);\n        }\n    },\n\n    afterModel(model) {\n        if (model) {\n            this.set('adminuiService.adminPath', model.adminPath);\n            this.set('adminuiService.currentRouteName', model.adminPath);\n        }\n    }\n});\n","import { get } from '@ember/object';\nimport { isPresent } from '@ember/utils';\nimport { getOwner } from '@ember/application';\nimport { inject as service } from '@ember/service';\nimport Route from '@ember/routing/route';\nimport Ember from 'ember';\n\nimport UnprotectedRouteMixin from '../mixins/unprotected-route-mixin';\nimport ApplicationRouteMixin from 'ember-simple-auth/mixins/application-route-mixin';\nimport { applyPostAuthDestination, resolvePostAuthDestination } from '../utils/post-auth-redirect';\n\n// Use the uprotectedroutemixin to skip the custom, protected, default Ember.Route\nexport default Route.extend(UnprotectedRouteMixin, ApplicationRouteMixin, {\n    mediaProviders: service(),\n    application: service(),\n    session: service(),\n    purecloudOauth: service(),\n    settings: service(),\n    webrtc: service(),\n    fax: service(),\n    commandNav: service(),\n    chat: service(),\n    router: service(),\n\n    routeAfterAuthentication: 'index',\n\n    init() {\n        this._super(...arguments);\n\n        this.session.on('sessionInvalidationFailed', this, this.onSessionInvalidationFailure);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n\n        this.session.off('sessionInvalidationFailed', this, this.onSessionInvalidationFailure);\n    },\n\n    actions: {\n        willTransition(transition) {\n            this.applicationService.postMessageRouteChange(transition); // broadcast route change to parent if iframed\n\n            if (this.get('applicationService.errorState')) {\n                this.router.transitionTo('maintenance');\n                return;\n            }\n\n            if (this.session.get('isAuthenticated')) {\n                this.sidebarService.ensureRouteVisibility();\n            }\n        },\n\n        transitionToRoute(route, id) {\n            if (id) {\n                this.router.transitionTo(route, id);\n            } else {\n                this.router.transitionTo(route);\n            }\n        },\n\n        transitionToEntityDetail(entity) {\n            var type = entity.get('type');\n            if (type === 'person') {\n                this.router.transitionTo(`/person-v2/${entity.get('id')}`);\n            } else if (type === 'group') {\n                this.router.transitionTo(`/group-v2/${entity.get('id')}`);\n            }\n        },\n\n        logout() {\n            var session = this.session;\n            session.logout();\n        },\n\n        linkTo(route, param) {\n            if (param) {\n                this.router.transitionTo(route, param);\n            } else {\n                this.router.transitionTo(route);\n            }\n        },\n\n        error(error, transition) {\n            console.error('Error transitioning route: ', {\n                error,\n                remoteData: { routeName: transition.targetName }\n            });\n            Ember.onerror(error);\n            return true;\n        },\n\n        performSearch(query) {\n            // Get hash parameters from URL\n            const [, queryString] = window.location.hash.split('?');\n            const queryParameters = new URLSearchParams(queryString);\n            let parameters = '';\n            const params = [];\n            if (queryParameters.get('entity')) {\n                params.push(`entity=${encodeURIComponent(queryParameters.get('entity'))}`);\n            }\n            if (query) {\n                params.push(`query=${encodeURIComponent(query)}`);\n            }\n            if (queryParameters.get('queryFacets')) {\n                params.push(`queryFacets=${encodeURIComponent(queryParameters.get('queryFacets'))}`);\n            }\n            if (params.length) {\n                parameters = `?${params.join('&')}`;\n            }\n            this.router.transitionTo(`/search-v2${parameters}`);\n            return;\n        },\n\n        togglePanel(panel) {\n            this.sidebarService.togglePanel(panel);\n        },\n\n        openPanel(panel) {\n            this.sidebarService.openPanel(panel);\n        },\n\n        closePanel() {\n            // The fax service temporarily suppresses closePanel if fax document selection is happening.\n            // This flag is false most of the time.\n            if (!this.get('fax.isSelectingDocument')) {\n                this.sidebarService.closePanel();\n            }\n        },\n\n        openPreferencesModal() {\n            this.settings.open();\n        },\n\n        toggleCommunicationSidebarExpanded() {\n            this.sidebarService.toggleCommunicationSidebarExpanded();\n        },\n\n        ensureRouteVisibility() {\n            this.sidebarService.ensureRouteVisibility();\n        },\n\n        openChatRoom(roomJid) {\n            if (!this.chat.get('enabled')) {\n                return;\n            }\n\n            if (roomJid.indexOf('undefined@') >= 0) {\n                this.get('logger').warn('Attempted to open chatroom with undefined group jid');\n                return;\n            }\n\n            if (this.get('session.useNewNav')) {\n                this.commandNav.selectPanel('chats');\n            } else {\n                this.sidebarService.openPanel('conversations');\n            }\n\n            this.chatService.openRoom(roomJid);\n        },\n\n        async openChatRoomWithVideo(roomJid, useMediaProviders = false) {\n            this.application.openChatRoomWithVideo(roomJid, useMediaProviders);\n        },\n\n        loading(transition, originRoute) {\n            if (\n                originRoute.routeName === 'application' &&\n                !this.get('session.isAuthenticated') &&\n                !this.get('purecloudOauth.inLogoutBounce')\n            ) {\n                // Show the application-loading route on session restore; otherwise,\n                // it's not worth the flash before redirecting or showing the login route\n                return true;\n            }\n        }\n    },\n\n    // Ember Simple Auth Impls\n    sessionAuthenticated() {\n        // Captured here because `_super` is only valid for the synchronous extent of\n        // the method that owns it, and ESA's default handling is invoked from one of\n        // the handlers below.\n        const applyFrameworkDefault = this._super.bind(this);\n        const stateRestore = this.purecloudOauth.popRestoreState();\n\n        const destination = resolvePostAuthDestination({\n            restoreStateUrl: stateRestore && stateRestore.url,\n            hash: window.location.hash,\n            location: window.location\n        });\n\n        applyPostAuthDestination(destination, {\n            useFrameworkDefault: () => {\n                // Nothing to restore; ESA applies routeAfterAuthentication.\n                applyFrameworkDefault();\n            },\n\n            assignLocation: url => {\n                this._releaseAttemptedTransition();\n                window.location = url;\n            },\n\n            transitionToRoute: path => {\n                this._releaseAttemptedTransition();\n\n                // The router may already be on the restored route: the authenticator\n                // writes the fragment back before bootstrap finishes, so the\n                // transition can complete while this handler is still pending.\n                // Re-running an identical transition re-runs model/afterModel, and\n                // for routes with side effects there (the time-machine confirmation\n                // modal) that means doing the work twice.\n                if (this.router.currentURL !== path) {\n                    this.router.transitionTo(path);\n                }\n            }\n        });\n    },\n\n    /**\n     * Drops ESA's record of the transition that was aborted before authentication.\n     *\n     * Called when this route takes over post-authentication navigation. Leaving it\n     * set lets ESA's `handleAuthentication` retry a transition that was made while\n     * unauthenticated (typically to index, which resolves to /home), clobbering the\n     * route being restored. (ATLAS-2424)\n     */\n    _releaseAttemptedTransition() {\n        this.set('session.attemptedTransition', null);\n    },\n\n    sessionInvalidated() {\n        // Record the logout time to handle the logout bounce\n        this.purecloudOauth.recordLogoutTime();\n        const authenticator = getOwner(this).lookup('authenticator:directory');\n        if (authenticator) {\n            try {\n                let redirectUrl = null;\n\n                if (this.get('session.singleSignOutInProgress')) {\n                    // Explicitly log out\n                    // Will kill this token, all other tokens issued under auth session, and remember me.\n                    redirectUrl = authenticator.buildLogoutUrl();\n                } else {\n                    // Request a new auth token.\n                    // Will survive expired tokens if RememberMe is enabled and still active\n\n                    let state, org;\n                    let proxyLoginInfo = this.session.retrieveProxyLoginInfo();\n                    if (proxyLoginInfo) {\n                        state = proxyLoginInfo.hash;\n                        org = proxyLoginInfo.org;\n                    }\n\n                    if (!state && window && window.location && isPresent(window.location.hash)) {\n                        state = window.location.hash;\n                    }\n\n                    redirectUrl = authenticator.buildAuthorizeUrl(state, org);\n                }\n\n                window.location = redirectUrl;\n                return;\n            } catch (err) {\n                // Just bounce the page via super, the login config check will take care of it\n                console.error('Logout Redirect Failed', {\n                    error: err\n                });\n            }\n        }\n        if (this.get('application.runtime.local')) {\n            // Make sure the path is appended to the reload url when local\n            let reloadUrl = window.location.origin;\n            if (!reloadUrl) {\n                reloadUrl = `${window.location.protocol}//${window.location.host}`;\n            }\n            reloadUrl += window.location.pathname;\n            window.location.replace(reloadUrl);\n        } else {\n            return this._super(...arguments);\n        }\n    },\n\n    onSessionInvalidationFailure() {\n        this.set('application.errorState', { type: 'sessionInvalidationFailure' });\n        this.router.transitionTo('maintenance');\n    },\n\n    async beforeModel(transition) {\n        await this.session.setup();\n\n        if (this.get('applicationService.errorState')) {\n            this.router.transitionTo('maintenance');\n            return;\n        }\n\n        if (get(transition, 'queryParams.mobile')) {\n            this.application.set('mobileQueryParameter', true);\n        }\n\n        return this._super(transition);\n    }\n});\n","import { getOwner } from '@ember/application';\nimport { next } from '@ember/runloop';\nimport { resolve } from 'rsvp';\nimport { inject as service } from '@ember/service';\nimport Route from '@ember/routing/route';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport { getEvaluator } from 'boon-js';\n\nexport default Route.extend(LoggerMixin, {\n    frameService: service('center-stage-frame'),\n    session: service('session'),\n\n    init() {\n        this._super(...arguments);\n        this.queryParams = this.frameService.get('allClientQueryParams').reduce((queryParamsObj, queryParam) => {\n            queryParamsObj[queryParam] = { refreshModel: true };\n            return queryParamsObj;\n        }, {});\n    },\n\n    beforeModel(transition) {\n        const result = this._super(...arguments);\n        return resolve(result).then(() => {\n            if (transition.isActive === false) {\n                // Route canceled higher in the chain (e.g. for auth)\n                return;\n            }\n            let path = transition.intent.url;\n            let toggle = this.frameService.toggleForPath(path);\n\n            // Redirect if a feature toggle is specified, but not set.\n            if (toggle) {\n                const { key, redirect = 'index', makeRedirectArgs = () => undefined } = toggle;\n                if (key && !getEvaluator(key)(this.get(`session.features`))) {\n                    const redirectArgs = makeRedirectArgs({ path });\n                    this.logger.debug('Aborting route transition, the toggle for the frame is not enabled.', {\n                        toggle: key,\n                        redirectRoute: redirect,\n                        redirectArgs\n                    });\n\n                    if (redirectArgs) {\n                        this.replaceWith(redirect, redirectArgs);\n                    } else {\n                        this.replaceWith(redirect);\n                    }\n                }\n            }\n        });\n    },\n\n    updateActiveRoute() {\n        next(() => this.frameService.updateActiveRoute());\n    },\n\n    deactivate() {\n        this.updateActiveRoute();\n    },\n\n    /** Is a full transition currently happening? */\n    isTransitioning: false,\n\n    actions: {\n        /**\n         * Preserves URL query params that no IFC client declared so that\n         * iframe-coordinator can forward them to the embedded client.\n         *\n         * Ember 3.28's default `finalizeQueryParamChange` handler (on the\n         * application route) only pushes params whose keys appear in some\n         * route's declared `queryParams` into `transition._visibleQueryParams`.\n         * Anything else gets stripped when the router regenerates the URL\n         * after a transition — and since `frameService.updateActiveRoute()`\n         * reads `window.location.hash` to build the route it forwards to the\n         * iframe, dropped params never reach the embedded client.\n         *\n         * This handler runs before the application route's default handler\n         * (route event bubbling flows leaf-to-root). For each URL param that\n         * isn't already declared by an IFC client, it pushes an entry into\n         * `finalParams` with `visible: true` so the param survives URL\n         * regeneration. Declared params are left alone and get pushed by the\n         * default handler as usual.\n         *\n         * Returns `true` so the action bubbles to the application route.\n         *\n         * @see ATLAS-2434\n         */\n        finalizeQueryParamChange(params, finalParams) {\n            if (!params || !finalParams) {\n                return true;\n            }\n\n            const declared = new Set(this.frameService.get('allClientQueryParams') || []);\n            const alreadyPushed = new Set(finalParams.map(qp => qp.key));\n\n            Object.keys(params).forEach(key => {\n                if (!declared.has(key) && !alreadyPushed.has(key)) {\n                    finalParams.push({\n                        key,\n                        value: params[key],\n                        visible: true\n                    });\n                }\n            });\n\n            return true;\n        },\n\n        willTransition(transition) {\n            this.set('isTransitioning', true);\n            const promptOnLeave = this.frameService.get('promptOnLeave');\n            const router = getOwner(this).lookup('router:main');\n            // TODO: use DOM-based modal instead of window.confirm()???\n            if (promptOnLeave && !window.confirm(promptOnLeave)) {\n                transition.abort();\n                this.set('isTransitioning', false);\n                // Hack to avoid address bar and history showing the target route even though we never transitioned:\n                // If transition was initiated within Ember then router.currentURL will reflect target route. Otherwise\n                // it reflects the URL of the route the router thinks we are on (i.e. previous route when out of sync).\n                // They only differ when router is *reacting* to external location change, e.g. user edited address bar\n                // or used browser Back/Forward or content in page changed the location directly like <a href=\"#/foo\">.\n                let oldURL = router.currentURL;\n                let newURL = router.location.getURL();\n                if (oldURL != newURL) {\n                    // Use History.back() because otherwise we have the aborted target route in our history stack\n                    // even though we never actually transitioned into that route.\n                    window.history.back();\n                    // Alternatively, could just use setURL() to fix the address bar, but it leaves the bogus history.\n                    // router.location.setURL(oldURL);\n                }\n            }\n        },\n\n        didTransition() {\n            this.updateActiveRoute();\n            this.set('isTransitioning', false);\n        },\n\n        queryParamsDidChange() {\n            // Update the active route when query params change, but only when a full transition is not in progress. Ember fires queryParamsDidChange during a full transition and when query params are the only thing that changed.\n            if (!this.isTransitioning) {\n                this.updateActiveRoute();\n            }\n        }\n    }\n});\n","import CenterStageRoute from '../center-stage-frame';\n\nexport default CenterStageRoute;\n","import { scheduleOnce } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport Route from '@ember/routing/route';\n\nexport default Route.extend({\n    chat: service(),\n    sidebar: service(),\n    permissions: service(),\n\n    model(params) {\n        /* check permissions here because they haven't loaded yet when init() runs */\n        let panels = ['webrtc'];\n        if (this.get('permissions.canViewBusinessChat')) {\n            panels.push('conversations');\n        }\n        this.set('sidebar.allowedPopoutPanels', panels);\n\n        return this.chat.getChatRoom(params.roomJid);\n    },\n\n    afterModel(model, transition) {\n        model.set('isPopout', true);\n        this.set('chat.popoutRoom', model);\n\n        if (!this.get('permissions.canViewBusinessChat')) {\n            scheduleOnce('afterRender', this, function () {\n                this.sidebar.closePanel('conversations');\n            });\n            return;\n        }\n        if (model.get('isSupervisorRoom')) {\n            model.set('actionless', true);\n            model.set('rosterless', true);\n        }\n\n        // Use the Ember 3.x RouteInfo API. `transition.queryParams` was removed\n        // in the 3.28 upgrade (ATLAS-2207) and now returns undefined, which\n        // silently disabled the video-on-open flag for chat-room deep links\n        // (ATLAS-2439).\n        model.set(\n            'showingVideo',\n            transition.to && transition.to.queryParams && transition.to.queryParams.showingVideo === 'true'\n        );\n\n        scheduleOnce('afterRender', this, function () {\n            this.sidebar.expandCommunicationSidebar();\n            this.sidebar.openPanel('conversations');\n\n            // supervisor assistance room is a special place...\n            if (model.get('isSupervisorRoom')) {\n                this.chat.changeActiveRoom(model);\n            }\n        });\n    }\n});\n","import { observer } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport Route from '@ember/routing/route';\n\nconst MODE_CAPTURE = /^(.*)(\\?mode=.+)$/;\n\nvar CONTENT_MANAGEMENT = 'content-management',\n    ENGAGE = 'engage/embedded',\n    ContentManagementRoute = Route.extend({\n        controllerName: ENGAGE,\n        documents: service(),\n        engage: service(),\n        isLiveRoute: false,\n\n        setupController: function (controller, model) {\n            this._super(controller, model);\n            let isSelectionMode = MODE_CAPTURE.test(model.cmPath);\n            controller.setEngageInactive();\n            this.set('documents.lastSegment', null);\n            this.set('documents.currentSegment', isSelectionMode ? null : model.cmPath);\n            this.set('isLiveRoute', true);\n        },\n\n        observeSidebarExpansion: observer(\n            'sidebarService.sidebarExpanded',\n            'documents.currentSegment',\n            'documents.lastSegment',\n            'isLiveRoute',\n            function () {\n                if (this.isLiveRoute) {\n                    if (this.get('sidebarService.sidebarExpanded')) {\n                        this.set('documents.lastSegment', this.get('documents.currentSegment'));\n                    } else {\n                        this.set('documents.lastSegment', null);\n                    }\n                }\n            }\n        ),\n\n        actions: {\n            willTransition: function (transition) {\n                var isWithinCM = transition.targetName === CONTENT_MANAGEMENT,\n                    isWithinEngage = transition.targetName === ENGAGE,\n                    isDirectoryRoute = this.engage.isDirectoryRoute(this.get('documents.currentSegment')),\n                    isEngage = isWithinCM || isWithinEngage,\n                    isSideBarExpanded = this.get('sidebarService.sidebarExpanded');\n\n                if (!isEngage) {\n                    this.controller.setEngageInactive();\n                }\n\n                this.set('isLiveRoute', false);\n\n                if ((!isWithinCM && !isDirectoryRoute) || isSideBarExpanded) {\n                    this.set('documents.lastSegment', this.get('documents.currentSegment'));\n                } else {\n                    this.set('documents.lastSegment', null);\n                }\n\n                return true;\n            }\n        }\n    });\n\nexport default ContentManagementRoute;\n","import { inject as service } from '@ember/service';\nimport Route from '@ember/routing/route';\n\nexport default Route.extend({\n    intl: service(),\n\n    routeTitle() {\n        return this.intl.safestring('chat.conversations').toString();\n    },\n\n    afterModel(model, transition) {\n        transition.send('togglePanel', 'conversations');\n        transition.send('toggleCommunicationSidebarExpanded');\n        return this.transitionTo('index');\n    }\n});\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\n\nexport default Route.extend({\n    session: service(),\n    beforeModel() {\n        this._super(...arguments);\n        return this.replaceWith('/admin/custom-fields-v2/contacts');\n    }\n});\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\n\nexport default Route.extend({\n    session: service(),\n    beforeModel() {\n        this._super(...arguments);\n        return this.replaceWith('/admin/custom-fields-v2/external-orgs');\n    }\n});\n","import Route from '@ember/routing/route';\n\nexport default Route.extend({\n    init() {\n        this._super(...arguments);\n    },\n\n    redirect() {\n        this.replaceWith('/admin/telephony/did/assignments');\n    }\n});\n","import Route from '@ember/routing/route';\n\nconst QUERY_REGEX = /\\?.*$/;\nconst EMBEDDED_TARGETS = ['engage', 'engage.index', 'engage.embedded'];\n\nexport default Route.extend({\n    setupController(controller, model) {\n        this._super(controller, model);\n\n        var hashMatch = QUERY_REGEX.exec(window.location.hash);\n        if (hashMatch) {\n            model.engagePath = model.engagePath + hashMatch[0];\n        }\n\n        controller.setEngageActive();\n    },\n\n    actions: {\n        didTransition() {\n            this.send('closePanel');\n        },\n\n        willTransition(transition) {\n            if (EMBEDDED_TARGETS.indexOf(transition.targetName) === -1) {\n                this.controller.setEngageInactive();\n            }\n            return true;\n        }\n    }\n});\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\n\nexport default Route.extend({\n    session: service(),\n    beforeModel() {\n        this._super(...arguments);\n        return this.replaceWith('/quality/screenrecordings/inprogress');\n    }\n});\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\n\nexport default Route.extend({\n    session: service(),\n    beforeModel(transition) {\n        this._super(...arguments);\n        // Use Ember 3.x RouteInfo API (transition.to.params) instead of the\n        // deprecated transition.params API removed in Ember 3.28 (ATLAS-2207)\n        const interactionId = transition.to.params.interaction_id;\n        const timezone = transition.to.queryParams['timezone'];\n        let locationURL = `/screen-recording-ui/#/interactions/${interactionId}`;\n        if (timezone) {\n            locationURL = `${locationURL}?timezone=${timezone}`;\n        }\n        window.location.replace(locationURL);\n    }\n});\n","import Route from '@ember/routing/route';\n\nexport default Route.extend({\n    model() {\n        return this.replaceWith('/analytics/interactions');\n    }\n});\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\n\nexport default Route.extend({\n    session: service(),\n    beforeModel(transition) {\n        this._super(...arguments);\n        // Use Ember 3.x RouteInfo API (transition.to.params) instead of the\n        // deprecated transition.params API removed in Ember 3.28 (ATLAS-2207)\n        const interactionId = transition.to.params.interaction_id;\n        const timezone = transition.to.queryParams['timezone'];\n        let locationURL = `/screen-recording-ui/#/interactions/${interactionId}/video-recordings`;\n        if (timezone) {\n            locationURL = `${locationURL}?timezone=${timezone}`;\n        }\n        window.location.replace(locationURL);\n    }\n});\n","import Route from '@ember/routing/route';\n\nexport default Route.extend({\n    redirect(model) {\n        this.replaceWith('/admin/quality/' + model.qualityPath.replace(/^\\//, ''));\n    }\n});\n","import { inject as service } from '@ember/service';\nimport Route from '@ember/routing/route';\n\nexport default Route.extend({\n    session: service('session'),\n\n    redirect(model, transition) {\n        const engagePath = transition.intent.url.replace(/\\/engage\\//, '');\n        const isEmbeddedEngageRoute = engagePath.indexOf('admin') > -1 || engagePath === 'quality';\n\n        if (engagePath === 'quality') {\n            // To keep current behaviour, navigating to the Quality Admin route (`#/engage/quality`) will redirect to Evaluation Forms view\n            return this.replaceWith('/admin/quality/evaluationForms');\n        }\n        if (isEmbeddedEngageRoute) {\n            return this.transitionTo('engage.embedded', { engagePath });\n        }\n    }\n});\n","import Route from '@ember/routing/route';\n\nexport default Route.extend({\n    model(params) {\n        return this.replaceWith(`/analytics/queues/${params.queueId}/activity`);\n    }\n});\n","import Route from '@ember/routing/route';\n\nexport default Route.extend({\n    model() {\n        return this.replaceWith('/analytics/queues/activity');\n    }\n});\n","import Route from '@ember/routing/route';\n\nexport default Route.extend({\n    model(params) {\n        return this.replaceWith(`/analytics/queues/${params.queueId}/performance`);\n    }\n});\n","import Route from '@ember/routing/route';\n\nexport default Route.extend({\n    model() {\n        return this.replaceWith('/analytics/queues/performance');\n    }\n});\n","import { inject } from '@ember/service';\nimport Route from '@ember/routing/route';\n\nexport default Route.extend({\n    session: inject('session'),\n    beforeModel() {\n        this._super(...arguments);\n        return this.replaceWith('/admin/quality/recordingManagement');\n    }\n});\n","import Route from '@ember/routing/route';\n\nexport default Route.extend({\n    init() {\n        this._super(...arguments);\n    },\n\n    redirect() {\n        return this.replaceWith('/admin/telephony/extensions');\n    }\n});\n","import { inject as service } from '@ember/service';\nimport Route from '@ember/routing/route';\nimport { kebabCase } from 'web-directory/utils/string-transforms';\n\nexport default Route.extend({\n    session: service('session'),\n\n    redirect(model) {\n        // Redirect old PCBA/engage Telephony Admin routes to iframe-coordinator app, e.g.\n        // #/engage/telephonyAdmin/phoneManagement/baseSettings -> #/admin/telephony/phone-management/base-settings\n        const path = model.telephonyPath.replace(/^\\//, '').replace('authorizedServices', 'certificate-authorities'); // 'authorized services' is old, the new route should be certificate-authorities\n        const parts = path.split('/');\n\n        for (let index = 0; index < 2 && index < parts.length; index++) {\n            parts[index] = kebabCase(parts[index]);\n        }\n\n        this.replaceWith('/admin/telephony/' + parts.join('/'));\n    }\n});\n","import { inject as service } from '@ember/service';\nimport Route from '@ember/routing/route';\n\nexport default Route.extend({\n    session: service('session'),\n\n    init() {\n        this._super(...arguments);\n    },\n\n    redirect(model) {\n        this.replaceWith('/admin/wfm/' + model.wfmPath.replace(/^\\//, ''));\n    }\n});\n","import { inject as service } from '@ember/service';\nimport { get } from '@ember/object';\nimport Route from '@ember/routing/route';\n\nexport default Route.extend({\n    application: service(),\n\n    setupController(c, m, transition) {\n        this._super(...arguments);\n\n        if (this.get('application.mobileQueryParameter') || get(transition, 'queryParams.mobile')) {\n            this.set('application.context', 'adminui');\n        }\n    }\n});\n","import { resolve } from 'rsvp';\nimport { inject as service } from '@ember/service';\nimport Route from '@ember/routing/route';\n\nconst IndexRoute = Route.extend({\n    session: service(),\n    permissions: service(),\n\n    beforeModel: function (transition) {\n        var result = this._super(transition);\n\n        /* @see services/Session.authenticateWithSession() as this is the ember-simple-auth\n         * authenicator handler function before this route catch-all (empty) route.\n         */\n\n        if (transition.isActive === false) {\n            // Route canceled for auth\n            return;\n        }\n\n        return resolve(result).then(() => {\n            var personId = this.get('session.person.id') || this.get('session.user.personId');\n\n            if (this.get('session.user.isSuper') || this.get('session.user.isTrustee')) {\n                return this.transitionTo('/search-v2');\n            }\n\n            if (!personId) {\n                console.error(\"Index Route: Standard user has no 'personId'.  Transitioning to no-access.\");\n                this.set('session.hasAppAccess', false);\n                return this.transitionTo('no-access');\n            }\n\n            if (this.get('permissions.canViewAgentActivity')) {\n                const isHubEnabled = this.get('session.features')\n                    ? this.get('session.features')['WEM-1476_Agent-Activity-Migration']\n                    : false;\n                if (isHubEnabled) {\n                    return this.transitionTo('center-stage-frame-operationsHub');\n                }\n                return this.transitionTo('center-stage-frame-agentHome');\n            }\n\n            return this.transitionTo(`/person-v2/${personId}`);\n        });\n    }\n});\n\nexport default IndexRoute;\n","import InteractionDetailRedirectRoute from 'web-directory/routes/interaction-detail-redirect';\n\nexport default InteractionDetailRedirectRoute.extend({\n    adminAgentSegment: 'agent'\n});\n","import Route from '@ember/routing/route';\nimport { buildInteractionDetailRedirectPath } from 'web-directory/utils/analytics-routing';\n\nexport default Route.extend({\n    adminAgentSegment: 'admin',\n\n    model(params, transition) {\n        // Use the Ember 3.x RouteInfo API. The legacy `transition.queryParams`\n        // accessor was removed as part of the 3.28 upgrade (ATLAS-2207); reading\n        // it now yields `undefined`, which the redirect util silently coerces to\n        // `{}` — so every query param was being dropped before the redirect ever\n        // reached the analytics IFC route (ATLAS-2439). ATLAS-2434's IFC\n        // pass-through fix cannot recover params that were stripped upstream.\n        const queryParams = transition.to && transition.to.queryParams;\n\n        const url = buildInteractionDetailRedirectPath({\n            urlParams: params,\n            queryParams,\n            adminAgentSegment: this.adminAgentSegment\n        });\n\n        return this.replaceWith(url);\n    }\n});\n","import { scheduleOnce } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport Route from '@ember/routing/route';\n\nexport default Route.extend({\n    interaction: service(),\n    sidebar: service(),\n\n    init() {\n        this._super(...arguments);\n        this.set('sidebar.allowedPopoutPanels', ['acdInteractions']);\n    },\n\n    model: function (params) {\n        return {\n            interactionId: params.interactionId\n        };\n    },\n\n    afterModel: function (model) {\n        const interactionId = model.interactionId;\n        this.set('interaction.requestedInteraction', interactionId);\n        scheduleOnce('afterRender', this, function () {\n            this.sidebar.openPanel('acdInteractions');\n        });\n    }\n});\n","import { scheduleOnce } from '@ember/runloop';\nimport { inject as service } from '@ember/service';\nimport Route from '@ember/routing/route';\n\nexport default Route.extend({\n    interaction: service(),\n    sidebar: service(),\n\n    init() {\n        this._super(...arguments);\n        this.set('sidebar.allowedPopoutPanels', ['acdInteractions']);\n    },\n\n    model: function () {\n        return this.interaction.get('selectedInteraction');\n    },\n\n    afterModel: function () {\n        scheduleOnce('afterRender', this, function () {\n            this.sidebar.openPanel('acdInteractions');\n        });\n    }\n});\n","import Route from '@ember/routing/route';\n\nexport default Route.extend();\n","import { inject as service } from '@ember/service';\nimport { getOwner } from '@ember/application';\nimport EmberObject, { computed } from '@ember/object';\nimport Route from '@ember/routing/route';\nimport RSVP, { resolve } from 'rsvp';\nimport { POLICY_ACCESS_DENIED_TYPE, SESSION_BOOTSTRAP_ERROR_TYPE } from 'web-directory/services/session';\nimport { getRestorableRoutePath } from 'web-directory/utils/post-auth-redirect';\n\nvar OAuth2LoginRoute = Route.extend({\n    controllerName: 'login-oauth',\n\n    intl: service(),\n    session: service(),\n    application: service(),\n    purecloudOauth: service(),\n    authenticator: null,\n\n    routeTitle: computed(function () {\n        return this.intl.safestring('auth.login').toString();\n    }),\n\n    actions: {\n        mobileOfferDeclined() {\n            this.set('application.offerMobileApp', false);\n            return resolve();\n        },\n        authenticate() {\n            return this._authenticate(this.modelFor(this.routeName));\n        }\n    },\n\n    beforeModel: function () {\n        var hostedContext = this.get('application.hostedContext');\n        if (hostedContext.isHosted() && hostedContext.supportsRegions() && !hostedContext.getRegion()) {\n            return this.transitionTo('region-chooser');\n        }\n\n        if (!this.authenticator) {\n            let authenticator = getOwner(this).lookup('authenticator:directory');\n            if (authenticator) {\n                this.set('authenticator', authenticator);\n            } else {\n                console.error(\"Failed to locate 'authenticator:directory' in Container.\");\n                this.set('application.errorState', { type: 'missingAuthenticator' });\n                return this.transitionTo('maintenance');\n            }\n        }\n\n        // Only redirect if the session is already authenticated\n        // This matches the behavior of the deprecated UnauthenticatedRouteMixin\n        if (this.get('session.isAuthenticated')) {\n            // Prefer the route requested before authentication. The gc-mfe-auth flow\n            // has already restored it into the fragment by this point; falling\n            // straight through to index is one of the paths that stranded refreshes\n            // on /home. (ATLAS-2424)\n            const restoredRoute = getRestorableRoutePath(window.location.hash);\n            return this.transitionTo(restoredRoute || 'index');\n        }\n\n        return this.intl.loadTranslations();\n    },\n\n    model: function () {\n        return EmberObject.create(this.authenticator.extractAuthData());\n    },\n\n    afterModel: function (resolvedModel) {\n        if (resolvedModel.access_token) {\n            // Returning from Successful Login\n\n            /*\n             * Set denied so we don't get reprompted by this route or application\n             * The user is either not mobile or previously denied the app before login\n             */\n            this.set('application.offerMobileApp', false);\n\n            resolvedModel.set('offerMobileApp', this.get('application.offerMobileApp'));\n            // Resolve with the model to show loading screen and init local session\n            return RSVP.resolve(resolvedModel);\n        } else {\n            // Need authentication\n\n            resolvedModel.state = this.purecloudOauth.serializeRestoreState();\n\n            let offerMobileApp = this.get('application.offerMobileApp') && !this.get('purecloudOauth.inLogoutBounce');\n\n            if (offerMobileApp) {\n                // Resolve with the model to show mobile offer and then auth\n                resolvedModel.set('offerMobileApp', true);\n                return RSVP.resolve(resolvedModel);\n            } else {\n                // Return a non-resolving promise so the redirect can complete without a flash of the route\n                return new RSVP.Promise(() => {\n                    this.set('holdPromiseRef', this._authenticate(resolvedModel));\n                });\n            }\n        }\n    },\n\n    /**\n     * Invokes the OAuth authenticator.\n     *\n     * @returns An promise which will either:\n     * <ul>\n     * <li>Resolve on authenticator success.  [Note:] ESA will transition on success/failure.</li>\n     * <li>Handle the authenticator failure (auth UI, no-access, policy-access-denied, failure) and reject for callers.  Callers do not need to take any action.</li>\n     * </ul>\n     */\n    _authenticate: function (authData) {\n        return new RSVP.Promise((resolve, reject) => {\n            this.session\n                .authenticate('authenticator:directory', authData)\n                .then(resolve)\n                .catch(rejectionDetails => {\n                    if (rejectionDetails && rejectionDetails.reason === 'noToken') {\n                        reject('unauthenticated');\n                        window.location = rejectionDetails.authUrl;\n                    } else if (rejectionDetails && rejectionDetails.reason === 'noAccess') {\n                        // Currently don't distinguish between 400s and 500s in local session.  Assuming our services are ok\n                        reject('unauthorized');\n                        this.transitionTo('no-access');\n                    } else if (rejectionDetails && rejectionDetails.reason === POLICY_ACCESS_DENIED_TYPE) {\n                        reject('unauthorized');\n                        this.transitionTo('policy-access-denied');\n                    } else if (rejectionDetails && rejectionDetails.reason === SESSION_BOOTSTRAP_ERROR_TYPE) {\n                        // Bootstrap error will already have been logged\n                        reject('failure');\n                        this.set('application.errorState', {\n                            type: SESSION_BOOTSTRAP_ERROR_TYPE,\n                            failedStep: rejectionDetails.failedStep,\n                            status: rejectionDetails.status\n                        });\n                        this.transitionTo('maintenance');\n                    } else {\n                        let authFailureReason =\n                            rejectionDetails && rejectionDetails.reason ? rejectionDetails.reason : 'authFailure';\n                        console.error('Authentication Failed:', {\n                            rejectionDetails,\n                            remoteData: {\n                                sensitive: {\n                                    reason: authFailureReason\n                                }\n                            }\n                        });\n                        reject('failure');\n                        this.set('application.errorState', {\n                            type: 'generalAuthenticationFailure'\n                        });\n                        this.transitionTo('maintenance');\n                    }\n                });\n        });\n    }\n});\n\nexport default OAuth2LoginRoute;\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\n\n// This route's sole purpose is to redirect users to the index page. It's for people who have bookmarked the login page\nvar LoginRoute = Route.extend({\n    router: service('router'),\n    session: service(),\n\n    beforeModel: function (transition) {\n        // Only redirect to index if the session is already authenticated\n        // This matches the behavior of the deprecated UnauthenticatedRouteMixin\n        if (this.get('session.isAuthenticated')) {\n            return this.router.transitionTo('index');\n        }\n\n        if (transition.isActive === false) {\n            // Route canceled for auth\n            return;\n        }\n\n        return this.router.transitionTo('index');\n    }\n});\n\nexport default LoginRoute;\n","import type { SidebarService } from '@web-directory/services';\nimport Ember from 'ember';\nimport { Promise, resolve } from 'rsvp';\nimport UnrecoverableAppFailure, { isSessionBootstrapFailure } from 'web-directory/models/unrecoverable-app-failure';\nimport { buildCommonTelemetryContext } from 'web-directory/services/analytics';\nimport { hasKey } from 'web-directory/utils/types';\nimport UnprotectedRouteMixin from '../mixins/unprotected-route-mixin';\nimport { Transition } from '../utils/ember-types';\nimport { addPageAction } from '../utils/newrelic';\n\nconst { inject, Route } = Ember;\n\nconst MaintenanceRoute = Route.extend(UnprotectedRouteMixin, {\n    intl: inject.service(),\n    session: inject.service(),\n    applicationService: inject.service('application'),\n    sidebar: inject.service(),\n\n    beforeModel: function (transition: Transition): any {\n        return resolve()\n            .then(() => {\n                return this._super(transition);\n            })\n            .then(() => {\n                if (hasKey(transition, 'isActive') && transition.isActive === false) {\n                    // Route canceled for auth\n                    return;\n                }\n\n                const errorState = this.get('applicationService').get('errorState');\n                if (!errorState) {\n                    return this.transitionTo('index');\n                }\n\n                let bootstrapErrorDetails;\n                if (isSessionBootstrapFailure(errorState)) {\n                    bootstrapErrorDetails = {\n                        failedBootstrapStep: errorState.failedStep,\n                        status: errorState.status\n                    };\n                }\n\n                addPageAction(\n                    'maintenanceMode',\n                    Object.assign(\n                        {\n                            failureType: errorState.type\n                        },\n                        bootstrapErrorDetails,\n                        buildCommonTelemetryContext({\n                            applicationService: this.get('applicationService'),\n                            sessionService: this.get('session'),\n                            intlService: this.get('intl')\n                        })\n                    )\n                );\n\n                return (this.get('intl') as any).loadTranslations();\n            });\n    },\n\n    model: function (): Promise<undefined | UnrecoverableAppFailure> {\n        return resolve()\n            .then(() => {\n                return this._super(...arguments);\n            })\n            .then(() => {\n                // Force close the sidebar to ensure the view can be seen\n                (this.get('sidebar') as SidebarService).closePanel();\n\n                // We assert errorState exists in the beforeModel hook.\n                // The controller still needs to account for untyped errorState until we're fully TS\n                return this.get('applicationService').get('errorState')!;\n            });\n    },\n\n    actions: {\n        reloadApp: function () {\n            (this.get('session') as any)._reloadApplication();\n        }\n    }\n});\n\nexport default MaintenanceRoute;\n","import Route from '@ember/routing/route';\nimport UnprotectedRouteMixin from '../mixins/unprotected-route-mixin';\n\nexport default Route.extend(UnprotectedRouteMixin, {\n    beforeModel() {\n        this._super(...arguments);\n        return this.intl.loadTranslations();\n    }\n});\n","import Route from '@ember/routing/route';\n\nexport default Route.extend({\n    beforeModel() {\n        this._super(...arguments);\n        return this.replaceWith(`/partners/ui/clients`);\n    }\n});\n","import Route from '@ember/routing/route';\nimport UnprotectedRouteMixin from '../mixins/unprotected-route-mixin';\n\nexport default Route.extend(UnprotectedRouteMixin, {\n    beforeModel() {\n        this._super(...arguments);\n        return this.intl.loadTranslations();\n    }\n});\n","import { reject } from 'rsvp';\nimport { inject as service } from '@ember/service';\nimport Route from '@ember/routing/route';\n\nvar LoginRoute = Route.extend({\n    intl: service(),\n    application: service(),\n    session: service(),\n\n    routeTitle() {\n        return this.intl.safestring('components.region.title').toString();\n    },\n\n    beforeModel(transition) {\n        // Only redirect to index if the session is already authenticated\n        // This matches the behavior of the deprecated UnauthenticatedRouteMixin\n        if (this.get('session.isAuthenticated')) {\n            return this.transitionTo('index');\n        }\n\n        if (transition.isActive === false) {\n            // Route canceled for auth\n            return;\n        }\n\n        const hostedContext = this.get('application.hostedContext');\n\n        if (!hostedContext || !hostedContext.isHosted() || !hostedContext.supportsRegions()) {\n            console.error('Attempted to access region-chooser route without a valid hostedContext');\n            return reject('invalidHostedContext');\n        }\n\n        return this.intl.loadTranslations();\n    }\n});\n\nexport default LoginRoute;\n","import Route from '@ember/routing/route';\n\nexport default Route.extend({\n    beforeModel() {\n        this._super(...arguments);\n        const contactId = this.paramsFor(this.routeName).contact_id;\n        this.sidebar.closePanel();\n        return this.replaceWith(`/contactsAndOrganizations/contact/${contactId}`);\n    }\n});\n","import { inject as service } from '@ember/service';\nimport Route from '@ember/routing/route';\n\nexport default Route.extend({\n    application: service(),\n    session: service(),\n\n    beforeModel() {\n        // Only redirect to index if the session is already authenticated\n        // This matches the behavior of the deprecated UnauthenticatedRouteMixin\n        if (this.get('session.isAuthenticated')) {\n            return this.transitionTo('index');\n        }\n    },\n\n    afterModel(model) {\n        const path = this.application.pcAuthUri(`#/reset-password/${model.token}`);\n        window.location.replace(path);\n    }\n});\n","import { inject as service } from '@ember/service';\nimport Route from '@ember/routing/route';\nimport { run } from '@ember/runloop';\n\nexport default Route.extend({\n    chat: service(),\n    sidebar: service(),\n\n    model(params) {\n        return this.chat.getChatRoom(params.roomJid);\n    },\n\n    afterModel(model) {\n        this._super(...arguments);\n        run.scheduleOnce('afterRender', this, function () {\n            run.later(() => {\n                model.set('isPopout', true);\n                model.set('showingVideo', true);\n                model.set('joinScreenShareImmediately', true);\n                this.set('chat.popoutRoom', model);\n            }, 1000);\n\n            this.sidebar.expandCommunicationSidebar();\n        });\n    }\n});\n","import { inject as service } from '@ember/service';\nimport Route from '@ember/routing/route';\n\nexport default Route.extend({\n    application: service(),\n    session: service(),\n\n    beforeModel() {\n        // Only redirect to index if the session is already authenticated\n        // This matches the behavior of the deprecated UnauthenticatedRouteMixin\n        if (this.get('session.isAuthenticated')) {\n            return this.transitionTo('index');\n        }\n    },\n\n    afterModel(model) {\n        const path = this.application.pcAuthUri(`#/signup/${model.token}`);\n        window.location.replace(path);\n    }\n});\n","import { inject as service } from '@ember/service';\nimport Route from '@ember/routing/route';\n\nimport ModelRouteMixin from '../../mixins/model-route';\n\nvar SkillGroupDetailRoute = Route.extend(ModelRouteMixin, {\n    intl: service(),\n    session: service(),\n    notification: service(),\n\n    routeTitle: 'Skill Group Profile'\n});\n\nexport default SkillGroupDetailRoute;\n","import { inject as service } from '@ember/service';\nimport Route from '@ember/routing/route';\nimport { computed, get } from '@ember/object';\nimport { POOL_STATES } from '../../models/app-pool';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport appUtils from '../../utils/apps';\n\nconst STANDALONE_APP_ROUTE_LOG_NS = 'Route';\n\nexport default Route.extend(LoggerMixin, {\n    apps: service(),\n    intl: service(),\n\n    appsProblem: false,\n    unknownApp: false,\n    currAppName: null,\n\n    routeTitle: computed('appsProblem', 'unknownApp', 'currAppName', function () {\n        let result = null;\n\n        if (this.appsProblem) {\n            result = this.intl.safestring('apps.loadFailedTitle').toString();\n        } else if (this.unknownApp) {\n            result = this.intl.safestring('apps.notFoundTitle').toString();\n        } else {\n            result = this.currAppName || this.intl.safestring('apps.title').toString();\n        }\n\n        return result;\n    }),\n\n    beforeModel(transition) {\n        var result = this._super(transition);\n\n        if (transition.isActive === false) {\n            // Route canceled for auth\n            return;\n        }\n\n        this.set('appsProblem', false);\n        this.set('unknownApp', false);\n        /*\n         * Clear currAppName so it will trigger a routeTitle update if the\n         *  user is bouncing between a single app and a non-app route.\n         */\n        this.set('currAppName', null);\n        return result;\n    },\n\n    model(params) {\n        let appPool = this.get('apps.standaloneAppPool');\n\n        return appPool\n            .showApp(params.app_id)\n            .then(poolState => {\n                let result = null;\n\n                if (poolState && poolState.name === POOL_STATES.SHOWING_APP) {\n                    this.set('currAppName', get(poolState, 'details.instance.app.name'));\n\n                    result = {\n                        instanceId: get(poolState, 'details.instance.instanceId')\n                    };\n                }\n\n                return result;\n            })\n            .catch(poolState => {\n                if (poolState && poolState.name === POOL_STATES.APP_NOT_FOUND) {\n                    this.set('unknownApp', true);\n\n                    // Possible Causes:\n                    // User using old or unauthorized link\n                    // User reloaded PureCloud on this route and the app has been deleted or he/she no longer has permission\n                    // Pool state and menu out of sync (Should not happen)\n                    this.logger.warn(\n                        appUtils.buildStandaloneAppLogMsg(\n                            'Unknown App requested in route param.',\n                            STANDALONE_APP_ROUTE_LOG_NS\n                        ),\n                        {\n                            poolState,\n                            remoteData: {\n                                appId: params.app_id,\n                                poolState: get(poolState, 'name')\n                            }\n                        }\n                    );\n                } else {\n                    this.set('appsProblem', true);\n\n                    this.logger.error(\n                        appUtils.buildStandaloneAppLogMsg('Failed to show App in route', STANDALONE_APP_ROUTE_LOG_NS),\n                        {\n                            poolState,\n                            remoteData: {\n                                appId: params.app_id,\n                                poolState: get(poolState, 'name')\n                            }\n                        }\n                    );\n                }\n\n                return null;\n            })\n            .finally(() => {\n                this.set('apps.standaloneAppPoolVisible', true);\n            });\n    },\n\n    actions: {\n        willTransition() {\n            let model = this.modelFor(this.routeName);\n\n            if (model && model.instanceId) {\n                // Determine if the pool is still showing the app for this route.\n                // The app for this route may not be shown if the app has been hidden/stopped/closed for\n                // another reason (e.g. Removed App closed by user) and we are transitioning to another route (e.g. index).\n                let initPoolState = this.get('apps.standaloneAppPool.currState');\n\n                if (\n                    initPoolState &&\n                    initPoolState.name === POOL_STATES.SHOWING_APP &&\n                    get(initPoolState, 'details.instanceId') === model.instanceId\n                ) {\n                    // Pool is showing this route's app, attempt to hide it.\n                    this.get('apps.standaloneAppPool')\n                        .hideApp(model.instanceId)\n                        .catch(rejectionPoolState => {\n                            // Ignore the failure as we still want to proceed and hide the pool\n                            // Log this as it should not happen\n                            this.logger.error(\n                                appUtils.buildStandaloneAppLogMsg(\n                                    'Failed to hide standalone app when trying to transition out of route',\n                                    STANDALONE_APP_ROUTE_LOG_NS\n                                ),\n                                {\n                                    initPoolState,\n                                    rejectionPoolState,\n                                    remoteData: {\n                                        routeAppId: model.instanceId,\n                                        initPoolState: get(initPoolState, 'name'),\n                                        rejectionPoolState: get(rejectionPoolState, 'name')\n                                    }\n                                }\n                            );\n                        });\n                }\n            }\n\n            this.set('apps.standaloneAppPoolVisible', false);\n\n            return true;\n        }\n    }\n});\n","import { inject as service } from '@ember/service';\nimport Route from '@ember/routing/route';\nimport RSVP from 'rsvp';\nimport Ember from 'ember';\nimport { PRODUCTION_LIKE_ENVS } from 'web-directory/utils/net';\n\nconst { Logger } = Ember;\n\nexport default Route.extend({\n    queryParams: {\n        targetRoute: {\n            refreshModel: true\n        }\n    },\n    application: service(),\n    alerting: service(),\n    intl: service(),\n\n    routeTitle() {\n        return this.intl.safestring('timemachine.title').toString();\n    },\n\n    model(params, transition) {\n        let redirectUrl = window.location.origin || `${window.location.protocol}//${window.location.host}`;\n\n        redirectUrl += window.location.pathname;\n\n        if (redirectUrl.charAt(redirectUrl.length - 1) !== '/') {\n            redirectUrl += '/';\n        }\n\n        let hashRoute = '';\n        let targetRoute = (params.targetRoute || '').trim();\n        if (targetRoute) {\n            if (targetRoute.charAt(0) !== '/') {\n                targetRoute = '/' + targetRoute;\n            }\n            hashRoute = '#' + targetRoute;\n        }\n\n        redirectUrl += `${params.buildTag}/index.html`;\n        redirectUrl += window.location.search;\n        redirectUrl += hashRoute;\n\n        const runtime = this.get('application.runtime');\n        if (runtime.local) {\n            Logger.error('Timemachine is not available locally.  Use the Git Capacitor.');\n            transition.abort();\n            this.transitionTo('index');\n        } else if (PRODUCTION_LIKE_ENVS.includes(runtime.env)) {\n            return {\n                redirectUrl,\n                buildTag: params.buildTag\n            };\n        } else {\n            // Return a non-resolving promise to let the redirect complete\n            return new RSVP.Promise(() => {\n                window.location = redirectUrl;\n            });\n        }\n    },\n\n    afterModel(model) {\n        if (!model || !model.redirectUrl) {\n            return;\n        }\n\n        this._showTimeMachineModal(model);\n    },\n\n    async _showTimeMachineModal(model) {\n        const intl = this.get('intl');\n        const escapedBuildTag = Ember.Handlebars.Utils.escapeExpression(model.buildTag || '');\n\n        const content = `${intl.t('timemachine.intendedDestination', { buildNumber: escapedBuildTag })} \\n\\n${intl.t(\n            'timemachine.disclaimer'\n        )}`;\n\n        const result = await this.get('alerting').pushModal({\n            title: intl.t('timemachine.title').toString(),\n            size: 'medium',\n            content,\n            buttons: {\n                positive: {\n                    id: 'confirm',\n                    label: intl.t('timemachine.confirm.label').toString()\n                },\n                negative: {\n                    id: 'cancel',\n                    label: intl.t('timemachine.cancel.desc').toString()\n                }\n            }\n        });\n\n        if (result.type === 'buttonClicked' && result.buttonId === 'confirm') {\n            window.location = model.redirectUrl;\n        } else {\n            this.transitionTo('index');\n        }\n    }\n});\n","import { inject as service } from '@ember/service';\nimport Route from '@ember/routing/route';\n\nexport default Route.extend({\n    intl: service(),\n    session: service(),\n\n    templateName: 'timeline',\n\n    afterModel: function () {\n        this.set(\n            'routeTitle',\n            this.intl.safestring('timeline.title').toString() + ' - ' + this.get('session.org.name')\n        );\n    },\n\n    setupController(controller) {\n        this._super(...arguments);\n        controller.set('features', this.get('session.features'));\n    }\n});\n","import { inject as service } from '@ember/service';\nimport Mixin from '@ember/object/mixin';\n\nconst DEFAULT_PARAMS = {\n    pageNumber: 1,\n    pageSize: 25,\n    types: ['users', 'groups', 'locations'],\n    sortOrder: 'ASC',\n    expand: ['authorization']\n};\n\nexport default Mixin.create({\n    search: service('search'),\n\n    performSimpleKeywordSearch(query, params) {\n        params = Object.assign({}, DEFAULT_PARAMS, params, {\n            query: [\n                {\n                    value: query,\n                    type: 'QUERY_STRING'\n                }\n            ],\n            returnFields: this.get('search.fields')\n        });\n        const url = this.get('search.apiEndpoint');\n        return this.ajax(url, 'POST', { data: params });\n    },\n\n    performSearch(params) {\n        params = Object.assign({}, DEFAULT_PARAMS, { returnFields: this.get('search.fields') }, params);\n        const url = this.get('search.apiEndpoint');\n        return this.ajax(url, 'POST', { data: params });\n    },\n\n    suggest(params) {\n        params = Object.assign({}, DEFAULT_PARAMS, { returnFields: this.get('search.fields') }, params);\n        const url = this.get('search.suggestEndpoint');\n        return this.ajax(url, 'POST', { data: params });\n    }\n});\n","import { assert } from '@ember/debug';\nimport EmberObject, { computed } from '@ember/object';\nimport _ from 'lodash';\nimport { SEARCH_QUERY_OPERATORS, SEARCH_AGGREGATE_TYPES, SEARCH_QUERY_TYPES } from './service';\n\nimport { BASE_PERSON_FIELDS, BASE_PERSON_EXPANDS } from '../models/person';\n\nexport default EmberObject.extend({\n    service: null,\n\n    page: null,\n    limit: null,\n\n    types: null,\n    queries: null,\n    aggregations: null,\n    returnFields: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.queries = [];\n        this.aggregations = [];\n        this.types = ['users', 'groups', 'locations'];\n    },\n\n    data: computed('queries.[]', 'aggregations.[]', 'types.[]', function () {\n        const { queries, aggregations, page, limit, types, returnFields } = this;\n\n        const data = {\n            types\n        };\n\n        if (queries.length) {\n            data.query = queries;\n        }\n\n        // You can only search on users when you have aggregations\n        if (aggregations.length) {\n            data.aggregations = aggregations;\n            data.types = ['users'];\n        }\n\n        if (typeof page === 'number') {\n            data.pageNumber = page;\n        }\n\n        if (typeof limit === 'number') {\n            data.pageSize = limit;\n        }\n\n        if (returnFields && Array.isArray(returnFields)) {\n            data.returnFields = returnFields;\n        } else {\n            if (data.types.indexOf('users') === -1) {\n                data.returnFields = ['ALL_FIELDS'];\n            } else {\n                data.returnFields = BASE_PERSON_FIELDS;\n            }\n        }\n\n        data.expand = BASE_PERSON_EXPANDS;\n\n        return data;\n    }),\n\n    addQuery(value, operator = 'AND', type = 'QUERY_STRING', fields = []) {\n        assert(`Operator must be one of: ${SEARCH_QUERY_OPERATORS}`, _.includes(SEARCH_QUERY_OPERATORS, operator));\n        assert(`Type must be one of: ${SEARCH_QUERY_TYPES}`, _.includes(SEARCH_QUERY_TYPES, type));\n\n        if (type === 'QUERY_STRING') {\n            assert('If query type is `QUERY_STRING`, the query value must have a length >= 2', value.length >= 2);\n        }\n\n        const query = {\n            type\n        };\n\n        if (type !== 'MATCH_ALL') {\n            query.operator = operator;\n            query.value = value;\n        }\n\n        if (!_.isEmpty(fields)) {\n            query.fields = fields;\n        }\n\n        this.queries.pushObject(query);\n\n        return this;\n    },\n\n    // Add multiple queries at once. Pass in as arrays:\n    // [value, operator, ...], [value, operator, ...]\n    addQueries() {\n        const queries = [...arguments];\n        queries.forEach(query => {\n            this.addQuery(...query);\n        });\n        return this;\n    },\n\n    addTagQuery() {\n        return this;\n    },\n\n    addAggregation(name, value, field = 'profileSkills', type = 'CONTAINS', size = 15) {\n        assert(`Type must be one of: ${SEARCH_AGGREGATE_TYPES}`, _.includes(SEARCH_AGGREGATE_TYPES, type));\n        if (type !== 'COUNT') {\n            assert(\n                'You much include a name and value when type is not `COUNT`',\n                type !== 'COUNT' || (!!name && !!value)\n            );\n        }\n\n        const aggregation = {\n            name,\n            field,\n            type,\n            size\n        };\n\n        if (value) {\n            aggregation.value = value;\n        }\n\n        this.aggregations.pushObject(aggregation);\n\n        return this;\n    },\n\n    addAggregations() {\n        const aggregations = [...arguments];\n        aggregations.forEach(aggregation => {\n            this.addAggregation(...aggregation);\n        });\n        return this;\n    },\n\n    setPaging(page, limit) {\n        this.setProperties({ page, limit });\n        return this;\n    },\n\n    setTypes(types) {\n        types = types.map(type => {\n            if (type === 'people') {\n                return 'users';\n            }\n            return type;\n        });\n        this.set('types', types);\n        return this;\n    },\n\n    setReturnFields(returnFields) {\n        if (returnFields && returnFields.length) {\n            this.set('returnFields', returnFields);\n        } else {\n            this.set('returnFields', undefined);\n        }\n        return this;\n    }\n});\n","import { reads } from '@ember/object/computed';\nimport { computed } from '@ember/object';\nimport RSVP, { resolve, all } from 'rsvp';\nimport Service, { inject as service } from '@ember/service';\nimport _ from 'lodash';\nimport RequestBuilder from './request-builder';\nimport { singularize } from 'ember-inflector';\n\nconst resourceTypes = [\n    'resource_article',\n    'resource_page',\n    'resource_faq',\n    'resource_glossary',\n    'resource_releasenote',\n    'resource_partner',\n    'resource_video'\n];\n\nexport const SEARCH_FACET_KEYPATHS = {\n    profileSkills: 'skills.skills',\n    department: 'general.department',\n    title: 'general.title',\n    hobbies: 'bio.hobbies',\n    interests: 'bio.interests',\n    certifications: 'skills.certs',\n    languages: 'languages.name'\n};\n\nexport const SEARCH_QUERY_TYPES = [\n    'EXACT',\n    'CONTAINS',\n    'STARTS_WITH',\n    'REQUIRED_FIELDS',\n    'RANGE',\n    'DATE_RANGE',\n    'LESS_THAN',\n    'LESS_THAN_EQUAL_TO',\n    'GREATER_THAN',\n    'GREATER_THAN_EQUAL_TO',\n    'SIMPLE',\n    'TERM',\n    'TERMS',\n    'QUERY_STRING',\n    'MATCH_ALL'\n];\n\nexport const SEARCH_QUERY_OPERATORS = ['AND', 'OR', 'NOT'];\n\nexport const SEARCH_AGGREGATE_TYPES = ['COUNT', 'SUM', 'AVERAGE', 'CONTAINS', 'STARTS_WITH', 'ENDS_WITH', 'TERM'];\n\nconst ALL_FIELDS = 'ALL_FIELDS';\n\nexport default Service.extend({\n    ajax: service(),\n    store: service(),\n    application: service(),\n\n    apiEndpoint: reads('_searchUrl'),\n    suggestEndpoint: reads('_suggestUrl'),\n\n    _searchUrl: computed(function () {\n        return this.application.pcV2Uri('api/v2/search');\n    }),\n\n    _suggestUrl: computed('_searchUrl', function () {\n        return `${this._searchUrl}/suggest`;\n    }),\n\n    _docUrl: computed('_searchUrl', function () {\n        return this.application.pcV2Uri('api/v2/documentation/search');\n    }),\n\n    search(data) {\n        const url = this._searchUrl;\n        return this.ajax.post(url, { data });\n    },\n\n    suggest(data) {\n        const url = this._suggestUrl;\n        return this.ajax.post(url, { data });\n    },\n\n    searchDocumentation(data) {\n        const url = this._docUrl;\n        return this.ajax.post(url, { data });\n    },\n\n    modelResults(results) {\n        // turn search results into DS models\n        const store = this.store;\n        const entities = results.map(result => {\n            let type = singularize(result._type);\n            if (type === 'external_contact') {\n                type = 'external-contact';\n            }\n            if (type === 'user') {\n                type = 'person';\n            }\n            if (resourceTypes.includes(type)) {\n                type = 'resource-article';\n                const normObj = store.normalize(type, result).data;\n\n                // id fails to be set on normalized object when\n                // running locally.\n                normObj.id = result.id;\n                return normObj;\n            }\n            result.id = result.id || result.guid || result._id;\n            return store.normalize(type, result).data;\n        });\n        return store.push({ data: entities });\n    },\n\n    performSearch(\n        query,\n        page,\n        entity = 'all',\n        facets = [],\n        fields = [ALL_FIELDS],\n        type = 'QUERY_STRING',\n        returnFields = [],\n        pageSize = 25\n    ) {\n        if (type === 'QUERY_STRING' && (!query || query.length < 2)) {\n            return RSVP.resolve([]);\n        }\n\n        const store = this.store;\n\n        const defaultAggregations = [\n            ['department', null, 'department', 'TERM'],\n            ['title', null, 'title', 'TERM'],\n            ['profileSkills', null, 'profileSkills', 'TERM'],\n            ['hobbies', null, 'hobbies', 'TERM'],\n            ['interests', null, 'interests', 'TERM'],\n            ['certifications', null, 'certifications', 'TERM']\n            // ['languages', null, 'languages', 'TERM']\n        ];\n\n        if (entity === null) {\n            entity = 'all';\n        }\n\n        // Two requests while working out issues with Ember Data\n        const entityRequest = this.requestBuilder()\n            .setPaging(page + 1, pageSize)\n            .setReturnFields(returnFields);\n        const facetsRequest = this.requestBuilder()\n            .setPaging(page + 1, 0)\n            .addAggregations(...defaultAggregations);\n\n        if (entity !== 'all') {\n            if (entity === 'people') {\n                entity = 'users';\n            }\n\n            if (!Array.isArray(entity)) {\n                entity = [entity];\n            }\n            entityRequest.setTypes(entity);\n        }\n\n        if (!_.isEmpty(facets)) {\n            const selectedTerms = facets.rejectBy('isKeyword');\n            _.forEach(selectedTerms, term => {\n                const searchField = term.get('searchField');\n                const value = term.get('term.term');\n                entityRequest.addQuery(value, 'AND', 'EXACT', [searchField]);\n            });\n\n            if (!_.isEmpty(selectedTerms)) {\n                entityRequest.setTypes(['users']);\n            }\n        } else if (_.isEmpty(facets) && entity === 'users') {\n            entityRequest.addAggregations(...defaultAggregations);\n        }\n\n        if (_.isEmpty(query)) {\n            entityRequest.addQuery(null, 'OR', 'MATCH_ALL', fields);\n            facetsRequest.addQuery(null, 'OR', 'MATCH_ALL');\n        } else {\n            entityRequest.addQuery(query, 'AND', type, fields);\n            facetsRequest.addQuery(query);\n        }\n\n        const searchResults = store.search(null, entityRequest.get('data'));\n        let aggregateResults = resolve([]);\n\n        if (entity === 'all') {\n            aggregateResults = store.search(null, facetsRequest.get('data'));\n        }\n\n        const data = all([searchResults, aggregateResults]);\n\n        return data.then(([results, facets]) => {\n            if (!facets.get('_aggregations')) {\n                facets = results.get('_aggregations');\n            } else {\n                facets = facets.get('_aggregations');\n            }\n\n            facets = this.processFacets(facets);\n\n            return { results, facets };\n        });\n    },\n\n    performSuggestSearch(query, entity = 'all') {\n        const store = this.store;\n        const request = this.requestBuilder().addQuery(query).setPaging(1, 4);\n\n        if (entity === 'people') {\n            entity = 'users';\n        }\n\n        if (entity !== 'all') {\n            request.setTypes([entity]);\n        }\n\n        return store.suggest(request.get('data'));\n    },\n\n    performCustomSearch(requestBuilder) {\n        return this.store.search(null, requestBuilder.get('data'));\n    },\n\n    processFacets(facets) {\n        facets = _.chain(facets)\n            .map((terms, key) => {\n                if (!Object.prototype.hasOwnProperty.call(SEARCH_FACET_KEYPATHS, key)) {\n                    return null;\n                }\n\n                return {\n                    key,\n                    facetName: SEARCH_FACET_KEYPATHS[key],\n                    terms: _.map(terms, term => {\n                        return {\n                            term: term.key,\n                            count: term.count\n                        };\n                    })\n                };\n            })\n            .filter()\n            .value();\n\n        const orderKeys = ['department', 'title', 'profileSkills', 'hobbies', 'interests', 'certifications'];\n        return _.sortBy(facets, ({ key }) => orderKeys.indexOf(key));\n    },\n\n    requestBuilder() {\n        return RequestBuilder.create({\n            service: this\n        });\n    }\n});\n","import { inject as service } from '@ember/service';\nimport { set } from '@ember/object';\nimport { resolve } from 'rsvp';\nimport Mixin from '@ember/object/mixin';\n\nexport default Mixin.create({\n    searchService: service('search'),\n\n    search(query, params = {}) {\n        const adapter = this.adapterFor('search');\n        let promise;\n\n        if (query && !params.query) {\n            // This is a simple keyword search, no special queries\n            promise = adapter.performSimpleKeywordSearch(query, params);\n        } else {\n            promise = adapter.performSearch(params);\n        }\n\n        promise = resolve(promise, 'Adapter#performSearch');\n\n        return promise\n            .then(\n                payload => {\n                    const { aggregations } = payload;\n                    const data = this._extractData(payload, 'search');\n                    return { aggregations, data, payload };\n                },\n                null,\n                'Store#search'\n            )\n            .then(({ aggregations, data, payload }) => {\n                set(data, '_aggregations', aggregations);\n                set(data, '_meta', payload);\n                return data;\n            });\n    },\n\n    suggest(query) {\n        const adapter = this.adapterFor('search');\n        let promise = adapter.suggest(query);\n\n        promise = resolve(promise, 'Adapter#suggest');\n\n        return promise.then(\n            payload => {\n                return this._extractData(payload, 'search');\n            },\n            null,\n            'Store#suggest'\n        );\n    },\n\n    _extractData(payload, type = 'findMany') {\n        const serializer = this.serializerFor('application');\n\n        if (!payload.results && payload.aggregations) {\n            return payload.aggregations;\n        }\n\n        if (!payload.results) {\n            payload.results = [];\n        }\n\n        payload = serializer.normalizeArrayResponse(this, null, payload, null, type);\n\n        if (!payload.data) {\n            payload.data = [];\n        }\n\n        if (payload.included) {\n            payload.data = [].concat(payload.data, payload.included);\n            payload.included = [];\n        }\n\n        return this.push(payload);\n    }\n});\n","import DS from 'ember-data';\nimport _ from 'lodash';\nimport { singularize } from 'ember-inflector';\nimport { inject as service } from '@ember/service';\n\n/**\n * Strips empty field values from serialized person JSON before saving.\n * Only text-type fields are checked — all other validator types were removed\n * as part of profile decomposition.\n */\nexport function filterMissingFields(record, json) {\n    _.forEach(record.fieldConfig.sections, function (section) {\n        _.forEach(section.fieldList, function (field) {\n            const fieldPath = field.get('fieldPath');\n            const type = field.get('type');\n            let values = record.getFieldValue(fieldPath);\n            const splitField = fieldPath.split('.');\n            const sectionKey = splitField[0];\n            const fieldKey = splitField[1];\n\n            const container = json[sectionKey] ? json[sectionKey][fieldKey] : null;\n\n            if (type === 'text' && container) {\n                if (!Array.isArray(values)) {\n                    values = [values];\n                }\n\n                const toRemove = values.filter(function (value) {\n                    if (!value) return true;\n                    if (value.value !== undefined) {\n                        const val = value.value;\n                        return val === undefined || val === null || val === '';\n                    }\n                    return false;\n                });\n\n                container.removeObjects(toRemove);\n            }\n        });\n\n        if (_.isEmpty(json[section.get('key')])) {\n            delete json[section.get('key')];\n        }\n    });\n\n    return json;\n}\n\nlet OUR_COOL_REQUEST_TYPES = ['query', 'findMany', 'findAll', 'search'];\n\nvar ApplicationSerializer = DS.RESTSerializer.extend({\n    stashLogger: service('stash-logger'),\n\n    isNewSerializerAPI: true,\n\n    primaryKey: 'guid',\n\n    isPrimaryType(store, typeName, primaryTypeClass) {\n        if (!primaryTypeClass) {\n            return false;\n        }\n\n        return this._super(...arguments);\n    },\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = payload;\n        let groupKey = '_entity';\n\n        if (payload.res) {\n            data = payload.res;\n            delete payload.res;\n        } else if (payload.results) {\n            data = payload.results;\n            delete payload.results;\n        }\n\n        if (requestType === 'search') {\n            groupKey = '_type';\n        }\n\n        if (_.includes(OUR_COOL_REQUEST_TYPES, requestType)) {\n            if (data && typeof data === 'object' && !Array.isArray(data)) {\n                data = _.map(data, value => value);\n            }\n\n            const finalData = {};\n            const groupedData = _.groupBy(data, groupKey);\n\n            _.forOwn(groupedData, (list, key) => {\n                if (key === undefined || key === 'undefined' || key === 'conversations') {\n                    key = primaryModelClass.modelName;\n                }\n\n                let type = singularize(key);\n                if (type === 'user' && requestType === 'search') {\n                    type = 'person';\n                }\n                finalData[type] = list.map(data => {\n                    const id = data.id || data.guid || data._id;\n                    if (id !== undefined) {\n                        data.id = id;\n                    }\n                    return data;\n                });\n            });\n\n            if (_.isEmpty(finalData) && primaryModelClass) {\n                finalData[primaryModelClass.modelName] = [];\n            }\n\n            let meta = {};\n            if (typeof payload === 'object' && !Array.isArray(payload)) {\n                meta = payload;\n            }\n\n            payload = _.merge(finalData, {\n                meta\n            });\n        }\n\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    },\n\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n\n        if (payload.res && !payload._id) {\n            payload = payload.res;\n        }\n\n        if (primaryModelClass.modelName === 'call') {\n            payload.id = payload.conversationId;\n        }\n\n        // The `org` payload's real identifier comes back as `_id` (see session.js\n        // `response.org._id`), not `guid` (this serializer's global `primaryKey`). Without this\n        // remap, the RESTSerializer can't find an id on the org payload and `store.push()` throws\n        // \"You must include an 'id' for org in an object passed to 'push'\".\n        if (primaryModelClass.modelName === 'org' && payload._id && !payload.guid) {\n            payload.guid = payload._id;\n        }\n\n        // Guard against payloads that arrive without a usable primary key. The primary id is read\n        // from the key the RESTSerializer will actually use below (this serializer's `primaryKey`,\n        // `guid`, except for `call` records which are keyed off `id`). By this point the `call`\n        // and `org` remaps above have already put the id on that key, so if it is still\n        // null/undefined the record genuinely has no id. Without this guard, `store.push()` throws\n        // \"Expected id to be a string or number, received null\", which surfaces as an uncaught\n        // global error. Instead, log it and return an empty json-api document so the store no-ops.\n        const resolvedId = this._resolveSinglePrimaryId(payload, primaryModelClass);\n        if (resolvedId === null || resolvedId === undefined || resolvedId === '') {\n            this.stashLogger.warn('ApplicationSerializer: dropping single record payload with no id', {\n                remoteData: {\n                    modelName: primaryModelClass.modelName,\n                    requestType,\n                    requestedId: id === null || id === undefined ? null : String(id)\n                }\n            });\n            return { data: null, included: [] };\n        }\n\n        data[primaryModelClass.modelName] = payload;\n\n        return this._super(store, primaryModelClass, data, id, requestType);\n    },\n\n    /**\n     * Resolve the primary id for a single-record payload from the key the RESTSerializer will use:\n     * this serializer's `primaryKey` (`guid`), except `call` records which are keyed off `id`.\n     * Returns the resolved id, or `null`/`undefined` when none is present.\n     * @param {object} payload - the single record payload\n     * @param {object} primaryModelClass - the Ember Data model class being normalized\n     * @returns {string|number|null|undefined} the resolved primary id, if any\n     */\n    _resolveSinglePrimaryId(payload, primaryModelClass) {\n        if (!payload || typeof payload !== 'object') {\n            return null;\n        }\n        // `call` records are keyed off conversationId, remapped to `id` in normalizeSingleResponse.\n        if (primaryModelClass && primaryModelClass.modelName === 'call') {\n            return payload.id;\n        }\n        return payload[this.primaryKey];\n    },\n\n    serialize(snapshot, options) {\n        var json = this._super(snapshot, options);\n        delete json._entity;\n        return json;\n    }\n});\n\nexport default ApplicationSerializer;\n","import DS from 'ember-data';\n\nexport default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({\n    serializeIntoHash(hash, typeClass, snapshot, options) {\n        const data = this.serialize(snapshot, options);\n        Object.assign(hash, data);\n    },\n\n    serialize(snapshot) {\n        const options = snapshot.adapterOptions;\n        let serialized;\n\n        if (options && options.patch) {\n            const attrsToSerialize = options.attrs;\n            const changed = snapshot.changedAttributes();\n            const attrs = Object.keys(changed);\n            if (!changed || attrs.length === 0) {\n                return this._super(...arguments);\n            }\n            const data = {};\n            attrs.forEach(attr => {\n                if (attrsToSerialize) {\n                    if (attrsToSerialize.indexOf(attr) > -1) {\n                        data[attr] = snapshot.attr(attr);\n                    }\n                } else {\n                    data[attr] = snapshot.attr(attr);\n                }\n            });\n\n            data.enabled = snapshot.attr('enabled');\n            data.voicemail = snapshot.attr('voicemail');\n\n            serialized = data;\n        } else {\n            serialized = this._super(...arguments);\n        }\n\n        delete serialized.phoneNumber;\n\n        return serialized;\n    }\n});\n","import DS from 'ember-data';\n\nexport default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {});\n","import DS from 'ember-data';\n\nexport default DS.JSONSerializer.extend({\n    isNewSerializerAPI: true,\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        payload = payload.entities || [];\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","import DS from 'ember-data';\n\nexport default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {});\n","import DS from 'ember-data';\n\nexport default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {});\n","import Schema from './schema';\n\nexport default Schema.extend({});\n","import PurecloudSerializer from 'web-directory/serializers/purecloud';\nimport DS from 'ember-data';\n\nexport default PurecloudSerializer.extend(DS.EmbeddedRecordsMixin, {\n    attrs: {\n        participants: { embedded: 'always' }\n    },\n\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        payload.links = {\n            recordings: `/api/v2/conversations/${payload.id}/recordings`\n        };\n\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    },\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        if (payload.entities) {\n            payload.entities.forEach(convo => {\n                convo.links = {\n                    recordings: `/api/v2/conversations/${convo.id}/recordings`\n                };\n            });\n        }\n\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","import DS from 'ember-data';\n\nexport default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {});\n","import DS from 'ember-data';\n\nexport default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {});\n","import DS from 'ember-data';\n\nexport default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {});\n","import DS from 'ember-data';\n\nexport default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {});\n","import Schema from './schema';\n\nexport default Schema.extend({});\n","import DS from 'ember-data';\nimport PurecloudSerializer from '../purecloud';\nimport { EMPTY_ORGANIZATION_MODEL } from './external-organization';\n\nconst EMPTY_MODEL_OBJECTS = {\n    workPhone: {\n        display: '',\n        extension: '',\n        acceptsSMS: false\n    },\n    cellPhone: {\n        display: '',\n        extension: '',\n        acceptsSMS: true\n    },\n    homePhone: {\n        display: '',\n        extension: '',\n        acceptsSMS: false\n    },\n    otherPhone: {\n        display: '',\n        extension: '',\n        acceptsSMS: false\n    },\n    address: {\n        address1: '',\n        address2: '',\n        city: '',\n        state: '',\n        postalCode: '',\n        countryCode: ''\n    }\n};\n\nconst EXTERNAL_ORGANIZATION = 'externalOrganization';\n\nexport default PurecloudSerializer.extend(DS.EmbeddedRecordsMixin, {\n    attrs: {\n        address: { embedded: 'always' },\n        workPhone: { embedded: 'always' },\n        cellPhone: { embedded: 'always' },\n        homePhone: { embedded: 'always' },\n        otherPhone: { embedded: 'always' },\n        externalOrganization: { embedded: 'always' }\n    },\n\n    _normalizeContact(contact) {\n        if (contact.type) {\n            contact.contactType = contact.type.toLowerCase();\n            delete contact.type;\n        }\n        if (!contact.canonicalContact) {\n            contact.canonicalContact = { id: contact.id };\n        }\n        if (!contact.mergeSet) {\n            contact.mergeSet = [{ id: contact.id }];\n        }\n        if (!contact.middleName) {\n            contact.middleName = '';\n        }\n        return contact;\n    },\n\n    _getPojo(jsonProfile) {\n        return JSON.parse(JSON.stringify(jsonProfile));\n    },\n\n    normalizeDeleteRecordResponse(store, primaryModelClass, payload, id, requestType) {\n        payload = { id, type: 'externalcontacts/contact' };\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    },\n\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        const normalizedPayload = this._fillEmptyPropertiesWithModelObjects(store)(payload);\n        const response = this._super(store, primaryModelClass, normalizedPayload, id, requestType);\n        if (response.data) {\n            response.data.data = normalizedPayload;\n            response.data.attributes = normalizedPayload;\n        }\n        return response;\n    },\n\n    // move the payload's entities to the root node expected by ember data; prep metadata\n    normalizeQueryResponse(store, primaryModelClass, payload, id, requestType) {\n        const filledEntities = (payload.entities || payload.contacts || []).map(\n            this._fillEmptyPropertiesWithModelObjects(store)\n        );\n        payload = {\n            'externalcontacts/contacts': filledEntities,\n            meta: {\n                total: payload.total || filledEntities.length,\n                pageOffset: payload.pageNumber || 1,\n                pageSize: payload.pageSize,\n                pageCount: payload.pageCount\n            }\n        };\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    },\n\n    serialize() {\n        const jsonProfile = this._super(...arguments);\n        return this._getPojo(jsonProfile);\n    },\n\n    _fillEmptyPropertiesWithModelObjects(store) {\n        return payload => {\n            const emptyModel = EMPTY_MODEL_OBJECTS;\n            const emptyOrgModel = EMPTY_ORGANIZATION_MODEL;\n            for (const property of Object.getOwnPropertyNames(emptyModel)) {\n                this._fillPropertyIfNecessary(property, payload, emptyModel);\n            }\n            if (payload[EXTERNAL_ORGANIZATION]) {\n                const organization = payload[EXTERNAL_ORGANIZATION];\n\n                try {\n                    store.hasRecordForId('externalcontacts/externalOrganization', organization.id);\n                } catch (err) {\n                    for (const property of Object.getOwnPropertyNames(emptyOrgModel)) {\n                        this._fillPropertyIfNecessary(property, organization, emptyOrgModel);\n                    }\n                }\n            }\n            return this._normalizeContact(payload);\n        };\n    },\n\n    /**\n     * Updates the property value with the pre-filled defaultData if the new data\n     * does not contain any values.\n     * @param {*} property the property of the data and defaultData to access\n     * @param {*} data the new data\n     * @param {*} defaultData the original preset data\n     */\n    _fillPropertyIfNecessary(property, data, defaultData) {\n        const payloadValue = data[property];\n\n        // We never want to override a populated array value\n        if (Array.isArray(payloadValue)) {\n            return;\n        }\n\n        if (!payloadValue && Array.isArray(defaultData[property])) {\n            data[property] = [...new Set(defaultData[property])];\n        } else if (payloadValue === undefined || typeof payloadValue === 'object') {\n            data[property] = Object.assign({}, defaultData[property], payloadValue);\n        }\n    }\n});\n","import DS from 'ember-data';\nimport PurecloudSerializer from '../purecloud';\n\nexport const EMPTY_ORGANIZATION_MODEL = {\n    websites: [],\n    tickers: [],\n    tags: [],\n    phoneNumber: {\n        display: '',\n        extension: '',\n        acceptsSMS: false\n    },\n    faxNumber: {\n        display: '',\n        extension: '',\n        acceptsSMS: false\n    },\n    address: {\n        address1: '',\n        address2: '',\n        city: '',\n        state: '',\n        postalCode: '',\n        countryCode: ''\n    },\n    twitterId: {\n        screenName: ''\n    }\n};\n\nexport default PurecloudSerializer.extend(DS.EmbeddedRecordsMixin, {\n    attrs: {\n        address: { embedded: 'always' },\n        phoneNumber: { embedded: 'always' },\n        faxNumber: { embedded: 'always' },\n        twitterId: { embedded: 'always' }\n    },\n\n    _getPojo(jsonProfile) {\n        if (jsonProfile.twitterId && !jsonProfile.twitterId.screenName) {\n            // If there is no Twitter screen name, don't send the twitterId property to the mid-tier\n            // Ref. https://s3.amazonaws.com/connect-apidocs/contacts-service/basic-objects.html#twitterid-object\n            delete jsonProfile.twitterId;\n        }\n        return JSON.parse(JSON.stringify(jsonProfile));\n    },\n\n    normalizeDeleteRecordResponse(store, primaryModelClass, payload, id, requestType) {\n        payload = { id, type: 'externalcontacts/externalOrganization' };\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    },\n\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        const normalizedPayload = this._fillEmptyPropertiesWithModelObjects(payload);\n        const response = this._super(store, primaryModelClass, normalizedPayload, id, requestType);\n\n        if (response.data) {\n            response.data.data = normalizedPayload;\n            response.data.attributes = normalizedPayload;\n        }\n        return response;\n    },\n\n    // move the payload's entities to the root node expected by ember data; prep metadata\n    normalizeQueryResponse(store, primaryModelClass, payload, id, requestType) {\n        const filledEntities = (payload.entities || []).map(entity =>\n            this._fillEmptyPropertiesWithModelObjects(entity)\n        );\n        payload = {\n            'externalcontacts/external-organizations': filledEntities,\n            meta: {\n                total: payload.total,\n                pageSize: payload.pageSize,\n                pageOffset: payload.pageNumber,\n                pageCount: payload.pageCount\n            }\n        };\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    },\n    serialize() {\n        const jsonProfile = this._super(...arguments);\n        return this._getPojo(jsonProfile);\n    },\n\n    _fillEmptyPropertiesWithModelObjects(payload) {\n        const emptyOrgModel = EMPTY_ORGANIZATION_MODEL;\n        for (const property of Object.getOwnPropertyNames(emptyOrgModel)) {\n            this._fillPropertyIfNecessary(property, payload);\n        }\n        return payload;\n    },\n\n    /**\n     * Updates the property value with the pre-filled model data if the new data\n     * does not contain any values.\n     * @param {*} property the property of the data and model to access\n     * @param {*} data the new data\n     */\n    _fillPropertyIfNecessary(property, data, defaultData = EMPTY_ORGANIZATION_MODEL) {\n        const payloadValue = data[property];\n\n        // We never want to override a populated array value\n        if (Array.isArray(payloadValue)) {\n            return;\n        }\n\n        if (!payloadValue && Array.isArray(defaultData[property])) {\n            data[property] = [...new Set(defaultData[property])];\n        } else if (payloadValue === undefined || typeof payloadValue === 'object') {\n            data[property] = Object.assign({}, defaultData[property], payloadValue);\n        }\n    }\n});\n","import DS from 'ember-data';\n\nexport default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {});\n","import DS from 'ember-data';\n\nexport default DS.RESTSerializer.extend({\n    isNewSerializerAPI: true,\n\n    normalizeFindRecordResponse(store, primaryModelClass, payload) {\n        let jsonapiPayload = {\n            data: {\n                type: 'geolocation-settings',\n                id: '1',\n                attributes: payload\n            }\n        };\n        return jsonapiPayload;\n    }\n});\n","import DS from 'ember-data';\n\nexport default DS.RESTSerializer.extend({\n    isNewSerializerAPI: true,\n    serializeIntoHash(data, type, record, options) {\n        Object.assign(data, this.serialize(record, options));\n    },\n\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        const data = {\n            geolocation: payload\n        };\n\n        return this._super(store, primaryModelClass, data, id, requestType);\n    }\n});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        if (!payload.id) {\n            payload.id = id;\n        }\n\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","import { inject as service } from '@ember/service';\nimport ApplicationSerializer from './application';\nimport _ from 'lodash';\nimport uuid from 'web-directory/utils/uuid';\n\nconst OUR_COOL_REQUEST_TYPES = ['query', 'findMany', 'findAll', 'search'];\n\nexport default ApplicationSerializer.extend({\n    session: service(),\n    serialize(snapshot, options) {\n        const json = this._super(snapshot, options);\n\n        // Never update contactInfo.chat, thats autogenerated\n        if (json && json.contactInfo && json.contactInfo.chat) {\n            delete json.contactInfo.chat;\n        }\n        return json;\n    },\n\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        const meta = {};\n\n        if (requestType === 'deleteRecord') {\n            payload = payload.entities[0];\n            delete payload.entities;\n            payload.contactInfo = {\n                chat: []\n            };\n            payload.contactInfo.chat.push({\n                value: {\n                    jid: payload.chat.jabberId\n                },\n                labelKey: 'chat'\n            });\n            payload._id = this.getJabberId(payload.chat.jabberId);\n            delete payload.chat;\n        } else {\n            if (payload.general.links && payload.general.links.length > 0) {\n                this.generateGroupLinkIds(payload.general.links);\n            }\n            const jId = payload.contactInfo.chat[0].value.jid;\n            payload._id = this.getJabberId(jId);\n        }\n\n        payload.guid = payload.id || payload.guid;\n\n        if (payload.guid) {\n            payload.policy = {\n                id: payload.guid,\n                type: 'group-policy'\n            };\n        }\n\n        if (requestType === 'deleteRecord' && !payload._id) {\n            payload._id = id;\n        }\n\n        payload.meta = meta;\n\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    },\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        // normalizeArrayResponse was only implmented to handle bevy group results.\n        let data = payload;\n        if (payload.entities) {\n            data = payload.entities;\n            delete payload.entities;\n        }\n\n        const finalData = {};\n        let meta = {};\n        if (typeof payload === 'object' && !Array.isArray(payload)) {\n            meta = payload;\n        }\n\n        const groups = {};\n\n        if (_.includes(OUR_COOL_REQUEST_TYPES, requestType)) {\n            _.forEach(data, g => {\n                if (g.contactInfo.chat && g.contactInfo.chat.length > 0) {\n                    const jId = g.contactInfo.chat[0].value.jid;\n                    g._id = this.getJabberId(jId);\n                }\n\n                if (g.general.links && g.general.links.length > 0) {\n                    this.generateGroupLinkIds(g.general.links);\n                }\n\n                g.guid = g.id;\n                g.orgGuid = g.id;\n\n                // Unix timestamp in seconds for sorting\n                g.mt = Math.floor(new Date(g.dateModified).getTime() / 1000);\n                g.search_key = g.general.name[0].value.toLowerCase();\n                groups[g._id] = g;\n            });\n        }\n        finalData.res = groups;\n        finalData.meta = meta;\n\n        return this._super(store, primaryModelClass, finalData, id, requestType);\n    },\n\n    getJabberId(id) {\n        const idParts = id.split('@');\n        return idParts.length > 0 ? idParts[0] : '';\n    },\n\n    /*  When using the public-api/bevy group requests\n        the group sub-objects don't contain a _id property.\n        Normally this is not an issue but for the general.links\n        it does.  The UI uses the _id  property on each link.\n        The following methods add/strip unique ids on the links.\n    */\n    generateGroupLinkIds(groupLinks) {\n        _.forEach(groupLinks, link => {\n            if (!link._id) {\n                link._id = uuid.generate();\n            }\n        });\n    },\n\n    cleanGroupLinkIds(groupLinks) {\n        _.forEach(groupLinks, link => {\n            if (link._id) {\n                delete link._id;\n            }\n        });\n    }\n});\n","import DS from 'ember-data';\n\nexport default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {});\n","import DS from 'ember-data';\n\nexport default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {});\n","import { inject as service } from '@ember/service';\n\nimport PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({\n    session: service(),\n\n    normalizeSingleResponse: function (store, model, data, guid) {\n        let location = data.location;\n        location.floors = [];\n        if (data.floors && data.floors.entities) {\n            location.floors = data.floors.entities.map(floor => store.push(store.normalize('location', floor)));\n        }\n        return this._super(store, model, location, guid);\n    }\n});\n","import DS from 'ember-data';\n\nexport default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {});\n","import DS from 'ember-data';\n\nexport default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {});\n","import DS from 'ember-data';\n\nexport default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {});\n","import DS from 'ember-data';\n\n// When the message relationship is normalized - sms gets evaluated as a plural and depluralized to 'sm' in the process\n// This modifies the model that gets fed into the CP event and causes the first in a series\n// of updates to a conversation to have messages with type \"sm\" instead of type \"sms\".  Array below is for types like\n// this - or any type that should not have its definition manipulated.\nconst RESERVED_TYPES = ['sms'];\n\nexport default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {\n    attrs: {\n        videos: { embedded: 'always' },\n        chats: { embedded: 'always' },\n        screenshares: { embedded: 'always' },\n        calls: { embedded: 'always' },\n        emails: { embedded: 'always' },\n        callbacks: { embedded: 'always' },\n        messages: { embedded: 'always' }\n    },\n\n    modelNameFromPayloadKey(type) {\n        return RESERVED_TYPES.includes(type) ? type : this._super(type);\n    }\n});\n","import { inject as service } from '@ember/service';\n\nimport PurecloudSerializer from './purecloud';\nimport { filterMissingFields } from './application';\nimport LoggerMixin from '../mixins/logger';\n\nfunction extractSectionData(record, json) {\n    let section = record._currentSection;\n    if (section) {\n        let key = section.get('key');\n        if (Object.prototype.hasOwnProperty.call(json, key)) {\n            let data = {\n                _id: json._id\n            };\n            data[key] = json[key];\n            return data;\n        }\n    }\n    return json;\n}\n\nexport default PurecloudSerializer.extend(LoggerMixin, {\n    session: service(),\n    phoneIntegrations: service(),\n\n    serialize: function (snapshot, options) {\n        let record = snapshot.record;\n\n        let json = this._super(snapshot, options);\n\n        json = extractSectionData(record, json);\n\n        delete json._id;\n\n        return filterMissingFields(record, json);\n    },\n\n    normalizeSingleResponse: function (store, model, data, guid) {\n        if (data) {\n            data.id = guid || data.guid || data.id;\n        }\n        return this._super(...arguments);\n    },\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        if (!payload || !payload.entities) {\n            return this._super(...arguments);\n        }\n\n        if (payload.meta && payload.meta.usingIntegrationSource && requestType === 'findMany') {\n            if (!payload.meta.integrationSource) {\n                this.logger.warn(\n                    \"We are using an integration source, but I'm not sure which integration source it is:\",\n                    {\n                        meta: payload.meta\n                    }\n                );\n                return this._super(...arguments);\n            }\n            let entities = (payload.entities || []).map(entity => {\n                let data = Object.assign({}, entity);\n                // note: we may not need to do this and instead just return 'data'\n                if (\n                    data.expands &&\n                    (data.expands.integrationPresence === undefined || data.expands.integrationPresence === null)\n                ) {\n                    // Default to empty\n                    data.expands.integrationPresence = {};\n                }\n\n                return data;\n            });\n            let data = Object.assign({}, payload, {\n                entities: entities\n            });\n            return this._super(store, primaryModelClass, data, id, requestType);\n        }\n\n        return this._super(...arguments);\n    }\n});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({\n    normalizeSingleResponse(store, primaryModelClass, payload, id) {\n        payload.links = {\n            profile: `/api/v2/users/${id}/profile`\n        };\n        const normalized = this._super(...arguments);\n        return normalized;\n    }\n});\n","import DS from 'ember-data';\nimport _ from 'lodash';\n\nexport default DS.RESTSerializer.extend({\n    isNewSerializerAPI: true,\n\n    normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n        data[primaryModelClass.modelName] = payload;\n        return this._super(store, primaryModelClass, data, id, requestType);\n    },\n\n    normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n        let data = {};\n        let type = primaryModelClass.modelName;\n\n        if (payload.entities) {\n            data[type] = payload.entities;\n            delete payload.entities;\n\n            payload = _.merge(data, { meta: payload });\n        }\n\n        // Support for search results\n        if (payload.results) {\n            data[type] = payload.results;\n            delete payload.results;\n            payload = _.merge(data, { meta: payload });\n        }\n\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","import PurecloudSerializer from './purecloud';\nimport _ from 'lodash';\n\nexport default PurecloudSerializer.extend({\n    normalizeArrayResponse: function (store, primaryModelClass, payload, id, requestType) {\n        _.forEach(payload.entities, function (entity) {\n            entity.type = 'queue';\n            return entity;\n        });\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    },\n\n    normalizeSingleResponse: function (store, primaryModelClass, payload, id, requestType) {\n        payload.type = 'queue';\n        // Queue lookup can either go through the typical detail API or through the divisionviews API\n        // so we can handle situations where you might run into queue lookups from a different division\n        // Handle that response type here\n        // See API docs: https://developer.inindca.com/api/rest/v2/routing/#get-api-v2-routing-queues-divisionviews\n        if (payload.entities && payload.entities.length === 1) {\n            payload = payload.entities[0];\n        }\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","import PurecloudSerializer from './purecloud';\nimport DS from 'ember-data';\n\nexport default PurecloudSerializer.extend(DS.EmbeddedRecordsMixin, {\n    attrs: {\n        conversation: { embedded: 'always' }\n    },\n    normalizeArrayResponse() {\n        const response = this._super(...arguments);\n\n        if (!response || !response.data) {\n            response.data = [];\n        }\n\n        response.data.forEach(entity => {\n            entity.relationships.conversation.data.type = 'conversation';\n        });\n\n        return response;\n    }\n});\n","import DS from 'ember-data';\n\nexport default DS.RESTSerializer.extend({\n    keyForRelationship(key, relationship) {\n        if (relationship === 'belongsTo') {\n            return `${key}Id`;\n        }\n    },\n    normalizeSingleResponse(store, primaryModelClass, payload = {}, id, requestType) {\n        const data = {};\n        data[primaryModelClass.modelName] = payload;\n        return this._super(store, primaryModelClass, data, id, requestType);\n    },\n    normalizeArrayResponse(store, primaryModelClass, payload = {}, id, requestType) {\n        const data = {};\n\n        data[primaryModelClass.modelName] = payload;\n        payload = data;\n\n        return this._super(store, primaryModelClass, payload, id, requestType);\n    }\n});\n","import DS from 'ember-data';\n\nexport default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({\n    attrs: {\n        webrtcMediaDscp: 'webRtcMediaDscp',\n        webrtcForceTurn: 'webRtcForceTurn',\n        persistentConnection: 'webRtcPersistentEnabled',\n        requireMediaHelper: 'webRtcRequireMediaHelper'\n    }\n});\n","import DS from 'ember-data';\n\nexport default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {});\n","import DS from 'ember-data';\n\nexport default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {});\n","import DS from 'ember-data';\n\nexport default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {});\n","import ApplicationSerializer from './application';\n\nexport default ApplicationSerializer.extend();\n","import DS from 'ember-data';\n\nexport default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {});\n","import PurecloudSerializer from './purecloud';\n\nexport default PurecloudSerializer.extend({\n    extractMeta(store, typeClass, payload) {\n        const meta = payload.meta;\n        delete payload.meta;\n        return meta;\n    },\n\n    normalizeQueryResponse(store, primaryModelClass, payload, id, requestType) {\n        if (requestType === 'query') {\n            payload.entities = payload.results || [];\n            delete payload.results;\n        }\n\n        return this._super(...arguments);\n    },\n\n    serializeIntoHash(hash, type) {\n        this._super(...arguments);\n\n        const key = this.payloadKeyFromModelName(type.modelName);\n        Object.assign(hash, hash[key]);\n        delete hash[key];\n    },\n\n    serializeAttribute(snapshot, json, key, attributes) {\n        const changed = snapshot.changedAttributes();\n        if (snapshot.record.get('isNew') || changed[key]) {\n            this._super(snapshot, json, key, attributes);\n        }\n    }\n});\n","import { reads } from '@ember/object/computed';\nimport { setOwner, getOwner } from '@ember/application';\nimport { A } from '@ember/array';\nimport Service, { inject as service } from '@ember/service';\nimport { run } from '@ember/runloop';\nimport Evented from '@ember/object/evented';\nimport { get, observer, set } from '@ember/object';\nimport _ from 'lodash';\nimport AcdUtilitiesMixin from 'web-directory/mixins/acd-utilities';\nimport ConversationModel from 'web-directory/models/conversation-legacy';\nimport Interaction from 'web-directory/models/interaction/call-interaction';\nimport { cleanupAfterWrapupGadgetSubmit } from 'web-directory/utils/acw-wrapup-gadget-cleanup';\nimport { cleanupScheduleCallbackGadgetSessionStorage } from 'web-directory/utils/schedule-callback-gadget';\n\nexport const CALL_CONVERSATION_CREATED_EVENT = 'callConversationCreated';\n\nexport default Service.extend(Evented, AcdUtilitiesMixin, {\n    phone: service(),\n    interaction: service(),\n    caseAssociation: service('case-association'),\n    session: service(),\n    headset: service(),\n    logger: service('stash-logger'),\n    webrtcSdkService: service('webrtcSdk'),\n    communication: service(),\n    agentAssistChecks: service(),\n    storage: service(),\n    customerIntent: service(),\n\n    updateDebounce: null,\n    _debounceLength: 500,\n\n    init() {\n        this._super(...arguments);\n        this.set('activeCalls', []);\n        if (this.get('session.useModes')) return;\n\n        this._updateInteractionModels(this);\n\n        if (this.get('webrtcSdkService.useSdk')) {\n            this._headsetFeatures(this.webrtcSdkService);\n        } else {\n            this._headsetFeatures(this.headset);\n        }\n\n        this.phone.on(CALL_CONVERSATION_CREATED_EVENT, this, this._handleCallCreated);\n    },\n\n    changeHeadsetSource: observer('webrtcSdkService.useSdk', function () {\n        if (this.get('webrtcSdkService.useSdk')) {\n            this._headsetFeatures(this.webrtcSdkService);\n        }\n    }),\n\n    _handleCallCreated(payload) {\n        this.trigger(CALL_CONVERSATION_CREATED_EVENT, payload);\n    },\n\n    currentConversation: reads('interaction.selectedInteraction.conversation'),\n    currentConversationIsCall: reads('interaction.selectedInteraction.isCall'),\n\n    _headsetFeatures(headset) {\n        this.set('headsetListenersActive', true);\n\n        headset.on('deviceMuteStatusChanged', isMuted => {\n            const currentConversation = this.currentConversation;\n            if (!currentConversation) {\n                return;\n            }\n\n            if (this.get('currentConversation.isMuted') !== isMuted) {\n                this.phone.mute(currentConversation);\n            }\n        });\n\n        headset.on('deviceHoldStatusChanged', (holdRequested, toggle) => {\n            const currentConversation = this.currentConversation;\n            if (!currentConversation) {\n                return;\n            }\n\n            // this is because jabra sends an unmute request after the call ends,\n            // Presumably to get the headset in a vanilla state\n            if (toggle && !currentConversation.get('isConnected')) {\n                return;\n            }\n\n            if (toggle || currentConversation.get('isHeld') !== holdRequested) {\n                this.phone.hold(currentConversation);\n            }\n        });\n\n        headset.on('deviceEndedCall', () => {\n            if (!this.currentConversation) {\n                return;\n            }\n\n            this.phone.endCall(this.currentConversation);\n        });\n\n        headset.on('deviceAnsweredCall', () => {\n            const alertingCalls = A(this.get('interaction.alertingInteractions').filterBy('isCall', true));\n            const conversation = alertingCalls.get('lastObject.conversation');\n            if (conversation) {\n                this.phone.answer(conversation);\n            }\n        });\n\n        headset.on('deviceRejectedCall', () => {\n            if (!this.currentConversation) {\n                return;\n            }\n\n            this.phone.endCall(this.currentConversation);\n        });\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        if (this.get('session.useModes')) return;\n\n        if (this.get('updateDebounce')) {\n            run.cancel(this.get('updateDebounce'));\n        }\n        this.phone.off(CALL_CONVERSATION_CREATED_EVENT, this, this._handleCallCreated);\n    },\n\n    _updateActiveCalls: observer('phone.conversations.[]', 'session.useModes', function () {\n        if (this.get('session.useModes')) return;\n        this.set(\n            'updateDebounce',\n            run.debounce(this, this._updateInteractionModels, this, this.get('_debounceLength'))\n        );\n    }),\n\n    async _updateInteractionModels(context) {\n        const currentInteractions = context.activeCalls;\n        const updatedInteractions = context.get('phone.conversations');\n        _.each(updatedInteractions, callInteraction => {\n            const isAgentCall = get(callInteraction, 'isAgentCall');\n\n            if (isAgentCall) {\n                setOwner(callInteraction, getOwner(context));\n                let interactionDetails = currentInteractions.findBy('id', callInteraction.id);\n                if ((interactionDetails && !interactionDetails.isDestroyed) || !interactionDetails) {\n                    if (!interactionDetails) {\n                        interactionDetails = Interaction.create(getOwner(context).ownerInjection());\n                        Object.keys(callInteraction).forEach(key => {\n                            interactionDetails.set(key, callInteraction[key]);\n                        });\n                        currentInteractions.addObject(interactionDetails);\n                    }\n\n                    interactionDetails.set('conversation', callInteraction);\n                    interactionDetails.setProperties(callInteraction);\n\n                    const payload = callInteraction.get('__interaction_metadata__');\n                    if (payload) {\n                        context\n                            .get('customerIntent')\n                            .addCustomerIntentListenerForInteraction(\n                                context._buildCallInteractionModel.bind(context),\n                                payload,\n                                interactionDetails\n                            )\n                            .catch(e => {\n                                context\n                                    .get('logger')\n                                    .error('ACD: Failed to add customer intent listener on call interaction', {\n                                        e,\n                                        remoteData: { interactionId: callInteraction.id }\n                                    });\n                                context\n                                    .get('customerIntent')\n                                    .removeCustomerIntentListenerForInteraction(interactionDetails);\n                            });\n                    }\n\n                    const session = context.get('session');\n                    if (!get(session, 'useMultipanel')) {\n                        // notify property changes\n                        if (interactionDetails === context.get('interaction.selectedInteraction')) {\n                            context.interaction.notifyPropertyChange('selectedInteraction');\n                        }\n                    }\n                }\n            }\n        });\n\n        const filteredList = _.filter(currentInteractions, function (interaction) {\n            return updatedInteractions.findBy('id', interaction.id) && interaction.get('conversation.isAgentCall');\n        });\n\n        const activeInteractionIds = _.map(updatedInteractions, interaction => {\n            return interaction.id;\n        });\n\n        const oldInteractions = _.reject(currentInteractions, interaction => {\n            return _.includes(activeInteractionIds, interaction.id);\n        });\n\n        context.set('activeCalls', filteredList);\n        context.notifyPropertyChange('activeCalls');\n        if (context.get('caseAssociation.caseAssociationRequestFT'))\n            context.get('caseAssociation').scheduleRosterSync();\n\n        const interactionIds = oldInteractions.map(interaction => get(interaction, 'id')).filter(id => !!id);\n        if (!interactionIds.length) return;\n        cleanupScheduleCallbackGadgetSessionStorage(interactionIds, context.storage);\n\n        for (const interaction of oldInteractions) {\n            if (context.get('caseAssociation.caseAssociationRequestFT')) {\n                context.get('caseAssociation').invalidateCaseCacheEntry(get(interaction, 'id'));\n            }\n            await cleanupAfterWrapupGadgetSubmit({\n                interaction,\n                isSelectedInteraction: context.get('interaction.selectedInteraction.id') === get(interaction, 'id'),\n                logger: context.logger,\n                agentAssistChecksService: context.agentAssistChecks,\n                communicationService: context.communication\n            });\n\n            run(() => {\n                context.timeDiff(get(interaction, 'timeCreated'));\n                context.get('activeCalls').removeObject(interaction);\n                context.get('customerIntent').removeCustomerIntentListenerForInteraction(interaction);\n                interaction.destroy();\n            });\n        }\n    },\n\n    /**\n     * Builds a temporary CallInteraction from raw payload data for extracting\n     * participantForCustomer.externalContactId. Matches the factory used by phone\n     * for external contact listener registration.\n     */\n    _buildCallInteractionModel(rawData) {\n        const conversationModel = ConversationModel.create(Object.assign({}, rawData, getOwner(this).ownerInjection()));\n        set(conversationModel, 'type', 'call');\n\n        const callInteraction = Interaction.create(getOwner(this).ownerInjection());\n        Object.keys(conversationModel).forEach(key => {\n            callInteraction.set(key, conversationModel[key]);\n        });\n        callInteraction.set('conversation', conversationModel);\n        return callInteraction;\n    }\n});\n","import { next, cancel, later } from '@ember/runloop';\nimport { getOwner } from '@ember/application';\nimport { observer, computed, get } from '@ember/object';\nimport Service, { inject as service } from '@ember/service';\nimport RSVP from 'rsvp';\nimport Evented, { on } from '@ember/object/evented';\nimport _ from 'lodash';\nimport CallbackInteraction from '../models/interaction/callback-interaction';\nimport CallInteraction from '../models/interaction/call-interaction';\nimport Conversation from '../models/conversation-legacy';\nimport AcdUtilitiesMixin from 'web-directory/mixins/acd-utilities';\nimport moment from '../utils/dates';\nimport { setInteractionModelMetadata } from '../utils/acd';\nimport QueuedProcessingChain from '../utils/queued-processing-chain';\nimport { cleanupAfterWrapupGadgetSubmit } from 'web-directory/utils/acw-wrapup-gadget-cleanup';\nimport { cleanupScheduleCallbackGadgetSessionStorage } from 'web-directory/utils/schedule-callback-gadget';\n\nconst CALL_BLOCKED_CODES = [\n    'ININ-OUTBOUND-AUTOMATIC-TIME-ZONE-BLOCKED-SKIPPED',\n    'ININ-OUTBOUND-CONTACT-ATTEMPT-LIMIT-SKIPPED',\n    'ININ-OUTBOUND-NUMBER-ATTEMPT-LIMIT-SKIPPED',\n    'ININ-OUTBOUND-CONTACT-UNCALLABLE-SKIPPED',\n    'ININ-OUTBOUND-DNC-SKIPPED',\n    'ININ-OUTBOUND-ZONE-BLOCKED-SKIPPED',\n    'ININ-OUTBOUND-NO-CALLABLE-NUMBERS-SKIPPED',\n    'ININ-OUTBOUND-NUMBER-UNCALLABLE-SKIPPED',\n    'ININ-OUTBOUND-NUMBERS-INVALID',\n    'ININ-OUTBOUND-RULE-SKIPPED'\n];\nconst CALL_ERROR_CODES = ['ININ-OUTBOUND-RULE-ERROR-SKIPPED', 'ININ-OUTBOUND-INTERNAL-ERROR-SKIPPED'];\n\nconst callbackRequiresWrapup = callback => {\n    const wrapupRequired = callback.get('participantForCurrentUser.wrapupRequired');\n    const hasWrapup = callback.get('participantForCurrentUser.wrapup');\n    const wrapupSkipped = callback.get('participantForCurrentUser.wrapupSkipped');\n\n    return wrapupRequired && !(hasWrapup || wrapupSkipped);\n};\n\n// Returns true if there's an active callback or a disconnected callback\n// that still needs wrapup\nconst isCallbackActive = callback => {\n    const hasActiveCallback = callback.get('hasActiveCallback');\n    const hasCallbackThatNeedsWrapup = callbackRequiresWrapup(callback);\n\n    return hasActiveCallback || hasCallbackThatNeedsWrapup;\n};\n\nexport default Service.extend(AcdUtilitiesMixin, Evented, {\n    application: service(),\n    communication: service(),\n    engage: service(),\n    externalContacts: service(),\n    customerIntent: service(),\n    phone: service(),\n    pigeon: service(),\n    session: service(),\n    interaction: service(),\n    agentAssistChecks: service(),\n    storage: service(),\n    acdinitialization: service(),\n    caseAssociation: service('case-association'),\n\n    ININ_OUTBOUND_PREVIEW_SKIPPED: 'ININ-OUTBOUND-PREVIEW-SKIPPED',\n\n    isPlacingCallTimeout: 10000,\n\n    models: null,\n    blockedCalls: null,\n    _processingChain: null,\n    _contactObservers: null,\n    partCommIdMap: null,\n    // clicking answer should add conversation to this array.\n    callBacksAnsweredByClient: null,\n    _callbacksReadyPromise: null,\n    _callbacksReadyResolve: null,\n\n    init() {\n        this._super(...arguments);\n        this.set('models', []);\n        this.set('blockedCalls', []);\n        this.set('_contactObservers', {});\n        this.set('callBacksAnsweredByClient', JSON.parse(window.sessionStorage.callBacksAnsweredByClient || '[]'));\n        this.set('partCommIdMap', {});\n        if (this.get('session.useModes')) return;\n\n        this._callbacksReadyPromise = new RSVP.Promise(resolve => {\n            this._callbacksReadyResolve = resolve;\n        });\n        this.acdinitialization.registerPromise(this._callbacksReadyPromise);\n        this._initializeProcessingChain();\n    },\n\n    _initializeProcessingChain() {\n        const interactionProcessingChain = QueuedProcessingChain.create({\n            lifecycleContainer: this,\n            label: 'acdcallback service: interaction processing chain'\n        });\n        this.set('_processingChain', interactionProcessingChain);\n        interactionProcessingChain.setProcessingChain([\n            {\n                label: 'Filtering / Context Acquisition',\n                process: ({ eventSource, payload }) => {\n                    if (!payload || !payload.id) return false;\n\n                    // WEM-437_screen-monitoring:\n                    // Unlike the other interaction types, screen monitoring filter is not needed for callbacks.\n                    // `getInteractionTypeFromCP` determines isCallback by checking if the current user is an agent participant\n                    // with callbacks. A screen-monitor-only user won't match, so isCallback will be\n                    // false and the chain bails here naturally.\n                    const interactionType = this.getInteractionTypeFromCP(payload);\n                    if (!interactionType.isCallback) return false;\n\n                    const models = this.models;\n                    const data = models.find(({ interactionId }) => interactionId === payload.id);\n                    const newInteraction = !data;\n\n                    let call = data && data.call;\n                    let callback = data && data.callback;\n\n                    if (newInteraction) {\n                        // Create new callback model — ownerInjection() must be the first arg in Ember 3.28\n                        callback = CallbackInteraction.create(\n                            Object.assign(_.cloneDeep(payload), getOwner(this).ownerInjection())\n                        );\n                        const conversation = Conversation.create(\n                            Object.assign(_.cloneDeep(payload), getOwner(this).ownerInjection())\n                        );\n                        callback.set('conversation', conversation);\n\n                        // Create new call model\n                        call = CallInteraction.create(\n                            Object.assign(_.cloneDeep(payload), getOwner(this).ownerInjection())\n                        );\n                        call.set('dialerPreview', callback.get('dialerPreview'));\n                        call.set('conversation', callback.get('conversation'));\n\n                        // If we don't care about this interaction, destroy the newly created models\n                        if (!isCallbackActive(callback)) {\n                            call.destroy();\n                            callback.destroy();\n                            return false;\n                        }\n                    }\n\n                    return {\n                        eventSource,\n                        payload,\n                        newInteraction,\n                        call,\n                        callback\n                    };\n                }\n            },\n            {\n                label: 'Listen for changes on External Contacts attached to customer participant',\n                process: async ({ payload, callback }) => {\n                    if (!isCallbackActive(callback)) return;\n                    const { id } = payload;\n                    const contactObserver = this.get(`_contactObservers.${id}`) || function () {};\n                    this.set(`_contactObservers.${id}`, contactObserver);\n                    const externalContacts = this.externalContacts;\n\n                    try {\n                        await externalContacts.addContactChangeListenersForInteraction(\n                            CallbackInteraction,\n                            payload,\n                            callback.get('__interaction_metadata__'),\n                            contactObserver\n                        );\n                    } catch (e) {\n                        this.logger.error(\n                            'ACD: Failed to add external contact change listeners on callback interaction',\n                            {\n                                e,\n                                remoteData: {\n                                    interactionId: id\n                                }\n                            }\n                        );\n                        externalContacts.removeContactChangeListenersForInteraction(callback, contactObserver);\n                        this.set(`_contactObservers.${id}`, undefined);\n                    }\n                }\n            },\n            {\n                label: 'Timedboxed Wrapup Missed Timer',\n                process: ({ payload, newInteraction }) => {\n                    if (!newInteraction) {\n                        this.handleMissedTimedBoxTimer(this, payload, CallbackInteraction);\n                    }\n                }\n            },\n            {\n                label: 'Update Call/Callback Models',\n                process: ({ payload, newInteraction, call, callback }) => {\n                    if (!newInteraction) {\n                        callback.setProperties(_.cloneDeep(payload));\n                        callback.get('conversation').setProperties(_.cloneDeep(payload));\n                        call.setProperties(_.cloneDeep(payload));\n                        call.get('conversation').setProperties(_.cloneDeep(payload));\n                    }\n\n                    callback.set('isPlacingCall', false);\n                    setInteractionModelMetadata(callback, payload);\n                    setInteractionModelMetadata(call, payload);\n                }\n            },\n            {\n                label: 'Update Call/Callback Models - External Contact',\n                process: async ({ payload, call, callback }) => {\n                    const results = await RSVP.allSettled(\n                        [callback, callback.get('conversation'), call].map(currModel => {\n                            // TechDebt:  For now, we'll maintain feature parity.  But, eventually, we should\n                            // not mix server and UI state\n                            return this.externalContacts.setExternalContactInfo(currModel, payload);\n                        })\n                    );\n\n                    results.forEach(({ state, reason }) => {\n                        if (state === 'rejected') {\n                            this.logger.error('ACD: Failed to set External Contact Model data', {\n                                reason,\n                                remoteData: {\n                                    interactionId: payload.id\n                                }\n                            });\n                        }\n                    });\n                }\n            },\n            {\n                label: 'Fetch and subscribe to customer intent for callback',\n                process: async ({ payload, call, callback }) => {\n                    if (!isCallbackActive(callback)) return;\n\n                    const customerIntent = this.get('customerIntent');\n                    const intentTargets = [\n                        { ModelBuilder: CallbackInteraction, interactionModel: callback },\n                        { ModelBuilder: CallInteraction, interactionModel: call }\n                    ];\n\n                    for (const { ModelBuilder, interactionModel } of intentTargets) {\n                        try {\n                            await customerIntent.addCustomerIntentListenerForInteraction(\n                                ModelBuilder,\n                                payload,\n                                interactionModel\n                            );\n                        } catch (e) {\n                            this.logger.error('ACD: Failed to add customer intent listener on callback interaction', {\n                                e,\n                                remoteData: { interactionId: payload.id }\n                            });\n                            customerIntent.removeCustomerIntentListenerForInteraction(interactionModel);\n                        }\n                    }\n                }\n            },\n            {\n                label: 'Notify User of Auto-Answered Conversation',\n                process: ({ eventSource, newInteraction, callback }) => {\n                    const partCommIdMap = this.partCommIdMap;\n                    const interactionId = callback.get('id');\n                    const commId = callback.get('participantForCurrentUser.callbacks.firstObject.id');\n                    const partId = callback.get('participantForCurrentUser.id');\n                    const triggerAutoAnswerNotification = () => {\n                        this.trigger('autoAnswerDigital', callback, 'callback');\n                    };\n                    const checkAndSetCommAndPartId = () => {\n                        if (\n                            typeof partCommIdMap[interactionId] === 'undefined' ||\n                            partCommIdMap[interactionId].prevCommId !== commId ||\n                            partCommIdMap[interactionId].prevPartId !== partId\n                        ) {\n                            partCommIdMap[interactionId] = {\n                                prevCommId: commId,\n                                prevPartId: partId\n                            };\n                            return true;\n                        }\n                        return false;\n                    };\n                    // Handle reload and add active interactions to map to track.\n                    if (typeof partCommIdMap[interactionId] === 'undefined' && eventSource === 'api') {\n                        partCommIdMap[interactionId] = {\n                            prevCommId: commId,\n                            prevPartId: partId\n                        };\n                    }\n\n                    const isInitiallyConnected =\n                        callback.get('participantForCurrentUser.callbacks.firstObject.initialState') === 'connected';\n\n                    if (eventSource !== 'realtime') {\n                        return;\n                    }\n\n                    if (isInitiallyConnected) {\n                        if (!newInteraction) {\n                            if (checkAndSetCommAndPartId()) {\n                                triggerAutoAnswerNotification();\n                            }\n                            return;\n                        }\n                        checkAndSetCommAndPartId();\n                        triggerAutoAnswerNotification();\n                    }\n                }\n            },\n            {\n                label: 'Handle Blocked Call Notification',\n                process: ({ payload, callback }) => {\n                    if (!callback.get('hasActiveCallback')) return;\n                    const wrapup = callback.get('participantForCurrentUser.wrapup');\n                    if (!wrapup) return;\n                    const callBlocked = _.includes(_.union(CALL_BLOCKED_CODES, CALL_ERROR_CODES), wrapup.code);\n                    if (!callBlocked) return;\n\n                    const blockedCalls = this.blockedCalls;\n                    const alreadyShownNotification = blockedCalls.find(\n                        ({ interactionId, wrapup: { code, endTime } }) => {\n                            return interactionId === payload.id && code === wrapup.code && endTime === wrapup.endTime;\n                        }\n                    );\n\n                    if (alreadyShownNotification) return;\n\n                    if (_.includes(CALL_BLOCKED_CODES, wrapup.code)) {\n                        this._displayNotification(\n                            'purecloud.acdInteraction.callbacks.errors.blocked.title',\n                            'purecloud.acdInteraction.callbacks.errors.blocked.' + wrapup.code\n                        );\n                    } else {\n                        this._displayError(\n                            'purecloud.acdInteraction.callbacks.errors.blocked.title',\n                            'purecloud.acdInteraction.callbacks.errors.blocked.' + wrapup.code\n                        );\n                    }\n\n                    this.blockedCalls.addObject({ interactionId: payload.id, wrapup });\n                }\n            },\n            {\n                label: 'Update Models List',\n                process: ({ payload, newInteraction, call, callback }) => {\n                    if (!isCallbackActive(callback)) return;\n\n                    const models = this.models;\n                    const newModelData = { interactionId: payload.id, call, callback };\n\n                    if (newInteraction) {\n                        this.get('models').addObject(newModelData);\n                        if (this.get('caseAssociation.caseAssociationRequestFT'))\n                            this.get('caseAssociation').scheduleRosterSync();\n                    } else {\n                        const interactionIdx = models.findIndex(({ interactionId }) => interactionId === payload.id);\n                        this.models.replace(interactionIdx, 1, [newModelData]);\n                    }\n                }\n            },\n            {\n                label: 'Cleanup',\n                process: ({ payload, call, callback }) => {\n                    // ACE-2805: Reset re-used Call model to reset timeouts, saved ACW, notes, etc.\n                    const callShouldBeActive = _.includes(this.callbacksRequiringCallWrapUp, call.get('id'));\n                    if (!callShouldBeActive) {\n                        call.setProperties({\n                            notes: null,\n                            selectedWrapupCode: null,\n                            wrapupNotSaved: true,\n                            oldWrapupCode: null,\n                            skipAfterCallWork: false,\n                            isAfterCallWorkTimerExpired: false\n                        });\n                    }\n\n                    if (isCallbackActive(callback)) return;\n\n                    const models = this.models;\n                    const interactionIdx = models.findIndex(({ interactionId }) => interactionId === payload.id);\n                    const interactionModel = models[interactionIdx];\n\n                    this.models.removeAt(interactionIdx, 1);\n                    const blockedCalls = this.blockedCalls;\n                    this.set('blockedCalls', blockedCalls.rejectBy('interactionId', payload.id));\n\n                    const { id } = payload;\n                    if (this.get('caseAssociation.caseAssociationRequestFT')) {\n                        this.get('caseAssociation').invalidateCaseCacheEntry(id);\n                    }\n\n                    this.get('externalContacts').removeContactChangeListenersForInteraction(\n                        callback,\n                        this.get(`_contactObservers.${id}`)\n                    );\n                    this.get('customerIntent').removeCustomerIntentListenerForInteraction(callback);\n                    this.get('customerIntent').removeCustomerIntentListenerForInteraction(call);\n                    this.set(`_contactObservers.${id}`, undefined);\n\n                    // We've already confirmed the callback is inactive above\n                    cleanupAfterWrapupGadgetSubmit({\n                        interaction: get(interactionModel, 'callback'),\n                        isSelectedInteraction:\n                            this.get('interaction.selectedInteraction.id') === get(interactionModel, 'interactionId'),\n                        logger: this.logger,\n                        agentAssistChecksService: this.agentAssistChecks,\n                        communicationService: this.communication\n                    });\n\n                    const interactionId = get(interactionModel, 'interactionId');\n                    if (!interactionId) return;\n                    cleanupScheduleCallbackGadgetSessionStorage([interactionId], this.storage);\n                }\n            },\n            {\n                // TODO: Revisit this and figure out the underlying issue so we can remove this\n                label: 'Notify property change for activeCallbacks',\n                process: () => {\n                    next(() => this.notifyPropertyChange('activeCallbacks'));\n                }\n            }\n        ]);\n    },\n\n    calls: computed('models.[]', 'models.@each.call', function () {\n        return this.models.mapBy('call');\n    }),\n\n    callbacks: computed('models.[]', 'models.@each.callback', function () {\n        return this.models.mapBy('callback');\n    }),\n\n    callParticipantsForCurrentUser: computed('calls.@each.participantForCurrentUser', function () {\n        return this.calls.mapBy('participantForCurrentUser');\n    }),\n\n    callbacksRequiringCallWrapUp: computed(\n        'models.[]',\n        'callParticipantsForCurrentUser.@each.{calls,wrapup}',\n        'callbacks.@each.canAgentRequestACW',\n        function () {\n            return this.models\n                .filter(({ call, callback }) => {\n                    const participantForCurrentUserCalls = call.get('participantForCurrentUser.calls');\n                    if (!participantForCurrentUserCalls || !participantForCurrentUserCalls.length) {\n                        // There are no calls associated with this callback.\n                        return false;\n                    }\n\n                    // If we find a call without a `disconnectedTime` then it must be ongoing\n                    // and therefore we should display as a call\n                    const ongoingCall = participantForCurrentUserCalls.find(call => !call.disconnectedTime);\n                    if (ongoingCall) return true;\n\n                    const mostRecentCall = participantForCurrentUserCalls\n                        .filterBy('disconnectedTime')\n                        .sortBy('disconnectedTime')\n                        .get('lastObject');\n\n                    // Check if wrapup has been applied for the most recent call\n                    const wrapupEndTime = call.get('participantForCurrentUser.wrapup.endTime');\n                    let hasWrappedUpMostRecentCall =\n                        wrapupEndTime && moment(wrapupEndTime).isAfter(moment(mostRecentCall.disconnectedTime));\n\n                    // If aftercallWork.state exist then assume communication level wrapup and grab state here\n                    // instead of looking at timestamps.\n                    if (call && call.get('useCommunicationACW') && get(mostRecentCall, 'afterCallWork.state')) {\n                        hasWrappedUpMostRecentCall = get(mostRecentCall, 'afterCallWork.state') === 'complete';\n                    }\n\n                    // UI and conversation service toggles: pure-3213 & pure-2752\n                    // Is queue configured for ACW requested wrapup_prompt\n                    const isAgentRequestedACWFeatureOn = callback.get('canAgentRequestACW');\n                    const hasAgentCompletedOrSkippedACW =\n                        get(mostRecentCall, 'afterCallWork.state') === 'complete' ||\n                        get(mostRecentCall, 'afterCallWork.state') === 'skipped';\n\n                    const wrapupHandled =\n                        hasWrappedUpMostRecentCall || (isAgentRequestedACWFeatureOn && hasAgentCompletedOrSkippedACW);\n\n                    return !wrapupHandled;\n                })\n                .map(({ interactionId }) => interactionId);\n        }\n    ),\n\n    activeCallbacks: computed(\n        'models.[]',\n        'calls.@each.isConnected',\n        'callbacks.@each.isConnected',\n        'callbacksRequiringCallWrapUp.[]',\n        'engage.isNotResponding',\n        function () {\n            return (\n                this.models\n                    .map(({ interactionId, call, callback }) => {\n                        return _.includes(this.callbacksRequiringCallWrapUp, interactionId) ? call : callback;\n                    })\n                    // Filter out disconnected interactions when we're not responding\n                    .filter(model => {\n                        const notResponding = this.get('engage.isNotResponding');\n                        return !notResponding || (notResponding && model.get('isConnected'));\n                    })\n            );\n        }\n    ),\n\n    /**\n     * Whether or not a particular interaction needs wrap-up for a call.\n     * @param {Interaction} interaction - the interaction to check for call wrap-up\n     */\n    needsCallWrapUp(interaction) {\n        return _.includes(this.callbacksRequiringCallWrapUp, interaction.get('id'));\n    },\n\n    subscribeToCallbackTopic: on(\n        'init',\n        observer('session.person.{guid,isEngageUser}', 'session.useModes', function () {\n            if (this.get('session.person.isEngageUser') && !this.get('session.useModes')) {\n                const guid = this.get('session.person.guid');\n                let conversationTopic;\n                conversationTopic = `v2.users.${guid}.conversations`;\n                this.pigeon.registerPriorityTopic(conversationTopic);\n            }\n        })\n    ),\n\n    registerMessageEvents: on(\n        'init',\n        observer('session.person.isEngageUser', 'session.useModes', function () {\n            if (this.get('session.person.isEngageUser') && !this.get('session.useModes')) {\n                this.get('pigeon').on('my-conversations', this, this._onMyConversationEvent);\n                this.get('pigeon').on('connect', this, this._onPigeonConnect);\n            }\n        })\n    ),\n\n    _onMyConversationEvent(conversation) {\n        if (this.isDestroyed || this.isDestroying) return;\n        if (!conversation || !conversation.id) return;\n        this._processingChain.enqueueEvent(conversation.id, {\n            eventSource: 'realtime',\n            payload: conversation\n        });\n    },\n\n    _onPigeonConnect() {\n        if (this.isDestroyed || this.isDestroying) return;\n        this._fetchCallbacks()\n            .then(conversations => {\n                conversations.forEach(conversation => {\n                    if (!conversation || !conversation.id) return;\n                    this._processingChain.enqueueEvent(conversation.id, {\n                        eventSource: 'api',\n                        payload: conversation\n                    });\n                });\n            })\n            .catch(err => {\n                this.logger.error('ACD Callback Service: Failed to load active conversations', { err });\n            })\n            .finally(() => {\n                if (this._callbacksReadyResolve) {\n                    this._callbacksReadyResolve();\n                    this._callbacksReadyResolve = null;\n                }\n            });\n    },\n\n    _fetchCallbacks() {\n        return this.communication.getAllActive('callback').catch(err => {\n            this.logger.error('ACD: Failed to load active interactions', { error: err });\n            throw err;\n        });\n    },\n\n    incomingCallbackCallsToAutoAnswer: computed(\n        'activeCallbacks.@each.isContacting',\n        'phone.station.isWebrtc',\n        'phone.thisBrowserIsTheOneToAnswerFrom',\n        'callBacksAnsweredByClient.[]',\n        function () {\n            if (!this.get('phone.station.isWebrtc')) {\n                return [];\n            } else {\n                const callbacks = this.activeCallbacks;\n                const answerFromThisBrowser = this.get('phone.thisBrowserIsTheOneToAnswerFrom');\n\n                return _.filter(callbacks, callback => {\n                    const isFullyAutomated =\n                        callback.get('participantForCurrentUser.attributes.sys_callback_auto_answered') &&\n                        callback.get('participantForCurrentUser.attributes.sys_callback_auto_dialed');\n                    const thisClientAnsweredTheCall =\n                        _.includes(this.callBacksAnsweredByClient, callback.id) || isFullyAutomated;\n                    return (thisClientAnsweredTheCall || answerFromThisBrowser) && callback.get('isContacting');\n                });\n            }\n        }\n    ),\n\n    /**\n     * Connects the agent to the conversation (does not place the call).\n     * @param {Interaction} interaction - the interaction to connect the agent to\n     */\n    answer(interaction) {\n        if (this.get('phone.station.isWebrtc')) {\n            // So we know which browser session answered the call (in callbacks there is a difference between answering and placing the call).\n            this.callBacksAnsweredByClient.pushObject(interaction.id);\n            window.sessionStorage.callBacksAnsweredByClient = JSON.stringify(this.callBacksAnsweredByClient);\n        }\n        return this.communication.answer(interaction);\n    },\n\n    /**\n     * Ignores the callback; the callback will be routed to another agent.\n     * @param {Interaction} interaction - the interaction to disconnect\n     */\n    decline(interaction) {\n        return this.communication.disconnect(interaction);\n    },\n\n    /**\n     * Wraps up the agent participant with the given wrap-up code and disconnects them from the callback.\n     */\n    endCallback(interaction) {\n        const isDialerCampaign = get(interaction, 'isCampaignCallback');\n        const isSkippingPreviewCampaign =\n            isDialerCampaign && get(interaction, 'selectedWrapupCode.id') === 'ININ-OUTBOUND-PREVIEW-SKIPPED';\n\n        if (get(interaction, 'useCommunicationACW') && !isSkippingPreviewCampaign) {\n            return this.communication.disconnect(interaction);\n        }\n        return this.communication\n            .submitAfterCallWork(interaction)\n            .then(() => this.communication.disconnect(interaction));\n    },\n\n    /**\n     * Set up a timer on the interaction to expire isPlacingCall in case we don't get another notification for this callback.\n     */\n    _scheduleIsPlacingCallTimer(interaction) {\n        // cancel any existing isPlacingCallTimer so we don't expire isPlacingCall prematurely\n        // this could happen if the agent places a call, wraps it up, and places another call within 10 seconds\n        if (interaction.get('isPlacingCallTimer')) {\n            cancel(interaction.get('isPlacingCallTimer'));\n        }\n\n        const isPlacingCallTimer = later(() => interaction.set('isPlacingCall', false), this.isPlacingCallTimeout);\n        interaction.set('isPlacingCallTimer', isPlacingCallTimer);\n    },\n\n    /**\n     * Places the call for the callback.\n     * @param {Interaction} interaction - the callback interaction for which to place the call\n     * @param {string} phoneNumber - the phone number to dial\n     * @param {string} phoneColumn - for a dialer preview/scheduled callback, the phone column associated with the phone number\n     */\n    beginCallback(interaction, phoneNumber, phoneColumn) {\n        interaction.set('isPlacingCall', true);\n\n        return this.communication\n            .addCall(interaction, phoneNumber, phoneColumn)\n            .then(() => {\n                this._scheduleIsPlacingCallTimer(interaction);\n\n                if (this.get('phone.station.isWebrtc')) {\n                    // make sure the client that clicks the phone number is the one that answers\n                    this.callBacksAnsweredByClient.pushObject(interaction.id);\n                    window.sessionStorage.callBacksAnswerByClient = JSON.stringify(this.callBacksAnsweredByClient);\n                }\n            })\n            .catch(err => {\n                interaction.set('isPlacingCall', false);\n                throw err;\n            });\n    },\n\n    /**\n     * Skip the callback; the callback will NOT be routed to another agent.\n     * @param {string} interaction - the interaction to skip\n     */\n    skipCallback(interaction) {\n        interaction.set('selectedWrapupCode', { id: this.ININ_OUTBOUND_PREVIEW_SKIPPED });\n        return this.endCallback(interaction);\n    }\n});\n","import { A } from '@ember/array';\nimport { reject, Promise, resolve, hashSettled, defer } from 'rsvp';\nimport { run, cancel, later } from '@ember/runloop';\nimport Service, { inject as service } from '@ember/service';\nimport Evented from '@ember/object/evented';\nimport { getOwner } from '@ember/application';\nimport { get, observer, set } from '@ember/object';\nimport RSVP from 'rsvp';\nimport Ember from 'ember';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport { getEntityObjectId } from 'web-directory/utils/jid-helpers';\nimport _ from 'lodash';\nimport AcdUtilitiesMixin from 'web-directory/mixins/acd-utilities';\nimport UriBuilder from 'web-directory/mixins/conversation-uri-builder';\nimport Interaction from 'web-directory/models/interaction/chat-interaction';\nimport participantStatuses from 'web-directory/utils/acdParticipantStatuses';\nimport { cleanupAfterWrapupGadgetSubmit } from 'web-directory/utils/acw-wrapup-gadget-cleanup';\nimport { isTesting } from 'web-directory/utils/testing';\nimport { setInteractionModelMetadata } from '../utils/acd';\nimport QueuedProcessingChain from '../utils/queued-processing-chain';\n\nconst COMMUNICATION_TYPE = 'chat';\nconst BODY_TYPE_STANDARD = 'standard';\n\nexport default Service.extend(Evented, AcdUtilitiesMixin, LoggerMixin, UriBuilder, {\n    application: service(),\n    session: service(),\n    pigeon: service(),\n    communication: service(),\n    interaction: service(),\n    chat: service(),\n    ajax: service(),\n    sidebar: service(),\n    store: service(),\n    externalContacts: service(),\n    customerIntent: service(),\n    agentAssistChecks: service(),\n    acdinitialization: service(),\n\n    _processingChain: null,\n\n    webChats: null,\n    activeChats: null,\n\n    _typingIndicators: null,\n    _mediaRequestTimers: null,\n    _answeredChats: null,\n    _currentMessageQueue: null,\n    _registeringChatTopics: null,\n    _registeredInteractions: null,\n    _contactObservers: null,\n\n    // Storing unsent messages\n    _messageCache: null,\n\n    _chatsReadyPromise: null,\n    _chatsReadyResolve: null,\n\n    getActiveChats() {\n        return this.communication.getAllActive(COMMUNICATION_TYPE);\n    },\n\n    fixJid(roomId) {\n        return `${roomId.split('@')[0]}@conference.${this.get('session.org.shortName')}.orgspan.com`;\n    },\n\n    _onPigeonConnect() {\n        if (this.isDestroyed || this.isDestroying) {\n            return;\n        }\n\n        this.getActiveChats()\n            .then(response => {\n                response.forEach(existingConvo => {\n                    if (existingConvo && existingConvo.id) {\n                        this._processingChain.enqueueEvent(existingConvo.id, {\n                            eventSource: 'api',\n                            payload: existingConvo\n                        });\n                    }\n                });\n            })\n            .catch(err => {\n                this.logger.error('ACD: Failed to load active interactions', { err });\n            })\n            .finally(() => {\n                this._scheduleChatCleanup();\n                if (this._chatsReadyResolve) {\n                    this._chatsReadyResolve();\n                    this._chatsReadyResolve = null;\n                }\n            });\n    },\n\n    _onMyConversationEvent(payload) {\n        if (this.isDestroyed || this.isDestroying) {\n            return;\n        }\n\n        if (payload && payload.id) {\n            this._processingChain.enqueueEvent(payload.id, { eventSource: 'realtime', payload });\n        }\n    },\n\n    _scheduleChatCleanup() {\n        if (isTesting) {\n            // I dont like it either, but Ember has awful runLoop isolation when testing\n            // Doing this will prevent spamming the runloop across tests\n            return;\n        }\n\n        // Periodically check for interactions in case they somehow didn't get cleaned up\n        if (this.isDestroying || this.isDestroyed) {\n            return;\n        }\n\n        run.later(\n            this,\n            () => {\n                if (this.isDestroying || this.isDestroyed) {\n                    return;\n                }\n\n                this._cleanUpOldChats();\n                this._scheduleChatCleanup();\n            },\n            10000\n        );\n    },\n\n    _cleanUpOldChats() {\n        // clean up old chats\n        const activeChats = this.activeChats;\n        const chatsToRemove = [];\n        _.each(activeChats, chat => {\n            if (chat && !get(chat, 'isActive')) {\n                const roomId = chat.get('roomId');\n                if (this.get('pigeon.connected')) {\n                    if (roomId) {\n                        // Leave both fixed and unfixed to correct for previous bug PCM-332\n                        const roomJid = this.fixJid(roomId);\n                        this.chat.leaveAcdRoom(roomJid);\n                        this.chat.leaveAcdRoom(roomId);\n                    }\n                    this.timeDiff(get(chat, 'timeCreated'));\n                    chatsToRemove.push(chat);\n                    chat.cleanup();\n                }\n\n                this.deleteCachedMessage(chat.get('id'));\n\n                if (chat.get('isV2Provider')) {\n                    this._unregisterWebChatTopic(chat.get('id'));\n                }\n\n                const { id } = chat;\n                this.externalContacts.removeContactChangeListenersForInteraction(\n                    chat,\n                    this.get(`_contactObservers.${id}`)\n                );\n                this.customerIntent.removeCustomerIntentListenerForInteraction(chat);\n                this.set(`_contactObservers.${id}`, undefined);\n            } else if (chat === undefined) {\n                chatsToRemove.push(chat);\n            }\n        });\n        activeChats.removeObjects(chatsToRemove);\n    },\n\n    answerChat(chat) {\n        if (chat.get('isV2Provider')) {\n            this._answeredChats.addObject(chat.id);\n            this.logger.info('ACD: Answering chat:', { id: chat.id, time: new Date().toISOString() });\n            return this.communication\n                .answer(chat)\n                .then(() => {\n                    this.logger.info('ACD: Answered chat:', { id: chat.id, time: new Date().toISOString() });\n                    return this.loadData(chat);\n                })\n                .catch(err => {\n                    this._answeredChats.removeObject(chat.id);\n                    this.logger.error('ACD: Failed to answer chat:', {\n                        error: err,\n                        remoteData: {\n                            chatId: chat.id\n                        }\n                    });\n                    return reject(err);\n                });\n        }\n\n        const roomJid = this.fixJid(chat.get('roomId'));\n        const customerParticipant = chat.get('participantForCustomer');\n        const acdCustomerModel = {\n            id: getEntityObjectId(customerParticipant.address),\n            name: customerParticipant.name,\n            owner: getOwner(this)\n        };\n        const chatId = chat.get('id');\n\n        // Don't join any rooms if the chat provider is external\n        if (!chat.get('isInternalProvider') && chat.get('isAlerting')) {\n            return this.communication.answer(chat);\n        } else if (!chat.get('isInternalProvider')) {\n            return Promise.resolve();\n        }\n\n        if (chat.get('isAlerting')) {\n            let room;\n            return this.chat\n                .joinAcdRoom(roomJid, acdCustomerModel)\n                .then(_room => {\n                    room = _room;\n                    return this.communication.validateActionSucceeded(\n                        chat,\n                        'interactionState',\n                        participantStatuses.CONNECTED\n                    );\n                })\n                .then(() => {\n                    this.logger.info('ACD: Joined room to answer chat', {\n                        namespace: 'conversations',\n                        roomJid: room.jid,\n                        user: chat.get('participantForCurrentUser.id'),\n                        conversationId: chatId\n                    });\n                    room.set('acdCustomerParticipant', acdCustomerModel);\n                    chat.set('room', room);\n                    return room;\n                });\n        }\n\n        return this.chat.getChatRoom(roomJid).then(room => {\n            this.logger.info('ACD: Re-entered room', {\n                namespace: 'conversations',\n                roomJid,\n                user: chat.get('participantForCurrentUser.id'),\n                conversationId: chatId\n            });\n            room.set('acdCustomerParticipant', acdCustomerModel);\n            chat.set('room', room);\n            return room;\n        });\n    },\n\n    declineChat(chat) {\n        if (chat.get('isV2Provider')) {\n            this._unregisterWebChatTopic(chat.get('id'));\n            return this.communication.disconnect(chat);\n        }\n\n        chat.set('skipAfterCallWork', true);\n        return this.communication.disconnect(chat);\n    },\n\n    endChat(chat) {\n        if (chat.get('isV2Provider')) {\n            this._unregisterWebChatTopic(chat.get('id'));\n            return this.communication.disconnect(chat);\n        }\n\n        const roomJid = this.fixJid(chat.get('roomId'));\n        let promise;\n        this.chat.trigger('endingChat', { interactionId: chat.get('id') });\n        if (!chat.get('isInternalProvider')) {\n            promise = this.communication.disconnect(chat);\n        } else {\n            promise = this.chat.leaveAcdRoom(roomJid).then(() => {\n                this.logger.info('Left room', {\n                    namespace: 'conversations',\n                    roomJid,\n                    user: chat.get('participantForCurrentUser.id'),\n                    conversationId: chat.get('id')\n                });\n                const interactionId = chat.get('id');\n                const userId = chat.get('participantForCurrentUser.id');\n                return this.communication.disconnectParticipant(interactionId, userId, chat.get('type'));\n            });\n        }\n\n        return promise.then(() => {\n            return this.communication.validateActionSucceeded(\n                chat,\n                'interactionState',\n                participantStatuses.DISCONNECTED\n            );\n        });\n    },\n\n    loadData(chat, initMessages = false) {\n        if (chat.get('isLoading')) {\n            return resolve();\n        }\n        chat.set('isLoading', true);\n\n        if (initMessages) {\n            chat.set('messages', A([]));\n        }\n\n        // We don't want to disrupt the core agent experience for chatting,\n        // so we should resolve in case something like chat history or\n        // non-self agent info fails to load\n        const promises = {\n            messages: this.loadMessages(chat),\n            agents: this.loadAgentInfo(chat)\n        };\n        return hashSettled(promises).then(({ messages, agents }) => {\n            chat.set('isLoading', false);\n\n            if (agents.state === 'rejected') {\n                this.logger.error('Error loading agent information for chat interaction:', {\n                    error: agents.reason,\n                    remoteData: {\n                        id: chat.id\n                    }\n                });\n            }\n\n            if (messages.state === 'rejected') {\n                this.logger.error('Error loading chat history for chat interaction:', {\n                    error: messages.reason,\n                    remoteData: {\n                        id: chat.id\n                    }\n                });\n            }\n        });\n    },\n\n    loadAgentInfo(chat) {\n        const ids = A(\n            chat\n                .get('participants')\n                .filter(p => !!p.userId)\n                .map(p => p.userId)\n        ).uniq();\n        if (!ids || !ids.length) {\n            return resolve();\n        }\n        return this.store.findMany('person', ids);\n    },\n\n    loadMessages(chat) {\n        this.logger.info('ACD: Loading chat history', { id: chat.get('id'), time: new Date().toISOString() });\n\n        const deferred = defer();\n        const collection = [];\n        const messagesUri = this.messagesUri(chat.get('id'), 'chats');\n        this.ajax.request(messagesUri).then(res => {\n            this._processMessages(chat, res, collection, deferred);\n        });\n\n        deferred.promise.then(messages => {\n            this.logger.info('ACD: Finished loading chat history', {\n                id: chat.get('id'),\n                num: messages.length,\n                time: new Date().toISOString()\n            });\n\n            const currentMessages = chat.get('messages');\n            if (currentMessages && currentMessages.length) {\n                messages = A(messages).pushObjects(currentMessages).uniqBy('id').sortBy('timestamp');\n            }\n            chat.set('messages', messages);\n\n            const lastMessage = A(messages).get('lastObject');\n            if (lastMessage) {\n                chat.set('lastMessageTime', lastMessage.timestamp);\n            }\n\n            return messages;\n        });\n\n        return deferred.promise;\n    },\n\n    _processMessages(chat, response, collection, deferred) {\n        let messages = response.entities;\n\n        collection = collection.concat(messages);\n\n        if (response.next) {\n            let url = response.next;\n            if (url.indexOf('/') === 0) {\n                url = url.substr(1);\n            }\n            return this.ajax\n                .request(this.application.pcV2Uri(url))\n                .then(res => {\n                    this._processMessages(chat, res, collection, deferred);\n                })\n                .catch(err => {\n                    this.logger.error('Error loading next history for chat:', { err });\n                    deferred.resolve(collection);\n                });\n        }\n\n        return deferred.resolve(collection);\n    },\n\n    sendMessage(chat, body, bodyType = 'standard') {\n        // Generate a local message to display a loading indicator\n        const message = {\n            body,\n            bodyType,\n            id: Ember.generateGuid(),\n            conversation: {\n                id: chat.id\n            },\n            sender: {\n                id: chat.get('participantForCurrentUser.chats.firstObject.id')\n            },\n            timestamp: new Date().toISOString(),\n            sending: true,\n            failed: false\n        };\n        chat.get('messages').pushObject(message);\n\n        return this._scheduleMessage(chat, body, message.id, bodyType);\n    },\n\n    _scheduleMessage(chat, body, localId, bodyType = 'standard') {\n        const queueData = {\n            chat,\n            body,\n            bodyType,\n            localId,\n            retries: 0,\n            defer: defer()\n        };\n        let lastMessageData = this.get('_currentMessageQueue.lastObject');\n        this._currentMessageQueue.pushObject(queueData);\n        if (!lastMessageData) {\n            // Immediately handle message if the queue is empty\n            this._sendNextQueuedMessage(queueData);\n        } else {\n            // Wait until last message completes to send the next message\n            lastMessageData.defer.promise.then(() => {\n                this._sendNextQueuedMessage(queueData);\n            });\n        }\n\n        return queueData.defer.promise;\n    },\n\n    async _sendNextQueuedMessage(queueData) {\n        try {\n            await this._sendMessageRequest(queueData.chat, queueData.body, queueData.bodyType);\n            this._currentMessageQueue.removeObject(queueData);\n            return queueData.defer.resolve();\n        } catch (error) {\n            this.logger.error('Message send failed:', { error });\n            // Retry and then give up\n            if (queueData.retries >= 2) {\n                this._currentMessageQueue.removeObject(queueData);\n\n                const localMessage = queueData.chat.get('messages').find(message => message.id === queueData.localId);\n                if (localMessage) {\n                    set(localMessage, 'failed', true);\n                    set(localMessage, 'sending', false);\n                }\n\n                queueData.defer.resolve();\n                return;\n            }\n            queueData.retries += 1;\n            return this._sendNextQueuedMessage(queueData);\n        }\n    },\n\n    _sendMessageRequest(chat, body, bodyType = 'standard') {\n        const chatId = chat.get('id');\n        const commId = chat.get('participantForCurrentUser.chats.firstObject.id');\n        const uri = this.sendChatMessageUri(chatId, commId);\n        return this.ajax\n            .raw(uri, {\n                headers: { 'Content-Type': 'application/json' },\n                method: 'POST',\n                dataType: 'text',\n                contentType: 'application/json',\n                data: JSON.stringify({ body, bodyType })\n            })\n            .finally(() => {\n                chat.get('messages').forEach(message => set(message, 'unread', false));\n            });\n    },\n\n    sendTypingIndicator(chatId) {\n        const chat = this.activeChats.findBy('id', chatId);\n        if (chat) {\n            const commId = chat.get('participantForCurrentUser.chats.firstObject.id');\n            const typingUri = this.sendTypingUri(chatId, commId);\n            return this.ajax.raw(typingUri, {\n                headers: { 'Content-Type': 'application/json' },\n                method: 'POST',\n                dataType: 'text',\n                data: ''\n            });\n        }\n        return resolve();\n    },\n\n    getTypingIndicator(chatId) {\n        return this._typingIndicators.findBy('id', chatId);\n    },\n\n    clearUnreadMessages(chatId) {\n        const chat = this.activeChats.findBy('id', chatId);\n        if (chat) {\n            const messages = chat.get('messages') || [];\n            messages.forEach(message => set(message, 'unread', false));\n        }\n    },\n\n    storeCachedMessage(chatId, message) {\n        this._messageCache[chatId] = message;\n    },\n\n    retrieveCachedMessage(chatId) {\n        return this._messageCache[chatId];\n    },\n\n    deleteCachedMessage(chatId) {\n        delete this._messageCache[chatId];\n    },\n\n    // When a v2 chat is answered outside of this client, we do not register because it\n    // is not going through our flow answering flow in this UI\n    subscribeToExternallyAnsweredChats: observer('activeChats.@each.isConnected', function () {\n        const answeredChats = this._answeredChats;\n        this.activeChats.forEach(chat => {\n            if (chat.get('isConnected') && chat.get('isV2Provider') && !A(answeredChats).includes(chat.id)) {\n                const initMessages = true;\n                this.loadData(chat, initMessages);\n            }\n        });\n    }),\n\n    registerMessageEvents() {\n        this.pigeon.on('my-conversations', this, this._onMyConversationEvent);\n        this.pigeon.on('connect', this, this._onPigeonConnect);\n        this.pigeon.on('members', this, this._handleWebChatEvent);\n        this.pigeon.on('messages', this, this._handleWebChatEvent);\n        this.pigeon.on('mediarequests', this, this._handleWebChatEvent);\n    },\n\n    init() {\n        this._super(...arguments);\n        this.set('_timers', []);\n        this.set('_typingIndicators', []);\n        this.set('_mediaRequestTimers', []);\n        this.set('_answeredChats', []);\n        this.set('_currentMessageQueue', []);\n        this.set('_registeringChatTopics', {});\n        this.set('_registeredInteractions', []);\n        this.set('_messageCache', {});\n        this.set('webChats', []);\n        this.set('activeChats', []);\n        this.set('_contactObservers', {});\n        if (this.get('session.useModes')) return;\n\n        this._chatsReadyPromise = new RSVP.Promise(resolve => {\n            this._chatsReadyResolve = resolve;\n        });\n        this.acdinitialization.registerPromise(this._chatsReadyPromise);\n        this.registerMessageEvents();\n\n        const processingChain = QueuedProcessingChain.create({\n            lifecycleContainer: this,\n            label: 'acdchat Interaction Processing Chain'\n        });\n        this.set('_processingChain', processingChain);\n        processingChain.setProcessingChain([\n            {\n                label: 'Filtering and Context Acquisition',\n                process: ({ eventSource, payload }) => {\n                    if (!payload || !payload.id) {\n                        return false;\n                    }\n\n                    const interactionType = this.getInteractionTypeFromCP(payload);\n                    // Add this check so that chat handles the issue that came up in SERVOPS-2172\n                    if (!interactionType.isChat || (interactionType.isChat && interactionType.isCallback)) {\n                        return false;\n                    }\n\n                    let newInteraction = false;\n                    let prevRaw = null;\n                    let activeChats = this.activeChats;\n                    let interactionModel = activeChats.findBy('id', payload.id);\n\n                    if (!interactionModel) {\n                        newInteraction = true;\n                        interactionModel = Interaction.create(\n                            Object.assign({}, payload, getOwner(this).ownerInjection())\n                        );\n\n                        if (!get(interactionModel, 'isInteractionActive')) {\n                            // New interaction is inactive and model has never been added to our interaction list, just clean it up locally\n                            interactionModel.destroy();\n                            // Cancel the chain\n                            return false;\n                        }\n                    } else {\n                        prevRaw = interactionModel.get('__interaction_metadata__');\n                    }\n\n                    return {\n                        eventSource,\n                        payload,\n                        prevRaw,\n                        newInteraction,\n                        interactionModel\n                    };\n                }\n            },\n            {\n                label: 'Timedboxed Wrapup Missed Timer',\n                process: ({ payload, newInteraction }) => {\n                    if (!newInteraction) {\n                        this.handleMissedTimedBoxTimer(this, payload, Interaction);\n                    }\n                }\n            },\n            {\n                label: 'Update Interaction Model',\n                process: ({ payload, interactionModel, newInteraction }) => {\n                    if (!newInteraction) {\n                        interactionModel.setProperties(payload);\n                    }\n                    setInteractionModelMetadata(interactionModel, payload);\n                }\n            },\n            {\n                label: 'Update Service Model',\n                process: ({ interactionModel, newInteraction }) => {\n                    if (newInteraction) {\n                        this.get('activeChats').insertAt(0, interactionModel);\n                    } else {\n                        const session = this.get('session');\n                        if (!get(session, 'useMultipanel')) {\n                            // notify property changes\n                            if (interactionModel === this.get('interaction.selectedInteraction')) {\n                                this.get('interaction').notifyPropertyChange('selectedInteraction');\n                            }\n                        }\n                    }\n                }\n            },\n            {\n                label: 'Update Interaction Model - External Contact',\n                process: async ({ payload, interactionModel }) => {\n                    // TechDebt:  For now, we'll maintain feature parity.  But, eventually, we should\n                    // not mix server and UI state\n                    try {\n                        await this.externalContacts.setExternalContactInfo(interactionModel, payload);\n                    } catch (e) {\n                        this.logger.error('ACD: Failed to set External Contact Model data', {\n                            e,\n                            remoteData: {\n                                interactionId: interactionModel.get('id')\n                            }\n                        });\n                    }\n                }\n            },\n            {\n                label: 'Listen for changes on External Contacts attached to customer participant',\n                process: async ({ payload, prevRaw, interactionModel }) => {\n                    if (!get(interactionModel, 'isInteractionActive')) return;\n\n                    const { id } = payload;\n                    const callback = this.get(`_contactObservers.${id}`) || function () {};\n                    this.set(`_contactObservers.${id}`, callback);\n                    const externalContacts = this.externalContacts;\n\n                    try {\n                        await externalContacts.addContactChangeListenersForInteraction(\n                            Interaction,\n                            payload,\n                            prevRaw,\n                            callback\n                        );\n                    } catch (e) {\n                        this.logger.error('ACD: Failed to add external contact change listeners on chat interaction', {\n                            e,\n                            remoteData: {\n                                interactionId: id\n                            }\n                        });\n                        externalContacts.removeContactChangeListenersForInteraction(interactionModel, callback);\n                        this.set(`_contactObservers.${id}`, undefined);\n                    }\n\n                    const customerIntent = this.customerIntent;\n                    try {\n                        await customerIntent.addCustomerIntentListenerForInteraction(\n                            Interaction,\n                            payload,\n                            interactionModel\n                        );\n                    } catch (e) {\n                        this.logger.error('ACD: Failed to add customer intent listener on chat interaction', {\n                            e,\n                            remoteData: { interactionId: payload.id }\n                        });\n                        customerIntent.removeCustomerIntentListenerForInteraction(interactionModel);\n                    }\n                }\n            },\n            {\n                label: 'Load/Subscribe Step',\n                process: ({ newInteraction, interactionModel }) => {\n                    let answered = interactionModel && A(this._answeredChats).includes(interactionModel.get('id'));\n                    let isV2Chat = interactionModel && interactionModel.get('isV2Provider');\n                    let isRegistered =\n                        interactionModel && A(this._registeredInteractions).includes(interactionModel.get('id'));\n\n                    if (isV2Chat && (newInteraction || !isRegistered)) {\n                        this._registerWebChatTopic(interactionModel);\n                    }\n\n                    /*\n                     * Load v2 chats that have been restored from the API and\n                     * that have not been answered previously.\n                     */\n                    if (isV2Chat && !answered) {\n                        this.loadData(interactionModel);\n                    }\n                }\n            },\n            {\n                label: 'Cleanup step',\n                process: ({ interactionModel }) => {\n                    if (!get(interactionModel, 'isInteractionActive')) {\n                        cleanupAfterWrapupGadgetSubmit({\n                            interaction: interactionModel,\n                            isSelectedInteraction:\n                                this.get('interaction.selectedInteraction.id') === get(interactionModel, 'id'),\n                            logger: this.logger,\n                            agentAssistChecksService: this.agentAssistChecks,\n                            chatService: this.chat\n                        });\n                    }\n\n                    if (!get(interactionModel, 'isInteractionActive')) {\n                        this._cleanUpOldChats();\n                    }\n                }\n            }\n        ]);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        if (this.get('session.useModes')) return;\n\n        this.get('_timers').forEach(item => run.cancel(item));\n        this.get('pigeon').off('my-conversations', this, this._onMyConversationEvent);\n        this.get('pigeon').off('connect', this, this._onPigeonConnect);\n        this.get('pigeon').off('members', this, this._handleWebChatEvent);\n        this.get('pigeon').off('messages', this, this._handleWebChatEvent);\n        this.get('pigeon').off('mediarequests', this, this._handleWebChatEvent);\n    },\n\n    _registerWebChatTopic(chat) {\n        if (chat.get('isDisconnected')) {\n            return resolve();\n        }\n\n        const topics = [\n            `v2.conversations.chats.${chat.id}.members`,\n            `v2.conversations.chats.${chat.id}.messages`,\n            `v2.conversations.chats.${chat.id}.mediarequests`\n        ];\n\n        this.logger.info('ACD: Registering topics for chat:', {\n            chat: chat.id,\n            topics,\n            time: new Date().toISOString()\n        });\n\n        topics.forEach(topic => this.pigeon.registerPriorityTopic(topic));\n\n        this._registeredInteractions.addObject(chat.id);\n    },\n\n    _unregisterWebChatTopic(id) {\n        this.logger.debug('ACD: Unregistering chat topics', { chat: id, time: new Date().toISOString() });\n\n        const topics = [\n            `v2.conversations.chats.${id}.members`,\n            `v2.conversations.chats.${id}.messages`,\n            `v2.conversations.chats.${id}.mediarequests`\n        ];\n\n        topics.forEach(topic => this.pigeon.unRegisterPriorityTopic(topic));\n        this.pigeon.off(id);\n\n        this._answeredChats.removeObject(id);\n        this._registeredInteractions.removeObject(id);\n    },\n\n    _shouldShowNotification() {\n        const isActivePanel = this.get('sidebar.communicationPanel') === 'acdInteractions';\n        return !isActivePanel;\n    },\n\n    _sendNotification(chat, message) {\n        const title = chat.get('participantForCustomer.name');\n        this.notification.info(title, message.body, {\n            soundId: 'chat',\n            shouldPlaySound: true,\n            shouldShowPopup: this._shouldShowNotification(),\n            clickHandler: () => {\n                this.sidebar.openPanel('acdInteractions');\n                this.set('interaction.selectedInteraction', chat);\n            }\n        });\n    },\n\n    _handleWebChatEvent(data, event) {\n        if (event && event.topicName && event.topicName.indexOf('voicemail.messages') > -1) {\n            // We should ignore these voicemail message notifications\n            return;\n        }\n        this.logger.debug('ACD: web chat event data:', { data, event, time: new Date().toISOString() });\n\n        const eventType = event.metadata.type;\n        if (!data.conversation) {\n            this.logger.error('Recieved event without conversation data:', {\n                eventType,\n                time: new Date().toISOString()\n            });\n            return;\n        }\n\n        const conversationId = data.conversation.id;\n        const chat = this.activeChats.find(chat => {\n            return chat.get('id') === conversationId;\n        });\n\n        if (!chat) {\n            // TODO: Look into loading conversation data async via public API\n            this.logger.error('Recieved event for web chat that is not tracked:', {\n                conversationId,\n                eventType,\n                time: new Date().toISOString()\n            });\n            return;\n        }\n\n        if (chat.get('isDisconnected')) {\n            return;\n        }\n\n        const sender = data.sender && data.sender.id;\n        const user = chat.get('participantForCurrentUser');\n        const webchat = get(user, 'chats.0');\n        let indicator = this._typingIndicators.findBy('id', conversationId);\n\n        if (eventType === 'message') {\n            this._handleMessageEvent(chat, webchat, sender, data, indicator);\n        } else if (eventType === 'typing-indicator') {\n            this._handleTypingIndicatorEvent(user, webchat, sender, indicator, conversationId);\n        } else if (eventType === 'member-change') {\n            this._handleMemberChangeEvent(data, webchat, conversationId);\n        } else if (eventType === 'media-request') {\n            this._handleMediaRequestEvent(chat, sender, data);\n        }\n    },\n\n    _handleMessageEvent(chat, webchat, senderId, data, indicator) {\n        if (chat.get('messages') === undefined) {\n            chat.set('messages', A([]));\n        }\n\n        const messages = chat.get('messages');\n\n        // Dont do extra parsing for non-standard messages\n        if (data.bodyType && data.bodyType !== BODY_TYPE_STANDARD) {\n            this.logger.debug('ACD: received non-standard body type:', { bodyType: data.bodyType });\n\n            messages.pushObject(data);\n            chat.set('lastMessageTime', data.timestamp);\n            return;\n        }\n\n        if (webchat.id !== senderId) {\n            data.unread = true;\n\n            this._sendNotification(chat, data);\n\n            if (indicator) {\n                cancel(indicator.timer);\n                this._typingIndicators.removeObject(indicator);\n            }\n        }\n\n        // Make sure we arent duplicating messages (can happen during automation)\n        const haveChat = !!messages.find(message => message.id === data.id);\n        if (haveChat) {\n            this.logger.warn('ACD: Received a duplicate chat message:', {\n                data: { id: data.id },\n                time: new Date().toISOString()\n            });\n            return;\n        }\n        const matchingIndex = this._matchingMessageIndex(chat, webchat, senderId);\n        if (matchingIndex !== null) {\n            this.logger.debug('ACD: found local message, inserting new message at location:', {\n                location: matchingIndex,\n                data,\n                time: new Date().toISOString()\n            });\n            messages.replace(matchingIndex, 1, [data]);\n        } else {\n            messages.pushObject(data);\n        }\n\n        chat.set('lastMessageTime', data.timestamp);\n    },\n\n    _matchingMessageIndex(chat, webchat, senderId) {\n        // Only agent chats\n        // Message ordering is guaranteed based on order sent\n        if (webchat.id === senderId) {\n            const messages = chat.get('messages');\n            const index = A(messages).findIndex(m => m.sending);\n            if (index >= 0) {\n                return index;\n            }\n        }\n\n        return null;\n    },\n\n    _handleTypingIndicatorEvent(user, webchat, sender, indicator, conversationId) {\n        if (!user || !webchat) {\n            return;\n        }\n\n        if (webchat && webchat.id === sender) {\n            return;\n        }\n\n        if (indicator) {\n            cancel(indicator.timer);\n        } else {\n            indicator = {\n                id: conversationId\n            };\n            this._typingIndicators.addObject(indicator);\n        }\n\n        const timer = later(() => {\n            this._typingIndicators.removeObject(indicator);\n        }, 5000);\n        set(indicator, 'timer', timer);\n    },\n\n    _handleMemberChangeEvent(data, webchat, conversationId) {\n        if (data.member && data.member.state === 'DISCONNECTED') {\n            if (data.member.id === webchat.id) {\n                this._unregisterWebChatTopic(conversationId);\n            }\n        }\n    },\n\n    _handleMediaRequestEvent(chat, sender, data) {\n        const mediaRequestTimers = this._mediaRequestTimers;\n\n        const id = data.id;\n        const currentMediaRequest = mediaRequestTimers.find(data => data.id === id);\n        if (!currentMediaRequest && data.state === 'PENDING') {\n            const timer = later(this._timeoutMediaRequest.bind(this, data), 60000);\n\n            mediaRequestTimers.addObject({\n                timer,\n                id,\n                mediaRequest: data\n            });\n        }\n\n        if (data.state === 'CANCELLED') {\n            if (currentMediaRequest) {\n                cancel(currentMediaRequest.timer);\n                this._mediaRequestTimers.removeObject(currentMediaRequest);\n            }\n        }\n\n        if (data.state === 'DECLINED') {\n            this.chat.trigger('customerHasDeclinedSessionShare', get(chat, 'id'));\n        }\n    },\n\n    _timeoutMediaRequest(requestData) {\n        const currentMediaRequest = this._mediaRequestTimers.find(data => data.id === requestData.id);\n        if (!currentMediaRequest) {\n            this.logger.warn('Attempting to cancel a media timer out of band:', { requestData });\n            return;\n        }\n\n        this._deleteMediaRequest(requestData);\n\n        cancel(currentMediaRequest.timer);\n        this._mediaRequestTimers.removeObject(currentMediaRequest);\n    },\n\n    _deleteMediaRequest(requestData) {\n        const base = this.communication.mediaRequestUri(requestData.conversation.id);\n\n        this.ajax.delete(`${base}/${requestData.id}`).catch(err => {\n            this.logger.error('Could not delete media request', { err });\n        });\n    }\n});\n","import { getOwner } from '@ember/application';\nimport { A } from '@ember/array';\nimport { computed, get, setProperties } from '@ember/object';\nimport Evented from '@ember/object/evented';\nimport { cancel, debounce } from '@ember/runloop';\nimport Service, { inject as service } from '@ember/service';\nimport RSVP from 'rsvp';\nimport AcdUtilitiesMixin from 'web-directory/mixins/acd-utilities';\nimport UriBuilder from 'web-directory/mixins/conversation-uri-builder';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport { cleanupAfterWrapupGadgetSubmit } from 'web-directory/utils/acw-wrapup-gadget-cleanup';\nimport Interaction from '../models/interaction/email-interaction';\nimport { isCurrentUserOnlyAScreenMonitor, isOutboundEmailInteraction, setInteractionModelMetadata } from '../utils/acd';\nimport QueuedProcessingChain from '../utils/queued-processing-chain';\n\nconst COMMUNICATION_TYPE = 'email';\n\nexport const EMAIL_CONVERSATION_CREATED_EVENT = 'emailConversationCreated';\n\nexport default Service.extend(Evented, AcdUtilitiesMixin, UriBuilder, LoggerMixin, {\n    session: service(),\n    pigeon: service(),\n    communication: service(),\n    interaction: service(),\n    ajax: service(),\n    externalContacts: service(),\n    customerIntent: service(),\n    agentAssistChecks: service(),\n    acdinitialization: service(),\n    caseAssociation: service('case-association'),\n\n    allEmails: null,\n    doneLoadingActiveEmails: false,\n    draftUpdateHash: A(),\n    _contactObservers: null,\n    partCommIdMap: {},\n    _emailsReadyPromise: null,\n    _emailsReadyResolve: null,\n\n    activeEmails: computed('allEmails.@each.isActive', function () {\n        return this.allEmails.filter(interaction => {\n            return (\n                interaction.get('isActive') ||\n                (!interaction.get('isActive') && interaction.get('isNonDiscretionaryCompletion'))\n            );\n        });\n    }),\n\n    loadActiveEmails() {\n        return this.communication.getAllActive(COMMUNICATION_TYPE);\n    },\n\n    _handleDraftEvent(payload) {\n        if (this.isDestroyed || this.isDestroying) return;\n        if (payload && payload.conversationId) {\n            this._processingChain.enqueueEvent(payload.conversationId, { eventSource: 'draftEvent', payload });\n        }\n    },\n\n    _onMyConversationEvent(payload) {\n        if (this.isDestroyed || this.isDestroying) return;\n\n        if (payload && payload.id) {\n            this._processingChain.enqueueEvent(payload.id, { eventSource: 'realtime', payload });\n        }\n    },\n\n    _onPigeonConnect() {\n        if (this.isDestroyed || this.isDestroying) {\n            return;\n        }\n\n        const guid = this.get('session.person.guid');\n        if (guid) {\n            const emailTopic = `v2.users.${guid}.conversations`;\n            const draftTopic = `v2.users.${guid}.conversations.emails.draft`;\n            const topicsToRegister = [emailTopic, draftTopic];\n            topicsToRegister.forEach(t => this.pigeon.registerPriorityTopic(t));\n        }\n\n        this.loadActiveEmails()\n            .then(response => {\n                response.forEach(existingConvo => {\n                    if (existingConvo && existingConvo.id) {\n                        this._processingChain.enqueueEvent(existingConvo.id, {\n                            eventSource: 'api',\n                            payload: existingConvo\n                        });\n\n                        this.fetchDraftForEmail(existingConvo.id);\n                    }\n                });\n            })\n            .catch(err => {\n                this.logger.error('ACD: Failed to load active emails interactions', { err });\n            })\n            .finally(() => {\n                this.set('doneLoadingActiveEmails', true);\n                if (this._emailsReadyResolve) {\n                    this._emailsReadyResolve();\n                    this._emailsReadyResolve = null;\n                }\n            });\n    },\n\n    fetchDraftForEmail(emailId) {\n        const url = this.draftUri(emailId, 'emails');\n        return this.ajax\n            .ajaxGet(url)\n            .then(draft => {\n                draft.conversationId = emailId;\n                this.setDraftUpdate(emailId, draft);\n            })\n            .catch(() => {\n                this.logger.error('ACD: Failed to fetch draft for email interaction', {\n                    remoteData: {\n                        conversationId: emailId\n                    }\n                });\n            });\n    },\n\n    setDraftUpdate(interactionId, draft) {\n        const draftToUpdate = this.draftUpdateHash.findBy('conversationId', interactionId);\n        if (draftToUpdate) {\n            setProperties(draftToUpdate, draft);\n        } else {\n            this.draftUpdateHash.pushObject(draft);\n        }\n        this.notifyPropertyChange('draftUpdateHash');\n    },\n\n    _cleanUpOldEmails: function () {\n        // clean up old chats\n        this.allEmails.forEach(email => {\n            if (email && !email.get('isActive')) {\n                this.timeDiff(get(email, 'timeCreated'));\n                this.allEmails.removeObject(email);\n\n                const { id } = email;\n                if (this.get('caseAssociation.caseAssociationRequestFT')) {\n                    this.get('caseAssociation').invalidateCaseCacheEntry(id);\n                }\n\n                this.get('externalContacts').removeContactChangeListenersForInteraction(\n                    email,\n                    this.get(`_contactObservers.${id}`)\n                );\n                this.customerIntent.removeCustomerIntentListenerForInteraction(email);\n                this.set(`_contactObservers.${id}`, undefined);\n                email.destroy();\n            } else if (!email) {\n                this.allEmails.removeObject(email);\n            }\n        });\n    },\n\n    createEmail: function (queueId, email, externalContactId) {\n        return this.communication.createEmail(queueId, email, externalContactId).then(response => {\n            if (response && response.id) {\n                this.trigger(EMAIL_CONVERSATION_CREATED_EVENT, { conversationId: response.id });\n            }\n            return response;\n        });\n    },\n\n    answer: function (email) {\n        return this.communication.answer(email);\n    },\n\n    decline: function (email) {\n        return this.communication.disconnect(email);\n    },\n\n    registerMessageEvents: function () {\n        this.pigeon.on('my-conversations', this, this._onMyConversationEvent);\n        this.pigeon.on('connect', this, this._onPigeonConnect);\n        this.pigeon.on('draft', this, this._handleDraftEvent);\n    },\n\n    init() {\n        this._super(...arguments);\n        this.set('_timers', []);\n        this.set('allEmails', A([]));\n        this.set('draftUpdateHash', []);\n        this.set('_contactObservers', {});\n        if (this.get('session.useModes')) return;\n\n        this._emailsReadyPromise = new RSVP.Promise(resolve => {\n            this._emailsReadyResolve = resolve;\n        });\n        this.acdinitialization.registerPromise(this._emailsReadyPromise);\n        this.registerMessageEvents();\n\n        const processingChain = QueuedProcessingChain.create({\n            lifecycleContainer: this,\n            label: 'Acd Email Interaction Processing Chain'\n        });\n        this.set('_processingChain', processingChain);\n\n        processingChain.setProcessingChain([\n            {\n                label: 'Auto Association - Draft Primary Participant Change',\n                process: async ({ eventSource, payload }) => {\n                    if (eventSource === 'primaryParticipantDraftUpdate') {\n                        const { id } = payload;\n\n                        if (!id) return false;\n\n                        const allEmails = this.allEmails;\n                        const interactionModel = allEmails.findBy('id', id);\n                        if (!interactionModel) {\n                            return false;\n                        }\n\n                        // Stop the chain as this is not a conversation event and shouldn't process further\n                        return false;\n                    } else if (eventSource === 'draftEvent') {\n                        this.setDraftUpdate(payload.conversationId, payload);\n                        return false; //Stop the chain here since not conversation event.\n                    }\n                }\n            },\n            {\n                label: 'Filtering and Context Acquisition',\n                process: ({ eventSource, payload }) => {\n                    if (!payload || !payload.id) {\n                        return false;\n                    }\n                    const interactionType = this.getInteractionTypeFromCP(payload);\n                    if (!interactionType.isEmail) {\n                        return false;\n                    }\n\n                    // Halt chain and filter out interaction when user is only screen monitoring\n                    if (isCurrentUserOnlyAScreenMonitor(payload.participants, this.get('session.person.guid'))) {\n                        return false;\n                    }\n\n                    let newInteraction = false;\n                    let allEmails = this.allEmails;\n                    let interactionModel = allEmails.findBy('id', payload.id);\n                    let prevRaw = null;\n\n                    if (!interactionModel) {\n                        newInteraction = true;\n                        // Create the interaction with ONLY owner injection first\n                        // Ember 3.x does not allow passing properties to create() when computed properties exist\n                        interactionModel = Interaction.create(getOwner(this).ownerInjection());\n\n                        // Set properties using setProperties() - this is safer than individual .set() calls\n                        // because it batch-updates and properly handles Ember's change tracking\n                        interactionModel.setProperties(payload);\n\n                        if (!get(interactionModel, 'isInteractionActive')) {\n                            // New interaction is inactive and model has never been added to our interaction list, just clean it up locally\n                            interactionModel.destroy();\n                            // Cancel the chain\n                            return false;\n                        }\n\n                        this.fetchDraftForEmail(interactionModel.get('id'));\n                    } else {\n                        prevRaw = interactionModel.get('__interaction_metadata__');\n                    }\n\n                    return {\n                        eventSource,\n                        payload,\n                        newInteraction,\n                        prevRaw,\n                        interactionModel\n                    };\n                }\n            },\n            {\n                label: 'Timedboxed Wrapup Missed Timer',\n                process: ({ payload, newInteraction }) => {\n                    if (!newInteraction) {\n                        this.handleMissedTimedBoxTimer(this, payload, Interaction);\n                    }\n                }\n            },\n            {\n                label: 'Update Interaction Model State',\n                process: async ({ payload, interactionModel, newInteraction }) => {\n                    if (!newInteraction) {\n                        try {\n                            const agentParticipantId = interactionModel.get('participantForCurrentUser.id');\n                            const newPayloadState = (\n                                payload.participants.find(p => p.id === agentParticipantId).emails[0].state || ''\n                            ).toLowerCase();\n\n                            const newPayloadStateAlertingOrConnected =\n                                newPayloadState === 'alerting' || newPayloadState === 'connected';\n                            const currentInteractionEndState =\n                                interactionModel.get('isDisconnected') || interactionModel.get('isTerminated');\n\n                            if (currentInteractionEndState && newPayloadStateAlertingOrConnected) {\n                                // Update the draftUpdateHash to reflect latest draft state in the roster card\n                                this.fetchDraftForEmail(payload.id);\n                            }\n                        } catch (e) {\n                            this.logger.error('ACD: Failed to fetch draft for email', {\n                                e,\n                                remoteData: {\n                                    interactionId: payload.id\n                                }\n                            });\n                        }\n\n                        interactionModel.setProperties(payload);\n                    }\n                    setInteractionModelMetadata(interactionModel, payload);\n                }\n            },\n            {\n                label: 'Handle Parked Interactions',\n                process: ({ newInteraction, interactionModel }) => {\n                    if (!newInteraction) {\n                        if (interactionModel && interactionModel.get('isParked') && !this.get('session.useNewNav')) {\n                            const titleKey = 'purecloud.acdInteraction.park.success.title';\n                            const messageKey = 'purecloud.acdInteraction.park.success.message';\n                            this._displayNotification(titleKey, messageKey);\n                        } else if (\n                            interactionModel &&\n                            interactionModel.get('isParked') &&\n                            this.get('session.useNewNav')\n                        ) {\n                            const titleKey = 'purecloud.acdInteraction.park.success.title';\n                            const messageKey = 'purecloud.acdInteraction.park.success.messageNewNav';\n                            this._displayNotification(titleKey, messageKey);\n                        }\n                    }\n                }\n            },\n            {\n                label: 'Notify User of Auto-Answered Conversation',\n                process: ({ eventSource, newInteraction, interactionModel }) => {\n                    const partCommIdMap = this.partCommIdMap;\n                    const commId = interactionModel.get('participantForCurrentUser.emails.firstObject.id');\n                    const partId = interactionModel.get('participantForCurrentUser.id');\n                    const triggerAutoAnswerNotification = type => {\n                        this.trigger('autoAnswerDigital', interactionModel, 'email', type);\n                    };\n                    const checkAndSetCommAndPartId = () => {\n                        if (\n                            typeof partCommIdMap[interactionModel.get('id')] === 'undefined' ||\n                            partCommIdMap[interactionModel.get('id')].prevCommId !== commId ||\n                            partCommIdMap[interactionModel.get('id')].prevPartId !== partId\n                        ) {\n                            partCommIdMap[interactionModel.get('id')] = {\n                                prevCommId: commId,\n                                prevPartId: partId\n                            };\n                            return true;\n                        }\n                        return false;\n                    };\n                    // Handle reload and add active interactions to map to track.\n                    if (typeof partCommIdMap[interactionModel.get('id')] === 'undefined' && eventSource === 'api') {\n                        partCommIdMap[interactionModel.get('id')] = {\n                            prevCommId: commId,\n                            prevPartId: partId\n                        };\n                    }\n\n                    const isInitiallyConnected =\n                        interactionModel.get('participantForCustomer.emails.firstObject.initialState') ===\n                            'connected' &&\n                        interactionModel.get('participantForCurrentUser.emails.firstObject.initialState') ===\n                            'connected';\n\n                    const isUnparked = !!interactionModel.get('participantForCurrentUser.emails.firstObject.parkTime');\n\n                    const isUnparkedViaTransfer = () =>\n                        interactionModel\n                            .get('participants')\n                            .flatMap(participant => participant.emails || [])\n                            .some(email => email.state === 'parked');\n\n                    if (eventSource !== 'realtime') {\n                        return;\n                    }\n\n                    if ((isUnparked || isUnparkedViaTransfer()) && newInteraction) {\n                        triggerAutoAnswerNotification('unparking');\n                    } else {\n                        if (!isOutboundEmailInteraction(interactionModel) && isInitiallyConnected) {\n                            if (!newInteraction) {\n                                if (checkAndSetCommAndPartId()) {\n                                    const isTransmitting = interactionModel\n                                        .get('participantForCurrentUser.emails')\n                                        .some(email => email.state === 'transmitting');\n                                    if (isTransmitting) return;\n                                    triggerAutoAnswerNotification();\n                                }\n                                return;\n                            }\n                            checkAndSetCommAndPartId();\n                            triggerAutoAnswerNotification();\n                        }\n                    }\n                }\n            },\n            {\n                label: 'Update Interaction Model - External Contact',\n                process: async ({ payload, interactionModel }) => {\n                    // TechDebt:  For now, we'll maintain feature parity.  But, eventually, we should\n                    // not mix server and UI state\n                    try {\n                        await this.externalContacts.setExternalContactInfo(interactionModel, payload);\n                    } catch (e) {\n                        this.logger.error('ACD: Failed to set External Contact Model data', {\n                            e,\n                            remoteData: {\n                                interactionId: interactionModel.get('id')\n                            }\n                        });\n                    }\n                }\n            },\n            {\n                label: 'Listen for changes on External Contacts attached to customer participant',\n                process: async ({ payload, prevRaw, interactionModel }) => {\n                    if (!get(interactionModel, 'isInteractionActive')) {\n                        return;\n                    }\n                    const { id } = payload;\n                    const callback = this.get(`_contactObservers.${id}`) || function () {};\n                    this.set(`_contactObservers.${id}`, callback);\n                    const externalContacts = this.externalContacts;\n\n                    try {\n                        await externalContacts.addContactChangeListenersForInteraction(\n                            Interaction,\n                            payload,\n                            prevRaw,\n                            callback\n                        );\n                    } catch (e) {\n                        this.logger.error('ACD: Failed to add external contact change listeners on email interaction', {\n                            e,\n                            remoteData: {\n                                interactionId: id\n                            }\n                        });\n                        externalContacts.removeContactChangeListenersForInteraction(interactionModel, callback);\n                        this.set(`_contactObservers.${id}`, undefined);\n                    }\n\n                    const customerIntent = this.customerIntent;\n                    try {\n                        await customerIntent.addCustomerIntentListenerForInteraction(\n                            Interaction,\n                            payload,\n                            interactionModel\n                        );\n                    } catch (e) {\n                        this.logger.error('ACD: Failed to add customer intent listener on email interaction', {\n                            e,\n                            remoteData: {\n                                interactionId: id\n                            }\n                        });\n                        customerIntent.removeCustomerIntentListenerForInteraction(interactionModel);\n                    }\n                }\n            },\n            {\n                label: 'Update Service Model',\n                process: ({ payload, interactionModel, newInteraction }) => {\n                    if (!newInteraction) {\n                        const session = this.session;\n                        if (!get(session, 'useMultipanel')) {\n                            // notify property changes\n                            if (get(interactionModel, 'id') === this.get('interaction.selectedInteraction.id')) {\n                                this.logger.debug(`ACD: notifyPropertyChange for:`, {\n                                    interactionId: payload.id\n                                });\n                                this.interaction.notifyPropertyChange('selectedInteraction');\n                            }\n                        }\n                    } else {\n                        const isValidUpdate = get(interactionModel, 'isInteractionActive');\n\n                        if (isValidUpdate) {\n                            this.get('allEmails').insertAt(0, interactionModel);\n                            if (this.get('caseAssociation.caseAssociationRequestFT'))\n                                this.get('caseAssociation').scheduleRosterSync();\n                        }\n                    }\n                }\n            },\n            {\n                label: 'Cleanup step',\n                process: ({ interactionModel }) => {\n                    if (!get(interactionModel, 'isInteractionActive') && !get(interactionModel, 'isParked')) {\n                        cleanupAfterWrapupGadgetSubmit({\n                            interaction: interactionModel,\n                            isSelectedInteraction:\n                                this.get('interaction.selectedInteraction.id') === get(interactionModel, 'id'),\n                            logger: this.logger,\n                            agentAssistChecksService: this.agentAssistChecks\n                        });\n                    }\n\n                    /*\n                     * TechDebt:\n                     * This debounce gives time for selectedInteraction to get calculated through a gazillion observers.\n                     * Revisit this when we're DDAU and not mutating state everywhere\n                     */\n                    this._timers.push(debounce(this, this._cleanUpOldEmails, 300));\n                }\n            }\n        ]);\n    },\n\n    willDestroy: function () {\n        this._super(...arguments);\n        if (this.get('session.useModes')) return;\n\n        this.get('_timers').forEach(item => cancel(item));\n        this.get('pigeon').off('my-conversations', this, this._onMyConversationEvent);\n        this.get('pigeon').off('connect', this, this._onPigeonConnect);\n        this.get('pigeon').off('draft', this, this._handleDraftEvent);\n    }\n});\n","import Ember from 'ember';\n\nconst { Service, RSVP } = Ember;\n\n/** Ember RSVP promise instance (used by ACD “ready” promises). */\ntype InitPromise = InstanceType<typeof RSVP.Promise>;\n\nexport default Service.extend({\n    _initializationPromises: [] as InitPromise[],\n\n    init() {\n        this._super(...arguments);\n        this.set('_initializationPromises', []);\n    },\n\n    registerPromise(promise: InitPromise) {\n        // Wrap in an explicit RSVP.Promise that always resolves (never rejects)\n        // so that RSVP.all does not short-circuit on failure. Using an explicit\n        // RSVP.Promise (rather than .then()) keeps resolution inside the Ember\n        // run loop, which is required for run.later-based promises in tests.\n        let resolver: (() => void) | undefined;\n        const settled = new RSVP.Promise<void>(resolve => {\n            resolver = resolve;\n        });\n        promise.finally(() => {\n            resolver?.();\n        });\n        this.get('_initializationPromises').push(settled);\n    },\n\n    async waitForAll(additionalDelay = 0): Promise<void> {\n        const promisesToWaitFor = this.get('_initializationPromises');\n        if (!promisesToWaitFor || promisesToWaitFor.length === 0) {\n            return RSVP.resolve();\n        }\n        // Shallow copy of wrapped promises at this moment.\n        const firstBatch = promisesToWaitFor.slice();\n        await RSVP.all(firstBatch);\n\n        const afterFirst = this.get('_initializationPromises');\n        if (afterFirst && afterFirst.length > firstBatch.length) {\n            const secondBatch = afterFirst.slice(firstBatch.length);\n            await RSVP.all(secondBatch);\n        }\n\n        this.set('_initializationPromises', []);\n        if (additionalDelay) {\n            return new RSVP.Promise<void>(resolve => {\n                Ember.run.later(resolve, additionalDelay);\n            });\n        }\n        return undefined;\n    }\n});\n","/* global Set */\n\nimport { resolve, reject } from 'rsvp';\nimport { A } from '@ember/array';\nimport { get, set, setProperties } from '@ember/object';\nimport { run, cancel, later } from '@ember/runloop';\nimport Service, { inject as service } from '@ember/service';\nimport Evented from '@ember/object/evented';\nimport { getOwner } from '@ember/application';\nimport { task, timeout } from 'ember-concurrency';\nimport RSVP from 'rsvp';\nimport _ from 'lodash';\nimport AcdUtilitiesMixin from 'web-directory/mixins/acd-utilities';\nimport Interaction from '../models/interaction/message-interaction';\nimport {\n    isOutboundMessagingInteraction,\n    isCurrentUserOnlyAScreenMonitor,\n    setInteractionModelMetadata\n} from '../utils/acd';\nimport QueuedProcessingChain from '../utils/queued-processing-chain';\nimport { cleanupAfterWrapupGadgetSubmit } from 'web-directory/utils/acw-wrapup-gadget-cleanup';\n\nconst COMMUNICATION_TYPE = 'message';\n\nconst MAX_RETRIES_FOR_TYPING_TOPIC_SUB = 5;\n\nexport const MESSAGE_CONVERSATION_CREATED_EVENT = 'messageConversationCreated';\n\nexport default Service.extend(Evented, AcdUtilitiesMixin, {\n    session: service(),\n    pigeon: service(),\n    communication: service(),\n    interaction: service(),\n    application: service(),\n    preferences: service(),\n    sidebar: service(),\n    commandNav: service('command-nav'),\n    logger: service('stash-logger'),\n    intl: service(),\n    permissions: service(),\n    externalContacts: service(),\n    customerIntent: service(),\n    participantName: service('participant-name'),\n    agentAssistChecks: service(),\n    acdinitialization: service(),\n    caseAssociation: service('case-association'),\n\n    _processingChain: null,\n    _contactObservers: null,\n    activeSms: null,\n    _typingIndicators: [],\n    partCommIdMap: {},\n\n    checkedDeploymentIds: [],\n\n    _messagesReadyPromise: null,\n    _messagesReadyResolve: null,\n\n    getActiveSms() {\n        return this.communication.getAllActive(COMMUNICATION_TYPE);\n    },\n\n    _onMyConversationEvent(payload, topicData = {}) {\n        if (this.isDestroyed || this.isDestroying) {\n            return;\n        }\n        const topicName = topicData.topicName || '';\n        const isTypingEvent = topicName.includes('conversations.inbound.typing.event');\n\n        if (payload) {\n            if (!isTypingEvent && payload.id) {\n                this._processingChain.enqueueEvent(payload.id, { eventSource: 'realtime', payload });\n            } else if (isTypingEvent) {\n                this._handleTypingEvent(payload);\n            }\n        }\n    },\n\n    _handleTypingEvent(payload) {\n        const platformType = payload.normalizedMessage.channel.platform;\n        let configId = null;\n        let typingConfig = null;\n\n        if (platformType.toLowerCase() === 'open' || platformType.toLowerCase() === 'apple') {\n            this._handleTypingIndicator(payload);\n        } else if (platformType.toLowerCase() === 'webmessaging') {\n            configId = payload.normalizedMessage.channel.to.additionalIds[0].value;\n            typingConfig = this.hasTypingConfigForId(configId);\n            if (typingConfig.found === false) {\n                this.communication.getDeploymentConfig(configId).then(result => {\n                    const isTypingEnabledForConv =\n                        result.configurationVersion.messenger.apps.conversations.showUserTypingIndicator;\n                    this.setTypingIndicatorConfig(configId, isTypingEnabledForConv);\n                    if (isTypingEnabledForConv) {\n                        this._handleTypingIndicator(payload);\n                    }\n                });\n            } else if (typingConfig.enabled) {\n                this._handleTypingIndicator(payload);\n            }\n        }\n    },\n\n    _handleTypingIndicator(payload) {\n        const event = payload.normalizedMessage.events[0];\n        const duration = event.typing.duration;\n        const typingIndicators = this._typingIndicators;\n        let typingIndicatorForConvId = typingIndicators.findBy('id', payload.conversationId);\n        if (!typingIndicatorForConvId) {\n            const obj = { id: payload.conversationId };\n            typingIndicatorForConvId = obj;\n            typingIndicators.addObject(obj);\n        } else {\n            cancel(typingIndicatorForConvId.timer);\n        }\n        const timer = later(\n            () => {\n                typingIndicators.removeObject(typingIndicatorForConvId);\n            },\n            duration ? duration : 5000\n        );\n        set(typingIndicatorForConvId, 'timer', timer);\n    },\n\n    getTypingIndicator(smsId) {\n        return this._typingIndicators.findBy('id', smsId);\n    },\n\n    hasTypingConfigForId(configId) {\n        const checkedDeploymentIds = this.checkedDeploymentIds;\n        const result = {\n            found: null,\n            enabled: null\n        };\n        if (configId) {\n            if (checkedDeploymentIds.findBy('id', configId)) {\n                result.enabled = checkedDeploymentIds.findBy('id', configId).enabled;\n                result.found = true;\n            } else {\n                result.found = false;\n            }\n            return result;\n        }\n        this.logger.warn(`No configId passed for typing indicators (outbound), got: ${configId}`);\n        return result;\n    },\n\n    setTypingIndicatorConfig(configId, isTypingEnabledForConv) {\n        const obj = {\n            id: configId,\n            enabled: isTypingEnabledForConv\n        };\n        this.checkedDeploymentIds.addObject(obj);\n    },\n\n    subscribeToTypingEventTopic: task(function* () {\n        for (let i = 0; i < MAX_RETRIES_FOR_TYPING_TOPIC_SUB; i++) {\n            yield timeout(500 * (i + 1));\n            const guid = this.get('session.person.guid');\n            const topic = `v2.users.${guid}.conversations.inbound.typing.event`;\n            if (this.get('pigeon.priorityTopics') && this.get('pigeon.priorityTopics').includes(topic)) {\n                break;\n            }\n            if (guid && this.get('permissions.canViewWebMessaging')) {\n                try {\n                    this.pigeon.registerPriorityTopic(topic);\n                } catch (err) {\n                    this.logger.error('Error registering for topic:', err, topic);\n                }\n            }\n        }\n    }),\n\n    _onPigeonConnect() {\n        if (this.isDestroyed || this.isDestroying) {\n            return;\n        }\n        const guid = this.get('session.person.guid');\n        if (guid) {\n            const smsTopic = `v2.users.${guid}.conversations`;\n            this.pigeon.registerPriorityTopic(smsTopic);\n            this.subscribeToTypingEventTopic.perform();\n        }\n\n        this.getActiveSms()\n            .then(response => {\n                response.forEach(existingConvo => {\n                    if (existingConvo && existingConvo.id) {\n                        this._processingChain.enqueueEvent(existingConvo.id, {\n                            eventSource: 'api',\n                            payload: existingConvo\n                        });\n                    }\n                });\n            })\n            .catch(err => {\n                this.logger.error('ACD: Failed to load active messaging interactions', { err });\n            })\n            .finally(() => {\n                if (this._messagesReadyResolve) {\n                    this._messagesReadyResolve();\n                    this._messagesReadyResolve = null;\n                }\n            });\n    },\n\n    /**\n     * Retrieves the last message from payload regardless of participant.\n     * @param {*} Raw interaction payload from hawk event\n     * @returns {string} returns id of last message in payload\n     */\n    _getLatestMessasgeId(payload) {\n        const payloadMessages = this._getMessagesFromInteraction(payload);\n        const latestMessage = this._getLatestMessage(payloadMessages);\n        let latestMessageId = null;\n        if (latestMessage) {\n            latestMessageId = latestMessage.messageId;\n            this.logger.debug('ACD: Latest Message: ', {\n                interaction: payload.id,\n                latestMessage: latestMessage.messageId\n            });\n        } else {\n            this.logger.debug('ACD: Latest Message not determined for: ', payload.id);\n        }\n\n        return latestMessageId;\n    },\n\n    /**\n     * Will return the latest message from an array of messages\n     * @param {array} Array of messages\n     * @returns {object} object containing the latest messageß\n     */\n    _getLatestMessage(messages) {\n        if (!messages || messages.length === 0) return null;\n        const msg = messages.reduce((a, b) => {\n            const timestampA = new Date(a.messageTime || a.timestamp).getTime();\n            const timestampB = new Date(b.messageTime || b.timestamp).getTime();\n            return timestampA >= timestampB ? a : b;\n        });\n\n        return msg;\n    },\n\n    /**\n     * Will return an array of messages given an interaction model or raw js object\n     * @param {object} interaction model or raw hawk payload\n     * @returns {array} Returns an array of messages\n     */\n    _getMessagesFromInteraction(interaction) {\n        const participants = get(interaction, 'participants') || [];\n        if (get(participants, 'length') === 0) {\n            return [];\n        }\n        return participants\n            .flatMap(participant => (participant ? participant.messages : []))\n            .flatMap(entry => (entry ? entry.messages : []))\n            .filter(entry => !!entry);\n    },\n\n    getInteractionMessages(interactionId) {\n        let activeSms = this.activeSms;\n        let interactionModel = activeSms.findBy('id', interactionId);\n\n        if (!interactionModel) return A([]);\n\n        const messages = this._getMessagesFromInteraction(interactionModel);\n        return messages;\n    },\n\n    // Retrieve all smsObjects from the new incoming cp message\n    getSmsObjects(interaction) {\n        let smsObjs = [];\n        _.each(interaction.participants, participant => {\n            _.each(participant.messages, sms => {\n                const hasMessages = sms.messages !== null && sms.messages !== undefined;\n                if (hasMessages) {\n                    _.each(sms.messages, message => {\n                        const messageAlreadyAdded = _.findIndex(smsObjs, { messageId: message.messageId }) > -1;\n                        if (!messageAlreadyAdded) {\n                            smsObjs = smsObjs.concat(sms.messages);\n                        }\n                    });\n                }\n            });\n        });\n        return smsObjs;\n    },\n\n    toastNewMessage(messageData, interactionModel, rawPayload) {\n        const newMessage = messageData.message;\n        const isInbound = get(newMessage, 'direction').toLowerCase() === 'inbound';\n        const messageBody = this.getMessageBody(messageData);\n\n        if (messageData.newMessage && isInbound && !!messageBody) {\n            const interactions = this.activeSms;\n            const interaction = interactions.find(i => get(i, 'id') === messageData.interactionId) || interactionModel;\n            if (interaction) {\n                const customerParticipantId = get(interaction, 'participantForCustomer.id');\n                if (customerParticipantId) {\n                    const rawConversation = get(interaction, '__interaction_metadata__') || rawPayload;\n                    if (rawConversation) {\n                        const rawParticipant = rawConversation.participants.find(p => p.id === customerParticipantId);\n                        return this.participantName.fetchNameFromParticipant(rawParticipant).then(name => {\n                            const noName = this.intl.t('purecloud.acdInteraction.noName');\n                            const displayName = name || noName;\n                            this.sendAcdMessageNotification(messageData, displayName, messageBody);\n                        });\n                    }\n                }\n            }\n        }\n    },\n\n    /**\n     * @param {object} interaction the raw payload from hawk or public api containing update for an interaction.\n     * @param {object} message the message\n     * @param {array} newMessage indicates if this message is a new message or an update to an existing message\n     * @param {string} eventSrcFromAPI indicates if interaction came from hawk event or fetched from public api\n     * @param {Interaction} interactionModel the current interaction model that will be updated with the message details that was fetched\n     * @returns\n     */\n    _handleNewMessage(interaction, message, newMessage, eventSrcFromAPI, interactionModel) {\n        const newMessageEvt = {\n            interactionId: interaction.id,\n            message,\n            newMessage\n        };\n        if (!eventSrcFromAPI) {\n            // Only toast new messages if coming from hawk events not when loading from PAPI\n            this.toastNewMessage(newMessageEvt, interactionModel, interaction);\n        }\n    },\n\n    /**\n     *\n     * This function will determine if it should fetch message details using the bulk endpoint\n     * or if it can simply get the current content of the model if the message exists.\n     * Currently it will verify only if the messagingGadget && ACE-4461_org-settings-fetch toggles are both on\n     * and if the message is not Instagram. Currently Instagram allows the deletion\n     * If both are not ON it will fall back to always fetching from bulk endpoint.\n     *\n     * Please note that if any message is not found in the model it will also fall back to fetching from enpoint.\n     *\n     * @param {String} interactionId Interaction id\n     * @param {Array} smsIdsToLookup Array of message ids to lookup\n     * @param {Boolean} isInstagram is the submessage type instagram\n     * @returns Promise containing Array of message details either fetched from endpoint or retrieved from interaction model.\n     */\n    async verifyBeforeFetchingMessageDetails(interactionId, smsIdsToLookup, isInstagram) {\n        const canVerifyBeforeFetch = this.get('session.features.ACE-4461_org-settings-fetch') && !isInstagram;\n\n        if (!canVerifyBeforeFetch) {\n            return this.communication.getSMSDetails(interactionId, smsIdsToLookup);\n        }\n\n        const messages = this.getInteractionMessages(interactionId) || [];\n        const messageIdSet = new Set(messages.map(msg => msg.messageId || msg.id));\n\n        const entities = [];\n        const notFoundMsgIds = [];\n\n        smsIdsToLookup.forEach(msgId => {\n            if (messageIdSet.has(msgId)) {\n                const foundMsg = messages.find(msg => msg.messageId === msgId || msg.id === msgId);\n                if (foundMsg) {\n                    entities.push(foundMsg);\n                }\n            } else {\n                notFoundMsgIds.push(msgId);\n            }\n        });\n\n        if (notFoundMsgIds.length > 0) {\n            return this.communication.getSMSDetails(interactionId, smsIdsToLookup);\n        } else {\n            return resolve({ entities });\n        }\n    },\n\n    /**\n     * @param {object} interaction the raw payload from hawk or public api containing update for an interaction.\n     * @param {array}  smsIdsToLookup array of message ids that came in through hawk that we need to fetch details for.\n     * @param {array}  smsMessagesFromCPToFill the associated raw message objects that came in from hawk that will receive the details fetched with smsIdsToLookup\n     * @param {object} options object containing the following properties\n     *        {string} eventSrcFromAPI indicates if interaction came from hawk event or fetched from public api\n     *        {Interaction} interactionModel the current interaction model that will be updated with the message details that was fetched\n     *        {boolean} newModelCreated boolean indicating if a new model was created in the processing chain\n     *        {boolean} isInstagram is the submessage type instagram\n     * @returns\n     */\n    getSMSDetails(interaction, smsIdsToLookup, smsMessagesFromCPToFill, options) {\n        const { eventSrcFromAPI, interactionModel, newModelCreated, isInstagram } = options;\n\n        const messages = this.getInteractionMessages(interaction.id);\n        if (!smsIdsToLookup || smsIdsToLookup.length === 0) return;\n        return this.verifyBeforeFetchingMessageDetails(interaction.id, smsIdsToLookup, isInstagram)\n            .then(smsMessageDetails => {\n                this.logger.debug('ACD: getSMSDetails fetched SMS details for interaction', {\n                    interactionId: interaction.id,\n                    smsMessageDetails\n                });\n                smsMessageDetails = smsMessageDetails.entities || [];\n\n                smsMessagesFromCPToFill.forEach(sms => {\n                    const smsDetail = _.find(smsMessageDetails, { id: sms.messageId });\n                    if (smsDetail) {\n                        smsDetail.messageId = smsDetail.id; //TODO: backend need to resolve descrepency between CP messageId and message ID.\n                        const msgFound = !!messages.findBy('id', smsDetail.id);\n\n                        // message may not be found if bootstrapping and messages array will be empty\n                        // Let us compare the messages lengths of old and new to see if a new message\n                        // was added.\n\n                        let newMessage = !msgFound;\n\n                        if (interactionModel) {\n                            const currentMessagesLength = this._getMessagesFromInteraction(interactionModel).length;\n                            const newMessagesLength = this._getMessagesFromInteraction(interaction).length;\n\n                            newMessage =\n                                (newModelCreated && !eventSrcFromAPI) ||\n                                (!msgFound && currentMessagesLength !== newMessagesLength);\n                        }\n\n                        setProperties(sms, smsDetail);\n                        const typingIndicatorForConvId = this.getTypingIndicator(interaction.id);\n                        if (smsDetail.direction === 'inbound' && typingIndicatorForConvId) {\n                            this._typingIndicators.removeObject(typingIndicatorForConvId);\n                        }\n\n                        this._handleNewMessage(interaction, sms, newMessage, eventSrcFromAPI, interactionModel);\n                    }\n                });\n\n                return interaction;\n            })\n            .catch(jqXHR => {\n                this.logger.error('ACD: getSMSDetails - Error fetching sms details for interaction', {\n                    error: jqXHR,\n                    interaction: interaction.id\n                });\n                this._displayApiError(jqXHR, 'purecloud.acdInteraction.sms.errors.process');\n            });\n    },\n\n    _cleanUpOldSms() {\n        const activeSms = this.activeSms;\n        const smsToRemove = [];\n        _.each(activeSms, sms => {\n            if (sms && !get(sms, 'isActive')) {\n                this.timeDiff(get(sms, 'timeCreated'));\n                smsToRemove.push(sms);\n\n                const { id } = sms;\n                if (this.get('caseAssociation.caseAssociationRequestFT') && id) {\n                    this.get('caseAssociation').invalidateCaseCacheEntry(id);\n                }\n                this.get('externalContacts').removeContactChangeListenersForInteraction(\n                    sms,\n                    this.get(`_contactObservers.${id}`)\n                );\n                this.customerIntent.removeCustomerIntentListenerForInteraction(sms);\n                this.set(`_contactObservers.${id}`, undefined);\n\n                sms.destroy();\n            } else if (sms === undefined) {\n                smsToRemove.push(sms);\n            }\n        });\n\n        activeSms.removeObjects(smsToRemove);\n    },\n\n    registerMessageEvents() {\n        this.pigeon.on('my-conversations', this, this._onMyConversationEvent);\n        this.pigeon.on('connect', this, this._onPigeonConnect);\n        this.pigeon.on('event', this, this._onMyConversationEvent);\n    },\n\n    init() {\n        this._super(...arguments);\n        this.set('_timers', []);\n        this.set('activeSms', []);\n        this.set('checkedDeploymentIds', []);\n        this.set('_contactObservers', {});\n        if (this.get('session.useModes')) return;\n\n        this._messagesReadyPromise = new RSVP.Promise(resolve => {\n            this._messagesReadyResolve = resolve;\n        });\n        this.acdinitialization.registerPromise(this._messagesReadyPromise);\n        this.registerMessageEvents();\n\n        const processingChain = QueuedProcessingChain.create({\n            lifecycleContainer: this,\n            label: 'acd messages Interaction Processing Chain'\n        });\n        this.set('_processingChain', processingChain);\n\n        processingChain.setProcessingChain([\n            {\n                label: 'Filtering and Context Acquisition',\n                process: ({ eventSource, payload }) => {\n                    if (!payload || !payload.id) {\n                        return false;\n                    }\n                    const interactionType = this.getInteractionTypeFromCP(payload);\n                    if (!interactionType.isSms) {\n                        return false;\n                    }\n\n                    // Halt chain and filter out interaction when user is only screen monitoring\n                    if (isCurrentUserOnlyAScreenMonitor(payload.participants, this.get('session.person.guid'))) {\n                        return false;\n                    }\n\n                    let newInteraction = false;\n                    let prevRaw = null;\n                    let activeSms = this.activeSms;\n                    let interactionModel = activeSms.findBy('id', payload.id);\n                    if (!interactionModel) {\n                        newInteraction = true;\n                        interactionModel = Interaction.create(\n                            Object.assign({}, payload, getOwner(this).ownerInjection())\n                        );\n\n                        if (!get(interactionModel, 'isInteractionActive')) {\n                            // New interaction is inactive and model has never been added to our interaction list, just clean it up locally\n                            interactionModel.destroy();\n                            // Cancel the chain\n                            return false;\n                        }\n                    } else {\n                        prevRaw = interactionModel.get('__interaction_metadata__');\n                    }\n\n                    return {\n                        eventSource,\n                        payload,\n                        prevRaw,\n                        newInteraction,\n                        interactionModel\n                    };\n                }\n            },\n            {\n                label: 'Retrieve message details Step',\n                process: async ({ eventSource, payload, interactionModel, newInteraction }) => {\n                    let isInstagram;\n                    // Let's find out the submessage type. Because we will\n                    // fetch inbound messages that are in the `received` state\n                    // but only for instagram. These messages can be unsent so\n                    // `received` state is not the final state.\n                    const sampleParticipant = (payload.participants || []).find(entry => {\n                        return entry && entry.messages && entry.messages.length;\n                    });\n\n                    const subMessageType =\n                        sampleParticipant && (sampleParticipant.messages || []).length\n                            ? sampleParticipant.messages[0].type\n                            : '';\n\n                    isInstagram =\n                        subMessageType &&\n                        typeof subMessageType === 'string' &&\n                        subMessageType.toLowerCase() === 'instagram';\n\n                    const smsMessagesFromCP = this.getSmsObjects(payload);\n                    let smsIdsToLookup = [];\n\n                    const lastMessageId = this._getLatestMessasgeId(payload);\n                    if (lastMessageId) {\n                        smsIdsToLookup.push(lastMessageId);\n                    }\n\n                    this.logger.debug('ACD: acdsms ids to lookup for interaction', {\n                        eventSource,\n                        interactionId: get(payload, 'id'),\n                        smsIdsToLookup\n                    });\n                    const smsMessagesFromCPToFill = _.filter(smsMessagesFromCP, sms => {\n                        return smsIdsToLookup.includes(sms.messageId);\n                    });\n                    const eventSrcFromAPI = eventSource === 'api';\n                    const newModelCreated = newInteraction;\n\n                    await this.getSMSDetails(payload, smsIdsToLookup, smsMessagesFromCPToFill, {\n                        eventSrcFromAPI,\n                        interactionModel,\n                        newModelCreated,\n                        isInstagram\n                    });\n                }\n            },\n            {\n                label: 'Timedboxed Wrapup Missed Timer',\n                process: ({ payload, newInteraction }) => {\n                    if (!newInteraction) {\n                        this.handleMissedTimedBoxTimer(this, payload, Interaction);\n                    }\n                }\n            },\n            {\n                label: 'Update State Step',\n                process: ({ payload, interactionModel, newInteraction }) => {\n                    if (!newInteraction) {\n                        this.logger.debug('ACD: Updating existing sms model', {\n                            interactionId: payload.id\n                        });\n\n                        interactionModel.setProperties(payload);\n                        setInteractionModelMetadata(interactionModel, payload);\n\n                        // notify property changes\n                        if (interactionModel === this.get('interaction.selectedInteraction')) {\n                            this.set('interaction.selectedInteraction.ids', this.get('selectedInteraction.id'));\n                            const session = this.session;\n                            if (!get(session, 'useMultipanel')) {\n                                this.interaction.notifyPropertyChange('selectedInteraction');\n                            }\n                        }\n                    } else {\n                        this.logger.debug('ACD: No active sms found matching id. Creating new sms model', {\n                            interactionId: payload.id\n                        });\n                        setInteractionModelMetadata(interactionModel, payload);\n                        const isValidUpdate = get(interactionModel, 'isInteractionActive');\n                        if (isValidUpdate) {\n                            this.get('activeSms').insertAt(0, interactionModel);\n                            if (this.get('caseAssociation.caseAssociationRequestFT'))\n                                this.get('caseAssociation').scheduleRosterSync();\n                        }\n                    }\n                }\n            },\n            {\n                label: 'Handle Parked Interactions',\n                process: ({ newInteraction, interactionModel }) => {\n                    if (!newInteraction && interactionModel && interactionModel.get('isParked')) {\n                        const titleKey = 'purecloud.acdInteraction.sms.park.success.title';\n                        const messageKey = this.get('session.useNewNav')\n                            ? 'purecloud.acdInteraction.sms.park.success.messageNewNav'\n                            : 'purecloud.acdInteraction.sms.park.success.message';\n                        this._displayNotification(titleKey, messageKey);\n                    }\n                }\n            },\n            {\n                label: 'Notify User of Auto-Answered Conversation',\n                process: ({ eventSource, newInteraction, interactionModel }) => {\n                    const partCommIdMap = this.partCommIdMap;\n                    const commId = interactionModel.get('participantForCurrentUser.messages.firstObject.id');\n                    const partId = interactionModel.get('participantForCurrentUser.id');\n                    const triggerAutoAnswerNotification = type => {\n                        this.trigger('autoAnswerDigital', interactionModel, 'message', type);\n                    };\n                    const checkAndSetCommAndPartId = () => {\n                        if (\n                            typeof partCommIdMap[interactionModel.get('id')] === 'undefined' ||\n                            partCommIdMap[interactionModel.get('id')].prevCommId !== commId ||\n                            partCommIdMap[interactionModel.get('id')].prevPartId !== partId\n                        ) {\n                            partCommIdMap[interactionModel.get('id')] = {\n                                prevCommId: commId,\n                                prevPartId: partId\n                            };\n                            return true;\n                        }\n                        return false;\n                    };\n                    // Handle reload and add active interactions to map to track.\n                    if (typeof partCommIdMap[interactionModel.get('id')] === 'undefined' && eventSource === 'api') {\n                        partCommIdMap[interactionModel.get('id')] = {\n                            prevCommId: commId,\n                            prevPartId: partId\n                        };\n                    }\n                    const isInitiallyConnected =\n                        interactionModel.get('participantForCustomer.messages.firstObject.initialState') ===\n                            'connected' &&\n                        interactionModel.get('participantForCurrentUser.messages.firstObject.initialState') ===\n                            'connected';\n\n                    const isUnparked = !!interactionModel.get(\n                        'participantForCurrentUser.messages.firstObject.parkTime'\n                    );\n\n                    const isUnparkedViaTransfer = () =>\n                        interactionModel\n                            .get('participants')\n                            .flatMap(participant => [\n                                ...((participant && participant.messages) || []),\n                                ...((participant && participant.internalMessages) || [])\n                            ])\n                            .some(message => message && message.state === 'parked');\n\n                    if (eventSource !== 'realtime') {\n                        return;\n                    }\n\n                    if ((isUnparked || isUnparkedViaTransfer()) && newInteraction) {\n                        triggerAutoAnswerNotification('unparking');\n                    } else {\n                        if (!isOutboundMessagingInteraction(interactionModel) && isInitiallyConnected) {\n                            if (!newInteraction) {\n                                if (checkAndSetCommAndPartId()) {\n                                    triggerAutoAnswerNotification();\n                                }\n                                return;\n                            }\n                            checkAndSetCommAndPartId();\n                            triggerAutoAnswerNotification();\n                        }\n                    }\n                }\n            },\n            {\n                label: 'Notify User of Supervisor Takeover',\n                process: ({ eventSource, interactionModel, prevRaw }) => {\n                    if (!this.get('session.features.PURE-6914')) return;\n                    if (!interactionModel) return;\n\n                    // Only notify on realtime updates, not on initial API/bootstrap loads\n                    if (eventSource !== 'realtime') return;\n                    if (get(interactionModel, 'takeoverNotified')) return;\n\n                    const currentParticipant = get(interactionModel, 'participantForCurrentUser');\n                    const currentMedia = get(currentParticipant || {}, 'messages.firstObject');\n                    const currentDisconnect = (get(currentMedia || {}, 'disconnectType') || '').toLowerCase();\n\n                    // Use previous raw payload, if present, to detect a transition\n                    let previousDisconnect = '';\n                    if (prevRaw && currentParticipant && currentParticipant.id) {\n                        const prevParticipant =\n                            (prevRaw.participants || []).find(p => p && p.id === currentParticipant.id) || {};\n                        const prevMedia = get(prevParticipant, 'messages.firstObject');\n                        previousDisconnect = (get(prevMedia || {}, 'disconnectType') || '').toLowerCase();\n                    }\n\n                    const transitionedToRemoved = currentDisconnect === 'takeover' && previousDisconnect !== 'takeover';\n                    if (!transitionedToRemoved) return;\n\n                    this._displayNotification(null, 'purecloud.acdInteraction.takeoverNotification');\n                    interactionModel.set('takeoverNotified', true);\n                }\n            },\n            {\n                label: 'Update Interaction Model - External Contact',\n                process: async ({ interactionModel, payload }) => {\n                    // TechDebt:  For now, we'll maintain feature parity.  But, eventually, we should\n                    // not mix server and UI state\n                    try {\n                        await this.externalContacts.setExternalContactInfo(interactionModel, payload);\n                    } catch (e) {\n                        this.logger.error('ACD SMS: Failed to set External Contact Model data', {\n                            e,\n                            remoteData: {\n                                interactionId: interactionModel.get('id')\n                            }\n                        });\n                    }\n                }\n            },\n            {\n                label: 'Listen for changes on External Contacts attached to customer participant',\n                process: async ({ payload, prevRaw, interactionModel }) => {\n                    if (!get(interactionModel, 'isInteractionActive')) {\n                        return;\n                    }\n                    const { id } = payload;\n                    const callback = this.get(`_contactObservers.${id}`) || function () {};\n                    this.set(`_contactObservers.${id}`, callback);\n                    const externalContacts = this.externalContacts;\n\n                    try {\n                        await externalContacts.addContactChangeListenersForInteraction(\n                            Interaction,\n                            payload,\n                            prevRaw,\n                            callback\n                        );\n                    } catch (e) {\n                        this.logger.error('ACD: Failed to add external contact change listeners on sms interaction', {\n                            e,\n                            remoteData: {\n                                interactionId: id\n                            }\n                        });\n                        externalContacts.removeContactChangeListenersForInteraction(interactionModel, callback);\n                        this.set(`_contactObservers.${id}`, undefined);\n                    }\n\n                    const customerIntent = this.customerIntent;\n                    try {\n                        await customerIntent.addCustomerIntentListenerForInteraction(\n                            Interaction,\n                            payload,\n                            interactionModel\n                        );\n                    } catch (e) {\n                        this.logger.error('ACD: Failed to add customer intent listener on sms interaction', {\n                            e,\n                            remoteData: {\n                                interactionId: id\n                            }\n                        });\n                        customerIntent.removeCustomerIntentListenerForInteraction(interactionModel);\n                    }\n                }\n            },\n            {\n                label: 'Cleanup step',\n                process: ({ interactionModel }) => {\n                    if (!get(interactionModel, 'isInteractionActive') && !get(interactionModel, 'isParked')) {\n                        cleanupAfterWrapupGadgetSubmit({\n                            interaction: interactionModel,\n                            isSelectedInteraction:\n                                this.get('interaction.selectedInteraction.id') === get(interactionModel, 'id'),\n                            logger: this.logger,\n                            agentAssistChecksService: this.agentAssistChecks\n                        });\n                    }\n\n                    /*\n                     * TechDebt:\n                     * This debounce gives time for selectedInteraction to get calculated through a gazillion observers.\n                     * Revisit this when we're DDAU and not mutating state everywhere\n                     */\n                    this._timers.push(run.debounce(this, this._cleanUpOldSms, 300));\n                }\n            }\n        ]);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        if (this.get('session.useModes')) return;\n\n        this.get('_timers').forEach(item => cancel(item));\n        this.get('pigeon').off('my-conversations', this, this._onMyConversationEvent);\n        this.get('pigeon').off('connect', this, this._onPigeonConnect);\n        this.get('pigeon').off('event', this, this._onMyConversationEvent);\n    },\n\n    answer(interaction) {\n        return this.communication.answer(interaction);\n    },\n\n    endSms(interaction) {\n        return this.communication.disconnect(interaction);\n    },\n\n    decline(interaction) {\n        return this.communication.disconnect(interaction);\n    },\n\n    takeover(interaction) {\n        return this.communication.takeover(interaction);\n    },\n\n    /**\n     * @param {object} messageData from raw payload\n     * @return {object} messageBody containing text content or text indicating attachment\n     */\n    getMessageBody(messageData) {\n        const intl = this.intl;\n        let messageBody = get(messageData, 'message.normalizedMessage.text') || '';\n        const hasMediaAttachment = !!get(messageData, 'message.normalizedMessage.content.firstObject.attachment');\n\n        if (_.isEmpty(messageBody.trim()) && hasMediaAttachment) {\n            messageBody = intl.safestring('purecloud.acdInteraction.sms.mediaSent').toString();\n        }\n        return messageBody;\n    },\n\n    sendAcdMessageNotification(messageData, customerName, messageBody) {\n        const isBusyUser = this.get('session.person.presence') === 'busy';\n        if (!isBusyUser) {\n            const windowFocused = this.windowInFocus();\n            const isInteractionViewOpen = this.get('interaction.isInteractionViewOpen');\n            const showPopup = !isInteractionViewOpen || (!windowFocused && !isInteractionViewOpen);\n            const playSound = !this.get('preferences.chat.global.soundsMuted');\n            const title = customerName;\n\n            this.notification.info(title, messageBody, {\n                messageStyle: 'acd-toast-notification',\n                tag: get(messageData, 'interactionId'),\n                hideAfter: false,\n                soundId: 'chat',\n                shouldShowPopup: showPopup,\n                shouldPlaySound: playSound,\n                target: this.applicationController,\n                volume: this.getNotificationVolume(),\n                clickHandler: () => {\n                    if (!this.get('interaction.isInteractionViewOpen')) {\n                        if (this.get('session.useNewNav')) {\n                            this.commandNav.selectPanel('agent');\n                        } else {\n                            this.sidebar.togglePanel('acdInteractions');\n                        }\n\n                        // answers interaction that is in the notification\n\n                        const interaction = this.interaction.getInteraction(messageData.interactionId);\n                        this.set('interaction.selectedInteraction', interaction);\n                    }\n                }\n            });\n        }\n    },\n\n    handleActiveInteractionOnCreate(options) {\n        const intl = this.intl;\n        let notification = null;\n        const subMsgType = intl.t(\n            'purecloud.acdInteraction.interactionTypes.supportedMessengerTypes.' + options.toAddressMessengerType\n        );\n\n        const continueOutBoundCreate = options => {\n            const useExistingConversation = true;\n            return this.createMessage(options, useExistingConversation).catch(response => {\n                let message = this.intl.t('purecloud.acdInteraction.sms.errors.errorCreatingMessage');\n                if (response.payload && response.payload.code === `queue.address.required`) {\n                    message = this.intl.t('purecloud.acdInteraction.sms.errors.queueSubMessageRequired', {\n                        subMessageType: subMsgType,\n                        queueName: options.queueName\n                    });\n                } else if (response.payload && response.payload.code === `active.conversation`) {\n                    message = this.intl.t('purecloud.acdInteraction.sms.errors.conversationAlreadyExists');\n                }\n                const title = this.intl.t('purecloud.acdInteraction.sms.errors.queueSmsErrorTitle');\n                this.notification.error(title, message);\n            });\n        };\n\n        notification = this.notification.info(\n            null,\n            intl.t('purecloud.acdInteraction.sms.messageHistoryExist.title', { subMessageType: subMsgType }),\n            {\n                showCloseButton: true,\n                hideAfter: false,\n                messageStyle: 'pin-to-top',\n                type: 'outbound-interaction-message',\n                target: this,\n                tag: 'outbound-interaction-message',\n                actionHandlers: {\n                    continueOutBoundCreate: {\n                        label: intl.safestring('purecloud.acdInteraction.sms.messageHistoryExist.continue').toString(),\n                        action: () => {\n                            continueOutBoundCreate(options);\n                            notification.hide();\n                        }\n                    },\n                    cancelOutboundCreate: {\n                        label: intl.safestring('purecloud.acdInteraction.sms.messageHistoryExist.cancel').toString(),\n                        action: () => {\n                            notification.hide();\n                        }\n                    }\n                }\n            },\n            getOwner(this)\n        );\n    },\n\n    createMessage(options, useExistingConversation) {\n        return this.communication\n            .createMessage(options, useExistingConversation)\n            .then(response => {\n                if (response && response.id) {\n                    this.trigger(MESSAGE_CONVERSATION_CREATED_EVENT, { conversationId: response.id });\n                }\n                return response;\n            })\n            .catch(response => {\n                if (!useExistingConversation && response.payload && response.payload.code === 'existing.conversation') {\n                    this.handleActiveInteractionOnCreate(options);\n                } else {\n                    return reject(response);\n                }\n            });\n    },\n\n    getNotificationVolume() {\n        let volume = this.get('preferences.chat.chatNotificationVolume');\n        if (volume > 1) {\n            volume = volume / 100;\n        }\n        return volume;\n    }\n});\n","import Service, { inject as service } from '@ember/service';\nimport ConversationMixin from 'web-directory/mixins/conversation';\nimport BrowserUtils from 'web-directory/utils/browser';\n\nconst BASE_URI = 'api/v2/voicemail';\n\nexport default Service.extend(ConversationMixin, {\n    application: service(),\n    ajax: service(),\n\n    getVoicemailMediaInfo(voicemailId) {\n        const formatId = BrowserUtils.getSuggestedAudioTypeFrom(['webm', 'wav']);\n        const url = `${this.application.pcV2Uri(BASE_URI)}/messages/${voicemailId}/media?formatId=${formatId}`;\n        return this.makeRequest(url, {}, 'get');\n    },\n\n    getVoicemailWithTranscription(voicemailId) {\n        const url = `${this.application.pcV2Uri(BASE_URI)}/messages/${voicemailId}/?expand=transcription`;\n        return this.makeRequest(url, {}, 'get');\n    },\n\n    getUserAlertTime(userId) {\n        const url = `${this.application.pcV2Uri(BASE_URI)}/userpolicies/${userId}`;\n        return this.makeRequest(url, {}, 'get');\n    },\n\n    getGroupAlertTime(groupRingId) {\n        const url = `${this.application.pcV2Uri(BASE_URI)}/groups/${groupRingId}/policy`;\n        return this.makeRequest(url, {}, 'get');\n    }\n});\n","import { computed, set } from '@ember/object';\nimport Evented from '@ember/object/evented';\nimport { run } from '@ember/runloop';\nimport Service, { inject } from '@ember/service';\nimport type {\n    AssignmentStateType,\n    TransferOptions,\n    TransferType,\n    Workitem,\n    WorkitemApi,\n    WorkitemInteraction\n} from '@genesys/genesys-cloud-conversation-utils';\nimport { convertApiWorkitem, createWorkitemInteraction } from '@genesys/genesys-cloud-conversation-utils';\nimport AcdUtilitiesMixin from 'web-directory/mixins/acd-utilities';\nimport QueuedProcessingChain from '../utils/queued-processing-chain';\nimport { Maybe } from 'web-directory/types';\n\ninterface ProcessingChainParams {\n    eventSource: 'realtime' | 'api';\n    payload: WorkitemApi | Workitem;\n    workitemInteraction: WorkitemInteraction;\n    currentWorkitemInteraction: WorkitemInteraction;\n}\n\nconst ACTIVE_ASSIGNMENT_STATES: Array<AssignmentStateType> = ['Alerting', 'Connected', 'Held'];\n\nexport const WORKITEM_INTERACTION_CHANGED_EVENT = 'WORKITEM_INTERACTION_CHANGED_EVENT';\nexport const WORKITEM_ASSIGNMENT_STATE_CHANGED_EVENT = 'workitemAssignmentStateChangedEvent';\n\nexport default Service.extend(Evented, AcdUtilitiesMixin, {\n    session: inject('session'),\n    pigeon: inject('pigeon'),\n    interaction: inject('interaction'),\n    taskmanagement: inject('task-management'),\n    caseAssociation: inject('case-association'),\n    application: inject('application'),\n    permissions: inject('permissions'),\n    notification: inject('notification'),\n    externalContacts: inject('external-contacts'),\n    customerIntent: inject('customer-intent'),\n\n    canViewWorkitem: computed.readOnly('permissions.canViewWorkitem'),\n\n    // feature toggle for PURE-6191 division aware external contacts for workitems\n    acdExternalContactWorkitemsDivNameFT: computed.readOnly('session.features.PURE-6191'),\n\n    /**\n     * Store of all workitems for an Agent.\n     */\n    // TODO - better definitions & documentation for attributes\n    allWorkitems: null as Maybe<any>,\n    _contactObservers: null as Maybe<any>,\n    _processingChain: undefined as Maybe<any>,\n    _timers: undefined as Maybe<any>,\n\n    alertingWorkitems: computed('activeWorkitems.[]', 'activeWorkitems.@each.workitem', function () {\n        return this.get('activeWorkitems').filter(\n            (workitemInteraction: WorkitemInteraction) => workitemInteraction.workitem.assignmentState === 'Alerting'\n        );\n    }),\n    /**\n     * Active workitems\n     */\n    activeWorkitems: computed.readOnly('allWorkitems'),\n\n    /**\n     * Register notification events\n     */\n    registerMessageEvents() {\n        this.get('pigeon').on('workitems', this, this._processWorkitem);\n        this.get('pigeon').on('connect', this, this._onConnect);\n    },\n\n    /**\n     * Process workitem from event\n     * @param payload\n     */\n    _processWorkitem(this: any, payload: Workitem) {\n        if (this.get('isDestroyed') || this.get('isDestroying')) {\n            return;\n        }\n\n        if (payload && payload.id) {\n            this.get('_processingChain').enqueueEvent(payload.id, { eventSource: 'realtime', payload });\n        }\n    },\n\n    /**\n     * Subscribe to workitem user notifications and load all workitems on user connect\n     */\n    _onConnect(this: any) {\n        if (this.get('isDestroyed') || this.get('isDestroying')) {\n            return;\n        }\n\n        // @ts-ignore\n        const userId = this.get('session.person.guid');\n\n        if (userId) {\n            if (this.get('canViewWorkitem')) {\n                const workItemsTopic = `v2.taskmanagement.workitems.users.${userId}`;\n                this.get('pigeon').registerPriorityTopic(workItemsTopic, 'workitems');\n\n                /* Hydration */\n                this.get('taskmanagement')\n                    .loadActiveWorkitems(userId)\n                    .then((response: { entities: WorkitemApi[] }) => {\n                        response.entities.forEach((workitem: WorkitemApi) => {\n                            if (workitem && workitem.id) {\n                                this.get('_processingChain').enqueueEvent(workitem.id, {\n                                    eventSource: 'api',\n                                    payload: workitem\n                                } as ProcessingChainParams);\n                            }\n                        });\n                    })\n                    .catch((err: Error) => {\n                        this.get('logger').error('ACD: Failed to load active task routing interactions', { err });\n                    });\n            } else {\n                this.get('logger').info('ACD: User does not have workitem required view permission.');\n            }\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n        this.set('_timers', []);\n        this.set('allWorkitems', []);\n        this.set('_contactObservers', {});\n        // @ts-ignore\n        if (this.get('session.useModes')) return;\n\n        this._createProcessingChain();\n    },\n\n    _createProcessingChain(this: any) {\n        if (this.get('_processingChain')) {\n            return;\n        }\n\n        this.registerMessageEvents();\n\n        const processingChain = QueuedProcessingChain.create({\n            // [@ts-expect-error] -> unable to provide a valid type for the processing chain\n            lifecycleContainer: this,\n            // @ts-expect-error -> unable to provide a valid type for the processing chain\n            label: 'Acd Workitem Interaction Processing Chain'\n        });\n\n        this.set('_processingChain', processingChain);\n        processingChain.setProcessingChain([\n            {\n                label: 'Acd Workitem - Converting Workitem to Workitem Interaction',\n                process: ({ eventSource, payload }: ProcessingChainParams) => {\n                    if (!payload || !payload.id) {\n                        return false;\n                    }\n\n                    // workitem API and event representation are different\n                    const workitem = eventSource === 'api' ? convertApiWorkitem(payload as WorkitemApi) : payload;\n                    const workitemInteraction = createWorkitemInteraction(workitem as Workitem);\n\n                    return { eventSource, payload, workitemInteraction };\n                }\n            },\n            {\n                label: 'Acd Workitem - Store and Merge Workitem Interaction',\n                process: async ({ workitemInteraction, eventSource }: ProcessingChainParams) => {\n                    if (!workitemInteraction) {\n                        return false;\n                    }\n\n                    const allWorkitems = this.get('allWorkitems');\n                    let currentWorkitemInteraction = allWorkitems.findBy('id', workitemInteraction.id);\n\n                    if (!currentWorkitemInteraction) {\n                        // avoid the lookup for a new disconnected interaction\n                        if (!ACTIVE_ASSIGNMENT_STATES.includes(workitemInteraction.workitem.assignmentState)) {\n                            return false;\n                        }\n                        // lookup is only required for a new workitem received from event, not an API\n                        if (eventSource === 'realtime') {\n                            try {\n                                const workitemDetails = await this.getWorkitem(workitemInteraction.id);\n                                workitemInteraction.workitem = { ...workitemInteraction.workitem, ...workitemDetails };\n                            } catch (error: any) {\n                                this.get('logger').warn('ACD Workitem: Failed to load workitem details.');\n                            }\n                        }\n\n                        await this.expandWorkitemInteractionDetails(workitemInteraction);\n\n                        // add interaction if new\n                        this.get('allWorkitems').insertAt(0, workitemInteraction);\n                        currentWorkitemInteraction = workitemInteraction;\n                        this.notifyPropertyChange('allWorkitems');\n                        if (this.get('caseAssociation.caseAssociationRequestFT'))\n                            this.get('caseAssociation').scheduleRosterSync();\n                    } else {\n                        // lookup the status name if changed and update the value on the workitem\n                        if (currentWorkitemInteraction.workitem.statusId !== workitemInteraction.workitem.statusId) {\n                            try {\n                                const updatedWorkitem = await this.getWorkitem(workitemInteraction.id);\n                                set(currentWorkitemInteraction, 'data.status', updatedWorkitem.status);\n                                set(currentWorkitemInteraction, 'workitem.statusId', updatedWorkitem.status.id);\n                            } catch (error: any) {\n                                this.get('logger').warn('ACD Workitem: Failed to load workitem details.');\n                            }\n                        }\n                        set(currentWorkitemInteraction, 'workitem', workitemInteraction.workitem);\n                    }\n\n                    this._notifyWorkitemInteractionChanged(currentWorkitemInteraction);\n\n                    return { workitemInteraction, currentWorkitemInteraction };\n                }\n            },\n            {\n                label: 'Acd Workitem - Notify User of Auto-Answered Conversation',\n                process: async ({ workitemInteraction }: ProcessingChainParams) => {\n                    if (!workitemInteraction) {\n                        return false;\n                    }\n\n                    const { changes }: any = workitemInteraction.workitem;\n                    const assignmentStateChange = changes?.find((change: any) => change.field === 'assignmentState');\n                    if (assignmentStateChange) {\n                        const { oldValue, newValue } = assignmentStateChange;\n\n                        // Went straight from 'AcdStarted' to 'Connected' and skipped 'Alerting' so must have be auto answered.\n                        if (oldValue === 'AcdStarted' && newValue === 'Connected') {\n                            this.trigger('autoAnswerDigital', workitemInteraction, 'workitem');\n                        }\n                    }\n                    return;\n                }\n            },\n            {\n                label: 'Acd Workitem - Update Interaction External Contact',\n                process: async ({ workitemInteraction, currentWorkitemInteraction }: ProcessingChainParams) => {\n                    if (this.get('acdExternalContactWorkitemsDivNameFT')) {\n                        if (!workitemInteraction) {\n                            return false;\n                        }\n\n                        const { changes }: any = workitemInteraction.workitem;\n                        const contactStateChange = changes?.find((change: any) => change.field === 'externalContactId');\n                        const callback = this.get(`_contactObservers.${workitemInteraction.id}`) || function () {};\n                        const externalContacts = this.get('externalContacts');\n                        const externalContactId = workitemInteraction.customer?.externalContactId;\n                        if (contactStateChange) {\n                            const { oldValue, newValue } = contactStateChange;\n\n                            if (oldValue !== newValue) {\n                                try {\n                                    set(currentWorkitemInteraction, 'customer', workitemInteraction.customer);\n                                    await externalContacts.addContactChangeListener(externalContactId, callback);\n                                } catch (error: any) {\n                                    this.logger.error(\n                                        'ACD: Failed to add external contact change listener for workitem interaction',\n                                        {\n                                            error,\n                                            remoteData: {\n                                                externalContactId: externalContactId\n                                            }\n                                        }\n                                    );\n                                    externalContacts.removeContactChangeListenersForInteraction(\n                                        externalContactId,\n                                        callback\n                                    );\n                                    this.set(`_contactObservers.${externalContactId}`, undefined);\n                                    this.get('logger').warn('ACD Workitem: Failed to load workitem details.');\n                                }\n                            }\n                        }\n                    }\n                    return;\n                }\n            },\n            {\n                label: 'Acd Workitem - Customer Intent',\n                process: async ({ workitemInteraction, currentWorkitemInteraction }: ProcessingChainParams) => {\n                    if (!workitemInteraction?.customer?.externalContactId || !currentWorkitemInteraction) return;\n\n                    const customerIntent = this.get('customerIntent');\n                    try {\n                        await customerIntent.addCustomerIntentListenerForWorkitem(\n                            workitemInteraction,\n                            currentWorkitemInteraction\n                        );\n                    } catch (error: unknown) {\n                        this.get('logger').error(\n                            'ACD: Failed to add customer intent listener for workitem interaction',\n                            { error, remoteData: { workitemId: workitemInteraction?.id } }\n                        );\n                        customerIntent.removeCustomerIntentListenerForInteraction(currentWorkitemInteraction);\n                    }\n                }\n            },\n            {\n                label: 'Notify User of Workitem Disconnected or Terminated by another user',\n                process: async ({ workitemInteraction }: ProcessingChainParams) => {\n                    if (!workitemInteraction) {\n                        return false;\n                    }\n\n                    const { assigneeId, modifiedBy, changes }: any = workitemInteraction.workitem;\n\n                    const stateFromConnectedToDisconnected =\n                        changes?.find(\n                            (change: any) =>\n                                change.field === 'assignmentState' &&\n                                change.oldValue === 'Connected' &&\n                                (change.newValue === 'Disconnected' || change.newValue === 'Terminated')\n                        ) !== undefined;\n\n                    const notModifiedByAssignee = modifiedBy !== assigneeId;\n\n                    if (stateFromConnectedToDisconnected && notModifiedByAssignee) {\n                        this.get('notification').info(\n                            null,\n                            this.get('intl').t('purecloud.acdInteraction.workitem.notification.workitemDisconnected')\n                        );\n                    }\n\n                    return;\n                }\n            },\n            {\n                label: 'Acd Workitem - Cleanup',\n                process: ({ workitemInteraction }: ProcessingChainParams) => {\n                    if (\n                        workitemInteraction &&\n                        !ACTIVE_ASSIGNMENT_STATES.includes(workitemInteraction.workitem.assignmentState)\n                    ) {\n                        this._cleanupOldWorkitem(workitemInteraction);\n                    }\n                }\n            }\n        ]);\n    },\n\n    _cleanupOldWorkitem: function (this: any, workitemInteraction: WorkitemInteraction): void {\n        const allWorkitems = this.get('allWorkitems');\n\n        allWorkitems.forEach((wi: WorkitemInteraction) => {\n            if (wi.id === workitemInteraction.id) {\n                if (this.get('caseAssociation.caseAssociationRequestFT')) {\n                    this.get('caseAssociation').invalidateCaseCacheEntry(wi.id);\n                }\n                if (this.get('acdExternalContactWorkitemsDivNameFT')) {\n                    // clean up contact observers\n                    this.get('externalContacts').removeContactChangeListenersForInteraction(\n                        wi.id,\n                        this.get(`_contactObservers.${workitemInteraction.id}`)\n                    );\n                    this.set(`_contactObservers.${wi.id}`, undefined);\n                }\n                this.get('customerIntent').removeCustomerIntentListenerForInteraction(wi);\n\n                allWorkitems.removeObject(wi);\n                this.notifyPropertyChange('allWorkitems');\n                return;\n            }\n        });\n    },\n\n    _notifyWorkitemInteractionChanged(payload: WorkitemInteraction) {\n        this.trigger(WORKITEM_INTERACTION_CHANGED_EVENT, payload);\n    },\n\n    willDestroy: function () {\n        this._super(...arguments);\n        // @ts-ignore\n        if (this.get('session.useModes')) return;\n\n        this.get('_timers').forEach((item: any) => run.cancel(item));\n        this.get('pigeon').off('workitems', this, this._processWorkitem);\n        this.get('pigeon').off('connect', this, this._onConnect);\n    },\n\n    /**\n     * Handle a workitem\n     * @param workitemInteraction\n     */\n    answer(workitemInteraction: WorkitemInteraction) {\n        return this.get('taskmanagement').acceptWorkitemInteraction(workitemInteraction);\n    },\n\n    /**\n     * Disconnect a workitem\n     * @param workitemInteraction\n     */\n    disconnect(workitemInteraction: WorkitemInteraction) {\n        return this.get('taskmanagement').endWorkitemInteraction(workitemInteraction);\n    },\n\n    /**\n     * Decline a workitem\n     * @param workitemInteraction\n     */\n    decline(workitemInteraction: WorkitemInteraction) {\n        return this.get('taskmanagement').declineWorkitemInteraction(workitemInteraction);\n    },\n\n    /**\n     * Park a workitem\n     * @param workitemInteraction\n     */\n    park(workitemInteraction: WorkitemInteraction) {\n        return this.get('taskmanagement').parkWorkitemInteraction(workitemInteraction);\n    },\n\n    /**\n     * Hold a workitem\n     * @param workitemInteraction\n     */\n    hold(workitemInteraction: WorkitemInteraction) {\n        return this.get('taskmanagement').holdWorkitemInteraction(workitemInteraction);\n    },\n\n    /**\n     * Unhold a workitem\n     * @param workitemInteraction\n     */\n    unhold(workitemInteraction: WorkitemInteraction) {\n        return this.get('taskmanagement').unholdWorkitemInteraction(workitemInteraction);\n    },\n\n    /**\n     * Transfer workitem to the user or queue\n     * @param workitemInteraction\n     * @param transferType\n     * @param transferOptions\n     */\n    transfer(\n        this: any,\n        workitemInteraction: WorkitemInteraction,\n        transferType: TransferType,\n        transferOptions: TransferOptions\n    ) {\n        return this.get('taskmanagement').assignWorkitem(workitemInteraction, transferType, transferOptions);\n    },\n\n    /**\n     * Get workitem details\n     * @param workitemId\n     */\n    getWorkitem(workitemId: string) {\n        return this.get('taskmanagement').getWorkitemById(workitemId);\n    },\n\n    /**\n     * Get workitem schema details from schema id\n     * @param schemaId\n     * @param schemaVersion\n     */\n    getSchemaDetails(schemaId: string, schemaVersion: number) {\n        return this.get('taskmanagement').getSchemaById(schemaId, schemaVersion);\n    },\n\n    /**\n     * Trigger workitem assigment state change event\n     * @param payload\n     */\n    handleWorkitemStateChangeEvent(payload: any) {\n        const { oldState, newState, workitemId } = payload;\n\n        // used in acd-interactions-panel component to set selected workitem when returning from parked state\n        if (oldState === 'Parked' && newState === 'Connected') {\n            this.trigger(WORKITEM_ASSIGNMENT_STATE_CHANGED_EVENT, workitemId);\n        }\n    },\n\n    /**\n     * Trigger workitem answered event for the selection in the acd interactions panel\n     * @param workitemInteraction\n     */\n    handleWorkitemAnsweredEvent(workitemInteraction: WorkitemInteraction) {\n        this.trigger(WORKITEM_ASSIGNMENT_STATE_CHANGED_EVENT, workitemInteraction.id);\n    },\n\n    /**\n     * Expand workitem interaction status, workbin, worktype if available\n     * Expand schema only if custom attributes are present\n     * @param workitemInteraction\n     */\n    async expandWorkitemInteractionDetails(this: any, workitemInteraction: WorkitemInteraction | any) {\n        workitemInteraction.data = {\n            status: !!workitemInteraction.workitem.status\n                ? { ...workitemInteraction.workitem.status }\n                : { id: workitemInteraction.workitem.statusId },\n            workbin: !!workitemInteraction.workitem.workbin\n                ? { ...workitemInteraction.workitem.workbin }\n                : { id: workitemInteraction.workitem.workbinId },\n            worktype: !!workitemInteraction.workitem.type\n                ? { ...workitemInteraction.workitem.type }\n                : { id: workitemInteraction.workitem.typeId },\n            schema: !!workitemInteraction.workitem.schema\n                ? { ...workitemInteraction.workitem.schema }\n                : { id: workitemInteraction.workitem.schemaId, version: workitemInteraction.workitem.schemaVersion }\n        };\n\n        // get custom fields schema details\n        const { id: schemaId, version: schemaVersion } = workitemInteraction.workitem.schema;\n\n        if (schemaId && schemaVersion) {\n            try {\n                workitemInteraction.data.schema = await this.getSchemaDetails(schemaId, schemaVersion);\n            } catch (error: any) {\n                this.get('logger').warn('ACD Workitem: Failed to load workitem schema details.');\n            }\n        }\n    }\n});\n\nexport interface AcdWorkitemService extends Service {}\n","/* global intlTelInputUtils */\n\nimport { resolve } from 'rsvp';\n\nimport { computed, get } from '@ember/object';\nimport Service, { inject as service } from '@ember/service';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport QueueModel from '../models/queue';\nimport PersonModel from '../models/person';\nimport ExternalContactModel from '../models/external-contact';\n\nimport { formatAddressForDisplay, formatSipAddressForDisplay } from 'web-directory/utils/address-format';\n\nconst wordCharsRegex = /[^\\w]/g; // Matches anything that is a word character (i.e[a-zA-Z0-9_])\nconst nonDigitRegex = /\\D/g; // Matches anything that isn't a digit\nconst removeLeadingPlusRegex = /^[+]+/g; // Used to remove the pluses at the beginning of the number\n\nexport default Service.extend({\n    intl: service(),\n    session: service(),\n    store: service(),\n    countryCode: computed('intl.isoLocale', function () {\n        if (this.get('intl.isoLocale')) {\n            return this.get('intl.isoLocale').toUpperCase().split('-').pop();\n        } else {\n            return null;\n        }\n    }),\n\n    /**\n     * This method is meant to take in a varying number of types and return the appropriate\n     * string to make a call. It is used primarily for phone:makeCall\n     *\n     * @param  {string|object|model} itemToFormat the item we are trying to format\n     * @return {string}              the formatted version of itemToFormat\n     */\n    format(itemToFormat) {\n        if (itemToFormat instanceof PersonModel) {\n            return itemToFormat.get('guid');\n        }\n        if (itemToFormat instanceof QueueModel) {\n            return itemToFormat.get('id');\n        }\n        if (itemToFormat instanceof ExternalContactModel) {\n            return itemToFormat.get('phone.rel.e164');\n        }\n        if (itemToFormat && typeof itemToFormat === 'object') {\n            return this.formatFieldConfigEntry(itemToFormat);\n        }\n        if (typeof itemToFormat === 'string') {\n            return this.formatAddress(itemToFormat);\n        }\n        return itemToFormat;\n    },\n\n    /**\n     * Format numbers to E164. If number has sip: prefix, format sipAddress\n     * @param  {string} phoneNumber the number to formatAddress\n     * @param  {string} country     the countryCode\n     * @param  {string} subMsgType  the message subtype (SMS, WhatsApp, etc.)\n     * @return {string}             the formatted number\n     */\n    formatAddress(phoneNumber, country, subMsgType) {\n        if (_.startsWith(phoneNumber, 'sip:')) {\n            return this.formatSipAddress(phoneNumber);\n        }\n        if (_.startsWith(phoneNumber, 'tel:')) {\n            phoneNumber = phoneNumber.split(':').pop();\n        }\n        if (subMsgType === 'open') {\n            return phoneNumber;\n        }\n\n        if (subMsgType === 'whatsapp') {\n            phoneNumber = phoneNumber.replace(wordCharsRegex, '');\n        } else {\n            const defaultCountryCode = this.get('session.org.orgDefaultCountryCode') || null; // Default country setting in admin\n            const countryCode = country || defaultCountryCode || this.countryCode; // make a guess on the country code\n            // Try the number as-is first, then try with '+' prefix for numbers that include\n            // the country code without it (e.g., '35316791122' for Ireland).\n            // Ember 3 migration: intlTelInputUtils in the updated libphonenumber no longer implicitly\n            // recognizes country-code-prefixed numbers without '+'; previously worked in Ember 2.18.\n            const numberToFormat = intlTelInputUtils.isValidNumber(phoneNumber, countryCode)\n                ? phoneNumber\n                : intlTelInputUtils.isValidNumber(`+${phoneNumber}`, countryCode)\n                ? `+${phoneNumber}`\n                : null;\n            if (numberToFormat) {\n                const extension = intlTelInputUtils.getExtension(numberToFormat, countryCode);\n                const e164 = intlTelInputUtils.formatNumber(\n                    numberToFormat,\n                    countryCode,\n                    intlTelInputUtils.numberFormat.E164\n                );\n                if (intlTelInputUtils.isValidNumber(e164, countryCode)) {\n                    // check again b/c libphonenumber could 'E164' a number into an invalid (e.g., '5555555' => '+15555555')\n                    if (extension) {\n                        // add extension back b/c libphonenumber strips it out after E164ing the number\n                        return `${e164};ext=${extension}`;\n                    }\n                    return e164;\n                }\n            }\n        }\n\n        return phoneNumber;\n    },\n\n    /**\n     * Format sip numbers to remove extraneous parameters\n     * @param  {string} address the number to formatSipAddress\n     * @return {string}             the formatted address\n     */\n    formatSipAddress(address) {\n        const regex = /(sip:)([^;]*)?(?:[^@]*)(@.*)/;\n        const addressParts = address.match(regex);\n        if (!addressParts || addressParts.length < 3) {\n            return address;\n        }\n        if (\n            intlTelInputUtils.isValidNumber(addressParts[2]) ||\n            intlTelInputUtils.isValidNumber(addressParts[2], this.countryCode)\n        ) {\n            return this.formatAddress(addressParts[2]);\n        }\n        return addressParts.slice(1).join('');\n    },\n\n    formatOrLookupAddressForDisplay(address, country) {\n        return resolve(this.formatAddressForDisplay(address, country, undefined, { doLookup: true }));\n    },\n\n    lookupAddressFormatResultId(result = {}) {\n        const fallback = result.displayText || '';\n\n        try {\n            if (result.jid) {\n                const existingRecord = this.store.peekAll('person').findBy('jid', result.jid);\n\n                if (existingRecord) {\n                    // Ember Data 3.28: DS.PromiseObject requires .create() instead of `new` to properly initialize PromiseProxyMixin\n                    return DS.PromiseObject.create({ promise: resolve(existingRecord.get('name')) });\n                }\n\n                const promise = this.store\n                    .findMany('person', [result.jid])\n                    .then(records => {\n                        if (records && records.length === 1) {\n                            return records[0].get('name');\n                        }\n                        return fallback;\n                    })\n                    .catch(() => fallback); // don't log this, it just means the lookup failed, return fallback\n\n                return DS.PromiseObject.create({ promise }); // has to be re-wrapped since we then/catch the original store promise\n            }\n\n            if (result.queueId) {\n                const promise = this.store\n                    .findRecord('queue', result.queueId)\n                    .then(queue => queue.get('name'))\n                    .catch(() => fallback);\n                return DS.PromiseObject.create({ promise });\n            }\n        } catch (e) {\n            // no op;\n        }\n\n        return DS.PromiseObject.create({ promise: resolve(fallback) });\n    },\n\n    resolveAddressFormatResult(result = {}, opts = {}) {\n        const fallback = result.displayText || '';\n\n        if (opts.doLookup) {\n            if (result.isEntity) {\n                return this.lookupAddressFormatResultId(result);\n            }\n\n            return DS.PromiseObject.create({ promise: resolve(fallback) });\n        }\n\n        return fallback;\n    },\n\n    /**\n     * Format International Numbers (e.g., +1 (919) 555-5555)\n     * If phoneNumber has 'sip:' prefix, call formatSipAddressForDisplay\n     * @param  {string} address     the number to formatAddress\n     * @param  {string} country     the countryCode\n     * @param  {string} subMsgType  the message subtype (SMS, WhatsApp, etc.)\n     * @param  {object} opts        options with `doLookup` bool for performing async lookup of username or queue name for sip addresses\n     * @return {string}             the formatted number (always string by default)\n     * @return {Promise}            a Promise which will resolve to the username of the associated sip address, if applicable (will return promise only if { doLookup: true } is provided)\n     */\n    formatAddressForDisplay(address, country, subMsgType, opts = {}) {\n        if (subMsgType === 'whatsapp') {\n            return address.replace(removeLeadingPlusRegex, '');\n        }\n        if (subMsgType === 'open') {\n            return address;\n        }\n        return this.resolveAddressFormatResult(formatAddressForDisplay(address, country), opts);\n    },\n\n    /**\n     * This is a mild improvement over our naiive formatting of just stripping 'sip:'\n     * it does a regex to try to find a jid, in the case that the address might identify a purecloud user\n     * otherwise, otherwise, see if the address part is a phone number, and try to format it as such. Otherwise, fallback\n     * to the original sip address, without the prefix\n     */\n    formatSipAddressForDisplay(address, opts) {\n        return this.resolveAddressFormatResult(formatSipAddressForDisplay(address), opts);\n    },\n\n    /**\n     * Checks to see if a number is valid. Passing in strict will not allow things to pass through.\n     * (strict option may seem weird but the intent is to allow individual authors to make the decision on\n     *  whether this method is blocking or should just pass the number through -- to the api for example)\n     * @param  {string}  phoneNumber the phone number to Checks\n     * @param  {string}  country     the country countryCode\n     * @param  {Boolean} strict      should return false if doesn't pass isValidNumber\n     * @param  {string}  subMsgType  the message subtype (SMS, WhatsApp, etc.)\n     * @return {Boolean}\n     */\n    isValidNumber(phoneNumber, country, strict, subMsgType) {\n        try {\n            if (subMsgType === 'whatsapp') {\n                phoneNumber = phoneNumber.replace(removeLeadingPlusRegex, '');\n                return !phoneNumber.match(nonDigitRegex);\n            }\n            const defaultCountryCode = this.get('session.org.orgDefaultCountryCode') || null; // Default country setting in admin\n            const countryCode = country || defaultCountryCode || this.countryCode; // make a guess on the country code\n            const isValid = intlTelInputUtils.isValidNumber(phoneNumber, countryCode);\n            return strict ? isValid : true;\n        } catch (e) {\n            return !strict;\n        }\n    },\n\n    /**\n     * Remove 'tel:' or 'sip:' from a string\n     * @param  {string} phoneNumber the number to format\n     * @return {string}             the number sans (tel:|sip:)\n     */\n    formatRawNumber(phoneNumber) {\n        if (_.includes(phoneNumber, 'tel')) {\n            return phoneNumber.replace(/tel:/gi, '');\n        } else if (_.includes(phoneNumber, 'sip')) {\n            return phoneNumber.replace(/sip:/gi, '');\n        } else {\n            return phoneNumber;\n        }\n    },\n\n    /**\n     * Format a field config entry value\n     * @param  {object} itemToFormat the thing to format\n     * @return {string}              the formatted string\n     */\n    formatFieldConfigEntry(itemToFormat) {\n        const e164 = get(itemToFormat, 'rel.e164');\n        if (e164) {\n            return e164;\n        }\n        let number = get(itemToFormat, 'value.number');\n        number = number != null ? number.replace(/\\D/g, '') : void 0;\n        let extension = get(itemToFormat, 'value.extension');\n        extension = extension != null ? extension.replace(/\\D/g, '') : void 0;\n        if (number) {\n            // number = this.formatAddress(number);\n            if (extension) {\n                itemToFormat = number + ';ext=' + extension;\n            } else {\n                itemToFormat = '' + number;\n            }\n        } else if (extension) {\n            itemToFormat = extension;\n        }\n        return itemToFormat;\n    }\n});\n","import { computed } from '@ember/object';\nimport Service, { inject as service } from '@ember/service';\n\nexport default Service.extend({\n    adminui: service(),\n    engage: service(),\n\n    userHasAdminAccess: computed('adminui.adminEntries', 'engage.navTree', function () {\n        // check for access to any items in admin menu\n        let adminAuthorizedEntries = this.get('adminui.adminEntries').filter(function (adminEntry) {\n            if (adminEntry.href === 'welcomeV2') {\n                // ignore always-present entry for admin dashboard itself\n                return false;\n            } else if (adminEntry.href) {\n                // any other link should give access\n                return true;\n            } else if (adminEntry.subLinks && adminEntry.subLinks.length) {\n                // or any section with subLinks\n                return true;\n            } else {\n                return false;\n            }\n        });\n        if (adminAuthorizedEntries.length) {\n            return true;\n        }\n\n        // check for access to any items in engage navTree that show up on admin dashboard\n        if (this.get('engage.navTree')) {\n            return this.get('engage.navTree').any(function (navTreeItem) {\n                if (navTreeItem.subLinks && navTreeItem.subLinks.length) {\n                    return true;\n                }\n                if (navTreeItem.textKey === 'admin.nav.architect') {\n                    return true;\n                }\n                if (navTreeItem.fromPlaceholder === 'forecasting-component') {\n                    return true;\n                }\n            });\n        }\n\n        // default to false\n        return false;\n    })\n});\n","import { isArray } from '@ember/array';\nimport { copy } from '@ember/object/internals';\nimport { computed } from '@ember/object';\nimport Service, { inject as service } from '@ember/service';\nimport _ from 'lodash';\n\nexport default Service.extend({\n    adminui: service(),\n    engage: service(),\n    intl: service(),\n    session: service(),\n    search: service(),\n\n    // list of object properties that identify engage navTree nodes which\n    // should be displayed despite having no subLinks\n    engageSingleLinkSections: [{ textKey: 'admin.nav.architect' }, { fromPlaceholder: 'forecasting-component' }],\n\n    // Combined admin and engage navs from normalized + flattened source data\n    // (any engage multi-level structure is flattened, and admin entries are left in their already-flat default state)\n    fullNav: computed('normalizedAdminNav', 'normalizedEngageNav', function () {\n        let normalizedAdminNav = copy(this.normalizedAdminNav, true) || [];\n        let normalizedEngageNav = copy(this.normalizedEngageNav, true) || [];\n        return this.combineAdminAndEngageNavs(normalizedAdminNav, normalizedEngageNav);\n    }),\n\n    // Combined admin and engage navs from normalized + \"unflattened\" source data\n    // (any engage multi-level structure is left intact, and admin entries are unflattened if they have tree metadata)\n    fullNavTree: computed('adminui.adminEntries', 'engage.navTree', function () {\n        let normalizedAdminNav = this.normalizeAdminNav(this.get('adminui.adminEntries'), false);\n        let normalizedEngageNav = this.normalizeEngageNav(this.get('engage.navTree'), false);\n        return this.combineAdminAndEngageNavs(normalizedAdminNav, normalizedEngageNav);\n    }),\n\n    // Combine the given normalized admin and engage nav structures, and return the resulting unified nav structure\n    combineAdminAndEngageNavs(adminNav, engageNav) {\n        const normalizedAdminNav = copy(adminNav, true);\n        const normalizedEngageNav = copy(engageNav, true);\n\n        // combine nodes from engage navTree into nodes from admin menu\n        normalizedAdminNav.map(function (adminNode) {\n            let includeLinksFrom = adminNode.includeLinksFrom;\n            if (isArray(includeLinksFrom)) {\n                includeLinksFrom.forEach(function (desiredNode) {\n                    let engageNode = _.find(normalizedEngageNav, desiredNode);\n                    if (engageNode) {\n                        // overrwrite engage links with admin links if replacements exist\n                        engageNode.subLinks.forEach((engageLink, engageIndex) => {\n                            adminNode.subLinks.forEach((adminLink, adminIndex) => {\n                                if (adminLink.text === engageLink.text) {\n                                    engageNode.subLinks[engageIndex] = adminLink;\n                                    adminNode.subLinks.splice(adminIndex, 1);\n                                }\n                            });\n                        });\n                        adminNode.subLinks = adminNode.subLinks.concat(engageNode.subLinks);\n\n                        _.remove(normalizedEngageNav, function (engageNode) {\n                            return _.isMatch(engageNode, desiredNode);\n                        });\n                    }\n                });\n            }\n        });\n\n        const combinedNav = normalizedAdminNav.concat(normalizedEngageNav);\n\n        // omit empty nodes\n        return combinedNav.filter(navItem => !_.isEmpty(navItem.subLinks));\n    },\n\n    normalizedAdminNav: computed('adminui.adminEntries', function () {\n        return this.normalizeAdminNav(this.get('adminui.adminEntries'), true);\n    }),\n\n    normalizeAdminNav(adminNav, flat = true) {\n        if (_.isEmpty(adminNav)) {\n            return [];\n        }\n        let adminEntries = copy(adminNav, true);\n        if (adminEntries && adminEntries.length) {\n            // remove overview node from nav (not needed on dashboard & will never show in left nav)\n            adminEntries = adminEntries.filter(function (adminEntry) {\n                if (adminEntry.className === 'menu-overview') {\n                    return false;\n                } else {\n                    return true;\n                }\n            });\n\n            // loop through entries to make other changes\n            adminEntries = adminEntries.map(entry => this.normalizeAdminEntry(entry, flat));\n        }\n        return adminEntries;\n    },\n\n    normalizeAdminEntry(adminNavEntry, flat = true) {\n        const adminEntry = _.clone(adminNavEntry);\n        if (Array.isArray(adminEntry.subLinks)) {\n            adminEntry.subLinks = adminEntry.subLinks.filter(function (subLink) {\n                // filter out contacts link unless legacy contacts is toggled for the org\n                return subLink.className !== 'menu-contacts';\n            });\n\n            let links = adminEntry.subLinks;\n            if (!flat && Array.isArray(adminEntry.tree) && adminEntry.tree.length) {\n                links = adminEntry.tree;\n            }\n            adminEntry.subLinks = links.reduce((accumulator, subLink) => {\n                return accumulator.concat(this.normalizeAdminSubLink(subLink, flat));\n            }, []);\n        }\n        return adminEntry;\n    },\n\n    normalizeAdminSubLink(adminNavSubLink, flat) {\n        let subLink = _.clone(adminNavSubLink);\n\n        if (Array.isArray(subLink.subLinks)) {\n            if (flat) {\n                return subLink.subLinks.flatMap(subSubLink => this.normalizeAdminSubLink(subSubLink, true));\n            } else {\n                subLink.subLinks = subLink.subLinks.map(subLink => this.normalizeAdminSubLink(subLink, false));\n            }\n        }\n\n        // skip any links that are marked as \"direct\" since they are assumed to either be\n        // outside of the #/admin hierarchy or are already prefixed as needed\n        if (!subLink.direct) {\n            // prefix urls for admin ember engine dashboard\n            if (subLink.href) {\n                // 'external' sublinks do not need to be prefixed, but do need the dashboardHref property set\n                // Note: 'Architect' is the only admin subLink that has the external property turned on\n                subLink.dashboardHref = subLink.external ? subLink.href : '#/admin/' + subLink.href;\n            }\n        }\n\n        return subLink;\n    },\n\n    normalizedEngageNav: computed('engage.navTree', function () {\n        return this.normalizeEngageNav(this.get('engage.navTree'), true);\n    }),\n\n    normalizeEngageNav(engageNav, flat) {\n        if (_.isEmpty(engageNav)) {\n            return [];\n        }\n        let navTree = copy(engageNav, true);\n        let engageSingleLinkSections = this.engageSingleLinkSections;\n        let intl = this.intl;\n        if (navTree && navTree.length) {\n            // recursive function to flatten nested subLinks\n            // for pure-cloud-browser-app feature components with multi-level hierarchies\n            let flattenSubLinks = function (subLinks) {\n                return subLinks.reduce(function (subLinks, subLink) {\n                    if (subLink.subLinks) {\n                        return subLinks.concat(flattenSubLinks(subLink.subLinks));\n                    } else {\n                        return subLinks.concat(subLink);\n                    }\n                }, []);\n            };\n\n            navTree.map(function (navTreeItem) {\n                // reformat applicable single-link nodes so they'll be included in nav\n                if (!navTreeItem.subLinks) {\n                    engageSingleLinkSections.forEach(function (singleLinkSection) {\n                        if (_.isMatch(navTreeItem, singleLinkSection)) {\n                            navTreeItem.subLinks = [\n                                {\n                                    text: navTreeItem.text,\n                                    textKey: navTreeItem.textKey,\n                                    href: navTreeItem.href\n                                }\n                            ];\n                        }\n                    });\n                }\n\n                // loop through entries to make other changes\n                if (navTreeItem.subLinks && navTreeItem.subLinks.length) {\n                    // flatten subLinks\n                    if (flat) {\n                        navTreeItem.subLinks = flattenSubLinks(navTreeItem.subLinks);\n                    }\n\n                    // loop through subLinks to make changes\n                    navTreeItem.subLinks.map(function (subLink) {\n                        // prefix urls for admin ember engine dashboard\n                        if (subLink.href) {\n                            subLink.dashboardHref = subLink.href.replace(/^#/, '#/engage/');\n                        }\n\n                        // override names of select links\n                        let overrideNameKey =\n                            'admin.dashboard_link.' + subLink.textKey.replace(/\\./g, '_').toLowerCase();\n                        if (intl.exists(overrideNameKey)) {\n                            subLink.text = intl.t(overrideNameKey);\n                        }\n                    });\n                }\n            });\n        }\n        return navTree;\n    }\n});\n","import { observer } from '@ember/object';\nimport Evented, { on } from '@ember/object/evented';\nimport Service, { inject as service } from '@ember/service';\nimport _ from 'lodash';\n\nconst defaultLocale = 'en';\n\nfunction isValidPolicy(policy, permission) {\n    const policies = policy.split(':');\n    const permissions = permission.split(':');\n    return policies.reduce((isValid, policy, index) => {\n        if (!isValid) {\n            return false;\n        }\n        const permission = permissions[index];\n        if (!permission) {\n            return true;\n        }\n        return permission.split(',').includes(policy);\n    }, true);\n}\n\nfunction isAuthorized(rules, permissions, roles, userType) {\n    if (!rules || !rules.length || userType === 'super') {\n        return true;\n    }\n    return rules.reduce((isAuthed, rule) => {\n        if (isAuthed) {\n            return true;\n        }\n        const [key, val] = rule.split('=');\n        switch (key) {\n            case 'permission':\n                return permissions.indexOf(val) >= 0;\n            case 'policy':\n                return permissions.reduce((isValid, permission) => {\n                    return isValid || (permission.match(':') && isValidPolicy(val, permission));\n                }, false);\n            case 'user':\n                return userType === val;\n            case 'role':\n                return roles.indexOf(val) >= 0;\n            default:\n                return isAuthed;\n        }\n    }, false);\n}\n\nexport default Service.extend(Evented, {\n    feature: service(),\n    permissions: service(),\n    session: service(),\n    intl: service(),\n    ajax: service(),\n    notification: service(),\n    search: service(),\n\n    currentRouteName: '',\n    loadingPromise: null,\n    menuJSON: null,\n    adminPath: null, // observed by the embedded-admin component to update its iframe src\n\n    currentPageCrumbs: null,\n\n    toast(data) {\n        let notificationType = 'info';\n        if (data.type === 'success' || data.type === 'error') {\n            notificationType = data.type;\n        }\n\n        this.notification[notificationType](\n            data.title,\n            data.message,\n            Object.assign(\n                {},\n                {\n                    markdownToHtml: false,\n                    shouldShowPopup: true,\n                    shouldPlaySound: false,\n                    // Track that this came from embedded admin frame\n                    embeddedAdminFrame: true\n                },\n                data\n            )\n        );\n    },\n\n    getMenuBreadcrumbs(location) {\n        const menuJSON = this.menuJSON;\n        if (!menuJSON) {\n            return;\n        }\n\n        const { menu, translations } = this.menuJSON;\n        const menuItemsPath = this.getMenuPathToLocation(`#/${location}`, menu, []);\n        const breadcrumbPath = menuItemsPath.map(item => {\n            item.value = this.getTranslatedText(item.key, translations);\n            if (_.get(item, 'hash')) {\n                item.hash = item.hash.replace(/#\\//, '#/admin/');\n            }\n            return item;\n        });\n\n        return {\n            crumbs: breadcrumbPath,\n            home: false\n        };\n    },\n\n    getMenuPathToLocation(location, subMenu, currentPath) {\n        const menuKeys = Object.keys(subMenu);\n        for (var i = 0; i < menuKeys.length; i++) {\n            const menuKey = menuKeys[i];\n            const menuItem = subMenu[menuKey];\n            const menuItemPath = _.get(menuItem, 'path');\n\n            if (menuItemPath && new RegExp(menuItemPath, 'i').test(location)) {\n                currentPath.push({ key: menuKey, hash: menuItemPath });\n                // currentPath.push({ key: menuKey, hash: null }); // matched location should be text not a link\n                return currentPath;\n            }\n\n            const children = _.get(menuItem, 'children');\n            if (children) {\n                currentPath.push({ key: menuKey, hash: menuItemPath || null });\n                const pathLength = currentPath.length;\n                const result = this.getMenuPathToLocation(location, children, currentPath);\n                if (result.length > pathLength) {\n                    return currentPath; // location found in submenu!\n                } else {\n                    currentPath.pop(); //location not found in submenu\n                }\n            }\n        }\n\n        return currentPath;\n    },\n\n    getTranslatedText(key, translations) {\n        const locale = this.getLocale();\n\n        const localeVal = translations[locale] && translations[locale][key];\n        if (localeVal) {\n            return localeVal;\n        }\n        const defaultVal = translations[defaultLocale] && translations[defaultLocale][key];\n        if (defaultVal) {\n            return defaultVal;\n        }\n        return key;\n    },\n\n    getLocale() {\n        const { translations } = this.menuJSON;\n        let locale = this.get('intl.isoLocale')\n            .replace(/([a-z]{2}).([a-z]{2})/i, '$1-$2')\n            .toLowerCase();\n        if (!translations[locale]) {\n            locale = defaultLocale;\n        }\n\n        return locale;\n    },\n\n    adminEntries: [],\n\n    loadAdminEntries: on(\n        'init',\n        observer('permissions.permissions', 'permissions.donutPermissions', 'session.user.userType', function () {\n            const permissions = this.get('permissions.permissions') || [];\n            const donutPermissions = this.get('permissions.donutPermissions') || [];\n            const userType = this.get('session.user.userType');\n\n            if (userType !== 'super' && !permissions.length && !donutPermissions.length) {\n                return;\n            }\n\n            let featureService = this.feature;\n\n            donutPermissions.forEach(policy => {\n                const segment = policy.split(':')[2];\n                const actions = segment && segment.split(',');\n                const domainAndEntity = policy.substr(0, policy.lastIndexOf(':'));\n                _.forEach(actions, action => {\n                    permissions.push(`${domainAndEntity}:${action}`);\n                });\n            });\n\n            const roles = this.get('session.roleNames');\n            const menuUrl = '/admin/menu.json';\n\n            const promise = this.ajax.request(menuUrl).then(response => {\n                const { menu, translations } = response;\n                this.set('menuJSON', { menu, translations }); // for use by breadcrumbs\n\n                // collect all features to check against\n                let requiredFeatures = [];\n                _.forOwn(menu, menuItem => {\n                    if (menuItem && menuItem.attributes && menuItem.attributes.feature) {\n                        requiredFeatures = requiredFeatures.concat(\n                            menuItem.attributes.feature.split(' ').map(f => f.replace(/^!/, ''))\n                        );\n                    }\n                    _.forOwn(menuItem.children, menuSubItem => {\n                        if (menuSubItem && menuSubItem.attributes && menuSubItem.attributes.feature) {\n                            requiredFeatures = requiredFeatures.concat(\n                                menuSubItem.attributes.feature.split(' ').map(f => f.replace(/^!/, ''))\n                            );\n                        }\n                    });\n                });\n\n                // get feature toggles from feature service\n                return featureService.getFeatureToggles(...requiredFeatures).then(features => {\n                    // Checks whether the feature associated with this menu item is turned on\n                    function isAvailable(attributes) {\n                        // If we have an associated feature...\n                        if (attributes && attributes.feature) {\n                            // featureString may contain more than one feature to check in the form of `feature1 feature2`\n                            // so we split this string by spaces and show the menu item iff all contained features are\n                            // turned on\n                            let featureString = attributes.feature;\n                            return _.every(\n                                featureString.split(' ').map(feature => {\n                                    if (feature.match(/^!/)) {\n                                        return !features[feature.replace(/^!/, '')];\n                                    } else {\n                                        return features[feature];\n                                    }\n                                })\n                            );\n\n                            // If there's no feature associated, just turn it on\n                        } else {\n                            return true;\n                        }\n                    }\n\n                    // check whether the logged in user should be able to see the menu item\n                    function isAccessible(menuItem) {\n                        const { attributes, authorize } = menuItem;\n                        const allowed = isAuthorized(authorize, permissions, roles, userType);\n                        const availible = isAvailable(attributes);\n                        return allowed && availible;\n                    }\n\n                    const entries = [];\n                    _.forOwn(menu, (menuItem, headingKey) => {\n                        if (!isAccessible(menuItem)) {\n                            return;\n                        }\n                        const subEntries = [];\n                        _.forOwn(menuItem.children, (menuSubItem, subheadingKey) => {\n                            if (subheadingKey === 'CONTACTS') {\n                                return;\n                            }\n                            if (!isAccessible(menuSubItem)) {\n                                return;\n                            }\n                            subEntries.push({\n                                id: subheadingKey,\n                                className: `menu-${subheadingKey.toLowerCase()}`,\n                                text: this.getTranslatedText(subheadingKey, translations),\n                                href: menuSubItem.direct ? menuSubItem.path : menuSubItem.path.replace(/^#\\//, ''),\n                                basePath: menuSubItem.basePath,\n                                routePrefix: menuSubItem.routePrefix,\n                                subRoute: menuSubItem.route,\n                                route: menuSubItem.emberRoute,\n                                attributes: menuSubItem.attributes,\n                                external: menuSubItem.external,\n                                direct: menuSubItem.direct\n                            });\n                        });\n                        const processTreeNode = treeNode => {\n                            if (treeNode.section && Array.isArray(treeNode.children)) {\n                                return {\n                                    id: treeNode.section,\n                                    text: this.getTranslatedText(treeNode.section, translations),\n                                    className: `menu-${headingKey.toLowerCase()}-subgroup-${treeNode.section.toLowerCase()}`,\n                                    subLinks: treeNode.children.map(processTreeNode).filter(node => node)\n                                };\n                            } else if (treeNode.link) {\n                                return subEntries.find(subEntry => subEntry.id === treeNode.link);\n                            }\n                            return undefined;\n                        };\n                        const tree = (Array.isArray(menuItem.tree) ? menuItem.tree : [])\n                            .map(processTreeNode)\n                            .filter(node => node);\n                        if (subEntries.length || menuItem.includeLinksFrom) {\n                            entries.push({\n                                id: headingKey,\n                                className: `menu-${headingKey.toLowerCase()}`,\n                                text: this.getTranslatedText(headingKey, translations),\n                                href: subEntries.length ? subEntries[0].href : null,\n                                subLinks: subEntries,\n                                tree: tree,\n                                includeLinksFrom: menuItem.includeLinksFrom,\n                                attributes: menuItem.attributes\n                            });\n                        }\n                    });\n\n                    if (!this.isDestroyed) {\n                        this.set('adminEntries', entries);\n                    }\n                });\n            });\n\n            this.set('loadingPromise', promise);\n        })\n    )\n});\n","import MessageInteraction from '../models/interaction/message-interaction';\nimport TtlCache from '../utils/ttl-cache';\nimport Service from '@ember/service';\nimport { getOwner } from '@ember/application';\nimport RSVP from 'rsvp';\nimport { IAssistantQueue, IAssistant } from 'web-directory/types/agent-assist.type';\n\n/**\n * Checks whether Agent Assist / Copilot is available for a given interaction.\n *\n * NOTE: this is a native class, so services are resolved with an explicit container lookup in\n * init() rather than the classic field-injection form (`ajax = inject('ajax')`). Under Ember 3.28\n * a decorator assigned to a native class field is stored verbatim, so `this.get('ajax')` returned\n * the injection descriptor instead of the service (\"this.get(...).pcV2Uri is not a function\").\n * The same applies to `computed()` assigned to a class field — it evaluated to a truthy descriptor\n * object, which silently forced every feature check on. Derived values below are plain getters.\n * See .kiro/steering/ember-3-migration.md.\n */\nexport default class AgentAssistChecks extends Service {\n    declare ajax: any;\n    declare application: any;\n    declare session: any;\n    declare permissions: any;\n\n    cache = new TtlCache({ defaultTtl: 300000 });\n    assistantState = new Map<string, boolean>();\n\n    init() {\n        super.init();\n        const owner = getOwner(this);\n        this.ajax = owner.lookup('service:ajax');\n        this.application = owner.lookup('service:application');\n        this.session = owner.lookup('service:session');\n        this.permissions = owner.lookup('service:permissions');\n    }\n\n    get features(): Record<string, boolean> {\n        return this.session?.features || {};\n    }\n\n    get hasCopilotPermission(): boolean {\n        return !!this.permissions?.canViewCopilot;\n    }\n\n    get isCopilotSocialEnabled(): boolean {\n        return !!(this.features['AI-1296_copilot_social'] && this.hasCopilotPermission);\n    }\n\n    get isCopilotOptionalKnowledgeConfigEnabled(): boolean {\n        return !!this.features['AI-1433_optional_knowledge'];\n    }\n\n    // Check for Media Type type ->  if email or some messaging types, return true\n    _isSupportedMediaType(interaction: any): boolean {\n        const subMessageTypes = ['webmessaging', 'sms', 'whatsapp', 'facebook', 'open'];\n        if (this.get('isCopilotSocialEnabled')) {\n            subMessageTypes.push('instagram', 'twitter');\n        }\n        const isSupportedMessagingType =\n            interaction instanceof MessageInteraction &&\n            subMessageTypes.some(type => type === interaction.get('subMessageType'));\n\n        const interactionType = interaction.get('type');\n        return (\n            interactionType === 'email' ||\n            isSupportedMessagingType ||\n            interactionType === 'call' ||\n            interactionType === 'callback'\n        );\n    }\n    // Check if Smart Advisor is enabled for this queue\n    async _checkIfSmartAdvisorIsEnabled(interaction: any): Promise<boolean> {\n        const queueId = interaction.get('participantForCurrentUser.queueId');\n        if (queueId) {\n            return await this._checkIfQueueHasAssistant(queueId, interaction);\n        } else {\n            return false;\n        }\n    }\n    // Call queues API to check if this queue has an assistant assigned to it\n    _checkIfQueueHasAssistant(queueId: string, interaction: any): RSVP.Promise<boolean> {\n        const url = this.get('application').pcV2Uri(`api/v2/routing/queues/${queueId}/assistant`);\n        // Result is cached for this queueId\n        if (this.cache.has(queueId)) {\n            this.setAssistantState(interaction.get('id'), <boolean>this.cache.get(queueId));\n            return RSVP.resolve(<boolean>this.cache.get(queueId));\n        }\n        // Result has not been cached for this queueId\n        else {\n            return this.get('ajax')\n                .request(url)\n                .then((result: IAssistantQueue) => {\n                    if (interaction.get('type') === 'call' || interaction.get('type') === 'callback') {\n                        const assistantUrl = this.get('application').pcV2Uri(\n                            `api/v2/assistants/${result.assistant.id}`\n                        );\n                        return this.get('ajax')\n                            .request(assistantUrl)\n                            .then((assistant: IAssistant) => {\n                                const vendorName = assistant.knowledgeSuggestionConfig?.vendorName;\n                                if (\n                                    (!vendorName && this.get('isCopilotOptionalKnowledgeConfigEnabled')) ||\n                                    (vendorName && ['GenesysKnowledge', 'GenesysKnowledgeV3'].includes(vendorName))\n                                ) {\n                                    // Check assistant state field and enabled channels\n                                    return this._checkAssistant(result, queueId, interaction);\n                                } else {\n                                    // Add to cache, queue with assistant but not a native assistant\n                                    this.cache.put(queueId, false);\n                                    return RSVP.resolve(false);\n                                }\n                            })\n                            .catch(() => {\n                                // Add to cache, queueId but no valid assistant\n                                this.cache.put(queueId, false);\n                                return RSVP.resolve(false);\n                            });\n                    } else {\n                        // Check assistant state field and enabled channels\n                        return this._checkAssistant(result, queueId, interaction);\n                    }\n                })\n                .catch(() => {\n                    // Add to cache, queueId but no valid assistant\n                    this.cache.put(queueId, false);\n                    return RSVP.resolve(false);\n                });\n        }\n    }\n    // Make the checks to see if the assistant is enabled or not\n    _checkAssistant(result: IAssistantQueue, queueId: string, interaction: any): RSVP.Promise<boolean> {\n        // Check assistant state field and enabled channels\n        if (\n            this._checkAssistantState(result.assistant.state) &&\n            this._checkIfInteractionTypeIsEnabled(result.mediaTypes, interaction)\n        ) {\n            // Add to cache, queueId plus valid assistant\n            this.cache.put(queueId, true);\n            this.setAssistantState(interaction.get('id'), true);\n            return RSVP.resolve(true);\n        } else {\n            // Add to cache, queueId but no valid assistant\n            this.cache.put(queueId, false);\n            this.setAssistantState(interaction.get('id'), false);\n            return RSVP.resolve(false);\n        }\n    }\n    // Check Assistant State field for this assistant\n    _checkAssistantState(state: string): boolean {\n        // Check if the new state field exists (i.e. the FT is turned on for this org)\n        if (state) {\n            return state === 'Active';\n        }\n        // State field does not exist - this means FT is not turned on so we can enable SA\n        return true;\n    }\n\n    // Check if enabled channels for this assistant includes the current interaction type\n    _checkIfInteractionTypeIsEnabled(enabledChannels: string[], interaction: any): boolean {\n        if (enabledChannels && interaction) {\n            const type = interaction.get('type') === 'callback' ? 'call' : interaction.get('type');\n            // Convert enabled channels array to lower case to match expected interaction types format\n            return enabledChannels.map(item => item.toLowerCase()).includes(type);\n        } else {\n            return false;\n        }\n    }\n\n    setAssistantState(id: string, state: boolean): void {\n        const states = new Map(this.get('assistantState'));\n        states.set(id, state);\n        this.set('assistantState', states);\n    }\n\n    removeAssistantState(id: string): void {\n        const states = new Map(this.get('assistantState'));\n        states.delete(id);\n        this.set('assistantState', states);\n    }\n}\n\ndeclare module '@ember/service' {\n    interface Registry {\n        'agent-assist-checks': AgentAssistChecks;\n    }\n}\n","import { observer, computed, get } from '@ember/object';\nimport Service, { inject } from '@ember/service';\nimport Ember from 'ember';\nimport { isAbortError } from 'ember-ajax/errors';\nimport { Intl as SparkIntl } from 'genesys-spark';\nimport { DesktopNotification } from '@web-directory/services';\nimport { Models } from 'purecloud-platform-client-internal-v2';\nimport { PigeonEvents } from 'web-directory/services/pigeon';\n\nconst OUT_OF_ADHERENCE = 'OutOfAdherence';\nconst SCHEDULE_ROUTE = '#/analytics/agents/schedule/me';\nconst NEW_SCHEDULE_ROUTE = '#/activity/schedule';\nconst COUNTDOWN_UPDATE_PERIOD_SEC = 60;\nexport enum NotificationType {\n    REMINDER = 'reminder',\n    SCHEDULE = 'schedule',\n    OUT_OF_ADHERENCE = 'outOfAdherence'\n}\n\n// Maybe the following is obsolete.\ninterface ScheduleUpdate {\n    type: string;\n    shiftStartDates?: string[];\n    shifts?: { startDate: string }[];\n}\n\nclass ReminderNotification {\n    constructor(\n        public notification: DesktopNotification,\n        public category?: string,\n        public startDate?: Date,\n        public startDateStr?: string\n    ) {}\n}\n\nfunction getRoundedDiffMinutes(laterDate: Date, earlierDate: Date): number {\n    return Math.round((laterDate.getTime() - earlierDate.getTime()) / 60000);\n}\n\nfunction isDateBefore(value: Date, compareDate: Date): boolean {\n    return new Date(value).getTime() < new Date(compareDate).getTime();\n}\n\nfunction formatShortMonthDay(dateString: string) {\n    return SparkIntl.dateTimeFormat({ month: 'short', day: 'numeric' }).format(new Date(dateString));\n}\n\nconst agentScheduleService = Service.extend({\n    application: inject('application'),\n    session: inject('session'),\n    intl: inject('intl'),\n    ajax: inject('ajax'),\n    pigeon: inject('pigeon'),\n    permissions: inject('permissions'),\n    notification: inject('notification'),\n    sidebar: inject('sidebar'),\n    stashLogger: inject('stashLogger'),\n\n    outOfAdherenceNotification: null as DesktopNotification | null,\n    scheduleUpdateNotifications: new Map<string, DesktopNotification>(),\n    nextActivityNotifications: {} as { [key: string]: ReminderNotification },\n    adherenceRegistered: false,\n    scheduleUpdateRegistered: false,\n    remindersCountdownInterval: null as ReturnType<typeof setTimeout> | null,\n\n    getScheduleUpdateNotification(key: string): DesktopNotification | undefined {\n        return this.get('scheduleUpdateNotifications').get(key);\n    },\n\n    setScheduleUpdateNotification(key: string, notification: DesktopNotification) {\n        this.get('scheduleUpdateNotifications').set(key, notification);\n    },\n\n    removeScheduleUpdateNotification(key: string) {\n        this.get('scheduleUpdateNotifications').delete(key);\n    },\n\n    getPersonGuid(): string | undefined {\n        const session = this.get('session');\n        const person = get(session, 'person');\n        const guid = person ? get(person, 'guid') : undefined;\n        return guid && this.checkIfValidUUID(guid) ? guid : undefined;\n    },\n\n    checkIfValidUUID(id: string) {\n        // Regular expression to check if string is a valid UUID\n        const regexExp = /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/gi;\n\n        return regexExp.test(id);\n    },\n\n    loadAdherenceData() {\n        const guid = this.getPersonGuid();\n        if (guid && this.get('hasAdherenceAccess')) {\n            const url = this.get('application').pcV2Uri(`api/v2/workforcemanagement/adherence?userId=${guid}`);\n            return this.get('ajax')\n                .ajaxGet(url)\n                .then((response: Models.UserScheduleAdherence[]) => {\n                    let adherenceData: Models.UserScheduleAdherence | null = null;\n                    if (response.length > 0) {\n                        adherenceData = response[0];\n                    }\n                    if (adherenceData) {\n                        this.handleNextActivityReminders(adherenceData);\n                    }\n                    this.handleOutOfAdherenceState(\n                        !!adherenceData,\n                        adherenceData?.adherenceState,\n                        adherenceData?.scheduledActivityCategory,\n                        adherenceData?.suppressOnTimeReminder\n                    );\n                })\n                .catch((error: any) => {\n                    if (!isAbortError(error)) {\n                        this.get('stashLogger').error('Error getting adherence data', { remoteData: { error } });\n                    }\n                });\n        }\n        return Ember.RSVP.Promise.resolve();\n    },\n\n    handleAdherenceChange(event: PigeonEvents['adherence']) {\n        if (event && event.user && event.user.id === this.getPersonGuid()) {\n            this.handleNextActivityReminders(event);\n            this.handleOutOfAdherenceState(\n                !!event,\n                event?.adherenceState,\n                event?.scheduledActivityCategory,\n                event?.suppressOnTimeReminder\n            );\n        }\n    },\n\n    getRemindersCountdownText(\n        category: Models.WfmUserScheduleAdherenceUpdatedTopicUserNextActivityReminder['activityCategory'],\n        startDate?: Date,\n        now: Date = new Date()\n    ) {\n        const inMinutes = startDate ? getRoundedDiffMinutes(startDate, now) : 0;\n        if (inMinutes <= 0) return undefined;\n        const youAreScheduledIntl = this.get('intl')\n            .safestring('notification.purecloud.nextActivity.' + category)\n            .toString();\n        const message = this.get('intl').t('notification.purecloud.nextActivity.countDownText', {\n            youAreScheduledIntl,\n            inMinutes\n        });\n        return message;\n    },\n\n    showRemindersCountdown() {\n        for (const reminder of Object.values(this.nextActivityNotifications) as ReminderNotification[]) {\n            const countdownText = this.getRemindersCountdownText(reminder.category, reminder.startDate);\n            if (!countdownText) {\n                this.hideNotification(NotificationType.REMINDER, {\n                    category: reminder.category,\n                    date: reminder.startDateStr\n                });\n            } else {\n                if (reminder.notification.notification?.shown) {\n                    reminder.notification.updateBrowserNotification(countdownText);\n                }\n            }\n        }\n    },\n\n    checkAdherenceState() {\n        const guid = this.getPersonGuid();\n        const showAdherence = this.get('hasAdherenceNotifyAccess');\n        if (guid && showAdherence && !this.get('adherenceRegistered')) {\n            // Start the showRemindersCountdown to execute 1 second before each minute.\n            const now = new Date();\n            // Calculate ms elapsed within the current minute (seconds * 1000 + remaining ms)\n            const millis = now.getMilliseconds() + now.getSeconds() * 1000;\n            // Offset so the first tick fires 1 second before the next minute boundary\n            let timeoutMs = 59 * 1000 - millis;\n            if (timeoutMs < 0) timeoutMs += 60 * 1000;\n            this.remindersCountdownInterval = setTimeout(() => {\n                this.showRemindersCountdown();\n                this.remindersCountdownInterval = setInterval(\n                    () => this.showRemindersCountdown(),\n                    COUNTDOWN_UPDATE_PERIOD_SEC * 1000\n                );\n            }, timeoutMs);\n\n            this.loadAdherenceData();\n\n            const adherenceTopic = `v2.users.${guid}.workforcemanagement.adherence`;\n            this.get('pigeon').registerPriorityTopic(adherenceTopic, 'adherence');\n            this.get('pigeon').on('adherence', this, this.handleAdherenceChange);\n            this.get('pigeon').on('connect', this, this.loadAdherenceData);\n            this.set('adherenceRegistered', true);\n        }\n    },\n\n    initializeScheduleUpdateListener() {\n        const guid = this.getPersonGuid();\n        const showScheduleUpdates = this.get('hasScheduleUpdateAccess');\n        if (guid && showScheduleUpdates && !this.get('scheduleUpdateRegistered')) {\n            const scheduleUpdateTopic = `v2.users.${guid}.workforcemanagement.schedules`;\n            this.get('pigeon').registerPriorityTopic(scheduleUpdateTopic, 'schedules');\n            this.get('pigeon').on('schedules', this, this.handleScheduleUpdate);\n            this.set('scheduleUpdateRegistered', true);\n        }\n    },\n\n    goToSchedule() {\n        const route = this.get('hasAgentActivityAccess') ? NEW_SCHEDULE_ROUTE : SCHEDULE_ROUTE;\n        this._setHash(route);\n        this.get('sidebar').ensureRouteVisibility();\n    },\n\n    /**\n     * Sets window.location.hash. Extracted as a method so tests can stub it\n     * without triggering the browser's hashchange event (which fires Ember's\n     * HashLocation handler outside the run loop in test mode).\n     */\n    _setHash(url: string) {\n        window.location.hash = url;\n    },\n\n    hideNotification(type: NotificationType, options?: { category?: string; date?: string }) {\n        let notification: DesktopNotification | null = null;\n        switch (type) {\n            case NotificationType.REMINDER:\n                if (options) {\n                    notification = this.nextActivityNotifications[`${options.category}-${options.date}`]?.notification;\n                    delete this.nextActivityNotifications[`${options.category}-${options.date}`];\n                }\n                break;\n            case NotificationType.SCHEDULE:\n                if (options) {\n                    notification = this.getScheduleUpdateNotification(`${options.category}-${options.date}`) ?? null;\n                    this.removeScheduleUpdateNotification(`${options.category}-${options.date}`);\n                }\n                break;\n            case NotificationType.OUT_OF_ADHERENCE:\n                notification = this.get('outOfAdherenceNotification');\n                this.set('outOfAdherenceNotification', null);\n                break;\n        }\n        if (notification) {\n            notification.hide();\n        }\n    },\n\n    handleScheduleUpdate(data: PigeonEvents['schedules']) {\n        const scheduleData = data;\n\n        if (\n            scheduleData &&\n            scheduleData.user &&\n            scheduleData.user.id === this.getPersonGuid() &&\n            scheduleData.startDate\n        ) {\n            const updates = scheduleData.updates;\n            const startDate = new Date(scheduleData.startDate).toISOString();\n            const listSeparator = this.get('intl')\n                .safestring('notification.purecloud.schedule.listSeparator')\n                .toString();\n\n            const visibilityRange = scheduleData.visibilityRange;\n            let maxVisibilityDate: Date | undefined;\n            if (this.get('isAgentScheduleVisibilityEnabled') && visibilityRange?.endDate) {\n                maxVisibilityDate = new Date(visibilityRange.endDate);\n            }\n\n            // Notify if scheduled shifts change, not if TOR was added/removed\n            if (updates && updates.length > 0) {\n                // Loop through each type of update (Added, Edited, Deleted) and notify agent of the associated changes\n                updates.forEach(\n                    (update: Models.WfmAgentScheduleUpdateTopicAgentScheduleShiftUpdate | ScheduleUpdate) => {\n                        let notifyNew = true;\n                        const type = update.type ?? '';\n                        let notification: DesktopNotification | null =\n                            this.getScheduleUpdateNotification(`${type}-${startDate}`) ?? null;\n                        let shiftStartDates = update.shiftStartDates;\n                        if (!shiftStartDates) {\n                            const scheduleUpdate = update as ScheduleUpdate;\n                            if (scheduleUpdate.shifts && scheduleUpdate.shifts.length > 0) {\n                                shiftStartDates = scheduleUpdate.shifts?.map(x => x.startDate);\n                                if (maxVisibilityDate) {\n                                    // Filter out any dates that are after the allowed visibility range\n                                    shiftStartDates = shiftStartDates.filter(date =>\n                                        isDateBefore(new Date(date), maxVisibilityDate as Date)\n                                    );\n                                }\n                            }\n                        }\n\n                        let dateString: string | undefined;\n                        if (!shiftStartDates || shiftStartDates.length === 0) {\n                            if (!scheduleData.endDate) {\n                                return;\n                            }\n                            const updateStartDate = new Date(startDate);\n                            let visibleEndDate = new Date(scheduleData.endDate);\n\n                            if (maxVisibilityDate) {\n                                // If the update is only for dates after the allowed visibility range, don't show any toast\n                                if (isDateBefore(maxVisibilityDate as Date, updateStartDate)) {\n                                    return;\n                                }\n                                // If the update includes dates after the allowed visibility range, truncate the toast end date to the allowed visibility range\n                                if (isDateBefore(maxVisibilityDate, visibleEndDate)) {\n                                    visibleEndDate = maxVisibilityDate;\n                                }\n                            }\n                            const start = formatShortMonthDay(updateStartDate.toISOString());\n                            const end = formatShortMonthDay(visibleEndDate.toISOString());\n                            dateString = this.get('intl').t('components.inbox.dateRange', { start, end });\n                        } else {\n                            const sortedDates = shiftStartDates.sort((a, b) => {\n                                return isDateBefore(new Date(a), new Date(b)) ? -1 : 1;\n                            });\n                            const visibleDates = sortedDates.filter(\n                                date => !maxVisibilityDate || isDateBefore(new Date(date), maxVisibilityDate)\n                            );\n                            // If the update is only for dates after the allowed visibility range, don't show any toast\n                            if (visibleDates.length === 0) {\n                                return;\n                            }\n                            dateString = visibleDates.map(date => formatShortMonthDay(date)).join(listSeparator);\n                        }\n\n                        // If we already have a notification for this update, show it. If the update is different,\n                        // remove the old notification and show a new one\n                        if (notification) {\n                            if (notification.meta && notification.meta.topic === dateString) {\n                                notifyNew = false;\n                                if (!get(notification, 'notification')?.shown) {\n                                    notification.showNotification();\n                                }\n                            } else {\n                                this.hideNotification(NotificationType.SCHEDULE, {\n                                    category: type,\n                                    date: startDate\n                                });\n                            }\n                        }\n\n                        if (notifyNew && dateString) {\n                            const message = this.get('intl').safestring(`notification.purecloud.schedule.${type}`, {\n                                dates: dateString\n                            });\n                            notification = this.get('notification').info(\n                                this.get('intl').safestring('notification.purecloud.schedule.title').toString(),\n                                message.toString(),\n                                {\n                                    target: this,\n                                    hideAfter: 0,\n                                    actionHandlers: {\n                                        dismiss: {\n                                            label: this.get('intl')\n                                                .safestring('notification.purecloud.dismiss')\n                                                .toString(),\n                                            action: () => {\n                                                this.hideNotification(NotificationType.SCHEDULE, {\n                                                    category: type,\n                                                    date: startDate\n                                                });\n                                            }\n                                        },\n                                        goToSchedule: {\n                                            label: this.get('intl')\n                                                .safestring('notification.purecloud.goToSchedule')\n                                                .toString(),\n                                            action: () => {\n                                                this.goToSchedule();\n                                                this.hideNotification(NotificationType.SCHEDULE, {\n                                                    category: type,\n                                                    date: startDate\n                                                });\n                                            }\n                                        }\n                                    },\n                                    meta: {\n                                        topic: dateString\n                                    },\n                                    showNotificationEverywhere: true\n                                }\n                            );\n                            this.setScheduleUpdateNotification(`${type}-${startDate}`, notification);\n                        }\n                    },\n                    this\n                );\n            }\n        }\n    },\n\n    handleNextActivityReminders(\n        event: Models.WfmUserScheduleAdherenceUpdatedTopicUserScheduleAdherenceUpdate | Models.UserScheduleAdherence\n    ) {\n        for (const nextActivity of event.nextActivityReminders ?? []) {\n            if (!nextActivity.startDate) {\n                continue;\n            }\n            const activityStartDate = new Date(nextActivity.startDate);\n            const countdownText = this.getRemindersCountdownText(nextActivity.activityCategory, activityStartDate);\n            const notifyNew =\n                this.nextActivityNotifications[`${nextActivity.activityCategory}-${nextActivity.startDate}`] ===\n                undefined;\n            if (notifyNew && countdownText) {\n                const notification = this.get('notification').info(\n                    this.get('intl').safestring('notification.purecloud.nextActivity.title').toString(),\n                    countdownText,\n                    {\n                        target: this,\n                        hideAfter: 0,\n                        actionHandlers: {\n                            dismiss: {\n                                label: this.get('intl').safestring('notification.purecloud.dismiss').toString(),\n                                action: () => {\n                                    notification.hide();\n                                }\n                            },\n                            goToSchedule: {\n                                label: this.get('intl').safestring('notification.purecloud.goToSchedule').toString(),\n                                action: () => {\n                                    this.goToSchedule();\n                                    this.hideNotification(NotificationType.REMINDER, {\n                                        category: nextActivity.activityCategory,\n                                        date: nextActivity.startDate\n                                    });\n                                }\n                            }\n                        },\n                        meta: {\n                            topic: nextActivity.activityCategory\n                        },\n                        showNotificationEverywhere: true\n                    }\n                );\n                this.nextActivityNotifications[`${nextActivity.activityCategory}-${nextActivity.startDate}`] =\n                    new ReminderNotification(\n                        notification,\n                        nextActivity.activityCategory,\n                        activityStartDate,\n                        nextActivity.startDate\n                    );\n            }\n        }\n    },\n\n    handleOutOfAdherenceState(\n        adherenceDataPresent: boolean,\n        adherenceState?: string,\n        scheduledActivity?: string,\n        suppressOnTimeReminder?: boolean\n    ) {\n        let notification = this.get('outOfAdherenceNotification');\n\n        if (adherenceDataPresent) {\n            const outOfAdherence = adherenceState === OUT_OF_ADHERENCE;\n\n            if (outOfAdherence) {\n                let notifyNew = true;\n                if (notification) {\n                    // If we already have a notification for this activity, show it. If the activity is different,\n                    // remove the old notification and show a new one\n                    if (notification.meta && notification.meta.topic === scheduledActivity && !suppressOnTimeReminder) {\n                        notifyNew = false;\n                        if (!get(notification, 'notification')?.shown) {\n                            // If the notification is already shown, don't show it again, otherwise show it\n                            notification.showNotification();\n                        }\n                    } else {\n                        this.hideNotification(NotificationType.OUT_OF_ADHERENCE);\n                    }\n                }\n                if (notifyNew && scheduledActivity && !suppressOnTimeReminder) {\n                    notification = this.get('notification').info(\n                        this.get('intl').safestring('notification.purecloud.outOfAdherence.title').toString(),\n                        this.get('intl')\n                            .safestring('notification.purecloud.outOfAdherence.' + scheduledActivity)\n                            .toString(),\n                        {\n                            target: this,\n                            hideAfter: 0,\n                            actionHandlers: {\n                                dismiss: {\n                                    label: this.get('intl').safestring('notification.purecloud.dismiss').toString(),\n                                    action: () => {\n                                        this.hideNotification(NotificationType.OUT_OF_ADHERENCE);\n                                    }\n                                },\n                                goToSchedule: {\n                                    label: this.get('intl')\n                                        .safestring('notification.purecloud.goToSchedule')\n                                        .toString(),\n                                    action: () => {\n                                        this.goToSchedule();\n                                        this.hideNotification(NotificationType.OUT_OF_ADHERENCE);\n                                    }\n                                }\n                            },\n                            meta: {\n                                topic: scheduledActivity\n                            },\n                            showNotificationEverywhere: true\n                        }\n                    );\n                    this.set('outOfAdherenceNotification', notification);\n                }\n            } else if (notification) {\n                this.hideNotification(NotificationType.OUT_OF_ADHERENCE);\n            }\n        } else if (notification) {\n            this.hideNotification(NotificationType.OUT_OF_ADHERENCE);\n        }\n    },\n\n    handleAdherenceAccessChange: observer('hasAdherenceAccess', function (this: any) {\n        this.checkAdherenceState();\n    }),\n\n    handleScheduleUpdateAccessChange: observer('hasScheduleUpdateAccess', function (this: any) {\n        this.initializeScheduleUpdateListener();\n    }),\n\n    hasAdherenceNotifyAccess: computed.readOnly('permissions.hasAgentAdherenceNotifyAccess'),\n\n    hasAdherenceAccess: computed.readOnly('permissions.hasAgentScheduleAccess'),\n\n    hasScheduleUpdateAccess: computed.and(\n        'permissions.hasAgentScheduleAccess',\n        'permissions.hasAgentScheduleNotificationAccess'\n    ),\n\n    hasAgentActivityAccess: computed.readOnly('permissions.canViewAgentActivity'),\n\n    isAgentScheduleVisibilityEnabled: computed('session.features', function () {\n        const features = this.get('session.features');\n        return features && features['WEM-1537_agentScheduleVisibility'];\n    }),\n\n    willDestroy() {\n        this._super(...arguments);\n        if (this.remindersCountdownInterval) {\n            clearInterval(this.remindersCountdownInterval);\n        }\n        const guid = this.getPersonGuid();\n        const adherenceTopic = `v2.users.${guid}.workforcemanagement.adherence`;\n        const scheduleUpdateTopic = `v2.users.${guid}.workforcemanagement.schedules`;\n        this.get('pigeon').unRegisterPriorityTopic(adherenceTopic);\n        this.get('pigeon').unRegisterPriorityTopic(scheduleUpdateTopic);\n        this.get('pigeon').off('adherence', this, this.handleAdherenceChange);\n        this.get('pigeon').off('schedules', this, this.handleScheduleUpdate);\n        this.get('pigeon').off('connect', this, this.loadAdherenceData);\n    }\n});\n\nexport default agentScheduleService;\n\nexport class AgentScheduleService extends agentScheduleService {}\n","import Service, { inject as service } from '@ember/service';\n\nconst BASE_URI = 'api/v2/apps/agentui';\n\nconst isPanelSettingValid = ({ type, panelId } = {}) => {\n    const typeValid = type && typeof type === 'string';\n    const panelIdValid = panelId && typeof panelId === 'string';\n    return typeValid && panelIdValid;\n};\n\nexport default Service.extend({\n    ajax: service(),\n    application: service(),\n    logger: service('stash-logger'),\n\n    buildUri(path) {\n        return this.application.pcV2Uri(`${BASE_URI}${path}`);\n    },\n\n    getOrganizationDefaultPanelSettings() {\n        return this.ajax.request(this.buildUri('/panels/settings')).then(response => {\n            if (!response.settings) return {};\n            const entries = Object.entries(response.settings).map(([key, setting]) => [key.toLowerCase(), setting]);\n            const invalidSettings = entries.filter(([, setting]) => !isPanelSettingValid(setting));\n            if (invalidSettings.length > 0) {\n                this.logger.warn('Found invalid org-level panel settings', {\n                    remoteData: { settings: Object.fromEntries(invalidSettings) }\n                });\n            }\n            return Object.fromEntries(entries.filter(([, setting]) => isPanelSettingValid(setting)));\n        });\n    }\n});\n","import { resolve, reject, defer } from 'rsvp';\nimport { cancel, later } from '@ember/runloop';\nimport { set } from '@ember/object';\nimport { reads } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport Evented from '@ember/object/evented';\nimport { A } from '@ember/array';\nimport PromiseProxyMixin from '@ember/object/promise-proxy-mixin';\nimport ObjectProxy from '@ember/object/proxy';\nimport AjaxService from 'ember-ajax/services/ajax';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nconst RateLimitPromise = ObjectProxy.extend(PromiseProxyMixin, {\n    isRateLimited: false,\n    rateLimitResetTime: 0\n});\n\n/**\n * A symbol to use as a key in the options hash of requests made through the ajax service to specify\n * subsection(s) of the app from which the request is being made. Provided values can be a string or string[].\n * Strings should not include `/` chars as they are the header primary separator.\n * leading/trailing ws will be dropped and slashes will be replaced.\n *\n * Examples:\n * options[REQUEST_TELEMETRY_APP_SUBSECTIONS] = 'my-cool-web-dir-section';\n * options[REQUEST_TELEMETRY_APP_SUBSECTIONS] = ['my-cool-web-dir-section', '1.0.0']\n */\nexport const REQUEST_TELEMETRY_APP_SUBSECTIONS = Symbol();\n\n// Exported for testing purposes\nexport function shouldRetryRequest(xhr) {\n    if (!xhr || xhr.status !== 429) {\n        return false;\n    }\n    const header = xhr.getResponseHeader('retry-after');\n    return !!header && retryStringToNumber(header) !== null;\n}\n\nfunction retryStringToNumber(value) {\n    const number = parseInt(value, 10);\n    if (isNaN(number) || number < 0) {\n        return null;\n    }\n    return number;\n}\n\nfunction retryResetTime(xhr) {\n    let headerRateLimit = xhr.getResponseHeader('retry-after');\n\n    if (!!headerRateLimit) {\n        return retryStringToNumber(headerRateLimit);\n    }\n    return null;\n}\n\nfunction getHeader(headers, name) {\n    if (!headers || !name) {\n        return;\n    }\n    let foundKey = A(Object.keys(headers)).find(key => {\n        return key.toLowerCase() === name.toLowerCase();\n    });\n    if (!foundKey) {\n        return;\n    }\n    return headers[foundKey];\n}\n\nfunction hasAuthorizationHeader(headers) {\n    return !!getHeader(headers, 'Authorization');\n}\n\nfunction isRootAPIRequest(url) {\n    // Is a domain-root request and contains an API version path\n    return url.startsWith('/') && url.includes('/api/v2/');\n}\n\nexport default AjaxService.extend(LoggerMixin, Evented, {\n    session: service(),\n    application: service(),\n\n    _timers: null,\n\n    authData: null,\n    currentRequest: {}, // { url: ..., options: ... }\n\n    // TODO: keep for future implementation\n    // enableRetryHeaderParsing: reads('session.features.enableUIAjaxRetryHeader'),\n    enableRetryHeaderParsing: false,\n    enableAPIDomainRewrites: reads('session.rewriteRootAPIRequests'),\n\n    get headers() {\n        const headers = {\n            'Content-Type': 'application/json'\n        };\n\n        const session = this.session;\n        const accessToken = session ? session.accessToken : null;\n        if (accessToken) {\n            headers['Authorization'] = `bearer ${accessToken}`;\n        }\n\n        return headers;\n    },\n\n    // Override options to ensure headers are included in every request\n    options(url, options = {}) {\n        const opts = this._super(url, options);\n        // Merge our headers into the options\n        opts.headers = Object.assign({}, this.headers, opts.headers || {});\n        return opts;\n    },\n\n    // Set the session OAuth token only when the caller did not supply Authorization.\n    // Overwriting a caller JWT (GCBA loopback login) causes IDX12741 (ATLAS-2390).\n    _makeRequest(hash) {\n        const session = this.session;\n        const accessToken = session ? session.accessToken : null;\n        if (accessToken && hash.headers && !hasAuthorizationHeader(hash.headers)) {\n            hash.headers['Authorization'] = `bearer ${accessToken}`;\n        }\n        return this._super(hash);\n    },\n\n    // Override _getFullHeadersHash to bypass trustedHosts filtering\n    _getFullHeadersHash(headers) {\n        const session = this.session;\n        const accessToken = session ? session.accessToken : null;\n        const fullHeaders = this._super(headers);\n\n        // Force Authorization header even if trustedHosts filtering removed it\n        if (accessToken && !hasAuthorizationHeader(fullHeaders)) {\n            fullHeaders['Authorization'] = `bearer ${accessToken}`;\n        }\n\n        return fullHeaders;\n    },\n\n    // Bypass trustedHosts check - called right before jQuery.ajax\n    _ajaxRequest(options) {\n        const session = this.session;\n        const accessToken = session ? session.accessToken : null;\n        if (accessToken) {\n            options.headers = options.headers || {};\n            if (!hasAuthorizationHeader(options.headers)) {\n                options.headers['Authorization'] = `bearer ${accessToken}`;\n            }\n        }\n        return this._super(options);\n    },\n\n    // Override _shouldSendHeaders to always return true - bypass trustedHosts check in Ember 3.28\n    _shouldSendHeaders() {\n        return true;\n    },\n\n    get trustedHosts() {\n        // Return wildcard to trust all hosts - Ember 3.28 breaks ember-ajax's host checking\n        return ['*'];\n    },\n\n    init() {\n        this._super(...arguments);\n        this._timers = A([]);\n    },\n\n    willDestroy() {\n        if (this._timers) {\n            this._timers.forEach(timer => cancel(timer));\n        }\n        this._super(...arguments);\n    },\n\n    post(url, options = {}) {\n        if (options.data && typeof options.data !== 'string') {\n            options.data = JSON.stringify(options.data);\n        }\n\n        return this._super(...arguments);\n    },\n\n    put(url, options = {}) {\n        if (options.data && typeof options.data !== 'string') {\n            options.data = JSON.stringify(options.data);\n        }\n\n        return this._super(...arguments);\n    },\n\n    patch(url, options = {}) {\n        if (options.data && typeof options.data !== 'string') {\n            options.data = JSON.stringify(options.data);\n        }\n\n        return this._super(...arguments);\n    },\n\n    ajaxGet(url, options = {}) {\n        if (options.data && typeof options.data !== 'string') {\n            options.data = $.param(options.data);\n        }\n        options.method = 'GET';\n\n        return this.request(url, options);\n    },\n\n    _scheduleRequest(url, options, retryTime, deferred) {\n        const scheduleTime = retryTime * 1000;\n        const timer = later(() => {\n            this._timers.removeObject(timer);\n            this.raw(url, options, deferred);\n        }, scheduleTime);\n        this._timers.pushObject(timer);\n    },\n\n    /**\n     * Overriden to make sure we are rate-limited by using `raw`, but returning the same payload as\n     * inherited `request` function.\n     * Please do not make heavy use of the retry option. It is meant as a last resort.\n     *\n     * @param url {string} request URL\n     * @param options {object}\n     * @param [options.retry=false] {boolean} Honor the retry header. Defaults to false. Pass true to retry the request automatically\n     */\n    request(url, options) {\n        let reqUrl = this.addApiDomainIfMissing(url);\n        return this.raw(reqUrl, options)\n            .then(({ response }) => resolve(response))\n            .catch(({ response }) => reject(response));\n    },\n\n    addApiDomainIfMissing(url) {\n        if (this.enableAPIDomainRewrites && isRootAPIRequest(url)) {\n            let apiDomain = window.location.hostname.replace(/^app\\./, 'api.');\n            return `${window.location.protocol}//${apiDomain}${url}`;\n        } else {\n            return url;\n        }\n    },\n\n    raw(url, options = {}, deferred = null) {\n        const canParseHeaders = this.enableRetryHeaderParsing;\n        const retryDisabled = options && !options.retry;\n        if (retryDisabled || !canParseHeaders) {\n            return this._super(...arguments);\n        }\n\n        if (!deferred) {\n            deferred = defer();\n        }\n\n        const promiseProxy = RateLimitPromise.create({\n            promise: deferred.promise\n        });\n\n        this._super(...arguments)\n            .then(data => deferred.resolve(data))\n            .catch(data => {\n                const { jqXHR } = data;\n\n                const shouldRetry = shouldRetryRequest(jqXHR);\n                const retryTime = retryResetTime(jqXHR);\n                this._logPossibleRetryEvent(url, jqXHR, retryTime, shouldRetry);\n\n                if (!shouldRetry) {\n                    deferred.reject(data);\n                    return;\n                }\n\n                this._scheduleRequest(url, options, retryTime, deferred);\n\n                if (promiseProxy) {\n                    set(promiseProxy, 'isRateLimited', true);\n                    set(promiseProxy, 'rateLimitResetTime', retryTime);\n                }\n\n                this.trigger('rateLimited', {\n                    url,\n                    options,\n                    jqXHR\n                });\n            });\n\n        return promiseProxy;\n    },\n\n    /**\n     * Overridden here to preserve error data, since the base\n     * ember-ajax class ignored important parts of error responses.\n     */\n    normalizeErrorResponse(status, headers, payload) {\n        let err = this._super(status, headers, payload);\n        if (err && typeof error === 'object') {\n            err.errorResponse = payload;\n        }\n        return err;\n    },\n\n    _logPossibleRetryEvent(url, xhr, retryTime, shouldRetry) {\n        const headers = xhr.getAllResponseHeaders();\n        if (retryTime === null && !!xhr.getResponseHeader('retry-after')) {\n            this.logger.error('Found retry header, but unable to parse time:', {\n                url,\n                headers\n            });\n            return;\n        }\n\n        if (!shouldRetry) {\n            return;\n        }\n\n        this.logger.warn('Request failed, but a retry header was found. Scheduling to run in the future:', {\n            url,\n            headers,\n            seconds: retryTime\n        });\n    },\n\n    generateDetailedMessage(status, headers, payload, requestData) {\n        let url = requestData.url;\n        if (url) {\n            // Try to strip out everything but the host + path\n            try {\n                const urlObject = url.startsWith('/') ? new URL(url, window.location.origin) : new URL(url);\n                url = `${urlObject.origin}${urlObject.pathname}`;\n            } catch (_) {\n                this.logger.info('Redacted possibly sensitive URL:', {\n                    url\n                });\n                url = 'REDACTED';\n            }\n        }\n\n        let correlationId;\n        try {\n            const correlationHeaderKey = 'ININ-Correlation-Id';\n            const headerCorrelationId = getHeader(headers, correlationHeaderKey);\n            const payloadCorrelationId = !!payload && payload.contextId;\n            correlationId = headerCorrelationId || payloadCorrelationId || '(unknown)';\n        } catch (_) {\n            correlationId = '(unknown)';\n        }\n\n        return [\n            'Ember AJAX request',\n            `Method: ${requestData.type}`,\n            `URL: ${url}`,\n            `Status: ${status}`,\n            `Correlation ID: ${correlationId}`\n        ].join('\\n');\n    }\n});\n","import Ember from 'ember';\nimport type { GuxModalSize } from 'genesys-spark-components/dist/types/components/stable/gux-modal/gux-modal.types';\nimport { computed } from '@ember/object';\nimport ComputedProperty from '@ember/object/computed';\nimport uuid from 'web-directory/utils/uuid';\nimport { DeferredPromise, deferPromise } from 'web-directory/utils/async';\nimport { Maybe } from 'web-directory/types';\nimport { parseQueryParams } from '../utils/query-parser';\n\ntype SimpleModalButton = {\n    label: string;\n    id: string;\n};\n\ntype ModalAction = SimpleModalButton & {\n    action: () => void;\n};\n\nexport type ModalResult =\n    | { type: 'userDismissed'; ifcModalId?: string }\n    | { type: 'timeout'; ifcModalId?: string }\n    | { type: 'forceDismissed'; ifcModalId?: string }\n    | { type: 'buttonClicked'; buttonId: string; ifcModalId?: string };\n\nexport interface BaseModalConfig {\n    title?: string;\n    size?: GuxModalSize;\n    content?: string;\n    timeout?: number;\n    buttonAlignment?: string;\n    ifcModalData?: {};\n    ifcModalId?: string;\n}\n\nexport type DisplayedModalConfig = BaseModalConfig & {\n    id: string;\n    actions: Partial<{\n        dismiss: () => void;\n        positive: ModalAction;\n        secondary: ModalAction;\n        negative: ModalAction;\n    }>;\n};\n\nexport type SimpleModalConfig = BaseModalConfig & {\n    buttons?: Partial<{\n        positive: SimpleModalButton;\n        secondary: SimpleModalButton;\n        negative: SimpleModalButton;\n    }>;\n};\n\ntype EmberRunTimer = ReturnType<typeof Ember.run.later>;\n\ntype ModalContext = {\n    deferred: DeferredPromise<ModalResult>;\n    timer: Maybe<EmberRunTimer>;\n    modal: DisplayedModalConfig;\n};\n\n//Any changes to the service need to be updated here as well to keep the types up to date\nexport interface AlertingService extends Ember.Service {\n    displayedModal: ComputedProperty<DisplayedModalConfig | null>;\n    /**  Pushes the provided modal onto the modalStack and updates the displayedModal to render the newest, most recent modal  */\n    pushModal: (newModal: SimpleModalConfig) => Promise<ModalResult>;\n    pushCancellableModal: (newModal: SimpleModalConfig) => { promise: Promise<ModalResult>; modalId: string };\n    popModal: () => void;\n    removeModalById: (id: string) => void;\n}\n\nexport default Ember.Service.extend({\n    _modalStack: [] as ModalContext[],\n    parsedQueryParams: null as {} | null,\n\n    init() {\n        this._super(...arguments);\n        this.set('parsedQueryParams', parseQueryParams());\n    },\n\n    displayedModal: computed('_modalStack', function (): DisplayedModalConfig | null {\n        const modalStack = this.get('_modalStack');\n        return modalStack.length > 0 ? modalStack[modalStack.length - 1].modal : null;\n    }),\n\n    pushModal: async function (newModal: SimpleModalConfig): Promise<ModalResult> {\n        const { promise } = this.pushCancellableModal(newModal);\n        return promise;\n    },\n\n    pushCancellableModal: function (newModal: SimpleModalConfig): { promise: Promise<ModalResult>; modalId: string } {\n        const modalResolution = deferPromise<ModalResult>();\n\n        const modalStack = [...this.get('_modalStack')];\n        const defaultsToOverride: Partial<SimpleModalConfig> = { size: 'dynamic' };\n        const modalId = uuid.generate();\n        let timer: Maybe<EmberRunTimer>;\n\n        if (newModal.timeout && newModal.timeout >= 0) {\n            timer = Ember.run.later(() => {\n                if (this.isDestroying || this.isDestroyed) {\n                    return;\n                }\n                modalResolution.resolve({ type: 'timeout', ifcModalId: newModal.ifcModalId });\n                this.removeModalById(modalId);\n            }, newModal.timeout);\n        }\n\n        const resolveModal = (resolution: ModalResult) => {\n            if (timer) {\n                Ember.run.cancel(timer);\n                timer = null;\n            }\n            modalResolution.resolve(resolution);\n        };\n\n        //Have to check for ifcModalId before handing button clicks due to how\n        //aps-v2-api-handler/modal-message-handler SimpleModalResolution expects responses\n        if (newModal.ifcModalId) {\n            const actions: DisplayedModalConfig['actions'] = {\n                dismiss: () => resolveModal({ type: 'userDismissed', ifcModalId: newModal.ifcModalId })\n            };\n            if (newModal.buttons?.positive)\n                actions.positive = {\n                    ...newModal.buttons.positive,\n                    action: () =>\n                        resolveModal({\n                            type: 'buttonClicked',\n                            buttonId: newModal.buttons!.positive!.id,\n                            ifcModalId: newModal.ifcModalId\n                        })\n                };\n            if (newModal.buttons?.secondary)\n                actions.secondary = {\n                    ...newModal.buttons.secondary,\n                    action: () =>\n                        resolveModal({\n                            type: 'buttonClicked',\n                            buttonId: newModal.buttons!.secondary!.id,\n                            ifcModalId: newModal.ifcModalId\n                        })\n                };\n            if (newModal.buttons?.negative)\n                actions.negative = {\n                    ...newModal.buttons.negative,\n                    action: () =>\n                        resolveModal({\n                            type: 'buttonClicked',\n                            buttonId: newModal.buttons!.negative!.id,\n                            ifcModalId: newModal.ifcModalId\n                        })\n                };\n\n            const displayedModalConfig = { ...defaultsToOverride, ...newModal, id: modalId, actions };\n            modalStack.push({ modal: displayedModalConfig, deferred: modalResolution, timer });\n            this.set('_modalStack', modalStack);\n\n            return { promise: modalResolution.promise, modalId };\n        } else {\n            const actions: DisplayedModalConfig['actions'] = {\n                dismiss: () => resolveModal({ type: 'userDismissed' })\n            };\n            if (newModal.buttons?.positive)\n                actions.positive = {\n                    ...newModal.buttons.positive,\n                    action: () =>\n                        resolveModal({\n                            type: 'buttonClicked',\n                            buttonId: newModal.buttons!.positive!.id\n                        })\n                };\n            if (newModal.buttons?.secondary)\n                actions.secondary = {\n                    ...newModal.buttons.secondary,\n                    action: () =>\n                        resolveModal({\n                            type: 'buttonClicked',\n                            buttonId: newModal.buttons!.secondary!.id\n                        })\n                };\n            if (newModal.buttons?.negative)\n                actions.negative = {\n                    ...newModal.buttons.negative,\n                    action: () =>\n                        resolveModal({\n                            type: 'buttonClicked',\n                            buttonId: newModal.buttons!.negative!.id\n                        })\n                };\n\n            const displayedModalConfig = { ...defaultsToOverride, ...newModal, id: modalId, actions };\n            modalStack.push({ modal: displayedModalConfig, deferred: modalResolution, timer });\n            this.set('_modalStack', modalStack);\n\n            return { promise: modalResolution.promise, modalId };\n        }\n    },\n\n    popModal: function () {\n        const modalStack = [...this.get('_modalStack')];\n        if (modalStack.length > 0) {\n            const modalContext = modalStack[modalStack.length - 1];\n            this.removeModalById(modalContext.modal.id);\n        }\n    },\n\n    removeModalById: function (id: string) {\n        // Guard: timer callbacks can execute after service destruction during tests\n        if (this.isDestroyed || this.isDestroying) {\n            return;\n        }\n        const modalStack = [...this.get('_modalStack')];\n        const index = modalStack.findIndex(curr => curr.modal.id === id);\n        if (index > -1) {\n            const modalContext = modalStack.splice(index, 1)[0];\n            const { deferred, timer } = modalContext;\n            // Resolving with a forceDismissed here in case someone else calls remove and the modal unexpectedly closes. The promise should be resolved before this so it should have no effect.\n            deferred.resolve({ type: 'forceDismissed' });\n            if (timer) {\n                Ember.run.cancel(timer);\n                modalContext.timer = null;\n            }\n        }\n        this.set('_modalStack', modalStack);\n    }\n});\n\n/** DO NO REMOVE MODULE DECLARATION **/\ndeclare module '@ember/service' {\n    interface Registry {\n        alerting: AlertingService;\n    }\n}\n","import { debug } from '@ember/debug';\nimport { observer } from '@ember/object';\nimport Service, { inject as service } from '@ember/service';\nimport * as PlatformJS from 'platform';\n\nimport { setCustomAttribute, addPageAction } from '../utils/newrelic';\n\nexport default Service.extend({\n    enabled: true,\n\n    application: service(),\n    intl: service(),\n    session: service(),\n    permissions: service(),\n    isContentsquareInitialized: false,\n\n    init() {\n        this._super(...arguments);\n\n        // Fetch dependent services/props to trigger lazy load and wire setDimensions observer\n        this.get('session.isAuthenticated');\n        this.get('intl.isoLocale');\n        this.initializeContentsquare();\n    },\n\n    setupDimensions: true,\n    setDimensions: observer('session.isAuthenticated', 'intl.isoLocale', function () {\n        if (this.setupDimensions && this.enabled && this.get('session.isAuthenticated') && this.get('intl.isoLocale')) {\n            this.set('setupDimensions', false);\n\n            // Add contextual props as custom attributes for all NR Events\n            Object.entries(\n                buildCommonTelemetryContext({\n                    applicationService: this.application,\n                    sessionService: this.session,\n                    intlService: this.intl\n                })\n            ).forEach(([key, value]) => {\n                setCustomAttribute(key, value);\n            });\n\n            const userId = this.get('session.person.guid');\n            addPageAction('userAuthenticated', { userId });\n        } else {\n            this.set('setupDimensions', true);\n        }\n    }),\n    initializeContentsquare: observer('session.isAuthenticated', function () {\n        if (this.get('session.isAuthenticated') && window._uxa) {\n            const organizationId = this.get('session.publicApiUser.organization.id');\n            const orgShortName = this.get('session.publicApiUser.organization.thirdPartyOrgName');\n\n            if (!this.isContentsquareInitialized) {\n                this.sendContentsquareSessionVar('orgId', organizationId);\n                this.sendContentsquareSessionVar('orgShortName', orgShortName);\n                this.set('isContentsquareInitialized', true);\n            }\n        }\n    }),\n    sendContentsquareSessionVar(name, value) {\n        if (window._uxa) {\n            try {\n                window._uxa.push(['trackDynamicVariable', { key: name, value: value }]);\n            } catch (err) {\n                debug('Attempted to add Contentsquare variables without loading library.');\n            }\n        }\n    }\n});\n\n/**\n * Builds common properties that could be useful in many telemetry and logging situations.\n * The data must ALWAYS be safe for logging.  i.e. no customer or PII data.\n */\nexport function buildCommonTelemetryContext({ applicationService, sessionService, intlService }) {\n    const isHosted = applicationService.get('hostedContext.isHostedProp');\n\n    const commonCtxt = {\n        applicationVersion: applicationService.get('semver'),\n        organizationId: sessionService.get('org.guid'),\n        organization: sessionService.get('org.shortName'),\n        userId: sessionService.get('person.guid'),\n        uiLanguage: intlService.get('isoLocale'),\n        envName: applicationService.get('runtime.name'),\n        isPopout: applicationService.get('isPopout'),\n        webDirAgent: isHosted ? 'desktop' : 'browser',\n        platformJsBrowserName: PlatformJS.name,\n        platformJsBrowserVersion: PlatformJS.version,\n        platformJsProduct: PlatformJS.product,\n        platformJsManufacturer: PlatformJS.manufacturer,\n        platformJsLayout: PlatformJS.layout,\n        platformJsOperatingSystem: PlatformJS.os.toString(),\n        platformJsDescription: PlatformJS.description\n    };\n\n    if (isHosted) {\n        return Object.assign({}, commonCtxt, {\n            desktopOS: applicationService.get('hostedContext._operatingSystem'),\n            desktopVersion: applicationService.get('hostedContext._version')\n        });\n    }\n\n    return commonCtxt;\n}\n","/* global navigator */\nimport { on } from '@ember/object/evented';\n\nimport { reject, resolve } from 'rsvp';\nimport { deprecate } from '@ember/debug';\nimport { cancel, later, debounce } from '@ember/runloop';\nimport { alias, deprecatingAlias, equal, or } from '@ember/object/computed';\nimport Service, { inject as service } from '@ember/service';\nimport { observer, computed, get } from '@ember/object';\nimport Ember from 'ember';\nimport request from 'ember-ajax';\nimport { task, timeout } from 'ember-concurrency';\nimport _ from 'lodash';\nimport adapter from 'webrtc-adapter';\nimport { EVENTS } from '../utils/hosted-context';\nimport netUtils from '../utils/net';\n\n// import { addPageAction } from '../utils/newrelic';\nimport { isPersonJid } from 'web-directory/utils/jid-helpers';\nimport { isTesting } from 'web-directory/utils/testing';\nimport config from '../config/environment';\nimport { APP_NAME } from './stash-logger';\nimport { openVoltPopout } from '../utils/volt-popout';\nimport { getGenesysAppName } from '../utils/genesys-app-name';\n\nconst BRIDGE_CONFIGURATION = {};\nconst deprecation = {\n    id: 'directory-core.deprecate-application-locale',\n    until: '6.0.0',\n    url: 'https://bitbucket.org/inindca/web-directory/src/develop/DEPRECATIONS.md'\n};\n\nconst COOKIES = {\n    session: 'X-OrgSpan-Auth-Key',\n    proxyPersonId: 'proxy-person-id',\n    locale: 'locale',\n    prevU_id: '_pu_i',\n    activePersonId: '_ap_i',\n    activeGroupId: '_ag_i',\n    lastSearchQuery: '_lsq2',\n    lastProfileQuery: '_lpq2',\n    debug: 'debug',\n    debugOrgName: 'debug-orgName',\n    debugAppModeReadOnly: 'debug-readOnly'\n};\n\nexport default Service.extend({\n    ajax: service(),\n    chat: service(),\n    intl: service(),\n    store: service(),\n    adminui: service(),\n    cookies: service(),\n    session: service(),\n    streaming: service(),\n    preferences: service(),\n    pigeon: service(),\n    feature: service(),\n    webrtc: service(),\n    sidebar: service(),\n    volt: service(),\n    webrtcSdk: service('webrtc-sdk'),\n    mediaProviders: service(),\n    stashLogger: service(),\n    trial: service(),\n    commandNav: service('command-nav'),\n    frameService: service('center-stage-frame'),\n    pageTitleService: service('bookmark-page-title'),\n\n    envDetails: null,\n    // Runtime is injected via the instance-initializer and is resolved at runtime. It will not resolve in testing mode, so anything that uses it will need to mock it in the tests.\n    runtime: null,\n    dragging: false,\n    browserHidden: false,\n    iframeFocused: false,\n    currentRouteName: null,\n    urlprefix: '',\n    authUri: null,\n    cobrowseUri: null,\n    purecloudAppsUri: null,\n    streamingServiceUri: null,\n    orgspanBaseUri: '/directory',\n    purecloudBaseUri: '/platform',\n    purecloudV2BaseUri: '/platform',\n    realtimeScriptUri: '/static-realtime-js/realtime.js',\n    hostedContext: null,\n\n    isMobile: false,\n    mobileQueryParameter: false,\n    belowMobileThreshold: false,\n\n    showAdminModal: false,\n    showLoader: false,\n\n    trialSupportDisplayed: false,\n\n    showTrialSupport: computed('trialSupportDisplayed', 'trial.showTrialSupportCenter', function () {\n        return this.get('trialSupportDisplayed') && this.get('trial.showTrialSupportCenter');\n    }).readOnly(),\n\n    debugSettings: {},\n\n    offerMobilePreference: true,\n    offerMobilePreferenceRetreived: false,\n\n    currentYear: new Date().getFullYear(),\n\n    sparkTheme: computed('session.features.ATLAS-2160_dark-theme-pilot', function () {\n        if (this.get('session.features.ATLAS-2160_dark-theme-pilot')) {\n            return {\n                id: 'flare-dark',\n                name: 'flare',\n                mode: 'dark'\n            };\n        }\n\n        return {\n            id: 'flare-light',\n            name: 'flare',\n            mode: 'light'\n        };\n    }),\n\n    offerMobileApp: computed(\n        'mobileQueryParameter',\n        'isMobile',\n        'offerMobilePreference',\n        'offerMobilePreferenceRetreived',\n        {\n            get() {\n                if (this.mobileQueryParameter || !this.offerMobilePreferenceRetreived) {\n                    return false;\n                }\n\n                return this.isMobile && this.offerMobilePreference;\n            },\n            set(key, value) {\n                this.preferences.setPreference('offerMobileApp', value);\n                this.set('offerMobilePreference', value);\n            }\n        }\n    ),\n\n    orgName: alias('session.org.name'),\n    orgShortName: alias('session.org.shortName'),\n    pageTitle: alias('frameService.pageTitle'),\n    standaloneApps: alias('commandNav.standaloneApps'),\n    currentPageTitle: alias('pageTitleService.bookmarkPageTitle'),\n\n    init() {\n        this._super(...arguments);\n        if (isTesting) {\n            this.set('urlprefix', '/');\n        }\n        this.checkForDebugMode();\n        this.gatherEnvDetails();\n        this.initIframeFocusListener();\n        this.setVisibilityListener();\n\n        const pigeon = this.pigeon;\n        this._onPigeonConnect = () => {\n            let context = this.hostedContext;\n            if (context) {\n                context.sendEventToDesktop(EVENTS.PHONE_CONNECTED, {});\n            }\n        };\n        pigeon.on('connect', this, this._onPigeonConnect);\n\n        let hasRecentlyLostSubscriptions = false;\n        this._onNoLongerSubscribed = () => {\n            if (!hasRecentlyLostSubscriptions) {\n                console.info('Resubscribing to pigeon after no_longer_subscribed');\n                hasRecentlyLostSubscriptions = true;\n                later(() => (hasRecentlyLostSubscriptions = false), 2000);\n                pigeon._registerTopics(); // trigger immediate resubscribe\n                return;\n            }\n            console.warn('Multiple no_longer_subscribed events, showing warning to user and stopping resubscribe.');\n            // ENGAGEUI-1563: Warn users if channel limit\n            // has been hit and current channel will no longer\n            // receive updates.\n            this.set('session.shouldWarnNoLongerSubscribed', true);\n        };\n        pigeon.on('no_longer_subscribed', this, this._onNoLongerSubscribed);\n\n        this.preferences.getPreference('offerMobileApp').then(value => {\n            // needed for unit tests\n            if (this.isDestroyed || this.isDestroying) {\n                return;\n            }\n            this.set('offerMobilePreference', value !== false);\n            this.set('offerMobilePreferenceRetreived', true);\n        });\n\n        this._onTopicsRegistered = () => {\n            let context = this.hostedContext;\n            if (context) {\n                context.sendEventToDesktop(EVENTS.PHONE_CONNECTED, {});\n            }\n        };\n        this.pigeon.on('topicsRegistered', this, this._onTopicsRegistered);\n        this._onHawkSubscriptionError = err => {\n            this.stashLogger.error('Hawk Subscription Error', { err });\n        };\n        this.pigeon.on('hawkSubscriptionError', this, this._onHawkSubscriptionError);\n\n        console.log('WebRTC Adapter loaded at application level', { adapter });\n        this.toggleWebTelemetry();\n    },\n\n    async openChatRoomWithVideo(roomJid, useMediaProviders = false) {\n        if (useMediaProviders) {\n            if (this.get('mediaProviders.usingVideoProvider') || this.get('webrtc.activeRoom.showingVideo')) {\n                if (this.get('session.useNewNav')) {\n                    this.commandNav.selectPanel('chats');\n                } else {\n                    this.sidebar.openPanel('conversations');\n                }\n            }\n            return;\n        }\n\n        if (!this.get('webrtc.videoCallCapable')) {\n            return;\n        }\n\n        const hostedContext = this.hostedContext;\n        const isHosted = (hostedContext && hostedContext.isHosted && hostedContext.isHosted()) || false;\n\n        // Check for incoming video invitation from webrtc-sdk\n        const webrtcSdkInvitation = this.webrtcSdk.getVideoInvitationByUserJid(roomJid);\n        if (webrtcSdkInvitation) {\n            const videoRoomJid = webrtcSdkInvitation.get('roomJid') || webrtcSdkInvitation.get('originalRoomJid');\n            console.log('answering video via webrtc-sdk invitation', { roomJid, videoRoomJid });\n\n            // Remove the invitation\n            this.webrtcSdk.removeVideoInvitation(webrtcSdkInvitation);\n\n            // Open Volt popout\n            if (videoRoomJid) {\n                openVoltPopout(videoRoomJid, { hosted: isHosted });\n            }\n            return;\n        }\n\n        // For new outgoing video calls, prepare 1:1 JID if needed\n        let videoJid = roomJid;\n        if (isPersonJid(roomJid)) {\n            videoJid = this.volt.prepareOneToOne(roomJid);\n            console.log('starting 1:1 video call', { roomJid, videoJid });\n        }\n\n        // Always open Volt in popout window\n        openVoltPopout(videoJid, { hosted: isHosted, inviteJid: isPersonJid(roomJid) ? roomJid : undefined });\n    },\n\n    _toggleWebTelemetry() {\n        try {\n            if (window.pwt) {\n                window.pwt.on('warn', 'web-directory', function () {\n                    console.warn('PWT: Warning', { warningData: arguments });\n                });\n                window.pwt.modules.forEach(m => {\n                    m.on('alert', 'web-directory', score => {\n                        console.warn('PWT: Alert', { message: score.message, details: score.details });\n                    });\n                });\n                this.set('pwt', window.pwt);\n            }\n        } catch (e) {\n            console.warn('web-telemetry failed to load', { e });\n        }\n    },\n\n    toggleWebTelemetry: function () {\n        // Handle retained so willDestroy can cancel it. init() calls this, so every instantiation of\n        // this service arms a 200ms timer; uncancelled it fires after teardown and touches a\n        // destroyed service.\n        this._webTelemetryTimer = debounce(this, this._toggleWebTelemetry, 200);\n    },\n    currentRouteClass: computed('currentRouteName', function () {\n        var name = this.currentRouteName;\n        if (name) {\n            return name.replace(/[./]+/g, '-');\n        }\n\n        return '';\n    }),\n\n    isoLocale: deprecatingAlias('intl.isoLocale', deprecation),\n    systemLocale: deprecatingAlias('intl.systemLocale', deprecation),\n    iso2LocaleCountry: deprecatingAlias('intl.iso2LocaleCountry', deprecation),\n    setLocale(locale) {\n        const message =\n            'The \"setLocale\" method in \"web-directory/service/application\" has been deprecated. Please use \"service:intl\" for all locale information.';\n        deprecate(message, false, deprecation);\n        return this.intl.setLocale(locale);\n    },\n\n    gatherEnvDetails() {\n        if (isTesting) {\n            return;\n        }\n        try {\n            this.set('envDetails', netUtils.getEnvDetails());\n        } catch (error) {\n            console.error('Failed to parse URL into a known runtime environment. Check URL and utils/net.js', {\n                reason: error.message\n            });\n            this.set('errorState', { type: 'invalidEnv' });\n        }\n    },\n\n    initIframeFocusListener() {\n        const focusHandler = () => this.set('iframeFocused', false);\n        const blurHandler = () => {\n            if (!document) {\n                return;\n            }\n            const nodeName = get(document, 'activeElement.nodeName');\n            if (nodeName && nodeName.toLowerCase() === 'iframe') {\n                this.set('iframeFocused', true);\n            }\n        };\n        this.set('_iframeFocusHandler', focusHandler);\n        this.set('_iframeBlurHandler', blurHandler);\n        window.addEventListener('focus', focusHandler);\n        window.addEventListener('blur', blurHandler);\n    },\n\n    setVisibilityListener() {\n        let hidden;\n        let visibilityChange;\n        if (typeof document.hidden !== 'undefined') {\n            hidden = 'hidden';\n            visibilityChange = 'visibilitychange';\n        } else if (typeof document.mozHidden !== 'undefined') {\n            hidden = 'mozHidden';\n            visibilityChange = 'mozvisibilitychange';\n        } else if (typeof document.msHidden !== 'undefined') {\n            hidden = 'msHidden';\n            visibilityChange = 'msvisibilitychange';\n        } else if (typeof document.webkitHidden !== 'undefined') {\n            hidden = 'webkitHidden';\n            visibilityChange = 'webkitvisibilitychange';\n        }\n\n        const visibilityHandler = () => this.set('browserHidden', document[hidden]);\n        const windowBlurHandler = () => {\n            if (this.browserHidden !== undefined) {\n                this.set('browserHidden', true);\n            }\n        };\n        const windowFocusHandler = () => {\n            if (this.browserHidden !== undefined) {\n                this.set('browserHidden', false);\n            }\n        };\n\n        this.set('_visibilityHandler', visibilityHandler);\n        this.set('_windowBlurHandler', windowBlurHandler);\n        this.set('_windowFocusHandler', windowFocusHandler);\n\n        document.addEventListener(visibilityChange, visibilityHandler);\n        window.addEventListener('blur', windowBlurHandler);\n        window.addEventListener('focus', windowFocusHandler);\n    },\n\n    willDestroy() {\n        // Cancel timers first. Everything below this point can throw (pigeon may be a partial stub in\n        // tests), and a throw part-way through this hook would abandon the cancel entirely.\n        // typeof check rather than truthiness: backburner timer ids start at 0, so a truthy check\n        // skips cancelling the first timer scheduled in a page.\n        if (typeof this._webTelemetryTimer === 'number') {\n            cancel(this._webTelemetryTimer);\n            this._webTelemetryTimer = null;\n        }\n        this._super(...arguments);\n        this.pigeon.off('connect', this, this._onPigeonConnect);\n        this.pigeon.off('topicsRegistered', this, this._onTopicsRegistered);\n        this.pigeon.off('no_longer_subscribed', this, this._onNoLongerSubscribed);\n        this.pigeon.off('hawkSubscriptionError', this, this._onHawkSubscriptionError);\n        const pigeonUserSubscribed = this.pigeonUserSubcribed;\n        if (pigeonUserSubscribed && this._onPigeonUserSubscribed) {\n            this.pigeon.off(pigeonUserSubscribed, this, this._onPigeonUserSubscribed);\n        }\n        window.removeEventListener('focus', this._iframeFocusHandler);\n        window.removeEventListener('blur', this._iframeBlurHandler);\n        window.removeEventListener('blur', this._windowBlurHandler);\n        window.removeEventListener('focus', this._windowFocusHandler);\n        if (this._visibilityHandler) {\n            document.removeEventListener('visibilitychange', this._visibilityHandler);\n            document.removeEventListener('mozvisibilitychange', this._visibilityHandler);\n            document.removeEventListener('msvisibilitychange', this._visibilityHandler);\n            document.removeEventListener('webkitvisibilitychange', this._visibilityHandler);\n        }\n    },\n\n    loadStreamingService() {\n        const authenticated = this.get('session.isAuthenticated');\n        if (isTesting || !authenticated) {\n            return reject();\n        }\n        const scriptUri = this.realtimeScriptUri;\n        const streamingService = this.streaming;\n        streamingService.set('scriptUrl', scriptUri);\n        let features;\n        if (this.get('session.features')) {\n            features = resolve(this.get('session.features'));\n        } else {\n            features = this.feature.getFeatureToggles().catch(err => {\n                console.warn('Failed to fetch toggles for realtime connection', { err });\n                // do not rethrow, don't want this to prevent realtime connection\n                return {};\n            });\n        }\n        return features.then(res => {\n            const runAsMediaHelper =\n                (this.get('hostedContext.isHostedProp') || window.testMediaHelperMode) &&\n                this.get('hostedContext.runAsMediaHelper');\n\n            if (runAsMediaHelper) {\n                console.info('Running in media helper mode');\n                this.set('mediaHelperMode', true);\n                console.info('Letting webrtcSdk set up media helper jid');\n            }\n\n            let alertableInteractionTypes = ['voice'];\n            if (\n                this.webrtcSdk.shouldIgnoreSoftphone() ||\n                !this.get('session.features.CHAT-3526_enableAlertingLeaderPublicApi')\n            ) {\n                alertableInteractionTypes = [];\n            }\n\n            return streamingService.setupConnection({\n                jid: this.get('session.person.jid'),\n                accessToken: this.get('session.accessToken'),\n                iceTransportPolicy: 'all',\n                signalIceConnected: true,\n                disableEOCShortCircuit: true,\n                referenceStanza: true,\n                streamingServiceUri: this.streamingServiceUri,\n                envDetails: this.envDetails,\n                originAppName: APP_NAME,\n                originAppVersion: config.APP.semver,\n                originAppId: this.get('stashLogger.clientSessionId'),\n                splitHawkAndRealtime: true,\n                useServerSidePings: true,\n                enablePartialBulkResubscribe: true,\n                alertableInteractionTypes,\n                customHeaders: {\n                    'Genesys-App': getGenesysAppName({\n                        semver: config.APP.semver,\n                        isHosted: this.get('hostedContext.isHostedProp'),\n                        isPopout: this.isPopout\n                    })\n                }\n            });\n        });\n    },\n\n    streamingServiceConnect: task(function* (debounce = 1000) {\n        yield timeout(debounce);\n        const authenticated = this.get('session.isAuthenticated');\n        const jid = this.get('session.person.jid');\n        const accessToken = this.get('session.accessToken');\n        const adminUIContext = this.adminUIContext;\n        const streamingService = this.streaming;\n        return this.loadStreamingService().then(() => {\n            if (authenticated && accessToken && !adminUIContext) {\n                if (!this.pigeonUserSubscribed) {\n                    const myGuid = this.get('session.person.guid');\n                    console.debug('Subscribing to user guid for system topic', { myGuid });\n                    this.set('pigeonUserSubscribed', myGuid);\n                    this._onPigeonUserSubscribed = data => {\n                        if (this.isDestroyed || this.isDestroying) {\n                            return;\n                        }\n                        console.debug('System topic', { data });\n                        if (data.systemTopicType === 'token_revoked') {\n                            this.session.invalidate({ notified: true });\n                        }\n                    };\n                    this.pigeon.on(myGuid, this, this._onPigeonUserSubscribed);\n                }\n\n                return streamingService.connect(accessToken, jid).then(() => {\n                    this.pigeon._registerTopics();\n                });\n            }\n        });\n    }).drop(),\n\n    syncStreamingConnectionToAuthState: on(\n        'init',\n        observer('session.{isAuthenticated,accessToken}', 'preferences.chat.disableStreaming', function () {\n            this.get('streamingServiceConnect').perform();\n        })\n    ),\n\n    displayTrialSupport() {\n        if (!this.get('trial.showTrialSupportCenter')) {\n            return;\n        }\n        this.set('trialSupportDisplayed', true);\n    },\n\n    dismissTrialSupport() {\n        this.set('trialSupportDisplayed', false);\n    },\n\n    adminUIContext: equal('context', 'adminui'),\n    adminUiContext: deprecatingAlias('adminUIContext', {\n        id: 'application.deprecate-context',\n        until: '8.0.0'\n    }),\n\n    uvOptions: {\n        mode: 'feedback',\n        feedback_tab_name: 'Your Feedback or Idea',\n        primary_color: '#4498b4',\n        link_color: '#007dbf',\n        default_mode: 'feedback',\n        forum_id: 294075\n    },\n\n    postMessageRouteChange(transition) {\n        if (!this.adminUIContext) {\n            return;\n        }\n        const { targetName, params } = transition;\n        const routeType = _.head(targetName.split('.detail.index')) || false;\n        const route = params[`${routeType}.detail`];\n        const routeId = route && route[`${routeType}_id`];\n        const data = {\n            type: 'directory:route:changed',\n            data: { routeType, routeId }\n        };\n        console.debug('postMessage -> window.parent', { data });\n        window.parent.postMessage(JSON.stringify(data), '*');\n    },\n\n    uri(path) {\n        if (this.get('session.rewriteRootAPIRequests')) {\n            // If we're on the new hosting infrastructure, force API calls to use the api. subdomain\n            return [].concat(this.purecloudV2BaseUri, path).join('/');\n        } else {\n            return [].concat(this.orgspanBaseUri, path).join('/');\n        }\n    },\n\n    pcUri(path) {\n        if (this.get('session.rewriteRootAPIRequests')) {\n            // If we're on the new hosting infrastructure, force API calls to use the api. subdomain\n            return [].concat(this.purecloudV2BaseUri, path).join('/');\n        } else {\n            return [].concat(this.purecloudBaseUri, path).join('/');\n        }\n    },\n\n    pcV2Uri(path) {\n        return [].concat(this.purecloudV2BaseUri, path).join('/');\n    },\n\n    pcAuthUri(path) {\n        return [].concat(this.authUri, path).join('/');\n    },\n\n    localGCBAUri(path, port) {\n        return `https://127.0.0.1:${port}/${path}`;\n    },\n\n    changePreferredLanguage(lang) {\n        const path = this.uri(['api/v2/preferredLanguage']);\n        return request(path, {\n            type: 'post',\n            data: JSON.stringify({ lang })\n        }).then(() => {\n            window.location.reload(true);\n        });\n    },\n\n    iframed() {\n        try {\n            return window.self !== window.top;\n        } catch (error) {\n            return true;\n        }\n    },\n\n    sendDiagnostics(data) {\n        return this._sendDiagnostics(data, 'diagnostics');\n    },\n\n    sendFeedback(data) {\n        return this._sendDiagnostics(data, 'diagnostics/support');\n    },\n\n    checkForMobile: on('init', function () {\n        if (\n            /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|Tablet|Silk/i.test(\n                navigator.userAgent\n            )\n        ) {\n            return this.set('isMobile', true);\n        } else {\n            return this.set('isMobile', false);\n        }\n    }),\n\n    isMobilePhone: computed('isMobile', function () {\n        if (/Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini|Silk/i.test(navigator.userAgent)) {\n            return true;\n        } else {\n            return false;\n        }\n    }),\n\n    showTinyNavMenu: or('belowMobileThreshold', 'isMobilePhone'),\n\n    showContextualHelp: computed('showTinyNavMenu', function () {\n        const person = this.get('session.person');\n        return this.showTinyNavMenu && (person.get('isEngageAgent') || person.get('isAdmin'));\n    }),\n\n    isPopout: computed('isPef', 'currentRouteName', function () {\n        if (this.isPef) {\n            return true;\n        }\n\n        const route = this.currentRouteName;\n        const popoutRoutes = [\n            'chat-room',\n            'screen-share',\n            // TODO: Remove interactions route from popout\n            // The interactions route has historically been considered a popout\n            // route; however, I don't believe it's used in any production\n            // capacity which is reinforced by the currently broken styles.\n            // I suspect the interactions route will be repurposed for the AgentUI\n            // decomp and/or IA.  When that happens, we should remove this from the\n            // popout computed.  Ultimately, the popout concept needs to be reworked\n            // as well.\n            'interactions',\n            'phone',\n            'engage.quality.quality.interactions.screen-recordings',\n            'center-stage-frame-screenRecordingPlayback.internal'\n        ];\n        return popoutRoutes.includes(route);\n    }),\n\n    isScreenRecordingPopout: computed('currentRouteName', function () {\n        const route = this.currentRouteName;\n        const popoutRoutes = [\n            'engage.quality.quality.interactions.screen-recordings',\n            'center-stage-frame-screenRecordingPlayback.internal'\n        ];\n        return popoutRoutes.includes(route);\n    }),\n\n    /**\n     * Indicates if we're in the legacy, PEF-specific route used for embedding inside\n     * of other CRMs (aka the embedded framework).\n     *\n     * PEF embed support will be removed with MP and replaced by direct usage of the\n     * appsv2 apps externally.  Uses of this computed should be strictly limited to\n     * cases where behavior must diverge between standard CX and PEF mode.\n     * Furthermore, this computed should not be used within the MP/v2 fork of\n     * interactions as it's inherently checked.  If an interaction sub-view is\n     * shared between v1 and v2, then this computed can be used.\n     */\n    isPef: computed('currentRouteName', function () {\n        return this.currentRouteName === 'interaction';\n    }),\n\n    /**\n     * PEF embed support will be removed with MP and replaced by direct usage of the\n     * appsv2 apps.  This computed can be used, however, it should not be used within\n     * the MP/v2 fork of interactions as it's inherently checked.  If an interaction\n     * sub-view is shared between v1 and v2, then this computed can be used.\n     *\n     * @deprecated Use isPef for PEF detection (note that embedded PEF is also\n     * soon to be removed).  A separate `isInteractionsPopout` utility shouldn't be needed,\n     * but a separate computed can be added if deemed necessary in the future.\n     */\n    isInteractionPopout: computed('currentRouteName', function () {\n        const route = this.currentRouteName;\n        const popoutRoutes = ['interaction', 'interactions'];\n        return popoutRoutes.includes(route);\n    }),\n\n    isAdminRoute: computed('currentRouteName', function () {\n        const route = this.currentRouteName;\n\n        if (!route) {\n            return false;\n        }\n\n        if (route === 'engage.embedded') {\n            return window.location.hash.toLowerCase().includes('admin');\n        }\n\n        const adminRoutes = [\n            'admin',\n            'billing.upgrades',\n            'people-permissions.people-permissions.auth-orgs.access-to-my-org',\n            'center-stage-frame-topicDefinitionsV2',\n            'center-stage-frame-programsDefinitions',\n            'center-stage-frame-quality',\n            'center-stage-frame-staSettings',\n            'center-stage-frame-dictionaryFeedback',\n            'center-stage-frame-sentimentFeedback',\n            'center-stage-frame-staCategoryDefinitions',\n            'center-stage-frame-agentChecklistsUi',\n            'center-stage-frame-anomalyDetection.internal',\n            'center-stage-frame-reprocessInteractions',\n            'center-stage-frame-learningModules',\n            'center-stage-frame-manageUserRulesUi',\n            'center-stage-frame-wfmSupervisor',\n            'center-stage-frame-wfmActivityPlanner',\n            'center-stage-frame-wfmMainForecast',\n            'center-stage-frame-wfmForecasts',\n            'center-stage-frame-wfmHistoricalDataImport',\n            'center-stage-frame-wfmStaffingGroup',\n            'center-stage-frame-wfmWorkplans',\n            'center-stage-frame-decisionMetrics',\n            'center-stage-frame-wfmTimeOff',\n            'center-stage-frame-outbound',\n            'center-stage-frame-voiceNumberManagement',\n            'center-stage-frame-voiceNumberRedirection',\n            'center-stage-frame-voicePrefixBlocking',\n            'center-stage-frame-smsNumberInventory',\n            'center-stage-frame-wfmCapacityPlanning',\n            'center-stage-frame-wfmOpportunities',\n            'center-stage-frame-rtsConfig',\n            'center-stage-frame-usersUi',\n            'center-stage-frame-integrations'\n        ];\n        return adminRoutes.some(r => route.search(r) === 0);\n    }),\n\n    _sendDiagnostics(data, uri) {\n        const url = this.pcUri(`api/v2/${uri}`);\n        function successHandler(responseData) {\n            console.debug('applicationService: sendFeedback', { id: responseData.id });\n            return responseData;\n        }\n        function errorHandler(err) {\n            Ember.onerror(err);\n            return err;\n        }\n        return this.ajax\n            .post(url, {\n                contentType: 'application/json; charset=UTF-8',\n                dataType: 'json',\n                data: JSON.stringify(data)\n            })\n            .then(successHandler)\n            .catch(errorHandler);\n    },\n\n    setBridgeConfiguration(type, data) {\n        return (BRIDGE_CONFIGURATION[type] = data);\n    },\n\n    checkForDebugMode() {\n        const cookies = this.cookies;\n        var params = this.getQueryParams();\n        var debugCookie = cookies.read(COOKIES.debug);\n\n        if (params[COOKIES.debug] !== undefined) {\n            this.set('debug', true);\n            cookies.write(COOKIES.debug, true);\n        } else if (debugCookie) {\n            this.set('debug', true);\n        }\n\n        if (this.debug) {\n            this.buildDebugSettings();\n        }\n    },\n\n    buildDebugSettings() {\n        const cookies = this.cookies;\n        const params = this.getQueryParams();\n\n        var orgName = params[COOKIES.debugOrgName],\n            orgNameCookie = cookies.read(COOKIES.debugOrgName);\n\n        var readOnly = params[COOKIES.debugAppModeReadOnly],\n            readOnlyCookie = cookies.read(COOKIES.debugAppModeReadOnly);\n\n        if (orgName !== undefined && orgName.length > 0) {\n            this.set('debugSettings.orgName', orgName);\n            cookies.write(COOKIES.debugOrgName, orgName);\n        } else if (orgNameCookie) {\n            this.set('debugSettings.orgName', orgNameCookie);\n        }\n\n        if (readOnly !== undefined) {\n            this.set('debugSettings.readOnly', true);\n            cookies.write(COOKIES.debugAppModeReadOnly, true);\n        } else if (readOnlyCookie) {\n            this.set('debugSettings.readOnly', true);\n        }\n    },\n\n    getQueryParams() {\n        const obj = {};\n        const params = window.location.search.slice(1).split('&');\n\n        _.each(params, function (param) {\n            const split = param.split('=');\n            obj[split[0]] = split.length > 1 ? split[1] : '';\n        });\n\n        return obj;\n    }\n});\n","import EmberObject from '@ember/object';\nimport RSVP from 'rsvp';\nimport AppInstance from '../../models/app-instance';\n\nexport const SET_ATTENTION_COUNT_API_ACTION_NAME = 'setAttentionCount';\n\nconst AttentionCountHandler = EmberObject.extend({\n    /**\n     * Synchronous check to see if this handler is applicable for the specified AppApiCall instance\n     *\n     * @param {Object} the AppApiCall instance to check if this handler can handle\n     *\n     * @returns true if the provided AppApiCall instance could be handled by this handler. This check should\n     *  be limited to checking if the handler is responsible for this type of AppApiCall rather than if the\n     *  payload itself is valid.  If no handler returns true, the error will be that no handler exists which is\n     *  a different case than the AppApiCall is invalie. Practically, this means that validation of the payload\n     *  should be done in the handle method\n     */\n    canHandle(appApiCall) {\n        return appApiCall.get('action') === SET_ATTENTION_COUNT_API_ACTION_NAME;\n    },\n\n    handle(appApiCall) {\n        return new RSVP.Promise((resolve, reject) => {\n            const appInstance = appApiCall.get('srcAppInstance');\n            if (!appInstance) {\n                reject('No appInstance provided');\n                return;\n            }\n            if (!(appInstance instanceof AppInstance)) {\n                reject('Invalid appInstance provided');\n                return;\n            }\n            let count = appApiCall.get('actionDetails.count');\n            if (typeof count !== 'number') {\n                reject('You must provide an integer count property to set the notification count');\n                return;\n            }\n            if (count < 0) {\n                reject('You must provide a count property >= 0 to set the notification count');\n                return;\n            }\n            appInstance.set('attentionCount', count);\n            return resolve();\n        });\n    }\n});\n\nexport default AttentionCountHandler;\n","import { inject as service } from '@ember/service';\nimport EmberObject from '@ember/object';\nimport RSVP from 'rsvp';\nimport { getOwner } from '@ember/application';\nimport { typeOf } from '@ember/utils';\n\nexport const SHOW_PROFILE_APP_API_ACTION_NAME = 'showProfile';\nexport const SHOW_GROUP_APP_API_ACTION_NAME = 'showGroup';\n\nconst DirectoryNavHandler = EmberObject.extend({\n    session: service(),\n    routerService: null,\n\n    init() {\n        this._super(...arguments);\n        this.set('routerService', getOwner(this).lookup('router:main'));\n    },\n\n    /**\n     * Synchronous check to see if this handler is applicable for the specified AppApiCall instance\n     *\n     * @param {Object} the AppApiCall instance to check if this handler can handle\n     *\n     * @returns true if the provided AppApiCall instance could be handled by this handler. This check should\n     *  be limited to checking if the handler is responsible for this type of AppApiCall rather than if the\n     *  payload itself is valid.  If no handler returns true, the error will be that no handler exists which is\n     *  a different case than the AppApiCall is invalid. Practically, this means that validation of the payload\n     *  should be done in the handle method\n     */\n    canHandle(appApiCall) {\n        return (\n            appApiCall.get('action') === SHOW_PROFILE_APP_API_ACTION_NAME ||\n            appApiCall.get('action') === SHOW_GROUP_APP_API_ACTION_NAME\n        );\n    },\n\n    handle(appApiCall) {\n        if (appApiCall.get('action') === SHOW_PROFILE_APP_API_ACTION_NAME) {\n            return this._handleShowProfile(appApiCall);\n        } else if (appApiCall.get('action') === SHOW_GROUP_APP_API_ACTION_NAME) {\n            return this._handleShowGroup(appApiCall);\n        }\n    },\n\n    _handleShowProfile(appApiCall) {\n        return new RSVP.Promise((resolve, reject) => {\n            const { profileId } = appApiCall.get('actionDetails');\n            if (!profileId) {\n                reject('profileId not found');\n                return;\n            }\n            if (typeOf(profileId) !== 'string') {\n                reject('profileId is not a string');\n                return;\n            }\n\n            const routerService = this.routerService;\n            if (!routerService) {\n                reject('Handler Error: router not found');\n                return;\n            }\n\n            routerService.transitionTo(`/person-v2/${profileId}`);\n            return resolve();\n        });\n    },\n\n    _handleShowGroup(appApiCall) {\n        return new RSVP.Promise((resolve, reject) => {\n            const { groupId } = appApiCall.get('actionDetails');\n            if (!groupId) {\n                reject('groupId not found');\n                return;\n            }\n            if (typeOf(groupId) !== 'string') {\n                reject('groupId is not a string');\n                return;\n            }\n\n            const routerService = this.routerService;\n            if (!routerService) {\n                reject('Handler Error: router not found');\n                return;\n            }\n\n            routerService.transitionTo(`/group-v2/${groupId}`);\n            return resolve();\n        });\n    }\n});\n\nexport default DirectoryNavHandler;\n","import { inject as service } from '@ember/service';\nimport EmberObject from '@ember/object';\nimport RSVP from 'rsvp';\nimport { getOwner } from '@ember/application';\nimport { typeOf } from '@ember/utils';\n\nexport const SHOW_EXTERNAL_CONTACT_PROFILE = 'showExternalContactProfile';\nexport const SHOW_EXTERNAL_ORGANIZATION_PROFILE = 'showExternalOrganizationProfile';\n\nconst ExternalContactsApiHandler = EmberObject.extend({\n    sidebar: service(),\n    permissions: service(),\n    ajax: service(),\n    application: service(),\n    routerService: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.set('routerService', getOwner(this).lookup('router:main'));\n    },\n\n    /**\n     * Synchronous check to see if this handler is applicable for the specified AppApiCall instance\n     *\n     * @param {Object} the AppApiCall instance to check if this handler can handle\n     *\n     * @returns true if the provided AppApiCall instance could be handled by this handler. This check should\n     *  be limited to checking if the handler is responsible for this type of AppApiCall rather than if the\n     *  payload itself is valid.  If no handler returns true, the error will be that no handler exists which is\n     *  a different case than the AppApiCall is invalie. Practically, this means that validation of the payload\n     *  should be done in the handle method\n     */\n    canHandle(appApiCall) {\n        return (\n            appApiCall.get('action') === SHOW_EXTERNAL_CONTACT_PROFILE ||\n            appApiCall.get('action') === SHOW_EXTERNAL_ORGANIZATION_PROFILE\n        );\n    },\n\n    /**\n     * Handle the AppApiCall instance pre-filtered by canHandle\n     *\n     * @param {Object} An AppApiCall instance\n     *\n     * @returns A Promise resolving if the api action was successfully handled or rejecting with\n     *  optional details as to why the event could not be handled.\n     */\n    handle(appApiCall) {\n        if (appApiCall.get('action') === SHOW_EXTERNAL_CONTACT_PROFILE) {\n            return this._handleShowExternalProfile(appApiCall);\n        } else if (appApiCall.get('action') === SHOW_EXTERNAL_ORGANIZATION_PROFILE) {\n            return this._handleShowExternalOrganizationProfile(appApiCall);\n        }\n    },\n\n    _handleShowExternalProfile({ actionDetails: apiActionDetails }) {\n        return new RSVP.Promise((resolve, reject) => {\n            if (\n                !apiActionDetails ||\n                typeOf(apiActionDetails.contactId) != 'string' ||\n                apiActionDetails.contactId.trim().length <= 0\n            ) {\n                reject('Missing/Invalid contactId provided');\n                return;\n            }\n\n            const routerService = this.routerService;\n            if (!routerService || !routerService.transitionTo) {\n                reject('Handler Error: router not found');\n                return;\n            }\n\n            const permissionService = this.permissions;\n            if (!permissionService.get('hasExternalContactsViewContactAccess')) {\n                reject('Insufficient permissions for viewing External Contacts');\n                return;\n            }\n\n            this._ajaxGetExternalContactProfile(apiActionDetails.contactId)\n                .then(() => {\n                    routerService.transitionTo(\n                        `/contactsAndOrganizations/contact/${encodeURIComponent(apiActionDetails.contactId)}`\n                    );\n                    this.sidebar.ensureRouteVisibility();\n                    resolve();\n                })\n                .catch(reason => {\n                    if (reason.status === 404) {\n                        reject('Contact does not exist.');\n                    } else if (reason.status === 403) {\n                        reject('User not authorized to view this contact');\n                    } else {\n                        reject(\n                            `Failed to fetch contact. Error status: ${reason.status} object: ${JSON.stringify(reason)}`\n                        );\n                    }\n                });\n        });\n    },\n\n    _handleShowExternalOrganizationProfile({ actionDetails: apiActionDetails }) {\n        return new RSVP.Promise((resolve, reject) => {\n            if (\n                !apiActionDetails ||\n                typeOf(apiActionDetails.externalOrganizationId) != 'string' ||\n                apiActionDetails.externalOrganizationId.trim().length <= 0\n            ) {\n                reject('Missing/Invalid externalOrganizationId provided');\n                return;\n            }\n\n            const routerService = this.routerService;\n            if (!routerService || !routerService.transitionTo) {\n                reject('Handler Error: router not found');\n                return;\n            }\n\n            const permissionService = this.permissions;\n            if (!permissionService.get('hasExternalContactsViewOrganizationAccess')) {\n                reject('Insufficient permissions for viewing External Organizations');\n                return;\n            }\n\n            this._ajaxGetExternalOrganizationProfile(apiActionDetails.externalOrganizationId)\n                .then(() => {\n                    routerService.transitionTo(\n                        `/contactsAndOrganizations/organization/${encodeURIComponent(\n                            apiActionDetails.externalOrganizationId\n                        )}`\n                    );\n                    this.sidebar.ensureRouteVisibility();\n                    resolve();\n                })\n                .catch(reason => {\n                    if (reason.status === 404) {\n                        reject('Organization does not exist.');\n                    } else if (reason.status === 403) {\n                        reject('User not authorized to view this organization');\n                    } else {\n                        reject(\n                            `Failed to fetch organization. Error status: ${reason.status} object: ${JSON.stringify(\n                                reason\n                            )}`\n                        );\n                    }\n                });\n        });\n    },\n\n    _ajaxGetExternalOrganizationProfile(externalOrganizationId) {\n        let orgUrl = `api/v2/externalcontacts/organizations/${encodeURIComponent(externalOrganizationId)}`;\n        orgUrl = this.application.pcV2Uri(orgUrl);\n        return this.ajax.ajaxGet(orgUrl);\n    },\n\n    _ajaxGetExternalContactProfile(contactId) {\n        let contactUrl = `api/v2/externalcontacts/contacts/${encodeURIComponent(contactId)}`;\n        contactUrl = this.application.pcV2Uri(contactUrl);\n        return this.ajax.ajaxGet(contactUrl);\n    }\n});\n\nexport default ExternalContactsApiHandler;\n","import EmberObject from '@ember/object';\nimport RSVP from 'rsvp';\nimport AppInstance, { APP_LIFECYCLE_CALLBACKS } from '../../models/app-instance';\n\nexport const APP_STOPPED_API_ACTION_NAME = APP_LIFECYCLE_CALLBACKS.STOPPED;\nexport const APP_BOOTSTRAPPED_API_ACTION_NAME = APP_LIFECYCLE_CALLBACKS.BOOTSTRAPPED;\n\nconst LifecycleHandler = EmberObject.extend({\n    /**\n     * Synchronous check to see if this handler is applicable for the specified AppApiCall instance\n     *\n     * @param {Object} the AppApiCall instance to check if this handler can handle\n     *\n     * @returns true if the provided AppApiCall instance could be handled by this handler. This check should\n     *  be limited to checking if the handler is responsible for this type of AppApiCall rather than if the\n     *  payload itself is valid.  If no handler returns true, the error will be that no handler exists which is\n     *  a different case than the AppApiCall is invalie. Practically, this means that validation of the payload\n     *  should be done in the handle method\n     */\n    canHandle(appApiCall) {\n        return (\n            appApiCall.get('action') === APP_STOPPED_API_ACTION_NAME ||\n            appApiCall.get('action') === APP_BOOTSTRAPPED_API_ACTION_NAME\n        );\n    },\n\n    handle(appApiCall) {\n        return new RSVP.Promise((resolve, reject) => {\n            let appInstance = appApiCall.get('srcAppInstance');\n            if (!appInstance) {\n                reject('No AppInstance provided');\n                return;\n            }\n            if (!(appInstance instanceof AppInstance)) {\n                reject('Invalid AppInstance provided');\n                return;\n            }\n            let action = appApiCall.get('action');\n            if (action === APP_STOPPED_API_ACTION_NAME) {\n                appInstance.stopped();\n            } else if (action === APP_BOOTSTRAPPED_API_ACTION_NAME) {\n                appInstance.bootstrapped();\n            }\n            return resolve();\n        });\n    }\n});\n\nexport default LifecycleHandler;\n","import { inject as service } from '@ember/service';\nimport EmberObject from '@ember/object';\nimport RSVP from 'rsvp';\nimport { typeOf } from '@ember/utils';\n\nexport const SHOW_MY_INTERACTION_DETAILS = 'showMyInteractionDetails';\nexport const SHOW_MY_EVALUATION_DETAILS = 'showMyEvaluationDetails';\n\nconst MyInteractionsApiHandler = EmberObject.extend({\n    session: service(),\n    permissions: service(),\n    ajax: service(),\n    application: service(),\n    _window: window, // Exposed for test assertions\n\n    /**\n     * Synchronous check to see if this handler is applicable for the specified AppApiCall instance\n     *\n     * @param {Object} the AppApiCall instance to check if this handler can handle\n     *\n     * @returns true if the provided AppApiCall instance could be handled by this handler. This check should\n     *  be limited to checking if the handler is responsible for this type of AppApiCall rather than if the\n     *  payload itself is valid.  If no handler returns true, the error will be that no handler exists which is\n     *  a different case than the AppApiCall is invalie. Practically, this means that validation of the payload\n     *  should be done in the handle method\n     */\n    canHandle(appApiCall) {\n        return (\n            appApiCall.get('action') === SHOW_MY_INTERACTION_DETAILS ||\n            appApiCall.get('action') === SHOW_MY_EVALUATION_DETAILS\n        );\n    },\n\n    /**\n     * Handle the AppApiCall instance pre-filtered by canHandle\n     *\n     * @param {Object} An AppApiCall instance\n     *\n     * @returns A Promise resolving if the api action was successfully handled or rejecting with\n     *  optional details as to why the event could not be handled.\n     */\n    handle(appApiCall) {\n        if (appApiCall.get('action') === SHOW_MY_INTERACTION_DETAILS) {\n            return this._handleShowInteractionDetails(appApiCall);\n        } else if (appApiCall.get('action') === SHOW_MY_EVALUATION_DETAILS) {\n            return this._handleShowEvaluation(appApiCall);\n        }\n    },\n\n    _handleShowInteractionDetails({ actionDetails: apiActionDetails }) {\n        return new RSVP.Promise((resolve, reject) => {\n            if (\n                !apiActionDetails ||\n                typeOf(apiActionDetails.conversationId) !== 'string' ||\n                apiActionDetails.conversationId.trim().length <= 0\n            ) {\n                reject('Missing/Invalid conversationId provided');\n                return;\n            }\n\n            this._ajaxGetConversations(apiActionDetails.conversationId)\n                .then(response => {\n                    const participants = response.participants;\n                    const isParticipant = participants.some(participant => {\n                        const userId = this.get('session.person.guid');\n                        return participant.purpose === 'agent' && participant.userId === userId;\n                    });\n                    if (!isParticipant) {\n                        reject('Not my conversation!');\n                    } else {\n                        this._navToInteractionRoute(apiActionDetails.conversationId);\n                        resolve();\n                    }\n                })\n                .catch(reason => {\n                    if (reason.status === 404) {\n                        reject(\"Conversation doesn't exist!\");\n                    } else if (reason.status === 403) {\n                        reject('User not authorized to view the conversation!');\n                    } else {\n                        reject('Failed to fetch conversation. Error status: ' + reason.status);\n                    }\n                });\n        });\n    },\n\n    _handleShowEvaluation({ actionDetails: apiActionDetails }) {\n        return new RSVP.Promise((resolve, reject) => {\n            if (\n                !apiActionDetails ||\n                typeOf(apiActionDetails.conversationId) !== 'string' ||\n                apiActionDetails.conversationId.trim().length <= 0 ||\n                typeOf(apiActionDetails.evaluationId) !== 'string' ||\n                apiActionDetails.evaluationId.trim().length <= 0\n            ) {\n                reject('Missing/Invalid conversationId or evaluationId provided');\n                return;\n            }\n\n            const permissionsService = this.permissions;\n            if (!permissionsService.get('hasViewEvaluationAccess')) {\n                reject('Insufficient permissions for Evaluation View');\n                return;\n            }\n\n            this._ajaxGetEvaluation(apiActionDetails.conversationId, apiActionDetails.evaluationId)\n                .then(response => {\n                    if (response.agent.id !== this.get('session.person.guid')) {\n                        reject('Not my evaluation!');\n                    } else {\n                        this._navToInteractionRoute(apiActionDetails.conversationId, apiActionDetails.evaluationId);\n                        resolve();\n                    }\n                })\n                .catch(reason => {\n                    if (reason.status === 404) {\n                        reject(\"Evaluation doesn't exist!\");\n                    } else if (reason.status === 403) {\n                        reject('User not authorized to view the evaluation!');\n                    } else {\n                        reject('Failed to fetch evaluation. Error status: ' + reason.status);\n                    }\n                });\n        });\n    },\n\n    _ajaxGetConversations(conversationId) {\n        let conversationUrl = `api/v2/conversations/${encodeURIComponent(conversationId)}`;\n        conversationUrl = this.application.pcV2Uri(conversationUrl);\n        return this.ajax.ajaxGet(conversationUrl);\n    },\n\n    _ajaxGetEvaluation(conversationId, evaluationId) {\n        let evaluationUrl =\n            `api/v2/quality/conversations/` +\n            `${encodeURIComponent(conversationId)}/evaluations/${encodeURIComponent(evaluationId)}`;\n        evaluationUrl = this.application.pcV2Uri(evaluationUrl);\n        return this.ajax.ajaxGet(evaluationUrl);\n    },\n\n    _navToInteractionRoute(conversationId, evaluationId) {\n        let routePath = `#/engage/agent/interactions/${encodeURIComponent(conversationId)}`;\n        if (evaluationId) {\n            routePath += `/?evaluationId=${encodeURIComponent(evaluationId)}`;\n        }\n\n        this._window.location.assign(routePath);\n    }\n});\n\nexport default MyInteractionsApiHandler;\n","import EmberObject from '@ember/object';\nimport RSVP from 'rsvp';\nimport { typeOf } from '@ember/utils';\nimport InternallyHostedApp from '../../models/internally-hosted-app';\n\nexport const OPEN_PANEL_API_ACTION_NAME = 'openInteractionPanel';\nexport const openPanelDemoAppURL = new URL(\n    'https://inin-index-files-dev.s3.amazonaws.com/demo-client-apps/internal/openInteractionPanelDemo.html'\n);\n\nconst OpenPanelHandler = EmberObject.extend({\n    /**\n     * Synchronous check to see if this handler is applicable for the specified AppApiCall instance\n     *\n     * @param {Object} the AppApiCall instance to check if this handler can handle\n     *\n     * @returns true if the provided AppApiCall instance could be handled by this handler. This check should\n     *  be limited to checking if the handler is responsible for this type of AppApiCall rather than if the\n     *  payload itself is valid.  If no handler returns true, the error will be that no handler exists which is\n     *  a different case than the AppApiCall is invalie. Practically, this means that validation of the payload\n     *  should be done in the handle method\n     */\n    canHandle(appApiCall) {\n        return appApiCall.get('action') === OPEN_PANEL_API_ACTION_NAME;\n    },\n\n    handle(appApiCall) {\n        return new RSVP.Promise((resolve, reject) => {\n            const app = appApiCall.get('srcApp');\n\n            if (!this.isActiveInterapption(appApiCall.get('srcApp.id'))) {\n                reject('This app is not the active interapption');\n                return;\n            }\n\n            if (!(app instanceof InternallyHostedApp)) {\n                if (!app.urlTemplate) {\n                    reject('This app is not internally hosted');\n                    return;\n                }\n                try {\n                    const appURL = new URL(app.urlTemplate);\n                    if (\n                        !(\n                            appURL.origin === openPanelDemoAppURL.origin &&\n                            appURL.pathname === openPanelDemoAppURL.pathname\n                        )\n                    ) {\n                        reject('This app is not internally hosted');\n                        return;\n                    }\n                } catch (error) {\n                    {\n                        reject('This app is not internally hosted');\n                        return;\n                    }\n                }\n            }\n\n            let panelId = appApiCall.get('actionDetails.panelId');\n            if (panelId && typeOf(panelId) === 'string') {\n                panelId = panelId.trim();\n                if (panelId === '') {\n                    reject('Panel must be a non-empty string');\n                    return;\n                }\n                this.openPanel(panelId);\n                return resolve();\n            } else {\n                reject('Panel must be a non-empty string');\n                return;\n            }\n        });\n    }\n});\n\nexport default OpenPanelHandler;\n","import { inject as service } from '@ember/service';\nimport EmberObject from '@ember/object';\nimport RSVP from 'rsvp';\nimport { typeOf } from '@ember/utils';\nimport InternallyHostedApp from '../../models/internally-hosted-app';\nimport { isKnown } from '@genesys/service-discovery-web-internal';\n\nexport const OPEN_WINDOW_API_ACTION_NAME = 'openWindow';\n\nconst OpenWindowHandler = EmberObject.extend({\n    session: service(),\n\n    init() {\n        this._super(...arguments);\n    },\n\n    /**\n     * Synchronous check to see if this handler is applicable for the specified AppApiCall instance\n     *\n     * @param {Object} the AppApiCall instance to check if this handler can handle\n     *\n     * @returns true if the provided AppApiCall instance could be handled by this handler. This check should\n     *  be limited to checking if the handler is responsible for this type of AppApiCall rather than if the\n     *  payload itself is valid.  If no handler returns true, the error will be that no handler exists which is\n     *  a different case than the AppApiCall is invalid. Practically, this means that validation of the payload\n     *  should be done in the handle method\n     */\n    canHandle(appApiCall) {\n        return appApiCall.get('action') === OPEN_WINDOW_API_ACTION_NAME;\n    },\n\n    handle(appApiCall) {\n        return new RSVP.Promise((resolve, reject) => {\n            const { targetUrl } = appApiCall.get('actionDetails');\n\n            if (!targetUrl) {\n                reject('targetUrl not found');\n                return;\n            }\n            if (typeOf(targetUrl) !== 'string' || targetUrl === '') {\n                reject('targetUrl must be a non-empty string');\n                return;\n            }\n            const app = appApiCall.get('srcApp');\n            if (!this.isActiveApp(app.id)) {\n                reject('The source app must be focused');\n                return;\n            }\n\n            let isKnownUrl = false;\n            try {\n                isKnownUrl = isKnown(targetUrl, {});\n            } catch (error) {\n                reject('Unable to parse targetUrl');\n                return;\n            }\n            if (isKnownUrl && !(app instanceof InternallyHostedApp)) {\n                reject('The source app must be internally hosted to open an internal link');\n                return;\n            }\n\n            window.open(targetUrl, '_blank', 'noopener, noreferrer');\n            return resolve();\n        });\n    }\n});\n\nexport default OpenWindowHandler;\n","import EmberObject from '@ember/object';\nimport RSVP from 'rsvp';\nimport { typeOf } from '@ember/utils';\nimport * as GAST from '@genesys/ast';\nimport Ember from 'ember';\n\nexport const VALID_INJECTION_MODES = ['insert'];\n\nexport const PROPOSE_MESSAGE_API_ACTION_NAME = 'proposeInteractionMessage';\n\nconst ProposeMessageHandler = EmberObject.extend({\n    /**\n     * Synchronous check to see if this handler is applicable for the specified AppApiCall instance\n     *\n     * @param {Object} the AppApiCall instance to check if this handler can handle\n     *\n     * @returns true if the provided AppApiCall instance could be handled by this handler. This check should\n     *  be limited to checking if the handler is responsible for this type of AppApiCall rather than if the\n     *  payload itself is valid.  If no handler returns true, the error will be that no handler exists which is\n     *  a different case than the AppApiCall is invalie. Practically, this means that validation of the payload\n     *  should be done in the handle method\n     */\n    canHandle(appApiCall) {\n        return appApiCall.get('action') === PROPOSE_MESSAGE_API_ACTION_NAME;\n    },\n\n    handle(appApiCall) {\n        return new RSVP.Promise((resolve, reject) => {\n            if (!this.isActiveInterapption(appApiCall.get('srcApp.id'))) {\n                reject('This app is not the active interapption');\n                return;\n            }\n\n            const text = appApiCall.get('actionDetails.message');\n            if (!text || typeOf(text) !== 'string') {\n                reject('Message text must be a non-empty string');\n                return;\n            }\n\n            const mode = appApiCall.get('actionDetails.mode');\n            if (!VALID_INJECTION_MODES.includes(mode)) {\n                reject(`Injection mode must be one of: ${VALID_INJECTION_MODES.join(', ')}`);\n                return;\n            }\n\n            const interaction = this.getInteraction();\n            if (!interaction.get('isConnected')) {\n                reject('The interaction is not in a connected state');\n                return;\n            }\n\n            // Check if we have Appsv2 AST support on the current conversation\n            const offerMessage = this.offerMessage;\n            if (offerMessage && typeof offerMessage === 'function') {\n                // Build a simple text AST to be offered\n                const astResult = GAST.Text.convertToAST(text);\n                if (astResult.type === 'failure') {\n                    // Currently, text based AST conversation cannot fail;\n                    // handling as it's technically part of the API.\n                    reject('Failed to generate AST from propose text');\n                    return;\n                }\n\n                offerMessage({\n                    // insert is the only valid injectionMode for v1\n                    injectionMode: 'insert',\n                    proposedMessage: {\n                        format: 'text',\n                        tree: astResult.tree\n                    }\n                });\n\n                return resolve();\n            }\n\n            // Only handles 'insert' mode which injects the text at the agent's cursor position,\n            // leaving the existing text intact.\n            if (interaction.get('isChat')) {\n                this.insertChatText(text);\n            } else if (interaction.get('isSms')) {\n                this.insertSmsText({ strippedText: text });\n            } else if (interaction.get('isEmail')) {\n                // Need to escape HTML chars for email injection (uses innerHTML under the hood)\n                this.insertEmailText(Ember.Handlebars.Utils.escapeExpression(text));\n            } else {\n                reject(`Unsupported interaction type: ${interaction.get('type')}`);\n                return;\n            }\n\n            return resolve();\n        });\n    }\n});\n\nexport default ProposeMessageHandler;\n","import { inject as service } from '@ember/service';\nimport EmberObject from '@ember/object';\nimport RSVP from 'rsvp';\n\nexport const SHOW_HELP_APP_API_ACTION_NAME = 'showHelp';\nexport const HIDE_HELP_APP_API_ACTION_NAME = 'hideHelp';\nexport const SHOW_RC_ARTIFACT_APP_API_ACTION_NAME = 'showResourceCenterArtifact';\n\nconst HELP_PANEL_NAME = 'help';\n\nexport default EmberObject.extend({\n    help: service(),\n    session: service(),\n    sidebar: service(),\n    commandNav: service('command-nav'),\n\n    /**\n     * Synchronous check to see if this handler is applicable for the specified AppApiCall instance\n     *\n     * @param {Object} the AppApiCall instance to check if this handler can handle\n     *\n     * @returns true if the provided AppApiCall instance could be handled by this handler. This check should\n     *  be limited to checking if the handler is responsible for this type of AppApiCall rather than if the\n     *  payload itself is valid.  If no handler returns true, the error will be that no handler exists which is\n     *  a different case than the AppApiCall is invalie. Practically, this means that validation of the payload\n     *  should be done in the handle method\n     */\n    canHandle(appApiCall) {\n        const apiAction = appApiCall.get('action');\n\n        return (\n            apiAction === SHOW_HELP_APP_API_ACTION_NAME ||\n            apiAction === HIDE_HELP_APP_API_ACTION_NAME ||\n            apiAction === SHOW_RC_ARTIFACT_APP_API_ACTION_NAME\n        );\n    },\n\n    /**\n     * Handle the AppApiCall instance pre-filtered by canHandle\n     *\n     * @param {Object} An AppApiCall instance\n     *\n     * @returns A Promise resolving if the api action was successfully handled or rejecting with\n     *  optional details as to why the event could not be handled.\n     */\n    handle(appApiCall) {\n        const apiAction = appApiCall.get('action');\n\n        if (apiAction === SHOW_HELP_APP_API_ACTION_NAME) {\n            if (this.get('session.useNewNav')) {\n                this.commandNav.selectPanel('help');\n            } else {\n                this.sidebar.openPanel(HELP_PANEL_NAME);\n            }\n\n            return RSVP.resolve();\n        } else if (apiAction === HIDE_HELP_APP_API_ACTION_NAME) {\n            if (this.get('session.useNewNav')) {\n                if (this.get('commandNav.currentPanel') === 'help') {\n                    this.commandNav.selectPanel('panel-not-active');\n                } else if (this.get('commandNav.currentPanel') === 'panel-not-active') {\n                    this.commandNav.selectPanel('help');\n                }\n            } else {\n                if (this.get('sidebar.communicationPanel') === HELP_PANEL_NAME) {\n                    this.sidebar.togglePanel(HELP_PANEL_NAME);\n                }\n            }\n\n            return RSVP.resolve();\n        } else if (apiAction === SHOW_RC_ARTIFACT_APP_API_ACTION_NAME) {\n            let resourceCenterRelPath = appApiCall.get('actionDetails.resourceCenterRelPath');\n\n            if (typeof resourceCenterRelPath === 'string') {\n                try {\n                    this.help.showResourceCenterArtifact(resourceCenterRelPath);\n\n                    return RSVP.resolve();\n                } catch (e) {\n                    return RSVP.reject(e);\n                }\n            } else {\n                return RSVP.reject('Must supply resourceCenterRelPath to open a resource center panel');\n            }\n        }\n    }\n});\n","import { inject as service } from '@ember/service';\nimport { typeOf } from '@ember/utils';\nimport EmberObject from '@ember/object';\nimport RSVP from 'rsvp';\n\nexport const SHOW_INTERACTION_DETAILS_VIEW = 'showInteractionDetails';\n\nconst ShowInteractionDetailsHandler = EmberObject.extend({\n    permissions: service(),\n    _window: window, // Exposed for test assertions\n\n    /**\n     * Synchronous check to see if this handler is applicable for the specified AppApiCall instance\n     *\n     * @param {Object} the AppApiCall instance to check if this handler can handle\n     *\n     * @returns true if the provided AppApiCall instance could be handled by this handler. This check should\n     *  be limited to checking if the handler is responsible for this type of AppApiCall rather than if the\n     *  payload itself is valid.  If no handler returns true, the error will be that no handler exists which is\n     *  a different case than the AppApiCall is invalid. Practically, this means that validation of the payload\n     *  should be done in the handle method\n     */\n    canHandle(appApiCall) {\n        return appApiCall.get('action') === SHOW_INTERACTION_DETAILS_VIEW;\n    },\n\n    handle(appApiCall) {\n        return new RSVP.Promise((resolve, reject) => {\n            let apiActionDetails = appApiCall.get('actionDetails');\n            const permissionsService = this.permissions;\n\n            if (!permissionsService || !permissionsService.get('canViewInteractionDetails')) {\n                reject('Insufficient permissions for interactions view');\n                return;\n            }\n            if (\n                apiActionDetails &&\n                typeOf(apiActionDetails.conversationId) === 'string' &&\n                apiActionDetails.conversationId.trim().length > 0\n            ) {\n                const routePath = `#/engage/admin/interactions/${encodeURIComponent(apiActionDetails.conversationId)}`;\n                this._window.location.assign(routePath);\n                resolve();\n            } else {\n                reject('Missing/Invalid conversationId provided to view interaction');\n                return;\n            }\n        });\n    }\n});\n\nexport default ShowInteractionDetailsHandler;\n","import { inject as service } from '@ember/service';\nimport EmberObject from '@ember/object';\nimport RSVP from 'rsvp';\nimport pick from 'lodash/pick';\nimport pickBy from 'lodash/pickBy';\nimport mapKeys from 'lodash/mapKeys';\nimport omit from 'lodash/omit';\n\nexport const SHOW_TOAST_APP_API_ACTION_NAME = 'showToast';\n\nconst TOAST_MSG_PROPS = {\n    id: {\n        type: 'string',\n        internalPropName: 'tag'\n    },\n    type: {\n        type: 'enum',\n        values: ['info', 'success', 'error'],\n        required: true\n    },\n    title: {\n        type: 'string',\n        required: true\n    },\n    message: {\n        type: 'string',\n        required: true\n    },\n    markdownMessage: {\n        type: 'boolean',\n        internalPropName: 'markdownToHtml'\n    },\n    timeout: {\n        type: 'int',\n        internalPropName: 'hideAfter'\n    },\n    showCloseButton: {\n        type: 'boolean'\n    },\n    fallbackToInBrowser: {\n        type: 'boolean'\n    },\n    forceBrowserNotification: {\n        type: 'boolean'\n    },\n    showNotificationEverywhere: {\n        type: 'boolean'\n    }\n};\nconst TOAST_MSG_PROP_NAMES = Object.keys(TOAST_MSG_PROPS);\nconst REQUIRED_TOAST_MSG_PROP_NAMES = TOAST_MSG_PROP_NAMES.filter(prop => TOAST_MSG_PROPS[prop].required);\n\nexport default EmberObject.extend({\n    notification: service(),\n    stashLogger: service(),\n\n    /**\n     * Synchronous check to see if this handler is applicable for the specified AppApiCall instance\n     *\n     * @param {Object} the AppApiCall instance to check if this handler can handle\n     *\n     * @returns true if the provided AppApiCall instance could be handled by this handler. This check should\n     *  be limited to checking if the handler is responsible for this type of AppApiCall rather than if the\n     *  payload itself is valid.  If no handler returns true, the error will be that no handler exists which is\n     *  a different case than the AppApiCall is invalie. Practically, this means that validation of the payload\n     *  should be done in the handle method\n     */\n    canHandle(appApiCall) {\n        return appApiCall.get('action') === SHOW_TOAST_APP_API_ACTION_NAME;\n    },\n\n    /**\n     * Handle the AppApiCall instance pre-filtered by canHandle\n     *\n     * @param {Object} An AppApiCall instance\n     *\n     * @returns A Promise resolving if the api action was successfully handled or rejecting with\n     *  optional details as to why the event could not be handled.\n     */\n    handle(appApiCall) {\n        return new RSVP.Promise((resolve, reject) => {\n            const notification = this.notification;\n            const stashLogger = this.stashLogger;\n\n            let appId = appApiCall.get('appId') || 'localApp';\n            let apiActionDetails = appApiCall.get('actionDetails');\n\n            let {\n                errors,\n                invalidProps,\n                ignoredProps,\n                validatedToastData: data\n            } = this._processToastPayload(apiActionDetails);\n\n            if (errors.length > 0) {\n                return reject(errors);\n            }\n\n            if (ignoredProps.length > 0) {\n                let ignored = ignoredProps.join(', ');\n                stashLogger.warn('The following props were ignored from your toast request:', {\n                    props: ignored\n                });\n            }\n\n            if (invalidProps.length > 0) {\n                let ignored = invalidProps.join(', ');\n                stashLogger.warn('The following props were invalid and ignored from your toast request:', {\n                    props: ignored\n                });\n            }\n\n            let fullTag = data.tag ? `${appId}_${data.tag}` : appId;\n            data.tag = fullTag;\n            // Pass appId for telemetry tracking\n            data.appId = appId;\n\n            if (!['info', 'error', 'success'].includes(data.type)) {\n                return reject(`Unsupported notification type: ${data.type}`);\n            }\n\n            notification[data.type](data.title, data.message, data);\n            return resolve();\n        });\n    },\n\n    /**\n     * Filters, renames, and validates the toast message payload\n     *\n     * @returns the filtered, validated, renamed payload (if successful) and:\n     *  errors - unrecoverable errors\n     *  ignoredProps - props not applicable for toast messages\n     *  invalidProps - known props which were not provided in the correct format, etc.\n     */\n    _processToastPayload(apiActionDetails) {\n        let requiredCount = 0;\n        const invalidProps = [];\n        const errors = [];\n\n        const filteredPickData = pick(apiActionDetails, TOAST_MSG_PROP_NAMES);\n        const filteredData = pickBy(filteredPickData, (value, prop) => {\n            const config = TOAST_MSG_PROPS[prop];\n            const result = this._checkPropValid(config, value);\n\n            if (!result) {\n                invalidProps.push(prop);\n            }\n            if (config.required && result) {\n                requiredCount++;\n            }\n\n            return result;\n        });\n\n        if (requiredCount !== REQUIRED_TOAST_MSG_PROP_NAMES.length) {\n            errors.push(\n                'One or more of the following required toast message properties were missing or invalid' +\n                    REQUIRED_TOAST_MSG_PROP_NAMES.join(', ')\n            );\n        }\n\n        if (!filteredData.showCloseButton) {\n            if (filteredData.type === 'error') {\n                errors.push('Toasts with type error must have a close button');\n            } else if (filteredData.timeout === 0) {\n                errors.push('Toast must have either a nonzero timeout or a close button');\n            }\n        }\n\n        const ignoredProps = Object.keys(omit(apiActionDetails, TOAST_MSG_PROP_NAMES));\n        const validatedToastData = errors.length > 0 ? null : this._mapDataToInternalProperties(filteredData);\n\n        return {\n            errors,\n            invalidProps,\n            ignoredProps,\n            validatedToastData\n        };\n    },\n\n    _mapDataToInternalProperties(data) {\n        return mapKeys(data, (value, prop) => TOAST_MSG_PROPS[prop].internalPropName || prop);\n    },\n\n    _checkPropValid(config, value) {\n        if (!config) {\n            return false;\n        }\n\n        switch (config.type) {\n            case 'string':\n                return typeof value === 'string';\n            case 'int':\n                return Number.isFinite(value) && parseInt(value, 10) === value;\n            case 'boolean':\n                return typeof value === 'boolean';\n            case 'enum':\n                return typeof value === 'string' && config.values.includes(value);\n            default:\n                return false;\n        }\n    }\n});\n","import {\n    AppPool,\n    buildChainFailureLogDetails,\n    MessageEnvelope,\n    MessageHandlerChain,\n    RenderedInstanceState,\n    WorkerInstance\n} from '@genesys/apps-v2-host';\nimport { NotificationService, StashLoggerService, StreamingService } from '@web-directory/services';\nimport { AlertingService } from '@web-directory/services/alerting';\nimport { AppContext } from 'web-directory/utils/apps';\nimport { ConversationsMessageHandler } from './conversations-message-handler';\nimport { ConversationsListMessageHandler } from './conversations-list-message-handler';\nimport { HawkMessageHandler } from './hawk-message-handler';\nimport { LegacyMessageHandler, SendLegacyApiCall } from './legacy-message-handler';\nimport { ModalMessageHandler } from './modal-message-handler';\nimport { MonitoringMessageHandler } from './monitoring-message-handler';\nimport { ToastMessageHandler } from './toast-handler';\nimport { addPageAction } from 'web-directory/utils/newrelic';\nimport { OpenWindowHandler } from './open-window-handler';\nimport { OpenPanelHandler } from './open-panel-handler';\n\nexport type GetActiveConversationGroupId = () => string | null;\nexport type GetSelectedInteraction = () => AppContext | null;\nexport type ProposeMessageTools = {\n    insertChatText: (text: string) => void;\n    insertSmsText: (response: { strippedText?: string; structuredMessage?: string }) => void;\n    insertEmailText: (text: string) => void;\n};\nexport type FindInstanceState = (\n    instanceId: string\n) => undefined | { groupId: string; renderedInstanceState: RenderedInstanceState };\n\nexport type FindWorkerInstance = (instanceId: string) => undefined | { workerInstance: WorkerInstance };\n\nexport type OpenPanel = (panelId: string) => void;\n\nexport const buildFindInstanceState =\n    (appPool: AppPool): FindInstanceState =>\n    (instanceId: string) => {\n        for (const [groupId, groupState] of Object.entries(appPool.getPoolState())) {\n            // There should be 1 and only 1 renderedInstance per instanceId;\n            // else it's an invalid instanceId or the instance is completely stopped\n            const renderedInstanceState = groupState.renderedInstances.find(\n                instance => instance.instanceId === instanceId\n            );\n            if (renderedInstanceState) {\n                return {\n                    groupId,\n                    renderedInstanceState\n                };\n            }\n        }\n        return;\n    };\n\nexport const buildFindWorkerInstance =\n    (appPool: AppPool): FindWorkerInstance =>\n    (instanceId: string) => {\n        const workers = appPool.getWorkers();\n        const matchingWorker = workers.find(w => w.instanceId === instanceId);\n        if (matchingWorker) {\n            return {\n                workerInstance: matchingWorker\n            };\n        }\n        return;\n    };\n\nexport type SendMessageToGroup = AppPool['sendMessageToGroup'];\nexport type SendMessageByInstanceId = (\n    msg: Parameters<AppPool['sendMessageByInstanceId']>[0],\n    instanceId: Parameters<AppPool['sendMessageByInstanceId']>[1],\n    guardInstance?: boolean\n) => void;\n\nexport function buildGuardedSendMessageByInstanceId(\n    sendMessageByInstanceId: AppPool['sendMessageByInstanceId'],\n    findInstanceState: FindInstanceState,\n    findWorkerInstance: FindWorkerInstance\n): SendMessageByInstanceId {\n    return (msg, instanceId, guardInstance = false) => {\n        if (guardInstance && !findInstanceState(instanceId) && !findWorkerInstance(instanceId)) {\n            return;\n        }\n        sendMessageByInstanceId(msg, instanceId);\n    };\n}\n\nexport function createAppsV2SdkHandler({\n    getActiveConversationGroupId,\n    getSelectedInteraction,\n    findInstanceState,\n    findWorkerInstance,\n    openPanel,\n    sendMessageToGroup,\n    sendMessageByInstanceId,\n    logger,\n    notificationService,\n    sendLegacyApiCall,\n    streamingService,\n    alerting,\n    proposeMessageTools,\n    getHasConversationAppForCurrInteraction,\n    getActiveInteractions\n}: {\n    getActiveConversationGroupId: GetActiveConversationGroupId;\n    getSelectedInteraction: GetSelectedInteraction;\n    findInstanceState: FindInstanceState;\n    findWorkerInstance: FindWorkerInstance;\n    openPanel: OpenPanel;\n    sendMessageToGroup: SendMessageToGroup;\n    sendMessageByInstanceId: AppPool['sendMessageByInstanceId'];\n    logger: StashLoggerService;\n    notificationService: NotificationService;\n    sendLegacyApiCall: SendLegacyApiCall;\n    streamingService: StreamingService;\n    alerting: AlertingService;\n    proposeMessageTools: ProposeMessageTools;\n    getHasConversationAppForCurrInteraction: () => boolean;\n    getActiveInteractions: () => Promise<any[]>;\n}) {\n    const guardedSendMessageByInstanceId = buildGuardedSendMessageByInstanceId(\n        sendMessageByInstanceId,\n        findInstanceState,\n        findWorkerInstance\n    );\n\n    const messageHandlerChain = new MessageHandlerChain(\n        [\n            {\n                handlerId: 'conversationsMessageHandler',\n                handler: new ConversationsMessageHandler({\n                    getActiveConversationGroupId,\n                    getSelectedInteraction,\n                    findInstanceState,\n                    sendMessageToGroup,\n                    proposeMessageTools,\n                    getHasConversationAppForCurrInteraction\n                })\n            },\n            {\n                handlerId: 'conversationsListMessageHandler',\n                handler: new ConversationsListMessageHandler({\n                    logger,\n                    sendMessageByInstanceId,\n                    findWorkerInstance,\n                    getActiveInteractions\n                })\n            },\n            {\n                handlerId: 'hawkMessageHandler',\n                handler: new HawkMessageHandler({\n                    logger,\n                    sendMessageByInstanceId: guardedSendMessageByInstanceId,\n                    streamingService,\n                    findInstanceState,\n                    findWorkerInstance\n                })\n            },\n            {\n                handlerId: 'modalMessageHandler',\n                handler: new ModalMessageHandler({\n                    alerting,\n                    findInstanceState,\n                    findWorkerInstance,\n                    sendMessageByInstanceId: guardedSendMessageByInstanceId\n                })\n            },\n            {\n                handlerId: 'monitoringMessageHandler',\n                handler: new MonitoringMessageHandler({\n                    logger,\n                    addTelemetryEvent: addPageAction,\n                    findInstanceState,\n                    findWorkerInstance\n                })\n            },\n            {\n                handlerId: 'toastMessageHandler',\n                handler: new ToastMessageHandler({\n                    logger,\n                    sendMessageByInstanceId: guardedSendMessageByInstanceId,\n                    notificationService\n                })\n            },\n            {\n                handlerId: 'openWindowHandler',\n                handler: new OpenWindowHandler({ findInstanceState, findWorkerInstance })\n            },\n            {\n                handlerId: 'openPanelHandler',\n                handler: new OpenPanelHandler({ findInstanceState, openPanel })\n            },\n            {\n                handlerId: 'legacyMessageHandler',\n                handler: new LegacyMessageHandler({ sendLegacyApiCall, findInstanceState })\n            }\n        ],\n        logger\n    );\n    return async (messageEnvelope: MessageEnvelope) => {\n        const chainResult = await messageHandlerChain.handleMessage(messageEnvelope);\n\n        if (chainResult.type === 'failure') {\n            logger.warn(\n                'A chain error occurred while handling an Appsv2 message.',\n                buildChainFailureLogDetails(chainResult, messageEnvelope)\n            );\n        }\n\n        return chainResult;\n    };\n}\n","import { Message, MessageEnvelope, MessageHandler, MessageHandlerResult } from '@genesys/apps-v2-host';\nimport { AcdEmailService, AcdSmsService, StashLoggerService } from '@web-directory/services';\nimport PersonModel from 'web-directory/models/person';\n\ntype AssociateActivityHandlerOptions = {\n    logger: StashLoggerService;\n    phoneService: any;\n    emailService: AcdEmailService;\n    smsService: AcdSmsService;\n    store: any;\n    commandNav: any;\n    permissions: any;\n};\n\nenum AssociateActivityMessageType {\n    NavigateToConversation = 'navigateToConversation',\n    StartCall = 'startCall',\n    StartEmail = 'startEmail',\n    StartMessage = 'startMessage'\n}\n\nexport class AssociateActivityHandler implements MessageHandler {\n    private logger;\n    private phoneService;\n    private emailService;\n    private smsService;\n    private store;\n    private commandNav;\n    private permissions;\n\n    constructor({\n        logger,\n        phoneService,\n        emailService,\n        smsService,\n        store,\n        commandNav,\n        permissions\n    }: AssociateActivityHandlerOptions) {\n        this.logger = logger;\n        this.phoneService = phoneService;\n        this.emailService = emailService;\n        this.smsService = smsService;\n        this.store = store;\n        this.commandNav = commandNav;\n        this.permissions = permissions;\n    }\n\n    canHandle({ message }: MessageEnvelope<Message>): boolean {\n        const payloadIsCorrectType = Boolean(\n            message.action === 'publish' && typeof message?.payload?.type === 'string'\n        );\n        const typeCanBeHandled = Object.values(AssociateActivityMessageType).includes(\n            String(message?.payload?.type) as AssociateActivityMessageType\n        );\n        return payloadIsCorrectType && typeCanBeHandled;\n    }\n\n    async handle({ message }: MessageEnvelope): Promise<MessageHandlerResult> {\n        try {\n            const { conversationId, address, queueId, userId, externalContactId, messageType } = message.payload as any;\n            const eventType = message?.payload?.type ?? '';\n            switch (eventType) {\n                case AssociateActivityMessageType.StartCall:\n                    this._startCall(address, queueId, externalContactId, userId);\n                    break;\n                case AssociateActivityMessageType.StartEmail:\n                    this._startEmail(queueId, address, externalContactId);\n                    break;\n                case AssociateActivityMessageType.StartMessage:\n                    this._startMessage(queueId, address, messageType, externalContactId);\n                    break;\n                case AssociateActivityMessageType.NavigateToConversation:\n                    this._navToInteractionRoute(conversationId);\n                    break;\n                default:\n                    throw new Error('unsupported eventType for AssociateActivityMessageHandler');\n            }\n\n            if (queueId && this.permissions.canGoOnQueue) {\n                this.commandNav.selectPanel('agent', true);\n            }\n            return {\n                type: 'success'\n            };\n        } catch (error) {\n            this.logger.info(error instanceof Error ? error.message : 'AssociateActivityMessageHandler failed');\n            return {\n                type: 'failure',\n                reason: error instanceof Error ? error.message : 'AssociateActivityMessageHandler failed'\n            };\n        }\n    }\n\n    _navToInteractionRoute(conversationId: string) {\n        let routePath = `#/engage/agent/interactions/${encodeURIComponent(conversationId)}`;\n        window.location.assign(routePath);\n    }\n\n    _startCall(\n        address: string,\n        queueId: string | undefined,\n        externalContactId: string | undefined,\n        userId: string | undefined\n    ) {\n        try {\n            if (userId) {\n                this.store\n                    .find('person', userId)\n                    .then((person: typeof PersonModel) => this.phoneService.makeCall(person, person, { id: queueId }));\n            } else {\n                this.phoneService.makeCall(address, undefined, { id: queueId }, externalContactId);\n            }\n        } catch (error) {\n            throw new Error('Failed to start phone call');\n        }\n    }\n\n    _startEmail(queueId: string, emailAddress: string, externalContactId: string | undefined) {\n        try {\n            this.emailService.createEmail(queueId, emailAddress, externalContactId);\n        } catch (error) {\n            throw new Error('Failed to create email conversation');\n        }\n    }\n\n    _startMessage(queueId: string, toAddress: string, messageType: string, externalContactId: string | undefined) {\n        try {\n            this.smsService.createMessage(\n                {\n                    queueId,\n                    entity: {\n                        id: externalContactId,\n                        value: toAddress\n                    },\n                    toAddressMessengerType: messageType,\n                    useUserFromAddress: false,\n                    externalContactId\n                },\n                true\n            );\n        } catch (error) {\n            throw new Error('Failed to create message conversation');\n        }\n    }\n}\n","import {\n    Message,\n    MessageEnvelope,\n    MessageHandler,\n    MessageHandlerResult,\n    isGetConversationsClientToHostMessage,\n    buildGetConversationsResponseHostToClientMessage,\n    GetConversationsClientToHostMessage\n} from '@genesys/apps-v2-host';\nimport { FindWorkerInstance, SendMessageByInstanceId } from './apps-v2-sdk-handler';\nimport appsUtils from 'web-directory/utils/apps';\nimport { StashLoggerService } from '@web-directory/services';\n\ntype ConversationsListMessageHandlerOptions = {\n    findWorkerInstance: FindWorkerInstance;\n    sendMessageByInstanceId: SendMessageByInstanceId;\n    getActiveInteractions: () => Promise<any[]>;\n    logger: StashLoggerService;\n};\n\nexport class ConversationsListMessageHandler implements MessageHandler {\n    // Attributes\n    private findWorkerInstance: FindWorkerInstance;\n    private sendMessageByInstanceId: SendMessageByInstanceId;\n    private getActiveInteractions: () => Promise<any[]>;\n    private logger;\n    // Constructor\n    constructor({\n        findWorkerInstance,\n        sendMessageByInstanceId,\n        getActiveInteractions,\n        logger\n    }: ConversationsListMessageHandlerOptions) {\n        this.findWorkerInstance = findWorkerInstance;\n        this.sendMessageByInstanceId = sendMessageByInstanceId;\n        this.getActiveInteractions = getActiveInteractions;\n        this.logger = logger;\n    }\n    // Methods\n    canHandle(\n        msgEnvelope: MessageEnvelope<Message>\n    ): msgEnvelope is MessageEnvelope<GetConversationsClientToHostMessage> {\n        return isGetConversationsClientToHostMessage(msgEnvelope.message);\n    }\n    async handle(msgEnvelope: MessageEnvelope<GetConversationsClientToHostMessage>): Promise<MessageHandlerResult> {\n        const { message, srcId } = msgEnvelope;\n        const workerInstance = this.findWorkerInstance(srcId)?.workerInstance;\n        if (!workerInstance) {\n            return {\n                type: 'failure',\n                reason: 'workerInstanceNotFound'\n            };\n        }\n        const { asyncCommsPairKey } = message;\n        if (!asyncCommsPairKey) {\n            return {\n                type: 'failure',\n                reason: 'missingAsyncCommsPairKey'\n            };\n        }\n        try {\n            const conversations = await this.getActiveInteractions();\n            this.sendMessageByInstanceId(\n                buildGetConversationsResponseHostToClientMessage(asyncCommsPairKey, conversations),\n                srcId\n            );\n        } catch (error) {\n            this.logger.error(\n                appsUtils.buildInterapptionsLogMsg(\n                    'Conversations Message Handler: Unable to get list of conversations'\n                ),\n                {\n                    error\n                }\n            );\n            return {\n                type: 'failure',\n                reason: 'failedToGetListConversations'\n            };\n        }\n\n        return { type: 'success' };\n    }\n}\n","import {\n    Message,\n    MessageEnvelope,\n    MessageHandler,\n    MessageHandlerResult,\n    OfferMessageMessage,\n    isOfferMessageMessage,\n    buildInjectMessageMessage,\n    AppDefFilter\n} from '@genesys/apps-v2-host';\nimport {\n    GetActiveConversationGroupId,\n    FindInstanceState,\n    GetSelectedInteraction,\n    SendMessageToGroup,\n    ProposeMessageTools\n} from './apps-v2-sdk-handler';\nimport { isActive, isVisible } from 'web-directory/utils/apps-v2-api-handlers';\nimport { typeOf } from '@ember/utils';\nimport * as GAST from '@genesys/ast';\n\ntype ConversationsMessageHandlerOptions = {\n    getActiveConversationGroupId: GetActiveConversationGroupId;\n    getSelectedInteraction: GetSelectedInteraction;\n    findInstanceState: FindInstanceState;\n    sendMessageToGroup: SendMessageToGroup;\n    proposeMessageTools: ProposeMessageTools;\n    getHasConversationAppForCurrInteraction: () => boolean;\n};\n\nexport class ConversationsMessageHandler implements MessageHandler {\n    // Attributes\n    private getActiveConversationGroupId: GetActiveConversationGroupId;\n    private getSelectedInteraction: GetSelectedInteraction;\n    private findInstanceState: FindInstanceState;\n    private sendMessageToGroup: SendMessageToGroup;\n    private proposeMessageTools: ProposeMessageTools;\n    private getHasConversationAppForCurrInteraction: () => boolean;\n    // Constructor\n    constructor({\n        getActiveConversationGroupId,\n        getSelectedInteraction,\n        findInstanceState,\n        sendMessageToGroup,\n        proposeMessageTools,\n        getHasConversationAppForCurrInteraction\n    }: ConversationsMessageHandlerOptions) {\n        this.getActiveConversationGroupId = getActiveConversationGroupId;\n        this.getSelectedInteraction = getSelectedInteraction;\n        this.findInstanceState = findInstanceState;\n        this.sendMessageToGroup = sendMessageToGroup;\n        this.proposeMessageTools = proposeMessageTools;\n        this.getHasConversationAppForCurrInteraction = getHasConversationAppForCurrInteraction;\n    }\n    // Methods\n    canHandle(msgEnvelope: MessageEnvelope<Message>): msgEnvelope is MessageEnvelope<OfferMessageMessage> {\n        return isOfferMessageMessage(msgEnvelope.message);\n    }\n    async handle(msgEnvelope: MessageEnvelope<OfferMessageMessage>): Promise<MessageHandlerResult> {\n        const appFilters: AppDefFilter[] = [];\n        if (msgEnvelope.direction === 'clientToHost') {\n            const instanceState = this.findInstanceState(msgEnvelope.srcId);\n            if (!instanceState) {\n                return {\n                    type: 'failure',\n                    reason: 'appInstanceNotFound'\n                };\n            }\n\n            const { renderedInstanceState } = instanceState;\n            if (!isActive(renderedInstanceState)) {\n                return {\n                    type: 'failure',\n                    reason: 'appInstanceNotActive'\n                };\n            }\n\n            if (!isVisible(renderedInstanceState)) {\n                return {\n                    type: 'failure',\n                    reason: 'appInstanceNotVisible'\n                };\n            }\n            // Do not send the offer to the offering app\n            appFilters.push(appDef => appDef.id !== msgEnvelope.srcId);\n        }\n\n        const activeGroupId = this.getActiveConversationGroupId();\n        if (!activeGroupId) {\n            return {\n                type: 'failure',\n                reason: 'noActiveGroup'\n            };\n        }\n\n        const interaction = this.getSelectedInteraction();\n        if (!interaction) {\n            return {\n                type: 'failure',\n                reason: 'noInteractionSelected'\n            };\n        }\n        if (interaction.type !== 'conversation' || typeOf(interaction.payload) !== 'instance') {\n            return {\n                type: 'failure',\n                reason: 'invalidInteractionType'\n            };\n        }\n\n        if (\n            msgEnvelope.message.payload.conversationId &&\n            interaction.id !== msgEnvelope.message.payload.conversationId\n        ) {\n            return {\n                type: 'failure',\n                reason: 'invalidTargetInteraction'\n            };\n        }\n\n        // \"interaction.payload\" is an ember \"InteractionModel\"\n        if (!interaction.payload.get('isConnected')) {\n            return {\n                type: 'failure',\n                reason: 'interactionNotConnected'\n            };\n        }\n\n        if (!this.getHasConversationAppForCurrInteraction()) {\n            const conversionResult = GAST.HTML.stringifyFromAST(\n                msgEnvelope.message.payload.proposedMessage.format,\n                msgEnvelope.message.payload.proposedMessage.tree as GAST.AST\n            );\n            if (conversionResult.type === 'failure') {\n                return {\n                    type: 'failure',\n                    reason: 'invalidMessageFormat'\n                };\n            }\n\n            if (interaction.payload.get('isEmail')) {\n                this.proposeMessageTools.insertEmailText(conversionResult.content);\n                return { type: 'success' };\n            }\n\n            // Strip HTML tags and replace <br> and </p><p> with new lines\n            const tempDiv = document.createElement('div');\n            tempDiv.innerHTML = conversionResult.content.replace(/(<br>)|(<\\/p><p>)/g, '\\n');\n            const strippedText = tempDiv.textContent || tempDiv.innerText || '';\n\n            if (interaction.payload.get('isChat')) {\n                this.proposeMessageTools.insertChatText(strippedText);\n                return { type: 'success' };\n            } else if (interaction.payload.get('isSms')) {\n                this.proposeMessageTools.insertSmsText({ strippedText });\n                return { type: 'success' };\n            }\n        }\n\n        this.sendMessageToGroup(\n            buildInjectMessageMessage(\n                msgEnvelope.message.payload.mode,\n                msgEnvelope.message.payload.proposedMessage,\n                msgEnvelope.message.payload.conversationId\n            ),\n            activeGroupId,\n            appFilters\n        );\n        return { type: 'success' };\n    }\n}\n","import {\n    HawkClientToHostMessage,\n    HawkEventPayload,\n    HawkHostToClientMessage,\n    Message,\n    MessageEnvelope,\n    MessageHandler,\n    MessageHandlerResult,\n    isHawkClientToHostMessage,\n    isHawkEventPayload\n} from '@genesys/apps-v2-host';\nimport { StashLoggerService, StreamingService } from '@web-directory/services';\nimport Client from 'genesys-cloud-streaming-client';\nimport { NotificationsAPI } from 'genesys-cloud-streaming-client/dist/es/notifications';\nimport appsUtils from 'web-directory/utils/apps';\nimport { assertNever } from 'web-directory/utils/types';\nimport { FindInstanceState, FindWorkerInstance, SendMessageByInstanceId } from './apps-v2-sdk-handler';\nimport { isActive, isTrusted, isWorkerTrusted } from 'web-directory/utils/apps-v2-api-handlers';\n\ntype TopicEventHandler = Parameters<NotificationsAPI['subscribe']>[1];\ntype AppSubscriptions = Map<string, TopicEventHandler>;\n\n// Setting this to a high value as agent topics should be amongst the higest priority\nconst AGENT_TOPIC_PRIORITY = 1000;\n\n// Couldn't bump the TS/babel version high enough to support `message satisfies Type` so using `satisfies<Type>(message)` instead.\nfunction satisfies<T>(val: T) {\n    return val;\n}\n\nexport class HawkMessageHandler implements MessageHandler {\n    private sendMessageByInstanceId: SendMessageByInstanceId;\n    private streamingService: StreamingService;\n    private logger;\n    private listeners: Map<string, AppSubscriptions> = new Map();\n    private findInstanceState;\n    private findWorkerInstance;\n\n    constructor({\n        streamingService,\n        sendMessageByInstanceId,\n        logger,\n        findInstanceState,\n        findWorkerInstance\n    }: {\n        streamingService: StreamingService;\n        sendMessageByInstanceId: SendMessageByInstanceId;\n        logger: StashLoggerService;\n        findInstanceState: FindInstanceState;\n        findWorkerInstance: FindWorkerInstance;\n    }) {\n        this.streamingService = streamingService;\n        this.sendMessageByInstanceId = sendMessageByInstanceId;\n        this.logger = logger;\n        this.findInstanceState = findInstanceState;\n        this.findWorkerInstance = findWorkerInstance;\n    }\n\n    // Note: this function doesn't appear to be used right now, might be used later\n    async tearDown() {\n        const client = await this.getStreamingClient();\n\n        this.listeners.forEach(appSubs => {\n            appSubs.forEach((handler, topicName) => {\n                // We allow the client to not be resolved to do the best we can to tear down\n                client?.notifications.unsubscribe(topicName, handler, false);\n                // Originally was sending an unsubscribe message here, but we don't have a commsPairKey so it'll be ignored\n                //  on the app side right now anyway\n            });\n        });\n\n        this.listeners.clear();\n    }\n\n    canHandle(messageEnvelope: MessageEnvelope<Message>): messageEnvelope is MessageEnvelope<HawkClientToHostMessage> {\n        return isHawkClientToHostMessage(messageEnvelope.message);\n    }\n\n    async handle({ srcId, message }: MessageEnvelope<HawkClientToHostMessage>): Promise<MessageHandlerResult> {\n        const { action, asyncCommsPairKey } = message;\n        const { topicName } = message.payload;\n\n        const fail = (reason: string): MessageHandlerResult => {\n            this.sendMessageByInstanceId(\n                satisfies<HawkHostToClientMessage>({\n                    domain: 'hawk',\n                    entity: 'topic',\n                    action: action === 'subscribe' ? 'subscribed' : 'unsubscribed',\n                    asyncCommsPairKey,\n                    payload: { type: 'failure', topicName, reason }\n                }),\n                srcId,\n                true\n            );\n\n            return { type: 'failure', reason };\n        };\n\n        if (asyncCommsPairKey.trim() === '') {\n            return fail('emptyAsyncCommsPairKey');\n        }\n\n        const renderedInstance = this.findInstanceState(srcId)?.renderedInstanceState;\n        if (!renderedInstance) {\n            const workerInstance = this.findWorkerInstance(srcId)?.workerInstance;\n            if (!workerInstance) {\n                return fail('noInstanceFound');\n            } else {\n                if (!isWorkerTrusted(workerInstance)) {\n                    return fail('workerDefNotTrusted');\n                }\n            }\n        } else {\n            if (!isTrusted(renderedInstance)) {\n                return fail('appDefNotTrusted');\n            }\n        }\n\n        const client = await this.getStreamingClient();\n        if (!client) {\n            return fail('Failed to fetch streaming client from service');\n        }\n\n        switch (action) {\n            case 'subscribe':\n                try {\n                    if (renderedInstance && !isActive(renderedInstance)) {\n                        return fail('appInstanceNotActive');\n                    }\n\n                    const appSubs = this.listeners.get(srcId);\n                    if (!!appSubs && appSubs.has(topicName)) {\n                        // Already subscribed; ack the sub\n                        this.sendMessageByInstanceId(\n                            satisfies<HawkHostToClientMessage>({\n                                domain: 'hawk',\n                                entity: 'topic',\n                                action: 'subscribed',\n                                asyncCommsPairKey,\n                                payload: { type: 'success', topicName }\n                            }),\n                            srcId,\n                            true\n                        );\n                        break;\n                    }\n\n                    const handler = (payload: unknown) => {\n                        let hawkPayload: null | HawkEventPayload = null;\n\n                        if (payload && typeof payload === 'object') {\n                            // The XMPP payload does not include version\n                            // it's required in the type, so, for now, we're just \"polyfilling\" it in\n                            const versionPolyfill = {\n                                version: '2',\n                                ...payload\n                            };\n                            if (isHawkEventPayload(versionPolyfill)) {\n                                hawkPayload = versionPolyfill;\n                            }\n                        }\n\n                        if (!hawkPayload) {\n                            this.logger.warn(\n                                appsUtils.buildInterapptionsLogMsg('Encountered unexpected hawk payload'),\n                                {\n                                    remoteData: {\n                                        appId: srcId\n                                    },\n                                    topicName,\n                                    payload\n                                }\n                            );\n                            return;\n                        }\n\n                        this.sendMessageByInstanceId(\n                            satisfies<HawkHostToClientMessage>({\n                                domain: 'hawk',\n                                entity: 'topic',\n                                action: 'event',\n                                payload: hawkPayload\n                            }),\n                            srcId,\n                            true\n                        );\n                    };\n\n                    await client.notifications.subscribe(\n                        message.payload.topicName,\n                        handler,\n                        true,\n                        AGENT_TOPIC_PRIORITY\n                    );\n\n                    this.addAppSubscription({\n                        appId: srcId,\n                        topicName,\n                        handler\n                    });\n\n                    // Ack the subscription success\n                    this.sendMessageByInstanceId(\n                        satisfies<HawkHostToClientMessage>({\n                            domain: 'hawk',\n                            entity: 'topic',\n                            action: 'subscribed',\n                            asyncCommsPairKey,\n                            payload: { type: 'success', topicName }\n                        }),\n                        srcId,\n                        true\n                    );\n                } catch (reason) {\n                    this.logger.error(appsUtils.buildInterapptionsLogMsg('Failed to subscribe to topic for app'), {\n                        remoteData: {\n                            appId: srcId\n                        },\n                        topicName,\n                        reason\n                    });\n\n                    return fail('failedToSubscribe');\n                }\n                break;\n            case 'unsubscribe':\n                const handler = this.listeners.get(srcId)?.get(topicName);\n                if (handler) {\n                    try {\n                        await client.notifications.unsubscribe(topicName, handler, false);\n                    } catch (reason) {\n                        // In case of failure, log, but otherwise ignore the error and continue with our cleanup of our copy of the subscription\n                        // Internally, genesys-cloud-streaming-client will also remove their subscription so acknowledging success\n                        // is appropriate and will result in no client retries and future resubscribes will also be allowed.\n                        this.logger.warn(\n                            appsUtils.buildInterapptionsLogMsg('Failed to unsubscribe from the topic for app'),\n                            {\n                                remoteData: {\n                                    appId: srcId\n                                },\n                                topicName,\n                                reason\n                            }\n                        );\n                    }\n                }\n\n                this.removeAppSubscription({ appId: srcId, topicName });\n\n                this.sendMessageByInstanceId(\n                    satisfies<HawkHostToClientMessage>({\n                        domain: 'hawk',\n                        entity: 'topic',\n                        action: 'unsubscribed',\n                        asyncCommsPairKey,\n                        payload: { type: 'success', topicName }\n                    }),\n                    srcId,\n                    true\n                );\n                break;\n            default:\n                assertNever(action);\n        }\n\n        return {\n            type: 'success'\n        };\n    }\n\n    private addAppSubscription({\n        appId,\n        topicName,\n        handler\n    }: {\n        appId: string;\n        topicName: string;\n        handler: TopicEventHandler;\n    }) {\n        let appSubs = this.listeners.get(appId);\n        if (!appSubs) {\n            appSubs = new Map<string, TopicEventHandler>();\n            this.listeners.set(appId, appSubs);\n        }\n\n        appSubs.set(topicName, handler);\n    }\n\n    private removeAppSubscription({ appId, topicName }: { appId: string; topicName: string }) {\n        let appSubs = this.listeners.get(appId);\n\n        if (!appSubs) {\n            return;\n        }\n\n        appSubs.delete(topicName);\n\n        if (appSubs.size === 0) {\n            // Delete the entry entirely\n            this.listeners.delete(appId);\n        }\n    }\n\n    private async getStreamingClient(logFailure: boolean = true): Promise<Client | null> {\n        try {\n            return await this.streamingService.v2Promise;\n        } catch (reason) {\n            if (logFailure) {\n                this.logger.error(appsUtils.buildInterapptionsLogMsg('Failed to get client from streaming service'), {\n                    reason\n                });\n            }\n\n            return null;\n        }\n    }\n}\n","import { MessageEnvelope, MessageHandler, MessageHandlerResult } from '@genesys/apps-v2-host';\nimport { DISPLAY_TYPES } from 'web-directory/models/app';\nimport { parseMessage } from 'web-directory/models/app-api-call';\nimport { APP_STATES } from 'web-directory/models/app-instance';\nimport { SHOW_PROFILE_APP_API_ACTION_NAME } from '../apps-api-handlers/directory-nav-handler';\nimport {\n    SHOW_EXTERNAL_CONTACT_PROFILE,\n    SHOW_EXTERNAL_ORGANIZATION_PROFILE\n} from '../apps-api-handlers/external-contacts-handler';\nimport { SHOW_MY_EVALUATION_DETAILS, SHOW_MY_INTERACTION_DETAILS } from '../apps-api-handlers/my-interactions-handler';\nimport {\n    HIDE_HELP_APP_API_ACTION_NAME,\n    SHOW_HELP_APP_API_ACTION_NAME,\n    SHOW_RC_ARTIFACT_APP_API_ACTION_NAME\n} from '../apps-api-handlers/resource-center-handler';\nimport { SHOW_INTERACTION_DETAILS_VIEW } from '../apps-api-handlers/show-interaction-details-handler';\nimport { SHOW_TOAST_APP_API_ACTION_NAME } from '../apps-api-handlers/toast-handler';\nimport { FindInstanceState } from './apps-v2-sdk-handler';\nimport { AppsService } from '@web-directory/services';\n\nconst legacyHandlerActionNames = [\n    // directory-nav-handler\n    SHOW_PROFILE_APP_API_ACTION_NAME,\n    // external-contacts-handler\n    SHOW_EXTERNAL_CONTACT_PROFILE,\n    SHOW_EXTERNAL_ORGANIZATION_PROFILE,\n    // my-interactions-handler\n    SHOW_MY_INTERACTION_DETAILS,\n    SHOW_MY_EVALUATION_DETAILS,\n    // resource-center-handler\n    SHOW_HELP_APP_API_ACTION_NAME,\n    HIDE_HELP_APP_API_ACTION_NAME,\n    SHOW_RC_ARTIFACT_APP_API_ACTION_NAME,\n    // show-interaction-details-handler\n    SHOW_INTERACTION_DETAILS_VIEW,\n    // toast-handler\n    SHOW_TOAST_APP_API_ACTION_NAME\n];\n\nexport type SendLegacyApiCall = AppsService['handleAppApiCall'];\n\ntype LegacyMessageHandlerConfig = {\n    sendLegacyApiCall: SendLegacyApiCall;\n    findInstanceState: FindInstanceState;\n};\n\nexport class LegacyMessageHandler implements MessageHandler {\n    private sendLegacyApiCall: SendLegacyApiCall;\n    private findInstanceState: FindInstanceState;\n\n    constructor(config: LegacyMessageHandlerConfig) {\n        this.sendLegacyApiCall = config.sendLegacyApiCall;\n        this.findInstanceState = config.findInstanceState;\n    }\n\n    canHandle({ message }: MessageEnvelope): boolean {\n        return legacyHandlerActionNames.includes(message.action);\n    }\n\n    async handle({ agent, message, protocol, srcId: srcInstanceId }: MessageEnvelope): Promise<MessageHandlerResult> {\n        const apiCall = parseMessage(\n            {\n                ...message.payload,\n                protocol: protocol.name,\n                protocolAgentName: agent.name,\n                protocolAgentVersion: agent.version,\n                action: message.action\n            },\n            true\n        );\n\n        const appState = this.findInstanceState(srcInstanceId);\n\n        if (!appState)\n            return {\n                type: 'failure',\n                reason: 'appInstanceNotFound'\n            };\n\n        const { groupId, renderedInstanceState } = appState;\n\n        const app = {\n            typeId: renderedInstanceState.appDef.id,\n            id: renderedInstanceState.instanceId,\n            name: renderedInstanceState.appDef.displayName || renderedInstanceState.appDef.id,\n            displayType: DISPLAY_TYPES.INTERAPPTION,\n            featureCategory: null,\n            interactionId: groupId\n        };\n\n        apiCall.setProperties({\n            internalPcCall: false,\n            srcApp: app as any,\n            srcAppInstance: {\n                instanceId: srcInstanceId,\n                app,\n                currState: APP_STATES.RUNNING,\n                problem: {\n                    name: null,\n                    details: null\n                },\n                lastUserAccessTimestamp: Date.now(),\n                attentionCount: 0\n            } as any\n        });\n\n        this.sendLegacyApiCall(apiCall);\n\n        return {\n            type: 'success'\n        };\n    }\n}\n","import {\n    Message,\n    MessageEnvelope,\n    MessageHandler,\n    MessageHandlerResult,\n    SimpleModalClientToHostMessage,\n    isSimpleModalClientToHostMessage,\n    SimpleModalResolutionHostToClientMessage,\n    SimpleModalResolution\n} from '@genesys/apps-v2-host';\nimport { AlertingService, SimpleModalConfig, ModalResult } from 'web-directory/services/alerting';\nimport { isActive, isVisible } from 'web-directory/utils/apps-v2-api-handlers';\nimport { FindInstanceState, FindWorkerInstance, SendMessageByInstanceId } from './apps-v2-sdk-handler';\nimport { assertNever } from 'web-directory/utils/types';\n\nexport class ModalMessageHandler implements MessageHandler {\n    private alerting: AlertingService;\n    private findInstanceState: FindInstanceState;\n    private findWorkerInstance: FindWorkerInstance;\n    private sendMessageByInstanceId: SendMessageByInstanceId;\n\n    constructor({\n        alerting,\n        findInstanceState,\n        findWorkerInstance,\n        sendMessageByInstanceId\n    }: {\n        alerting: AlertingService;\n        findInstanceState: FindInstanceState;\n        findWorkerInstance: FindWorkerInstance;\n        sendMessageByInstanceId: SendMessageByInstanceId;\n    }) {\n        this.alerting = alerting;\n        this.findInstanceState = findInstanceState;\n        this.findWorkerInstance = findWorkerInstance;\n        this.sendMessageByInstanceId = sendMessageByInstanceId;\n    }\n\n    canHandle(msgEnvelope: MessageEnvelope<Message>): msgEnvelope is MessageEnvelope<SimpleModalClientToHostMessage> {\n        return isSimpleModalClientToHostMessage(msgEnvelope.message);\n    }\n    async handle(msgEnv: MessageEnvelope<SimpleModalClientToHostMessage>): Promise<MessageHandlerResult> {\n        const { message, srcId } = msgEnv;\n        const { asyncCommsPairKey } = message;\n\n        if (!asyncCommsPairKey) {\n            return {\n                type: 'failure',\n                reason: 'missingAsyncCommsPairKey'\n            };\n        }\n\n        const renderedInstance = this.findInstanceState(msgEnv.srcId)?.renderedInstanceState;\n        if (!renderedInstance) {\n            if (!this.findWorkerInstance(msgEnv.srcId)) {\n                return {\n                    type: 'failure',\n                    reason: 'appInstanceNotFound'\n                };\n            }\n        } else {\n            if (!isActive(renderedInstance)) {\n                return {\n                    type: 'failure',\n                    reason: 'appInstanceNotActive'\n                };\n            }\n\n            if (!isVisible(renderedInstance)) {\n                return {\n                    type: 'failure',\n                    reason: 'appInstanceNotVisible'\n                };\n            }\n        }\n\n        let handlerResult: MessageHandlerResult = { type: 'success' };\n\n        const modalResult = await this.showModal(message);\n        let modalResolution: SimpleModalResolution;\n\n        const { type } = modalResult;\n        switch (type) {\n            case 'buttonClicked':\n            case 'userDismissed':\n                modalResolution = modalResult;\n                break;\n            //we don't pass in a timeout and forceDismissed should not occur so these cases should not get hit. If it does, we'll fall back to userDismissed so the client isn't left hanging but will still fail for logging/telemetry.\n            case 'timeout':\n            case 'forceDismissed':\n                modalResolution = { type: 'userDismissed' };\n                handlerResult = {\n                    type: 'failure',\n                    reason: 'invalidModalResolution'\n                };\n                break;\n            default:\n                assertNever(type);\n        }\n\n        this.sendMessageByInstanceId(\n            {\n                domain: 'alerting',\n                entity: 'modal',\n                action: 'simpleModalResponse',\n                asyncCommsPairKey,\n                payload: modalResolution\n            } as SimpleModalResolutionHostToClientMessage,\n            srcId,\n            true\n        );\n        return handlerResult;\n    }\n\n    private async showModal(msg: SimpleModalClientToHostMessage): Promise<ModalResult> {\n        const { title, content, size, positive, negative } = msg.payload;\n\n        const modal: SimpleModalConfig = {\n            title,\n            content,\n            size,\n            buttons: { positive, negative }\n        };\n        return this.alerting.pushModal(modal);\n    }\n}\n","import {\n    Message,\n    MessageEnvelope,\n    MessageHandler,\n    MessageHandlerResult,\n    WorkerInstance,\n    isAddTelemetryEventClientToHostMessage,\n    isTraceLoggerClientToHostMessage\n} from '@genesys/apps-v2-host';\nimport { StashLoggerLogPayload, StashLoggerService } from '@web-directory/services';\nimport appsUtils from 'web-directory/utils/apps';\nimport { FindInstanceState, FindWorkerInstance } from './apps-v2-sdk-handler';\nimport { assertNever } from 'web-directory/utils/types';\n\ntype AddTelemetryEvent = (name: string, attributes?: Record<string, string | number>) => void;\n\ntype MonitoringMessageHandlerOptions = {\n    logger: StashLoggerService;\n    addTelemetryEvent: AddTelemetryEvent;\n    findInstanceState: FindInstanceState;\n    findWorkerInstance: FindWorkerInstance;\n};\n\nexport class MonitoringMessageHandler implements MessageHandler {\n    // Attributes\n    private logger: StashLoggerService;\n    private findInstanceState: FindInstanceState;\n    private findWorkerInstance: FindWorkerInstance;\n    private addTelemetryEvent: AddTelemetryEvent;\n    // Constructor\n    constructor({ logger, addTelemetryEvent, findInstanceState, findWorkerInstance }: MonitoringMessageHandlerOptions) {\n        this.logger = logger;\n        this.findInstanceState = findInstanceState;\n        this.findWorkerInstance = findWorkerInstance;\n        this.addTelemetryEvent = addTelemetryEvent;\n    }\n    // Methods\n    canHandle(msgEnvelope: MessageEnvelope<Message>): msgEnvelope is MessageEnvelope {\n        return (\n            isTraceLoggerClientToHostMessage(msgEnvelope.message) ||\n            isAddTelemetryEventClientToHostMessage(msgEnvelope.message)\n        );\n    }\n    async handle(msgEnvelope: MessageEnvelope): Promise<MessageHandlerResult> {\n        const { srcId, message } = msgEnvelope;\n        const renderedInstance = this.findInstanceState(srcId)?.renderedInstanceState;\n        let workerInstance: WorkerInstance | undefined = undefined;\n        if (!renderedInstance) {\n            workerInstance = this.findWorkerInstance(srcId)?.workerInstance;\n            if (!workerInstance) {\n                return {\n                    type: 'failure',\n                    reason: 'appInstanceNotFound'\n                };\n            }\n        } else {\n            const { type: appType } = renderedInstance.appDef;\n            switch (appType) {\n                case 'dynaWebComp':\n                case 'elementFactoryAppDef':\n                case 'elementSingletonAppDef':\n                    // all internal types are trusted and allowed\n                    break;\n                case 'iframe':\n                    if (!renderedInstance.appDef.trustedDataPassing) {\n                        return {\n                            type: 'failure',\n                            reason: 'appDefNotTrusted'\n                        };\n                    }\n                    break;\n                default:\n                    assertNever(appType);\n            }\n        }\n\n        if (isTraceLoggerClientToHostMessage(message)) {\n            const stashLoggerDetails: StashLoggerLogPayload = appsUtils.buildStashLoggerDetails(\n                message.payload.details\n            );\n            if (renderedInstance) {\n                stashLoggerDetails.remoteData = {\n                    ...stashLoggerDetails.remoteData,\n                    appDefId: renderedInstance.appDef.id,\n                    instanceId: srcId\n                };\n                this.logger[message.payload.level](\n                    appsUtils.buildInterapptionsLogMsg(message.payload.msg, renderedInstance.appDef.id),\n                    stashLoggerDetails\n                );\n            } else if (workerInstance) {\n                stashLoggerDetails.remoteData = {\n                    ...stashLoggerDetails.remoteData,\n                    workerDefId: workerInstance.definition.id\n                };\n                this.logger[message.payload.level](\n                    appsUtils.buildInterapptionsLogMsg(message.payload.msg, workerInstance.definition.id),\n                    stashLoggerDetails\n                );\n            }\n        } else if (isAddTelemetryEventClientToHostMessage(message)) {\n            const attributes = message.payload.attributes || {};\n            if (renderedInstance) {\n                attributes['appDefId'] = renderedInstance.appDef.id;\n            } else if (workerInstance) {\n                attributes['workerDefId'] = workerInstance.definition.id;\n            }\n            attributes['instanceId'] = srcId;\n            this.addTelemetryEvent(message.payload.name, attributes);\n        } else {\n            return {\n                type: 'failure',\n                reason: `\"${message.domain}/${message.entity}/${message.action}\" monitoring handler is not implemented yet.`\n            };\n        }\n        return {\n            type: 'success'\n        };\n    }\n}\n","import {\n    MessageEnvelope,\n    MessageHandler,\n    MessageHandlerResult,\n    RenderedInstanceState,\n    isMessage\n} from '@genesys/apps-v2-host';\nimport { isActive, isInternallyHosted, isVisible } from 'web-directory/utils/apps-v2-api-handlers';\nimport { FindInstanceState, OpenPanel } from './apps-v2-sdk-handler';\nimport { APPS_API_PROTOCOL } from 'web-directory/models/app-api-call';\nimport { OPEN_PANEL_API_ACTION_NAME, openPanelDemoAppURL } from '../apps-api-handlers/open-panel-handler';\nimport { hasKey } from 'web-directory/utils/types';\n\ntype OpenPanelHandlerMessage = {\n    domain: typeof APPS_API_PROTOCOL;\n    entity: 'legacy-client-apps-sdk';\n    action: typeof OPEN_PANEL_API_ACTION_NAME;\n    payload: {\n        panelId: string;\n    };\n};\n\nexport function isOpenPanelHandlerMessage(toCheck: unknown): toCheck is OpenPanelHandlerMessage {\n    if (!isMessage(toCheck)) {\n        return false;\n    }\n    if (toCheck.action !== OPEN_PANEL_API_ACTION_NAME) {\n        return false;\n    }\n    if (!hasKey(toCheck, 'payload') || typeof toCheck.payload !== 'object' || !toCheck.payload) {\n        return false;\n    }\n    if (!hasKey(toCheck.payload, 'panelId') || typeof toCheck.payload.panelId !== 'string') {\n        return false;\n    }\n    return true;\n}\n\nexport function isOpenPanelDemoApp({ appDef }: RenderedInstanceState): boolean {\n    if (appDef.type === 'iframe') {\n        return appDef.src.origin === openPanelDemoAppURL.origin && appDef.src.pathname === openPanelDemoAppURL.pathname;\n    }\n    return false;\n}\n\ntype OpenPanelHandlerOptions = {\n    findInstanceState: FindInstanceState;\n    openPanel: OpenPanel;\n};\n\nexport class OpenPanelHandler implements MessageHandler {\n    private findInstanceState: FindInstanceState;\n    private openPanel: OpenPanel;\n\n    constructor({ findInstanceState, openPanel }: OpenPanelHandlerOptions) {\n        this.findInstanceState = findInstanceState;\n        this.openPanel = openPanel;\n    }\n\n    canHandle(msgEnvelope: MessageEnvelope): msgEnvelope is MessageEnvelope<OpenPanelHandlerMessage> {\n        return isOpenPanelHandlerMessage(msgEnvelope.message);\n    }\n\n    async handle(messageEnvelope: MessageEnvelope<OpenPanelHandlerMessage>): Promise<MessageHandlerResult> {\n        const renderedInstance = this.findInstanceState(messageEnvelope.srcId)?.renderedInstanceState;\n        if (!renderedInstance) {\n            return {\n                type: 'failure',\n                reason: 'appInstanceNotFound'\n            };\n        }\n\n        if (!isActive(renderedInstance)) {\n            return {\n                type: 'failure',\n                reason: 'appInstanceNotActive'\n            };\n        }\n\n        if (!isVisible(renderedInstance)) {\n            return {\n                type: 'failure',\n                reason: 'appInstanceNotVisible'\n            };\n        }\n\n        if (!isOpenPanelDemoApp(renderedInstance) && !isInternallyHosted(renderedInstance)) {\n            return {\n                type: 'failure',\n                reason: 'appDefNotInternallyHosted'\n            };\n        }\n\n        if (!messageEnvelope.message.payload.panelId.trim()) {\n            return {\n                type: 'failure',\n                reason: 'emptyPanelId'\n            };\n        }\n\n        this.openPanel(messageEnvelope.message.payload.panelId);\n\n        return {\n            type: 'success'\n        };\n    }\n}\n","import {\n    Message,\n    MessageEnvelope,\n    MessageHandler,\n    MessageHandlerResult,\n    isOpenWindowClientToHostMessage,\n    OpenWindowClientToHostMessage,\n    WorkerInstance\n} from '@genesys/apps-v2-host';\nimport { isKnown } from '@genesys/service-discovery-web-internal';\nimport {\n    isActive,\n    isInternallyHosted,\n    isVisible,\n    isWorkerInternallyHosted\n} from 'web-directory/utils/apps-v2-api-handlers';\nimport { FindInstanceState, FindWorkerInstance } from './apps-v2-sdk-handler';\n\nexport type OpenWindow = (typeof window)['open'];\n\ntype OpenWindowHandlerOptions = {\n    findInstanceState: FindInstanceState;\n    findWorkerInstance: FindWorkerInstance;\n};\n\nexport class OpenWindowHandler implements MessageHandler {\n    private findInstanceState: FindInstanceState;\n    private findWorkerInstance: FindWorkerInstance;\n\n    constructor({ findInstanceState, findWorkerInstance }: OpenWindowHandlerOptions) {\n        this.findInstanceState = findInstanceState;\n        this.findWorkerInstance = findWorkerInstance;\n    }\n\n    canHandle(msgEnvelope: MessageEnvelope<Message>): msgEnvelope is MessageEnvelope<OpenWindowClientToHostMessage> {\n        return isOpenWindowClientToHostMessage(msgEnvelope.message);\n    }\n\n    async handle(messageEnvelope: MessageEnvelope<OpenWindowClientToHostMessage>): Promise<MessageHandlerResult> {\n        const { targetUrl } = messageEnvelope.message.payload;\n\n        if (targetUrl === '') {\n            return {\n                type: 'failure',\n                reason: 'emptyTargetUrl'\n            };\n        }\n\n        const renderedInstance = this.findInstanceState(messageEnvelope.srcId)?.renderedInstanceState;\n        let workerInstance: WorkerInstance | undefined = undefined;\n        if (!renderedInstance) {\n            workerInstance = this.findWorkerInstance(messageEnvelope.srcId)?.workerInstance;\n            if (!workerInstance) {\n                return {\n                    type: 'failure',\n                    reason: 'appInstanceNotFound'\n                };\n            }\n        } else {\n            if (!isActive(renderedInstance)) {\n                return {\n                    type: 'failure',\n                    reason: 'appInstanceNotActive'\n                };\n            }\n\n            if (!isVisible(renderedInstance)) {\n                return {\n                    type: 'failure',\n                    reason: 'appInstanceNotVisible'\n                };\n            }\n        }\n\n        let isGcUrl;\n        try {\n            isGcUrl = isKnown(targetUrl, {});\n        } catch (error) {\n            return {\n                type: 'failure',\n                reason: 'invalidTargetUrl'\n            };\n        }\n\n        if (isGcUrl) {\n            if (renderedInstance && !isInternallyHosted(renderedInstance)) {\n                return {\n                    type: 'failure',\n                    reason: 'appDefNotInternallyHosted'\n                };\n            }\n            if (workerInstance && !isWorkerInternallyHosted(workerInstance)) {\n                return {\n                    type: 'failure',\n                    reason: 'workerDefNotInternallyHosted'\n                };\n            }\n        }\n\n        this.openWindow(targetUrl, '_blank', 'noopener, noreferrer');\n        return {\n            type: 'success'\n        };\n    }\n\n    private openWindow(url: string, target?: string, features?: string): void {\n        window.open(url, target, features);\n    }\n}\n","import {\n    ConfirmToastClientToHostMessage,\n    ConfirmToastResolution,\n    ConfirmToastResolutionHostToClientMessage,\n    isConfirmToastClientToHostMessage,\n    isNotificationToastClientToHostMessage,\n    Message,\n    MessageEnvelope,\n    MessageHandler,\n    MessageHandlerResult,\n    NotificationToastClientToHostMessage,\n    NotificationToastResolution,\n    NotificationToastResolutionHostToClientMessage\n} from '@genesys/apps-v2-host';\nimport { NotificationService, StashLoggerService } from '@web-directory/services';\nimport appsUtils from 'web-directory/utils/apps';\nimport { assertNever } from 'web-directory/utils/types';\nimport { deferPromise } from 'web-directory/utils/async';\nimport { SendMessageByInstanceId } from './apps-v2-sdk-handler';\nimport Ember from 'ember';\nimport uuid from 'web-directory/utils/uuid';\n\ntype ToastClientToHostMessage = NotificationToastClientToHostMessage | ConfirmToastClientToHostMessage;\n\nexport class ToastMessageHandler implements MessageHandler {\n    private notificationService: NotificationService;\n    private sendMessageByInstanceId: SendMessageByInstanceId;\n    private logger: StashLoggerService;\n\n    constructor({\n        notificationService,\n        sendMessageByInstanceId,\n        logger\n    }: {\n        notificationService: NotificationService;\n        sendMessageByInstanceId: SendMessageByInstanceId;\n        logger: StashLoggerService;\n    }) {\n        this.notificationService = notificationService;\n        this.sendMessageByInstanceId = sendMessageByInstanceId;\n        this.logger = logger;\n    }\n\n    canHandle(msgEnvelope: MessageEnvelope<Message>): msgEnvelope is MessageEnvelope<ToastClientToHostMessage> {\n        return (\n            isNotificationToastClientToHostMessage(msgEnvelope.message) ||\n            isConfirmToastClientToHostMessage(msgEnvelope.message)\n        );\n    }\n\n    async handle(messageEnvelope: MessageEnvelope<ToastClientToHostMessage>): Promise<MessageHandlerResult> {\n        const { asyncCommsPairKey, action } = messageEnvelope.message;\n\n        if (!asyncCommsPairKey) {\n            return {\n                type: 'failure',\n                reason: 'missingAsyncCommsPairKey'\n            };\n        }\n\n        switch (action) {\n            case 'showNotification':\n                await this.showNotificationToast(\n                    messageEnvelope as MessageEnvelope<NotificationToastClientToHostMessage>\n                );\n                break;\n            case 'showConfirm':\n                await this.showConfirmToast(messageEnvelope as MessageEnvelope<ConfirmToastClientToHostMessage>);\n                break;\n            default:\n                assertNever(action);\n        }\n\n        return {\n            type: 'success'\n        };\n    }\n\n    private async showNotificationToast({\n        message: msg,\n        srcId\n    }: MessageEnvelope<NotificationToastClientToHostMessage>) {\n        const { id, type, message, timeout, title } = msg.payload;\n        const deferred = deferPromise<MessageHandlerResult<NotificationToastResolution>>();\n\n        // notificationService has no warning method\n        const nType = type === 'warning' ? 'info' : type;\n        const desktopNotification = this.notificationService[nType](title, message, {\n            ...this.getForceInAppToastOptions(),\n            tag: this.buildToastTag(srcId, id),\n            showCloseButton: true,\n            // The Desktop component is opinionated about what can timeout.  Turn it off and manage the timeout manually\n            hideAfter: false,\n            type: nType,\n            target: this,\n            // Pass appId for telemetry tracking\n            appId: srcId\n        });\n\n        const notificationEl = desktopNotification.get('notification')?.el;\n        if (notificationEl && notificationEl instanceof HTMLLIElement) {\n            notificationEl.addEventListener('click', event => {\n                if (event.target && (event.target as Element).matches('button.messenger-close')) {\n                    deferred.resolve({\n                        type: 'success',\n                        result: {\n                            type: 'userDismissed'\n                        }\n                    });\n                }\n            });\n        }\n\n        if (timeout) {\n            Ember.run.later(() => {\n                deferred.resolve({\n                    type: 'success',\n                    result: {\n                        type: 'timeout'\n                    }\n                });\n            }, timeout * 1000);\n        }\n\n        const response = await deferred.promise;\n        desktopNotification.hide();\n\n        if (response.type === 'failure') {\n            this.logger.error(appsUtils.buildInterapptionsLogMsg('Toast notification failed to resolve'), {\n                remoteData: {\n                    appId: srcId\n                },\n                type: 'notificationToast',\n                reason: response.reason\n            });\n            return;\n        }\n\n        this.sendMessageByInstanceId(\n            {\n                domain: 'alerting',\n                entity: 'toast',\n                action: 'notificationResponse',\n                asyncCommsPairKey: msg.asyncCommsPairKey,\n                payload: response.result\n            } as NotificationToastResolutionHostToClientMessage,\n            srcId,\n            true\n        );\n    }\n\n    private async showConfirmToast({ message: msg, srcId }: MessageEnvelope<ConfirmToastClientToHostMessage>) {\n        const { id, type, message, timeout, title, positive, negative } = msg.payload;\n        const deferred = deferPromise<MessageHandlerResult<ConfirmToastResolution>>();\n\n        // notificationService has no warning method\n        const nType = type === 'warning' ? 'info' : type;\n        const actionHandlers: Record<string, { label: string; action: Function }> = {};\n        [positive, negative].forEach(action => {\n            if (!action) return;\n            actionHandlers[action.id] = {\n                label: action.label,\n                action: () => {\n                    deferred.resolve({\n                        type: 'success',\n                        result: {\n                            buttonId: action.id,\n                            type: 'buttonClicked'\n                        }\n                    });\n                }\n            };\n        });\n\n        const desktopNotification = this.notificationService[nType](title, message, {\n            ...this.getForceInAppToastOptions(),\n            tag: this.buildToastTag(srcId, id),\n            // Gux confirmation toasts don't allow close; hide for consistency\n            showCloseButton: false,\n            // The Desktop component is opinionated about what can timeout.  Turn it off and manage the timeout manually\n            hideAfter: false,\n            type: nType,\n            target: this,\n            actionHandlers,\n            // Pass appId for telemetry tracking\n            appId: srcId\n        });\n\n        if (timeout) {\n            Ember.run.later(() => {\n                deferred.resolve({\n                    type: 'success',\n                    result: {\n                        type: 'timeout'\n                    }\n                });\n            }, timeout * 1000);\n        }\n\n        const response = await deferred.promise;\n        desktopNotification.hide();\n\n        if (response.type === 'failure') {\n            this.logger.error(appsUtils.buildInterapptionsLogMsg('Toast notification failed to resolve'), {\n                remoteData: {\n                    appId: srcId\n                },\n                type: 'confirmToast',\n                reason: response.reason\n            });\n            return;\n        }\n\n        this.sendMessageByInstanceId(\n            {\n                domain: 'alerting',\n                entity: 'toast',\n                action: 'confirmResponse',\n                asyncCommsPairKey: msg.asyncCommsPairKey,\n                payload: response.result\n            } as ConfirmToastResolutionHostToClientMessage,\n            srcId,\n            true\n        );\n    }\n\n    private buildToastTag(srcId: string, requestedToastId?: string) {\n        return `${srcId}-${requestedToastId || uuid.generate()}`;\n    }\n\n    private getForceInAppToastOptions() {\n        // These settings force the abomination known as DesktopNotification to show toasts in-app\n        // We need the toasts in app to have full control over display, dismissal, timeout, etc.\n        return {\n            shouldShowPopup: true,\n            isPopout: false,\n            showNotificationEverywhere: false,\n            canShowNativeChatNotification: false,\n            preferences: Ember.Object.create({\n                notifications: {\n                    global: {\n                        notify: false\n                    }\n                }\n            }),\n            fallbackToInBrowser: true,\n            isMobile: false\n        };\n    }\n}\n","/* eslint no-console: \"off\" */\n\nimport { reject, Promise } from 'rsvp';\n\nimport { bind } from '@ember/runloop';\nimport { getOwner } from '@ember/application';\nimport { get, set } from '@ember/object';\nimport Service, { inject as service } from '@ember/service';\nimport { typeOf, isPresent, isNone, isBlank } from '@ember/utils';\n\nimport _ from 'lodash';\nimport ENV from '../config/environment';\nimport appUtils, { AppsV2 } from '../utils/apps';\nimport netUtils from '../utils/net';\nimport { addPageAction } from '../utils/newrelic';\nimport App, {\n    DISPLAY_TYPES as APP_DISPLAY_TYPES,\n    FEATURE_CATEGORIES as APP_FEATURE_CATEGORIES,\n    ASSET_CATEGORIES as APP_ASSET_CATEGORIES,\n    INTERAPPTION_COMMUNICATION_TYPE_FILTERS,\n    NO_SUPPORTED_COMMUNICATION_TYPE_FILTER\n} from '../models/app';\nimport InternallyHostedApp from '../models/internally-hosted-app';\nimport ApiCall from '../models/app-api-call';\nimport AppPool from '../models/app-pool';\nimport { APPS_API_PROTOCOL, parseMessage } from '../models/app-api-call';\nimport { SHOW_TOAST_APP_API_ACTION_NAME } from './apps-api-handlers/toast-handler';\nimport { SHOW_PROFILE_APP_API_ACTION_NAME } from './apps-api-handlers/directory-nav-handler';\nimport { parseQueryParams } from 'web-directory/utils/query-parser';\n\nimport {\n    SHOW_HELP_APP_API_ACTION_NAME,\n    HIDE_HELP_APP_API_ACTION_NAME,\n    SHOW_RC_ARTIFACT_APP_API_ACTION_NAME\n} from './apps-api-handlers/resource-center-handler';\n\nexport const APP_SIDEBAR_PANEL_NAME_PREFIX = 'apps-';\n\nconst APPS_BASE_URL = 'api/v2/integrations/clientapps';\n\nconst REMOTE_APPS_CACHE_TTL_MILLIS = 5 * 60 * 1000;\nconst STANDALONE_LOAD_RETRY_BASE_MILLIS = 1000;\nconst STANDALONE_LOAD_RETRY_MAX_BACKOFF_MILLIS = 60 * 1000;\nconst STANDALONE_RELOAD_INTERVAL_MILLIS = REMOTE_APPS_CACHE_TTL_MILLIS + 10;\nconst STANDALONE_RELOAD_RETRY_BASE_MILLIS = 1000;\nconst WIDGET_LOAD_RETRY_BASE_MILLIS = 1000;\nconst WIDGET_LOAD_RETRY_MAX_BACKOFF_MILLIS = 60 * 1000;\nconst WIDGET_RELOAD_INTERVAL_MILLIS = REMOTE_APPS_CACHE_TTL_MILLIS + 10;\nconst WIDGET_RELOAD_RETRY_BASE_MILLIS = 1000;\n\n/**\n * List of SDK calls pre-dating the protocol field on the SDK payload.\n *\n * This list allows us to log internal usages of the SDK without the protocol field\n * as deprecations to ensure we're ready to remove the lenient parse of the sdk message.\n *\n * [IMPORTANT:] New SDK methods should not be added to this list.\n */\nconst PROTOCOL_LENIENT_INTERNAL_ACTION_NAMES = [\n    SHOW_PROFILE_APP_API_ACTION_NAME,\n    SHOW_TOAST_APP_API_ACTION_NAME,\n    SHOW_HELP_APP_API_ACTION_NAME,\n    HIDE_HELP_APP_API_ACTION_NAME,\n    SHOW_RC_ARTIFACT_APP_API_ACTION_NAME\n];\n\n/* App Parsing Props */\n\nconst APP_PROTOCOL_CHECK_REG_EXG = new RegExp(/^\\s*https?:\\/\\/.+$/);\nconst ALLOWED_SANDBOX_VALUES = [\n    'allow-forms',\n    'allow-modals',\n    'allow-popups',\n    'allow-presentation',\n    'allow-same-origin',\n    'allow-scripts',\n    'allow-downloads'\n];\nconst ALLOWED_PERMISSION_VALUES = [\n    'camera',\n    'clipboard-write',\n    'display-capture',\n    'fullscreen',\n    //\"fullscreen 'none'\" is explicitly required to disable fullscreen for nested iframes\n    \"fullscreen 'none'\",\n    'geolocation',\n    'microphone',\n    'local-network',\n    'loopback-network',\n    // 'local-network-access' is not supported in the integration-registry;\n    // if we detect that the browser doesn't support 'local-network' and 'loopback-network',\n    // we replace them with 'local-network-access' in appsV1/appsV2\n    'local-network-access'\n];\nconst VECTOR_IMG_KEY = 'vector';\nconst RASTER_IMG_KEY_REG_EXP = /^(\\d+)x(\\d+)$/i;\n\nconst LIFECYCLE_HOOK_KEYS = ['blur', 'stop', 'focus', 'bootstrap'].map(hook => `hooks.${hook}`);\nconst LIFECYCLE_KEYS = ['ephemeral', ...LIFECYCLE_HOOK_KEYS];\nconst INTERAPPTION_PROP_MAPPING_CONFIG = {\n    name: {\n        type: 'string',\n        destPath: 'name'\n    },\n    sandbox: {\n        destPath: 'properties.sandbox',\n        convert(valueIn) {\n            let typeIn = typeOf(valueIn);\n            if (typeIn === 'array') {\n                return valueIn.join(',');\n            } else if (typeIn === 'string') {\n                return valueIn;\n            } else {\n                throw new Error('invalidValue');\n            }\n        }\n    },\n    permissions: {\n        destPath: 'properties.permissions',\n        convert(valueIn) {\n            let typeIn = typeOf(valueIn);\n            if (typeIn === 'array') {\n                return valueIn.join(',');\n            } else if (typeIn === 'string') {\n                return valueIn;\n            } else {\n                throw new Error('invalidValue');\n            }\n        }\n    },\n    url: {\n        type: 'string',\n        destPath: 'properties.url'\n    },\n    lifecycle: {\n        destPath: 'advanced.lifecycle',\n        convert(lifecycleObj) {\n            if (typeOf(lifecycleObj) !== 'object') {\n                throw new Error('lifecycle must be an object if specified');\n            }\n\n            const result = {};\n            for (let key of LIFECYCLE_KEYS) {\n                const value = _.get(lifecycleObj, key);\n                const valueType = typeOf(value);\n\n                // Set boolean/Boolean values and ignore undefined (use default)\n                if (valueType === 'boolean') {\n                    _.set(result, key, value.valueOf());\n                } else if (valueType !== 'undefined') {\n                    throw new Error(`Expected ${key} to be boolean or undefined`);\n                }\n            }\n            return result;\n        }\n    },\n    subdomain: {\n        type: 'string',\n        destPath: 'properties.subdomain',\n        trustedOnly: true\n    },\n    path: {\n        type: 'string',\n        destPath: 'properties.path',\n        trustedOnly: true\n    },\n    query: {\n        type: 'string',\n        destPath: 'properties.query',\n        trustedOnly: true\n    }\n};\n\nAPP_ASSET_CATEGORIES.forEach(currCategory => {\n    INTERAPPTION_PROP_MAPPING_CONFIG[currCategory] = {\n        type: 'object',\n        destPath: `advanced.${currCategory}`\n    };\n});\n\nexport default Service.extend({\n    application: service(),\n    session: service(),\n    stashLogger: service('stash-logger'),\n    sidebar: service('sidebar'),\n    intl: service(),\n    notification: service(),\n    ajax: service(),\n    help: service(),\n    permissions: service(),\n    standaloneAppPool: null,\n    standaloneAppPoolVisible: false, // true when an app route is active\n    widgetAppPool: null,\n    externalUrlExemptIntegrationTypeIds: get(ENV, 'purecloud-apps.externalUrlExemptIntegrationTypeIds'),\n\n    // Exposed only for automation to test with smaller pool sizes.\n    // These can only be changed prior to loading any apps.\n    standaloneMaxActivePoolSize: get(ENV, 'purecloud-apps.maxActivePoolSize.standalone'),\n    widgetMaxActivePoolSize: get(ENV, 'purecloud-apps.maxActivePoolSize.widget'),\n\n    // Bypass all (client/server) app caching.  Should only be used internally (Testing/Automation)\n    _bypassAppCache: false,\n\n    // All globally available handlers (not pool or instance specific) will be injected by the instance initializer\n    globalApiHandlers: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.set(\n            'standaloneAppPool',\n            AppPool.create(\n                Object.assign(\n                    {\n                        poolName: 'standaloneAppPool',\n                        getMaxActive: () => this.standaloneMaxActivePoolSize,\n                        fetchAppsFn: this._findAllStandaloneApps.bind(this),\n                        loadRetryBaseMillis: STANDALONE_LOAD_RETRY_BASE_MILLIS,\n                        loadRetryMaxBackoffMillis: STANDALONE_LOAD_RETRY_MAX_BACKOFF_MILLIS,\n                        reloadAppsIntervalMillis: STANDALONE_RELOAD_INTERVAL_MILLIS,\n                        reloadAppsRetryBaseMillis: STANDALONE_RELOAD_RETRY_BASE_MILLIS\n                    },\n                    getOwner(this).ownerInjection()\n                )\n            )\n        );\n        this.set(\n            'widgetAppPool',\n            AppPool.create(\n                Object.assign(\n                    {\n                        poolName: 'widgetAppPool',\n                        getMaxActive: () => this.widgetMaxActivePoolSize,\n                        fetchAppsFn: this._findAllWidgetApps.bind(this),\n                        loadRetryBaseMillis: WIDGET_LOAD_RETRY_BASE_MILLIS,\n                        loadRetryMaxBackoffMillis: WIDGET_LOAD_RETRY_MAX_BACKOFF_MILLIS,\n                        reloadAppsIntervalMillis: WIDGET_RELOAD_INTERVAL_MILLIS,\n                        reloadAppsRetryBaseMillis: WIDGET_RELOAD_RETRY_BASE_MILLIS\n                    },\n                    getOwner(this).ownerInjection()\n                )\n            )\n        );\n\n        // Listen to local PC-sourced app messages\n        let localMsgListener = bind(this, '_handleLocalMsg');\n        this.set('_localMsgListener', localMsgListener);\n        window.addEventListener('message', localMsgListener);\n        window.addEventListener('onmessage', localMsgListener);\n    },\n\n    /**\n     * Process the app api call from the app specified in app or appInstance\n     */\n    handleAppApiCall(apiCall, contextualApiHandlers) {\n        this._handleApiCall(apiCall, contextualApiHandlers);\n    },\n\n    /**\n     * Checks if an app instance (App) is trusted or not\n     * It's considered trusted if the App is an internal app (InternallyHostedApp)\n     * or if the app type is part of exempted external URLs.\n     *\n     * This should be used to check if an app can receive internal data or not.\n     *\n     * @param {App} appInstance The app instance\n     * @returns whether the app instance is considered trusted or not\n     */\n    isTrustedApp(appInstance) {\n        return (\n            appInstance instanceof InternallyHostedApp ||\n            this.externalUrlExemptIntegrationTypeIds.includes(appInstance.typeId)\n        );\n    },\n\n    /**\n     * Builds and validates Interapptions from the provided config.\n     *\n     * Config must conform to supported properties and the resulting app instance must be valid.\n     * Invalid config or the built app will log in addition to returning null.\n     *\n     * @param {string} typeId - The typeId of the interapption\n     * @param {string} id - The id of the interapption\n     * @param {Object} config - Interapption config\n     * @param {string} config.name - Interapption name\n     * @param {string|string[]} config.sandbox - Interapption sandbox (comma-separated string or array)\n     * @param {string|string[]} config.permissions - Interapption permissions (comma-separated string or array)\n     * @param {string} config.url - Interapption url. Only URL or path can be specified\n     * @param {Object} config.icon - URLs of assets for the icon class of images for this Interapption\n     * @param {Object} config.icon.vector - A URL to a vector icon asset\n     * @param {Object} config.icon.{width}x{height} - A URL to a raster icon asset of the size class indicated by the property\n     * @param {Object} config.monochromicIcon - URLs of assets for the monochrome icon class of images for this Interapption\n     * @param {Object} config.monochromicIcon.vector - A URL to a vector monochrome icon asset\n     * @param {Object} config.monochromicIcon.{width}x{height} - A URL to a raster monochrome icon asset of the size class indicated by the property\n     * @param {Object} config.lifecycle - Lifecycle config\n     * @param {boolean} config.lifecycle.ephemeral - Is app ephemeral\n     * @param {Object} config.lifecycle.hooks - Opt-in lifecycle hooks config\n     * @param {boolean} config.lifecycle.hooks.bootstrap - Should app receive bootstrap event\n     * @param {boolean} config.lifecycle.hooks.focus - Should app receive focus event\n     * @param {boolean} config.lifecycle.hooks.blur - Should app receive blur event\n     * @param {boolean} config.lifecycle.hooks.stop - Should app receive stop event\n     * @param {string} config.subdomain - A subdomain for an InternallyHostedApp (Trusted Only)\n     * @param {string} config.path - A Path for an InternallyHostedApp (Trusted Only)\n     * @param {string} config.query - A querystring for an InternallyHostedApp (Trusted Only)\n     * @param {boolean} trustedProvider - Indicates if this provider can generate trusted apps.\n     *  This should only be used for internal app providers that wish to register internal apps.\n     *  e.g. Altocloud, Relate, Scripter, etc.\n     *\n     * @returns an App or InternallyHostedApp instance if valid; null otherwise\n     */\n    buildValidInterapption(typeId, id, config, trustedProvider = false) {\n        // FUTURE: Support for i10n, full validation, etc. (See: ATEAM-152)\n        if (typeOf(typeId) !== 'string' || typeId.trim().length === 0) {\n            this.stashLogger.debug(\n                appUtils.buildInterapptionsLogMsg('Interapption is being ignored due to a missing/empty typeId.'),\n                {\n                    config,\n                    remoteData: {\n                        typeId,\n                        id,\n                        trustedProvider\n                    }\n                }\n            );\n\n            return null;\n        }\n\n        if (typeOf(id) !== 'string' || id.trim().length === 0) {\n            this.stashLogger.debug(\n                appUtils.buildInterapptionsLogMsg('Interapption is being ignored due to a missing/empty id.'),\n                {\n                    config,\n                    remoteData: {\n                        typeId,\n                        id,\n                        trustedProvider\n                    }\n                }\n            );\n\n            return null;\n        }\n\n        if (typeOf(config) !== 'object') {\n            this.stashLogger.debug(\n                appUtils.buildInterapptionsLogMsg(\n                    'Interapption is being ignored due to an invalid config object type.'\n                ),\n                {\n                    config,\n                    remoteData: {\n                        type: typeOf(config),\n                        typeId,\n                        id,\n                        trustedProvider\n                    }\n                }\n            );\n\n            return null;\n        }\n\n        let normalizedConfig = {\n            properties: {\n                displayType: APP_DISPLAY_TYPES.INTERAPPTION\n            },\n            advanced: {}\n        };\n\n        // Validate and map config properties to normalized config\n        let propError = null;\n\n        let configKeys = Object.keys(config);\n        for (let index = 0; index < configKeys.length; index++) {\n            let currKey = configKeys[index];\n            let currValue = config[currKey];\n            let currPropConfig = INTERAPPTION_PROP_MAPPING_CONFIG[currKey];\n\n            if (!currPropConfig) {\n                propError = `${currKey} is not a supported interapption property`;\n                break;\n            }\n\n            if (currPropConfig.convert) {\n                try {\n                    currValue = currPropConfig.convert(currValue);\n                } catch (e) {\n                    propError = `Failed to convert ${currKey} to a valid input`;\n                    break;\n                }\n            } else if (typeOf(currValue) !== currPropConfig.type) {\n                propError = `${currKey} should be of type ${currPropConfig.type}`;\n                break;\n            }\n\n            if (currPropConfig.trustedOnly && !trustedProvider) {\n                propError = `${currKey} is only allowed to be configured for trustedProviders`;\n                break;\n            }\n\n            set(normalizedConfig, currPropConfig.destPath, currValue);\n        }\n\n        if (\n            !propError &&\n            Object.prototype.hasOwnProperty.call(config, 'url') &&\n            (Object.prototype.hasOwnProperty.call(config, 'subdomain') ||\n                Object.prototype.hasOwnProperty.call(config, 'path') ||\n                Object.prototype.hasOwnProperty.call(config, 'query'))\n        ) {\n            propError = 'Cannot specify both a URL and any of subdomain, path, or query';\n        }\n\n        if (propError) {\n            this.stashLogger.error(\n                appUtils.buildInterapptionsLogMsg('Interapption is being ignored due to invalid config.'),\n                {\n                    config,\n                    details: propError,\n                    remoteData: {\n                        typeId,\n                        id,\n                        trustedProvider\n                    }\n                }\n            );\n\n            return null;\n        }\n\n        let result = this._buildApp(\n            typeId,\n            id,\n            normalizedConfig,\n            trustedProvider && Object.prototype.hasOwnProperty.call(config, 'path')\n        );\n\n        if (!this._isValidApp(result, 'Interapption')) {\n            return null;\n        }\n\n        return result;\n    },\n\n    /**\n     * Handles app postMessage events from the local frame to support app-like\n     * integrations.\n     */\n    _handleLocalMsg(evt) {\n        if (!evt.source || !this._isLocalMsg(evt.source)) {\n            // Not a valid internal app event\n            return;\n        }\n\n        let apiCall = null;\n\n        try {\n            // Strict parse\n            apiCall = parseMessage(evt.data, true);\n        } catch (parseError) {\n            // TECHDEBT: Remove lenient retry after deprecation period; will have to change logic to ensure only error cases are logged\n            if (parseError.message === 'missingProtocol') {\n                try {\n                    // Re-parse leniently to allow for short deprecation period and logging\n                    apiCall = parseMessage(evt.data, false);\n\n                    // Check the action to reduce deprecation log false positives further\n                    if (PROTOCOL_LENIENT_INTERNAL_ACTION_NAMES.indexOf(apiCall.action) >= 0) {\n                        this.stashLogger.info(\n                            appUtils.buildApiLogMsg(\n                                'Potential internal apps message posted message without protocol information.  This will be deprecated soon.'\n                            ),\n                            {\n                                apiCall,\n                                remoteData: {\n                                    internalPcCall: apiCall.get('internalPcCall'),\n                                    appId: apiCall.get('appId')\n                                }\n                            }\n                        );\n                    } else {\n                        // No protocol and either an unknown or not a legacy action.\n                        // Safe to assume this is not an apps message or is a new action type which should require the protocol\n                        apiCall = null;\n                    }\n                } catch (ignored) {\n                    // Not a client-apps message (e.g. no action field)\n                }\n            } else if (parseError.message === 'missingAction' && typeof evt.data === 'object' && evt.data.protocol) {\n                // Apps Protocol and no action\n                this.stashLogger.error(\n                    appUtils.buildApiLogMsg('(Local) sent an apps message with no action.'),\n                    evt.data\n                );\n            } else {\n                // Not a client-apps message (e.g. invalid payload, unknown protocol, no action)\n            }\n        }\n\n        if (apiCall) {\n            apiCall.set('internalPcCall', true);\n            this._handleApiCall(apiCall);\n        }\n    },\n\n    _isLocalMsg(msgSource) {\n        return msgSource === window;\n    },\n\n    _handleApiCall(apiCall, contextualApiHandlers = []) {\n        if (!apiCall || (!apiCall.get('internalPcCall') && !apiCall.get('appId'))) {\n            // Not a valid app call\n            return;\n        }\n\n        let apiHandlers = contextualApiHandlers.concat(this.globalApiHandlers);\n\n        let appId = apiCall.get('appId');\n        let apiActionDetails = apiCall.get('actionDetails');\n        let asyncHandlerPromise;\n\n        if (apiHandlers.length > 0) {\n            let availHandler = apiHandlers.find(currHandler => {\n                try {\n                    let result = currHandler.canHandle(apiCall);\n\n                    if (typeOf(result) === 'boolean') {\n                        return result;\n                    } else {\n                        this.stashLogger.error(\n                            appUtils.buildApiLogMsg('Handler returned a non-boolean result from canHandle')\n                        );\n                    }\n                } catch (e) {\n                    this.stashLogger.error(appUtils.buildApiLogMsg('Handler threw an Error when running canHandle'), e);\n                }\n\n                return false;\n            });\n            if (availHandler) {\n                try {\n                    asyncHandlerPromise = availHandler.handle(apiCall);\n                } catch (error) {\n                    asyncHandlerPromise = reject(error);\n                }\n            } else {\n                asyncHandlerPromise = reject('No handler exists for the specified call');\n            }\n        } else {\n            asyncHandlerPromise = reject('No handler exists for the specified call');\n        }\n        asyncHandlerPromise\n            .then(() => {\n                this._instrumentApiCall(apiCall);\n            })\n            .catch(reason => {\n                this.stashLogger.error(\n                    appUtils.buildApiLogMsg(\n                        `${apiCall.get('internalPcCall') ? '(Local)' : 'App'} sent a message that could not be handled.`\n                    ),\n                    {\n                        apiActionDetails,\n                        msgFailureDetails: reason,\n                        remoteData: {\n                            appId,\n                            internalPcCall: apiCall.get('internalPcCall')\n                        }\n                    }\n                );\n            });\n    },\n\n    _instrumentApiCall(apiCall) {\n        if (!(apiCall instanceof ApiCall)) {\n            throw new Error('ApiCall instance must be provided');\n        }\n\n        // Redact any non-standard protocols/agents ... just in case\n        let pcAppProtocol = apiCall.get('protocol');\n        if (pcAppProtocol && pcAppProtocol !== APPS_API_PROTOCOL) {\n            pcAppProtocol = 'redactedProtocol';\n        }\n        let pcAppProtocolAgentName = apiCall.get('protocolAgentName');\n        let pcAppProtocolAgentVersion = apiCall.get('protocolAgentVersion');\n        if (pcAppProtocolAgentName && pcAppProtocolAgentName !== 'purecloud-client-app-sdk') {\n            pcAppProtocolAgentName = 'redactedProtocolAgentName';\n            pcAppProtocolAgentVersion = 'redactedProtocolAgentVersion';\n        }\n\n        // Note: Some details are not applicable in all cases.\n        // Providing the entire payload allows for easy filtering on the PageAction\n        this._addPageAction('clientAppApiCall', {\n            apiAction: apiCall.get('action'),\n            pcAppProtocol,\n            pcAppProtocolAgentName,\n            pcAppProtocolAgentVersion,\n\n            // App Details\n            internalPcCall: apiCall.get('internalPcCall'),\n            pcAppTypeId: apiCall.get('srcApp.typeId'),\n            pcAppId: apiCall.get('srcApp.id'),\n            pcAppDisplayType: apiCall.get('srcApp.displayType'),\n            pcAppInternallyHosted: apiCall.get('srcApp') instanceof InternallyHostedApp,\n            pcAppFeatureCategory: apiCall.get('srcApp.featureCategory'),\n\n            // AppInstance Details\n            pcAppInstanceId: apiCall.get('srcAppInstance.instanceId'),\n            pcAppProblemName: apiCall.get('srcAppInstance.problem.name'),\n\n            // Interapption Details\n            interactionId: apiCall.get('srcApp.interactionId')\n        });\n    },\n\n    _addPageAction() {\n        addPageAction(...arguments);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n\n        let localMsgListener = this._localMsgListener;\n        if (localMsgListener) {\n            window.removeEventListener('message', localMsgListener);\n            window.removeEventListener('onmessage', localMsgListener);\n            this.set('_localMsgListener', null);\n        }\n\n        // Clean up pools\n        [this.standaloneAppPool, this.widgetAppPool].forEach(currPool => {\n            if (currPool && !currPool.isDestroying && !currPool.isDestroyed) {\n                currPool.destroy();\n            }\n        });\n    },\n\n    _findAllStandaloneApps() {\n        return this._fetchAppsByType(APP_DISPLAY_TYPES.STANDALONE);\n    },\n\n    _findAllWidgetApps() {\n        return this._fetchAppsByType(APP_DISPLAY_TYPES.WIDGET);\n    },\n\n    findAllInterapptions() {\n        return this._fetchAppsByType(APP_DISPLAY_TYPES.INTERAPPTION);\n    },\n\n    _fetchAppsByType(type) {\n        return this._fetchAppsByTypeRemote(type);\n    },\n\n    /*\n     * Cache the list of apps for awhile reduce network traffic\n     * due to fetching multiple app types at boot and reload\n     */\n    _remoteAppPromise: null,\n    _remoteAppRequestTimestamp: null,\n    _fetchAppsByTypeRemote(type) {\n        let now = Date.now();\n        let allAppsPromise = this._remoteAppPromise;\n        let lastRequestTs = this._remoteAppRequestTimestamp;\n\n        if (\n            !allAppsPromise ||\n            this._bypassAppCache ||\n            (lastRequestTs && now - lastRequestTs > REMOTE_APPS_CACHE_TTL_MILLIS)\n        ) {\n            allAppsPromise = new Promise((resolve, reject) => {\n                this._accumulateApps(\n                    apps => {\n                        if (apps && apps.length > 1) {\n                            apps.sort((app1, app2) => {\n                                return app1.get('name').localeCompare(app2.get('name'));\n                            });\n                        }\n\n                        resolve(apps);\n                    },\n                    reason => {\n                        // clear the instance's promise on falures so we dont cache failed requests\n                        this.set('_remoteAppPromise', null);\n                        reject(reason);\n                    },\n                    1,\n                    50,\n                    null\n                );\n            });\n            this.set('_remoteAppPromise', allAppsPromise);\n            this.set('_remoteAppRequestTimestamp', now);\n        }\n\n        return allAppsPromise.then(apps => {\n            return apps.filter(currApp => currApp.get('displayType') === type);\n        });\n    },\n\n    _accumulateApps(resolve, reject, pageNumber, pageSize, type, apps) {\n        if (typeof apps === 'undefined' || apps === null) {\n            apps = [];\n        }\n\n        let appsUrl = this.application.pcV2Uri(`${APPS_BASE_URL}`);\n        let queryParams = {\n            pageNumber,\n            pageSize\n        };\n        appsUrl += `?${new URLSearchParams(queryParams).toString()}`;\n\n        let headers = {};\n\n        const primaryLocale = this._getPrimaryLocale();\n        if (primaryLocale) {\n            headers['Accept-Language'] = primaryLocale;\n        }\n        if (this._bypassAppCache) {\n            headers['Cache-Control'] = 'no-cache';\n        }\n\n        this.ajax\n            .request(appsUrl, {\n                headers\n            })\n            .then(result => {\n                if (!result) {\n                    reject('Invalid clientapps return value');\n                    return;\n                }\n\n                if (Array.isArray(result.entities)) {\n                    let validAppObjs = _.chain(result.entities)\n                        .filter(currIntegration => {\n                            return (\n                                currIntegration &&\n                                typeof currIntegration === 'object' &&\n                                typeOf(get(currIntegration, 'integrationType.id')) === 'string' &&\n                                !_.isEmpty(get(currIntegration, 'config.effective.properties'))\n                            );\n                        })\n                        .map(currIntegration => {\n                            let internallyHosted = this._isInternallyHostedApp(currIntegration.integrationType.id);\n                            return this._buildApp(\n                                currIntegration.integrationType.id,\n                                currIntegration.id,\n                                currIntegration.config.effective,\n                                internallyHosted\n                            );\n                        })\n                        .filter(currApp => {\n                            return (\n                                !!currApp &&\n                                this._isValidApp(\n                                    currApp,\n                                    currApp.get('displayType') === APP_DISPLAY_TYPES.INTERAPPTION\n                                        ? 'Interapption'\n                                        : undefined\n                                ) &&\n                                (!type || currApp.get('displayType') === type)\n                            );\n                        })\n                        .value();\n\n                    apps.push(...validAppObjs);\n                }\n\n                if (result.pageNumber < result.pageCount) {\n                    this._accumulateApps(resolve, reject, result.pageNumber + 1, pageSize, type, apps);\n                } else {\n                    resolve(apps);\n                }\n            })\n            .catch(reject);\n    },\n\n    _getPrimaryLocale() {\n        let isoLocale = this.get('intl.isoLocale');\n\n        if (typeOf(isoLocale) === 'string' && isPresent(isoLocale)) {\n            return isoLocale;\n        } else {\n            this.stashLogger.warn(appUtils.buildLogMsg('Unable to find current locale'), {\n                remoteData: {\n                    intlLocale: this.get('intl.locale'),\n                    intlIsoLocale: this.get('intl.isoLocale')\n                }\n            });\n            return null;\n        }\n    },\n\n    _buildApp(typeId, id, config, internallyHosted = false) {\n        let result = null;\n        let langTag = this._getPrimaryLocale();\n\n        // Common app props\n        let appProps = {\n            typeId,\n            id,\n            name: this._parseLangTagProp(config, 'advanced.i10n', langTag, 'name') || get(config, 'name'),\n            sandbox: this._parseMultiValueProp(config, 'properties.sandbox', ALLOWED_SANDBOX_VALUES),\n            displayType: this._parseProp(config, 'properties.displayType', _.values(APP_DISPLAY_TYPES)),\n            featureCategory: this._parseProp(config, 'properties.featureCategory', _.values(APP_FEATURE_CATEGORIES)),\n            permissionsPolicy: this._parseMultiValueProp(config, 'properties.permissions', ALLOWED_PERMISSION_VALUES),\n            enabledQueueIds: this._parseProp(config, 'properties.queueIdFilterList'),\n            lifecycle: get(config, 'advanced.lifecycle'),\n            assets: {},\n            // Set runtime state for internal model use\n            langTag: langTag || '',\n            envTld: this.get('application.envDetails.envTld') || '',\n            usePopupAuth: !!this.session.get('popoutAuthForIframes'),\n            ucIntegrationKey: this._parseProp(config, 'properties.ucIntegrationKey'), // UC Integration use\n            integrationPresenceSource: this._parseProp(config, 'properties.integrationPresenceSource'), // UC Integration use\n            pbxPermission: this._parseProp(config, 'properties.pbxPermission'), // UC Integration use\n            gcHostOrigin: netUtils.getCurrentWindowOrigin(),\n            gcTargetEnv: this.get('application.runtime.name'),\n            enableWorkitem: this._parseBooleanProp(config, 'properties.enableWorkitemFilter')\n        };\n\n        // Only attempt to parse communicationTypeFilter when specifed to differentiate undefined/null from []\n        if (!isNone(get(config, 'properties.communicationTypeFilter'))) {\n            appProps.enabledCommunicationTypes = this._parseMultiValueProp(\n                config,\n                'properties.communicationTypeFilter',\n                [...INTERAPPTION_COMMUNICATION_TYPE_FILTERS, NO_SUPPORTED_COMMUNICATION_TYPE_FILTER]\n            );\n        }\n\n        // check for browser support and conditionally replace local-network and loopback-network with local-network-access\n        appProps.permissionsPolicy = AppsV2.getEffectiveLnaPolicy(appProps.permissionsPolicy);\n\n        if (!internallyHosted) {\n            appProps.urlTemplate = get(config, 'properties.url');\n            result = App.create(getOwner(this).ownerInjection(), appProps);\n        } else {\n            appProps.subdomain = get(config, 'properties.subdomain');\n            appProps.envDetails = this.get('application.envDetails');\n            let path = get(config, 'properties.path');\n\n            const ucIntegrationId = get(appProps, 'ucIntegrationKey');\n            if (ucIntegrationId && ucIntegrationId !== '') {\n                let queryParams = parseQueryParams();\n                let featureBranch = queryParams[ucIntegrationId];\n                if (featureBranch) {\n                    console.debug(\n                        'services/apps internally hosted app with feature branch: found feature branch: ',\n                        featureBranch\n                    );\n                    path = (path ? (path[path.length - 1] === '/' ? path : `${path}/`) : '') + featureBranch;\n                }\n            }\n\n            appProps.path = path;\n            appProps.query = get(config, 'properties.query');\n            result = InternallyHostedApp.create(getOwner(this).ownerInjection(), appProps);\n        }\n\n        // Extract assets for each supported asset category\n        APP_ASSET_CATEGORIES.forEach(currAssetCategory => {\n            let currAssetCategoryCfg = {};\n\n            const currVector = get(config, `advanced.${currAssetCategory}.${VECTOR_IMG_KEY}`);\n            if (currVector) {\n                currAssetCategoryCfg.vector = currVector;\n            }\n            const currRasters = this._extractRasterImgs(config, `advanced.${currAssetCategory}`);\n            if (Object.keys(currRasters).length > 0) {\n                currAssetCategoryCfg.raster = currRasters;\n            }\n\n            const icon = get(config, `advanced.${currAssetCategory}`);\n            if (icon && icon.guxIcon) {\n                currAssetCategoryCfg.guxIcon = icon.guxIcon;\n            }\n\n            if (Object.keys(currAssetCategoryCfg).length > 0) {\n                result.set(`assets.${currAssetCategory}`, currAssetCategoryCfg);\n            } else if (config) {\n                const advanced = get(config, `advanced`);\n                if (advanced) {\n                    const assetCategory = get(advanced, currAssetCategory);\n                    if (assetCategory) {\n                        const classNames = get(assetCategory, 'classNames');\n                        if (classNames) {\n                            const assets = get(result, 'assets');\n                            if (!get(assets, currAssetCategory)) {\n                                set(assets, currAssetCategory, { classNames });\n                            } else {\n                                set(assets, `${currAssetCategory}.classNames`, classNames);\n                            }\n                        }\n                    }\n                }\n            }\n        });\n\n        return result;\n    },\n\n    /**\n     * Extract all images of pattern digit(s)xdigit(s) from the basePath\n     */\n    _extractRasterImgs(config, basePath) {\n        let result = {};\n\n        let imgs = get(config, basePath);\n\n        if (imgs && typeof imgs === 'object') {\n            for (let currImgKey in imgs) {\n                if (currImgKey !== VECTOR_IMG_KEY) {\n                    let parseResult = RASTER_IMG_KEY_REG_EXP.exec(currImgKey);\n                    if (parseResult && parseResult[1] === parseResult[2]) {\n                        result[`x${parseResult[1]}`] = imgs[currImgKey];\n                    }\n                }\n            }\n        }\n\n        return result;\n    },\n\n    _isValidApp(app, appType = 'App') {\n        try {\n            this._validateApp(app);\n\n            return true;\n        } catch (e) {\n            let logMessageAppType = appType === 'App' ? 'App' : 'Interapption';\n            let logLevel;\n            let logMessage;\n\n            switch (e.message) {\n                case 'invalidTypeId':\n                case 'invalidId':\n                case 'invalidName':\n                case 'invalidDisplayType':\n                    logLevel = 'debug';\n                    logMessage = `${logMessageAppType} is being ignored due to a missing typeId, id, name, or displayType.`;\n                    break;\n                case 'invalidPath':\n                    logLevel = 'info';\n                    logMessage = `Internally Hosted ${logMessageAppType} is being ignored due to a missing/invalid path.`;\n                    break;\n                case 'invalidSubdomain':\n                    logLevel = 'info';\n                    logMessage = `Internally Hosted ${logMessageAppType} is being ignored due to an emptystring/invalid subdomain.`;\n                    break;\n                case 'invalidQuery':\n                    logLevel = 'info';\n                    logMessage = `Internally Hosted ${logMessageAppType} is being ignored due to an invalid query type.`;\n                    break;\n                case 'missingUrl':\n                    logLevel = 'debug';\n                    logMessage = `${logMessageAppType} is being ignored due to a missing url.`;\n                    break;\n                case 'invalidUrlProtocol':\n                    logLevel = 'error';\n                    logMessage = `${logMessageAppType} is being ignored due to an invalid protocol.`;\n                    break;\n                case 'reservedPureCloudDomain':\n                    logLevel = 'error';\n                    logMessage = `${logMessageAppType} is being ignored due to use of a PC reserved domain.`;\n                    break;\n                case 'malformedUrl':\n                    logLevel = 'error';\n                    logMessage = `${logMessageAppType} is being ignored due to an unparsable URL.`;\n                    break;\n                case 'unexpectedInterapptionProperty':\n                    logLevel = 'error';\n                    logMessage = `${logMessageAppType} is being ignored due to an unexpected Interaction Widget property.`;\n                    break;\n                default:\n                    logLevel = 'error';\n                    logMessage = `${logMessageAppType} is being ignored`;\n                    break;\n            }\n\n            let fullLogMsg = null;\n            if (appType === 'Interapption') {\n                fullLogMsg = appUtils.buildInterapptionsLogMsg(logMessage);\n            } else {\n                fullLogMsg = appUtils.buildLogMsg(logMessage);\n            }\n\n            this.get(`stashLogger.${logLevel}`)(fullLogMsg, {\n                appUrl: app.get('url'),\n                remoteData: { appId: app.get('id') }\n            });\n\n            return false;\n        }\n    },\n\n    _validateApp(app) {\n        if (typeOf(app.typeId) !== 'string' || app.typeId.trim().length === 0) {\n            throw new Error('invalidTypeId');\n        }\n\n        if (typeOf(app.id) !== 'string' || app.id.trim().length === 0) {\n            throw new Error('invalidId');\n        }\n\n        if (typeOf(app.name) !== 'string' || app.name.trim().length === 0) {\n            throw new Error('invalidName');\n        }\n\n        if (typeOf(app.displayType) !== 'string' || app.displayType.trim().length === 0) {\n            throw new Error('invalidDisplayType');\n        }\n\n        if (app instanceof InternallyHostedApp) {\n            let internalAppPath = app.get('path');\n            if (typeOf(internalAppPath) !== 'string' || isBlank(internalAppPath)) {\n                throw new Error('invalidPath');\n            }\n\n            // subdomain can be null, undefined, or non-empty String\n            let internalAppSubdomain = app.get('subdomain');\n            let subdomainType = typeOf(internalAppSubdomain);\n            if (\n                !(\n                    subdomainType === 'null' ||\n                    subdomainType === 'undefined' ||\n                    (subdomainType === 'string' && internalAppSubdomain.trim().length > 0)\n                )\n            ) {\n                throw new Error('invalidSubdomain');\n            }\n\n            // query can be null, undefined, or a string (blank allowed)\n            let internalAppQuery = app.get('query');\n            if (['null', 'undefined', 'string'].indexOf(typeOf(internalAppQuery)) < 0) {\n                throw new Error('invalidQuery');\n            }\n        }\n\n        if (isBlank(app.get('url'))) {\n            throw new Error('missingUrl');\n        }\n\n        // Enforce app URL protocol of http/https (http should primarily be used for development)\n        if (APP_PROTOCOL_CHECK_REG_EXG.exec(app.get('url')) === null) {\n            throw new Error('invalidUrlProtocol');\n        }\n\n        let externalUrl = null;\n        try {\n            // IMPORTANT: In addition to checking internal/external, this checks the validity of the url.  It must be run regardless of app type\n            externalUrl = netUtils.isExternalDomain(app.get('url'));\n        } catch (invalidUrl) {\n            throw new Error('malformedUrl');\n        }\n\n        if (\n            !externalUrl &&\n            !(app instanceof InternallyHostedApp) &&\n            this.externalUrlExemptIntegrationTypeIds.indexOf(app.get('typeId')) < 0\n        ) {\n            // Disallow internal URLs on external apps due to sandbox concerns\n            throw new Error('reservedPureCloudDomain');\n        }\n\n        // Interapptions validation\n        if (app.displayType !== APP_DISPLAY_TYPES.INTERAPPTION) {\n            [\n                'interactionId',\n                'interactionType',\n                'enabledQueueIds',\n                'enabledCommunicationTypes',\n                'enableWorkitem'\n            ].forEach(currKey => {\n                if (app.get(currKey) !== undefined && app.get(currKey) !== null) {\n                    throw new Error('unexpectedInterapptionProperty');\n                }\n            });\n        }\n\n        return true;\n    },\n\n    _isInternallyHostedApp(integrationTypeId) {\n        return get(ENV, 'purecloud-apps.internallyHostedIntegrationTypeIds').indexOf(integrationTypeId) >= 0;\n    },\n\n    _parseProp(obj, prop, validItems = null) {\n        let propVal = get(obj, prop);\n        if (propVal && (validItems === null || validItems.indexOf(propVal) >= 0)) {\n            return propVal;\n        }\n    },\n\n    _parseBooleanProp(obj, prop) {\n        let propVal = get(obj, prop);\n        if (typeof propVal === 'boolean') {\n            return propVal;\n        }\n        return undefined;\n    },\n\n    _parseMultiValueProp(obj, prop, validItems = null, separator = ',') {\n        let result = [];\n\n        let propVal = get(obj, prop);\n        if (propVal) {\n            result = propVal.split(separator).reduce((validatedItems, curr) => {\n                if (curr) {\n                    let toCheck = curr.trim();\n\n                    if (toCheck.length > 0 && (validItems === null || validItems.indexOf(toCheck) >= 0)) {\n                        validatedItems.push(toCheck);\n                    }\n                }\n\n                return validatedItems;\n            }, []);\n        }\n\n        return result;\n    },\n\n    // Storage for previous langTag regexp instances\n    _langTagRegExps: {},\n\n    /**\n     * Leniently locate a langTag-specific property within the specified object and baseProp. The\n     * provided langTag will searched in a padding space and case insensitive manor.\n     *\n     * @param {Object} obj - The base object to search\n     * @param {String} baseProp - single or dot-separated list of hierarchical props identifying the base object to search\n     * @param {String} langTag - the bcp47 langTag to search for within obj[baseProp]\n     * @param {String} langTagRelProp - single or dot-separated list of hierarchical props identifying the langTag-relative property to return\n     *\n     * @returns the value of the prop if it is found for the current locale; undefined otherwise.\n     */\n    _parseLangTagProp(obj, baseProp, langTag, langTagRelProp) {\n        if (typeOf(langTag) !== 'string' || !langTag.trim()) {\n            // Log and return undefined as this is an internal method. No need to throw and handle outside\n            this.stashLogger.warn(\n                appUtils.buildLogMsg('Missing/Invalid langTag provided to parse langTag specific prop'),\n                {\n                    remoteData: {\n                        langTag\n                    }\n                }\n            );\n\n            return undefined;\n        }\n\n        let result = get(obj, `${baseProp}.${langTag}.${langTagRelProp}`);\n\n        if (typeof result === 'undefined') {\n            // Check for lenient langTags\n            let baseObj = get(obj, baseProp);\n            if (baseObj) {\n                let lenientLangTag = langTag.trim().toLowerCase();\n                let langTagRegExp = this._langTagRegExps[lenientLangTag];\n                if (!langTagRegExp) {\n                    langTagRegExp = new RegExp(`^\\\\s*${lenientLangTag}\\\\s*$`, 'i');\n                    this._langTagRegExps[lenientLangTag] = langTagRegExp;\n                }\n\n                let langKey = Object.keys(baseObj).find(key => {\n                    return langTagRegExp.test(key);\n                });\n\n                if (typeOf(langKey) === 'string') {\n                    result = get(baseObj, `${langKey}.${langTagRelProp}`);\n                }\n            }\n        }\n\n        return result;\n    }\n});\n","import { debounce, once } from '@ember/runloop';\nimport Service, { inject as service } from '@ember/service';\nimport RSVP from 'rsvp';\nimport _ from 'lodash';\nimport { FL } from '../utils/entity-fields';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport { getEntityObjectId, isDirectoryId } from 'web-directory/utils/jid-helpers';\n\nfunction isGuid(id) {\n    if (!id) {\n        return false;\n    }\n\n    return !!id.match(/^[a-z0-9-]{36}$/i);\n}\n\nexport function isJid(id) {\n    if (!id) {\n        return false;\n    }\n\n    return !!id.match(/(?!.*\\/).*@.*$/i);\n}\n\nexport default Service.extend(LoggerMixin, {\n    store: service(),\n    peopleQueue: {},\n    groupQueue: {},\n\n    getUser(id) {\n        return new RSVP.Promise(resolve => {\n            this.checkCacheForEntity(id, 'person', resolve);\n        });\n    },\n\n    refreshUser(id) {\n        return new RSVP.Promise(resolve => {\n            this.queueEntity('person', id, resolve);\n        });\n    },\n\n    getChatUser(jid) {\n        return new RSVP.Promise(resolve => {\n            this.checkCacheForEntity(jid, 'person', resolve);\n        });\n    },\n\n    getGroup(jid) {\n        return new RSVP.Promise(resolve => {\n            this.checkCacheForEntity(jid, 'group', resolve);\n        });\n    },\n\n    checkCacheForEntity(objectId, entityType, resolve) {\n        let cachedModel = this.store.peekRecord(entityType, objectId);\n        if (cachedModel) {\n            return resolve(cachedModel);\n        }\n        if (objectId.indexOf('@') > -1) {\n            const possibleCache = this.store.peekAll(entityType);\n            if (possibleCache) {\n                cachedModel = possibleCache.findBy('jid', objectId);\n            }\n        }\n        if (cachedModel) {\n            return resolve(cachedModel);\n        }\n        this.queueEntity(entityType, objectId, resolve);\n    },\n\n    queueEntity(entityType, entityId, resolve) {\n        let possibleJid = entityId;\n        if (isJid(entityId)) {\n            entityId = getEntityObjectId(entityId);\n        }\n\n        if (!isGuid(entityId) && !isDirectoryId(entityId) && !isDirectoryId(getEntityObjectId(entityId))) {\n            const placeholder = this.store.push({\n                data: {\n                    type: entityType,\n                    id: entityId,\n                    _id: entityId,\n                    general: {\n                        name: [\n                            {\n                                labelKey: 'name',\n                                value: entityId\n                            }\n                        ]\n                    }\n                }\n            });\n            return resolve(placeholder);\n        }\n\n        let queue = {};\n        switch (entityType) {\n            case 'person':\n                queue = this.peopleQueue;\n                break;\n            case 'group':\n                queue = this.groupQueue;\n                break;\n        }\n        if (queue[possibleJid] == null) {\n            queue[possibleJid] = [];\n        }\n        queue[possibleJid].push(resolve);\n        this.scheduleQueues();\n    },\n\n    scheduleQueues() {\n        debounce(this, this._scheduleQueues, 500);\n    },\n\n    _scheduleQueues() {\n        once(this, this._handleQueues);\n    },\n\n    _handleQueues() {\n        if (!(this.isDestroyed || this.isDestroying)) {\n            const people = this.clearQueue('peopleQueue');\n            const groups = this.clearQueue('groupQueue');\n\n            if (!_.isEmpty(people)) {\n                this.processQueue('person', people);\n            }\n            if (!_.isEmpty(groups)) {\n                this.processQueue('group', groups);\n            }\n        }\n    },\n\n    clearQueue(queue) {\n        const value = this.get(queue);\n        this.set(queue, {});\n        return value;\n    },\n\n    processQueue(entityType, queue) {\n        const ids = _.keys(queue);\n        this.logger.debug('BATCH: Processing queue', entityType, ids.length);\n\n        return this.store\n            .findMany(entityType, ids, FL[entityType])\n            .then(results => {\n                return this.resolveResults(entityType, queue, results);\n            })\n            .catch(err => {\n                this.logger.error('BATCH: Failed to fetch entities in bulk:', {\n                    entityType,\n                    ids: ids.length < 25 ? ids.join(',') : ids.length,\n                    err\n                });\n                return this.resolveResults(entityType, queue, []);\n            });\n    },\n\n    resolveResults(entityType, queue, results) {\n        const ids = Object.keys(queue);\n\n        _.forEach(results, entity => {\n            // entities are requested/queued by jid, id (guid) or id (_id, mongoid)\n            ['id', 'jid', '_id'].forEach(id => {\n                const entityId = entity.get(id);\n                const promises = queue[entityId];\n                if (promises) {\n                    promises.forEach(resolve => resolve(entity));\n                }\n                _.remove(ids, id => id === entityId);\n            });\n        });\n\n        if (ids.length > 0) {\n            const missingIds = ids.length < 100 ? ids.join(',') : ids.length;\n            this.logger.info(\n                'BATCH: Queue had remaining items not resolved, resolving with placeholder for single request:',\n                {\n                    entityType,\n                    missingIds\n                }\n            );\n            _.forEach(ids, id => {\n                const keyId = id;\n                if (isJid(id)) {\n                    id = getEntityObjectId(id);\n                }\n                const placeholder = this.store.push({\n                    data: {\n                        type: entityType,\n                        id: id,\n                        _id: id,\n                        general: {\n                            name: [\n                                {\n                                    labelKey: 'name',\n                                    value: id\n                                }\n                            ]\n                        }\n                    }\n                });\n\n                _.forEach(queue[keyId], resolve => resolve(placeholder));\n            });\n        }\n    }\n});\n","import Service, { inject as service } from '@ember/service';\nimport { computed } from '@ember/object';\nimport { reads, alias } from '@ember/object/computed';\nimport { NavMenu } from 'web-directory/components/command-nav/navMenu';\nimport { getMatchingLinks, findBestMatchingMenuItem } from 'web-directory/utils/command-nav';\nimport { Maybe } from 'web-directory/types';\n\n// FrameService exposes more than the services.d.ts stub covers; extend it locally.\ninterface FrameServiceWithConfig extends Service {\n    pageTitle: Maybe<string>;\n    activeCenterStageClients: unknown;\n    configByPath(path: string): Maybe<{ defaultTitle?: string }>;\n}\ninterface StandaloneApp {\n    id: string;\n    name: string;\n}\n\nconst bookmarkPageTitleService = Service.extend({\n    commandNav: service('command-nav'),\n    frameService: service('center-stage-frame'),\n    application: service('application'),\n    intl: service('intl'),\n\n    /**\n     * Directly-written title for admin routes, set by embedded-admin\n     * when it receives a 'content:route:changed' postMessage.\n     */\n    adminPageTitle: null as Maybe<string>,\n\n    /**\n     * Title set by native Ember routes via reopen-route, paired with the URL it was set for.\n     */\n    nativePageTitle: null as Maybe<{ title: string; forURL: string }>,\n\n    /**\n     * Flat list of standalone app {id, name} pairs, aliased from command-nav.\n     * Populated by command-nav component once standaloneAppPool resolves.\n     */\n    standaloneApps: alias('commandNav.standaloneApps'),\n\n    /** For panel-as-page-title: whether the panel is expanded. */\n    sidePanelExpanded: reads('commandNav.expanded'),\n\n    /** For panel-as-page-title: the current panel name. */\n    currentSidePanel: reads('commandNav.currentPanel'),\n\n    /**\n     * Returns the standalone app entry matching the current URL, or null.\n     * Apps are served at #/apps/<appId>.\n     */\n    currentStandaloneApp: computed(\n        'standaloneApps',\n        'commandNav._router.currentURL',\n        function (this: any): Maybe<StandaloneApp> {\n            const apps = this.get('standaloneApps') as Maybe<StandaloneApp[]>;\n            if (!apps || !apps.length) return null;\n\n            const currentURL = (this.get('commandNav._router.currentURL') as Maybe<string>) || '';\n            const match = currentURL.match(/\\/apps\\/([^/?#]+)/);\n            if (!match) return null;\n\n            const appId = match[1];\n            return apps.find(app => app.id === appId) || null;\n        }\n    ),\n\n    bookmarkPageTitle: computed(\n        'commandNav._router.currentURL',\n        'application.currentRouteName',\n        'frameService.pageTitle',\n        'frameService.activeCenterStageClients',\n        'adminPageTitle',\n        'nativePageTitle',\n        'currentStandaloneApp',\n        function (this: any): string {\n            const currentURL = (this.get('commandNav._router.currentURL') as Maybe<string>) || '';\n            const currentRouteName = (this.get('application.currentRouteName') as Maybe<string>) || '';\n            const currentStandaloneApp = this.get('currentStandaloneApp') as Maybe<StandaloneApp>;\n            const hash = `#${currentURL}`;\n\n            // center-stage-frame (IFC) routes\n            if (currentRouteName.startsWith('center-stage-frame')) {\n                const framePageTitle = this.get('frameService.pageTitle') as Maybe<string>;\n                if (framePageTitle) return framePageTitle;\n\n                // match against command-nav links using the same logic as the command-nav component\n                const matches = getMatchingLinks(NavMenu, hash);\n                const navMatch = matches.length === 1 ? matches[0] : findBestMatchingMenuItem(matches, hash);\n                if (navMatch) {\n                    return this.get('intl').t(navMatch.title) as string;\n                }\n\n                // fallback to IFC route name if needed\n                const shortenedHash = currentURL.startsWith('#') ? currentURL.slice(1) : currentURL;\n                const clientConfig = (this.get('frameService') as FrameServiceWithConfig).configByPath(shortenedHash);\n                if (clientConfig && clientConfig.defaultTitle) return clientConfig.defaultTitle;\n\n                return currentURL;\n            }\n\n            // admin routes\n            if (currentRouteName.startsWith('admin')) {\n                const adminPageTitle = this.get('adminPageTitle') as Maybe<string>;\n                if (adminPageTitle) return adminPageTitle;\n                return currentURL;\n            }\n\n            // standalone app routes\n            if (currentRouteName.startsWith('third-party.app-embed')) {\n                if (currentStandaloneApp) return currentStandaloneApp.name;\n                return currentURL;\n            }\n\n            // native page routes\n            const nativeEntry = this.get('nativePageTitle') as Maybe<{ title: string; forURL: string }>;\n            const nativePageTitle = nativeEntry?.forURL === currentURL ? nativeEntry.title : null;\n            if (nativePageTitle) {\n                return nativePageTitle.split('-')[0].trim();\n            }\n\n            // match against command-nav links using the same logic as the command-nav component\n            const matches = getMatchingLinks(NavMenu, hash);\n            const navMatch = matches.length === 1 ? matches[0] : findBestMatchingMenuItem(matches, hash);\n            if (navMatch) {\n                return this.get('intl').t(navMatch.title) as string;\n            }\n\n            return currentURL;\n        }\n    )\n});\n\nexport default bookmarkPageTitleService;\nexport class BookmarkPageTitleService extends bookmarkPageTitleService {}\n\ndeclare module '@ember/service' {\n    interface Registry {\n        'bookmark-page-title': BookmarkPageTitleService;\n    }\n}\n","import { get, computed, defineProperty } from '@ember/object';\nimport ComputedProperty from '@ember/object/computed';\nimport { run } from '@ember/runloop';\nimport Service, { inject } from '@ember/service';\nimport localforage from 'localforage';\nimport type { WorkitemInteraction } from '@genesys/genesys-cloud-conversation-utils';\nimport type {\n    CaseCacheEntryType,\n    CaseAssociationRequestBody,\n    CaseAssociationResponse,\n    ConversationId,\n    WorkitemId,\n    CaseAssociationEntities,\n    CaseAssociationStore\n} from 'web-directory/types/case-types';\nimport type { Maybe } from 'web-directory/types/maybe.type';\nimport LruCache from 'web-directory/utils/lru-cache';\n\n/** Persisted value for one interaction/workitem id in the case association store. */\ntype CasePersistedEntry = { entities: CaseAssociationEntities; storedAt: number };\n\n/**\n * Public API of the case-association service. Implemented by CaseAssociationServiceImpl below.\n */\nexport interface CaseAssociationService {\n    /** In-memory LRU cache for case association results (hit, miss, or pending) per interaction/workitem id. */\n    casesCache: LruCache<string, CaseCacheEntryType>;\n    /** Incremented when cache is updated so consumers can re-render. */\n    cacheVersion: number;\n    /** True when case panel, service toggles, and view permission are all enabled. */\n    casePanelAndServiceTogglesEnabled: ComputedProperty<boolean>;\n    /** True when the user has permission to view case associations. */\n    canViewCaseAssociationPerm: ComputedProperty<boolean>;\n    /** True when case association API requests are enabled (feature toggle + panel/toggles). */\n    caseAssociationRequestFT: ComputedProperty<boolean>;\n    /** True when case icon for workitems with case activities is enabled. */\n    caseAgentWorkitemUIFT: ComputedProperty<boolean>;\n    /** Schedules a debounced roster sync to load case associations for active interactions/workitems. */\n    scheduleRosterSync(): void;\n    /** Removes a miss or pending entry from the cache so the same id can be re-fetched when it returns to the roster. */\n    invalidateCaseCacheEntry(conversationIdOrWorkitemId: string): void;\n    /**\n     * Returns cached case entities for an interaction/workitem id, or null if not a hit.\n     * When the in-memory LRU is full, a cold id with data only in localforage may keep returning null until a slot frees.\n     */\n    getCachedCase(interactionId: string): Maybe<CaseAssociationEntities>;\n}\n\n/**\n * Default max in-memory rows for case association LRU (RAM only). Persisted hits remain in IndexedDB and can be\n * rehydrated via {@link CaseAssociationServiceImpl._schedulePersistedHitRehydration}.\n */\nexport const CASE_ASSOCIATION_MEMORY_CACHE_MAX_ENTRIES = 350;\n\n/** Platform API path for case association query (used with application.pcV2Uri). */\nconst CASE_ASSOCIATIONS_URL = 'platform/api/v2/casemanagement/cases/associations/query';\n/** Persist hits for 5 days to limit storage growth; cases cannot be unassociated once set. */\nconst PERSISTED_HITS_TTL_MS = 5 * 24 * 60 * 60 * 1000;\n/** Debounce interval (ms) for roster sync before running batched case load. */\nconst ROSTER_SYNC_DEBOUNCE_MS = 250;\n/** Delay (ms) before starting the first batch of case association fetches after roster settles. */\nconst BATCH_FETCH_DELAY_MS = 750;\n/** Batch size for purging expired entries from the case association store (avoids hammering IndexedDB). */\nconst PURGE_BATCH_SIZE = 5;\n/** Maximum number of retries for a single case association fetch. */\nconst MAX_RETRIES = 3;\n/** Initial backoff (ms) before first retry; doubles on each subsequent retry. */\nconst CASE_ASSOCIATION_FIRST_RETRY_MS = 40_000;\n\n/**\n * Workitem interaction type with optional case/caseId on the workitem model (for roster items that may already have case data).\n */\ntype WorkitemWithOptionalCase = Omit<WorkitemInteraction, 'workitem'> & {\n    workitem: WorkitemInteraction['workitem'] & { case?: { id: string }; caseId?: string };\n};\n\n/**\n * No-op store when localForage is unavailable (e.g. createInstance throws) so caseStore is never undefined.\n * @private\n */\nconst NOOP_CASE_STORE: CaseAssociationStore & { _isNoop?: true } = {\n    getItem() {\n        return Promise.resolve(null);\n    },\n    setItem(_key, value) {\n        return Promise.resolve(value);\n    },\n    removeItem() {\n        return Promise.resolve();\n    },\n    keys() {\n        return Promise.resolve([]);\n    },\n    _isNoop: true\n};\n\n/**\n * Module-level singleton so all code paths use the same store (avoids different service instances\n * seeing different store values, e.g. when debounced roster sync runs).\n * @private\n */\nlet _caseAssociationStoreSingleton: CaseAssociationStore | null = null;\n\n/**\n * Serializes roster-driven case loads so overlapping debounced runs do not each request the same id after the first\n * run has already resolved a hit/miss.\n * @private\n */\nlet _caseAssociationRosterLoadTail: Promise<void> = Promise.resolve();\n\n/**\n * Returns the shared case association store, creating it once on first use.\n * @private\n */\nfunction getCaseAssociationStore(): CaseAssociationStore {\n    if (_caseAssociationStoreSingleton) return _caseAssociationStoreSingleton;\n    try {\n        _caseAssociationStoreSingleton = localforage.createInstance({\n            name: 'orgspan',\n            storeName: 'caseAssociation',\n            description: 'Case association persisted hits (one key per interaction/workitem id)'\n        });\n        return _caseAssociationStoreSingleton;\n    } catch {\n        _caseAssociationStoreSingleton = NOOP_CASE_STORE;\n        return _caseAssociationStoreSingleton;\n    }\n}\n\n/**\n * Minimal context for module-level helpers. Uses concrete service types where available;\n * the service implements this; tests can pass a stub.\n * @private\n */\ninterface CaseAssociationHelperContext {\n    get(key: string): unknown;\n    set(key: string, value: unknown): void;\n    /** In-memory cache for case association results. */\n    casesCache: LruCache<string, CaseCacheEntryType>;\n    /** LocalForage store for persisted hits (one key per id). */\n    caseStore: CaseAssociationStore;\n    /** Optional: returns true when the service is destroyed/destroying (avoids setting tracked properties after teardown). */\n    isDestroyed?: () => boolean;\n    /** Application service for building platform URIs. */\n    application: { pcV2Uri(path: string): string };\n    /** Ajax service for case association API requests. */\n    ajax: { post(url: string, opts: { data: CaseAssociationRequestBody }): Promise<CaseAssociationResponse> };\n    /** Logger for warnings. */\n    logger: { warn(msg: string, meta: object): void };\n    /** Interaction service for active interactions. */\n    interaction: { activeInteractions: Array<{ get?: (key: string) => unknown; id?: string }> };\n    /** ACD workitem service for active workitems. */\n    acdworkitem: { activeWorkitems: WorkitemInteraction[] };\n    /** Clears \"no persisted hit\" memo when a hit is cached from API or roster rehydration. */\n    clearPersistedRehydrationNegativeForId?: (id: string) => void;\n}\n\n/**\n * Returns true if the context has an isDestroyed callback and it returns true.\n * Used only to guard tracked property writes (ctx.set) after teardown.\n * Writes to the in-memory cache or localForage are not tracked, so they do not need this guard.\n * @param ctx - Helper context with isDestroyed callback.\n * @returns True if the context is destroyed.\n */\nfunction _isContextDestroyed(ctx: CaseAssociationHelperContext): boolean {\n    return typeof ctx.isDestroyed === 'function' && ctx.isDestroyed();\n}\n\n/**\n * @private\n * Increments the cache version on the next run loop to trigger a re-render of consumers.\n * @param ctx - Helper context with get/set and cache version.\n */\nfunction _bumpCacheVersion(ctx: CaseAssociationHelperContext): void {\n    if (_isContextDestroyed(ctx) || ctx.get('_cacheVersionBumpScheduled')) return;\n\n    ctx.set('_cacheVersionBumpScheduled', true);\n    run.next(ctx, () => {\n        if (_isContextDestroyed(ctx) || !ctx.get('_cacheVersionBumpScheduled')) return;\n        ctx.set('_cacheVersionBumpScheduled', false);\n        ctx.set('cacheVersion', (ctx.get('cacheVersion') as number) + 1);\n    });\n}\n\n/**\n * @private\n * Get a single hit from persisted store if present and not expired.\n * @param ctx - Helper context with caseStore.\n * @param id - Interaction or workitem id to look up.\n */\nasync function _getPersistedHit(\n    ctx: CaseAssociationHelperContext,\n    id: string\n): Promise<Maybe<CaseAssociationEntities>> {\n    const store = ctx.caseStore;\n    if (!store) return null;\n\n    try {\n        const entry = await store.getItem<CasePersistedEntry>(id);\n        if (!entry || !Array.isArray(entry.entities)) return null;\n        if (entry.storedAt <= Date.now() - PERSISTED_HITS_TTL_MS) return null;\n        return entry.entities;\n    } catch (error) {\n        if (ctx.logger) {\n            ctx.logger.warn('ACD: Case association persisted hit read failed', { id, error });\n        }\n        return null;\n    }\n}\n\n/**\n * @private\n * Save a hit to persisted store (one key per id).\n * @param ctx - Helper context with caseStore.\n * @param id - Interaction or workitem id.\n * @param entities - Case association entities to persist.\n */\nasync function _savePersistedHit(\n    ctx: CaseAssociationHelperContext,\n    id: string,\n    entities: CaseAssociationEntities\n): Promise<void> {\n    const store = ctx.caseStore;\n    const isNoop = store && (store as { _isNoop?: boolean })._isNoop === true;\n    if (!store || isNoop) {\n        return;\n    }\n    try {\n        const storeWithReady = store as { ready?: () => Promise<void> };\n\n        if (typeof storeWithReady.ready === 'function') {\n            await storeWithReady.ready();\n        }\n        const value = { entities, storedAt: Date.now() };\n        await store.setItem(id, value);\n    } catch (err) {\n        if (ctx.logger) {\n            ctx.logger.warn('ACD: Case association persisted hit save failed', { id, error: err });\n        }\n    }\n}\n\n/**\n * @private\n * Remove expired entries from the case association store. Runs in background.\n * Processes keys in batches to avoid hammering the store with hundreds of concurrent get/remove calls.\n * @param store - The case association store.\n * @param logger - Optional logger to record prune failures.\n */\nasync function _pruneExpiredHits(\n    store: CaseAssociationStore,\n    logger?: { warn(msg: string, meta: object): void }\n): Promise<void> {\n    if (!store) return;\n\n    const cutoff = Date.now() - PERSISTED_HITS_TTL_MS;\n    try {\n        const keys = await store.keys();\n        for (let i = 0; i < keys.length; i += PURGE_BATCH_SIZE) {\n            const batch = keys.slice(i, i + PURGE_BATCH_SIZE);\n            await Promise.allSettled(\n                batch.map(async key => {\n                    const entry = await store.getItem<CasePersistedEntry>(key);\n                    if (entry && entry.storedAt <= cutoff) {\n                        await store.removeItem(key);\n                    }\n                })\n            );\n        }\n    } catch (err) {\n        if (logger?.warn) {\n            logger.warn('ACD: Case association store prune failed', { error: err });\n        }\n    }\n}\n\n/**\n * @private\n * Runs once roster data has settled: collects interaction/workitem ids that need case data,\n * then fetches them one at a time after {@link BATCH_FETCH_DELAY_MS}. Skips when user cannot view case associations.\n * Chained on {@link _caseAssociationRosterLoadTail} so concurrent debounced syncs do not overlap requests.\n * @param ctx - Helper context with roster services, cache, and feature toggle.\n * @returns A Promise that resolves when the batch load completes (or immediately when there are no ids to load).\n */\nasync function _runBatchedCaseLoad(ctx: CaseAssociationHelperContext): Promise<void> {\n    // chain this run after the prior one so overlapping debounced syncs execute in strict order.\n    const executed = _caseAssociationRosterLoadTail.then(() => _executeRosterCaseLoad(ctx));\n    // keep the shared tail fulfilled even when this run fails. otherwise callback .then() chains can get stuck behind rejection.\n    _caseAssociationRosterLoadTail = executed.catch(() => undefined);\n    // return this run's promise so callers/tests can await the specific scheduled execution.\n    return executed;\n}\n\n/**\n * @private\n * Body of one roster-driven load (invoked sequentially via {@link _caseAssociationRosterLoadTail}).\n */\nasync function _executeRosterCaseLoad(ctx: CaseAssociationHelperContext): Promise<void> {\n    const idsToLoad = await _getRosterIdsNeedingCaseData(ctx);\n\n    if (idsToLoad.length === 0) {\n        return;\n    }\n\n    await new Promise<void>(resolve => {\n        run.later(() => {\n            // roster sync should complete after bootstrap delay even if an individual load path fails.\n            _loadIdsInBatches(ctx, idsToLoad).finally(() => resolve());\n        }, BATCH_FETCH_DELAY_MS);\n    });\n}\n\n/**\n * @private\n * Gets roster items that need a case fetch (conversation or workitem id shape).\n * Loads persisted hits from store per id and populates cache when RAM has room for a new key without eviction;\n * when the LRU is saturated, persisted hits remain only in localforage (no promotion, no cacheVersion bump).\n * @param ctx - Helper context with interaction, acdworkitem, cache, and caseStore.\n * @returns The ids of the roster items that need a case fetch.\n */\nasync function _getRosterIdsNeedingCaseData(\n    ctx: CaseAssociationHelperContext\n): Promise<Array<ConversationId | WorkitemId>> {\n    const result: Array<ConversationId | WorkitemId> = [];\n    const cache = ctx.casesCache;\n    const interactions =\n        (get(ctx.interaction, 'activeInteractions') as Array<{ get?: (key: string) => unknown; id?: string }>) || [];\n\n    for (const interaction of interactions) {\n        const id: string | undefined = get(interaction, 'id');\n        if (!id || cache.has(id)) continue;\n        const persisted = await _getPersistedHit(ctx, id);\n        if (persisted?.length) {\n            if (!cache.wouldEvictOnNewKey(id)) {\n                cache.set(id, { status: 'hit', value: persisted });\n                ctx.clearPersistedRehydrationNegativeForId?.(id);\n                _bumpCacheVersion(ctx);\n            }\n            continue;\n        }\n        result.push({ conversationId: id });\n    }\n\n    const workitems = (get(ctx.acdworkitem, 'activeWorkitems') as WorkitemInteraction[]) || [];\n\n    for (const wi of workitems) {\n        const id = wi.id;\n        const withCase: WorkitemWithOptionalCase = wi;\n        // check if the workitem has an activity case on the model\n        const caseOnModel = withCase.workitem.case?.id ?? withCase.workitem.caseId;\n        if (caseOnModel || cache.has(id)) continue;\n        const persisted = await _getPersistedHit(ctx, id);\n        if (persisted?.length) {\n            if (!cache.wouldEvictOnNewKey(id)) {\n                cache.set(id, { status: 'hit', value: persisted });\n                ctx.clearPersistedRehydrationNegativeForId?.(id);\n                _bumpCacheVersion(ctx);\n            }\n            continue;\n        }\n        result.push({ workitemId: id });\n    }\n\n    return result;\n}\n\n/**\n * @private\n * Loads case associations for each id sequentially one request at a time.\n * @param ctx - Helper context for fetch and cache.\n * @param ids - The ids to load case associations for.\n */\nasync function _loadIdsInBatches(\n    ctx: CaseAssociationHelperContext,\n    ids: Array<ConversationId | WorkitemId>\n): Promise<void> {\n    for (const requestBody of ids) {\n        await _fetchAndCache(ctx, { ...requestBody, pageSize: 1 });\n    }\n}\n\n/**\n * @private\n * Fetch case associations for one interaction/workitem with retry and backoff.\n * Coalesces concurrent calls for the same id via pending (batch + _doFetchAndCache).\n * @param ctx - Helper context for ajax and cache.\n * @param requestBody - Request body (conversationId or workitemId, pageSize).\n * @returns Entity array on success (or empty array when none); null on failure.\n */\nasync function _fetchAndCache(\n    ctx: CaseAssociationHelperContext,\n    requestBody: CaseAssociationRequestBody\n): Promise<Maybe<CaseAssociationEntities>> {\n    const id = requestBody.workitemId ?? requestBody.conversationId;\n    const cache = ctx.casesCache;\n    const entry: CaseCacheEntryType | undefined = cache.get(id);\n\n    // if entry is pending, return the pending promise\n    if (entry?.status === 'pending') {\n        return await entry.promise;\n    }\n    // another roster load may have already resolved this id, so do not request again.\n    if (entry?.status === 'hit') {\n        return entry.value;\n    }\n    if (entry?.status === 'miss') {\n        return [];\n    }\n    // fetch and cache the entry\n    const promise = _doFetchAndCache(ctx, requestBody, id, cache);\n    // cache the pending promise\n    cache.set(id, { status: 'pending', promise });\n    return await promise;\n}\n\n/**\n * @private\n * Fetches case associations for one interaction/workitem with retry and backoff and caches the result.\n * @param ctx - Helper context for application, ajax, logger, and cache.\n * @param requestBody - The request body to fetch case associations for.\n * @param id - The id of the interaction/workitem to fetch case associations for.\n * @param cache - The cache to store the case associations in.\n * @returns The case associations for the interaction/workitem on success (empty array when none);\n *   null on fetch failure after retries.\n */\nasync function _doFetchAndCache(\n    ctx: CaseAssociationHelperContext,\n    requestBody: CaseAssociationRequestBody,\n    id: string,\n    cache: LruCache<string, CaseCacheEntryType>\n): Promise<Maybe<CaseAssociationEntities>> {\n    let lastError: unknown;\n    let delayMs = CASE_ASSOCIATION_FIRST_RETRY_MS;\n\n    for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {\n        try {\n            const url = ctx.application.pcV2Uri(CASE_ASSOCIATIONS_URL);\n            // fetch case associations for the request body\n            const response: CaseAssociationResponse = await ctx.ajax.post(url, {\n                data: requestBody\n            });\n            const entities: CaseAssociationEntities = response?.entities ?? [];\n\n            if (entities.length) {\n                // cache the entry as a hit so we can show case icons\n                cache.set(id, { status: 'hit', value: entities });\n                ctx.clearPersistedRehydrationNegativeForId?.(id);\n                // save the hit to the persisted store\n                await _savePersistedHit(ctx, id, entities);\n            } else {\n                // cache the entry as a miss so we dont re-fetch until interaction is removed from the roster\n                cache.set(id, { status: 'miss' });\n            }\n\n            _bumpCacheVersion(ctx);\n            return entities;\n        } catch (err) {\n            lastError = err;\n            if (attempt < MAX_RETRIES - 1) {\n                await new Promise(resolve => run.later(resolve, delayMs));\n                delayMs *= 2;\n            }\n        }\n    }\n\n    cache.delete(id);\n    ctx.logger?.warn?.('ACD: Case association fetch failed after retries', {\n        id,\n        error: lastError\n    });\n    return null;\n}\n\n/**\n * Ember service that fetches and caches case associations for active interactions and workitems.\n * Syncs with the roster via scheduleRosterSync(), persists hits in IndexedDB (localForage) with one key per id,\n * keeps resolved hit/miss state in an in-memory {@link LruCache} (LRU-bounded; misses also invalidated via roster),\n * and exposes getCachedCase() for UI to show case icons (with async read-through from localForage when memory is cold).\n */\nexport default class CaseAssociationServiceImpl extends Service implements CaseAssociationService {\n    /**\n     * Injected Ember services (ajax, application, interaction, acdworkitem, permissions, session, logger).\n     * Same as the computed properties below, `inject(...)` returns a classic-decorator function that must be\n     * installed via `defineProperty` in `init()` rather than assigned as a bare native class field — a bare\n     * field assignment just stores the raw decorator function on the instance instead of registering a real\n     * injected property.\n     */\n    declare ajax: ReturnType<typeof inject>;\n    declare application: ReturnType<typeof inject>;\n    declare interaction: ReturnType<typeof inject>;\n    declare acdworkitem: ReturnType<typeof inject>;\n    declare permissions: ReturnType<typeof inject>;\n    declare session: ReturnType<typeof inject>;\n    declare logger: ReturnType<typeof inject>;\n\n    /**\n     * Optional store override. When set (e.g. by dependency injection or tests), used instead of\n     * the module default. When unset, getCaseAssociationStore() is used.\n     */\n    caseStore?: CaseAssociationStore;\n\n    /** Resolved store: caseStore if set, otherwise the shared default. */\n    _caseStoreOrDefault(): CaseAssociationStore {\n        const override = get(this, 'caseStore') as CaseAssociationStore | undefined;\n        return override ?? getCaseAssociationStore();\n    }\n\n    init() {\n        super.init();\n\n        // Numbers/booleans must be Ember-owned properties, not native class fields: classic\n        // computed consumers (panel `caseCacheVersion: computed.readOnly('caseAssociation.cacheVersion')`)\n        // may not dirty on Ember 3.28 when a native field changes, even if later writes use `set`.\n        this.set('cacheVersion', 0);\n        this.set('_cacheVersionBumpScheduled', false);\n\n        // Install injected services via defineProperty for the same reason as the computed properties\n        // below — `inject(...)` returns a classic-decorator function that must be registered as a real\n        // property descriptor, not assigned as a plain native class field.\n        defineProperty(this, 'ajax', inject('ajax'));\n        defineProperty(this, 'application', inject('application'));\n        defineProperty(this, 'interaction', inject('interaction'));\n        defineProperty(this, 'acdworkitem', inject('acdworkitem'));\n        defineProperty(this, 'permissions', inject('permissions'));\n        defineProperty(this, 'session', inject('session'));\n        defineProperty(this, 'logger', inject('stash-logger'));\n\n        // `computed(...)` returns a classic-decorator function, not a resolved value. Assigning it\n        // as a plain native class field (e.g. `foo = computed(...)`) just stores that raw decorator\n        // function on the instance — it is never wired up as a real property descriptor, so\n        // `this.get('foo')` returns the decorator function itself instead of its computed value.\n        // That raw function can then flow downstream (e.g. into a curly-component's arg hash) and\n        // trip Ember's \"EmberObject.create no longer supports defining computed properties\" assertion\n        // when some other class tries to `.create()` with it. Installing these via `defineProperty`\n        // in `init()` registers them as real computed properties instead. Mirrors the same fix in\n        // `acd-interactions-panel-v2/component.ts` (`interapptionProviders`/`workerProviders`).\n        defineProperty(this, 'canViewCaseAssociationPerm', computed.readOnly('permissions.canViewCaseAssociation'));\n\n        defineProperty(\n            this,\n            'casePanelAndServiceTogglesEnabled',\n            computed(\n                'session.features.PURE-6320_case_agent_ui',\n                'session.features.PURE-6320_case_management',\n                'canViewCaseAssociationPerm',\n                function () {\n                    return Boolean(\n                        get(this, 'session.features.PURE-6320_case_agent_ui') &&\n                            get(this, 'session.features.PURE-6320_case_management') &&\n                            get(this, 'canViewCaseAssociationPerm')\n                    );\n                }\n            )\n        );\n\n        defineProperty(\n            this,\n            'caseAssociationRequestFT',\n            computed(\n                'session.features.PURE-6320_association_requests_ui',\n                'casePanelAndServiceTogglesEnabled',\n                function (): boolean {\n                    return Boolean(\n                        get(this, 'session.features.PURE-6320_association_requests_ui') &&\n                            get(this, 'casePanelAndServiceTogglesEnabled')\n                    );\n                }\n            )\n        );\n\n        defineProperty(\n            this,\n            'caseAgentWorkitemUIFT',\n            computed(\n                'session.features.PURE-6320_workitem_activities_ui',\n                'casePanelAndServiceTogglesEnabled',\n                function () {\n                    return Boolean(\n                        get(this, 'session.features.PURE-6320_workitem_activities_ui') &&\n                            get(this, 'casePanelAndServiceTogglesEnabled')\n                    );\n                }\n            )\n        );\n\n        const store = this._caseStoreOrDefault();\n        try {\n            _pruneExpiredHits(store, get(this, 'logger') as { warn(msg: string, meta: object): void } | undefined);\n        } catch (err) {\n            const logger = get(this, 'logger') as { warn?(msg: string, meta: object): void } | undefined;\n            if (logger?.warn) {\n                logger.warn('ACD: Case association store prune failed on init', { error: err });\n            }\n        }\n    }\n\n    /**\n     * @private\n     * True when the service is destroyed or destroying (avoids setting tracked properties after teardown).\n     */\n    _isServiceDestroyed(): boolean {\n        return Boolean(get(this, 'isDestroyed') || get(this, 'isDestroying'));\n    }\n\n    /**\n     * Narrow context for module-level helpers. Expose injected services with concrete types\n     * so helpers don't need get() or assertions.\n     */\n    _helperContext(): CaseAssociationHelperContext {\n        const service = this as unknown as { get(key: string): unknown; set(key: string, value: unknown): void };\n        return {\n            get: (k: string) => service.get(k),\n            set: (k: string, v: unknown) => service.set(k, v),\n            casesCache: this.casesCache,\n            caseStore: this._caseStoreOrDefault(),\n            isDestroyed: () => this._isServiceDestroyed(),\n            application: this.get('application') as CaseAssociationHelperContext['application'],\n            ajax: this.get('ajax') as CaseAssociationHelperContext['ajax'],\n            logger: this.get('logger') as CaseAssociationHelperContext['logger'],\n            interaction: this.get('interaction') as CaseAssociationHelperContext['interaction'],\n            acdworkitem: this.get('acdworkitem') as CaseAssociationHelperContext['acdworkitem'],\n            clearPersistedRehydrationNegativeForId: (id: string) => this._clearPersistedRehydrationNegative(id)\n        };\n    }\n\n    /**\n     * Resolved association state (hit/miss/pending) per id; LRU eviction when over {@link CASE_ASSOCIATION_MEMORY_CACHE_MAX_ENTRIES}.\n     */\n    casesCache = new LruCache<string, CaseCacheEntryType>(CASE_ASSOCIATION_MEMORY_CACHE_MAX_ENTRIES, {\n        preferEvictWhen: entry => entry.status !== 'pending'\n    });\n\n    /**\n     * Incremented when cache is updated so consumers (e.g. panel state) can re-render.\n     * Installed with `this.set` in `init()` so classic computed consumers dirty on Ember 3.28.\n     */\n    declare cacheVersion: number;\n\n    /**\n     * @private\n     * Schedules a single cacheVersion increment on the next run loop.\n     * Installed with `this.set` in `init()` (same Ember-owned property reason as cacheVersion).\n     */\n    declare _cacheVersionBumpScheduled: boolean;\n\n    /**\n     * @private\n     * Ids currently awaiting {@link _getPersistedHit} from the {@link getCachedCase} rehydration path — prevents\n     * overlapping IndexedDB reads if the panel renders many times before the first read completes.\n     */\n    _persistedRehydrationInFlight = new Set<string>();\n\n    /**\n     * @private\n     * Ids where IndexedDB returned no usable hit (or empty). Short-circuits repeated `getItem` calls for that id\n     * until the id is cleared (e.g. a successful hit from another path via {@link _clearPersistedRehydrationNegative}).\n     */\n    _persistedRehydrationNegative = new Set<string>();\n\n    /**\n     * @private\n     * Clears the \"we already tried IndexedDB and found nothing\" flag when a hit is stored by another code path\n     * (API fetch or roster sync) so future logic does not treat the id as permanently negative.\n     */\n    _clearPersistedRehydrationNegative(id: string): void {\n        if (id) {\n            this._persistedRehydrationNegative.delete(id);\n        }\n    }\n\n    /**\n     * @private\n     * **Call chain:** Invoked only from {@link getCachedCase} when the in-memory map has no row for this id yet\n     * (see {@link getCachedCase} — after ruling out hit / miss / pending). It does not run on every render path,\n     * only when we need to recover a known hit from IndexedDB that has not been loaded into RAM (e.g. after a full\n     * page reload, or any time UI asks before roster sync has repopulated memory).\n     *\n     * **What it does:** Starts a one-off async read via {@link _getPersistedHit}. When that resolves with entities,\n     * we promote them into {@link casesCache} and bump {@link cacheVersion} so cards re-render and show the case icon.\n     * When the LRU is already full for a new key, we do not schedule (avoids promote/evict/bump thrash); case icons may\n     * stay absent until a slot frees. `void` on the promise is intentional — callers already returned `null`\n     * synchronously; the UI updates on the next tick after {@link _bumpCacheVersion}.\n     * @param interactionId - The id of the interaction to rehydrate the case association for.\n     */\n    _schedulePersistedHitRehydration(interactionId: string): void {\n        if (!interactionId) return;\n        // Skip if this id is already being read from IndexedDB, or we already know there is no persisted hit.\n        if (\n            this._persistedRehydrationInFlight.has(interactionId) ||\n            this._persistedRehydrationNegative.has(interactionId)\n        ) {\n            return;\n        }\n        // Saturated LRU: do not promote from IndexedDB into RAM (would evict another id and re-trigger churn).\n        if (this.casesCache.wouldEvictOnNewKey(interactionId)) {\n            return;\n        }\n\n        this._persistedRehydrationInFlight.add(interactionId);\n        const ctx = this._helperContext();\n\n        _getPersistedHit(ctx, interactionId)\n            .then(persisted => {\n                if (!persisted?.length) {\n                    // Remember \"no row in IndexedDB\" so we do not hammer getItem on every subsequent getCachedCase call.\n                    this._persistedRehydrationNegative.add(interactionId);\n                    return;\n                }\n\n                if (_isContextDestroyed(ctx)) return;\n\n                const current = ctx.casesCache.get(interactionId);\n                // While IndexedDB was loading, another path may have filled this id (roster sync, API, etc.). Only write\n                // the persisted hit if the slot is still empty — if anything is present, respect it and do not overwrite.\n                if (current !== undefined) {\n                    return;\n                }\n\n                ctx.casesCache.set(interactionId, { status: 'hit', value: persisted });\n                this._clearPersistedRehydrationNegative(interactionId);\n                _bumpCacheVersion(ctx);\n            })\n            .catch(error => {\n                if (ctx.logger) {\n                    ctx.logger.warn('ACD: Case association persisted rehydration failed', {\n                        id: interactionId,\n                        error\n                    });\n                }\n            })\n            .finally(() => {\n                this._persistedRehydrationInFlight.delete(interactionId);\n            });\n    }\n\n    /**\n     * Whether the user has permission to view case associations.\n     * Installed as a real computed property via `defineProperty` in `init()` — see the comment\n     * there for why a bare class-field assignment of `computed(...)` is unsafe.\n     */\n    declare canViewCaseAssociationPerm: CaseAssociationService['canViewCaseAssociationPerm'];\n\n    /**\n     * Whether the case panel, service toggle, and permission to view case association are enabled for the user.\n     * Installed via `defineProperty` in `init()`.\n     */\n    declare casePanelAndServiceTogglesEnabled: ComputedProperty<boolean>;\n\n    /**\n     * Feature toggle: when true, case association API requests are enabled (requires case panel and view permission).\n     * Installed via `defineProperty` in `init()`.\n     */\n    declare caseAssociationRequestFT: CaseAssociationService['caseAssociationRequestFT'];\n\n    /**\n     * Feature toggle: when true, case icon is shown for workitems that have case activities on their models.\n     * Installed via `defineProperty` in `init()`.\n     */\n    declare caseAgentWorkitemUIFT: CaseAssociationService['caseAgentWorkitemUIFT'];\n\n    /**\n     * Called by source services (acdcall, acdemail, acdsms, acdcallback, acdworkitem)\n     * when their active roster list changes. Debounces and runs a batched case load after a short delay.\n     */\n    public scheduleRosterSync(): void {\n        if (!get(this, 'caseAssociationRequestFT')) return;\n        run.debounce(this, this._runBatchedCaseLoadScheduled, ROSTER_SYNC_DEBOUNCE_MS);\n    }\n\n    /**\n     * @private\n     * Method wrapper reference for debounce, bound to this instance.\n     */\n    _runBatchedCaseLoadScheduled = (): Promise<void> => {\n        return _runBatchedCaseLoad(this._helperContext());\n    };\n\n    /**\n     * Removes an interaction or workitem id from the case cache when it is a miss (or pending).\n     * Call this in each source service's cleanup when an interaction/workitem is removed from the roster so that when\n     * the same conversation returns (e.g. customer reply) we re-fetch and can see a case associated mid-interaction.\n     * Hits are not invalidated so we keep known case data. (cases cannot be unassociated once set)\n     * @param conversationIdOrWorkitemId - The conversation id (call/chat/email/sms/callback) or workitem id.\n     */\n    public invalidateCaseCacheEntry(conversationIdOrWorkitemId: string): void {\n        if (!conversationIdOrWorkitemId) return;\n\n        this.scheduleRosterSync();\n\n        const cache = this.casesCache;\n        const entry: CaseCacheEntryType | undefined = cache.get(conversationIdOrWorkitemId);\n\n        if (!cache.isAtCapacity() && entry?.status === 'hit') return;\n        if (cache.delete(conversationIdOrWorkitemId)) {\n            this._persistedRehydrationNegative.delete(conversationIdOrWorkitemId);\n            _bumpCacheVersion(this._helperContext());\n        }\n    }\n\n    /**\n     * Read-only: get cached case entities for an interaction id (for display).\n     * Returns the entity array if hit, null otherwise. Used by cards to show case icon.\n     *\n     * **Sync vs persisted:** This API stays synchronous for Ember consumers. If RAM has no entry yet (cold start /\n     * not yet hydrated), we return `null` and may kick off {@link _schedulePersistedHitRehydration} (IndexedDB read)\n     * when there is room in the LRU for another id; when it completes, {@link cacheVersion} increments and the card\n     * can call again and get a hit. If the in-memory cache is saturated, we do not schedule rehydration (persisted\n     * data remains in localforage; case icons may not appear until capacity frees).\n     *\n     * @param interactionId - The id of the interaction to get cached case entities for.\n     * @returns The case entities for the interaction if successful, otherwise null.\n     */\n    public getCachedCase(interactionId: string): Maybe<CaseAssociationEntities> {\n        const entry: CaseCacheEntryType | undefined = this.casesCache.get(interactionId);\n\n        if (entry?.status === 'hit') return entry.value;\n        if (entry?.status === 'miss' || entry?.status === 'pending') return null;\n\n        // No in-memory row: try to recover a previously persisted hit from IndexedDB (async; see _schedulePersistedHitRehydration).\n        if (interactionId) {\n            this._schedulePersistedHitRehydration(interactionId);\n        }\n        return null;\n    }\n\n    /**\n     * Tears down the case cache and calls super.willDestroy. Called by Ember when the service is destroyed.\n     */\n    public willDestroy(): void {\n        this._persistedRehydrationInFlight.clear();\n        this._persistedRehydrationNegative.clear();\n        this.casesCache.clear();\n        super.willDestroy();\n    }\n}\n\n// Register the service with Ember's registry so inject('case-association') is typed\ndeclare module '@ember/service' {\n    interface Registry {\n        'case-association': CaseAssociationService;\n    }\n}\n","import Service, { inject as service } from '@ember/service';\nimport { computed, observer } from '@ember/object';\nimport { centerStageClients } from '../iframe-client-config';\nimport { parseQueryParams } from '../utils/query-parser';\nimport { getEvaluator } from 'boon-js';\nimport groupBy from 'lodash/groupBy';\n\nexport default Service.extend({\n    session: service('session'),\n    sidebar: service('sidebar'),\n    intl: service(),\n\n    centerStageClients: null,\n    activeRoute: null,\n    // Prompt the user with this message if they try to leave the current route\n    promptOnLeave: null,\n    pageTitle: null,\n    // Reference to the center-stage frame-router element for publishing events\n    frameRouterElement: null,\n\n    // Group center stage clients by assigned path, and where duplicates are assigned to the same\n    // path, resolve that conflict. Also translates defaultTitle keys.\n    activeCenterStageClients: computed(\n        'centerStageClients',\n        'session.features',\n        'intl.locale',\n        'intl.loaded',\n        function () {\n            const activeClients = this.filterActiveClients(this.centerStageClients);\n            const intl = this.intl;\n            const translatedClients = {};\n\n            // Translate defaultTitle for each active client\n            Object.keys(activeClients).forEach(key => {\n                const client = activeClients[key];\n                translatedClients[key] = Object.assign({}, client);\n\n                // Translate defaultTitle if it exists\n                if (translatedClients[key].defaultTitle) {\n                    translatedClients[key].defaultTitle = intl.t(translatedClients[key].defaultTitle).toString();\n                }\n            });\n\n            return translatedClients;\n        }\n    ),\n\n    clientConfigList: computed('activeCenterStageClients', function () {\n        return Object.values(this.activeCenterStageClients).sort((client1, client2) => {\n            // This leads to testing longer routes for matches first when using `find`\n            // This protects iframe configs with routes that are a substring of\n            // another route from accidentally matching the longer route.\n            // E.G. for the frame routes `/foo/bar` and `/foo`, a transition to\n            // `/foo/bar/baz` will always be checked against `/foo/bar` first and\n            // exit before it can be tried against `/foo`.\n            return client2.assignedRoute.length - client1.assignedRoute.length;\n        });\n    }),\n\n    // Collect all of the query parameters that clients care about so they can\n    // be registered for the one actual center-stage-frame route\n    allClientQueryParams: computed('centerStageClients', function () {\n        return [\n            ...new Set(\n                Object.values(this.centerStageClients)\n                    .filter(client => client.queryParams && client.queryParams.length)\n                    .map(client => client.queryParams)\n                    .flat()\n            )\n        ];\n    }),\n\n    init() {\n        this._super(...arguments);\n        this.set('centerStageClients', this.applyQueryOverrides(centerStageClients));\n    },\n\n    promptOnLeaveChanged: observer('promptOnLeave', function promptOnLeaveChanged() {\n        const promptOnLeave = this.promptOnLeave;\n        // Always unregister any prior beforeunload handler. Even if the promptOnLeave value changed from one string\n        // to another string, we still will unregister the old handler and re-register a new one.\n        if (typeof this.promptOnLeaveBeforeUnload === 'function') {\n            window.removeEventListener('beforeunload', this.promptOnLeaveBeforeUnload);\n            this.set('promptOnLeaveBeforeUnload', null);\n        }\n        // If we have a promptOnLeave message, then register a new beforeunload handler for it.\n        if (typeof promptOnLeave === 'string' && promptOnLeave.length > 0) {\n            this.set('promptOnLeaveBeforeUnload', e => (e.returnValue = promptOnLeave));\n            window.addEventListener('beforeunload', this.promptOnLeaveBeforeUnload);\n        }\n    }),\n\n    filterActiveClients(rawClients) {\n        const computedConfig = {};\n        // const rawClients = this.get('centerStageClients');\n        const pathGroups = groupBy(Object.entries(rawClients), ([, clientConfig]) => {\n            return clientConfig.assignedRoute;\n        });\n        Object.values(pathGroups).forEach(pathClients => {\n            const [clientId, clientInfo] = this.findActiveClient(pathClients);\n            computedConfig[clientId] = clientInfo;\n        });\n\n        return computedConfig;\n    },\n\n    updateActiveRoute() {\n        // Always clear the promptOnLeave value when the route changes to remove the beforeunload handler if present\n        this.set('promptOnLeave', null);\n        let appRoute = this._getWindowHash().slice(1);\n        if (this.isEnabledClientRoute(appRoute)) {\n            this.set('activeRoute', appRoute);\n            this.sidebar.ensureRouteVisibility();\n        } else {\n            this.set('activeRoute', null);\n        }\n    },\n\n    isEnabledClientRoute(path) {\n        const config = this.configByPath(path);\n        if (!config) {\n            return false;\n        } else {\n            return this.isConfigEnabled(config);\n        }\n    },\n\n    navForPath(path) {\n        const config = this.configByPath(path);\n        if (config) {\n            return config.nav || null;\n        } else {\n            return null;\n        }\n    },\n\n    toggleForPath(path) {\n        const config = this.configByPath(path);\n        if (config) {\n            return config.featureToggle || null;\n        } else {\n            return null;\n        }\n    },\n\n    baseRouteForPath(path) {\n        const config = this.configByPath(path);\n        if (config) {\n            return config.assignedRoute || null;\n        } else {\n            return null;\n        }\n    },\n\n    applyQueryOverrides(clientConfig) {\n        const queryParams = this._getParsedQueryParams();\n        Object.keys(clientConfig).forEach(clientId => {\n            let urlOverride = queryParams[`center-stage-${clientId}`];\n            if (urlOverride !== undefined) {\n                if (typeof clientConfig[clientId].timeMachineUrl === 'function') {\n                    clientConfig[clientId].url = clientConfig[clientId].timeMachineUrl(urlOverride);\n                } else {\n                    clientConfig[clientId].url = urlOverride;\n                }\n            }\n        });\n        return clientConfig;\n    },\n\n    // Given an path within the application, figure out which clientConfing (if any) should be used to\n    // evaluate it\n    configByPath(path) {\n        const sortedConfigList = this.clientConfigList;\n        if (!path) {\n            return null;\n        } else {\n            return sortedConfigList.find(clientConfig => {\n                return path.startsWith(clientConfig.assignedRoute);\n            });\n        }\n    },\n\n    // Given multiple client id/config pairs (with matching paths), find one with a feature toggle\n    // active, or take the first one in the list if none are active.\n    findActiveClient(candidateClients) {\n        const enabledClient = candidateClients.find(([, clientConfig]) => {\n            return this.isConfigEnabled(clientConfig);\n        });\n        return enabledClient || candidateClients[0];\n    },\n\n    isConfigEnabled(clientConfig) {\n        const featureExpression = clientConfig.featureToggle && clientConfig.featureToggle.key;\n        // If there is a feature toggle expression\n        if (featureExpression) {\n            const evaluator = getEvaluator(featureExpression);\n            // Evaluate it with boon\n            const toggles = this.get('session.features') || {};\n            return evaluator(toggles);\n        } else {\n            // Routes without toggles are considered active\n            return true;\n        }\n    },\n\n    registerFrameRouter(element) {\n        this.set('frameRouterElement', element);\n    },\n\n    publishClientAction(publication) {\n        const frameRouter = this.frameRouterElement;\n        if (!frameRouter) {\n            return;\n        }\n        frameRouter.publish(publication);\n    },\n\n    // For test mocking\n    _getWindowHash() {\n        return window.location.hash;\n    },\n    _getParsedQueryParams() {\n        return parseQueryParams();\n    }\n});\n","import { assert } from '@ember/debug';\nimport { A } from '@ember/array';\nimport Evented from '@ember/object/evented';\nimport Service from '@ember/service';\n\nexport default Service.extend(Evented, {\n    init() {\n        this._super(...arguments);\n\n        this.set('commands', A([]));\n        this.set('queuedChatCommands', A([]));\n    },\n\n    addCommand(name, value, help = '', hidden = false) {\n        let commands = this.commands;\n        let existingCommand = commands.find(command => command.name === name);\n\n        assert('A chat command with that name already exists', !existingCommand);\n        assert('A value hook function is required', !!value);\n\n        this.queuedChatCommands.addObject({\n            name,\n            value,\n            help,\n            hidden: !hidden\n        });\n\n        this.commands.addObject({\n            name,\n            value,\n            help,\n            hidden\n        });\n    },\n\n    emptyQueuedCommands() {\n        this.set('queuedChatCommands', A([]));\n    }\n});\n","import { later, run } from '@ember/runloop';\nimport Service, { inject as service } from '@ember/service';\nimport { observer } from '@ember/object';\nimport Evented from '@ember/object/evented';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport CacheChatRoomsMixin from '../mixins/cache-chat-rooms';\n\nimport { parseQueryParams } from 'web-directory/utils/query-parser';\nimport {\n    TOAST_TYPE,\n    COLLABORATE_CHAT_EVENTS,\n    COLLABORATE_CHAT_FRAME_ID\n} from 'web-directory/utils/collab-chat-constants';\n\nconst mixins = [LoggerMixin, CacheChatRoomsMixin, Evented];\n\nexport default Service.extend(...mixins, {\n    session: service(),\n    sidebar: service(),\n    notification: service(),\n    settings: service(),\n    streaming: service(),\n    favorites: service(),\n    store: service(),\n    phone: service(),\n\n    featureBranch: '',\n    collaborateChatBaseUrl: '',\n    collaborateChatFrameConfig: null,\n\n    // collaborate-chat iframe instances\n    collaborateChatIFrame: null,\n    collaborateChatPhoneIFrame: null,\n\n    collabChatMainInitialized: false,\n    collabChatPhoneInitialized: false,\n    collabChatPhoneReady: false,\n\n    currentActiveRoomObs: observer('phone.activeRoom', 'phone.activeCall', 'collabChatPhoneReady', function () {\n        if (!this.get('collabChatPhoneReady')) return;\n        // if activeCall is a consult, prefer the activeRoom's jid over the otherPartyJid so the chatframe will update properly based on confined participants\n        // Otherwise, prefer activeCall.otherPartyJid so collab-chat tracks the focused call participant immediately (e.g. other party still ringing).\n        // activeRoom.jid only updates once the other party connects, which can leave chat on the wrong room. let's use as fallback only.\n        const preferRoom =\n            this.get('phone.activeCall.conversationIsAConsult') || this.get('phone.activeCall.onConference');\n        const jid = preferRoom\n            ? this.get('phone.activeRoom.jid') || this.get('phone.activeCall.otherPartyJid') || null\n            : this.get('phone.activeCall.otherPartyJid') || this.get('phone.activeRoom.jid') || null;\n\n        this.notifyCollaborateChatPhoneIFrame(COLLABORATE_CHAT_EVENTS.publish.roomChanged, { jid });\n    }),\n\n    init() {\n        this._super(...arguments);\n\n        if (this.get('collaborateChatBaseUrl') === '') {\n            this.setCollaborateChatBaseUrl();\n            this.setupCollaborateChatConfig();\n        }\n    },\n\n    setCollaborateChatBaseUrl() {\n        const queryParams = parseQueryParams();\n        let collabChatBranchQuery = queryParams['collaborateChat'] || queryParams['collaboratechat'] || '';\n\n        this.set('featureBranch', collabChatBranchQuery);\n\n        this.set(\n            'collaborateChatBaseUrl',\n            new URL(`/collaborate-chat/${this.featureBranch}`, window.location).toString()\n        );\n\n        this.logger.debug({\n            featureBranch: this.featureBranch,\n            collaborateChatBaseUrl: this.collaborateChatBaseUrl\n        });\n    },\n\n    triggerClick(evt) {\n        this.trigger('collaborateChatFrameClicked', evt);\n    },\n\n    setupCollaborateChatConfig() {\n        const config = {\n            collaborateChat: {\n                url: this.collaborateChatBaseUrl,\n                assignedRoute: '/'\n            }\n        };\n        this.set('collaborateChatFrameConfig', config);\n    },\n    parseFavoriteIFCPayload({ action, entityFav, favoriteId, entityType }) {\n        return action === 'Favorited'\n            ? { entityFav, favoriteId: entityFav.favoriteId, entityType: entityFav.entityType }\n            : { favoriteId, entityType };\n    },\n\n    handleCollaborateToast({ payload: { title, message, to, toastType } }) {\n        switch (toastType) {\n            case TOAST_TYPE.SUCCESS:\n                if (this.get('session.person.id') === to) {\n                    this.notification.info(title, message, {\n                        target: this,\n                        hideAfter: 5\n                    });\n                }\n                break;\n            case TOAST_TYPE.ERROR:\n                this.notification.error(title, message, {\n                    target: this,\n                    hideAfter: 5\n                });\n                break;\n            default:\n                break;\n        }\n    },\n    publishSideBarToCollabChat() {\n        const sidebarExpanded = this.get('sidebar.communicationSidebarExpanded') && !this.get('session.useNewNav');\n        this.notifyCollaborateChat(COLLABORATE_CHAT_EVENTS.publish.sidebarExpanded, {\n            payload: {\n                expanded: sidebarExpanded\n            }\n        });\n    },\n\n    confirmUploadImage(images, entityJid) {\n        this.notifyCollaborateChat(COLLABORATE_CHAT_EVENTS.publish.profileImage, {\n            payload: {\n                images,\n                userJid: entityJid\n            }\n        });\n    },\n\n    notifyCollaborateChat(topic, payload) {\n        this.notifyCollaborateChatIFrame(topic, payload);\n        this.notifyCollaborateChatPhoneIFrame(topic, payload);\n    },\n    notifyCollaborateChatIFrame(topic, payload) {\n        const frame = this.collaborateChatIFrame;\n        this.logger.debug('[web-dir:chat] Publish event to ->', { frame, topic, payload });\n        if (frame && topic) {\n            frame.publish({ topic, payload });\n        }\n    },\n    notifyCollaborateChatPhoneIFrame(topic, payload) {\n        if (this._componentDestroyed()) return;\n\n        const frame = this.get('collaborateChatPhoneIFrame');\n        this.logger.debug('[web-dir:chat] Publish event to ->', { frame, topic, payload });\n        if (frame && topic) {\n            frame.publish({ topic, payload });\n\n            if (topic === COLLABORATE_CHAT_EVENTS.publish.roomChanged) {\n                later(() => {\n                    if (this._componentDestroyed()) return;\n                    run(() => this.applyPhoneChatLayoutCorrection());\n                }, 1000);\n            }\n        }\n    },\n\n    async updateWebDirectoryFavoriteState({ payload }) {\n        const { entityFav, favoriteId, entityType } = this.parseFavoriteIFCPayload(payload);\n        if (entityType === 'room') {\n            return;\n        }\n        let entity = await this.store.peekRecord(entityType, favoriteId);\n        if (!entity) {\n            entity = await this.store.findRecord(entityType, favoriteId);\n        }\n        payload.action === 'Favorited'\n            ? this.favorites.updateFavoritesArrayOnFavorite(entity, entityFav)\n            : this.favorites.updateFavoritesArrayOnUnfavorite(entity, payload.deleteId);\n    },\n    _componentDestroyed() {\n        return this.isDestroyed || this.isDestroying;\n    },\n\n    applyPhoneChatLayoutCorrection() {\n        later(() => {\n            const frame = document.querySelector(`[frame-id=${COLLABORATE_CHAT_FRAME_ID.PHONE}]`);\n            if (!frame || !frame.getBoundingClientRect) return;\n            const h = frame.getBoundingClientRect().height - 1 + 'px';\n            frame.style.height = h;\n\n            later(() => {\n                frame.style.removeProperty('height');\n            }, 200);\n        }, 1000);\n    }\n});\n","import { getOwner, setOwner } from '@ember/application';\nimport { A } from '@ember/array';\nimport { next, debounce, cancel, later, run, schedule } from '@ember/runloop';\nimport { reads } from '@ember/object/computed';\nimport EmberObject, { computed, observer, get } from '@ember/object';\nimport Service, { inject as service } from '@ember/service';\nimport Evented, { on } from '@ember/object/evented';\nimport { Promise, defer, reject, resolve, hash, all } from 'rsvp';\nimport ChatCommandsMixin from '../mixins/chat-commands';\nimport { task, timeout } from 'ember-concurrency';\nimport { compareJids, getEntityObjectId, isAcdJid, isRoomJid, isSupervisorJid } from 'web-directory/utils/jid-helpers';\nimport _ from 'lodash';\nimport uuid from 'uuid';\nimport { COLLABORATE_CHAT_EVENTS } from 'web-directory/utils/collab-chat-constants';\nimport { isTesting } from 'web-directory/utils/testing';\nimport BatchDataRequests from '../mixins/batch-data-requests';\nimport CacheChatRoomsMixin from '../mixins/cache-chat-rooms';\nimport ChatEvents from '../mixins/chat-service/chat-events';\nimport MessageNotificationsMixin from '../mixins/chat-service/message-notifications';\nimport MessageSplitting from '../mixins/chat-service/message-splitting';\nimport ChatMessage from '../models/chat-message';\nimport ChatRoom from '../models/chat-room';\nimport moment from '../utils/dates';\nimport { markdownToHtml } from '../utils/markdown';\nimport timeoutPromise from '../utils/timeout-promise';\n\nconst respondingTimeout = {};\nconst preferencePaths = {\n    interactionNotificationVolume: 'chat.interactionNotificationVolume',\n    chatNotificationVolume: 'chat.chatNotificationVolume'\n};\n\nconst mixins = [\n    Evented,\n    ChatEvents,\n    BatchDataRequests,\n    CacheChatRoomsMixin,\n    MessageNotificationsMixin,\n    MessageSplitting,\n    ChatCommandsMixin\n];\n\nexport const supportedChatWidgets = [\n    'uservoice',\n    'jenkins',\n    'jira',\n    'bitbucket',\n    'statuspage',\n    'salesforce',\n    'pagerduty',\n    'github',\n    'zendesk',\n    'pivotal-tracker',\n    'multimedia-request',\n    'video-notification', // Stanza returned when not using useVoltVideoMessages\n    'customer-chat-state',\n    'zoom-notification',\n    'teams-notification',\n    'videoNotification' // New stanza returned when using useVoltVideoMessages\n];\n\nexport default Service.extend(...mixins, {\n    analyticsService: service('analytics'),\n    batchDataRequests: service(),\n    intl: service(),\n    session: service(),\n    chatFrame: service(),\n    timeline: service(),\n    preferences: service(),\n    sidebar: service(),\n    commandNav: service('command-nav'),\n    ajax: service(),\n    application: service(),\n    notification: service(),\n    store: service(),\n    volt: service(),\n    chatCommands: service(),\n    settings: service(),\n    videoConferenceDetails: service(),\n    favorites: service(),\n    permissions: service(),\n\n    applicationController: null,\n\n    widgets: supportedChatWidgets,\n    firstRoomChosen: false,\n    responding: {},\n    popoutRoom: null,\n    activeRoom: null,\n    activeEmpty: null,\n    messagesPerHistoryRequest: 25,\n    maxHistoryRequestSize: 100,\n\n    dashboardRooms: [],\n    mutedRooms: [],\n    roomHistoryStack: [],\n    replyMessage: null,\n\n    collabChatShowChatSplat: false,\n\n    // use computed to check user's permission and org value\n    enabled: computed(\n        'session.org.hasChatEnabled',\n        'permissions.canViewBusinessChat',\n        'session.person.jid',\n        function () {\n            return (\n                this.get('session.person.jid') &&\n                this.get('session.org.hasChatEnabled') &&\n                this.get('permissions.canViewBusinessChat')\n            );\n        }\n    ),\n\n    canCorrectMessages: reads('connected'),\n    sidebarExpanded: observer(\n        'sidebar.communicationSidebarExpanded',\n        'session.useNewNav',\n        'commandNav.{currentDrawer,currentPanel}',\n        function () {\n            const isExpanded = this.get('session.useNewNav')\n                ? this.get('commandNav.currentPanel') == 'chats'\n                : this.get('sidebar.communicationSidebarExpanded');\n            this.chatFrame.notifyCollaborateChat(COLLABORATE_CHAT_EVENTS.publish.sidebarExpanded, {\n                payload: {\n                    expanded: isExpanded\n                }\n            });\n        }\n    ),\n\n    subscribeToStreamingEvents: on('init', function () {\n        if (!isTesting) {\n            this.set('streamingConnectDeferred', defer());\n        }\n        return this.streaming.subscribeToConnection(this);\n    }),\n\n    initializePreferences: on('init', function () {\n        let preferences = this.preferences;\n\n        preferences\n            .getPreference('chat.mutedRooms')\n            .then((mutedRoomsValue = '[]') => {\n                if (this.isDestroyed) {\n                    return;\n                }\n                const mutedRooms = JSON.parse(mutedRoomsValue);\n                if (mutedRooms && !this.isDestroyed) {\n                    this.set('mutedRooms', mutedRooms);\n                }\n            })\n            .catch(e =>\n                this.logger.error('Error getting preference (mutedRooms):', {\n                    error: e,\n                    remoteData: {\n                        preference: 'mutedRooms'\n                    }\n                })\n            );\n\n        preferences\n            .getPreference('chat.roomHistoryStack')\n            .then((roomHistoryStackValue = '[]') => {\n                if (this.isDestroyed) {\n                    return;\n                }\n                const roomHistoryStack = JSON.parse(roomHistoryStackValue);\n                if (roomHistoryStack && !this.isDestroyed) {\n                    this.set('roomHistoryStack', roomHistoryStack);\n                }\n            })\n            .catch(e =>\n                this.logger.error('Error getting preference:', {\n                    error: e,\n                    remoteData: {\n                        preference: 'roomHistoryStack'\n                    }\n                })\n            );\n    }),\n\n    isEditing: computed('activeRoom.messages.@each.isEditing', function () {\n        if (!this.activeRoom) {\n            return false;\n        }\n\n        let messages = this.get('activeRoom.messages');\n        if (!messages) {\n            return false;\n        }\n\n        return !_.isEmpty(messages.filterBy('isEditing'));\n    }),\n\n    _chatNotificationVolume: 50,\n    chatNotificationVolume: computed('_chatNotificationVolume', {\n        get: function () {\n            return this._chatNotificationVolume;\n        },\n        set: function (key, val) {\n            this.set('_chatNotificationVolume', val);\n            return val;\n        }\n    }),\n\n    _interactionNotificationVolume: 50,\n    interactionNotificationVolume: computed('_interactionNotificationVolume', {\n        get: function () {\n            return this._interactionNotificationVolume;\n        },\n        set: function (key, val) {\n            this.set('_interactionNotificationVolume', val);\n            return val;\n        }\n    }),\n\n    init() {\n        this._super(...arguments);\n        this._initNotificationVolumes();\n        this._setupRateLimitListener();\n        this._startWatchVideoParticipantCount();\n        this.sidebarExpanded();\n    },\n\n    _startWatchVideoParticipantCount() {\n        this.watchVideoParticipantCount();\n    },\n\n    _initNotificationVolumes: function () {\n        next(() => {\n            const preferences = this.preferences;\n            if (!preferences) {\n                return;\n            }\n\n            preferences.getPreference(preferencePaths.chatNotificationVolume).then(val => {\n                if (val) {\n                    this.set('_chatNotificationVolume', val);\n                }\n            });\n\n            preferences.getPreference(preferencePaths.interactionNotificationVolume).then(val => {\n                if (val) {\n                    this.set('_interactionNotificationVolume', val);\n                }\n            });\n        });\n    },\n\n    setMessageReply(message) {\n        this.set('replyMessage', message);\n    },\n\n    _setupRateLimitListener() {\n        this.ajax.on('rateLimited', this, this._handleRateLimit);\n    },\n\n    _handleRateLimit(data) {\n        if (data && data.url && data.options) {\n            try {\n                let url = new URL(data.url);\n                let options = data.options;\n                let requestingJids = options.data && options.data.jid && options.data.jid.length > 0;\n                if (url.pathname.indexOf('users') > -1 && requestingJids) {\n                    // We are loading up jids for chat and got rate limited. Let's notify the user.\n                    debounce(this, this._notifyRosterRateLimit, 500);\n                }\n            } catch (error) {\n                // Ignore error\n            }\n        }\n    },\n\n    _notifyRosterRateLimit() {\n        let title = this.intl.t('chat.roster.errors.rateLimit.title').toString();\n        let message = this.intl.t('chat.roster.errors.rateLimit.message').toString();\n        this.notification.info(title, message, {\n            tag: 'chat-rate-limit',\n            hideAfter: 20\n        });\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        _.forEach(respondingTimeout, value => {\n            cancel(value);\n        });\n\n        this.ajax.off('rateLimited', this, this._handleRateLimit);\n    },\n\n    addResponder(room, person) {\n        var responding, respondingTimeoutId;\n        if (!person.get('name') && isAcdJid(room)) {\n            person.set('name', this.intl.t('purecloud.acdInteraction.chats.customerName'));\n        }\n        if (person.get('id') !== this.get('session.person.id')) {\n            responding = this.responding;\n            if (!Object.prototype.hasOwnProperty.call(responding, room)) {\n                responding[room] = A();\n            }\n            responding[room].addObject(person.get('name'));\n            respondingTimeoutId = room + '-' + person.get('id');\n            cancel(respondingTimeout[respondingTimeoutId]);\n            respondingTimeout[respondingTimeoutId] = later(\n                this,\n                function () {\n                    return this.removeResponder(room, person.get('name'), person.get('jid'));\n                },\n                20000\n            );\n            return this.notifyPropertyChange('responding');\n        }\n    },\n\n    removeResponder(room, person, from) {\n        if (!_.isEmpty(this.responding[room])) {\n            this.responding[room].removeObject(person);\n            this.notifyPropertyChange('responding');\n        }\n        if (!_.isEmpty(this.responding[from])) {\n            this.responding[from].removeObject(person);\n            this.notifyPropertyChange('responding');\n        }\n    },\n\n    sendChatState(jid, state) {\n        return this.getChatRoom(jid).then(room => {\n            if (room.get('participants.length') < 2) {\n                return false;\n            }\n            return this.get('streaming.connection') && this.get('streaming.connection').sendChatState(jid, state);\n        });\n    },\n\n    toggleRoomMuted(roomJid) {\n        return this.getChatRoom(roomJid).then(room => {\n            let mutedRooms = this.mutedRooms;\n            if (this.roomMuted(roomJid)) {\n                mutedRooms.removeObject(roomJid);\n                return room.set('muted', false);\n            } else {\n                mutedRooms.pushObject(roomJid);\n                return room.set('muted', true);\n            }\n        });\n    },\n\n    setRoomMuted(roomJid, muted) {\n        return this.getChatRoom(roomJid).then(room => {\n            let mutedRooms = this.mutedRooms;\n            if (!muted) {\n                mutedRooms.removeObject(roomJid);\n                return room.set('muted', false);\n            } else {\n                mutedRooms.pushObject(roomJid);\n                return room.set('muted', true);\n            }\n        });\n    },\n\n    roomMuted(roomJid) {\n        var mutedRooms;\n        mutedRooms = this.mutedRooms;\n        return roomJid && mutedRooms && mutedRooms.any(jid => jid === roomJid);\n    },\n\n    getRecents() {\n        return new Promise(function (resolve, reject) {\n            this.get('streaming.connection').getRecents(function (error, recents) {\n                if (error) {\n                    reject(error);\n                } else {\n                    resolve(recents);\n                }\n            });\n        });\n    },\n\n    clearRoomUnreadMessages(room) {\n        return room.clearUnreadMessages();\n    },\n\n    addRoomToDashboard(room) {\n        return this.dashboardRooms.addObject(room);\n    },\n\n    messageFailedToSend(room, time) {\n        room.get('messages').forEach(function (message) {\n            if (message.id === null && message.time._d.toString() === time._d.toString()) {\n                message.setProperties({\n                    sendError: true,\n                    pending: false\n                });\n            }\n        });\n    },\n\n    sendMessageProxy(jid, room, message, options) {\n        if (message.length > 4000) {\n            let messageQueue = this._splitOverSizedMessage(message);\n            messageQueue = this._convertSplitMessagesToWidgets(room, messageQueue);\n            return this.sendSplitMessageQueue(room, messageQueue);\n        } else {\n            return this.sendMessageToRoom(jid, message, options);\n        }\n    },\n\n    sendMessageToRoom(jid, text, options) {\n        return new Promise((resolve, reject) => {\n            if (!jid || (text && text.length <= 0 && !options)) {\n                this.logger.error(`JID and not-empty message required to send message ${jid}, ${text}`);\n                reject('send failure');\n            }\n\n            this.get('streaming.connection').setActive(jid);\n\n            this.getChatRoom(jid).then(room => {\n                let id, timeoutIdentifier;\n                this.clearRoomUnreadMessages(room);\n\n                const sendCallback = (error, message) => {\n                    cancel(timeoutIdentifier);\n                    if (error) {\n                        this.logger.error('Error in message send', {\n                            jid,\n                            error\n                        });\n                        reject(id);\n                    } else {\n                        if (message.oid) {\n                            room.clearPending(message);\n                        }\n                        resolve(null);\n                    }\n                };\n\n                timeoutIdentifier = later(this, sendCallback, 'timeout-error', null, 25000);\n\n                if (options) {\n                    id = this.get('streaming.connection').sendMessage(options, sendCallback);\n                } else {\n                    id = this.get('streaming.connection').sendMessage(jid, text, sendCallback);\n                }\n            });\n        });\n    },\n\n    /**\n     * Sends a 3rd Party Integration (Zoom or Teams) join message to a chat user.\n     * @param {string} userId user room to send message to\n     * @param {string} message message string\n     * @param {*} integrationData metadata to send\n     * @returns\n     */\n    async sendIntegrationVideoMessage(userId, providerId, message, integrationData) {\n        const sendChatMessageUrl = this.application.pcV2Uri(`api/v2/chats/users/${userId}/messages`);\n        const messageResponse = await this.ajax.post(sendChatMessageUrl, {\n            dataType: 'json',\n            data: {\n                message,\n                metadata: {\n                    [`${providerId}-notification`]: {\n                        text: JSON.stringify(integrationData)\n                    }\n                }\n            }\n        });\n        return messageResponse;\n    },\n\n    sendVideoProviderNotification(room, provider) {\n        if (room && !room.get('isAcdRoom')) {\n            let to = room.get('jid');\n            let body = provider.get('notification');\n            let data = provider.get('data') || {};\n\n            if (!body) {\n                return;\n            }\n\n            let stanza = {\n                name: `${provider.get('id')}-notification`,\n                contents: JSON.stringify(data)\n            };\n            let children = [stanza];\n            let options = { to, body, children };\n            this.get('streaming.connection').sendMessage(options, (error, message) => {\n                room.clearPending(message);\n            });\n        }\n    },\n\n    removeAttachment(fileDescriptor) {\n        let keys = Object.keys(fileDescriptor);\n        if (!keys.length) {\n            return Promise.resolve();\n        } else {\n            let url = fileDescriptor[keys[0]];\n            let request = this.ajax.del(url, { dataType: '' });\n            return Promise.cast(request);\n        }\n    },\n\n    joinScreenShareRoomViaHawk(roomJid, rejoiningRoom = false) {\n        if (!isRoomJid(roomJid)) {\n            roomJid = `${roomJid}@conference.${this.get('session.org.shortName')}.orgspan.com`;\n        }\n        return timeoutPromise(\n            new Promise(resolve => {\n                this.getChatRoom(roomJid).then(room => {\n                    room.set('joinError', null);\n                    room.set('activated', true);\n                    if (!rejoiningRoom) {\n                        room.set('lastMessageTime', moment());\n                    }\n                    resolve(room);\n                });\n            }),\n            8000,\n            `chat#joinRoomViaHawk: ${roomJid}`\n        );\n    },\n\n    checkJid(roomJid) {\n        if (!roomJid) {\n            return `adhoc-${uuid.v4()}`;\n        }\n        if (!isRoomJid(roomJid)) {\n            return `${roomJid}@conference.${this.get('session.org.shortName')}.orgspan.com`;\n        }\n        return roomJid;\n    },\n\n    joinRoom(roomJid, rejoiningRoom = false) {\n        // Agent assistance is still using legacy chat\n        if (!isSupervisorJid(roomJid)) {\n            return this.getChatRoom(roomJid);\n        }\n        if (!roomJid) {\n            roomJid = `adhoc-${uuid.v4()}`;\n        }\n        if (!isRoomJid(roomJid)) {\n            roomJid = `${roomJid}@conference.${this.get('session.org.shortName')}.orgspan.com`;\n        }\n        return timeoutPromise(\n            new Promise(resolve => {\n                this.getChatRoom(roomJid).then(room => {\n                    this.get('streaming.connection').joinRoom(roomJid, err => {\n                        if (err) {\n                            room.set('joinError', err);\n                        } else {\n                            room.set('joinError', null);\n                            room.set('activated', true);\n                            room.loadDeferredParticipants();\n                        }\n\n                        this.get('streaming.connection').setActive(roomJid);\n                        if (!rejoiningRoom) {\n                            room.set('lastMessageTime', moment());\n                        }\n                        resolve(room);\n                    });\n                });\n            }),\n            8000,\n            `chat#joinRoom: ${roomJid}`\n        );\n    },\n\n    /**\n     * Used to do local updates when a room is joined. The actual work to join a room via\n     * realtime has been moved to collaborate-chat.\n     */\n    joinRoomEvent(room, err, rejoiningRoom = false) {\n        if (err) {\n            room.set('joinError', err);\n        } else {\n            room.set('joinError', null);\n            room.set('activated', true);\n            room.loadDeferredParticipants();\n        }\n        if (!rejoiningRoom) {\n            room.set('lastMessageTime', moment());\n        }\n        return room;\n    },\n\n    syncPendingRoomWithStreamingService(room) {\n        return new Promise(resolve => {\n            this.addRoomToCache(room);\n            const participants = room.get('participants');\n            //room.set('participants', []);\n            this.joinRoom(room.jid).then(room => {\n                this.changeActiveRoom(room);\n                room.set('pendingRoom', false);\n                room.set('showingVideo', true);\n                participants.forEach(person => {\n                    this.inviteToRoom(room, person);\n                });\n                resolve(room);\n            });\n        });\n    },\n\n    joinAcdRoom(roomJid) {\n        // ACD room jids from conversation service are in the form\n        // `{id}@conference.{orgId}.orgspan.com`\n        // but we should use the form\n        // `{id}@conference.{orgShortName}.orgspan.com`\n        const roomId = roomJid.split('@')[0];\n        roomJid = `${roomId}@conference.${this.get('session.org.shortName')}.orgspan.com`;\n\n        return timeoutPromise(\n            new Promise((resolve, reject) => {\n                return this.get('streaming.connection').joinRoom(roomJid, () => {\n                    run(() => {\n                        schedule('actions', err => {\n                            if (err) {\n                                return reject(err);\n                            }\n                            this.get('streaming.connection').setActive(roomJid);\n                            return this.getChatRoom(roomJid).then(function (room) {\n                                room.set('lastMessageTime', moment());\n                                return resolve(room);\n                            });\n                        });\n                    });\n                });\n            }),\n            4000,\n            'chat#joinAcdRoom'\n        );\n    },\n\n    leaveAcdRoom(roomJid) {\n        let request = new Promise((resolve, reject) =>\n            this.get('streaming.connection').leaveRoom(roomJid, err => (err ? reject(err) : resolve()))\n        );\n        request = timeoutPromise(request, 4000, 'chat#leaveAcdRoom');\n\n        request.catch(err => {\n            this.logger.error(`chat#leaveAcdRoom error for jid '${roomJid}'`, err);\n\n            return reject(err);\n        });\n\n        return request;\n    },\n\n    /**\n     * Leaves a chat room\n     * @param {*} roomJid room id to leave\n     */\n    async leaveChatRoom(roomJid) {\n        let setInactiveRequest = new Promise((resolve, reject) => {\n            this.get('streaming.connection').setClosed(roomJid, err => (err ? reject(err) : resolve()));\n        });\n        let leaveRequest = new Promise((resolve, reject) => {\n            this.get('streaming.connection').leaveRoom(roomJid, err => (err ? reject(err) : resolve()));\n        });\n        setInactiveRequest = timeoutPromise(setInactiveRequest, 4000, 'chat#setInactiveRoom');\n        leaveRequest = timeoutPromise(leaveRequest, 4000, 'chat#leaveChatRoom');\n        try {\n            await setInactiveRequest;\n            await leaveRequest;\n        } catch (err) {\n            this.logger.error(`chat#leaveChatRoom error for jid '${roomJid}'`, err);\n        }\n    },\n\n    newRoom(jid) {\n        // ownerInjection() must be the first arg in Ember 3.28\n        return ChatRoom.create(\n            Object.assign(\n                {\n                    jid: jid,\n                    objectId: getEntityObjectId(jid)\n                },\n                getOwner(this).ownerInjection()\n            )\n        );\n    },\n\n    makeNewEmptyRoom() {\n        return new Promise(resolve => {\n            this.joinRoom()\n                .then(room => {\n                    return this.changeActiveRoom(room);\n                })\n                .then(room => {\n                    this.addEmptyRoomObserver(room);\n                    resolve(room);\n                });\n        });\n    },\n\n    addEmptyRoomObserver(room) {\n        var handler, i, key, keys, len;\n        this.set('activeEmpty', room);\n        keys = ['messages.length', 'participants.length', 'activated', 'subject'];\n        handler = () => {\n            var i, key, len, roomIsDirty;\n            if (!room.get('initialSubject')) {\n                room.set('initialSubject', room.get('subject'));\n            }\n            roomIsDirty =\n                room.get('messages.length') > 0 ||\n                room.get('participants.length') > 1 ||\n                room.get('subject') !== room.get('initialSubject') ||\n                !room.get('activated');\n            if (roomIsDirty) {\n                this.set('activeEmpty', null);\n                for (i = 0, len = keys.length; i < len; i++) {\n                    key = keys[i];\n                    room.removeObserver(key, handler);\n                }\n            }\n            return null;\n        };\n        for (i = 0, len = keys.length; i < len; i++) {\n            key = keys[i];\n            room.addObserver(key, handler);\n        }\n    },\n\n    addPersonToRoom(room, person) {\n        if (room.get('pendingRoom')) {\n            room.addParticipant(person);\n        } else {\n            if (room.isOneToOneRoom()) {\n                const oneToOneTarget = room.get('oneToOneTarget');\n                return this.makeNewEmptyRoom().then(newRoom => {\n                    this.trigger('oneToOneChangeToGroup', room, newRoom);\n                    this.inviteToRoom(newRoom, oneToOneTarget);\n                    this.inviteToRoom(newRoom, person);\n                    if (room.get('showingVideo')) {\n                        if (this.get('session.useNewNav')) {\n                            this.commandNav.selectPanel('chats');\n                        } else {\n                            this.sidebar.openPanel('conversations');\n                        }\n                    }\n                });\n            } else {\n                this.inviteToRoom(room, person);\n                return resolve();\n            }\n        }\n    },\n\n    inviteToRoom(room, user) {\n        this.streaming.inviteToRoom(room, user);\n    },\n\n    requestHistory(room, options) {\n        return new Promise((resolve, reject) => {\n            // Agent assistance is still using legacy chat\n            if (!isSupervisorJid(room.get('jid'))) {\n                return resolve([]);\n            }\n\n            if (!room.get('activated') && !room.get('oneToOneTarget')) {\n                return reject(new Error('room must be activated before you can request history'));\n            }\n\n            const historyOptions = {\n                jid: options.jid,\n                before: options.before,\n                after: options.after,\n                limit: options.limit || this.messagesPerHistoryRequest\n            };\n            this.get('streaming.connection').getMessages(historyOptions, (err, messages) => {\n                if (err) {\n                    return reject(err);\n                }\n                if (options.history) {\n                    messages = this.markAsHistory(messages);\n                }\n                return resolve(this.loadUsersForHistory(messages));\n            });\n        });\n    },\n\n    markAsHistory(messages) {\n        var i, len, message;\n        for (i = 0, len = messages.length; i < len; i++) {\n            message = messages[i];\n            message.history = true;\n        }\n        return messages;\n    },\n\n    setRoomSubject(room, subject, callback) {\n        if ((subject != null ? subject.length : void 0) > 0) {\n            return this.get('streaming.connection').setRoomSubject(room.get('jid'), subject, callback);\n        }\n    },\n\n    setPresence(presence) {\n        return this.get('streaming.connection').setPresence(presence);\n    },\n\n    setOrganizationPresenceId(presenceId) {\n        return this.get('streaming.connection').setOrganizationPresenceId(presenceId);\n    },\n\n    setStatus(status) {\n        return this.streaming.setStatus(status, this.get('session.person'));\n    },\n\n    openRoom(jid, dispatchCollabChatEvent = true) {\n        if (!this.enabled) {\n            this.logger.warn('<services/chat> user does not have permission to open chat rooms');\n            return;\n        }\n\n        if (dispatchCollabChatEvent) {\n            this.logger.info('Informing collab chat of chat room change: ', {\n                topic: COLLABORATE_CHAT_EVENTS.publish.roomChanged,\n                jid\n            });\n            this.chatFrame.notifyCollaborateChat(COLLABORATE_CHAT_EVENTS.publish.roomChanged, {\n                jid: jid\n            });\n        }\n        return this.getChatRoom(jid).then(room => {\n            // Added changeActiveRoom that setsActiveRoomId when user opens a room\n            this.changeActiveRoom(room);\n            return this.trackRoomChange(room);\n        });\n    },\n\n    oldOpenRoom(jid) {\n        return this.getChatRoom(jid).then(room => {\n            return this.changeActiveRoom(room);\n        });\n    },\n\n    /**\n       @desc Opens the video panel in the chat room with the given JID.\n       @param {string} jid\n       @returns {Promise}\n    */\n    async openChatRoomWithVideo(jid) {\n        this.application.openChatRoomWithVideo(jid);\n    },\n\n    /**\n       @desc Opens the video panel in the chat room for the user with the given ID.\n       @param {string} id\n       @returns {Promise}\n    */\n    async openChatRoomWithVideoForPersonById(id) {\n        const person = await this.store.findRecord('person', id);\n        this.logger.info('opening chat room with video for', person);\n        return this.openChatRoomWithVideo(person.get('jid'));\n    },\n\n    /**\n       @desc Opens the sidebar to the chat room for the user with the given ID.\n       @param {string} id\n       @returns {Promise}\n    */\n    async openChatRoomForPersonById(id) {\n        if (!this.enabled) {\n            this.logger.warn('<services/chat> user does not have permission to open chat rooms');\n            return;\n        }\n        const person = await this.store.findRecord('person', id);\n        if (this.get('session.useNewNav')) {\n            this.commandNav.selectPanel('chats');\n        } else {\n            this.sidebar.openPanel('conversations');\n        }\n        return this.openRoom(person.get('jid'));\n    },\n\n    /**\n       @desc Opens the sidebar to the chat room for the given JID.\n       @param {string} jid\n       @returns {Promise}\n    */\n    async openChatRoomForJid(jid) {\n        if (!this.enabled) {\n            this.logger.warn('<services/chat> user does not have permission to open chat rooms');\n            return;\n        }\n        if (this.get('session.useNewNav')) {\n            this.commandNav.selectPanel('chats');\n        } else {\n            this.sidebar.openPanel('conversations');\n        }\n        return this.openRoom(jid);\n    },\n\n    loadChatRoom(jid) {\n        return this.getChatRoom(jid).then(room => this.changeActiveRoom(room));\n    },\n\n    /**\n     * Syncs the authenticated user's chat data.\n     * Goal is to sync roster sort order, fetch badges, and fetch recent messages.\n     */\n    async syncUserChatData() {\n        try {\n            // sync the roster order\n            await this.syncAllRoomsLastMessageTime();\n            // fetch all badges\n            const roster = this.roster;\n            await roster.getAllBadgeCounts();\n\n            // fetch recent messages\n            const activeRoom = this.activeRoom;\n\n            this.logger.debug('<services/chat> syncUserChatData loading room history for room: ', activeRoom);\n            await this.loadRoomHistory(activeRoom);\n        } catch (err) {\n            this.logger.error('<services/chat> syncUserChatData failed: ', err);\n        }\n    },\n\n    /**\n     * Fetch the active chats from Realtime\n     */\n    getActiveChatsFromRealtime() {\n        return new Promise((resolve, reject) => {\n            this.get('streaming.connection').getActiveChats((err, activeRooms) => {\n                if (err) {\n                    return reject(err);\n                }\n                resolve(activeRooms);\n            });\n        });\n    },\n\n    /**\n     * Use the active chats and sync the last message radix. If the user has their roster\n     * sort order as 'Most Recent', then this will sync their roster.\n     */\n\n    async syncAllRoomsLastMessageTime() {\n        const activeChatsFromRealtime = await this.getActiveChatsFromRealtime();\n        const jids = Object.keys(activeChatsFromRealtime);\n        for (let i = 0; i < jids.length; i++) {\n            const room = await this.getChatRoom(jids[i]);\n            const { last } = activeChatsFromRealtime[jids[i]];\n            if (last) {\n                const time = moment(last);\n                room.set('lastMessageTime', time);\n                room.set('lastMessageTimeRadix', time.valueOf());\n            }\n        }\n    },\n\n    checkActiveRoomAgainstHistory(room) {\n        var historyStack, jid, lastActiveRoom, mostRecent;\n        if (this.firstRoomChosen) {\n            return;\n        }\n        jid = room.get('jid');\n        historyStack = this.roomHistoryStack;\n        lastActiveRoom = this.get('roomHistoryStack.lastObject');\n        mostRecent = this.mostRecentActiveRoom;\n        if (!isSupervisorJid(jid)) {\n            if (!!this.popoutRoom) {\n                this.set('firstRoomChosen', true);\n                return this.changeActiveRoom(this.popoutRoom);\n            } else if (jid === lastActiveRoom) {\n                this.set('firstRoomChosen', true);\n                return this.changeActiveRoom(room);\n            } else if (!mostRecent || (historyStack && historyStack.indexOf(jid) > historyStack.indexOf(mostRecent))) {\n                this.set('mostRecentActiveRoom', jid);\n                this.selectHighestAppearingActiveRoom.perform();\n            }\n        }\n    },\n\n    selectHighestAppearingActiveRoom: task(function* (delay = 500) {\n        yield timeout(delay);\n\n        if (this.firstRoomChosen) {\n            return;\n        }\n        this.set('firstRoomChosen', true);\n        return this.getChatRoom(this.mostRecentActiveRoom).then(room => this.changeActiveRoom(room));\n    }).drop(),\n\n    clearRoomNotificationCounts(room) {\n        return this.roster.clearRoomNotificationCounts(room);\n    },\n\n    changeActiveRoom(newActive) {\n        this.videoConferenceDetails.setActiveRoomId(newActive.get('jid'), newActive.get('isOneToOne'));\n\n        // keep room history stack synced\n        this.removeRoomFromHistoryStack(newActive);\n        this.addRoomToHistoryStack(newActive);\n        return newActive;\n    },\n\n    closeRoomAndClearCounts(room) {\n        return this.clearRoomNotificationCounts(room)\n            .catch(err => {\n                this.logger.error('Failed to clear counts, closing room anyway', { err, jid: this.room.get('jid') });\n            })\n            .finally(() => this.closeActiveRoom(room));\n    },\n\n    closeActiveRoom(room) {\n        room.set('showingVideo', false);\n        room.updateClosedTimeRadix();\n\n        return this.deactivateRoom(room).then(() => this.streaming.setRoomInactive(room));\n    },\n\n    deactivateRoom(room) {\n        var replacementRoomJid, selectRoomPromise;\n        this.removeRoomFromHistoryStack(room);\n        if (room.get('jid') === this.get('activeRoom.jid')) {\n            replacementRoomJid = this.get('roomHistoryStack.lastObject');\n            selectRoomPromise = replacementRoomJid\n                ? this.getChatRoom(replacementRoomJid)\n                : this.roster.getNextRoomFromActiveSection();\n            return selectRoomPromise.then(selectedRoom => this.attemptRoomChange(selectedRoom));\n        } else {\n            return Promise.resolve();\n        }\n    },\n\n    updateVolumes(deviceVolumes) {\n        this.set('chatNotificationVolume', deviceVolumes.chatNotificationVolume);\n        this.set('interactionNotificationVolume', deviceVolumes.interactionNotificationVolume);\n    },\n\n    removeRoomFromHistoryStack(room) {\n        if (room) {\n            return this.roomHistoryStack.removeObject(room.get('jid'));\n        }\n    },\n\n    addRoomToHistoryStack(room) {\n        var jid, historyStack;\n        if (room) {\n            jid = room.get('jid');\n            historyStack = this.roomHistoryStack;\n            historyStack.removeObject(jid).pushObject(jid);\n            if (historyStack.length > 10) {\n                historyStack = historyStack.slice(historyStack.length - 10);\n            }\n            this.set('roomHistoryStack', historyStack);\n        }\n    },\n\n    attemptRoomChange(room) {\n        return new Promise(resolve => {\n            var activeRoom, activeRoomJid, newRoomJid, ref;\n            activeRoom = this.activeRoom;\n            activeRoomJid = this.get('activeRoom.jid');\n            newRoomJid = room != null ? room.get('jid') : void 0;\n            if (activeRoomJid && activeRoomJid !== newRoomJid) {\n                activeRoom.set('active', false);\n            }\n            this.set('activeRoom', room);\n            if (room) {\n                room.set('jid', (ref = room.get('jid')) != null ? ref.split('/')[0] : void 0);\n                room.set('active', true);\n                this.activateRoom(room).then(function () {\n                    resolve(room);\n                });\n            } else {\n                resolve(room);\n            }\n        });\n    },\n\n    trackRoomChange(room) {\n        var activeRoom, activeRoomJid, newRoomJid, ref;\n        activeRoom = this.activeRoom;\n        activeRoomJid = this.get('activeRoom.jid');\n        newRoomJid = room != null ? room.get('jid') : void 0;\n        if (activeRoomJid && activeRoomJid !== newRoomJid) {\n            activeRoom.set('active', false);\n        }\n        this.set('activeRoom', room);\n        if (room) {\n            room.set('jid', (ref = room.get('jid')) != null ? ref.split('/')[0] : void 0);\n            room.set('active', true);\n        }\n        return room;\n    },\n\n    activateRoom(room) {\n        const jid = room.get('jid');\n        this.get('streaming.connection').setActive(jid);\n        this.focusRoom(room);\n        if (!room.get('activated')) {\n            let promise = resolve(room);\n            if (!room.isOneToOneRoom()) {\n                promise = this.joinRoom(room.get('jid'));\n            }\n            return promise.then(() => {\n                return this.loadRoomHistory(room);\n            });\n        }\n\n        return resolve(room);\n    },\n\n    focusRoom(room) {\n        return this.get('streaming.connection').setFocused(room.get('jid'));\n    },\n\n    loadRecentHistoryForAllActiveRooms() {\n        let rooms = this.rooms;\n        for (let id in rooms) {\n            if (Object.prototype.hasOwnProperty.call(rooms, id)) {\n                let room = rooms[id];\n                if (\n                    room &&\n                    typeof room.get === 'function' &&\n                    room.get('activated') &&\n                    room.get('lastMessageTimeRadix') > 0\n                ) {\n                    this.loadRecentRoomHistory(room);\n                }\n            }\n        }\n    },\n\n    loadRoomHistory(room) {\n        var options;\n        options = {\n            jid: room.get('jid'),\n            history: true\n        };\n        return this.loadRoomHistoryWithOptions(room, options);\n    },\n\n    loadMoreRoomHistory(room) {\n        var options;\n        options = {\n            jid: room.get('jid'),\n            before: room.get('firstMessageTime').toDate(),\n            history: true\n        };\n        return this.loadRoomHistoryWithOptions(room, options);\n    },\n\n    loadMoreRoomHistoryAfter(room) {\n        var options;\n        options = {\n            jid: room.get('jid'),\n            after: room.get('lastMessageTime').toDate(),\n            history: true\n        };\n        return this.loadRoomHistoryWithOptions(room, options);\n    },\n\n    loadContextualRoomHistory(room, date) {\n        var afterDate, hash;\n        room.set('loadingHistory', true);\n        afterDate = moment(date).subtract(1, 'ms').toDate();\n        hash = hash({\n            beforePromise: this.requestRoomHistory(room, {\n                jid: room.get('jid'),\n                before: date,\n                history: true\n            }),\n            afterPromise: this.requestRoomHistory(room, {\n                jid: room.get('jid'),\n                after: afterDate,\n                history: true\n            })\n        });\n        hash.then(hash => {\n            var combinedMessages;\n            combinedMessages = hash.beforePromise.concat(hash.afterPromise.reverse());\n            return this._addHistoryMessages(room, combinedMessages);\n        });\n        hash.catch(function (error) {\n            return this.logger.error('Error loading history for chat room', {\n                jid: room.get('jid'),\n                error\n            });\n        });\n        return hash.finally(function () {\n            return room.set('loadingHistory', false);\n        });\n    },\n\n    requestRoomHistory(room, options) {\n        return this.requestHistory(room, options).then(messages => {\n            if (messages == null) {\n                messages = [];\n            }\n            return this._updateRoomStatus(room, options, messages);\n        });\n    },\n\n    loadRoomHistoryWithOptions(room, options) {\n        room.set('loadingHistory', true);\n        let history = this.requestHistory(room, options).then(messages => {\n            if (messages == null) {\n                messages = [];\n            }\n            return this._processHistoryResults(room, options, messages);\n        });\n        history.catch(function (error) {\n            this.logger.error('Error loading history for chat room', {\n                error,\n                jid: room.get('jid')\n            });\n            room.set('historyError', true);\n        });\n        return history.finally(function () {\n            return room.set('loadingHistory', false);\n        });\n    },\n\n    _processHistoryResults(room, options, messages) {\n        this._updateRoomStatus(room, options, messages);\n        return this._addHistoryMessages(room, messages);\n    },\n\n    _updateRoomStatus(room, options, messages) {\n        if (options.after) {\n            room.set('moreForwardHistoryAvailable', messages.length >= this.messagesPerHistoryRequest);\n        } else {\n            room.set('moreHistoryAvailable', messages.length >= this.messagesPerHistoryRequest);\n        }\n        return messages;\n    },\n\n    _addHistoryMessages(room, messages) {\n        room.addHistoryMessages(messages);\n        return room.get('messages');\n    },\n\n    loadRecentRoomHistory(room) {\n        var maxHistoryRequestSize, options;\n        room.set('loadingHistory', true);\n        maxHistoryRequestSize = this.maxHistoryRequestSize;\n        options = {\n            jid: room.get('jid'),\n            after: room.get('lastMessageTime').toDate(),\n            limit: maxHistoryRequestSize\n        };\n        return this.requestHistory(room, options).then(messages => {\n            var i, len, message;\n            if (messages == null) {\n                messages = [];\n            }\n            for (i = 0, len = messages.length; i < len; i++) {\n                message = messages[i];\n                room.addMessage(message);\n            }\n            if (messages.length === maxHistoryRequestSize) {\n                return this.loadRecentRoomHistory(room);\n            } else {\n                room.set('loadingHistory', false);\n                return room;\n            }\n        });\n    },\n\n    _resolveRealtimeConnected: observer('streaming.connected', 'chatFrame.collabChatMainInitialized', function () {\n        const chatFrameInitialized = this.get('chatFrame.collabChatMainInitialized');\n        const connected = this.connected;\n        const canNotifyChatFrame = chatFrameInitialized;\n        if (canNotifyChatFrame) {\n            if (connected) {\n                this.chatFrame.notifyCollaborateChat(COLLABORATE_CHAT_EVENTS.publish.realtimeConnected, {\n                    payload: {\n                        connected: true\n                    }\n                });\n            } else {\n                this.chatFrame.notifyCollaborateChat(COLLABORATE_CHAT_EVENTS.publish.realtimeDisconnected, {\n                    payload: {\n                        connected: false\n                    }\n                });\n            }\n        }\n    }),\n\n    _resolveRealtimeDependentCalls: observer('connected', function () {\n        if (this.connected && this.streamingConnectDeferred) {\n            this.streamingConnectDeferred.resolve();\n            this.set('streamingConnectDeferred', null);\n        }\n    }),\n\n    /**\n     * Uses Realtime Chat API to get room details and pass to room model.\n     * @param {string} jid room jid\n     * @returns\n     */\n    setRoomDetails(jid) {\n        return this.getChatRoom(jid).then(room => {\n            return this.ajax\n                .ajaxGet(this.application.pcV2Uri(`api/v2/chats/rooms/${jid}`))\n                .then(details => {\n                    room.processRoomDetails(details);\n                    return room;\n                })\n                .catch(err => {\n                    this.logger.error('service/chat setRoomDetails: ', {\n                        error: err\n                    });\n                    return room;\n                });\n        });\n    },\n\n    async deleteParticipantFromChatRoom(room, participant) {\n        try {\n            await this.ajax.delete(\n                this.application.pcV2Uri(`api/v2/chats/rooms/${room.jid}/participants/${participant.id}`)\n            );\n            this.removeParticipantFromRoom(room, participant);\n        } catch (err) {\n            throw err;\n        }\n    },\n\n    getStreamingRoomInfo(roomJid) {\n        const getRoomInfo = () => {\n            return new Promise((resolve, reject) => {\n                return this.get('streaming.connection').getRoomInfo(roomJid, function (err, description) {\n                    if (err) {\n                        return reject(err);\n                    } else {\n                        return resolve(description);\n                    }\n                });\n            });\n        };\n\n        const deferred = this.streamingConnectDeferred;\n\n        if (deferred) {\n            return deferred.promise.then(getRoomInfo);\n        } else {\n            return getRoomInfo();\n        }\n    },\n\n    updateRoomSubject(room, subject) {\n        return room.set('rawSubject', subject);\n    },\n\n    getTargetRoomJid(arg) {\n        let { to, from } = arg;\n        if (isRoomJid(to)) {\n            return to;\n        } else if (compareJids(to, this.get('session.person.jid'))) {\n            return from;\n        } else {\n            return to;\n        }\n    },\n\n    addParticipantToRoom(room, person) {\n        if (room && person) {\n            return room.addParticipant(person);\n        }\n    },\n\n    removeParticipantFromRoom(room, person) {\n        if (room && person) {\n            return room.removeParticipant(person);\n        }\n    },\n\n    loadRoomAndUser(roomJid, userJid) {\n        return hash({\n            room: this.getChatRoom(roomJid),\n            person: this.batchDataRequests.getChatUser(userJid)\n        });\n    },\n\n    loadUsersForHistory(historyMessages) {\n        var message;\n        if (_.isEmpty(historyMessages)) {\n            return resolve(historyMessages);\n        }\n        return all(\n            function () {\n                var i, len, results;\n                results = [];\n                for (i = 0, len = historyMessages.length; i < len; i++) {\n                    message = historyMessages[i];\n                    results.push(this.processNewChatMessage(message));\n                }\n                return results;\n            }.call(this)\n        );\n    },\n\n    processNewChatMessage(message) {\n        const owner = getOwner(this);\n        let messageBody = this.parseMessageBody(message);\n\n        delete message.body;\n\n        setOwner(message, owner);\n        let messageModel = ChatMessage.create(message);\n\n        this.parseWidgetData(messageModel);\n\n        messageModel.set('messageBody', messageBody);\n        messageModel.set('time', moment(message.time));\n\n        this.checkForMentions(messageModel);\n\n        return this.batchDataRequests.getChatUser(message.from).then(person => {\n            messageModel.set('chatUser', person);\n            this.setMessageReadState(messageModel);\n            return messageModel;\n        });\n    },\n\n    parseWidgetData(message) {\n        message.get('stanza.children').forEach(child => {\n            if (this.widgets.indexOf(child.name) >= 0) {\n                let data;\n\n                try {\n                    if (child.name === 'videoNotification' && child.children.length == 0) {\n                        data = child.attrs;\n                    } else {\n                        data = JSON.parse(child.children[0]);\n                    }\n                } catch (e) {\n                    this.logger.error('Error parsing chat widget data', {\n                        name: child.name,\n                        child: child.children[0],\n                        error: e\n                    });\n                    return;\n                }\n\n                message.set('widgetType', child.name);\n                message.set('widget', EmberObject.create({ data }));\n            }\n        });\n    },\n\n    parseMessageBody(message) {\n        var body, raw;\n        raw = message.raw;\n        body = message.body;\n        if (raw) {\n            return markdownToHtml(raw);\n        } else {\n            return body;\n        }\n    },\n\n    checkForMentions(message) {\n        /* eslint-disable */\n        var match, mention, mentionRegex, mentions, oid, raw;\n        mentions = [];\n        mentionRegex = /\\[@.*\\]\\(#\\/person\\/(.*)\\)/g;\n        raw = message.get('raw');\n        while ((match = mentionRegex.exec(raw))) {\n            mention = match[0];\n            oid = match[1];\n            mentions.push(\n                EmberObject.create({\n                    mention: mention,\n                    oid: oid\n                })\n            );\n        }\n        message.set('mentions', mentions);\n        return message.set('hasMentionLinks', mentions.length > 0);\n        /* eslint-enable */\n    },\n\n    savePersonalMentions(message) {\n        return message.get('mentions').forEach(arg => {\n            var oid;\n            oid = arg.oid;\n            if (compareJids(oid, this.get('session.person.jid')) || oid === this.get('session.person.id')) {\n                message.set('hasPersonalMention', true);\n                return this.timeline.mentionEvent(message);\n            }\n        });\n    },\n\n    savePersonalChats(message) {\n        var jid;\n        jid = message.get('chatUser.jid');\n        if (!compareJids(jid, this.get('session.person.jid')) && !this.isRoomVisible(jid)) {\n            this.timeline.directMessageEvent(message);\n        }\n    },\n\n    saveRoomChats(message) {\n        var roomJid, userJid;\n        userJid = message.get('chatUser.jid');\n        roomJid = message.get('room.jid');\n        if (\n            !compareJids(userJid, this.get('session.person.jid')) &&\n            !this.isRoomVisible(roomJid) &&\n            !isAcdJid(roomJid)\n        ) {\n            this.timeline.roomMessageEvent(message);\n        }\n    },\n\n    setMessageReadState(message) {\n        var roomIsVisible, windowFocused;\n        if (compareJids(message.get('chatUser.jid'), this.get('session.person.jid')) || message.get('history')) {\n            return message.set('unread', false);\n        } else {\n            windowFocused = this.windowInFocus();\n            roomIsVisible = this.get('sidebar.visibleChatRoom.jid') === this.getTargetRoomJid(message);\n            return message.set('unread', !roomIsVisible || !windowFocused);\n        }\n    },\n\n    isActiveRoom(room) {\n        return this.isActiveRoomJid(get(room, 'jid'));\n    },\n\n    isActiveRoomJid(jid) {\n        return jid && this.get('activeRoom.jid') === jid;\n    },\n\n    isRoomVisible(jid) {\n        return this.get('sidebar.visibleChatRoom.jid') === jid && this.windowInFocus();\n    },\n\n    isChatVisible() {\n        return this.get('sidebar.showConversations') && this.windowInFocus();\n    },\n\n    windowInFocus() {\n        var hosted;\n        hosted = this.get('applicationService.hostedContext');\n        if (hosted != null ? hosted.isHosted() : void 0) {\n            return hosted.applicationHasFocus();\n        } else {\n            return !this.get('application.browserHidden');\n        }\n    },\n\n    async popoutChatRoom(room, showingVideo) {\n        const roomJid = room.get('jid');\n        const featureBranch = this.get('chatFrame.featureBranch');\n        const collabParams = [];\n        const voltParams = [];\n\n        if (featureBranch) {\n            /* Include the query parameter collaboratechat=\"<featureBranch>\" in the route URL -> This is crucial for the popout to detect branch changes when using timeMachine. */\n            collabParams.push({ key: 'collaboratechat', value: featureBranch });\n        }\n\n        if (showingVideo) {\n            voltParams.push({ key: 'showingVideo', value: true });\n        }\n\n        const routeUrl = new URL(`${window.location.origin}${window.location.pathname}#/chat-room/${roomJid}`);\n        // We don't need softphone handling in popout\n        routeUrl.searchParams.append('disableSoftphone', true);\n        // store collab chat params\n        collabParams.forEach(({ key, value }) => {\n            routeUrl.searchParams.append(key, value);\n        });\n\n        let route = routeUrl.toString();\n\n        // volt adds query params to end of url for hash params\n        const mappedVoltParams = voltParams.map(param => `${param.key}=${param.value}`);\n        if (mappedVoltParams.length > 0) {\n            route += `?${mappedVoltParams.join('&')}`;\n        }\n        this.chatFrame.notifyCollaborateChatIFrame(COLLABORATE_CHAT_EVENTS.publish.RoomPoppedOut, {\n            roomJid,\n            route\n        });\n    },\n\n    sendCmdToIFrame(payload) {\n        const collabChatInitialized = this.get('chatFrame.collabChatMainInitialized');\n        const collabChatFrame = this.get('chatFrame.collaborateChatIFrame');\n\n        if (collabChatFrame && collabChatInitialized) {\n            const intl = this.intl;\n            const { name, hidden } = payload;\n\n            if (['zoom', 'teams'].includes(name)) return;\n            const helpText = intl.exists(`chat.commands.${name}.command`)\n                ? intl.t(`chat.commands.${name}.description`).toString()\n                : '';\n\n            this.chatFrame.notifyCollaborateChat(COLLABORATE_CHAT_EVENTS.publish.toCollabChatCommand, {\n                payload: {\n                    command: { name, help: helpText, hidden }\n                }\n            });\n        } else {\n            window.setTimeout(() => this.sendCmdToIFrame.call(this, payload), 100);\n        }\n    },\n    handleCmdIFrame() {\n        next(() => {\n            const chatCommands = this.chatCommands;\n            if (chatCommands) {\n                chatCommands.on(COLLABORATE_CHAT_EVENTS.publish.toCollabChatCommand, this.sendCmdToIFrame.bind(this));\n            }\n        });\n    },\n    sendCommandsToIframe(commands) {\n        if (!!commands) {\n            if (commands.length > 0) {\n                commands.forEach(command => this.sendCmdToIFrame(command));\n                this.chatCommands.emptyQueuedCommands();\n            }\n        }\n    },\n\n    handleXMPPReferenceMention(message) {\n        const {\n            stanza: { children },\n            from,\n            to\n        } = message;\n        const personJid = this.get('session.person.jid');\n        const referenceChildren = _.filter(children, {\n            name: 'reference',\n            attrs: {\n                uri: personJid,\n                action: 'SUCCEEDED'\n            }\n        });\n\n        referenceChildren.forEach(() => {\n            this.handleMentionEvent(from, to, message);\n        });\n    },\n\n    async handleMentionEvent(from, room, message) {\n        const user = await this.batchDataRequests.getChatUser(from);\n        const chatRoom = await this.getChatRoom(room);\n\n        this.sendMentionNotification(chatRoom, user, message);\n    },\n\n    handleCollaborateChatMessage(message) {\n        const children = message.stanza.children;\n        const isMention = children.findBy('name', 'reference') !== undefined;\n        if (isMention) {\n            this.handleXMPPReferenceMention(message);\n        }\n        const roomJid = this.getTargetRoomJid(message);\n        this.getChatRoom(roomJid).then(room => {\n            this.processNewChatMessage(message).then(async messageModel => {\n                messageModel.set('room', room);\n                if (room.isOneToOneRoom()) {\n                    this.savePersonalChats(messageModel, room);\n                } else {\n                    this.savePersonalMentions(messageModel);\n                    this.saveRoomChats(messageModel, room);\n                    this.roster.incrementUnreadGroupMessage(messageModel, room);\n                }\n\n                if (this.get('permissions.canViewBusinessChat')) {\n                    this.sendNotification(messageModel);\n                }\n            });\n        });\n    },\n\n    watchVideoParticipantCount: observer(\n        'videoConferenceDetails.subscribedConferences.firstObject',\n        'chatFrame.collabChatMainInitialized',\n        function () {\n            if (!this.get('chatFrame.collabChatMainInitialized')) {\n                return;\n            }\n            const subscribedConference = this.get('videoConferenceDetails.subscribedConferences.firstObject');\n            const videoParticipantCount = this.videoConferenceDetails.getVideoParticipantCount(subscribedConference);\n\n            if (subscribedConference) {\n                this.chatFrame.notifyCollaborateChatIFrame(COLLABORATE_CHAT_EVENTS.publish.videoParticipantCount, {\n                    videoParticipantCount: videoParticipantCount,\n                    roomJid: subscribedConference.conferenceId\n                });\n            }\n        }\n    )\n});\n","import Evented from '@ember/object/evented';\n\nimport Service from '@ember/service';\nimport { assert } from '@ember/debug';\nimport { run, cancel } from '@ember/runloop';\n\nimport Ember from 'ember';\n\nconst CLOCK_TICK = 1000;\n\nexport default Service.extend(Evented, {\n    second: null,\n    minute: null,\n    halfHour: null,\n    hour: null,\n    day: null,\n\n    init() {\n        this._super(...arguments);\n        this.set('_previousTick', performance.now());\n        this._pendulum(false);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        cancel(this.runId);\n    },\n\n    _pendulum(triggerEvent = true) {\n        const thisTick = performance.now();\n\n        // Trigger clockTick event with elapsed time since last tick\n        if (triggerEvent) {\n            this.trigger('clockTick', thisTick - this._previousTick);\n        }\n\n        this.set('_previousTick', thisTick);\n        this._tick(new Date());\n\n        if (!Ember.testing && !this.isDestroying && !this.isDestroyed) {\n            const runId = run.later(this, this._pendulum, CLOCK_TICK);\n            this.set('runId', runId);\n        }\n    },\n\n    _tick(now) {\n        assert('a clock _tick takes a date parameter', now !== null);\n        const minute = now.getMinutes();\n        const second = now.getSeconds();\n        this.set('second', second);\n        this.set('minute', minute);\n        this.set('halfHour', 60 - minute > 30);\n        this.set('hour', now.getHours());\n        this.set('day', now.getDay());\n    }\n});\n","import { reads } from '@ember/object/computed';\nimport { next } from '@ember/runloop';\nimport Service, { inject as service } from '@ember/service';\nimport { computed } from '@ember/object';\nimport _ from 'lodash';\nimport CoachingNotificationModel from '../models/coaching-appointment';\nimport { formatDateForDisplay, formatTimeForDisplay } from 'web-directory/utils/date-time';\n\nexport default Service.extend({\n    application: service(),\n    ajax: service(),\n    permissions: service(),\n    session: service(),\n    intl: service(),\n    inbox: service(),\n    notification: service(),\n    host: reads('application.purecloudV2BaseUri'),\n    namespace: 'api/v2',\n    pageNumber: 1,\n    pageSize: 500,\n    totalItems: 0,\n    itemsPerPageOptions: [1, 2, 5, 10, 25, 50, 500],\n    activeCoachingModalId: null,\n    getPageNumber: computed('pageNumber', function () {\n        return this.pageNumber;\n    }),\n    getTotalItems: computed('totalItems', function () {\n        return this.totalItems;\n    }),\n    getPageSize: computed('pageSize', function () {\n        return this.pageSize;\n    }),\n    patchCoachingNotification: function (notification, markedAsRead) {\n        const notificationId = notification.id;\n        let url = 'api/v2/coaching/notifications/' + notificationId;\n        const fullUrl = this.application.pcUri(url);\n        return this.ajax.patch(fullUrl, { data: { markedAsRead: markedAsRead } });\n    },\n    baseUrl() {\n        return `${this.host}/${this.namespace}`;\n    },\n    /**\n     *\n     * @param {*} expand - (string) Field to expand\n     */\n    getCoachingNotifications: function (expand) {\n        let url = `${this.baseUrl()}/coaching/notifications?pageSize=${this.pageSize}&pageNumber=${this.pageNumber}`;\n        if (expand) {\n            url += `&expand=${expand}`;\n        }\n\n        return this.ajax\n            .ajaxGet(url)\n            .then(response => {\n                this.set('totalItems', response.total);\n                if (response.total === 0) {\n                    this.set('pageNumber', 0);\n                }\n                return _.map(response.entities, item => CoachingNotificationModel.create(item)).filter(\n                    item => item.status !== `Completed` && !(item.markedAsRead === true && item.actionType === `Delete`)\n                );\n            })\n            .catch(reason => {\n                console.warn('Failed to retrieve notifications:', { reason });\n            });\n    },\n\n    getCoachingAppointment: function (appointmentId) {\n        return this.ajax.ajaxGet(`${this.baseUrl()}/coaching/appointments/${appointmentId}`);\n    },\n\n    getAttendees: function (attendeeIds) {\n        let url = `${this.baseUrl()}/users?`;\n        for (const id of attendeeIds) {\n            url += 'id=' + id + '&';\n        }\n        url = url.slice(0, -1);\n        return this.ajax.ajaxGet(url);\n    },\n\n    changeNotificationPageNumber: function (pageNumber) {\n        this.set('pageNumber', pageNumber);\n    },\n\n    changeNotificationPageSize: function (pageSize) {\n        this.set('pageSize', pageSize);\n        this.set('pageNumber', 1);\n    },\n\n    changeCoachingNotificationReadState: function (notification, read) {\n        notification.set('markedAsRead', read);\n        const url = this.application.pcUri(`api/v2/coaching/notifications/${notification.id}`);\n        const data = {\n            markedAsRead: read\n        };\n        this.ajax.patch(url, { data });\n    },\n    getFormattedDate: function (dateString) {\n        return formatDateForDisplay(dateString, 'long');\n    },\n    getFormattedStartTime: function (dateString) {\n        return formatTimeForDisplay(dateString, 'short');\n    },\n    getFormattedEndTime: function (dateString, lengthInMinutes) {\n        // Add lengthInMinutes to start time (60,000 ms/min)\n        const endDate = new Date(new Date(dateString).getTime() + lengthInMinutes * 60000);\n        return formatTimeForDisplay(endDate.toISOString(), 'short');\n    },\n    getEndTime: function (dateString, lengthInMinutes) {\n        // Add lengthInMinutes to start time (60,000 ms/min)\n        return new Date(new Date(dateString).getTime() + lengthInMinutes * 60000).toISOString();\n    },\n    updatePaginationOnCreate: function () {\n        const notifications = this.get('inbox.coachingAppointments');\n        this.set('totalItems', notifications.length);\n        this.set('pageNumber', 1);\n    },\n    updatePaginationOnDelete: function (notification) {\n        const notifications = this.get('inbox.coachingAppointments');\n\n        if (notification) {\n            this.inbox.removeCoachingNotification(notification);\n        }\n\n        if (notifications.length > 0) {\n            this.set('totalItems', this.totalItems - 1);\n        } else {\n            this.set('totalItems', 0);\n            this.set('pageNumber', 0);\n        }\n\n        const pageNumber = this.pageNumber;\n        let noOfPages = Math.ceil(notifications.length / this.pageSize);\n        if (pageNumber > 1 || noOfPages > 1) {\n            noOfPages = Math.ceil(this.totalItems / this.pageSize);\n\n            // This check here determines if the new No. of pages is less than the current page number\n            // If so, this means that as a result of a deletion, there is one less page of results\n            // So set the active page to one less than it currently is\n            if (noOfPages < this.pageNumber) {\n                this.changeNotificationPageNumber(this.pageNumber - 1);\n            }\n        }\n    },\n\n    openCoachingAppointmentModal: function (appointmentId) {\n        this.set('activeCoachingModalId', appointmentId);\n        next(() =>\n            this.populateDataForCoachingModal({\n                appointment: {\n                    id: appointmentId\n                }\n            })\n        );\n    },\n\n    populateDataForCoachingModal: function (notification) {\n        const userPermissions = this.get('permissions.donutPermissions');\n        const sessUser = this.get('session.user');\n        const user = { id: sessUser.id, name: sessUser.data.name };\n        const token = this.get('session.accessToken');\n        const baseUri = `${window.location.origin}${this.application.pcUri('api/v2')}`;\n\n        if (notification) {\n            // Grab the wizard and fill in the details\n            const modal = document.querySelector('wem-coaching-modal');\n            if (modal) {\n                const wizard = modal;\n                wizard.currentUser = user;\n                wizard.currentUserPermissions = userPermissions;\n                wizard.featureToggles = this.get('session.enabledFeatures');\n\n                const coaching = this;\n                const notification = this.notification;\n                const intl = this.intl;\n                // We don't need to remove these listeners; setting the activeId to null removes it from the DOM.\n                wizard.addEventListener('modalClosed', () => coaching.set('activeCoachingModalId', null));\n                wizard.addEventListener('saved', res => {\n                    let status = 200;\n                    if (res.detail && res.detail.status) {\n                        status = res.detail.status;\n                    }\n                    switch (status) {\n                        case 200: {\n                            const appts = this.get('inbox.coachingAppointments');\n                            const currentNotification = appts.find(n => {\n                                return n.appointment.id === res.detail.parsedBody.id;\n                            });\n                            currentNotification.set('isOverdue', res.isOverdue);\n                            coaching.set('activeCoachingModalId', null);\n                            // A pagination update will not need to be called here as this will be handled by the hawk message post appt change\n                            break;\n                        }\n                        case 202: {\n                            coaching.set('activeCoachingModalId', null);\n                            break;\n                        }\n                        case 409: {\n                            const title = intl.t('notification.inbox.coachingAppointment.toast.conflict.title');\n                            const message = intl.t('notification.inbox.coachingAppointment.toast.conflict.message');\n                            notification.error(title, message);\n                            break;\n                        }\n                        default: {\n                            const title = intl.t('notification.inbox.coachingAppointment.toast.badrequest.title');\n                            const message = intl.t('notification.inbox.coachingAppointment.toast.badrequest.message');\n                            notification.error(title, message);\n                        }\n                    }\n                });\n\n                wizard.useDefaultCoachingService(baseUri, token).then(() => {\n                    wizard.loadAppointment(this.activeCoachingModalId);\n                });\n            }\n        }\n    }\n});\n","import { get } from '@ember/object';\nimport { Promise } from 'rsvp';\nimport Service, { inject as service } from '@ember/service';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport ConversationMixin from 'web-directory/mixins/conversation';\nimport participantStatus from 'web-directory/utils/acdParticipantStatuses';\n\nconst _loadCobrowse = scriptUrl => {\n    return new Promise((resolve, reject) => {\n        $.getScript(scriptUrl)\n            .done(() => {\n                resolve();\n            })\n            .fail(err => {\n                console.error('Could not load cobrowse.js script', { error: err });\n                reject(err);\n            });\n    });\n};\n\nexport default Service.extend(LoggerMixin, ConversationMixin, {\n    session: service(),\n    application: service(),\n\n    cobrowse: null,\n    activeSession: null,\n\n    loadCobrowse: function () {\n        return _loadCobrowse(\n            `${this.get('application.cobrowseUri')}` + '/cobrowse-jsapi-v1.js?deploymentKey=DEVELOPMENT'\n        )\n            .then(() => {\n                this.set('cobrowseLoaded', true);\n            })\n            .catch(err => {\n                this.logger.error('Co-browse: Failed to load co-browse.', { error: err });\n                throw err;\n            });\n    },\n\n    startCobrowse: function () {\n        if (!this.cobrowseLoaded) {\n            return this.loadCobrowse().then(() => this.startCobrowse());\n        }\n        this.logger.log('Co-browse: Initiating co-browsing...');\n\n        return new Promise((resolve, reject) => {\n            window.PureCloud.cobrowse.startSharing(\n                {\n                    participant: {\n                        displayName: this.get('session.person.name')\n                    }\n                },\n                (err, sharerSession) => {\n                    if (err) {\n                        this.logger.error('Co-browse: Failed to start sharing page', { error: err });\n                        return reject(err);\n                    }\n\n                    this.logger.log('Co-browse: Initiated. Page is being shared.');\n                    this.set('activeSession', sharerSession);\n                    this.logger.log('Co-browse: Viewer URL: ' + sharerSession.getViewerUrl());\n                    resolve(sharerSession);\n                }\n            );\n        });\n    },\n\n    stopCobrowse: function () {\n        const session = this.activeSession;\n        if (session) {\n            this.set('activeSession', null);\n            return session.stop();\n        }\n    },\n\n    processCobrowseActivationFailure: function (interaction) {\n        const sessionId = get(interaction, 'mostRecentCustomerSessionShare.cobrowseSessionId');\n        const isCustomerCobrowseConnected =\n            get(interaction, 'mostRecentCustomerSessionShare.state').toLowerCase() ===\n            participantStatus.CONNECTED.toLowerCase();\n        if (sessionId && isCustomerCobrowseConnected) {\n            const url = this.application.pcV2Uri(`api/v2/cobrowse/session/${sessionId}/activationfailure`);\n            const options = { data: { reason: 'INSUFFICIENT_PERMISSIONS' } };\n            this.makeRequest(url, options, 'post');\n        }\n    }\n});\n","import Ember from 'ember';\nimport { computed } from '@ember/object';\nimport Service, { inject } from '@ember/service';\nimport { Maybe } from 'web-directory/types';\nimport { PanelDefinitions, Panel, PanelId } from 'web-directory/components/command-panel/panel-definition';\nimport { observer } from '@ember/object';\nimport { doFocus } from 'web-directory/utils/focus-management';\nimport { TRANSITION_EVENT } from 'web-directory/router';\nimport { getOwner } from '@ember/application';\nimport { addPageAction } from 'web-directory/utils/newrelic';\n\nconst DEFAULT_PANEL = 'panel-not-active';\nconst FT_COPILOT_FRAMEWORK = 'AI-1223_copilot-framework';\nconst MAIN_STAGE_ELEMENT = '#skip-link-main-content-target';\n\nexport type NavPreferences = {\n    panel: PanelId;\n    drawer?: Maybe<string>;\n    expanded?: Maybe<boolean>;\n};\n\nconst commandNavService = Service.extend({\n    preferences: inject('preferences'),\n    events: inject('events'),\n    permissions: inject('permissions'),\n    chat: inject('chat'),\n    session: inject('session'),\n\n    /**\n     * Reference to Ember router to handle NOOP transitions\n     */\n    _router: null as any,\n\n    /**\n     * Bound hashchange handler stored for proper removeEventListener teardown\n     */\n    _hashChangeHandler: null as Maybe<() => void>,\n\n    /**\n     * Bound router transition handler stored for proper router.off() teardown\n     */\n    _transitionHandler: null as Maybe<() => void>,\n\n    /**\n     * Panel definitions loaded from command-panel\n     */\n    panelDefinitions: PanelDefinitions,\n\n    /**\n     * Currently selected panel id\n     */\n    currentPanel: DEFAULT_PANEL as PanelId,\n\n    /**\n     * Currently selected panel drawer id\n     */\n    currentDrawer: null as Maybe<string>,\n\n    /**\n     * Last opened panel reference\n     */\n    lastOpened: {\n        panel: DEFAULT_PANEL as PanelId,\n        drawer: null as Maybe<string>,\n        expanded: false as Maybe<boolean>\n    } as NavPreferences,\n\n    /**\n     * Tracks whether a loadPreferences call is currently in-flight to prevent\n     * concurrent calls from racing and producing inconsistent state. If a call\n     * arrives while one is in-flight, it is queued so the retry still runs once\n     * the in-flight call completes (e.g. observer fires while init call is pending).\n     */\n    _loadPreferencesInFlight: false,\n    _loadPreferencesQueued: false,\n\n    /**\n     * true/false if the panel is expanded to full width\n     */\n    expanded: false,\n\n    /*\n     * Boolean set from command-view that tracks small screen width\n     */\n    narrowWidth: false,\n\n    /**\n     * **hack**\n     * Active call control panel bound to collaborate call panel\n     */\n    callControlsTab: 'callHistory',\n\n    /**\n     * true/false if agent workspace is currently active panel\n     */\n    agentPanelIsActive: computed.equal('currentPanel', 'agent'),\n\n    /**\n     * Notifications app pool attention count\n     * Set by the command-panel-notifications component\n     */\n    notificationsAttentionCount: 0 as number,\n\n    /**\n     * List of standalone app names and IDs populated by command-nav component\n     * when _buildAppMenuItems resolves.\n     */\n    standaloneApps: null as Maybe<Array<{ id: string; name: string }>>,\n\n    init() {\n        this._super(...arguments);\n        this.loadPreferences();\n\n        const hashChangeHandler = () => this.handleHashChange();\n        this.set('_hashChangeHandler', hashChangeHandler);\n        window.addEventListener('hashchange', hashChangeHandler);\n\n        try {\n            this.set('_router', getOwner(this).lookup('router:main'));\n            const transitionHandler = () => this.handleHashChange();\n            this.set('_transitionHandler', transitionHandler);\n            this.get('_router').on(TRANSITION_EVENT, transitionHandler);\n        } catch (e) {\n            console.error(\"Failed to setup router. Can't transition\", { thrownError: e });\n            this.set('_router', null);\n        }\n    },\n\n    willDestroy() {\n        const hashChangeHandler = this.get('_hashChangeHandler');\n        if (hashChangeHandler) {\n            window.removeEventListener('hashchange', hashChangeHandler);\n        }\n\n        const router = this.get('_router');\n        const transitionHandler = this.get('_transitionHandler');\n        if (router && transitionHandler) {\n            router.off(TRANSITION_EVENT, transitionHandler);\n        }\n\n        this._super(...arguments);\n    },\n\n    handleHashChange() {\n        if (this.get('isDestroyed') || this.get('isDestroying')) {\n            return;\n        }\n        if (this.get('expanded')) {\n            if (this.get('currentPanel') === 'agent') {\n                this.selectPanel('panel-not-active');\n            } else if (this.get('currentPanel') === 'chats') {\n                this.set('expanded', false);\n                this.set('lastOpened', {\n                    panel: this.get('currentPanel'),\n                    drawer: this.get('currentDrawer'),\n                    expanded: false\n                });\n                this._persistNavState(this.get('currentPanel'), this.get('currentDrawer'), false);\n            }\n        } else if (this.get('narrowWidth') && this.get('currentPanel') !== 'panel-not-active') {\n            this.selectPanel('panel-not-active');\n        }\n    },\n\n    // Re-attempt panel restore when permissions data becomes available.\n    // We observe both allowedOrgPermissions and donutPermissions because\n    // canViewBusinessChat/canGoOnQueue require both to be populated.\n    // They come from different bootstrap steps and may arrive at different times —\n    // observing both ensures we retry whenever either changes.\n    getPreferencesOnChange: observer(\n        'permissions.allowedOrgPermissions',\n        'permissions.donutPermissions',\n        'chat.enabled',\n        function () {\n            // Debounce observer-triggered retries — each observed property may\n            // change independently during bootstrap, causing multiple rapid fires.\n            // 100ms is enough to coalesce them into one call without noticeable delay.\n            // @ts-ignore — `this` is implicitly any in Ember 2.x observer functions\n            Ember.run.debounce(this, this.loadPreferences, 100);\n        }\n    ),\n\n    /**\n     * Returns true if the given persistent panel is allowed to be restored for\n     * the current user. Mirrors the visibility gates applied by the command-panel\n     * component and command-button-factory so we don't restore a panel the user\n     * can't actually see.\n     *\n     * Each case must be kept in sync with the corresponding `perms` field in\n     * panel-definition.ts and the computed properties in command-panel/component.ts.\n     */\n    _canRestorePanel(panelId: PanelId): boolean {\n        // Cast to any — permissions and session services have properties not\n        // reflected in their type definitions.\n        const permissions = this.get('permissions') as any;\n        switch (panelId) {\n            case 'agent':\n                return !!permissions.get('canGoOnQueue');\n            case 'chats':\n                // chatsEnabled = org.hasChatEnabled && canViewBusinessChat && person.jid\n                return !!(this.get('chat') as any).get('enabled');\n            case 'copilot-framework':\n                // copilotFrameworkEnabled = FT && canViewCopilotFrameworkMessage\n                return !!(\n                    (this.get('session') as any).get(`features.${FT_COPILOT_FRAMEWORK}`) &&\n                    permissions.get('canViewCopilotFrameworkMessage')\n                );\n            case 'apps':\n                return true;\n            default:\n                return true;\n        }\n    },\n\n    loadPreferences() {\n        // Don't attempt to restore if a panel is already active — either we\n        // already restored successfully, or the user has manually opened a panel.\n        if (this.get('currentPanel') !== DEFAULT_PANEL) {\n            return;\n        }\n\n        if (this.get('isDestroyed') || this.get('isDestroying')) {\n            return;\n        }\n\n        // If a call is already in-flight, queue one retry rather than running\n        // concurrently. This handles the case where the observer fires while the\n        // init call is still pending (e.g. permissions resolve mid-flight).\n        if (this.get('_loadPreferencesInFlight')) {\n            this.set('_loadPreferencesQueued', true);\n            return;\n        }\n        this.set('_loadPreferencesInFlight', true);\n        this.set('_loadPreferencesQueued', false);\n\n        return this.get('preferences')\n            .getPreference('commandNav')\n            .then((preferences: NavPreferences) => {\n                if (preferences) {\n                    const panelDef = this.get('panelDefinitions').find(\n                        (panel: Panel) => panel.id === preferences.panel\n                    );\n\n                    if (!panelDef) {\n                        // Abort if the last stored panel is not defined.\n                        return;\n                    }\n\n                    if (panelDef.persistent !== true) {\n                        // Don't restore non-persistent panels on bootstrap\n                        return;\n                    }\n\n                    if (!this._canRestorePanel(preferences.panel)) {\n                        return;\n                    }\n\n                    if (this.get('isDestroyed') || this.get('isDestroying')) {\n                        return;\n                    }\n                    this.set('currentPanel', preferences.panel || DEFAULT_PANEL);\n\n                    // @ts-ignore\n                    const panel: Panel = this.get('panelDefinitions').findBy('id', preferences.panel);\n                    if (preferences.expanded && panel.expandable) {\n                        this.set('expanded', preferences.expanded);\n                    }\n\n                    this.set('currentDrawer', preferences.drawer);\n                    if (preferences.panel) this.set('lastOpened', preferences);\n                }\n            })\n            .catch((error: Error) => {\n                console.warn('command-nav: failed to load preferences', { thrownError: error });\n            })\n            .finally(() => {\n                if (this.get('isDestroyed') || this.get('isDestroying')) {\n                    return;\n                }\n                this.set('_loadPreferencesInFlight', false);\n                // Run the queued retry now that the in-flight call has settled.\n                if (this.get('_loadPreferencesQueued')) {\n                    this.loadPreferences();\n                }\n            });\n    },\n\n    /**\n     * Write the current nav state to preferences as a single atomic object.\n     * Using one write instead of three separate sub-key writes avoids interleaving\n     * races in the pendingSets queue and ensures the server always receives a\n     * coherent commandNav object.\n     */\n    _persistNavState(panel: PanelId, drawer: Maybe<string>, expanded: boolean) {\n        const state: NavPreferences = { panel, drawer: drawer ?? null, expanded };\n        // Cast to any — preferences service has private methods and untyped properties\n        // that aren't reflected in the service type definition.\n        const pref = this.get('preferences') as any;\n\n        // Set the in-memory property synchronously so _performPersistPreferences\n        // picks up the new value immediately when it reads allLocalPreferences.\n        // The async setPreference call updates localforage in parallel.\n        pref.set('commandNav', Ember.Object.create(state));\n        pref.setPreference('commandNav', state, false);\n\n        // Flush to server immediately — nav state changes are infrequent so\n        // there's no value in debouncing them, and we want the write to survive\n        // a fast reload.\n        if (pref.get('syncEnabled') && !pref.get('isDestroyed') && !pref.get('isDestroying')) {\n            pref._performPersistPreferences();\n        }\n    },\n\n    selectPanel(panel: PanelId, expanded: boolean = false) {\n        if (this.get('isDestroyed') || this.get('isDestroying')) {\n            return;\n        }\n        if (panel) {\n            addPageAction('selectNavPanel', {\n                panel,\n                expanded\n            });\n\n            if (this.get('currentPanel') !== panel) {\n                //@ts-ignore\n                this.set('currentPanel', panel);\n\n                // @ts-ignore\n                const panelDefinition = this.get('panelDefinitions').findBy('id', panel);\n\n                let expandable = panelDefinition ? !!panelDefinition.expandable : false;\n\n                if (this.get('expanded') && !expandable) {\n                    this.set('expanded', false);\n                }\n\n                if (panelDefinition?.expandable && expanded) {\n                    this.set('expanded', true);\n                } else {\n                    this.set('expanded', false);\n                }\n\n                // @ts-ignore\n                let defaultDrawer = this.get('panelDefinitions').findBy('id', panel)?.defaultDrawerId;\n                this.set('currentDrawer', defaultDrawer);\n\n                // Persist the whole nav state as one atomic write.\n                // Non-persistent panels (inbox, help, voice, etc.) store panel-not-active\n                // so a stale persistent panel from a previous session is never restored.\n                const panelToStore =\n                    panelDefinition?.persistent === true || panel === DEFAULT_PANEL ? panel : DEFAULT_PANEL;\n                this._persistNavState(panelToStore, defaultDrawer, this.get('expanded'));\n\n                if (panel !== DEFAULT_PANEL) {\n                    this.set('lastOpened', {\n                        panel,\n                        drawer: defaultDrawer,\n                        expanded: this.get('expanded')\n                    });\n                }\n                Ember.run.scheduleOnce('afterRender', this, () => {\n                    this.focusPanel(panel);\n                });\n            } else {\n                if (panel === 'agent') return;\n                if (expanded && !this.get('expanded')) {\n                    // @ts-ignore\n                    const panelDefinition = this.get('panelDefinitions').findBy('id', panel);\n                    if (panelDefinition && !!panelDefinition.expandable) {\n                        this.set('expanded', true);\n                        this._persistNavState(panel, this.get('currentDrawer'), true);\n                        Ember.run.scheduleOnce('afterRender', this, () => {\n                            this.focusPanel(panel);\n                        });\n                        return;\n                    }\n                }\n            }\n        }\n    },\n\n    focusPanel(panel: PanelId) {\n        // When collapsing to the default there is no in-panel element left to focus, so move\n        // focus to the main stage content anchor instead; otherwise target the panel's\n        // jump-to-command-panel anchor.\n        //\n        // Pass the string selector, not a resolved DOM element. doFocus/_queryElement expect a\n        // selector string (they call selector.match(...)); passing an Element previously threw\n        // \"TypeError: selector.match is not a function\". doFocus resolves and null-checks the\n        // element internally.\n        const focusTarget =\n            panel === DEFAULT_PANEL ? MAIN_STAGE_ELEMENT : '#' + panel.toString() + '-jump-to-command-panel';\n        doFocus(Ember, focusTarget);\n    },\n\n    expandPanel(panel: PanelId) {\n        if (this.get('isDestroyed') || this.get('isDestroying')) {\n            return;\n        }\n        if (panel) {\n            this.toggleProperty('expanded');\n            const expanded = this.get('expanded');\n            const drawer = this.get('currentDrawer');\n            this._persistNavState(this.get('currentPanel'), drawer, expanded);\n            this.set('lastOpened', {\n                panel: this.get('currentPanel'),\n                drawer,\n                expanded\n            });\n        }\n    },\n\n    selectDrawer(panel: PanelId, drawer: string) {\n        if (panel && drawer) {\n            if (panel === this.get('currentPanel')) {\n                this.set('currentDrawer', drawer);\n                this._persistNavState(panel, drawer, this.get('expanded'));\n            }\n            this.set('lastOpened', {\n                panel,\n                drawer,\n                expanded: this.get('expanded')\n            });\n        }\n    },\n\n    togglePanel() {\n        if (this.get('currentPanel') == DEFAULT_PANEL) {\n            let last = this.get('lastOpened');\n            this.selectPanel(last.panel, last.expanded ?? false);\n\n            if (last.drawer) {\n                this.selectDrawer(last.panel, last.drawer);\n            }\n        } else {\n            this.selectPanel(DEFAULT_PANEL);\n        }\n    }\n});\n\nexport default commandNavService;\nexport class CommandNavService extends commandNavService {}\n\ndeclare module '@ember/service' {\n    interface Registry {\n        'command-nav': CommandNavService;\n    }\n}\n","import { get } from '@ember/object';\nimport { cancel, later } from '@ember/runloop';\nimport Service, { inject as service } from '@ember/service';\nimport { Promise, reject, all, resolve } from 'rsvp';\nimport Evented from '@ember/object/evented';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport _ from 'lodash';\nimport ConversationMixin from 'web-directory/mixins/conversation';\n\nimport { isTesting } from 'web-directory/utils/testing';\nimport UriBuilder from '../mixins/conversation-uri-builder';\nimport participantStatus from '../utils/acdParticipantStatuses';\nimport timeoutPromise from '../utils/timeout-promise';\n\nconst INTERACTION_TYPE = {\n    call: 'calls',\n    chat: 'chats',\n    email: 'emails',\n    callback: 'callbacks',\n    message: 'messages'\n};\n\nexport default Service.extend(UriBuilder, LoggerMixin, ConversationMixin, Evented, {\n    // Note:\n    //\n    // Most of this was ported from the design pattern we had in Engage.\n    // We'll need to re-evaluate its usage here to determine if this is\n    // still something we want to do or if its a little heavy-handed since\n    // we're not abstracting this logic from all interaction types like\n    // we previously were.\n\n    application: service(),\n    session: service(),\n    store: service(),\n    addressformat: service(),\n    ajax: service(),\n    phone: service(),\n\n    validationWaitTime: isTesting ? 0 : 15000,\n\n    init() {\n        this._super(...arguments);\n        this.set('_timers', []);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        this._timers.forEach(item => cancel(item));\n    },\n\n    getAllActiveConversations() {\n        const url = this.baseUri();\n        return this.makeRequest(url, {}, 'get').then(response => response.entities);\n    },\n\n    getAllActive(communicationType) {\n        const url = this.baseUri();\n        const options = { data: { communicationType } };\n        return this.makeRequest(url, options, 'get').then(response => response.entities);\n    },\n\n    /**\n     * Places a call on the participantForCurrentUser for the given interaction.\n     * @param {Interaction} interaction - the interaction to add a call to\n     * @param {string} number - the number to dial\n     * @param {string} phoneColumn - for a dialer preview/scheduled callback, the phone column associated with the number\n     */\n    addCall(interaction, number, phoneColumn) {\n        const id = interaction.get('id');\n        const url = this.callsUri(id);\n        const options = { data: { callNumber: number, phoneColumn: phoneColumn } };\n        return this.makeRequest(url, options, 'post');\n    },\n\n    answer(interaction) {\n        const userId = interaction.get('participantForCurrentUser.id');\n        const url = this.participantUri(interaction.id, userId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { state: participantStatus.CONNECTED } };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return this.validateActionSucceeded(interaction, 'interactionState', participantStatus.CONNECTED);\n        });\n    },\n\n    disconnectParticipant(interactionId, participantId, mediaType) {\n        const url = this.participantUri(interactionId, participantId, INTERACTION_TYPE[mediaType]);\n        const options = { data: { state: participantStatus.DISCONNECTED } };\n\n        return this.makeRequest(url, options, 'patch');\n    },\n\n    hold(interaction) {\n        const interactionId = interaction.get('id');\n        const userId = interaction.get('participantForCurrentUser.id');\n        const url = this.participantUri(interactionId, userId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { held: true } };\n\n        if (!get(interaction, 'isConnected')) {\n            this.logger.debug(`Attempted to hold non-connected conversation: ${interaction.get('id')}`);\n            return Promise.resolve();\n        }\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return this.validateActionSucceeded(interaction, 'isHeld', true);\n        });\n    },\n\n    unhold(interaction) {\n        const interactionId = interaction.get('id');\n        const userId = interaction.get('participantForCurrentUser.id');\n        const url = this.participantUri(interactionId, userId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { held: false } };\n\n        if (!get(interaction, 'isConnected')) {\n            this.logger.debug(`Attempted to set hold state for non-connected conversation: ${interaction.get('id')}`);\n            return Promise.resolve();\n        }\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return this.validateActionSucceeded(interaction, 'isHeld', false);\n        });\n    },\n\n    pause(interaction) {\n        const interactionId = interaction.get('id');\n        const url = this.communicationUri(interactionId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { recordingState: 'PAUSED' } };\n        return this.makeRequest(url, options, 'patch');\n    },\n\n    unpause(interaction) {\n        const interactionId = interaction.get('id');\n        const url = this.communicationUri(interactionId, INTERACTION_TYPE[interaction.get('type')]);\n        const options = { data: { recordingState: 'ACTIVE' } };\n        return this.makeRequest(url, options, 'patch');\n    },\n\n    snippetRecord(interaction, recordOptions) {\n        const { record } = recordOptions;\n        const interactionId = interaction.get('id');\n        const userId = interaction.get('participantForCurrentUser.id');\n        const url =\n            this.participantUri(interactionId, userId, INTERACTION_TYPE[interaction.get('type')]) + '/snippet/record';\n        const options = { data: { type: 'snippet', record } };\n        return this.makeRequest(url, options, 'post');\n    },\n\n    requestAcw(interactionId, participantId, agentCommunicationId) {\n        const url = this.requestACWUri(interactionId, participantId, agentCommunicationId);\n        const options = { data: { afterCallWorkRequired: true } };\n        return this.makeRequest(url, options, 'patch');\n    },\n\n    skipAcw(interactionId, participantId, agentCommunicationId) {\n        const url = this.requestACWUri(interactionId, participantId, agentCommunicationId);\n        const options = { data: { afterCallWorkRequired: false } };\n        return this.makeRequest(url, options, 'patch');\n    },\n\n    disconnect(interaction) {\n        const interactionId = interaction.get('id');\n        const userId = interaction.get('participantForCurrentUser.id');\n        const url = this.participantUri(interactionId, userId, INTERACTION_TYPE[interaction.get('type')]);\n        let options = {\n            data: {\n                state: participantStatus.DISCONNECTED\n            }\n        };\n\n        //\n        // Note We only want to apply communicationWrapupSkipped to callbacks not within campains. We do this\n        // to prevent wrapup showing now where it did not use to show before.\n        //\n        const isDialerCampaign = get(interaction, 'isCampaignCallback');\n        const isSkippingPreviewCampaign =\n            isDialerCampaign && get(interaction, 'selectedWrapupCode.id') === 'ININ-OUTBOUND-PREVIEW-SKIPPED';\n        const hasPlacedCallsInCallback =\n            typeof get(interaction, 'participantForCurrentUser.calls.firstObject') === 'object';\n        if (\n            get(interaction, 'useCommunicationACW') &&\n            get(interaction, 'isCallback') &&\n            hasPlacedCallsInCallback &&\n            !isSkippingPreviewCampaign\n        ) {\n            options.data.communicationWrapupSkipped = true;\n        }\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return this.validateActionSucceeded(interaction, 'interactionState', [\n                undefined,\n                participantStatus.DISCONNECTED\n            ]);\n        });\n    },\n\n    park(interaction, resumeTime) {\n        // PATCH /api/v2/conversations/{interactionType}/{id}/participants/{id} + state\n        const interactionId = interaction.get('id');\n        const userId = interaction.get('participantForCurrentUser.id');\n        const url = this.participantUri(interactionId, userId, INTERACTION_TYPE[interaction.get('type')]);\n        const data = { state: participantStatus.PARKED };\n        if (resumeTime) {\n            data.resumeTime = resumeTime;\n        }\n        const options = { data };\n\n        return this.makeRequest(url, options, 'patch');\n    },\n\n    mergeToConference(interaction) {\n        // PATCH api/v2/conversations/calls/{conversationId}/conference\n        const interactionId = interaction.get('id');\n        const conferenceId = interaction.get('associatedConversationId');\n        if (interactionId && conferenceId) {\n            const url = this.mergeToConferenceUri(conferenceId);\n            const data = {\n                conversationIds: [interactionId]\n            };\n            const options = {\n                data\n            };\n            return this.makeRequest(url, options, 'patch');\n        }\n        return reject(\n            new Error(`Missing interaction Id: ${interactionId} or associated conversation Id: ${conferenceId}`)\n        );\n    },\n\n    disconnectCall(interaction) {\n        const conversation = this.get('phone.conversations').findBy('id', interaction.get('id'));\n        if (conversation) {\n            this.trigger('endCall', conversation);\n        }\n    },\n\n    getWrapUpCodes(interaction) {\n        const userId = interaction.get('participantForCurrentUser.id');\n        const interactionId = interaction.get('id');\n        const url = this.participantWrapupCodesUri(interactionId, userId, INTERACTION_TYPE[interaction.get('type')]);\n        return this.makeRequest(url, {}, 'get');\n    },\n\n    getProvisionalACWNotes(interaction, participantId) {\n        const userId = participantId ? participantId : interaction.get('participantForCurrentUser.id');\n        const interactionId = interaction.get('id');\n        const communicationId = interaction.get('communicationMedia.id');\n        const options = {\n            type: 'GET',\n            data: { provisional: 'true' }\n        };\n        let url = this.participantWrapupUri(interactionId, userId, INTERACTION_TYPE[interaction.get('type')]);\n\n        if (get(interaction, 'useCommunicationACW')) {\n            url = this.participantCommunicationWrapupUri(\n                interactionId,\n                userId,\n                INTERACTION_TYPE[interaction.get('type')],\n                communicationId\n            );\n        }\n\n        return this.makeRequest(url, options, 'raw');\n    },\n\n    loadParticipantPerson(userId) {\n        if (userId) {\n            if (this.store.hasRecordForId('person', userId)) {\n                return Promise.resolve(this.store.peekRecord('person', userId));\n            }\n            return this.store.findRecord('person', userId).catch(error => {\n                this.logger.error('Unable to retrieve person for participant', { userId, error });\n                return Promise.resolve();\n            });\n        } else {\n            return Promise.resolve();\n        }\n    },\n\n    /**\n     * Fetches the notes based on the participant and their corresponding wrap up object within a\n     * specified interaction. If the notes are within the data already then it prevents the need to\n     * fetch the participants current provisional notes.\n     * @param interaction The currently active interaction\n     * @param {{ wrapup }} param1 Any data object that could contain the wrapup information\n     * @param participantId The id of the participant that the notes are coming from\n     * @returns A promise that resolves to a data object containing wrap up and note information\n     */\n    getParticipantNotes(interaction, { wrapup }, participantId) {\n        if (wrapup) {\n            return Promise.resolve(wrapup);\n        } else {\n            return this.getProvisionalACWNotes(interaction, participantId);\n        }\n    },\n\n    /**\n     * Iterates through all of the historical notes in an interaction and fetches additional information needed\n     * to populate the historical notes timeline. Based on the `useCommunicationACW` model function in an interaction,\n     * it determines where we are pulling the notes from.\n     * @param interaction The currently active interaction\n     * @returns An array of promises to fetch the notes of the interaction\n     */\n    getAllHistoricalACWNotes(interaction) {\n        const currentParticipantId = interaction.get('participantForCurrentUser.id');\n        let promiseArray = [];\n\n        interaction.participants.forEach(participant => {\n            const participantId = participant.id;\n            const userId = participant.userId;\n\n            if (participantId && userId) {\n                if (get(interaction, 'useCommunicationACW')) {\n                    const media = [...(participant[interaction.type] || participant[`${interaction.type}s`] || [])];\n\n                    //An agent receiving a callback should be able to read notes from all previous calls and callbacks\n                    //So callback interactions need to include data from previous calls (aka participant['calls']), and vice versa\n                    if (interaction.type === 'callback') {\n                        media.push(...(participant['calls'] || []));\n                    }\n\n                    if (interaction.type === 'call') {\n                        media.push(...(participant['callbacks'] || []));\n                    }\n\n                    if (!!media.length) {\n                        /**\n                         * For this implementation we are no longer fetching the other agents provisional notes\n                         * and adding them to the historical timeline. That is why this iteration is not using the\n                         * `getParticipantNotes` function like it is below. We do not need to check if the `purpose`\n                         * value on the participant is equal to `agent` since media items only show up on a\n                         * participants that can add notes and wrap up. In short, this will allow any participant to add\n                         * notes to the timeline if we ever decide to support that elsewhere.\n                         */\n                        promiseArray.push(\n                            ...media\n                                // This filter prevents empty promises and ensures that the array will not have duplicate messages\n                                .filter((data, index, array) => {\n                                    return (\n                                        !!data.wrapup &&\n                                        index ===\n                                            array.findIndex(\n                                                element =>\n                                                    !!element.wrapup &&\n                                                    element.wrapup.endTime === data.wrapup.endTime &&\n                                                    element.wrapup.notes === data.wrapup.notes\n                                            )\n                                    );\n                                })\n                                .map(async data => {\n                                    const { wrapup } = data;\n                                    const person = await this.loadParticipantPerson(userId);\n                                    if (person) {\n                                        wrapup.person = person;\n                                    }\n                                    return wrapup;\n                                })\n                        );\n                    }\n                } else if (\n                    /**\n                     * If the participant object has a `wrapup` object on it then allow it to pass through regardless no matter what the purpose\n                     * of the participant is. However, if there is not a `wrapup` object then we check the `id`'s to prevent the return of the\n                     * current users own provisional notes, and we only want to try and fetch the provisional notes if the purpose is of `agent`.\n                     * This implementation allows the fetching of other agents provisional notes. In contrast, the implementation above does NOT.\n                     * This is intentional and we will want to move to the implementation above eventually.\n                     */\n                    participant.wrapup ||\n                    (currentParticipantId !== participantId && participant.purpose !== 'agent')\n                ) {\n                    promiseArray.push(\n                        this.getParticipantNotes(interaction, participant, participantId).then(async response => {\n                            const result = response.payload || response;\n                            const person = await this.loadParticipantPerson(userId);\n                            if (person) {\n                                result.person = person;\n                            }\n                            return result;\n                        })\n                    );\n                }\n            }\n        });\n\n        return Promise.all(promiseArray);\n    },\n\n    submitAfterCallWork(interaction) {\n        const userId = get(interaction, 'participantForCurrentUser.id');\n        const interactionId = get(interaction, 'id');\n        let url = this.participantUri(interactionId, userId, INTERACTION_TYPE[interaction.get('type')]);\n        let method = 'patch';\n\n        const code = get(interaction, 'selectedWrapupCode.id') || '';\n        let payload = {\n            wrapup: {\n                code,\n                notes: get(interaction, 'notes') || '',\n                tags: []\n            }\n        };\n\n        if (!interaction.get('isAfterCallWorkMandatory') && _.isEmpty(payload.wrapup.code)) {\n            payload.wrapup.wrapupSkipped = true;\n        }\n\n        if (get(interaction, 'useCommunicationACW')) {\n            url = this.participantCommunicationWrapupUri(\n                interactionId,\n                userId,\n                INTERACTION_TYPE[interaction.get('type')],\n                get(interaction, 'communicationMedia.id')\n            );\n            method = 'post';\n            payload = payload.wrapup;\n        }\n\n        const isCallOrCallback = interaction.get('isCall') || interaction.get('isCallback');\n\n        const options = { data: payload };\n        return this.makeRequest(url, options, method).finally(() => {\n            if (isCallOrCallback) {\n                // not all calls are webrtc but this is triggering saying this\n                // webrtc call should be gone by this point, if there is one\n                this.disconnectCall(interaction);\n            }\n        });\n    },\n\n    /**\n     * Start a monitor on a participant in a conversation\n     */\n    monitor(callId, participantId) {\n        const url = this.monitorUri(callId, participantId);\n        return this.makeRequest(url, {}, 'post');\n    },\n\n    /**\n     * Take over a monitored messaging conversation\n     */\n    takeover(interaction) {\n        const interactionId = interaction.get('id');\n        const userId = interaction.get('participantForCurrentAgent.id');\n        const url = this.takeoverUri(interactionId, userId);\n        return this.makeRequest(url, {}, 'post');\n    },\n\n    transfer(interaction, options, query, entityType = '') {\n        const userId = interaction.get('participantForCurrentUser.id');\n        const interactionId = interaction.get('id');\n        const interactionType = null;\n\n        entityType = !entityType && query && query.address ? `address` : entityType;\n\n        const url = this.replaceUri(interactionId, userId, null, interactionType, entityType);\n        const transferType = query.transferType || 'Unattended';\n\n        options = options || {};\n        options.data = query;\n\n        return this.makeRequest(url, options, 'post').then(() => {\n            this.trigger('callTransferred', interaction);\n\n            if (transferType === 'Attended') {\n                return this.validateActionSucceeded(interaction, 'isAttendedTransferring', true);\n            } else {\n                return this.validateActionSucceeded(interaction, 'interactionState', [\n                    participantStatus.DISCONNECTED,\n                    participantStatus.TERMINATED\n                ]);\n            }\n        });\n    },\n\n    cancelTransfer(interaction, participant) {\n        const interactionId = interaction.get('id');\n        const interactionType = INTERACTION_TYPE[interaction.get('type')];\n        const communicationId = participant[interactionType].get('firstObject.id');\n\n        return this.makeRequest(\n            this.communicationsUri(interactionId, participant.id, interactionType, communicationId),\n            { data: { state: 'disconnected' } },\n            'patch'\n        )\n            .then(() => this.validateActionSucceeded(interaction, 'wasTransferCanceled', true))\n            .catch(error => {\n                this.logger.error('There was an issue canceling the transfer', error);\n            });\n    },\n\n    // Once we move interactions to use Ember data, we'll extract this into a stand alone utility.\n    // (https://inindca.atlassian.net/browse/UI-2200)\n    validateActionSucceeded(interaction, attributeToMonitor, expectedValue) {\n        const logger = this.logger;\n        const ajax = this.ajax;\n        const userId = this.get('session.person.guid');\n\n        logger.debug('ACD: validateActionSucceeded: Validating interaction', interaction);\n\n        return new Promise((resolve, reject) => {\n            const requestUri = this.baseUri();\n            const communicationType = interaction.get('type');\n            const data = { communicationType };\n            const VALIDATION_INTERVAL = this.validationWaitTime;\n\n            const VALIDATION_TIMEOUT = later(function () {\n                return verifyViaAjax();\n            }, VALIDATION_INTERVAL);\n            this._timers.push(VALIDATION_TIMEOUT);\n\n            if (!interaction) {\n                return valResolve();\n            }\n\n            // Register the observer *before* the initial check so add/remove\n            // stay balanced on the fast-path (value already at expected state).\n            // Unbalanced removeObserver on chained key paths (e.g.\n            // 'consultAgentParticipant.calls.firstObject.confined') decrements\n            // Ember 3's chain-watcher reference counts past zero and throws\n            // \"Cannot read properties of undefined (reading 'count')\".\n            let observerAdded = false;\n            createObserver();\n            checkForSuccessUpdate();\n\n            function valResolve() {\n                destroyObserver();\n                return resolve();\n            }\n\n            function valReject() {\n                destroyObserver();\n                return reject();\n            }\n\n            function createObserver() {\n                if (observerAdded) {\n                    return;\n                }\n                logger.debug(`ACD: validateActionSucceeded: Observer created on ${attributeToMonitor}`);\n                interaction.addObserver(`${attributeToMonitor}`, checkForSuccessUpdate);\n                observerAdded = true;\n            }\n\n            function destroyObserver() {\n                // Idempotent: the observer callback and the verifyViaAjax\n                // fallback timer can both race to tear this down.\n                if (!observerAdded) {\n                    return;\n                }\n                logger.debug(`ACD: validateActionSucceeded: Observer destroyed on ${attributeToMonitor}`);\n                interaction.removeObserver(`${attributeToMonitor}`, checkForSuccessUpdate);\n                observerAdded = false;\n            }\n\n            function checkForSuccessUpdate() {\n                if (actionHasSucceeded()) {\n                    cancel(VALIDATION_TIMEOUT);\n                    return valResolve();\n                }\n            }\n\n            /**\n             * Formats the expected value to an array with all string expectations lowercase.\n             * @param {string|boolean|undefined|string[]} expectedValue\n             *          The expected value(s)\n             * @returns {[]} An array containing the expected value(s). All strings are lowercased, booleans and 'undefined' are unchanged.\n             */\n            function formatExpectedValue(expectedValue) {\n                if (Array.isArray(expectedValue)) {\n                    let lowercaseValues = _.chain(expectedValue)\n                        .filter(value => typeof value === 'string')\n                        .map(value => value.toLowerCase())\n                        .value();\n                    if (_.includes(expectedValue, undefined)) {\n                        lowercaseValues.push(undefined);\n                    }\n                    return lowercaseValues;\n                } else if (typeof expectedValue === 'string') {\n                    return [expectedValue.toLowerCase()];\n                } else if (typeof expectedValue === 'boolean') {\n                    return [expectedValue];\n                } else if (expectedValue === undefined) {\n                    return [expectedValue];\n                }\n                return [];\n            }\n\n            function actionHasSucceeded() {\n                let formattedExpectedValues = formatExpectedValue(expectedValue);\n\n                let currentValue = interaction.get(`${attributeToMonitor}`);\n                if (typeof currentValue === 'string') {\n                    currentValue = currentValue.toLowerCase();\n                }\n\n                const actionSucceeded = _.includes(formattedExpectedValues, currentValue);\n\n                if (actionSucceeded) {\n                    logger.debug('ACD: validateActionSucceeded: action succeeded for attr ', attributeToMonitor);\n                    return true;\n                }\n\n                return false;\n            }\n\n            function verifyViaAjax() {\n                return timeoutPromise(\n                    new Promise((resolve, reject) => {\n                        logger.debug('ACD: validateActionSucceeded: Will verify via ajax', attributeToMonitor);\n                        return ajax\n                            .ajaxGet(requestUri, { data })\n                            .then(interactions => {\n                                if (interaction && (interaction.isDestroyed || interaction.isDestroying)) {\n                                    logger.debug(\n                                        'ACD: validateActionSucceeded: interaction destroyed while verifying.'\n                                    );\n                                    return resolve();\n                                }\n\n                                let newInteraction = _.find(interactions.entities, { id: interaction.get('id') });\n\n                                if (interaction && newInteraction) {\n                                    interaction.setProperties(newInteraction);\n                                    if (get(interaction, 'conversation')) {\n                                        interaction.get('conversation').setProperties(newInteraction);\n                                    }\n                                }\n\n                                if (actionHasSucceeded()) {\n                                    return resolve();\n                                }\n\n                                logger.info('Conversation attribute resolved, but never updated', {\n                                    namespace: 'conversations',\n                                    options: {\n                                        attributeToMonitor,\n                                        expectedValue,\n                                        actualValue: interaction.get(`${attributeToMonitor}`)\n                                    },\n                                    user: userId,\n                                    conversationId: interaction.get('id')\n                                });\n\n                                reject('Attribute never updated.');\n                            })\n                            .catch(err => {\n                                logger.error('Conversation attribute never updated', {\n                                    namespace: 'conversations',\n                                    options: {\n                                        attributeToMonitor,\n                                        expectedValue,\n                                        actualValue: interaction.get(`${attributeToMonitor}`)\n                                    },\n                                    error: err,\n                                    user: userId,\n                                    conversationId: interaction.get('id')\n                                });\n                                reject(err);\n                            });\n                    }),\n                    VALIDATION_INTERVAL,\n                    'communication#verifyViaAjax'\n                )\n                    .then(function () {\n                        return valResolve();\n                    })\n                    .catch(function (err) {\n                        return valReject(err);\n                    });\n            }\n        });\n    },\n\n    /** Begins a consult transfer interaction for the provided participant\n     * with a given address.\n     * @param {string} interaction the model for the call\n     * @param {Object} destination the destination participant to consult with\n     * @param {string} entityType the type of entity participant is consulting with | Values queue, person, ''\n     */\n    initiateConsult(interaction, destination, entityType = '') {\n        const customerId = interaction.get('participantForCustomer.id');\n        const interactionId = interaction.get('id');\n        let data = {\n            speakTo: 'DESTINATION',\n            destination: destination\n        };\n\n        if (typeof destination === 'object') {\n            data = {\n                speakTo: 'DESTINATION',\n                ...destination\n            };\n        }\n\n        const options = { data };\n        const url = this.consultUri(interactionId, customerId, INTERACTION_TYPE[interaction.get('type')], entityType);\n\n        return !customerId ? reject(new Error('customer not present')) : this.makeRequest(url, options, 'post');\n    },\n\n    /** Updates a consult transfer interaction to speak to both consulting parties\n     * @param {string} callId the id of the call the consult is occurring on\n     * @param {string} participantId the id of the participant being transferred\n     */\n    consultBoth(interaction) {\n        const callId = interaction.get('id');\n        const participantId = interaction.get('consultParticipant.id');\n        const url = this.consultUri(callId, participantId, INTERACTION_TYPE[interaction.get('type')], null, true);\n        const options = { data: { speakTo: 'BOTH' } };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return all([\n                this.validateActionSucceeded(interaction, 'isConsultParticipantHolding', false),\n                this.validateActionSucceeded(interaction, 'consultAgentParticipant.calls.firstObject.confined', false)\n            ]);\n        });\n    },\n\n    /** Updates a consult transfer interaction to speak to Conference\n     * @param {string} callId the id of the call the consult is occurring on\n     * @param {string} participantId the id of the participant being transferred\n     */\n    consultConference(interaction) {\n        const callId = interaction.get('id');\n        const participantId = interaction.get('consultParticipant.id');\n        const url = this.consultUri(callId, participantId, INTERACTION_TYPE[interaction.get('type')], null, true);\n        const options = { data: { speakTo: 'CONFERENCE' } };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return all([\n                this.validateActionSucceeded(interaction, 'isConsultParticipantHolding', false),\n                this.validateActionSucceeded(interaction, 'consultAgentParticipant.calls.firstObject.confined', false)\n            ]);\n        });\n    },\n\n    /** Updates a consult transfer interaction to speak to the destination consulting party\n     * @param {string} callId the id of the call the consult is occurring on\n     * @param {string} participantId the id of the participant being transferred\n     */\n    consultDestination(interaction) {\n        const callId = interaction.get('id');\n        const participantId = interaction.get('consultParticipant.id');\n        const url = this.consultUri(callId, participantId, INTERACTION_TYPE[interaction.get('type')], null, true);\n        const options = { data: { speakTo: 'DESTINATION' } };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return all([\n                this.validateActionSucceeded(interaction, 'isConsultParticipantHolding', true),\n                this.validateActionSucceeded(interaction, 'consultAgentParticipant.calls.firstObject.confined', false)\n            ]);\n        });\n    },\n\n    /**\n     * Updates a consult transfer interaction to speak to the object (customer) consulting party\n     * @param {string} callId the id of the call the consult is occurring on\n     * @param {string} participantId the id of the participant being transferred\n     */\n    consultObject(interaction) {\n        const callId = interaction.get('id');\n        const participantId = interaction.get('consultParticipant.id');\n        const url = this.consultUri(callId, participantId, INTERACTION_TYPE[interaction.get('type')], null, true);\n        const options = { data: { speakTo: 'OBJECT' } };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return all([\n                this.validateActionSucceeded(interaction, 'isConsultParticipantHolding', false),\n                this.validateActionSucceeded(interaction, 'consultAgentParticipant.calls.firstObject.confined', true)\n            ]);\n        });\n    },\n\n    /**\n     * Cancels a consult transfer interaction\n     * @param {string} callId the id of the call the consult is occurring on\n     * @param {string} participantId the id of the participant being transferred\n     */\n    cancelConsult(interaction) {\n        const callId = interaction.get('id');\n        const participantId = interaction.get('consultParticipant.id');\n        const cancelConsult = true;\n        const url = this.consultUri(\n            callId,\n            participantId,\n            INTERACTION_TYPE[interaction.get('type')],\n            null,\n            cancelConsult\n        );\n\n        return this.makeRequest(url, {}, 'DELETE');\n    },\n\n    /**\n     * Initiates a shared session (screen share, co-browse, video)\n     *\n     * NOTE: This request does not require the mediaType in URL.  This\n     * is essentially the same URL pattern as v1.\n     *\n     * @param {object} interaction object\n     * @param {object} customer participant\n     */\n    initiateSessionShare(interaction, customerId) {\n        const interactionId = interaction.get('id');\n        const mediaType = 'screenshare';\n        const sessionCodeUrl = this.sessionShareCodeUri(interactionId, customerId);\n        const options = { data: { mediaType } };\n\n        if (interaction.get('isV2Provider')) {\n            return this.makeRequest(sessionCodeUrl, options, 'post').then(res => {\n                if (!res.sourceCommunicationId || !res.addCommunicationCode) {\n                    return reject(new Error('No session share code.'));\n                }\n\n                const types = [];\n                if (interaction.get('canCobrowse')) {\n                    types.push('cobrowse');\n                }\n                if (interaction.get('canScreenShare')) {\n                    types.push('screenshare');\n                }\n\n                const url = this.mediaRequestUri(interactionId, 'chats');\n                const toId = interaction.get('participantForCustomer.chats.firstObject.id');\n                const fromId = interaction.get('participantForCurrentUser.chats.firstObject.id');\n                const mediaRequestOptions = {\n                    data: {\n                        types,\n                        state: 'PENDING',\n                        toCommunicationId: toId,\n                        fromCommunicationId: fromId,\n                        communicationId: res.sourceCommunicationId,\n                        securityKey: res.addCommunicationCode\n                    }\n                };\n                return all([resolve(res), this.makeRequest(url, mediaRequestOptions, 'post')]);\n            });\n        }\n\n        return all([this.makeRequest(sessionCodeUrl, options, 'post')]);\n    },\n\n    /**\n     * Ends a shared session (screen share, co-browse, video)\n     * @param {object} interaction object\n     */\n    expireSessionShareCode(interaction, customerId) {\n        const interactionId = interaction.get('id');\n        const securityKey = interaction.get('sessionShareCode');\n        const url = this.expireSessionShareCodeUri(interactionId, customerId, securityKey);\n\n        return this.makeRequest(url, {}, 'DELETE');\n    },\n\n    disconnectMediaType(interaction, mediaType, mediaId) {\n        const userId = get(interaction, 'participantForCurrentUser.id');\n        const interactionId = get(interaction, 'id');\n        const url = this.disconnectMediaTypeUri(interactionId, mediaId, userId, mediaType);\n        const options = {\n            data: {\n                state: participantStatus.DISCONNECTED\n            }\n        };\n\n        return this.makeRequest(url, options, 'patch').then(() => {\n            return this.validateActionSucceeded(interaction, 'sessionShareState', 'disconnected');\n        });\n    },\n\n    createEmail: function (queueId, email, externalContactId) {\n        const path = 'api/v2/conversations/emails';\n        const url = this.application.pcV2Uri(path);\n        const options = {\n            data: {\n                direction: 'OUTBOUND',\n                queueId: queueId,\n                toAddress: email\n            },\n            headers: {\n                'Content-Type': 'application/json'\n            },\n            method: 'post'\n        };\n        if (externalContactId) {\n            options.data.externalContactId = externalContactId;\n        }\n        return this.makeRequest(url, options);\n    },\n\n    sendSMSMessage: function (interactionId, communicationId, message) {\n        const url = this.sendSMSMessageUri(interactionId, communicationId);\n        const timestamp = new Date().toISOString();\n        const options = {\n            data: {\n                direction: 'outbound',\n                timestamp: timestamp\n            },\n            method: 'post'\n        };\n        if (\n            message.normalizedMessage &&\n            message.normalizedMessage.content &&\n            message.normalizedMessage.content.length > 0 &&\n            message.normalizedMessage.content[0].attachment\n        ) {\n            options.data.mediaIds = [message.normalizedMessage.content[0].attachment.id];\n        } else if (message.messagingTemplate) {\n            options.data.messagingTemplate = message.messagingTemplate;\n        } else {\n            options.data.textBody = message.normalizedMessage.text;\n        }\n        return this.makeRequest(url, options);\n    },\n\n    createMessage: function (options, useExistingConversation) {\n        const url = this.createCommunicationUri('messages');\n        const isExternalContact = get(options, 'entity.entity.type') === 'externalcontacts/contact';\n        const requestOptions = {\n            data: {\n                queueId: options.queueId,\n                toAddress: options.entity.value,\n                useExistingConversation,\n                toAddressMessengerType: options.toAddressMessengerType,\n                useUserFromAddress: options.useUserFromAddress,\n                externalContactId: isExternalContact ? options.entity.id : null\n            }\n        };\n        return this.makeRequest(url, requestOptions, 'post');\n    },\n\n    getSMSDetails: function (interactionId, smsIds) {\n        if (_.isEmpty(smsIds)) {\n            return Promise.resolve([]);\n        }\n        const url = this.smsMessageBatchUri(interactionId);\n        const options = {\n            data: smsIds\n        };\n        return this.makeRequest(url, options, 'post');\n    },\n\n    getDeploymentConfig(deploymentId, getSupportedContent = false) {\n        if (deploymentId) {\n            const deploymentConfigUri = this.getDeploymentConfigUri(deploymentId, getSupportedContent);\n            return this.makeRequest(deploymentConfigUri, {}, 'get');\n        }\n        return reject(new Error('Missing deployment Id', deploymentId));\n    },\n\n    getMessagingSettings(subMessageType, integrationId) {\n        if (integrationId && subMessageType) {\n            const integrationIdConfigUri = this.getIntegrationConfigUri(subMessageType, integrationId);\n            return this.makeRequest(integrationIdConfigUri, {}, 'get');\n        }\n        return reject(new Error(`Missing integration Id: ${integrationId} or subtype: ${subMessageType}`));\n    },\n\n    createConversationSummaryFeedback(conversationId, summaryId, data) {\n        if (conversationId && summaryId) {\n            const url = this.getConversationSummaryFeedbackUri(conversationId, summaryId);\n            const options = data ? { data } : {};\n            return this.makeRequest(url, options, 'post');\n        }\n        return reject(new Error(`Missing conversation Id: ${conversationId} or summary Id: ${summaryId}`));\n    }\n});\n","import Service, { inject as service } from '@ember/service';\n\nconst uris = {\n    base: `/platform/api/v2/outbound/contactlists`,\n    contactList: contactListId => uris.base + `/${contactListId}`,\n    contact: (contactListId, contactId) => uris.contactList(contactListId) + `/contacts/${contactId}`\n};\n\nexport default Service.extend({\n    ajax: service(),\n\n    getContact(contactListId, contactId) {\n        return this.ajax.ajaxGet(uris.contact(contactListId, contactId));\n    }\n});\n","import { cancel } from '@ember/runloop';\nimport { reads } from '@ember/object/computed';\nimport Service, { inject as service } from '@ember/service';\nimport _ from 'lodash';\n\nexport default Service.extend({\n    stashLogger: service(),\n    session: service(),\n    phone: service(),\n\n    personGuid: reads('session.person.guid'),\n\n    init() {\n        this._super(...arguments);\n        this.set('conversationTimelines', {});\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        _.forEach(this.conversationTimelines, conversationTimeline => {\n            cancel(conversationTimeline.sendTimeout);\n            cancel(conversationTimeline.endingTimeout);\n        });\n    },\n\n    curateMessage(level, topic, ...itemsToLog) {\n        const isPigeon = topic === 'service:pigeon';\n\n        if (isPigeon) {\n            return false;\n        }\n\n        const item = _.find(\n            itemsToLog,\n            item =>\n                (item && (item.conversationId || (isPigeon && item.update && item.update.id))) ||\n                (item.remoteData && item.remoteData.conversationId)\n        );\n        if (!item) {\n            return false;\n        }\n\n        const conversationId =\n            item.conversationId ||\n            (item.update && item.update.id) ||\n            (item.remoteData && item.remoteData.conversationId);\n\n        return this._addToTimeline(level, conversationId, itemsToLog, isPigeon);\n    },\n\n    _addToTimeline(level, conversationId, itemsToLog, isPigeon) {\n        if (!conversationId) {\n            return false;\n        }\n\n        const clientTime = Date.now();\n        let message;\n        let extra;\n\n        if (isPigeon && itemsToLog.length > 1) {\n            message = 'CP Update - simplified';\n            const pigeonLog = { participants: [] };\n\n            _.forEach(itemsToLog[1].update.participants, participant => {\n                let calls, videos;\n                const participantIsCurrentUser = participant.userId === this.personGuid;\n\n                if (participant.calls) {\n                    calls = participant.calls.map(call => {\n                        return {\n                            id: call.id,\n                            confined: call.confined,\n                            held: call.held,\n                            muted: call.muted,\n                            state: call.state\n                        };\n                    });\n                }\n\n                if (participant.videos) {\n                    videos = participant.videos.map(video => {\n                        return {\n                            sharingScreen: video.sharingScreen,\n                            state: video.state,\n                            audioMuted: video.audioMuted,\n                            videoMuted: video.videoMuted\n                        };\n                    });\n                }\n\n                if (!calls && !videos) {\n                    return false;\n                }\n\n                let participantObject = {\n                    calls,\n                    videos,\n                    userId: participant.userId\n                };\n                if (participantIsCurrentUser) {\n                    participantObject.isCurrentUser = true;\n                }\n                pigeonLog.participants.push(participantObject);\n            });\n\n            if (!pigeonLog.participants.length) {\n                return false;\n            }\n\n            extra = pigeonLog;\n        } else {\n            const itemWithMessage = itemsToLog.find(item => item.message);\n\n            if (itemWithMessage) {\n                message = itemWithMessage.message;\n            } else if (!itemWithMessage && typeof itemsToLog[0] === 'string') {\n                message = itemsToLog.shift();\n            }\n\n            if (itemsToLog.length) {\n                extra = itemsToLog.filter(i => i.remoteData).map(i => i.remoteData);\n            }\n        }\n\n        const trace = this.stashLogger.createTrace(level, 'conversation-timeline-v2', [\n            message,\n            {\n                remoteData: {\n                    conversationId,\n                    message,\n                    extra,\n                    clientTime\n                }\n            }\n        ]);\n\n        this.get('stashLogger.logs').pushObject(trace);\n        return true;\n    }\n});\n","import { reads } from '@ember/object/computed';\nimport { reject } from 'rsvp';\nimport { A } from '@ember/array';\nimport Service, { inject as service } from '@ember/service';\nimport Evented from '@ember/object/evented';\nimport { computed } from '@ember/object';\nimport { getOwner } from '@ember/application';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nexport default Service.extend(LoggerMixin, Evented, {\n    feature: service(),\n    pigeon: service(),\n\n    // The services required in order to use this service in your application\n    // They are looked up dynamically\n    store: null,\n    session: null,\n\n    activeConversations: null,\n\n    currentUser: null,\n    currentUserId: reads('session.person.guid'),\n\n    init() {\n        this._super(...arguments);\n        this.set('activeConversations', A());\n\n        const owner = getOwner(this);\n        const store = owner.lookup('service:store');\n        const session = owner.lookup('service:session');\n        if (!store || !session) {\n            this.logger.error('Conversation Service: Store and session service are required, but not found');\n            return;\n        }\n\n        this.set('store', store);\n        this.set('session', session);\n\n        // Set up session listener instead of observer\n        if (session.on) {\n            session.on('authenticated', this, this._onSessionAuthenticated);\n        }\n\n        // Check if already authenticated\n        if (session.isAuthenticated) {\n            this._onSessionAuthenticated();\n        }\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n\n        // Clean up session listener\n        const session = this.session;\n        if (session && session.off) {\n            session.off('authenticated', this, this._onSessionAuthenticated);\n        }\n\n        if (this.pigeon.has('my-conversations')) {\n            this.pigeon.off('my-conversations', this, this._handleConversationUpdate);\n        }\n    },\n\n    _onSessionAuthenticated() {\n        if (this.isDestroyed || this.isDestroying) {\n            return;\n        }\n\n        if (!this.isInitialized) {\n            this.initServiceProperties();\n            this._loadConversations();\n        }\n    },\n\n    initServiceProperties() {\n        this.set('activeConversations', A());\n        this.pigeon.on('my-conversations', this, this._handleConversationUpdate);\n    },\n\n    _handleConversationUpdate(update) {\n        const store = this.store;\n        const active = this.activeConversations;\n        this.logger.info('handling conversation update', {\n            conversationId: update.id\n        });\n\n        let conversation = active.findBy('id', update.id);\n\n        if (conversation) {\n            conversation.update(update);\n        } else {\n            const normalized = store.normalize('conversation', update);\n            conversation = store.push(normalized);\n            conversation.set('userId', this.currentUserId);\n            active.pushObject(conversation);\n            this.trigger('conversation', conversation);\n        }\n\n        const activeCommunications = this.getActiveCommunicationsOnConversationForCurrentUser(conversation);\n        const hasActiveScreenRecording = conversation\n            .get('participantsScreenRecording')\n            .findBy('userId', this.currentUserId);\n\n        if ((!activeCommunications || !Object.keys(activeCommunications).length) && !hasActiveScreenRecording) {\n            active.removeObject(conversation);\n            this.store.unloadRecord(conversation);\n        }\n    },\n\n    _loadConversations() {\n        if (this.isInitialized) {\n            return;\n        }\n\n        this.set('isInitialized', true);\n\n        return (\n            this.store\n                .findAll('conversation')\n                // `store.findAll()` resolves directly to an array of model instances in this Ember Data\n                // version — there is no `.content` of internal-model wrappers needing `.getRecord()`.\n                .then(data => data.toArray())\n                .then(conversations => {\n                    this.set('activeConversations', A(conversations));\n                    conversations.forEach(conversation => conversation.set('userId', this.currentUserId));\n                })\n                .catch(err => {\n                    this.logger.error('Conversation Service: Unable to load conversations', {\n                        error: err\n                    });\n                    reject(A());\n                })\n        );\n    },\n\n    getActiveCommunicationsOnConversationForCurrentUser(conversation) {\n        return conversation.get(`activeCommunications.${this.currentUserId}`);\n    },\n\n    getActiveCommunicationsOnConversationForCurrentUserById(conversationId) {\n        const conversation = this.activeConversations.findBy('id', conversationId);\n        return this.getActiveCommunicationsOnConversationForCurrentUser(conversation);\n    },\n\n    conversationsWithActiveScreenRecordingForCurrentUser: computed(\n        'activeConversations.@each.participantsScreenRecording',\n        function () {\n            return this.activeConversations.filter(conversation => {\n                return conversation.get('participantsScreenRecording').findBy('userId', this.currentUserId);\n            });\n        }\n    )\n});\n","import CookiesService from 'ember-cookies/services/cookies';\n\nexport default CookiesService;\n","import Service, { inject } from '@ember/service';\nimport type RouterService from '@ember/routing/router-service';\nimport type { Models } from 'purecloud-platform-client-internal-v2';\nimport { Maybe } from 'web-directory/types';\nimport { CopilotHostSDK } from '@genesys/copilot-host-sdk';\nimport { CommandNavService } from './command-nav';\nimport { HelpService } from '@web-directory/services';\n\nexport interface CopilotBroadcastService {\n    get<K extends keyof CopilotBroadcastService>(name: K | string): CopilotBroadcastService[K];\n    set<K extends keyof CopilotBroadcastService>(\n        name: K | string,\n        value: CopilotBroadcastService[K]\n    ): CopilotBroadcastService[K];\n\n    copilotHostSdk: CopilotHostSDK | null;\n    commandNav: CommandNavService;\n    router: Maybe<RouterService>;\n    help: HelpService;\n}\n\nconst copilotBroadcastService = Service.extend({\n    copilotHostSdk: null as CopilotHostSDK | null,\n    commandNav: inject('command-nav'),\n\n    // Exposed as a property so tests can provide a mock constructor\n    _CopilotHostSDKFactory: CopilotHostSDK as any,\n\n    init(): void {\n        this._super(...arguments);\n\n        const Factory = this._CopilotHostSDKFactory;\n        const copilotHostSdk = new Factory({\n            appId: 'web-directory',\n            onHideCopilot: async () => this.get('commandNav').selectPanel('panel-not-active'),\n            onOpenCopilot: async () => this.get('commandNav').selectPanel('copilot-framework'),\n            onHostRouteRequest: async (): Promise<Models.NavigationContext> => {\n                const route = window.location.hash;\n                const pageTitle = document.title;\n\n                return {\n                    route,\n                    pageTitle\n                };\n            }\n        });\n        this.set('copilotHostSdk', copilotHostSdk);\n    },\n\n    willDestroy(): void {\n        this._destroyCopilotHostSdk();\n        this._super(...arguments);\n    },\n\n    _destroyCopilotHostSdk(): void {\n        try {\n            if (this.copilotHostSdk) {\n                this.copilotHostSdk.destroy();\n                this.copilotHostSdk = null;\n            }\n        } catch (error) {\n            console.error('[CopilotHostSdkService] Error during cleanup:', error);\n            this.copilotHostSdk = null;\n        }\n    }\n});\n\nexport default copilotBroadcastService;\n\ndeclare module '@ember/service' {\n    interface Registry {\n        'copilot-broadcast': CopilotBroadcastService;\n    }\n}\n","import { getOwner } from '@ember/application';\nimport { A } from '@ember/array';\nimport { get } from '@ember/object';\nimport Service, { inject as injectService } from '@ember/service';\nimport { CONTACT_CHANGED_EVENT, CONTACT_MERGED_EVENT } from 'web-directory/services/external-contacts';\nimport safeSet from 'web-directory/utils/safeSet';\n\nconst CUSTOMER_INTENT_CHANGED = 'customer-intent-changed';\nconst TOPIC_PREFIX = 'v2.intents.assignments.externalcontacts.';\n\ntype TrackedIntentData = {\n    externalContactId: string;\n    interactionModels: ReturnType<typeof A>;\n};\n\ntype ExternalContactChangedEventData = {\n    type?: string;\n    contact?: { id?: string };\n    canonicalContact?: { id?: string };\n};\n\n/**\n * Service that manages customer intent for interactions. Fetches customer intent\n * on conversation intake, subscribes to Hawk topic for real-time updates, and\n * applies values to conversation/workitem models. Unsubscribes when conversations\n * are torn down to prevent memory leaks.\n */\nexport default Service.extend({\n    ajax: injectService('ajax'),\n    application: injectService('application'),\n    externalContacts: injectService('external-contacts'),\n    logger: injectService('stash-logger'),\n    permissions: injectService('permissions'),\n    pigeon: injectService('pigeon'),\n\n    _trackedData: A<TrackedIntentData>(),\n\n    init() {\n        this._super(...arguments);\n        this.set('_trackedData', A([]));\n        this.get('pigeon').on(CUSTOMER_INTENT_CHANGED, this, this._handleCustomerIntentChanged);\n        this.get('externalContacts').on(CONTACT_CHANGED_EVENT, this, this._handleExternalContactChanged);\n        this.get('externalContacts').on(CONTACT_MERGED_EVENT, this, this._handleExternalContactChanged);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        this.get('pigeon').off(CUSTOMER_INTENT_CHANGED, this, this._handleCustomerIntentChanged);\n        this.get('externalContacts').off(CONTACT_CHANGED_EVENT, this, this._handleExternalContactChanged);\n        this.get('externalContacts').off(CONTACT_MERGED_EVENT, this, this._handleExternalContactChanged);\n    },\n\n    /**\n     * Gets the external contact ID from a conversation or workitem model.\n     * Mirrors Interaction.externalContactId so enriched Relate data is recognized.\n     */\n    _getExternalContactId(model: any): string | undefined {\n        if (!model) return undefined;\n        return (\n            get(model, 'participantForCustomer.externalContactId') ||\n            get(model, 'participantForCustomer.externalContact.id') ||\n            get(model, 'customer.externalContactId')\n        );\n    },\n\n    /**\n     * Returns the external contact ID we are currently watching for this model (if any).\n     * Used to detect when the interaction's linked contact has changed so we can unwatch the old and watch the new.\n     */\n    _getTrackedExternalContactIdForModel(interactionModel: any): string | undefined {\n        const trackedData = this.get('_trackedData');\n        if (!trackedData || !interactionModel) return;\n\n        const intentData = trackedData.find(data => data.interactionModels.includes(interactionModel));\n        return intentData?.externalContactId;\n    },\n\n    /**\n     * Fetches the customer intent name for an external contact from the API.\n     */\n    async _fetchCustomerIntent(externalContactId: string): Promise<string | null> {\n        try {\n            const url = this.get('application').pcV2Uri(\n                `platform/api/v2/intents/assignments/externalcontacts/${externalContactId}?pageSize=1`\n            );\n            const response = await this.get('ajax').ajaxGet(url);\n            const customerIntent = response?.entities?.[0]?.customerIntent;\n            return customerIntent?.name ?? null;\n        } catch (error) {\n            this.get('logger').error('ACD: Could not load customer intent', {\n                error,\n                externalContactId\n            });\n            return null;\n        }\n    },\n\n    /**\n     * Registers the Hawk topic for an external contact.\n     */\n    _watchCustomerIntent(externalContactId: string) {\n        const topic = `${TOPIC_PREFIX}${externalContactId}`;\n        const pigeon = this.get('pigeon') as any;\n        const priorityTopics: string[] = pigeon?.get?.('priorityTopics') || [];\n        if (!priorityTopics.includes(topic)) {\n            pigeon.registerPriorityTopic(topic, CUSTOMER_INTENT_CHANGED);\n        }\n    },\n\n    /**\n     * Unregisters the Hawk topic for an external contact.\n     */\n    _unwatchCustomerIntent(externalContactId: string) {\n        const topic = `${TOPIC_PREFIX}${externalContactId}`;\n        const pigeon = this.get('pigeon') as any;\n        const priorityTopics: string[] = pigeon?.get?.('priorityTopics') || [];\n        if (priorityTopics.includes(topic)) {\n            pigeon.unRegisterPriorityTopic(topic);\n        }\n    },\n\n    /**\n     * Adds a customer intent listener for an interaction. Fetches the intent once,\n     * applies it to the model, and subscribes to Hawk for updates.\n     *\n     * @param ModelBuilder - Class or factory to create a temp model from payload (for extracting externalContactId)\n     * @param payload - Raw interaction payload\n     * @param interactionModel - The actual interaction model to update with customerIntent\n     */\n    async addCustomerIntentListenerForInteraction(\n        ModelBuilder: any,\n        payload: any,\n        interactionModel: any\n    ): Promise<void> {\n        if (!(this as any).get?.('permissions.canViewCustomerIntents')) return;\n\n        // Ember 3.x: EmberObject.create() no longer supports passing properties alongside owner\n        // injection when computed properties exist in the class hierarchy. Create with owner\n        // injection only, then apply the payload via setProperties().\n        //\n        // `.create` alone isn't a reliable discriminator here — plain object/mock ModelBuilders used\n        // in tests can also define a `.create` method (returning a plain object with no\n        // `setProperties`), which would incorrectly take the Ember-class branch and crash. Only real\n        // Ember classes (via EmberObject/CoreObject) have `.extend`, so use that to detect them.\n        const isEmberClass = typeof ModelBuilder.extend === 'function';\n        let currInteraction: any;\n        if (isEmberClass) {\n            currInteraction = ModelBuilder.create(getOwner(this).ownerInjection());\n            currInteraction.setProperties(payload);\n        } else if (typeof ModelBuilder === 'function') {\n            currInteraction = ModelBuilder(payload);\n        } else {\n            currInteraction = ModelBuilder.create(payload);\n        }\n\n        // Prefer the live interaction model when Relate has enriched the participant\n        // after setExternalContactInfo (common for messaging channels).\n        let externalContactId =\n            this._getExternalContactId(currInteraction) ?? this._getExternalContactId(interactionModel);\n        if (typeof currInteraction.destroy === 'function') {\n            currInteraction.destroy();\n        }\n\n        // If the interaction's linked external contact changed (e.g. unlink or re-link to different contact),\n        // unwatch the contact we're currently tracking so we don't keep showing their intent.\n        const trackedContactId = this._getTrackedExternalContactIdForModel(interactionModel);\n        if (trackedContactId && trackedContactId !== externalContactId) {\n            this.removeCustomerIntentListenerForInteractionByContactId(trackedContactId, interactionModel);\n        }\n\n        if (!externalContactId) {\n            safeSet(interactionModel, 'customerIntent', null);\n            return;\n        }\n\n        const trackedData = this.get('_trackedData');\n        if (!trackedData) return;\n\n        let intentData = trackedData.findBy('externalContactId', externalContactId) as TrackedIntentData | undefined;\n        const isNewSubscription = !intentData;\n        const isNewModel = !intentData || !intentData.interactionModels.includes(interactionModel);\n\n        if (isNewSubscription) {\n            intentData = { externalContactId, interactionModels: A() };\n            trackedData.pushObject(intentData);\n            this._watchCustomerIntent(externalContactId);\n        }\n        if (isNewModel && intentData) {\n            intentData.interactionModels.pushObject(interactionModel);\n        }\n        if (isNewSubscription || isNewModel) {\n            const intentName = await this._fetchCustomerIntent(externalContactId);\n            safeSet(interactionModel, 'customerIntent', intentName);\n        }\n    },\n\n    /**\n     * Adds a customer intent listener for a workitem. Workitems have customer.externalContactId.\n     * Only fetches and subscribes when first adding this workitem to tracking.\n     */\n    async addCustomerIntentListenerForWorkitem(\n        workitemInteraction: any,\n        currentWorkitemInteraction: any\n    ): Promise<void> {\n        if (!(this as any).get?.('permissions.canViewCustomerIntents')) return;\n\n        const externalContactId = workitemInteraction?.customer?.externalContactId;\n\n        // If the workitem's linked external contact changed (e.g. unlink or re-link to different contact),\n        // unwatch the old contact so we don't keep showing the previous contact's intent.\n        const trackedContactId = this._getTrackedExternalContactIdForModel(currentWorkitemInteraction);\n        if (trackedContactId && trackedContactId !== externalContactId) {\n            this.removeCustomerIntentListenerForInteractionByContactId(trackedContactId, currentWorkitemInteraction);\n        }\n\n        if (!externalContactId) {\n            safeSet(currentWorkitemInteraction, 'customerIntent', null);\n            return;\n        }\n\n        const trackedData = this.get('_trackedData');\n        if (!trackedData) return;\n        let intentData = trackedData.findBy('externalContactId', externalContactId) as TrackedIntentData | undefined;\n        const isNewSubscription = !intentData;\n        const isNewModel = !intentData || !intentData.interactionModels.includes(currentWorkitemInteraction);\n\n        if (isNewSubscription || isNewModel) {\n            if (isNewSubscription) {\n                intentData = { externalContactId, interactionModels: A() };\n                trackedData.pushObject(intentData);\n                this._watchCustomerIntent(externalContactId);\n            }\n            if (isNewModel && intentData) {\n                intentData.interactionModels.pushObject(currentWorkitemInteraction);\n            }\n            const intentName = await this._fetchCustomerIntent(externalContactId);\n            safeSet(currentWorkitemInteraction, 'customerIntent', intentName);\n        }\n    },\n\n    /**\n     * Removes the customer intent listener for an interaction (by model).\n     */\n    removeCustomerIntentListenerForInteraction(model: any): void {\n        if (!model) return;\n        const externalContactId = this._getExternalContactId(model);\n        this.removeCustomerIntentListenerForInteractionByContactId(externalContactId, model);\n    },\n\n    /**\n     * Removes the customer intent listener for an external contact and model.\n     */\n    removeCustomerIntentListenerForInteractionByContactId(\n        externalContactId: string | undefined,\n        interactionModel: any\n    ): void {\n        if (!externalContactId) return;\n\n        const trackedData = this.get('_trackedData');\n        if (!trackedData) return;\n        const intentData = trackedData.findBy('externalContactId', externalContactId) as TrackedIntentData | undefined;\n        if (intentData) {\n            intentData.interactionModels.removeObject(interactionModel);\n            if (intentData.interactionModels.length === 0) {\n                trackedData.removeObject(intentData);\n                this._unwatchCustomerIntent(externalContactId);\n            }\n        }\n    },\n\n    /**\n     * Resolves participant external contact IDs affected by a hawk contact change.\n     * Uses external-contacts callback data so canonical contact updates still reach\n     * interactions linked to a descendant contact id.\n     */\n    _getParticipantContactIdsForContactChange(changedContactId: string): string[] {\n        const contactCallbackData: Array<{ contactId?: string; canonicalId?: string }> =\n            (this.get('externalContacts') as any)?.get?.('contactCallbackData') || [];\n        return contactCallbackData.reduce<string[]>((acc, data) => {\n            if (data.contactId === changedContactId || data.canonicalId === changedContactId) {\n                if (data.contactId) {\n                    acc.push(data.contactId);\n                }\n            }\n            return acc;\n        }, []);\n    },\n\n    async _applyCustomerIntentToTrackedModels(externalContactId: string): Promise<void> {\n        const trackedData = this.get('_trackedData');\n        if (!trackedData) return;\n\n        const intentData = trackedData.findBy('externalContactId', externalContactId) as TrackedIntentData | undefined;\n        if (!intentData) return;\n\n        const intentName = await this._fetchCustomerIntent(externalContactId);\n        intentData.interactionModels.forEach((model: any) => {\n            safeSet(model, 'customerIntent', intentName);\n        });\n    },\n\n    async _handleCustomerIntentChanged(eventBody: { id?: string }, topicData?: { topicName?: string }) {\n        let externalContactId = eventBody?.id;\n        if (!externalContactId && topicData?.topicName) {\n            const parts = topicData.topicName.split('.');\n            externalContactId = parts[parts.length - 1];\n        }\n\n        if (!externalContactId) return;\n\n        await this._applyCustomerIntentToTrackedModels(externalContactId);\n    },\n\n    /**\n     * Re-fetches customer intent when an external contact hawk event fires outside\n     * the ACD processing chain (e.g. contact merge or Relate enrichment).\n     */\n    async _handleExternalContactChanged(eventData: ExternalContactChangedEventData): Promise<void> {\n        if (!this.get('permissions').get('canViewCustomerIntents')) return;\n\n        const changedContactId = eventData?.contact?.id;\n        if (!changedContactId) return;\n\n        const participantContactIds = this._getParticipantContactIdsForContactChange(changedContactId);\n        const trackedData = this.get('_trackedData');\n        if (!trackedData || !participantContactIds.length) return;\n\n        const trackedParticipantContactIds = participantContactIds.filter(contactId =>\n            trackedData.findBy('externalContactId', contactId)\n        );\n\n        await Promise.all(\n            trackedParticipantContactIds.map(contactId => this._applyCustomerIntentToTrackedModels(contactId))\n        );\n    }\n});\n","import { later } from '@ember/runloop';\nimport { readOnly } from '@ember/object/computed';\nimport { A } from '@ember/array';\nimport Service, { inject as service } from '@ember/service';\nimport Evented from '@ember/object/evented';\nimport { computed } from '@ember/object';\nimport Ember from 'ember';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nconst notificationTag = 'device-list-updated';\n\nfunction arrayComparerByDeviceId(otherArray) {\n    return current => {\n        const itemInOtherArray =\n            otherArray.filter(other => {\n                return other.deviceId === current.deviceId;\n            }).length === 0;\n\n        return itemInOtherArray;\n    };\n}\n\nfunction diffListsByDeviceId(existingList, newList) {\n    const itemsRemoved = (existingList || []).filter(arrayComparerByDeviceId(newList));\n    const itemsAdded = newList.filter(arrayComparerByDeviceId(existingList || []));\n\n    return { added: itemsAdded, removed: itemsRemoved };\n}\n\nfunction sanitizeDeviceLabel(deviceLabel) {\n    const idRegex = /(.*)\\s?\\(.*/;\n    const defaultTextRegex = /^(.*\\s-\\s)/;\n\n    // Remove the trailing numbers\n    let sanitizedLabel = deviceLabel ? deviceLabel.replace(idRegex, '$1').trim() : '';\n\n    // Remove the 'Default - ' text added by the browser\n    sanitizedLabel = sanitizedLabel ? sanitizedLabel.replace(defaultTextRegex, '').trim() : '';\n\n    return sanitizedLabel;\n}\n\nexport default Service.extend(Evented, LoggerMixin, {\n    session: service(),\n    webrtcSettings: service(),\n    webrtcSdkService: service('webrtcSdk'),\n    intl: service(),\n    phone: service(),\n    chat: service(),\n    settings: service(),\n    feature: service(),\n    ring: service(),\n\n    selectedProfileId: null,\n    vanillaProfiles: [],\n    profiles: [],\n\n    microphone: null,\n    camera: null,\n    outputDevice: null,\n    notificationDevice: null,\n\n    notification: service(),\n    sidebar: service(),\n    commandNav: service('command-nav'),\n    incomingInvitations: A(),\n    headset: service(),\n\n    deviceUpdateDelay: 1500,\n    deviceChanges: null,\n    recentlyConnectedDevices: null,\n    // Returns settings once the webrtc-settings service has initialized and fetched settings.\n    profileSettingsPromise: readOnly('webrtcSettings.userSettingsPromise'),\n\n    async init() {\n        this._super(...arguments);\n        this.webrtcSdkService.on('mediaStateChange', this._handleMediaStateChange.bind(this));\n        this.webrtcSettings.on('sdkSettingsUpdate', async () => {\n            await this._updateVolumes();\n        });\n        await this._fetchProfiles();\n        const currentMediaState = this.get('webrtcSdkService.mediaState');\n        if (currentMediaState) {\n            this._handleMediaStateChange(currentMediaState);\n        }\n    },\n\n    async _fetchProfiles() {\n        this.logger.debug('Fetching device profiles');\n        // profileSettingsPromise (webrtcSettings.userSettingsPromise) can resolve to undefined — e.g. before\n        // settings have loaded, after a failed fetch, or when webrtcSettings is stubbed in tests without a real\n        // userSettingsPromise. Default to {} so we never throw reading .directorySettings off undefined; since\n        // init() (which calls this) is never awaited by Ember, an unguarded throw here becomes an unhandled\n        // rejection that surfaces on whatever unrelated test happens to be running when it settles.\n        const settings = (await this.profileSettingsPromise) || {};\n        const selectedProfile = (settings.directorySettings && settings.directorySettings.selectedProfile) || '';\n        const defaultProfileId = settings.directorySettings && settings.directorySettings.defaultProfileId;\n        const defaultExists =\n            settings.directorySettings &&\n            settings.directorySettings.profiles &&\n            settings.directorySettings.profiles.find(profile => profile.id === defaultProfileId);\n\n        // If a default device profile isn't saved or no longer exists, resort to the last selected profile or computer settings.\n        this.setProperties({\n            selectedProfileId: defaultExists ? defaultProfileId : selectedProfile,\n            vanillaProfiles: (settings.directorySettings && settings.directorySettings.profiles) || []\n        });\n    },\n\n    async _handleMediaStateChange(mediaState) {\n        if (!mediaState.hasMicPermissions) {\n            return;\n        }\n\n        const camerasDiff = diffListsByDeviceId(this.get('mediaState.videoDevices'), mediaState.videoDevices);\n        const microphonesDiff = diffListsByDeviceId(this.get('mediaState.audioDevices'), mediaState.audioDevices);\n        const outputDevicesDiff = diffListsByDeviceId(this.get('mediaState.outputDevices'), mediaState.outputDevices);\n\n        const isInitialUpdate = !this.mediaState;\n\n        const added = {\n            cameras: camerasDiff.added,\n            microphones: microphonesDiff.added,\n            outputDevices: outputDevicesDiff.added,\n            total: camerasDiff.added.length + microphonesDiff.added.length + outputDevicesDiff.added.length\n        };\n        const removed = {\n            cameras: camerasDiff.removed,\n            microphones: microphonesDiff.removed,\n            outputDevices: outputDevicesDiff.removed,\n            total: camerasDiff.removed.length + microphonesDiff.removed.length + outputDevicesDiff.removed.length\n        };\n        this.set('mediaState', mediaState);\n        await this._updateProfileAvailability();\n        await this._maybeFixSelectedProfile();\n\n        if (added.total && !isInitialUpdate) {\n            this._updateRecentlyConnectedDevices(added);\n            await this._conditionallyShowToastForAddedDevices(added);\n        }\n\n        this.trigger('deviceListsUpdated', { added, removed });\n    },\n\n    async _updateProfileAvailability() {\n        const profiles = this.vanillaProfiles.map(profile => {\n            let canBeSelected = true;\n            let matchingCamera = null;\n            let matchingOutputDevice = null;\n            let matchingMicrophone = null;\n            let matchingNotificationDevice = null;\n\n            if (profile.camera) {\n                matchingCamera = this._findMatchingDevice(this.get('mediaState.videoDevices'), profile.camera);\n                const profileCameraIsNotDefault = profile.camera.deviceId !== 'default';\n                if (!matchingCamera && profileCameraIsNotDefault && !profile.validWithoutCamera) {\n                    canBeSelected = false;\n                }\n            }\n            if (profile.microphone) {\n                matchingMicrophone = this._findMatchingDevice(this.get('mediaState.audioDevices'), profile.microphone);\n                if (!matchingMicrophone) {\n                    canBeSelected = false;\n                }\n            }\n            if (profile.outputDevice) {\n                matchingOutputDevice = this._findMatchingDevice(\n                    this.get('mediaState.outputDevices'),\n                    profile.outputDevice\n                );\n                if (!matchingOutputDevice) {\n                    canBeSelected = false;\n                }\n            }\n            if (profile.notificationDevice) {\n                matchingNotificationDevice = this._findMatchingDevice(\n                    this.get('mediaState.outputDevices'),\n                    profile.notificationDevice\n                );\n                if (!matchingNotificationDevice) {\n                    canBeSelected = false;\n                }\n            }\n            return Object.assign({}, profile, {\n                canBeSelected: !!canBeSelected,\n                camera: matchingCamera || profile.camera,\n                microphone: matchingMicrophone || profile.microphone,\n                outputDevice: matchingOutputDevice || profile.outputDevice,\n                notificationDevice: matchingNotificationDevice || profile.outputDevice\n            });\n        });\n\n        this.set('profiles', profiles);\n\n        const settings = await this.profileSettingsPromise;\n        const defaultProfileId = settings.directorySettings.defaultProfileId;\n        if (this.selectableProfiles.findBy('id', defaultProfileId)) {\n            this.setProfile(defaultProfileId);\n        }\n    },\n\n    async _maybeFixSelectedProfile() {\n        // start with default devices\n        let camera = this.mediaState.videoDevices && this.mediaState.videoDevices[0];\n        let mic = this.mediaState.audioDevices && this.mediaState.audioDevices[0];\n        let outputDevice = this.mediaState.outputDevices && this.mediaState.outputDevices[0];\n        let notificationDevice = this.mediaState.outputDevices && this.mediaState.outputDevices[0];\n        const currentProfile = this.profiles.findBy('id', this.selectedProfileId);\n        const hasOutputDeviceSupport = this.mediaState.hasOutputDeviceSupport;\n\n        // check if selectedProfile is valid\n        if (currentProfile) {\n            const profileCamera = this._findMatchingDevice(this.mediaState.videoDevices, currentProfile.camera);\n            const profileMic = this._findMatchingDevice(this.mediaState.audioDevices, currentProfile.microphone);\n            const profileOutputDevice = this._findMatchingDevice(\n                this.mediaState.outputDevices,\n                currentProfile.outputDevice\n            );\n            const profileNotificationDevice = this._findMatchingDevice(\n                this.mediaState.outputDevices,\n                currentProfile.notificationDevice\n            );\n\n            const cameraValid =\n                currentProfile.validWithoutCamera ||\n                profileCamera ||\n                (currentProfile.camera && currentProfile.camera.deviceId === 'default');\n            const outputValid = !hasOutputDeviceSupport || profileOutputDevice;\n            const notificationsValid = !hasOutputDeviceSupport || profileNotificationDevice;\n\n            const profileValid = cameraValid && outputValid && notificationsValid && profileMic;\n\n            if (profileValid) {\n                camera = profileCamera || camera;\n                mic = profileMic;\n                outputDevice = profileOutputDevice || outputDevice;\n                notificationDevice = profileNotificationDevice || notificationDevice;\n            } else {\n                this._showNotificationForCurrentProfileNoLongerValid();\n\n                return await this.setProfile('');\n            }\n        }\n\n        // make sure devices match what is in the profile\n        const cameraMatches = this.camera === camera;\n        const micMatches = this.microphone === mic;\n        const outputDeviceMatches = !hasOutputDeviceSupport || this.outputDevice === outputDevice;\n        const notificationDeviceMatches = !hasOutputDeviceSupport || this.notificationDevice === notificationDevice;\n\n        if (!cameraMatches || !micMatches || !outputDeviceMatches || !notificationDeviceMatches) {\n            const newDevices = {\n                camera,\n                microphone: mic,\n                outputDevice,\n                notificationDevice\n            };\n            this.setProperties(newDevices);\n            await this._updateVolumes();\n\n            this.webrtcSdkService.setDevices(newDevices);\n            this.trigger('profileDevicesChanged', newDevices);\n        }\n    },\n\n    async _updateVolumes() {\n        const outputDeviceVolumes = await this._getVolumesForDevice(this.outputDevice);\n        this.phone.updateVolumes(outputDeviceVolumes);\n\n        this.webrtcSdkService.setCallVolume(outputDeviceVolumes.callVolume);\n\n        const notificationDeviceVolumes = await this._getVolumesForDevice(this.notificationDevice);\n        this.chat.updateVolumes(notificationDeviceVolumes);\n    },\n\n    async _getVolumesForDevice(device) {\n        const defaults = {\n            callVolume: 100,\n            ringerVolume: 100,\n            chatNotificationVolume: 100,\n            interactionNotificationVolume: 100,\n            callActiveRingerVolume: 100\n        };\n\n        if (!device) {\n            return defaults;\n        }\n\n        // It is possible to have saved settings for a device but also for that device to be the default system device with its own default system settings.\n        const sanitizedLabel = device.deviceId === 'default' ? 'default' : sanitizeDeviceLabel(device.label);\n        const settings = await this.profileSettingsPromise;\n        const volumes = settings.volumeSettings ? settings.volumeSettings[sanitizedLabel] : undefined;\n        return volumes || defaults;\n    },\n\n    _getActionHandler(label, { profileToSet, createProfile, showOptions } = {}) {\n        return {\n            label,\n            action: notification => {\n                if (profileToSet) {\n                    this.setProfile(profileToSet.id);\n                } else if (createProfile || showOptions) {\n                    this._openPhoneSettingsTab();\n                }\n\n                if (createProfile) {\n                    later(() => this.trigger('showProfileSelection'));\n                }\n\n                notification.hide();\n            }\n        };\n    },\n\n    _openPhoneSettingsTab() {\n        if (this.get('session.useNewNav')) {\n            this.set('commandNav.callControlsTab', 'phoneSettings');\n            this.commandNav.selectPanel('voice');\n        } else {\n            const sidebar = this.sidebar;\n            sidebar.openPanel('callControls');\n            sidebar.togglePanelSubstate('callControls', 'currentTab', 'phoneSettings');\n        }\n    },\n\n    _findMatchingDevice(deviceList, device) {\n        const foundDevice = deviceList.find(deviceA => this._deviceMatches(deviceA, device));\n\n        return foundDevice;\n    },\n\n    _deviceMatches(deviceA, deviceB) {\n        if (!deviceA || !deviceB) {\n            return false;\n        }\n\n        const hasSameId = deviceA.deviceId === deviceB.deviceId;\n\n        const formattedNameA = deviceA.label\n            ? deviceA.label.replace(/\\s+\\((default|[0-9a-f]{4}:[0-9a-f]{4}|Built-in|Internal|External)\\)$/i, '').trim()\n            : '';\n        const formattedNameB = deviceB.label\n            ? deviceB.label.replace(/\\s+\\((default|[0-9a-f]{4}:[0-9a-f]{4}|Built-in|Internal|External)\\)$/i, '').trim()\n            : '';\n        const hasSameName = formattedNameA === formattedNameB;\n\n        return hasSameId || hasSameName;\n    },\n\n    async _conditionallyShowToastForAddedDevices(addedDevices) {\n        const settings = await this.profileSettingsPromise;\n        if (settings.directorySettings.disableProfileNotifications) {\n            return;\n        }\n        /*\n          DESIRED BEHAVIOR\n          When a new device is connected:\n            if (theres a profile that contains newly connected device)\n              show toast asking if you'd like to switch to profile containing new device\n            else\n              ask if you'd like to create a new profile with this device\n        */\n        const filteredSelectableProfiles = [];\n\n        // find selectable profiles that contain the new device(s)\n        this.selectableProfiles.forEach(profile => {\n            if (addedDevices.cameras.length && this._deviceMatches(profile.camera, addedDevices.cameras[0])) {\n                filteredSelectableProfiles.push(profile);\n            } else if (\n                addedDevices.microphones.length &&\n                this._deviceMatches(profile.microphone, addedDevices.microphones[0])\n            ) {\n                filteredSelectableProfiles.push(profile);\n            } else if (\n                addedDevices.outputDevices.length &&\n                this._deviceMatches(profile.outputDevice, addedDevices.outputDevices[0])\n            ) {\n                filteredSelectableProfiles.push(profile);\n            } else if (\n                addedDevices.outputDevices.length &&\n                this._deviceMatches(profile.notificationDevice, addedDevices.outputDevices[0])\n            ) {\n                filteredSelectableProfiles.push(profile);\n            }\n        });\n\n        const intl = this.intl;\n\n        // devices added and profiles are available\n        if (filteredSelectableProfiles.length) {\n            const title = intl.t('deviceProfiles.notifications.hardwareChangeTitle');\n            let message;\n            let actionHandlers = {};\n\n            if (filteredSelectableProfiles.length > 1) {\n                message = intl.t('deviceProfiles.notifications.newDevicesMatchMultipleProfiles');\n            } else {\n                message = intl.t('deviceProfiles.notifications.profilesAvailable');\n            }\n\n            if (filteredSelectableProfiles.length > 2) {\n                actionHandlers.other = this._getActionHandler(intl.t('deviceProfiles.notifications.otherLabel'), {\n                    showOptions: true\n                });\n            }\n\n            actionHandlers = filteredSelectableProfiles\n                .slice(0, 2)\n                .map(item => {\n                    return this._getActionHandler(Ember.Handlebars.Utils.escapeExpression(item.name), {\n                        profileToSet: item\n                    });\n                })\n                .reduce((acc, cur, i) => {\n                    acc[i] = cur;\n                    return acc;\n                }, actionHandlers);\n\n            this.notification.info(title, message, {\n                target: this,\n                tag: notificationTag,\n                actionHandlers\n            });\n        } else {\n            this.notification.info(\n                intl.t('deviceProfiles.notifications.hardwareChangeTitle'),\n                intl.t('deviceProfiles.notifications.promptAddProfileForNewDevice'),\n                {\n                    target: this,\n                    tag: notificationTag,\n                    actionHandlers: {\n                        yes: {\n                            label: intl.t('deviceProfiles.notifications.yesButton'),\n                            action: async notification => {\n                                notification.hide();\n                                await this.settings.openPreference('sound');\n                                this.trigger('showProfileSelection');\n                            }\n                        },\n                        no: {\n                            label: intl.t('deviceProfiles.notifications.noButton'),\n                            action: notification => {\n                                notification.hide();\n                            }\n                        }\n                    }\n                }\n            );\n        }\n    },\n\n    async _showNotificationForCurrentProfileNoLongerValid(hasNonDefaultDevices) {\n        const settings = await this.profileSettingsPromise;\n        if (settings.directorySettings.disableProfileNotifications) {\n            return;\n        }\n\n        const intl = this.intl;\n        const selectableProfiles = this.selectableProfiles;\n\n        // has profiles to choose from\n        if (selectableProfiles.length) {\n            let actionHandlers = {};\n\n            // option to go to the settings if there are too many possibilities\n            if (selectableProfiles.length > 2) {\n                actionHandlers.other = this._getActionHandler(intl.t('deviceProfiles.notifications.otherLabel'), {\n                    showOptions: true\n                });\n            }\n\n            if (selectableProfiles.length >= 2) {\n                actionHandlers = selectableProfiles\n                    .slice(0, 2)\n                    .map(item => {\n                        return this._getActionHandler(Ember.Handlebars.Utils.escapeExpression(item.name), {\n                            profileToSet: item\n                        });\n                    })\n                    .reduce((acc, cur, i) => {\n                        acc[i] = cur;\n                        return acc;\n                    }, actionHandlers);\n            }\n\n            let message = !this.selectedProfileId\n                ? intl.t('deviceProfiles.notifications.usingDefaultTextWithOptions')\n                : intl.t('deviceProfiles.notifications.switchDefaultTextWithOptions');\n\n            if (selectableProfiles.length === 1) {\n                message = intl.t('deviceProfiles.notifications.profileAvailable', { name: selectableProfiles[0].name });\n                if (this.selectedProfileId) {\n                    message = intl.t('deviceProfiles.notifications.switchDefaultProfileAvailable', {\n                        name: selectableProfiles[0].name\n                    });\n                }\n\n                actionHandlers = {\n                    yes: this._getActionHandler(intl.t('deviceProfiles.notifications.yesButton'), {\n                        profileToSet: selectableProfiles[0]\n                    }),\n                    no: this._getActionHandler(intl.t('deviceProfiles.notifications.noButton'))\n                };\n            }\n\n            this.notification.info(intl.t('deviceProfiles.notifications.hardwareChangeTitle'), message, {\n                target: this,\n                tag: notificationTag,\n                actionHandlers\n            });\n            return;\n        }\n\n        // does not have profiles to choose from but has non default devices\n        if (hasNonDefaultDevices) {\n            this.notification.info(\n                intl.t('deviceProfiles.notifications.hardwareChangeTitle'),\n                intl.t('deviceProfiles.notifications.switchDefaultTextPromptCreateProfile'),\n                {\n                    target: this,\n                    tag: notificationTag,\n                    actionHandlers: {\n                        yes: this._getActionHandler(intl.t('deviceProfiles.notifications.yesButton'), {\n                            createProfile: true\n                        }),\n                        no: this._getActionHandler(intl.t('deviceProfiles.notifications.noButton'))\n                    }\n                }\n            );\n\n            return;\n        }\n\n        // no profiles and no devices that aren't default\n        this.notification.info(\n            intl.t('deviceProfiles.notifications.hardwareChangeTitle'),\n            intl.t('deviceProfiles.notifications.switchDefaultText'),\n            {\n                target: this,\n                tag: notificationTag\n            }\n        );\n    },\n\n    _updateRecentlyConnectedDevices(addedDevices) {\n        const deviceConfig = {};\n\n        if (addedDevices.cameras && addedDevices.cameras.length) {\n            deviceConfig.camera = addedDevices.cameras[0];\n        }\n        if (addedDevices.microphones && addedDevices.microphones.length) {\n            deviceConfig.microphone = addedDevices.microphones[0];\n        }\n        if (addedDevices.outputDevices && addedDevices.outputDevices.length) {\n            deviceConfig.outputDevice = addedDevices.outputDevices[0];\n        }\n\n        this.set('recentlyConnectedDevices', deviceConfig);\n    },\n\n    // Select an already created profile.\n    async setProfile(profileId, skipProfileSave) {\n        this.set('recentlyConnectedDevices', null);\n        if (!skipProfileSave) {\n            this.webrtcSettings.updateSetting('directorySettings.selectedProfile', profileId);\n        }\n\n        this.set('selectedProfileId', profileId);\n        await this._maybeFixSelectedProfile();\n        await this._updateVolumes();\n    },\n\n    selectableProfiles: computed('profiles', function () {\n        return A(this.profiles.filter(p => p.canBeSelected));\n    }),\n\n    async deleteProfile(profileId) {\n        const profiles = [].concat(this.vanillaProfiles);\n        const profileObj = profiles.find(p => p.id === profileId);\n        const index = profiles.indexOf(profileObj);\n        profiles.splice(index, 1);\n        this.set('vanillaProfiles', profiles);\n\n        if (this.selectedProfileId === profileId) {\n            await this.setProfile('');\n        }\n\n        // Remove profile from stored profiles.\n        const settingsService = this.webrtcSettings;\n        await settingsService.updateSetting('directorySettings.profiles', profiles);\n        await this._updateProfileAvailability();\n    },\n\n    // Profile creation.\n    async saveAndSelectProfile(profile) {\n        try {\n            const vanillaProfiles = [].concat(this.vanillaProfiles);\n            let savedProfile = vanillaProfiles.find(p => p.id === profile.id);\n\n            if (!savedProfile) {\n                vanillaProfiles.push(profile);\n            } else {\n                const index = vanillaProfiles.indexOf(savedProfile);\n                vanillaProfiles.splice(index, 1, profile);\n            }\n\n            this.set('vanillaProfiles', vanillaProfiles);\n\n            const settings = await this.profileSettingsPromise;\n            settings.directorySettings.selectedProfile = profile.id;\n            settings.directorySettings.profiles = this.vanillaProfiles;\n\n            await this.webrtcSettings.updateSettings(settings);\n            await this._updateProfileAvailability();\n            // Set the profile but skip the save because it's already been updated as the selected.\n            await this.setProfile(profile.id, true);\n        } catch (error) {\n            this.logger.error('Failed to save and select device profile', error);\n        }\n    },\n\n    clearRecentlyConnectedDevices() {\n        this.set('recentlyConnectedDevices', null);\n    }\n});\n","import { readOnly } from '@ember/object/computed';\nimport Service, { inject } from '@ember/service';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport { get } from '@ember/object';\n\n/**\n * @name BACKUP_TYPES table of direct routing backup types\n * @readonly\n */\nexport const BACKUP_TYPES = {\n    queue: 'QUEUE',\n    user: 'USER'\n};\n\n/**\n * @name API_URI table of API URIs\n * @readonly\n */\nconst API_URI = { base: 'api/v2' };\nAPI_URI.directRoutingSettings = `${API_URI.base}/routing/directroutingbackup/settings`;\nAPI_URI.ownDirectRoutingSettings = `${API_URI.directRoutingSettings}/me`;\nAPI_URI.queues = `${API_URI.base}/routing/queues`;\nAPI_URI.ownQueues = `${API_URI.queues}/me`;\nAPI_URI.queue = queueId => `${API_URI.queues}/${queueId}`;\nAPI_URI.membersOfQueue = queueId => `${API_URI.queue(queueId)}/members`;\n\nexport default Service.extend(LoggerMixin, {\n    app: inject('application'),\n    ajax: inject('ajax'),\n    session: inject('session'),\n    permissions: inject('permissions'),\n    users: inject('batch-data-requests'),\n    store: inject(),\n    search: inject(),\n\n    canViewOwnSettings: readOnly('permissions.canViewOwnDirectRoutingSettings'),\n    canEditOwnSettings: readOnly('permissions.canEditOwnDirectRoutingSettings'),\n    canDeleteOwnSettings: readOnly('permissions.canDeleteOwnDirectRoutingSettings'),\n\n    _ownSettings: null,\n    ownSettings: readOnly('_ownSettings'),\n\n    _setOwnSettings(data) {\n        return this.set('_ownSettings', data);\n    },\n\n    _clearOwnSettings() {\n        return this._setOwnSettings(null);\n    },\n\n    _noopOwnSettings() {\n        return this._ownSettings;\n    },\n\n    /**\n     * Get this user's direct routing settings thru the API.\n     * On success, store the result in `this._ownSettings`.\n     * Requires `this.canViewOwnSettings` to be true.\n     * @method getOwnSettings\n     * @returns {Promise<DirectRoutingSettings>} This user's direct routing settings.\n     */\n    async getOwnSettings() {\n        if (!this.canViewOwnSettings) {\n            return this._clearOwnSettings();\n        }\n\n        let rawSettings;\n\n        try {\n            const uri = this.app.pcV2Uri(API_URI.ownDirectRoutingSettings);\n            const options = {};\n            rawSettings = await this.ajax.ajaxGet(uri, options);\n            if (!rawSettings) {\n                this.logger.info('service/direct-routing: user does not have direct routing settings');\n                rawSettings = {};\n            }\n            // Process entity (person or queue) in the response.\n            const ownSettings = await this.getEntityForOwnSettings(rawSettings);\n            // fetch the backed up users\n            ownSettings.backedUpUsers = await this.getBackedUpUsers(get(ownSettings, 'backedUpUsers'));\n            // get the primary backup\n            ownSettings.primaryBackup = this._getPrimaryBackup(ownSettings);\n            // Set _setOwnSettings again to ownSettings\n            this._setOwnSettings(ownSettings);\n            return this._ownSettings;\n        } catch (error) {\n            this._clearOwnSettings();\n            this.logger.error('service/direct-routing: getOwnSettings API failed, error: ', { error });\n            throw error;\n        }\n    },\n\n    /**\n     * Delete the user's Direct Routing Backup settings\n     * @method deleteAllSettings\n     */\n    async deleteOwnSettings() {\n        try {\n            const uri = this.app.pcV2Uri(API_URI.ownDirectRoutingSettings);\n            await this.ajax.delete(uri, { dataType: 'text' });\n            this._setOwnSettings({\n                userId: null,\n                queueId: null,\n                agentWaitSeconds: null,\n                waitForAgent: false,\n                backedUpUsers: [],\n                primaryBackup: {\n                    id: null,\n                    type: null\n                }\n            });\n            return this._ownSettings;\n        } catch (error) {\n            this.logger.error('service/direct-routing: deleteOwnSettings API failed, error: ', { error });\n            throw error;\n        }\n    },\n\n    /**\n     * Returns the primaryBackup if a userId exists within ownSettings\n     * @method _getPrimaryBackup\n     * @returns The primary backup\n     */\n    _getPrimaryBackup(ownSettings) {\n        return !!ownSettings.userId\n            ? { type: BACKUP_TYPES.user, id: ownSettings.userId }\n            : { type: BACKUP_TYPES.queue, id: ownSettings.queueId };\n    },\n\n    /**\n     * Fetches the user entities based on user ids\n     * @param {Array<string>} userIds\n     * @returns\n     */\n    async getBackedUpUsers(userIds) {\n        if (userIds && userIds.length === 0) {\n            // just return the empty array\n            return userIds;\n        }\n        try {\n            const users = await this.store.findMany('person', userIds);\n            return users;\n        } catch (error) {\n            this.logger.error('service/direct-routing: getBackedUpUsers API failed, error: ', { error });\n            throw error;\n        }\n    },\n\n    /**\n     * Get the entity for this user's direct routing settings thru the API.\n     * Requires `this.canViewOwnSettings` to be true.\n     * @method getEntityForOwnSettings\n     * @returns {Promise<DirectRoutingSettings>} This user's direct routing settings with the entity data.\n     */\n    async getEntityForOwnSettings(ownSettings) {\n        if (!this.canViewOwnSettings) {\n            return this._clearOwnSettings();\n        }\n        if (ownSettings.userId) {\n            ownSettings.user = await this.getUserBackupEntity(ownSettings.userId);\n        }\n        if (ownSettings.queueId) {\n            ownSettings.queue = await this.getQueueBackupEntity(ownSettings.queueId);\n        }\n        return ownSettings;\n    },\n\n    async getQueueBackupEntity(queueId) {\n        try {\n            const uri = this.app.pcV2Uri(API_URI.queue(queueId));\n            const options = {};\n            return this.ajax.ajaxGet(uri, options);\n        } catch (error) {\n            this.logger.error('service/direct-routing: getQueueBackupEntity method failed, error: ', error);\n            throw error;\n        }\n    },\n    async getUserBackupEntity(userId) {\n        try {\n            return this.users.getUser(userId);\n        } catch (error) {\n            this.logger.error('service/direct-routing: getUserBackupEntity method failed, error: ', error);\n            throw error;\n        }\n    },\n\n    /**\n     * Update this user's direct routing settings thru the API.\n     * On success, call `this.getOwnSettings()`, which will update `this._ownSettings`.\n     * Requires `this.canEditOwnSettings` to be true.\n     * @method updateOwnSettings\n     * @param {DirectRoutingSettings} desiredOwnSettings - This user's desired direct routing settings.\n     * @returns {Promise<DirectRoutingSettings>} This user's (possibly updated) direct routing settings.\n     */\n    async updateOwnSettings(desiredOwnSettings) {\n        if (!this.canEditOwnSettings) {\n            return this._clearOwnSettings();\n        }\n\n        desiredOwnSettings = JSON.parse(JSON.stringify(desiredOwnSettings));\n\n        if (Boolean(desiredOwnSettings)) {\n            try {\n                const uri = this.app.pcV2Uri(API_URI.ownDirectRoutingSettings);\n                const options = { data: desiredOwnSettings };\n                await this.ajax.put(uri, options);\n            } catch (error) {\n                this.logger.error('service/direct-routing: updateOwnSettings method failed, error:', {\n                    error\n                });\n                throw error;\n            }\n        } else {\n            this.logger.info(\n                'service/direct-routing: updateOwnSettings skipped update, reason: There are no valid keys in `desiredOwnSettings`'\n            );\n        }\n\n        return this.getOwnSettings();\n    },\n\n    async _getDirectRoutingUsers(value, ids = []) {\n        let storeIds = [...ids];\n\n        const data = {\n            pageNumber: 1,\n            pageSize: 25,\n            query: [\n                {\n                    type: 'QUERY_STRING',\n                    value: value\n                }\n            ],\n            sortBy: 'name',\n            sortOrder: 'ASC',\n            types: ['users'],\n            returnFields: ['id', 'name']\n        };\n\n        return await this.search.suggest(data).then(({ results }) => {\n            if (!results) return undefined;\n            const resultIds = results.map(result => result.guid);\n\n            storeIds = [...ids, ...resultIds].filter((value, index, self) => {\n                return self.indexOf(value) == index && value !== this.get('session.person.id');\n            });\n\n            return this.store.findMany('person', storeIds);\n        });\n    },\n\n    /**\n     * Get all of this org's queues.\n     * @method getQueues\n     * @returns {Promise<Queue[]>} This org's queues.\n     */\n    async _getQueues(searchDetail) {\n        try {\n            const uri = this.app.pcV2Uri(API_URI.queues);\n            const options = {\n                data: Object.assign({ name: `**${searchDetail}**`, sortOrder: 'ASC' }, { pageSize: 100, pageNumber: 1 })\n            };\n            const response = await this.ajax.ajaxGet(uri, options);\n            return [...response.entities];\n        } catch (error) {\n            this.logger.error('service/direct-routing: getQueues failed, error: ', { error });\n            throw error;\n        }\n    },\n\n    /**\n     * Get this user's queues.\n     * @method getOwnQueues\n     * @returns {Promise<Queue[]>} This user's queues.\n     */\n    async getOwnQueues() {\n        let ownQueues;\n\n        try {\n            const uri = this.app.pcV2Uri(API_URI.ownQueues);\n            ownQueues = await this.fetchDataWithRecursion(uri, []);\n            return ownQueues;\n        } catch (error) {\n            this.logger.error('service/direct-routing: getOwnQueues failed, error: ', { error });\n            throw error;\n        }\n    },\n\n    async getDirectRoutingEntities(searchDetail, ids = [], backupType) {\n        if (backupType === 'users') {\n            return this._getDirectRoutingUsers(searchDetail, ids);\n        } else {\n            return this._getQueues(searchDetail);\n        }\n    }\n});\n","import Service, { inject as service } from '@ember/service';\nimport request from 'ember-ajax';\n\nconst SEARCH_BODY = {\n        pageNumber: 1,\n        pageSize: 1,\n        facetNameRequests: [],\n        sort: [],\n        filters: []\n    },\n    FACETED_SEARCH_PATH = 'api/v2/contentmanagement/query',\n    DOCUMENT_SHARE_PATH = 'api/v2/contentmanagement/shares',\n    DOCUMENT_PATH = 'api/v2/contentmanagement/documents',\n    CONTENT_TYPE = 'application/json; charset=UTF-8';\n\n/**\n * Service to access the content management documents search.\n */\nexport default Service.extend({\n    application: service('application'),\n    session: service('session'),\n\n    /**\n     * Used to hold onto the current document route segment when leaving the documents subsection.  When entering the document\n     * subsection this is set to null.\n     */\n    lastSegment: null,\n\n    /**\n     * Document routes set the current segment when entering the route. This is transfered to the lastSegment when the user leaves\n     * the documents component\n     */\n    currentSegment: null,\n\n    hasDocuments: false,\n    checkedHasDocuments: false,\n\n    /**\n     * General purpose faceted search method that returns a promise with the search results\n     * @param searchBody\n     * @returns {*}\n     */\n    facetedSearch(searchBody) {\n        const url = this.application.pcUri([FACETED_SEARCH_PATH]);\n        return request(url, {\n            type: 'post',\n            contentType: CONTENT_TYPE,\n            data: JSON.stringify(searchBody)\n        });\n    },\n\n    /**\n     * Sharing document with other User\n     * @param data\n     * @returns {*}\n     */\n    shareDocument(data) {\n        return request(this.application.pcUri([DOCUMENT_SHARE_PATH]), {\n            type: 'post',\n            contentType: CONTENT_TYPE,\n            data: JSON.stringify(data)\n        });\n    },\n\n    /**\n     * Get shared document details\n     * @param data\n     * @returns {*}\n     */\n    getSharedDocumentDetails(data) {\n        return request(this.application.pcUri([DOCUMENT_SHARE_PATH]), {\n            contentType: CONTENT_TYPE,\n            data: data\n        });\n    },\n\n    /**\n     * Get document details\n     * @param document-id\n     * @returns {*}\n     */\n    getDocumentDetails(documentId) {\n        return request(this.application.pcUri([`${DOCUMENT_PATH}/${documentId}`]), {\n            contentType: CONTENT_TYPE\n        });\n    },\n\n    /**\n     * Delete document shares\n     * @param document-id, entity\n     * @returns {*}\n     */\n    deleteDocumentShares(documentId, entity) {\n        return request(this.application.pcUri([`${DOCUMENT_SHARE_PATH}/${documentId}.${entity}`]), {\n            contentType: CONTENT_TYPE,\n            type: 'DELETE'\n        });\n    },\n\n    /**\n     * Checks to see if there are any documents in the documents service.\n     * @returns {*}\n     */\n    checkHasDocuments() {\n        if (!this.checkedHasDocuments) {\n            this.facetedSearch(SEARCH_BODY).then(\n                function (data) {\n                    this.set('checkedHasDocuments', true);\n                    this.set('hasDocuments', data.results.total > 0);\n                }.bind(this)\n            );\n        }\n    }\n});\n","import { reads } from '@ember/object/computed';\nimport { later } from '@ember/runloop';\nimport { reject, resolve } from 'rsvp';\nimport Service, { inject as service } from '@ember/service';\nimport { computed } from '@ember/object';\nimport moment from '../utils/dates';\nimport EmergencyLocationUtil from '../utils/emergency-location-util';\nimport { isTesting } from 'web-directory/utils/testing';\n\nconst POLL_INTERVAL = 1200000; //20min\n\nexport default Service.extend({\n    session: service(),\n    ajax: service(),\n    application: service(),\n    intl: service(),\n    logger: service('stash-logger'),\n    addressformat: service(),\n\n    eLocation: null,\n    isAuthenticated: reads('session.isAuthenticated'),\n    isEligibleForE911: false,\n    eLocationInlineWarning: null,\n    primaryVoice: null,\n\n    emergencyLocationData: computed(\n        'eLocation',\n        'isEligibleForE911',\n        'eLocationInlineWarning',\n        'primaryVoice',\n        function () {\n            return {\n                eLocation: this.eLocation,\n                eLocationInlineWarning: this.eLocationInlineWarning,\n                primaryVoice: this.primaryVoice,\n                isEligibleForE911: this.isEligibleForE911\n            };\n        }\n    ),\n\n    /**\n     * Gets emergency location\n     * @param  {string} phoneNumber the e164 formatted phone number paired with the emergency location being retrieved\n     * @return {promise} promise wraps object containing address location\n     */\n    getEmergencyLocation(phoneNumber) {\n        phoneNumber = !!phoneNumber ? phoneNumber : this.get('primaryVoice.number');\n        phoneNumber = this.addressformat.formatAddress(phoneNumber);\n\n        let url = this.application.pcV2Uri(`api/v2/carrierservices/integrations/emergencylocations/me`);\n        let options = {\n            data: {\n                phoneNumber\n            }\n        };\n        return this.ajax.request(url, options);\n    },\n\n    /**\n     * Fetches and loads primary contact information for user and sets primary number in service\n     * @param  {string} userId Optional userId for whom the primary contact information is fetched.\n     * @return {promise} returns promise containing number and also sets primaryVoice in this service\n     * @return {promise rejected} returns error message to display in notification\n     */\n    loadUserPrimaryNumber(userId) {\n        let url = this.application.pcV2Uri(`api/v2/users/me`);\n        if (userId) {\n            url = this.application.pcV2Uri(`api/v2/users/${userId}`);\n        }\n        return this.ajax\n            .request(url)\n            .then(data => {\n                let number = null;\n                if (data && data.primaryContactInfo) {\n                    const primaryPhoneObject = data.primaryContactInfo.findBy('mediaType', 'PHONE');\n\n                    if (primaryPhoneObject && (primaryPhoneObject.address || primaryPhoneObject.display)) {\n                        number = this.addressformat.formatAddress(\n                            primaryPhoneObject.address || primaryPhoneObject.display\n                        );\n                        this.set('primaryVoice', {\n                            number,\n                            display: this.addressformat.formatAddressForDisplay(number)\n                        });\n                        return number;\n                    }\n                }\n                this.set('primaryVoice', {\n                    number,\n                    display: ''\n                });\n                this.set(\n                    'eLocationInlineWarning',\n                    this.intl.safestring('emergencyLocation.errors.primaryNumberNotFound')\n                );\n                return reject({\n                    err: 'No primary number found',\n                    softError: this.intl.safestring('emergencyLocation.errors.primaryNumberNotFound')\n                });\n            })\n            .catch(err => {\n                if (err.softError) {\n                    return reject(err);\n                }\n                this.set(\n                    'eLocationInlineWarning',\n                    this.intl.safestring('emergencyLocation.errors.primaryNumberLookup')\n                );\n                return reject({\n                    err,\n                    hardError: this.intl.safestring('emergencyLocation.errors.primaryNumberLookup')\n                });\n            });\n    },\n\n    /**\n     * Fetches e911 eligibility status for a given phone number and sets isEligibleForE911 service property\n     * @param  {string} phoneNumber e164 formatted phone number that is checked for e911 eligibility\n     * @return {promise resolved} returns promise containing eligibility status\n     * @return {promise rejected} returns error message to display in notification\n     */\n    loadELocationEligibility(phoneNumber) {\n        let url = this.application.pcV2Uri('api/v2/carrierservices/integrations/emergencylocations/verifyphonenumber');\n        let options = {\n            data: {\n                phoneNumber\n            }\n        };\n        return this.ajax\n            .post(url, options)\n            .then(data => {\n                if (data && data.supported) {\n                    this.set('isEligibleForE911', true);\n                    return data;\n                }\n                this.set('isEligibleForE911', false);\n                return resolve({\n                    supported: false\n                });\n            })\n            .catch(err => {\n                this.set('isEligibleForE911', false);\n                return reject({\n                    err,\n                    softError: this.intl.safestring('emergencyLocation.errors.e911IsSupported')\n                });\n            });\n    },\n\n    /**\n     *  Resets the eLocation property to an emty address.\n     */\n    clearElocation() {\n        const emptyAddress = {\n            id: '',\n            address: {\n                street1: '',\n                street2: '',\n                city: '',\n                state: '',\n                zipcode: '',\n                country: ''\n            },\n            did: '',\n            source: ''\n        };\n\n        this.set('eLocation', emptyAddress);\n    },\n\n    /**\n     * Refreshes the eLocation property containing the emergency location\n     * @param  {string} phoneNumber the e164 formatted phone number paired with the emergency location being retrieved\n     * @return {promise resolved} returns promise containing emergency address\n     * @return {promise rejected} returns error message to display in notification\n     */\n    refreshEmergencyLocation(phoneNumber) {\n        return this.getEmergencyLocation(phoneNumber)\n            .then(result => {\n                this.set('isEligibleForE911', true);\n                this.set('eLocation', result);\n            })\n            .catch(err => {\n                this.set('isEligibleForE911', false);\n                this.clearElocation();\n                const defaultMessage = this.intl.t('emergencyLocation.errors.e911LocationLookup', {\n                    number: this.get('primaryVoice.display')\n                });\n\n                const errorMessage = this.intl.safestring(EmergencyLocationUtil.getErrorString(err, defaultMessage));\n                return reject({\n                    err,\n                    softError: errorMessage\n                });\n            });\n    },\n\n    /**\n     * Refreshes all emergency contact information properties:\n     *     1 - eLocation\n     *     2 - primaryVoice\n     *     3 - isEligibleForE911\n     * @return {promise} returns promise\n     */\n    refreshAllEmergencylocationInfo() {\n        this.set('eLocationInlineWarning', null);\n        if (this.isDestroyed || this.isDestroying) {\n            return resolve();\n        }\n        if (!this.isAuthenticated) {\n            return resolve();\n        }\n        return this.loadUserPrimaryNumber()\n            .then(number => {\n                if (number) {\n                    return this.refreshEmergencyLocation(number);\n                }\n                this.clearElocation();\n                throw {\n                    err: 'Number not supported.',\n                    softError: this.intl.safestring('emergencyLocation.errors.e911NotEligible')\n                };\n            })\n            .catch(errObject => {\n                const messageBody = errObject.softError;\n                if (messageBody && !this.eLocationInlineWarning) {\n                    this.set('eLocationInlineWarning', messageBody);\n                }\n\n                return reject(errObject);\n            });\n    },\n\n    /**\n     * Begins polling to refresh all eLocation data\n     */\n    startPolling() {\n        if (isTesting) return;\n\n        const service = this;\n        const pollingIntervalInMinutes = moment.duration(POLL_INTERVAL).minutes();\n        let pollCounter = 0;\n        const pollingIntervalId = setInterval(() => {\n            this.logger.info(\n                `E911UI: Polling count: ${pollCounter++} - Polling time: ${moment().format()} - Polling every ${pollingIntervalInMinutes}min.`\n            );\n            service._refreshAllEmergencylocationInfo();\n        }, POLL_INTERVAL);\n        this.set('pollingIntervalId', pollingIntervalId);\n    },\n\n    init() {\n        this._super(...arguments);\n        if (this.get('session.features.emergencyLocation')) {\n            this.refreshAllEmergencylocationInfo().catch(() => {});\n            this.startPolling();\n        }\n    },\n\n    /**\n     * Wrapper function to put in runloop\n     */\n    _refreshAllEmergencylocationInfo() {\n        later(() => {\n            this.refreshAllEmergencylocationInfo().catch(() => {});\n        }, 100);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        clearInterval(this.pollingIntervalId);\n    },\n\n    /**\n     * Sets eLocation on backend\n     * @param  {object} newAddress object\n     * @param  {string} number number to pair with newAddress\n     * @return {promise} returns promise\n     */\n    setElocation(newAddress, number) {\n        let url = this.application.pcV2Uri(`api/v2/carrierservices/integrations/emergencylocations/me`);\n        let options = {\n            data: {\n                did: number,\n                address: newAddress,\n                source: 'User'\n            }\n        };\n        return this.ajax.post(url, options).catch(err => {\n            let errorMessage = this.intl.safestring(EmergencyLocationUtil.getErrorString(err));\n            return reject({\n                err,\n                hardError: errorMessage\n            });\n        });\n    },\n\n    /**\n     * Saves eLocation property on this service\n     * @param  {object} newAddress object\n     * @param  {string} number number to pair with newAddress\n     * @return {promise} returns promise\n     */\n    saveElocation(newAddress) {\n        if (!this.get('session.features.emergencyLocation')) {\n            return;\n        }\n        this.set('eLocationInlineWarning', null);\n        return this.loadUserPrimaryNumber()\n            .then(number => {\n                return this.setElocation(newAddress, number);\n            })\n            .then(() => {\n                return this.refreshAllEmergencylocationInfo();\n            });\n    },\n\n    handleEmergencyAddrUpdated() {\n        if (!this.get('session.features.emergencyLocation')) {\n            return resolve();\n        }\n        this.set('eLocationInlineWarning', null);\n        return this.loadUserPrimaryNumber().then(() => {\n            return this.refreshAllEmergencylocationInfo();\n        });\n    }\n});\n","import { getOwner } from '@ember/application';\nimport { reads } from '@ember/object/computed';\nimport { computed, observer, get } from '@ember/object';\nimport Evented, { on } from '@ember/object/evented';\nimport Service, { inject as service } from '@ember/service';\nimport _ from 'lodash';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport { isDefaultPresence, isPurecloudSource } from 'web-directory/utils/presence-utils';\n\nconst NOT_RESPONDING = 'NOT_RESPONDING';\nconst ON_QUEUE = 'on_queue';\nconst AVAILABLE = 'available';\nconst DIRECTORY_ROUTE = /^#?directory:/i;\nconst ANALYTICS_ROUTE = /^#\\/?analytics/i;\n\nvar ENGAGE_ROOT = '/contact-center/';\nvar CM_ROUTE_REGEX = /^#\\/engage\\/contentManagement/;\n\nconst DIRECT_NAV_LINKS = [\n    /^#\\/topics-definitions/,\n    /^#\\/quality\\/admin\\/encryptionKeys/,\n    /^#\\/quality\\/admin\\/evaluationForms/,\n    /^#\\/quality\\/admin\\/surveyForms/,\n    /^#\\/quality\\/admin\\/speech-and-text-analytics/,\n    /^#\\/quality\\/admin\\/reprocess-interactions/,\n    /^#\\/quality\\/admin\\/dictionary-management/,\n    /^#\\/quality\\/admin\\/sentiment-feedback/,\n    /^#\\/quality\\/admin\\/sta-category-definitions-ui/,\n    /^#\\/quality\\/admin\\/topic-miner/,\n    /^#\\/quality\\/admin\\/topics-definitions-v2/,\n    /^#\\/quality\\/admin\\/programs-definitions/,\n    /^#\\/quality\\/admin\\/agent-checklists-ui/,\n    /^#\\/admin\\/telephony\\/extensions/,\n    /^#\\/admin\\/telephony\\/settings/\n];\n\nfunction getParameterByName(name) {\n    var match = RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search);\n    return match && decodeURIComponent(match[1].replace(/\\+/g, ' '));\n}\n\nfunction isDirectNavLink(href) {\n    return !!DIRECT_NAV_LINKS.find(directRegex => {\n        return directRegex.test(href);\n    });\n}\n\n// This function sets up engage links to render with the #/engage/ prefix\n// but it also allows us to skip that for specific exceptions\nfunction setNavTreeLinkTo(navEntries) {\n    navEntries.forEach(entry => {\n        if (!entry.linkTo && !isDirectNavLink(entry.href)) {\n            entry.linkTo = 'engage.embedded';\n        } else {\n            entry.direct = true; // use the href directly\n        }\n        if (entry.subLinks) {\n            setNavTreeLinkTo(entry.subLinks);\n        }\n    });\n}\n\nexport default Service.extend(Evented, LoggerMixin, {\n    application: service(),\n    presenceSubscription: service(),\n    session: service(),\n    intl: service(),\n    ajax: service(),\n    notification: service(),\n    agentSchedule: service(),\n    queueService: service('queue'),\n    permissions: service(),\n\n    isEngageActive: false,\n    isEngageInteracting: false,\n\n    unreadAlertsCount: null,\n\n    route: 'noop',\n    navigationRoute: null,\n    redirectRoute: null,\n\n    navTree: null,\n\n    breadcrumb: null,\n\n    helpURL: null,\n\n    title: '',\n\n    url: ENGAGE_ROOT + '#noop',\n\n    localEnv: null,\n\n    location: computed('route', 'isEngageActive', 'localEnv', function () {\n        var route = 'noop';\n        var localEnv = this.localEnv;\n        var locale = this.get('intl.isoRegionalLocale');\n        var coreBuild = getParameterByName('engage-version');\n        var location = `${ENGAGE_ROOT}`;\n        var componentBuilds = window.location.search.match(/([a-zA-Z]){1,}-component-version=[a-zA-Z0-9\\-\\_]{1,}/g);\n        var componentParams = componentBuilds ? `&${componentBuilds.join('&')}` : '';\n\n        if (this.isEngageActive) {\n            route = this.route;\n        }\n\n        if (route === 'interactions') {\n            // Just go to the default route instead of interactions\n            route = '';\n        }\n\n        this.logger.debug('Updating location to ' + ENGAGE_ROOT + '#' + route);\n\n        if (coreBuild) {\n            location = `${location}${coreBuild}/embedded.html?locale=${locale}`;\n        } else {\n            location = `${location}embedded.html?locale=${locale}`;\n        }\n\n        if (localEnv) {\n            return `${location}&env=${localEnv}${componentParams}#${route}`;\n        }\n\n        return `${location}${componentParams}#${route}`;\n    }),\n\n    handleNavigation(navEvent, options = { newWindow: false }) {\n        if (options.newWindow) {\n            window.open(navEvent);\n            return;\n        }\n\n        if (this.isDirectoryRoute(navEvent)) {\n            window.location.hash = navEvent.replace(DIRECTORY_ROUTE, '');\n            return;\n        }\n\n        // if it's namespaced to analytics, make sure we bypass the embedded engage routing logic\n        if (this.isAnalyticsRoute(navEvent)) {\n            window.location.hash = navEvent;\n            return;\n        }\n\n        this.set('navigationRoute', navEvent);\n    },\n\n    handleRedirect(navEvent) {\n        this.set('redirectRoute', navEvent);\n        this.notifyPropertyChange('redirectRoute');\n    },\n\n    goOnQueue: function () {\n        //Going on queue: set routing status to IDLE (make eligible for interactions)\n        this.presenceSubscription.changeRoutingStatus('IDLE');\n    },\n\n    goOffQueue: function () {\n        //Going off queue: set presence to AVAILABLE, unless they can receive interactions in the AVAILABLE presence then set presence to BUSY\n        const newPresence = this.isAvailableAndCanReceiveInteractions ? 'BUSY' : 'AVAILABLE';\n        this.presenceSubscription.changePresence(newPresence);\n    },\n\n    selectQueues: function () {\n        window.location.hash = '#/queues/activate/me';\n        this.get('noActiveQueuesNotification').hide();\n        this.set('noActiveQueuesNotification', null);\n    },\n\n    /**\n     * Returns true if the passed in route is prepended with #directory: and should then bypass the engage routing altogether.\n     * This is useful for situations where the engage state needs to be uninterrupted but the route needs to be changed\n     * from within engage.  For instance an inner engage navhelper call to load the admin panel.  The route is not a valid\n     * route in engage and attempting to load it will resolve to a noop if handled normally.\n     *\n     * By adding the \"#directory:\" convention the route following the token will be interpreted as a directory route\n     * @param route\n     * @returns {*|boolean}\n     */\n    isDirectoryRoute: function (route) {\n        return route && DIRECTORY_ROUTE.test(route);\n    },\n\n    isAnalyticsRoute: function (route) {\n        return route && ANALYTICS_ROUTE.test(route);\n    },\n\n    notRespondingNotification: null,\n\n    noActiveQueuesNotification: null,\n\n    routingStatus: reads('session.person.activities.routingStatus.status'),\n    presence: reads('session.person.presence'),\n\n    isAvailableAndCanReceiveInteractions: computed(\n        'permissions.canReceiveInteractionsAvailableOffQueue',\n        'presence',\n        'session.features.agentAddressOnBehalfOfQueue',\n        function () {\n            const presence = this.presence;\n            const canReceiveInteractionsAvailable = this.get('permissions.canReceiveInteractionsAvailableOffQueue');\n            return (\n                presence === AVAILABLE &&\n                canReceiveInteractionsAvailable &&\n                this.get('session.features.agentAddressOnBehalfOfQueue')\n            );\n        }\n    ),\n\n    isNotResponding: computed('routingStatus', 'presence', 'isAvailableAndCanReceiveInteractions', function () {\n        const routingStatus = this.routingStatus;\n        const presence = this.presence;\n        const isAvailableAndCanReceiveInteractions = this.isAvailableAndCanReceiveInteractions;\n        return (presence === ON_QUEUE || isAvailableAndCanReceiveInteractions) && routingStatus === NOT_RESPONDING;\n    }),\n\n    isOnQueue: false,\n\n    updateOnQueueStatus: on(\n        'init',\n        observer('session.person.isOnQueue', function () {\n            const oldValue = this.get('isOnQueue');\n            const newValue = this.get('session.person.isOnQueue');\n\n            if (oldValue !== newValue) {\n                this.set('isOnQueue', newValue);\n            }\n        })\n    ),\n\n    handleOnQueue: on(\n        'init',\n        observer(\n            'isOnQueue',\n            _.debounce(function () {\n                const nonPurecloudSource = !isPurecloudSource(this.get('session.user.presence.source'));\n                if (this.isOnQueue && !nonPurecloudSource) {\n                    this.queueService.getMyQueues({ joined: 'true' }).then(response => {\n                        if (response) {\n                            this.handleNoActiveQueuesNotification(response.total < 1);\n                        }\n                    });\n                } else {\n                    this.handleNoActiveQueuesNotification(false);\n                }\n            }, 250)\n        )\n    ),\n\n    handleNoActiveQueuesNotification(show) {\n        const notification = this.noActiveQueuesNotification;\n\n        if (show && notification && notification.notification && notification.notification.shown) {\n            // notification is already shown, so do nothing\n            return;\n        }\n\n        if (show) {\n            if (notification) {\n                this.noActiveQueuesNotification.hide();\n                this.set('noActiveQueuesNotification', null);\n            }\n            this.set(\n                'noActiveQueuesNotification',\n                this.notification.info(\n                    null,\n                    this.intl.safestring('notification.purecloud.activeQueues.noQueues').toString(),\n                    {\n                        forceBrowserNotification: true,\n                        showCloseButton: true,\n                        hideAfter: false,\n                        messageStyle: 'pin-to-top',\n                        type: 'no-joined-queues',\n                        target: this,\n                        tag: 'no-joined-queues',\n                        actionHandlers: {\n                            selectQueues: this.intl\n                                .safestring('notification.purecloud.activeQueues.selectQueues')\n                                .toString()\n                        }\n                    }\n                )\n            );\n        } else if (notification) {\n            this.noActiveQueuesNotification.hide();\n            this.set('noActiveQueuesNotification', null);\n        }\n    },\n\n    disablePresenceSelector() {\n        let source = this.get('session.person.primaryPresence.source');\n        if (!source) {\n            return false;\n        }\n        return !isDefaultPresence(source);\n    },\n\n    handleNotRespondingState: on(\n        'init',\n        observer(\n            'isNotResponding',\n            'intl.loaded',\n            'session.user.presence.source',\n            'isAvailableAndCanReceiveInteractions',\n            function () {\n                const isNotResponding = this.isNotResponding;\n                const isAvailableAndCanReceiveInteractions = this.isAvailableAndCanReceiveInteractions;\n                const notification = this.notRespondingNotification;\n                const intl = this.intl;\n\n                if (intl.get('loaded') && isNotResponding && notification && get(notification, 'notification.shown')) {\n                    //User is not responding but notification is already shown, so do nothing\n                    return;\n                }\n\n                if (isNotResponding && intl.get('loaded')) {\n                    //User is not responding, so show the notification\n                    if (notification) {\n                        notification.showBrowserNotification();\n                    } else {\n                        const options = {\n                            showNotificationEverywhere: true,\n                            showCloseButton: false,\n                            hideAfter: false,\n                            messageStyle: 'pin-to-top',\n                            type: 'not-responding-message',\n                            target: this,\n                            tag: 'not-responding-message'\n                        };\n                        if (!this.disablePresenceSelector()) {\n                            if (isAvailableAndCanReceiveInteractions) {\n                                options.actionHandlers = {\n                                    goOnQueue: intl\n                                        .safestring('notification.purecloud.notResponding.makeAvailable')\n                                        .toString(),\n                                    goOffQueue: intl\n                                        .safestring('notification.purecloud.notResponding.setToBusy')\n                                        .toString()\n                                };\n                            } else {\n                                options.actionHandlers = {\n                                    goOnQueue: intl\n                                        .safestring('notification.purecloud.notResponding.makeEligible')\n                                        .toString(),\n                                    goOffQueue: intl\n                                        .safestring('notification.purecloud.notResponding.goOffQueue')\n                                        .toString()\n                                };\n                            }\n                        }\n                        this.set(\n                            'notRespondingNotification',\n                            this.notification.info(\n                                null,\n                                intl.safestring('notification.purecloud.notResponding.message').toString(),\n                                options,\n                                getOwner(this)\n                            )\n                        );\n                    }\n                } else if (notification) {\n                    //User is responding, so hide the notification\n                    notification.hide();\n                    this.set('notRespondingNotification', null);\n                }\n            }\n        )\n    ),\n\n    registerNavEntries(navEntries) {\n        let outboundEntry = _.find(navEntries, entry => entry.fromPlaceholder === 'outbound-component');\n        if (outboundEntry) {\n            const outboundCampaigns = _.remove(\n                outboundEntry.subLinks,\n                subLink => subLink.href.indexOf('outboundCampaigns') > -1\n            );\n            if (outboundCampaigns.length > 0) {\n                navEntries.push(outboundCampaigns[0]);\n            }\n        }\n        setNavTreeLinkTo(navEntries);\n        this.set('navTree', navEntries);\n        this.trigger('navTreeUpdate');\n    },\n\n    setBreadcrumb(breadcrumbData) {\n        if (breadcrumbData.length > 0 && CM_ROUTE_REGEX.test(breadcrumbData[0].hash)) {\n            this.set('breadcrumb', null);\n        } else {\n            this.set('breadcrumb', breadcrumbData);\n        }\n    },\n\n    setHelpURL(url) {\n        this.set('helpURL', url);\n    },\n\n    checkEnv: on('init', function () {\n        let envDetails = this.get('application.envDetails');\n        if (envDetails && envDetails.local) {\n            this.set('localEnv', envDetails.env);\n        }\n    })\n});\n","import { Promise, allSettled } from 'rsvp';\nimport Service, { inject as service } from '@ember/service';\nimport _ from 'lodash';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport moment from '../utils/dates';\n\nexport const TEAMS_LIMIT = 100;\n\nfunction isValidInterval(interval, options) {\n    const intervals = interval.split('/');\n    const start = moment(intervals[0]);\n    const end = moment(intervals[1]);\n    let granularity;\n\n    if (options) {\n        granularity = options.granularity;\n    }\n\n    if (granularity) {\n        if (granularity === 'P1D' || granularity === 'P1W') {\n            const startUtcHours = start.utc().hours();\n            const endUtcHours = end.utc().hours();\n\n            if (startUtcHours !== endUtcHours) {\n                return false;\n            }\n        }\n    }\n\n    if (end.minutes() === 0 || end.minutes() === 30) {\n        return true;\n    } else {\n        return false;\n    }\n}\n\nconst OBSERVATIONS_QUEUE_URI = 'api/v2/analytics/queues/observations/query';\nconst OBSERVATIONS_USERS_URI = 'api/v2/analytics/users/observations/query';\nconst AGGREGATES_USERS_URI = 'api/v2/analytics/users/aggregates/query';\nconst AGGREGATES_FLOWS_URI = 'api/v2/analytics/flows/aggregates/query';\nconst AGGREGATES_CONVERSATIONS_URI = 'api/v2/analytics/conversations/aggregates/query';\nconst DETAILS_CONVERSATIONS_URI = 'api/v2/analytics/conversations/details/query';\nconst USERS_URI = 'api/v2/users/search';\nconst TEAMS_URI = 'api/v2/teams/search';\nconst EVAL_FORMS_URI = 'api/v2/quality/forms';\nconst EVAL_PUBLISHED_FORMS_URI = 'api/v2/quality/publishedforms/evaluations';\nconst SURVEY_FORMS_URI = 'api/v2/quality/forms/surveys';\nconst SURVEY_PUBLISHED_FORMS_URI = 'api/v2/quality/publishedforms/surveys';\nconst SURVEY_BULK_FORMS_URI = 'api/v2/quality/forms/surveys/bulk';\nconst AGGREGATES_EVALUATIONS_URI = 'api/v2/analytics/evaluations/aggregates/query';\nconst EVAL_QUERY_URI = 'api/v2/quality/evaluations/query';\nconst AGENTS_ACTIVITY_QUERY_URI = 'api/v2/quality/agents/activity';\nconst REPORTING_EXPORT_URI = 'api/v2/analytics/reporting/exports';\nconst REPORTING_EXPORT_ALL_URI = 'api/v2/analytics/reporting/exports/all';\nconst REPORTING_ALERTS_QUERY_URI = 'api/v2/alerting/alerts/query';\nconst REPORTING_ALERTS_URI = 'api/v2/alerting/alerts';\n\nconst INSIGHTS_URI = 'api/v2/analytics/reporting/settings/insights';\n\nconst URI_MAP = {\n    queue_observations: OBSERVATIONS_QUEUE_URI,\n    user_observations: OBSERVATIONS_USERS_URI,\n    user_aggregates: AGGREGATES_USERS_URI,\n    conversation_aggregates: AGGREGATES_CONVERSATIONS_URI,\n    conversation_details: DETAILS_CONVERSATIONS_URI,\n    evaluations_aggregates: AGGREGATES_EVALUATIONS_URI,\n    flow_aggregates: AGGREGATES_FLOWS_URI\n};\n\nexport default Service.extend(LoggerMixin, {\n    application: service(),\n    ajax: service(),\n\n    /**\n     * This method builds and sends the payload object and version\n     * to the apiCore and on success return a response object.\n     *\n     * @param {Object} payload query object\n     * @return {Object} the response from the server\n     */\n    executeQuery(endpointKey, interval, options) {\n        const payload = Object.assign(\n            {},\n            {\n                interval: interval\n            },\n            options\n        );\n\n        if (!isValidInterval(interval, options)) {\n            console.error(`This interval (${interval}) you sent to the analytics service is invalid`);\n        }\n        const endpoint = URI_MAP[endpointKey];\n        const uri = this.application.pcUri(endpoint);\n        const request = this.ajax.post(uri, { data: payload });\n        const promise = Promise.cast(request);\n\n        return promise;\n    },\n\n    /**\n     * Builds filter object from the list of parameters and then calls the executeQuery method.\n     * It takes the response from the payload query and calls generateAnalyticsData with the results array.\n     *\n     * @param  {Array}  idArr - Array of Ids\n     * @param  {String} dataSource - The name of the data source to query\n     * @param  {Object[]} dimensions - JSON array of the dimensions used to constrain\n     *  the groupings, much like a SQL GROUPBY operation. Can be empty to group solely\n     *  by time granularity.\n     * @param  {String} interval - ISO8601 specified time interval, indicating the\n     *  time range for the data requested\n     *\n     * @param  {Object} [options=undefined] - optional arguments\n     * @param  {String} [options.granularity=undefined] - ISO8601 specified time\n     *  period (eg. P1D is one day, PT1H is one hour, PT30M is thirty minutes).\n     *  Omitting this property will have the analytics service return a default\n     *  granularity of PT30M.\n     * @param {String} [options.mediaType] - Setting this argument will determine the\n     *  media type in which the returned metrics will represent (voice, web chat, etc.).\n     *  Omitting this property will have the analytics service return metrics for the\n     *  \"voice\" media type.\n     *\n     * @return {Promise} A Promise that returns an array of new AnalyticsData objects\n     *  created from the server response.\n     */\n    execDisjunctionAggregateQuery(endpointKey, idArr, dimensions, interval, options) {\n        const opts = Object.assign({}, options, {\n            filter: {\n                type: 'and',\n                clauses: [\n                    {\n                        type: 'or',\n                        predicates: _.map(idArr, function (id) {\n                            return {\n                                type: 'dimension',\n                                dimension: dimensions[0],\n                                value: id\n                            };\n                        })\n                    }\n                ]\n            }\n        });\n\n        if (options && options.mediaType) {\n            opts.filter.predicates = [\n                {\n                    dimension: 'mediaType',\n                    value: options.mediaType\n                }\n            ];\n        }\n\n        return this.executeQuery(endpointKey, interval, opts).then(response => response.results);\n    },\n\n    /**\n     * Builds the filter object and any other optional objects to be included in the payload query\n     *\n     * In depth documentation of the Analytics Service REST API can be found here:\n     *\n     * https://confluence.inin.com/display/Development/Analytics+API\n     *\n     * @param  {String} id             id of thing to query\n     * @param  {Array}  dimensions     the dimension name\n     * @param  {String} interval       the interval to query\n     * @param  {Object} options        the options object\n     * @return {Object}                A Promise that returns a new AnalyticsData object created\n     *                                   with the server response.\n     */\n    execAggregateQuery(endpointKey, id, dimensions, interval, options) {\n        const opts = Object.assign({}, options, {\n            filter: {\n                type: 'and',\n                clauses: [\n                    {\n                        type: 'or',\n                        predicates: [\n                            {\n                                type: 'dimension',\n                                dimension: dimensions[0],\n                                value: id\n                            }\n                        ]\n                    }\n                ]\n            }\n        });\n\n        var mediaType;\n        if (options && options.mediaType) {\n            mediaType = options.mediaType;\n            opts.filter.predicates = [\n                {\n                    dimension: 'mediaType',\n                    value: mediaType\n                }\n            ];\n        }\n\n        return this.executeQuery(endpointKey, interval, opts).then(response => {\n            return response.results;\n        });\n    },\n\n    getQueueObservations(queueIds, interval, options) {\n        return this.execDisjunctionAggregateQuery('queue_observations', queueIds, ['queueId'], interval, options);\n    },\n\n    /**\n       @desc Retrieves conversation aggregates of metrics for an interval.\n       @see https://developer.mypurecloud.com/api/rest/v2/analytics/index.html\n       @param {object} options - Query options.\n       @returns {promise} Promise resolves to conversation aggregate data.\n     */\n    getConversationAggregates(options) {\n        return this.ajax.post(this.application.pcV2Uri(AGGREGATES_CONVERSATIONS_URI), { data: options });\n    },\n\n    execConversationQueryV6(interval, options) {\n        const payload = Object.assign(\n            {},\n            {\n                interval,\n                order: 'asc',\n                orderBy: 'conversationStart',\n                paging: {\n                    pageSize: 25,\n                    pageNumber: 1\n                }\n            },\n            options\n        );\n\n        return this.ajax.post(this.application.pcUri(DETAILS_CONVERSATIONS_URI), { data: payload });\n    },\n\n    /**\n       @desc Retrieves users for a list of participants.\n       @see https://developer.mypurecloud.com/api/rest/v2/users/index.html\n       @param {array} participants - List of participants.\n       @param {boolean} includeInactive - True to include inactive users, false for only active\n       @param {boolean} includeDeleted - True to include deleted users, false for only active\n       @returns {promise} Promise resolves to user query results.\n     */\n    getUsers(participants, includeInactive = true, includeDeleted = true, expand = []) {\n        const userOptions = ['active'];\n        if (includeInactive) {\n            userOptions.push('inactive');\n        }\n        if (includeDeleted) {\n            userOptions.push('deleted');\n        }\n\n        const uniqueIds = _.uniq(participants.filter(p => p.userId).map(p => p.userId));\n\n        // API endpoint only supports 50 search criteria values at once\n        // Need to break query up into multiple blocks if there are more than 50 IDs to search\n        const query = [];\n\n        if (userOptions.length > 1) {\n            query.push({\n                fields: ['state'],\n                values: userOptions,\n                type: 'EXACT'\n            });\n        }\n\n        for (let i = 0; i < uniqueIds.length; i += 50) {\n            query.push({\n                fields: ['id'],\n                values: uniqueIds.slice(i, i + 50),\n                type: 'EXACT',\n                operator: 'OR'\n            });\n        }\n\n        return this.ajax.post(this.application.pcV2Uri(USERS_URI), {\n            data: {\n                pageSize: uniqueIds.length,\n                pageNumber: 1,\n                query,\n                types: ['users'],\n                expand\n            }\n        });\n    },\n\n    /**\n       @desc Retrieves users for a list of IDs.\n       @see https://developer.mypurecloud.com/api/rest/v2/users/index.html\n       @param {array} ids - List of user IDs.\n       @param {boolean} includeInactive - True to include inactive users, false for only active\n       @param {boolean} includeDeleted - True to include deleted users, false for only active\n       @returns {promise} Promise resolves to user query results.\n    */\n    getUsersByIds(ids, includeInactive = true, includeDeleted = true, expand = []) {\n        return this.getUsers(\n            ids.map(id => {\n                return { userId: id };\n            }),\n            includeInactive,\n            includeDeleted,\n            expand\n        );\n    },\n\n    getTeamsByIds(ids) {\n        const uniqueIds = _.uniq(ids.filter(id => id));\n        const promises = [];\n\n        const query = [\n            {\n                type: 'EXACT',\n                fields: ['id'],\n                values: uniqueIds\n            }\n        ];\n\n        if (uniqueIds && uniqueIds.length) {\n            // If we have too many team Ids, break it up\n            if (uniqueIds.length > TEAMS_LIMIT) {\n                _.chunk(uniqueIds, TEAMS_LIMIT).forEach(chunk => {\n                    query[0].values = chunk;\n\n                    promises.push(\n                        this.ajax.post(this.application.pcV2Uri(TEAMS_URI), {\n                            data: {\n                                pageSize: chunk.length,\n                                pageNumber: 1,\n                                query,\n                                types: ['teams']\n                            }\n                        })\n                    );\n                });\n            } else {\n                // If we don't have too many, proceed as usual\n                promises.push(\n                    this.ajax.post(this.application.pcV2Uri(TEAMS_URI), {\n                        data: {\n                            pageSize: uniqueIds.length,\n                            pageNumber: 1,\n                            query,\n                            types: ['teams']\n                        }\n                    })\n                );\n            }\n        }\n\n        return allSettled(promises).then(results => {\n            const data = { results: [] };\n\n            if (results && results.length) {\n                results.forEach(result => {\n                    if (result.state === 'fulfilled' && result.value && result.value.results) {\n                        const value = result.value;\n\n                        data.results = _.uniq(data.results.concat(result.value.results), team => {\n                            return team.id;\n                        });\n\n                        // if we didn't search for a set of IDs, we are looking at a full list, so make sure we still track these values\n                        if (!(uniqueIds && uniqueIds.length)) {\n                            data.total = value.total;\n                            data.pageSize = value.pageSize;\n                            data.pageCount = value.pageCount;\n                            data.pageNumber = value.pageNumber;\n                        } else {\n                            // we have a selected set of queues, so set the total to the length of the entities array\n                            data.total = data.results.length;\n                        }\n                    }\n                });\n            }\n\n            return data;\n        });\n    },\n\n    /**\n       @desc Retrieves users for a given name search string.\n       @see https://developer.mypurecloud.com/api/rest/v2/users/index.html\n       @param {string} name - Name search string.\n       @param {object} options - Options for the query including pageSize and pageNumber.\n       @param {boolean} includeInactive - True to include inactive users, false for only active\n       @param {array} divisions - list of divisionIds\n       @param {boolean} includeDeleted - True to include deleted users, false for only active\n       @returns {promise} Promise resolves to user query results.\n     */\n    searchUsersByName(name, options, includeInactive, divisions, includeDeleted) {\n        const userOptions = ['active'];\n        if (includeInactive) {\n            userOptions.push('inactive');\n        }\n        if (includeDeleted) {\n            userOptions.push('deleted');\n        }\n        const request = {\n            data: {\n                pageSize: (options && options.pageSize) || 50,\n                pageNumber: (options && options.pageNumber) || 1,\n                query: [\n                    {\n                        fields: ['name'],\n                        value: (name || '').toLowerCase(),\n                        type: 'CONTAINS'\n                    },\n\n                    {\n                        fields: ['state'],\n                        values: userOptions,\n                        type: 'EXACT',\n                        operator: 'OR'\n                    }\n                ],\n                types: ['users']\n            }\n        };\n        if (!_.isEmpty(divisions)) {\n            request.data.query.push({\n                type: 'EXACT',\n                fields: ['divisionId'],\n                values: divisions\n            });\n        }\n        return this.ajax.post(this.application.pcV2Uri(USERS_URI), request);\n    },\n\n    /**\n       @desc Retrieves a list of published quality evaluation forms.\n       @see https://developer.mypurecloud.com/api/rest/v2/quality/index.html\n       @param {object} options - Query options.\n       @returns {promise} Promise resolves to evaluation form query results.\n     */\n    getEvaluationForms(options) {\n        return this.ajax.ajaxGet(this.application.pcV2Uri(EVAL_PUBLISHED_FORMS_URI), { data: options });\n    },\n\n    /**\n       @desc Retrieves a quality evaluation form by ID.\n       @see https://developer.mypurecloud.com/api/rest/v2/quality/index.html\n       @param {string} id - Form GUID.\n       @returns {promise} Promise resolves to evaluation form query result.\n    */\n    getEvaluationForm(id) {\n        return this.ajax.ajaxGet(this.application.pcV2Uri(`${EVAL_FORMS_URI}/${id}`));\n    },\n\n    /**\n       @desc Retrieves a quality evaluation form's versions.\n       @see https://developer.mypurecloud.com/api/rest/v2/quality/index.html\n       @param {string} id - Form GUID.\n       @param {object} options - Query options.\n       @returns {promise} Promise resolves to evaluation form versions query result.\n    */\n    getEvaluationFormVersions(id, options) {\n        return this.ajax.ajaxGet(this.application.pcV2Uri(`${EVAL_FORMS_URI}/${id}/versions`), {\n            data: options\n        });\n    },\n\n    /**\n       @desc Retrieves evaluations aggregates of metrics for an interval.\n       @see https://developer.mypurecloud.com/api/rest/v2/analytics/index.html\n       @param {object} options - Query options.\n       @returns {promise} Promise resolves to evaluations aggregate data.\n     */\n    getEvaluationsAggregates(options) {\n        return this.ajax.post(this.application.pcV2Uri(AGGREGATES_EVALUATIONS_URI), { data: options });\n    },\n\n    /**\n     @desc Retrieves a list of quality evaluations.\n     @see https://developer.mypurecloud.com/api/rest/v2/quality/index.html\n     @param {object} options - Query options.\n     @returns {promise} Promise resolves to evaluation list results.\n     */\n    getEvaluations(options) {\n        return this.ajax.ajaxGet(this.application.pcV2Uri(EVAL_QUERY_URI), { data: options });\n    },\n\n    /**\n     @desc Retrieves user aggregates of metrics for an interval.\n     @see https://developer.mypurecloud.com/api/rest/v2/analytics/index.html\n     @param {object} options - Query options.\n     @returns {promise} Promise resolves to user aggregate data.\n     */\n    getUserAggregates(options) {\n        return this.ajax.post(this.application.pcV2Uri(AGGREGATES_USERS_URI), { data: options });\n    },\n\n    /**\n       @desc Retrieves a quality survey form's versions.\n       @see https://developer.mypurecloud.com/api/rest/v2/quality/index.html\n       @param {string} id - Form GUID.\n       @param {object} options - Query options.\n       @returns {promise} Promise resolves to survey form versions query result.\n    */\n    getSurveyFormVersions(id, options) {\n        return this.ajax.ajaxGet(this.application.pcV2Uri(`${SURVEY_FORMS_URI}/${id}/versions`), {\n            data: options\n        });\n    },\n\n    /**\n       @desc Retrieves a list of published quality survey forms.\n       @see https://developer.mypurecloud.com/api/rest/v2/quality/index.html\n       @param {object} options - Query options.\n       @returns {promise} Promise resolves to survey form query results.\n     */\n    getSurveyForms(options) {\n        return this.ajax.ajaxGet(this.application.pcV2Uri(SURVEY_PUBLISHED_FORMS_URI), { data: options });\n    },\n\n    /**\n       @desc Retrieves a list of published quality survey forms.\n       @see https://developer.mypurecloud.com/api/rest/v2/quality/index.html\n       @param {array} ids - array of survey form IDs.\n       @returns {promise} Promise resolves to survey form query results.\n     */\n    getSurveyFormsByIds(ids) {\n        let parameters = [];\n        if (ids && ids.length) {\n            ids.forEach(id => {\n                parameters.push({ id });\n            });\n        }\n        return this.ajax.ajaxGet(\n            this.application.pcV2Uri(\n                SURVEY_BULK_FORMS_URI +\n                    '?' +\n                    parameters\n                        .map(parameter => {\n                            for (const prop in parameter) {\n                                return encodeURIComponent(prop) + '=' + encodeURIComponent(parameter[prop]);\n                            }\n                        })\n                        .join('&')\n            )\n        );\n    },\n\n    /**\n     @desc Retrieves a list of agent activities.\n     @see https://developer.mypurecloud.com/api/rest/v2/quality/index.html\n     @param {Integer} pageSize - page size\n     @param {Integer} pageNumber - standard page number, 1 based\n     @param {String} startTime - ISO formatted date start time\n     @param {String} endTime - ISO formatted date end time\n     @param {array} agentUserIds - list of agent user IDs\n     @returns {promise} Promise resolves to agent activities results.\n     */\n    getAgentsActivities(pageSize, pageNumber, startTime, endTime, agentUserIds) {\n        let parameters = [{ pageSize }, { pageNumber }, { startTime }, { endTime }];\n\n        if (agentUserIds && agentUserIds.length) {\n            agentUserIds.forEach(agentUserId => {\n                parameters.push({ agentUserId });\n            });\n        }\n\n        return this.ajax.ajaxGet(\n            this.application.pcV2Uri(\n                AGENTS_ACTIVITY_QUERY_URI +\n                    '?' +\n                    parameters\n                        .map(parameter => {\n                            for (const prop in parameter) {\n                                return encodeURIComponent(prop) + '=' + encodeURIComponent(parameter[prop]);\n                            }\n                        })\n                        .join('&')\n            )\n        );\n    },\n\n    scheduleExport(options) {\n        return this.ajax.post(this.application.pcV2Uri(REPORTING_EXPORT_URI), { data: options });\n    },\n\n    getReportingExports(options = {}) {\n        return this.ajax.ajaxGet(this.application.pcV2Uri(REPORTING_EXPORT_URI), { data: options });\n    },\n\n    getAllReportingExports(options = {}) {\n        return this.ajax.ajaxGet(this.application.pcV2Uri(REPORTING_EXPORT_ALL_URI), { data: options });\n    },\n\n    updateExport(id, options) {\n        return this.ajax.patch(this.application.pcV2Uri(`${REPORTING_EXPORT_URI}/${id}`), {\n            data: options\n        });\n    },\n\n    updateExportRun(id, options, runId) {\n        return this.ajax.patch(this.application.pcV2Uri(`${REPORTING_EXPORT_URI}/${id}/history/${runId}`), {\n            data: options\n        });\n    },\n\n    deleteExport(id) {\n        return this.ajax.del(this.application.pcV2Uri(`${REPORTING_EXPORT_URI}/${id}`));\n    },\n\n    deleteExportRun(id, runId) {\n        return this.ajax.del(this.application.pcV2Uri(`${REPORTING_EXPORT_URI}/${id}/history/${runId}`));\n    },\n\n    runExport(id, runId) {\n        const uri = `${REPORTING_EXPORT_URI}/${id}/execute/?runId=${runId}`;\n        return this.ajax.post(this.application.pcV2Uri(uri));\n    },\n\n    cancelExport(id) {\n        return this.ajax.ajaxGet(this.application.pcV2Uri(`${REPORTING_EXPORT_URI}/${id}/cancel`));\n    },\n\n    cancelExportRun(id, runId) {\n        return this.ajax.patch(this.application.pcV2Uri(`${REPORTING_EXPORT_URI}/${id}/history/${runId}`), {\n            data: { status: 'CANCELLING' }\n        });\n    },\n\n    getReportingAlerts(options = {}) {\n        return this.ajax.post(this.application.pcV2Uri(REPORTING_ALERTS_QUERY_URI), { data: options });\n    },\n\n    updateAlert(id, options) {\n        return this.ajax.put(this.application.pcV2Uri(`${REPORTING_ALERTS_URI}/${id}`), {\n            data: options\n        });\n    },\n\n    patchAlert(id, options) {\n        return this.ajax.patch(this.application.pcV2Uri(`${REPORTING_ALERTS_URI}/${id}`), {\n            data: options\n        });\n    },\n\n    deleteAlert(id) {\n        return this.ajax.del(this.application.pcV2Uri(`${REPORTING_ALERTS_URI}/${id}`));\n    },\n\n    toggleAllAlertsReadState(unread) {\n        const uri = this.application.pcV2Uri(`${REPORTING_ALERTS_URI}/all`);\n        const data = { type: 'Unread', unread: { state: unread } };\n\n        return this.ajax.patch(uri, { data });\n    },\n\n    deleteAllAlertNotifications() {\n        const uri = this.application.pcV2Uri(`${REPORTING_ALERTS_URI}/all`);\n\n        return this.ajax.delete(uri);\n    },\n\n    /**\n     @desc Retrieves analytics insights settings.\n     @see https://developer.mypurecloud.com/api/rest/v2/analytics/index.html\n     @returns {promise} Promise resolves to insights settings object.\n     */\n    getInsightsSettings() {\n        return this.ajax.ajaxGet(this.application.pcV2Uri(INSIGHTS_URI));\n    },\n\n    /**\n       @desc Retrieves ivr flow aggregates of metrics for an interval.\n       @see https://developer.mypurecloud.com/api/rest/v2/analytics/index.html\n       @param {object} options - Query options.\n       @returns {promise} Promise resolves to flow aggregate data.\n     */\n    getFlowAggregates(options) {\n        return this.ajax.post(this.application.pcV2Uri(AGGREGATES_FLOWS_URI), { data: options });\n    },\n\n    /**\n       @desc Renews expiring scheduled exports.\n       @see https://developer.mypurecloud.com/api/rest/v2/analytics/index.html\n       @returns {promise}\n     */\n    renewExpiringExports() {\n        const uri = this.application.pcV2Uri(`${REPORTING_EXPORT_URI}/schedule`);\n        const data = { action: 'RenewExpiringSchedules' };\n        return this.ajax.patch(uri, { dataType: 'text', data });\n    }\n});\n","import Service from '@ember/service';\nimport Evented from '@ember/object/evented';\n\nexport const TOGGLE_EVENT = 'system.event.toggle';\nexport const TOGGLE_NAV_EVENT = 'system.event.navtoggle';\nexport const TOGGLE_SUBNAV_EVENT = 'system.event.subnavtoggle';\nexport const TOGGLE_ACTIVE_DRAWER_EVENT = 'system.event.drawerselect';\nexport const TOGGLE_PANEL_EVENT = 'system.event.paneltoggle';\nexport const RESET_NAV = 'system.event.resetnav';\n\nconst eventsService = Service.extend(Evented, {\n    triggerEvent(event: any, payload: any) {\n        this.trigger(event, payload);\n    }\n});\n\nexport default eventsService;\nexport class EventsService extends eventsService {}\n\ndeclare module '@ember/service' {\n    interface Registry {\n        events: EventsService;\n    }\n}\n","import { oneWay } from '@ember/object/computed';\nimport { schedule } from '@ember/runloop';\nimport { getOwner } from '@ember/application';\nimport Evented from '@ember/object/evented';\nimport Service, { inject as service } from '@ember/service';\nimport { computed, get, setProperties } from '@ember/object';\nimport { createContactPojo } from 'web-directory/utils/acd';\n\nexport const CONTACT_CHANGED_EVENT = 'contact-changed-event';\nexport const CONTACT_MERGED_EVENT = 'contact-merged-event';\n\nconst CONTACT_CHANGED = 'contact-changed';\nconst EXTERNAL_CONTACT = 'externalcontacts/contact';\nconst EXPANDED_PARTICIPANT_PURPOSES = ['customer', 'external'];\n\nconst TOPIC_PREFIX = 'v2.externalcontacts.contacts.';\n\n/**\n * Service supports expansion of external contacts for interactions and observation of changes associated with\n * with those contacts.  This dispatches an change event when an external contact is changed and a merge event\n * along with a change event when an external contact is merged with another contact\n */\nexport default Service.extend(Evented, {\n    store: service(),\n    pigeon: service(),\n    names: service(),\n    permissions: service(),\n    logger: service('stash-logger'),\n\n    _trackedContacts: [],\n    contacts: oneWay('_trackedContacts'),\n\n    init() {\n        this._super(...arguments);\n        this.set('_trackedContacts', []);\n        this.set('contactCallbackData', []);\n        this.pigeon.on(CONTACT_CHANGED, this, this._handleContactChanged);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        this.pigeon.off(CONTACT_CHANGED, this, this._handleContactChanged);\n    },\n\n    /**\n     * Mutates (sets or resets) the provided interactionModel with the externalContact info.  This method\n     * assumes that the interactionModel participants have already been sync'd with the payload.\n     *\n     * @returns A promise which always resolves with undefined.  Any errors in expansion will be logged.\n     */\n    async setExternalContactInfo(interactionModel, payload) {\n        if (!this.get('permissions.hasExternalContactsViewContactAccess')) {\n            return;\n        }\n        const participantsToExpand = (interactionModel.get('participants') || []).filter(currParticipant => {\n            return currParticipant && EXPANDED_PARTICIPANT_PURPOSES.includes(get(currParticipant, 'purpose'));\n        });\n\n        if (!participantsToExpand.length) {\n            return;\n        }\n\n        for (let index = 0; index < participantsToExpand.length; index++) {\n            const currParticipant = participantsToExpand[index];\n\n            const rawParticipant =\n                payload && payload.participants ? payload.participants.find(p => p.id === currParticipant.id) : null;\n            if (!rawParticipant) {\n                this.logger.warn('ACD Relate: Could not correlate a model participant with a rawParticipant', {\n                    remoteData: {\n                        conversationId: interactionModel.get('id'),\n                        participantId: currParticipant.id\n                    }\n                });\n\n                continue;\n            }\n\n            if (!rawParticipant.externalContactId) {\n                setProperties(currParticipant, {\n                    isExternal: false,\n                    name: rawParticipant.name || '',\n                    externalContact: null\n                });\n            } else {\n                const externalContact = (await this._getContact(rawParticipant.externalContactId)) || null;\n                const name = externalContact ? this.names.fullName(externalContact) : null;\n\n                setProperties(currParticipant, {\n                    isExternal: true,\n                    name: name || rawParticipant.name || '',\n                    externalContact\n                });\n            }\n        }\n    },\n\n    /**\n     * Attempts to get a local contact model from the store and if none is found gets a remote model\n     * @param id - the contact id to load\n     * @param reload - if true - forces a reload of the contact\n     * @param errorMessage - specific error message for retrieval of contact context\n     * @returns {Promise.<*|{id}>}\n     */\n    async _getContact(id, reload, errorMessage = 'ACD Relate: failed to fetch contact') {\n        if (!id) return;\n        const store = this.store;\n        let contact = reload ? null : store.peekRecord(EXTERNAL_CONTACT, id);\n        if (!contact) {\n            try {\n                contact = await store.findRecord(EXTERNAL_CONTACT, id, { reload: true });\n            } catch (e) {\n                const { message: generalMessage, errors } = e;\n                const [errorData] = errors || [];\n                const { status, title, detail } = errorData || {};\n                const { message, contextId } = detail || {};\n                this.logger.error(errorMessage, {\n                    remoteData: {\n                        externalContactId: id,\n                        generalMessage,\n                        status,\n                        title,\n                        message,\n                        contextId\n                    }\n                });\n            }\n        }\n        return contact;\n    },\n\n    /**\n     * Gets the canonical contact based on the current contact.  It retrieves the local store's record first for\n     * both contact types if possible.  Changes to the contacts would have triggered updates through the update handler.\n     * @param id - the contact ID that will be used to retrieve the canonical contact.\n     * @param reload - if true forces reload of the contact and the canonical contact if applicable\n     * @returns {Promise.<*>} resolves to the current canonical contact for the passed in contact id\n     */\n    async getCanonicalExternalContact(id, reload = false) {\n        if (!this.get('permissions.hasExternalContactsViewContactAccess')) {\n            return;\n        }\n        let contact;\n        if (id) {\n            contact = await this._getContact(id, reload, 'ACD Relate: Failed to fetch External Contact from store');\n            const canonicalId = get(contact || {}, 'canonicalId');\n            if (canonicalId && canonicalId !== id) {\n                contact = await this._getContact(\n                    canonicalId,\n                    reload,\n                    'ACD Relate: Failed to fetch canonical External Contact from store'\n                );\n            }\n        }\n        return contact;\n    },\n\n    /**\n     * Synchronously gets the local contact canonical contact being tracked based on the passed in id.\n     * if nothing can be found - returns undefined\n     * @param contactId\n     */\n    getCanonicalContactSync(contactId) {\n        if (!this.get('permissions.hasExternalContactsViewContactAccess')) {\n            return;\n        }\n        // gets the contacts array since it is gated by the feature toggle\n        const contacts = this.contacts || [];\n        let contact = contacts.findBy('id', contactId);\n        if (contact) {\n            const canonicalId = get(contact, 'canonicalId');\n            if (canonicalId && canonicalId !== contactId) {\n                contact = contacts.findBy('id', canonicalId);\n            }\n        }\n        return contact;\n    },\n\n    /**\n     * Builds a temporary interaction model instance from a ModelBuilder + payload so we can read\n     * derived properties (e.g. participantForCustomer.externalContactId) off of it.\n     *\n     * ModelBuilder is either a real Ember class (Interaction, ChatInteraction, etc. - has `.extend`,\n     * inherited from EmberObject/CoreObject), a plain factory function (e.g. `buildModel` from\n     * phone.js/call-specific-processing-steps.ts), or a plain object exposing only `.create` (e.g. a\n     * test mock). `.create` alone is not a reliable discriminator - plain mocks can also define\n     * `.create` - so real Ember classes are detected via `.extend`, which only Ember classes have.\n     *\n     * Ember 3.x: EmberObject.create() no longer supports passing computed properties alongside owner\n     * injection. Create the instance first, then set properties via setProperties() to avoid runtime\n     * errors.\n     * @param ModelBuilder - The Ember Class, factory function, or plain object with a `create` method.\n     * @param payload - The payload to build the interaction model from.\n     * @returns The built interaction model instance.\n     */\n    _buildTempInteractionModel(ModelBuilder, payload) {\n        const isEmberClass = typeof ModelBuilder.extend === 'function';\n        if (isEmberClass) {\n            const instance = ModelBuilder.create(getOwner(this).ownerInjection());\n            instance.setProperties(payload);\n            return instance;\n        }\n        if (typeof ModelBuilder === 'function') {\n            return ModelBuilder(payload);\n        }\n        return ModelBuilder.create(payload);\n    },\n\n    /**\n     * Adds change listener for customer participant bound contacts on their id in the payloads participant array.  It diffs the\n     * previous interaction states participants array to remove listeners that were previously attached.\n     * @param ModelBuilder - The Ember Class or a function to create an interaction model\n     * @param payload - the payload from an interaction update\n     * @param prevRaw - the previous payload for an the payload - for determining removed contacts\n     * @param callback - the callback that will be fired when a contact changes - The callbacks are invoked without\n     * contact binding to an appropriate context will be necessary\n     */\n    async addContactChangeListenersForInteraction(ModelBuilder, payload, prevRaw, callback) {\n        if (!this.get('permissions.hasExternalContactsViewContactAccess')) {\n            return;\n        }\n\n        const currInteraction = this._buildTempInteractionModel(ModelBuilder, payload);\n        const externalContactId = get(currInteraction, 'participantForCustomer.externalContactId');\n        if (typeof currInteraction.destroy === 'function') {\n            currInteraction.destroy();\n        }\n\n        if (prevRaw) {\n            const prevInteraction = this._buildTempInteractionModel(ModelBuilder, prevRaw);\n            const previousContactId = get(prevInteraction, 'participantForCustomer.externalContactId');\n            if (typeof prevInteraction.destroy === 'function') {\n                prevInteraction.destroy();\n            }\n            if (previousContactId && previousContactId !== externalContactId) {\n                this.removeContactChangeListener(previousContactId, callback);\n            }\n        }\n\n        if (externalContactId) {\n            await this.addContactChangeListener(externalContactId, callback);\n        }\n    },\n\n    /**\n     * Cleans up listeners in an interaction payload attached to external contacts attached to the participants\n     * @param model\n     * @param callback\n     */\n    removeContactChangeListenersForInteraction(model, callback) {\n        if (!this.get('permissions.hasExternalContactsViewContactAccess')) {\n            return;\n        }\n        if (!model) {\n            return;\n        }\n\n        const externalContactId = get(model, 'participantForCustomer.externalContactId');\n        this.removeContactChangeListener(externalContactId, callback);\n    },\n\n    /**\n     * Adds a change listener for the canonical contact associated with the passed in external contact id\n     * as well as the contact itself if they differ\n     * @param contactId\n     * @param callback\n     * @returns {Promise.<void>}\n     */\n    async addContactChangeListener(contactId, callback) {\n        if (!this.get('permissions.hasExternalContactsViewContactAccess')) return;\n        if (!(contactId && callback)) return;\n\n        const contact = await this._getContact(contactId);\n        if (!contact) {\n            throw new Error('ACD Relate: failed to load external contact', { cause: contactId });\n        }\n\n        const divisionId = get(contact, 'division.id') || '*';\n\n        if (!this.permissions.validateDonutPermission('externalContacts:contact:view', divisionId)) {\n            throw new Error('ACD Relate: insufficient privileges to add contact listeners');\n        }\n\n        const canonicalId = get(contact, 'canonicalId');\n        const canonicalContact = await this._getContact(canonicalId);\n        if (!canonicalContact) {\n            throw new Error('ACD Relate: failed to load canonical external contact', { cause: canonicalId });\n        }\n\n        const contactData = this.contactCallbackData.findBy('contactId', contactId);\n\n        if (!contactData) {\n            this.contactCallbackData.pushObject({ contactId, canonicalId, callbacks: [callback] });\n        } else {\n            const { callbacks } = contactData;\n            if (callbacks.indexOf(callback) === -1) {\n                callbacks.pushObject(callback);\n            }\n        }\n\n        if (!this._trackedContacts.findBy('id', contactId)) {\n            this._trackedContacts.pushObject(createContactPojo(contact));\n        }\n        if (canonicalId !== contactId && !this._trackedContacts.findBy('id', canonicalId)) {\n            this._trackedContacts.pushObject(createContactPojo(canonicalContact));\n        }\n        if (contactId) {\n            this._watchContactForChanges(contactId);\n        }\n        if (canonicalId && canonicalId !== contactId) {\n            this._watchContactForChanges(canonicalId);\n        }\n    },\n\n    /**\n     * Removes a change listener for a canonical contact based on the passed in external contact is as well as\n     * the contact itself if they differ\n     * @param contactId\n     * @param callback\n     * @returns {Promise.<void>}\n     */\n    removeContactChangeListener(contactId, callback) {\n        if (!this.get('permissions.hasExternalContactsViewContactAccess')) {\n            return;\n        }\n        if (!(contactId && callback)) return;\n\n        const contactCallbackData = this.contactCallbackData;\n        const contactData = contactCallbackData.findBy('contactId', contactId);\n        if (contactData) {\n            const { callbacks } = contactData;\n            callbacks.removeObject(callback);\n            if (!callbacks.length) {\n                contactCallbackData.removeObject(contactData);\n            }\n        }\n        this._updateTrackedContactsAndTopics();\n    },\n\n    /**\n     * Adds watcher for changes on a given external contact based on the passed in contact id\n     * @param externalContactId\n     */\n    _watchContactForChanges(externalContactId) {\n        if (externalContactId) {\n            const topic = `${TOPIC_PREFIX}${externalContactId}`;\n            if (this.get('pigeon.priorityTopics').indexOf(topic) === -1) {\n                this.pigeon.registerPriorityTopic(topic, CONTACT_CHANGED);\n            }\n        }\n    },\n\n    /**\n     * Removes watcher for changes on a given external contact based on the passed in contact id\n     * @param externalContactId\n     */\n    _unwatchContactForChanges(externalContactId) {\n        if (externalContactId) {\n            const topic = `${TOPIC_PREFIX}${externalContactId}`;\n            if (this.get('pigeon.priorityTopics').indexOf(topic) !== -1) {\n                this.pigeon.unRegisterPriorityTopic(topic);\n            }\n        }\n    },\n\n    _invokeCallbacks(callbacks = [], data = {}) {\n        callbacks.forEach(callback => {\n            if (typeof callback === 'function') {\n                callback(data);\n            }\n        });\n    },\n\n    /**\n     * Rolls through tracked contacts and topics to remove any orphan contacts or topics that\n     * whose callback data has been removed.\n     */\n    _updateTrackedContactsAndTopics() {\n        const trackedContactIds = this.trackedContactIds;\n        const trackedContacts = this._trackedContacts;\n        for (let i = trackedContacts.length - 1; i >= 0; i--) {\n            const { id } = trackedContacts.objectAt(i);\n            if (id && trackedContactIds.indexOf(id) === -1) {\n                trackedContacts.splice(i, 1);\n                this._unwatchContactForChanges(id);\n            }\n        }\n    },\n\n    /**\n     * Returns an array of all the contact ids that are currently being tracked\n     */\n    trackedContactIds: computed('contactCallbackData.[]', function () {\n        return this.contactCallbackData\n            .reduce((trackedIds, callbackData) => {\n                const { contactId, canonicalId, callbacks } = callbackData;\n                if (callbacks.length) {\n                    trackedIds.pushObject(contactId);\n                    if (contactId !== canonicalId) {\n                        trackedIds.pushObject(canonicalId);\n                    }\n                }\n                return trackedIds;\n            }, [])\n            .uniq();\n    }),\n\n    /**\n     * Reloads an external contact when it has changed and dispatches an external contact changed event.  If the change\n     * in question was a merger of contacts, a merge event is also generated containing the initial contact and the\n     * canonical contact that resulted from the merge event.\n     * @param externalContactId - an object that contains a single id property corresponding to which contact changed\n     * @returns {Promise.<void>}\n     */\n    async _handleContactChanged({ id: contactId }) {\n        if (contactId) {\n            try {\n                if (!this.get('contactCallbackData.length')) {\n                    return;\n                }\n                const contacts = this._trackedContacts;\n                const contactCallbackData = this.contactCallbackData;\n\n                const staleContact = await this._getContact(contactId);\n                const staleCanonicalId = get(staleContact, 'canonicalId');\n\n                const freshContact = await this._getContact(contactId, true);\n                const freshCanonicalId = get(freshContact, 'canonicalId');\n                const freshCanonicalContact = await this._getContact(freshCanonicalId);\n\n                if (freshContact && freshCanonicalContact) {\n                    contacts.removeObject(contacts.findBy('id', contactId));\n                    contacts.pushObject(createContactPojo(freshContact));\n\n                    if (freshCanonicalId !== contactId) {\n                        contacts.removeObject(contacts.findBy('id', freshCanonicalId));\n                        contacts.pushObject(createContactPojo(freshCanonicalContact));\n                    }\n\n                    let callbacks, type, eventData;\n                    if (staleCanonicalId === freshCanonicalId) {\n                        type = CONTACT_CHANGED_EVENT;\n                    } else {\n                        type = CONTACT_MERGED_EVENT;\n\n                        //if this is a base contact - it will have a contactCallbackData\n                        // update it if it does to give it the new canonical contact id\n                        const callbackData = contactCallbackData.findBy('contactId', contactId);\n                        if (callbackData) {\n                            const { callbacks } = callbackData;\n                            contactCallbackData.removeObject(callbackData);\n\n                            // update the contact data with the new canonical and watch the news canonical\n                            contactCallbackData.pushObject({ contactId, canonicalId: freshCanonicalId, callbacks });\n                            this._watchContactForChanges(freshCanonicalId);\n                        }\n\n                        // removes orphan contacts and topics based on the currently tracked contact information\n                        this._updateTrackedContactsAndTopics();\n                    }\n\n                    callbacks = contactCallbackData\n                        .filter(data => data.contactId === contactId || data.canonicalId === contactId)\n                        .flatMap(({ callbacks }) => callbacks)\n                        .uniq();\n\n                    eventData = { type, contact: freshContact, canonicalContact: freshCanonicalContact };\n\n                    if (callbacks && type && eventData) {\n                        schedule('actions', this, '_invokeCallbacks', callbacks, eventData);\n                        this.trigger(type, eventData);\n                    }\n                }\n            } catch (e) {\n                this.logger.error('ACD Relate: Error occurred when handling external contact change event', {\n                    remoteData: {\n                        contactId\n                    }\n                });\n            }\n        }\n    }\n});\n","import Service from '@ember/service';\nconst Tinycon = window.Tinycon;\n\nexport function initializeFavicon() {\n    // Explictly grab the first favicon tag since tinycon selects the first link tag containing any icon string\n    // See https://github.com/tommoor/tinycon/issues/89\n    let faviconTag = null;\n    if (document && document.querySelectorAll) {\n        let iconTags = document.querySelectorAll('head link[rel~=\"icon\"]');\n        if (iconTags && iconTags.length > 0) {\n            faviconTag = iconTags[0];\n        }\n    }\n\n    Tinycon.setOptions({\n        fallback: false,\n        abbreviate: true,\n        crossOrigin: true,\n        background: '#FF5A20' // @see variables.less - @roster-new-chat-emphasis-color\n    });\n\n    if (faviconTag) {\n        // setImage only works as an update.\n        // Forcing a render of the tinycon canvas; otherwise, the setImage call doesn't persist the new canvas\n        Tinycon.setBubble(0);\n        Tinycon.setImage(faviconTag.getAttribute('href'));\n        // Force a render to use the new img url immediately and not wait for first bubble call\n        Tinycon.setBubble(0);\n    }\n}\n\nexport default Service.extend({\n    setFaviconBubbleText(text) {\n        Tinycon.setBubble(text);\n    }\n});\n","import Evented from '@ember/object/evented';\nimport { observer, computed, get } from '@ember/object';\nimport RSVP, { all } from 'rsvp';\nimport Service, { inject as service } from '@ember/service';\nimport ajax from 'ember-ajax';\nimport _ from 'lodash';\nimport { singularize } from 'ember-inflector';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nexport default Service.extend(Evented, LoggerMixin, {\n    intl: service(),\n    ajax: service(),\n    chat: service(),\n    store: service(),\n    session: service(),\n    application: service(),\n    notification: service(),\n    roster: service(),\n\n    initialized: false,\n\n    _favorites: null,\n    _rawFavorites: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.setProperties({\n            _favorites: [],\n            _rawFavorites: []\n        });\n\n        this.loadFavoritesForSessionPerson();\n        this.loadFavoritesIntoChatRoster();\n    },\n\n    enabled: computed('session.user.isTrustee', function () {\n        return !this.get('session.user.isTrustee');\n    }),\n\n    apiVersion: computed(function () {\n        return 'v3';\n    }),\n\n    loadFavoritesForSessionPerson: observer(\n        'session.{isAuthenticated,person}',\n        'session.user.{isTrustee,isSuper}',\n        function () {\n            if (this.get('session.user.isTrustee') || this.get('session.user.isSuper')) {\n                return;\n            }\n\n            if (!this.initialized && this.get('session.isAuthenticated') && this.get('session.person')) {\n                this.initFavorites();\n            }\n        }\n    ),\n\n    loadFavoritesIntoChatRoster: observer('initialized', 'chat.enabled', function () {\n        if (this.initialized && this.get('chat.enabled')) {\n            const chat = this.chat;\n            const favorites = this._favorites;\n\n            _.each(favorites, entity => {\n                if (entity.get('jid')) {\n                    chat.getChatRoom(entity.get('jid')).then(room => {\n                        room.set('isFavorite', true);\n                        this.roster.addRoomToFavorites(room);\n                    });\n                }\n            });\n        }\n    }),\n\n    initFavorites() {\n        const promiseHash = {\n            people: this.getFavorites('people', { entityType: 'person' }),\n            groups: this.getFavorites('groups', { entityType: 'group' }),\n            rooms: this.getFavorites('room')\n        };\n\n        RSVP.hash(promiseHash).then(({ people, groups, rooms }) => {\n            if (this.isDestroyed) {\n                return;\n            }\n            this.setFavorites(people, groups, rooms);\n            this.set('initialized', true);\n        });\n    },\n\n    getFavorites(type, options = {}) {\n        const store = this.store;\n        const userId = this.get('session.person.id');\n        type = singularize(type);\n\n        if (type === 'person' || type === 'group') {\n            const promise = store.findFavorites(type, userId, options);\n            promise\n                .then(data => {\n                    if (data._payload) {\n                        this._rawFavorites.pushObjects(data._payload);\n                    }\n                    return data;\n                })\n                .then(data => {\n                    if (type === 'group') {\n                        return this._handleHiddenGroups(data);\n                    }\n                });\n            return promise;\n        } else if (type === 'room') {\n            // We skip the store because Chat Room's are not ember-data entities\n            return this._findRoomFavorites().then(rooms => {\n                if (rooms && Array.isArray(rooms)) {\n                    rooms.forEach(room => {\n                        room.set('isFavorite', true);\n                    });\n                }\n\n                return rooms;\n            });\n        }\n    },\n\n    setFavorites(people, groups, rooms) {\n        const favorites = _.chain([])\n            .concat(people, groups, rooms)\n            .compact()\n            .uniq(false, x => x.get('id'))\n            .value();\n        this.set('_favorites', favorites);\n\n        favorites.forEach(entity => {\n            entity.set('isFavorite', true);\n        });\n    },\n\n    async favoriteEntityById(entityType, id) {\n        const entity = await this.store.findRecord(entityType, id);\n        return this.favoriteEntity(entity);\n    },\n\n    async unFavoriteEntityById(entityType, id) {\n        const entity = await this.store.findRecord(entityType, id);\n        return this.unfavoriteEntity(entity);\n    },\n\n    async updateFavoritesArrayOnFavorite(entity, res) {\n        const { chat } = this;\n        this._favorites.addObject(entity);\n        if (res) {\n            this._rawFavorites.addObject(res);\n        }\n        entity.set('isFavorite', true);\n        if (chat.get('enabled') && entity.get('jid')) {\n            const room = await chat.getChatRoom(entity.get('jid'));\n            room.set('isFavorite', true);\n            this.roster.addRoomToFavorites(room);\n        }\n\n        // trigger event that can be picked up by frame-router and sent to any iframe clients\n        this.trigger('favoriteChange', {\n            entityId: entity.get('id'),\n            favoriteStatus: true,\n            data: res,\n            action: 'Favorited',\n            jid: entity.get('jid')\n        });\n    },\n\n    async updateFavoritesArrayOnUnfavorite(entity, deleteId) {\n        const { chat } = this;\n        const _id = entity.get('id') || entity.get('jid');\n        this._favorites.removeObject(entity);\n\n        const favorite = this._rawFavorites.findBy('favoriteId', _id);\n        if (favorite) {\n            this._rawFavorites.removeObject(favorite);\n        }\n\n        entity.set('isFavorite', false);\n        if (chat.get('enabled') && entity.get('jid')) {\n            const room = await chat.getChatRoom(entity.get('jid'));\n            if (room) {\n                room.set('isFavorite', false);\n                this.roster.removeRoomFromFavorites(room);\n            }\n        }\n\n        // trigger event that can be picked up by frame-router and sent to any iframe clients\n        this.trigger('favoriteChange', {\n            entityId: _id,\n            favoriteStatus: false,\n            action: 'Unfavorited',\n            deleteId: deleteId,\n            jid: entity.get('jid')\n        });\n    },\n\n    favoriteEntity(entity) {\n        const { application, chat } = this;\n        const userId = this.get('session.person.id');\n        const _id = entity.get('id') || entity.get('jid');\n        const version = this.apiVersion;\n        let entityType = entity.get('type');\n\n        const url = application.uri([`api/${version}/people`, userId, 'favorites']);\n        ajax(url, {\n            type: 'post',\n            dataType: 'json',\n            data: JSON.stringify({ _id, entityType })\n        })\n            .then(({ res }) => {\n                this._favorites.addObject(entity);\n                if (res) {\n                    this._rawFavorites.addObject(res);\n                }\n                entity.set('isFavorite', true);\n                if (this.get('chat.enabled') && entity.get('jid')) {\n                    chat.getChatRoom(entity.get('jid')).then(room => {\n                        room.set('isFavorite', true);\n                        this.roster.addRoomToFavorites(room);\n                    });\n                }\n\n                // trigger event that can be picked up by frame-router and sent to any iframe clients\n                this.trigger('favoriteChange', {\n                    entityId: _id,\n                    favoriteStatus: true,\n                    data: res,\n                    action: 'Favorited',\n                    jid: entity.get('jid')\n                });\n\n                return entity;\n            })\n            .catch(({ errors: [error] }) => {\n                const intl = this.intl;\n                const title = intl.safestring('notification.favorites.notificationTitle').toString();\n\n                const message =\n                    error && get(error, 'detail.payload.code') === 'INSUFFICIENT_PERMISSIONS'\n                        ? intl.safestring('notification.favorites.notAMemberError').toString()\n                        : intl.safestring('notification.favorites.favoriteFailed').toString();\n\n                this.notification.error(title, message);\n            });\n    },\n\n    unfavoriteEntity(entity) {\n        const { application, chat } = this;\n        const userId = this.get('session.person.id');\n        const _id = this.getFavoriteId(entity);\n        const entityType = entity.get('type');\n        const version = this.apiVersion;\n\n        const url = application.uri([`api/${version}/people`, userId, 'favorites', _id]) + `?entityType=${entityType}`;\n        return ajax(url, {\n            type: 'delete',\n            dataType: 'json'\n        })\n            .then(() => {\n                this._favorites.removeObject(entity);\n\n                let favorite = this._rawFavorites.findBy('favoriteId', _id);\n                if (!favorite) {\n                    favorite = this._rawFavorites.findBy('_id', _id);\n                }\n                if (favorite) {\n                    this._rawFavorites.removeObject(favorite);\n                }\n                entity.set('isFavorite', false);\n                if (this.get('chat.enabled') && entity.get('jid')) {\n                    chat.getChatRoom(entity.get('jid')).then(room => {\n                        room.set('isFavorite', false);\n                        this.roster.removeRoomFromFavorites(room);\n                    });\n                }\n\n                // trigger event that can be picked up by frame-router and sent to any iframe clients\n                this.trigger('favoriteChange', {\n                    entityId: entity.get('id') || entity.get('jid'),\n                    favoriteStatus: false,\n                    action: 'Unfavorited',\n                    deleteId: _id,\n                    jid: entity.get('jid')\n                });\n\n                return entity;\n            })\n            .catch(() => {\n                const intl = this.intl;\n                this.notification.error(\n                    intl.safestring('notification.favorites.notificationTitle').toString(),\n                    intl.safestring('notification.favorites.unfavoriteFailed').toString(),\n                    {\n                        icon: `${application.get('urlprefix')}assets/images/icons/png/close-circled.png`\n                    }\n                );\n            });\n    },\n\n    toggleFavorite(entity) {\n        if (entity.get('isFavorite')) {\n            this.unfavoriteEntity(entity);\n        } else {\n            this.favoriteEntity(entity);\n        }\n    },\n\n    getFavoriteId(entity) {\n        const type = entity.get('type');\n\n        let guid = entity.get('guid');\n        let id = entity.get('id');\n        if (type === 'room') {\n            guid = entity.get('jid');\n        }\n\n        let favorite;\n        if (!!guid) {\n            favorite = this._rawFavorites.findBy('favoriteId', guid);\n        } else {\n            favorite = this._rawFavorites.findBy('entityId', id);\n        }\n\n        if (favorite) {\n            return favorite._id;\n        }\n\n        this.logger.error(`Could not get favorite with type: ${type}`);\n    },\n\n    async _findRoomFavorites() {\n        const userId = this.get('session.person.id');\n        const url = this.application.uri(['api/v3/people', userId, 'favorites']);\n        const data = {\n            entityType: 'room',\n            offset: 0\n        };\n        const favJids = await this._findRoomFavoritesRecursively(url, data);\n        const promises = favJids.map(jid => this.chat.getChatRoom(jid));\n        return all(promises);\n    },\n\n    /**\n     * The api call has a record limit of 50, so we need to recursively make the call if\n     * there are over 50 favorited personal group rooms.\n     */\n    async _findRoomFavoritesRecursively(url, data) {\n        try {\n            const { res: records, count, limit, offset } = await this.ajax.request(url, { data });\n            this._rawFavorites.pushObjects(records);\n            const favJids = records.mapBy('favoriteId');\n            if (limit + offset >= count) {\n                return favJids;\n            }\n            data.offset += limit;\n            const recursiveFavJids = await this._findRoomFavoritesRecursively(url, data);\n            return [...favJids, ...recursiveFavJids];\n        } catch (err) {\n            this.logger.error('Unable to compile favorited private rooms recursively', err);\n            return [];\n        }\n    },\n\n    _handleHiddenGroups(models) {\n        const loadedIds = [...models.mapBy('entityId'), ...models.mapBy('guid'), ...models.mapBy('_id')].filter(\n            id => !!id\n        );\n        const payload = models._payload;\n        _.forEach(payload, object => {\n            const id = object.entityId;\n            const guid = object.favoriteId;\n            if (!_.includes(loadedIds, id)) {\n                // group wasn't loaded due to permissions\n                const placeholder = this.store.push({\n                    data: {\n                        type: 'group',\n                        id: guid,\n                        attributes: {\n                            guid: guid,\n                            _id: id,\n                            general: {\n                                name: []\n                            }\n                        }\n                    }\n                });\n\n                this.logger.info('Favorites: Adding placeholder', { id, guid });\n\n                models.pushObject(placeholder);\n            }\n        });\n\n        return models;\n    }\n});\n","/* globals moment */\nimport { getOwner } from '@ember/application';\n\nimport { later } from '@ember/runloop';\nimport { alias, reads } from '@ember/object/computed';\nimport EmberObject, { observer, computed } from '@ember/object';\nimport Service, { inject as service } from '@ember/service';\nimport { on } from '@ember/object/evented';\nimport Ember from 'ember';\nimport _ from 'lodash';\nimport { task, timeout } from 'ember-concurrency';\nimport { setInteractionModelMetadata } from '../utils/acd';\n\nconst DISCONNECT_TIMEOUT = 300000; // = 5 mins * 1000ms * 60s\n\nfunction maybeLowerCase(str) {\n    return str && str.toLowerCase();\n}\n\n// TODO: move this to an actual model, maybe\nlet FaxModel = EmberObject.extend({\n    _currentUser: null,\n    participants: [],\n\n    intl: service(),\n    addressformat: service(),\n\n    myself: computed('participants.[]', '_currentUser', function () {\n        return _.head(\n            this.participants.filter(item => {\n                return item.userId === this._currentUser;\n            })\n        );\n    }),\n    faxStatus: reads('myself.calls.firstObject.faxStatus'),\n    state: computed('myself.calls.firstObject.state', 'participants', function () {\n        if (this.get('participants.length') === 0) {\n            return 'UPLOADING';\n        } else {\n            return this.get('myself.calls.firstObject.state');\n        }\n    }),\n    errorInfo: computed('state', function () {\n        const state = this.state;\n\n        if (\n            (maybeLowerCase(state) === 'disconnected' || maybeLowerCase(state) === 'terminated') &&\n            this.get('myself.calls.firstObject.errorInfo') !== undefined\n        ) {\n            return this.get('myself.calls.firstObject.errorInfo');\n        }\n    }),\n    connectedTime: computed('state', function () {\n        const state = this.state;\n\n        if (maybeLowerCase(state) === 'disconnected' || maybeLowerCase(state) === 'terminated') {\n            return moment(this.get('myself.connectedTime'));\n        }\n    }),\n    endTime: computed('state', function () {\n        const state = this.state;\n\n        if (maybeLowerCase(state) === 'disconnected' || maybeLowerCase(state) === 'terminated') {\n            return moment(this.get('myself.endTime'));\n        }\n    }),\n    otherParties: computed('participants.[]', function () {\n        return _.filter(this.participants, participant => {\n            return participant.userId !== this.get('myself.userId') && participant.purpose === 'fax';\n        });\n    }),\n    receiverDisplayName: computed('otherParties.[]', '_phoneNumber', 'internalUserName', function () {\n        return this.internalUserName || this.addressformat.formatAddressForDisplay(this._phoneNumber);\n    }),\n    internalUserName: null,\n    hasFaxFailed: computed('state', function () {\n        return this.errorInfo !== undefined;\n    }),\n    fileName: null,\n    documentId: null\n});\n\nconst _isConversationFax = function (conversation) {\n    const isPurposeFax = _.find(conversation.participants, function (participant) {\n        return participant.purpose === 'fax';\n    });\n    // if no participants have purpose = fax and the _purpose isn't fax, just return\n    if (isPurposeFax === undefined && conversation._purpose !== 'fax') {\n        return false;\n    } else {\n        return true;\n    }\n};\n\nexport default Service.extend({\n    application: service(),\n    session: service(),\n    permissions: service(),\n    pigeon: service(),\n    store: service(),\n    intl: service(),\n    notification: service(),\n    ajax: service(),\n    fileUpload: service(),\n\n    activeFaxes: [],\n    value: null,\n    address: alias('value'),\n\n    documentData: null,\n    isSelectingDocument: false,\n\n    locale: reads('intl.isoLocale'),\n    user: reads('session.publicApiUser'),\n    faxOutbound: reads('permissions.canFax'),\n\n    subcribeToFaxTopic: on(\n        'init',\n        observer('user.guid', 'faxOutbound', function () {\n            const guid = this.get('user.guid');\n            if (guid && this.faxOutbound) {\n                const faxTopic = `v2.users.${guid}.conversations`;\n                this.pigeon.registerPriorityTopic(faxTopic);\n                this.getActiveFaxes();\n            }\n        })\n    ),\n\n    registerMessageEvents: on('init', function () {\n        this.pigeon.on('my-conversations', this, this.updateActiveFaxes);\n        this.pigeon.on('connect', this, function () {\n            this.getActiveFaxes();\n        });\n    }),\n\n    _debouncedFetchFaxes: task(function* (debounce = 2000) {\n        yield timeout(debounce);\n\n        const url = this.application.pcV2Uri('api/v2/conversations') + '?communicationType=Call';\n        this.ajax\n            .ajaxGet(url)\n            .then(response => {\n                _.each(response.entities, conversation => {\n                    this.updateActiveFaxes(conversation);\n                });\n            })\n            .catch(function (jqXHR) {\n                console.warn('Failed to fetch active conversations:', {\n                    remoteData: {\n                        url\n                    }\n                });\n                Ember.onerror(jqXHR);\n            });\n    }).drop(),\n\n    getActiveFaxes() {\n        if (this.get('session.isAuthenticated') && this.faxOutbound) {\n            this._debouncedFetchFaxes.perform();\n        }\n    },\n\n    removeAfterDisconnect(conversation) {\n        const conversationInActiveFaxes = _.find(this.activeFaxes, function (item) {\n            const itemState = item.get('state');\n\n            const hasSameId = conversation && conversation.id === item.id;\n            const itemIsDisconnected =\n                maybeLowerCase(itemState) === 'disconnected' || maybeLowerCase(itemState) === 'terminated';\n\n            return hasSameId && itemIsDisconnected;\n        });\n        if (conversationInActiveFaxes) {\n            this.activeFaxes.removeObject(conversationInActiveFaxes);\n        }\n    },\n\n    setInternalReceiverAddress(conversation) {\n        const otherParty = conversation.get('otherParties.firstObject');\n\n        //if internal fax try to get users name\n        if (otherParty && !_.isEmpty(otherParty.userId)) {\n            //if we have the user'd id lets show their name.\n            this.store.find('person', otherParty.userId).then(function (person) {\n                conversation.set('internalUserName', person.get('name'));\n            });\n        } else {\n            conversation.set('internalUserName', null);\n        }\n    },\n\n    showCompletedNotification(conversation) {\n        const intl = this.intl;\n        if (!conversation.get('fileName') && !conversation.get('receiverDisplayName')) {\n            return; // This fax was sent in another client\n        }\n        if (conversation.get('hasFaxFailed')) {\n            const title = intl.safestring('purecloud.fax.status.failed').toString();\n            const message = intl.t('purecloud.fax.status.failedMessage', {\n                fileName: conversation.get('fileName'),\n                receiver: conversation.get('receiverDisplayName')\n            });\n            this.notification.error(title, message, { tag: 'fax-completed' });\n        } else {\n            const title = intl.safestring('purecloud.fax.status.successful').toString();\n            const message = intl.t('purecloud.fax.status.successfulMessage', {\n                fileName: conversation.get('fileName'),\n                receiver: conversation.get('receiverDisplayName')\n            });\n            this.notification.info(title, message, { tag: 'fax-completed' });\n        }\n    },\n\n    updateActiveFaxes(conversation) {\n        if (_isConversationFax(conversation)) {\n            const conversationClone = _.cloneDeep(conversation);\n            const conversationInActiveFaxes = _.find(this.activeFaxes, function (item) {\n                return conversation.id === item.id;\n            });\n            if (conversation._faxAddress) {\n                conversation._phoneNumber = conversation._faxAddress;\n            }\n            if (conversationInActiveFaxes) {\n                conversation._currentUser = this.get('user.id');\n                conversationInActiveFaxes.setProperties(conversation);\n                setInteractionModelMetadata(conversationInActiveFaxes, conversationClone);\n\n                this.setInternalReceiverAddress(conversationInActiveFaxes);\n                const state = conversationInActiveFaxes.get('state');\n\n                if (maybeLowerCase(state) === 'disconnected' || maybeLowerCase(state) === 'terminated') {\n                    this.showCompletedNotification(conversationInActiveFaxes);\n                    later(\n                        this,\n                        function () {\n                            this.activeFaxes.removeObject(conversationInActiveFaxes);\n                        },\n                        10000\n                    );\n                }\n            } else {\n                conversation._currentUser = this.get('user.id');\n                conversation.startTime = conversation.startTime || moment().toISOString();\n                let owner = getOwner(this);\n                const faxObject = FaxModel.create(owner.ownerInjection(), conversation);\n                setInteractionModelMetadata(faxObject, conversationClone);\n                this.activeFaxes.pushObject(faxObject);\n            }\n\n            this._debouncedRemoveAfterDisconnect.perform(conversation);\n        }\n    },\n\n    _debouncedRemoveAfterDisconnect: task(function* (conversation) {\n        yield timeout(DISCONNECT_TIMEOUT);\n        this.removeAfterDisconnect(conversation);\n    }).drop(),\n\n    /**\n     * Makes the initial call to fax service to get the uploadDestinationUri\n     */\n    makeFaxRequest(addresses, fileName, documentId, contentType, coverSheet) {\n        const timeZoneOffsetMinutes = moment().utcOffset();\n        const includeCoverSheet = coverSheet !== null && coverSheet !== undefined;\n        const data = {\n            addresses: addresses,\n            documentId: documentId,\n            contentType: contentType,\n            name: fileName,\n            timeZoneOffsetMinutes: timeZoneOffsetMinutes\n        };\n        if (includeCoverSheet) {\n            data.coverSheet = {\n                notes: coverSheet,\n                locale: this.locale\n            };\n        }\n        const url = this.application.pcV2Uri('api/v2/conversations/faxes');\n        return this.ajax.post(url, { data });\n    },\n\n    getUploadUri(uri) {\n        // Upload to relative Url\n        return uri.replace(/https:\\/\\/apps\\..*?\\.com\\//, '/');\n    },\n\n    /**\n     * Uploads the files to the uploadDestinationUri. Needs a faxId and FormData object\n     */\n    makeUploadRequest(uploadUri, faxForm) {\n        uploadUri = this.getUploadUri(uploadUri);\n        return this.fileUpload.upload(uploadUri, faxForm);\n    },\n\n    makeUploadRequestWithHeaders(uploadUri, faxForm, headers) {\n        uploadUri = this.getUploadUri(uploadUri);\n        return this.fileUpload.faxUploadWithHeaders(uploadUri, faxForm, headers);\n    }\n});\n","import { getOwner } from '@ember/application';\nimport { A } from '@ember/array';\nimport { assign } from '@ember/polyfills';\nimport { later } from '@ember/runloop';\nimport Service, { inject as service } from '@ember/service';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport RSVP from 'rsvp';\n\nexport default Service.extend(LoggerMixin, {\n    ajax: service(),\n\n    _endpointBaseUrl: '/platform/api/v2/featuretoggles',\n\n    _urlMaxLength: 2000,\n\n    _features: {},\n\n    _pending: [],\n\n    _pendingRequest: null,\n\n    _pendingOrgRequest: null,\n\n    init() {\n        this._super(...arguments);\n\n        this.setProperties({\n            _features: {},\n            _pending: []\n        });\n\n        try {\n            const config = getOwner(this).resolveRegistration('config:environment');\n            if (config && config.APP && config.APP.FEATURE_TOGGLE_OVERRIDES) {\n                this.set('_overrides', config.APP.FEATURE_TOGGLE_OVERRIDES);\n            } else {\n                this.set('_overrides', {});\n            }\n        } catch (e) {\n            this.set('_overrides', {});\n        }\n    },\n\n    // request values for the specified feature toggles. returns a promise resolving to the full set of feature toggles we know about so far.\n    getFeatureToggles(/* ...requestedFeatures, forceRequest */) {\n        let makeRequest = false;\n        let _features = this._features;\n        let _pending = this._pending;\n        let _overrides = this._overrides;\n\n        let args = A(Array.prototype.slice.call(arguments));\n        let forceRequest = args.get('lastObject');\n\n        if (typeof forceRequest === 'boolean') {\n            makeRequest = forceRequest;\n            args.removeAt(args.length - 1);\n        } else {\n            forceRequest = false;\n        }\n\n        args.forEach(feature => {\n            if (typeof _features[feature] === 'undefined' || forceRequest) {\n                makeRequest = true;\n                _pending.push(feature);\n            }\n        });\n\n        let awaitAllRequestedToggles = null;\n\n        if (!makeRequest) {\n            // no features requested that we don't already know about or require cache busting\n            awaitAllRequestedToggles = RSVP.resolve();\n        } else {\n            // new features or cache bust requested so lets queue them and kick it off.\n            awaitAllRequestedToggles = this._batchRequest();\n        }\n\n        return awaitAllRequestedToggles.then(() => {\n            if (Object.keys(_overrides).length > 0) {\n                this.logger.warn('Running with feature toggle overrides:', {\n                    _overrides\n                });\n            }\n            // return a copy of the internal feature data so callers cannot corrupt the internal state\n            return assign({}, this._features, _overrides);\n        });\n    },\n\n    wrapPlatformPath(path) {\n        let applicationService = getOwner(this).lookup('service:application');\n        if (\n            !applicationService ||\n            typeof applicationService !== 'object' ||\n            typeof applicationService.pcV2Uri !== 'function'\n        ) {\n            this.logger.warn('application service does not exist or the pcV2Uri function does not exist');\n            return path;\n        }\n        // if application service exists then strip away leading slash\n        path = path.substring(1);\n        return applicationService.pcV2Uri(path);\n    },\n\n    _batchRequest() {\n        return new RSVP.Promise((resolve, reject) => {\n            // run on next pass so that we batch up api calls without significant hit on response time.\n            later(() => {\n                if (this.isDestroying || this.isDestroyed) {\n                    reject('Service has been destroyed.');\n                    return;\n                }\n\n                let pending = this._pending;\n\n                if (!pending.length) {\n                    return resolve(this._pendingRequest); // if _pendingRequest exists then won't resolve until THAT resolves.\n                }\n\n                this.set('_pending', []);\n\n                this.set(\n                    '_pendingRequest',\n                    this._fetch(pending)\n                        .then(result => {\n                            this.set('_features', Object.assign({}, this._features, result.toggles));\n                            let allKnownFeatures = this._features;\n                            resolve(allKnownFeatures); // resolve the initial _batchRequest Promise\n                            return allKnownFeatures; // resolve the _pendingRequest promise for any batched requests waiting on it\n                        })\n                        .catch(failure => {\n                            if (failure.toggles) {\n                                // Add any successful fetches to the cache so we don't have to refetch\n                                this.set('_features', Object.assign({}, this._features, failure.toggles));\n                            }\n                            reject(failure.fetchFailureReason);\n                        })\n                );\n            }, 0);\n        });\n    },\n\n    _fetch(toggles) {\n        let url = `${this._endpointBaseUrl}?feature=${toggles.join('&feature=')}`;\n        // if the url is larger than browsers support then use divide and conquer to split it into multiple requests\n        if (url.length > this._urlMaxLength) {\n            let half = toggles.splice(0, Math.floor(toggles.length / 2));\n            // this won't resolve until both run() calls resolve. If either of those also gets split then this won't resolve until THOSE resolve, ad infinitum.\n            return RSVP.allSettled([this._fetch(half), this._fetch(toggles)]).then(allResults => {\n                let result = {\n                    fetchFailureReason: null,\n                    toggles: {}\n                };\n\n                allResults.forEach(currResult => {\n                    if (currResult.state === 'fulfilled') {\n                        assign(result.toggles, currResult.value.toggles);\n                    } else {\n                        // Add toggles from partially successful nested bisects\n                        if (currResult.reason.toggles) {\n                            assign(result.toggles, currResult.reason.toggles);\n                        }\n\n                        if (result.fetchFailureReason === null) {\n                            // Maintaining backwards compatability by returning the first network failure\n                            // NEXTMAJOR: Just reject with 'fetchFailed' or an array of reasons (without network details)\n                            result.fetchFailureReason = currResult.reason.fetchFailureReason;\n                        }\n                    }\n                });\n\n                return !result.fetchFailureReason ? result : RSVP.reject(result);\n            });\n        }\n\n        return this.ajax\n            .request(this.wrapPlatformPath(url))\n            .then(response => {\n                return {\n                    toggles: response\n                };\n            })\n            .catch(fetchFailureReason => {\n                return RSVP.reject({\n                    fetchFailureReason,\n                    toggles: null\n                });\n            });\n    }\n});\n","import { alias } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport AjaxService from 'ember-ajax/services/ajax';\n\nexport default AjaxService.extend({\n    application: service(),\n    ajax: service(),\n\n    trustedHosts: alias('ajax.trustedHosts'),\n\n    upload(uri, formData) {\n        return this.raw(uri, {\n            contentType: false,\n            processData: false,\n            data: formData,\n            method: 'POST'\n        });\n    },\n\n    /**\n     * Fax upload using provided headers. This will use the Darth service for upload.\n     * @param {*} uri\n     * @param {*} formData\n     * @param {*} headers\n     * @returns\n     */\n    faxUploadWithHeaders(uri, formData, headers) {\n        const file = formData.get('file');\n        if (file) {\n            return this.raw(uri, {\n                contentType: false,\n                processData: false,\n                // darth upload doesn't like the form data object for all file types\n                // using the raw file appears to work consistently\n                data: file,\n                method: 'PUT',\n                headers,\n                dataType: 'text' // fax upload will have an empty response\n            });\n        } else {\n            console.error('<file-upload/faxUploadWithHeaders> file is undefined!');\n        }\n    }\n});\n","import { run } from '@ember/runloop';\nimport Evented from '@ember/object/evented';\nimport Service, { inject as service } from '@ember/service';\n\nexport default Service.extend(Evented, {\n    session: service(),\n\n    isFullScreen: false,\n\n    handleFullScreenChange: function () {\n        run(() => {\n            if (!this.isDestroyed && !this.isDestroying) {\n                let fullScreen = document.webkitIsFullScreen || document.mozFullScreen || document.msFullscreenElement;\n                this.set('isFullScreen', !!fullScreen);\n\n                if (!this.isFullScreen) {\n                    this.endFullScreen();\n                }\n            }\n        });\n    },\n\n    init() {\n        this._super(...arguments);\n        this._boundHandleFullScreenChange = this.handleFullScreenChange.bind(this);\n        document.addEventListener('webkitfullscreenchange', this._boundHandleFullScreenChange);\n        document.addEventListener('fullscreenchange', this._boundHandleFullScreenChange);\n        document.addEventListener('mozfullscreenchange', this._boundHandleFullScreenChange);\n        document.addEventListener('MSFullscreenChange', this._boundHandleFullScreenChange);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        document.removeEventListener('webkitfullscreenchange', this._boundHandleFullScreenChange);\n        document.removeEventListener('fullscreenchange', this._boundHandleFullScreenChange);\n        document.removeEventListener('mozfullscreenchange', this._boundHandleFullScreenChange);\n        document.removeEventListener('MSFullscreenChange', this._boundHandleFullScreenChange);\n    },\n\n    startFullScreen(isAcd = false, requestingElem) {\n        // Ensure messengerElement is under orgspan-app element to support toast notification while in fullscreen\n        const messengerElement = document.querySelector('ul.messenger');\n        const orgspanApp = document.querySelector('.orgspan-app');\n        if (messengerElement && orgspanApp && !orgspanApp.contains(messengerElement)) {\n            orgspanApp.appendChild(messengerElement);\n        }\n\n        const hostedContext = this.get('applicationService.hostedContext');\n        if (hostedContext && hostedContext.isHosted()) {\n            orgspanApp && orgspanApp.classList.add('hosted-fullscreen');\n        } else {\n            const elem = requestingElem\n                ? typeof requestingElem === 'string'\n                    ? document.querySelector(requestingElem)\n                    : requestingElem\n                : orgspanApp;\n            const requestFullscreen =\n                elem.requestFullscreen ||\n                elem.webkitRequestFullscreen ||\n                elem.mozRequestFullScreen ||\n                elem.msRequestFullscreen;\n            requestFullscreen.apply(elem);\n        }\n\n        if (orgspanApp) {\n            if (!isAcd) {\n                orgspanApp.classList.remove('fullscreen-v1');\n                orgspanApp.classList.add('fullscreen-v2');\n            } else {\n                orgspanApp.classList.remove('fullscreen-v2');\n                orgspanApp.classList.add('fullscreen-v1');\n            }\n        }\n\n        this.trigger('startFullscreen');\n    },\n\n    endFullScreen() {\n        const hostedContext = this.get('applicationService.hostedContext');\n        if (hostedContext && hostedContext.isHosted()) {\n            const orgspanApp = document.querySelector('.orgspan-app');\n            orgspanApp && orgspanApp.classList.remove('hosted-fullscreen');\n        } else {\n            const exitFullscreen =\n                document.exitFullscreen ||\n                document.webkitExitFullscreen ||\n                document.webkitExitFullscreen ||\n                document.mozCancelFullScreen ||\n                window.msExitFullscreen;\n            const ret = exitFullscreen.apply(document);\n            if (ret && ret.catch) {\n                ret.catch(() => {});\n            }\n        }\n\n        this.trigger('endFullscreen');\n    }\n});\n","import { observer } from '@ember/object';\nimport { reads, and } from '@ember/object/computed';\nimport Service, { inject as service } from '@ember/service';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport geoUtil from '../utils/geolocation';\nimport uuid from '../utils/uuid';\nimport { task } from 'ember-concurrency';\nimport moment from '../utils/dates';\n\nconst REPORT_FREQUENCY_IN_MINUTES = 60;\n\nexport default Service.extend(LoggerMixin, {\n    currentPosition: {},\n    store: service(),\n    session: service(),\n    preferences: service(),\n    application: service(),\n    streaming: service(),\n    geoUtil,\n    uuid: uuid,\n\n    isEnabled: reads('isSwitchedOn'),\n    isSwitchedOn: false,\n\n    intervalReference: null,\n    isStarted: and('geoWatchId', 'intervalReference'),\n\n    init() {\n        this._super(...arguments);\n        let context = this.get('application.hostedContext');\n        if (context && context.isHosted()) {\n            this._desktopStart.perform();\n        } else {\n            this.start.perform();\n        }\n\n        this.geoUtil.setContext(context);\n    },\n\n    _lastReport: null,\n    report: observer('isSwitchedOn', 'streaming.connected', 'clientId', function () {\n        this.logger.debug(`GEOLOCATION: report observer fired`);\n        if (!this.isSwitchedOn || !this.get('streaming.connected')) {\n            return;\n        }\n        const lastReport = this._lastReport;\n        if (lastReport && moment().diff(lastReport, 'minutes') < REPORT_FREQUENCY_IN_MINUTES) {\n            return;\n        }\n        const clientId = this.clientId;\n        if (!clientId) {\n            return;\n        }\n        if (!this.geoUtil.isGeolocationAvailable()) {\n            this.logger.debug('GEOLOCATION: Not available');\n            return;\n        }\n        this.logger.debug(`GEOLOCATION: report observer triggering geo report`);\n        this.set('_lastReport', moment());\n        this._reportCurrentPosition.perform(clientId);\n    }),\n\n    _desktopStart: task(function* () {\n        this.logger.debug('GEOLOCATION: Using desktop start');\n        let prefs = yield this.get('application.hostedContext').requestDesktopPromise({\n            cmd: 'getPreferences',\n            prefs: ['permission_geolocation']\n        });\n        if (prefs.permission_geolocation) {\n            this.logger.debug('GEOLOCATION: desktop preference on');\n            this.start.perform();\n        } else {\n            this.logger.debug('GEOLOCATION: desktop preference off', prefs);\n            try {\n                let result = yield this.store.findRecord('geolocation-settings', '1');\n                this.logger.debug(`GEOLOCATION: Got settings result`, result);\n                if (result.get('enabled')) {\n                    this.logger.debug(`GEOLOCATION: geolocation admin setting is enabled for this org`);\n                    this.set('isSwitchedOn', true);\n                }\n            } catch (e) {\n                this.logger.error('failed to get information about geolocation for this client', { error: e });\n            }\n        }\n    }),\n\n    start: task(function* () {\n        if (this.get('session.user.isTrustee') || this.get('session.user.isSuper')) {\n            return;\n        }\n\n        try {\n            let result = yield this.store.findRecord('geolocation-settings', '1');\n            this.logger.debug(`GEOLOCATION: Got settings result`, result);\n            if (!result.get('enabled')) {\n                return;\n            }\n            this.logger.debug(`GEOLOCATION: geolocation admin setting is enabled for this org`);\n\n            let clientId = yield this.preferences.getPreference('geolocation.clientId');\n            this.logger.debug(`GEOLOCATION: client id is ${clientId}`);\n            if (!clientId) {\n                clientId = this.uuid.generate();\n                try {\n                    yield this.preferences.setPreference('geolocation.clientId', clientId, false);\n                    this.logger.debug('GEOLOCATION: client ID saved to preferences, start monitoring');\n                } catch (e) {\n                    this.logger.error(\n                        'GEOLOCATION: client id could not be saved locally.  Not sending geolocation...',\n                        e\n                    );\n                    return;\n                }\n            }\n\n            // will trip observer and report current position\n            this.setProperties({\n                isSwitchedOn: true,\n                clientId\n            });\n        } catch (e) {\n            this.logger.error('failed to get information about geolocation for this client', { error: e });\n        }\n    }),\n\n    _reportCurrentPosition: task(function* (clientId) {\n        let position = yield this.geoUtil.fetchCurrentPostion();\n        this.logger.debug('GEOLOCATION: checking if primary');\n        this.logger.debug('GEOLOCATION: session geolocation', this.get('session.publicApiUser.geolocation'));\n        try {\n            yield this.session.refreshPublicApiUser('geolocation');\n            this.logger.debug('GEOLOCATION: refreshed logged in user', this.get('session.publicApiUser'));\n            let primary = this._isPrimary();\n            this.logger.debug('GEOLOCATION: reporting position to server', position, clientId);\n            let resultPosition = this.store.push({\n                data: {\n                    type: 'geolocation',\n                    attributes: {\n                        primary,\n                        id: clientId,\n                        latitude: position.coords.latitude,\n                        longitude: position.coords.longitude,\n                        type: 'web'\n                    },\n                    id: clientId\n                }\n            });\n            yield resultPosition.save();\n            this.set('currentPosition', position);\n            this._onPositionSaved(position);\n        } catch (e) {\n            this._onErrorSavingPosition(e);\n        }\n    }),\n\n    _isPrimary() {\n        let isPrimary =\n            !this.get('session.publicApiUser.geolocation.type') ||\n            (this.get('session.publicApiUser.geolocation.type') !== 'ios' &&\n                this.get('session.publicApiUser.geolocation.type') !== 'android');\n        this.logger.debug('GEOLOCATION: is primary: ', isPrimary);\n        return isPrimary;\n    },\n\n    _onPositionSaved(position) {\n        this.logger.debug('GEOLOCATION: position saved', position);\n    },\n\n    _onErrorSavingPosition(e) {\n        // 405 for the geolocation api means its turned off thru admin for this org\n        if (e.code === 405) {\n            this.set('isSwitchedOn', false);\n            this.logger.debug('GEOLOCATION: Geolocation services are disabled for this org');\n        } else {\n            // In the case of another geolocation error, we assume that it is switched on, but unable\n            // to send from the browser.  In this case we want to still see other's and our own.\n            this.set('isSwitchedOn', true);\n            this.logger.error('GEOLOCATION: an error occurred saving current position', { error: e });\n        }\n    }\n});\n","import { debounce } from '@ember/runloop';\nimport { observer } from '@ember/object';\nimport Service, { inject as service } from '@ember/service';\nimport Evented from '@ember/object/evented';\nimport { addPageAction } from '../utils/newrelic';\n\nconst FULL_URL_REG_EXP = /^.*:\\/\\/.*$/;\nconst LOCALE_REDIRECT_REGEX = /\\/redirect\\/[^/]+\\//;\nconst HELP_PANEL_NAME = 'help';\nconst NO_OP = 'noop';\n\nexport const GENESYS_HELP_DOMAIN = 'help.genesys.cloud';\n\nexport default Service.extend(Evented, {\n    PC_HELP_FQDN: GENESYS_HELP_DOMAIN,\n    EVENT_NAMES: {\n        SHOW_RC_ARTIFACT: 'showRcArtifact',\n        OPEN_CONTEXTUAL_HELP: 'openContextualHelp'\n    },\n\n    session: service(),\n    sidebar: service(),\n    application: service(),\n    engage: service(),\n    relate: service(),\n    adminui: service(),\n    centerStageFrame: service(),\n    commandNav: service(),\n    intl: service(),\n\n    init() {\n        this._super(...arguments);\n        this.generateContextualHelpUrl();\n    },\n\n    previousContext: null,\n\n    route: '',\n    contextualHelpUrl: '#',\n    contextualHelpAnchor: undefined,\n\n    observeRoutes: observer(\n        'application.currentRouteName',\n        'sidebar.{communicationPanel,communicationSidebarExpanded}',\n        'engage.{isEngageActive,route,helpURL}',\n        'relate.{isRelateActive,route,helpURL}',\n        'adminui.currentRouteName',\n        'centerStageFrame.helpPath',\n        function () {\n            debounce(this, () => this.generateContextualHelpUrl(), 500);\n        }\n    ),\n\n    generateContextualHelpUrl() {\n        let locale = this.get('intl.isoLocale') || 'en-us';\n        let contextualHelpUrl = '#';\n\n        let route = this.get('application.currentRouteName');\n        let routePrefix = 'directory.';\n\n        if (this.get('sidebar.communicationSidebarExpanded')) {\n            const panel = this.get('sidebar.communicationPanel');\n\n            if (panel === 'help' && this.previousContext) {\n                contextualHelpUrl = this.previousContext;\n            }\n\n            // map expanded panels to redirect routes because they don't have application routes\n            if (panel === 'webrtc') {\n                route = 'videoPanel';\n            } else if (panel === 'conversations') {\n                route = 'chatPanel';\n            } else {\n                route = 'sidebarPanel';\n            }\n        } else if (this.get('engage.isEngageActive') && this.get('engage.route') !== NO_OP) {\n            if (this.get('engage.helpURL')) {\n                contextualHelpUrl = this.get('engage.helpURL');\n            }\n\n            route = this.get('engage.route');\n            routePrefix = '';\n        } else if (this.get('relate.isRelateActive') && this.get('relate.route') !== NO_OP) {\n            // deprecated with changeover to engine below.\n            routePrefix = 'directory.relate.';\n            route = this.get('relate.route');\n        } else if (route === 'admin') {\n            routePrefix = 'admin.';\n            route = this.get('adminui.currentRouteName').replace(/\\//g, '.');\n            route = route.replace(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/g, 'id'); // uuid\n            route = route.replace(/[0-9a-f]{24}/g, 'id'); // mongo id\n            route = route.replace(/[0-9a-f]{30}/g, 'id'); // bridge id\n            route = route.replace(/-[0-9a-zA-Z]+==-/g, 'id'); // connector id\n        } else if (route && route.startsWith('center-stage-frame-outbound.internal')) {\n            // Used for outbound-ui\n            routePrefix = '';\n            route = this.get('centerStageFrame.helpPath');\n        } else if (route && route.startsWith('center-stage-frame-quality.internal')) {\n            // used for Quality Admin pages\n            routePrefix = '';\n            route = this.get('centerStageFrame.helpPath');\n        } else if (route && route.startsWith('center-stage-frame-contentManagement.internal')) {\n            // used for Content Management pages\n            routePrefix = '';\n            route = this.get('centerStageFrame.helpPath');\n        } else if (route && route.startsWith('center-stage-frame-contentManagementAdmin.internal')) {\n            // used for Content Management Admin pages\n            routePrefix = '';\n            route = this.get('centerStageFrame.helpPath');\n        } else if (route && route.startsWith('center-stage-frame')) {\n            if (route.endsWith('messageRouting')) {\n                routePrefix = '';\n            }\n            route = this.get('centerStageFrame.helpPath');\n        } else {\n            // used for ember-engine-contacts. The route is\n            // passed back unchanged if there is no contacts engine relevant path.\n            route = this.relate.getEngineHelp(route);\n        }\n\n        if (!route) {\n            contextualHelpUrl = `https://${GENESYS_HELP_DOMAIN}`;\n        }\n\n        if (contextualHelpUrl === '#') {\n            contextualHelpUrl = `https://${GENESYS_HELP_DOMAIN}/redirect/${locale}/${routePrefix}${route}`;\n        }\n\n        contextualHelpUrl = contextualHelpUrl.replace(LOCALE_REDIRECT_REGEX, `/redirect/${locale}/`);\n\n        // PURE-6363, replace the legacy help domain\n        const transformedUrl = new URL(contextualHelpUrl);\n        transformedUrl.hostname = GENESYS_HELP_DOMAIN;\n        contextualHelpUrl = transformedUrl.toString();\n\n        const evtPayload = {\n            route,\n            routePrefix,\n            contextualHelpUrl\n        };\n        addPageAction('contextualHelpRouteChange', evtPayload);\n\n        this.set('route', route);\n        this.set('previousContext', contextualHelpUrl);\n        this.set('contextualHelpUrl', contextualHelpUrl);\n    },\n\n    /**\n     * Open the help panel and the Resource Center URL referenced by the relative path\n     *\n     * @param relPath A non-empty, relative path. Paths will be encoded.  Query parms\n     * are allowed but should be pre-encoded.  Hash params will be removed.\n     *\n     * @throws Error if the relPath is invalid:\n     * <ul>\n     *   <li>Empty (empty strings, empty paths and query strings)</li>\n     *   <li>Not a string</li>\n     *   <li>Leads with protocol</li>\n     *   <li>Path navigation</li>\n     * </ul>\n     */\n    showResourceCenterArtifact(relPath) {\n        let embededArtifactUrl = this.buildResourceCenterArtifactUrl(relPath);\n        let externalArtifactUrl = this.buildResourceCenterArtifactUrl(relPath, {\n            useSimplifiedTheme: false\n        });\n\n        if (this.get('session.useNewNav')) {\n            this.commandNav.selectPanel('help');\n        } else {\n            this.sidebar.openPanel(HELP_PANEL_NAME);\n        }\n\n        this.trigger(this.EVENT_NAMES.SHOW_RC_ARTIFACT, {\n            requestedRelPath: relPath,\n            externalArtifactUrl,\n            embededArtifactUrl\n        });\n    },\n\n    /**\n     * Open the help panel to the contextual help tab and navigate to an anchor\n     * on the page if provided.\n     *\n     * @param anchor A non-empty anchor to be added to the relative path or undefined.\n     */\n    openContextualHelpTab(anchor) {\n        if (this.get('session.useNewNav')) {\n            this.commandNav.selectPanel('help');\n        } else {\n            this.sidebar.openPanel(HELP_PANEL_NAME);\n        }\n\n        if (anchor) {\n            this.set('contextualHelpAnchor', anchor);\n        }\n        this.trigger(this.EVENT_NAMES.OPEN_CONTEXTUAL_HELP);\n    },\n\n    /**\n     * Build the absolute resource center url from the provided rel Path.\n     *\n     * @param relPath A non-empty, relative path. Paths will be encoded.  Query parms\n     * are allowed and should be encoded.  Hash params will be removed.\n     *\n     * @param options.useSimplifiedTheme boolean indicating if the simplified theme\n     * option should be added to the generated url; defaults to true\n     *\n     * @returns A full url to the resource center artifact. Paths will be encoded by this call.  Query parms\n     * are allowed but should be pre-encoded.  Hash params will be removed.\n     *\n     * @throws Error if the relPath is invalid:\n     * <ul>\n     *   <li>Empty (empty strings, empty paths and query strings)</li>\n     *   <li>Not a string</li>\n     *   <li>Leads with protocol</li>\n     *   <li>Path navigation</li>\n     * </ul>\n     */\n    buildResourceCenterArtifactUrl(relPath, { useSimplifiedTheme = true } = {}) {\n        if (!relPath || typeof relPath !== 'string' || relPath.trim().length === 0) {\n            throwBadRelPath(relPath, 'Empty relPath or invalid type');\n        }\n\n        let toCheck = relPath.trim();\n\n        if (toCheck.match(FULL_URL_REG_EXP)) {\n            throwBadRelPath(relPath, 'Full URL Attempted');\n        }\n\n        let path = '';\n        let query = null;\n\n        let hashIndex = toCheck.indexOf('#');\n        if (hashIndex >= 0) {\n            toCheck = toCheck.slice(0, hashIndex);\n        }\n\n        let queryIndex = toCheck.indexOf('?');\n        if (queryIndex >= 0) {\n            query = toCheck.slice(queryIndex + 1);\n            path = toCheck.slice(0, queryIndex);\n        } else {\n            path = toCheck;\n        }\n\n        if (path.length === 0 && !query) {\n            throwBadRelPath(relPath, 'Insufficient path');\n        } else if (path.length > 0) {\n            path = path\n                .split('/')\n                .map(pathSegment => {\n                    if (pathSegment === '.' || pathSegment === '..') {\n                        throwBadRelPath(relPath, 'Path Navigation Detected');\n                    }\n\n                    return encodeURIComponent(pathSegment);\n                })\n                .join('/');\n\n            if (path.charAt(0) !== '/') {\n                path = `/${path}`;\n            }\n        }\n\n        let result = `https://${this.PC_HELP_FQDN}${path}`;\n        if (query) {\n            result += `?${query}`;\n        }\n\n        if (useSimplifiedTheme) {\n            result += `${query ? '&' : '?'}theme=simplified`;\n        }\n\n        return result;\n    }\n});\n\nfunction throwBadRelPath(relPath, internalMsg) {\n    let err = new Error('service:help - Invalid Artifact Relative Path', relPath);\n    err.internalMsg = internalMsg;\n    throw err;\n}\n","import { get } from '@ember/object';\nimport { bind } from '@ember/runloop';\nimport Service from '@ember/service';\n\nexport default Service.extend({\n    _setup: false,\n    focused: false,\n    _focusHandler: null,\n    _blurHandler: null,\n\n    setupFocusListener() {\n        if (this._setup) {\n            return;\n        }\n\n        this.set('_setup', true);\n\n        const focusHandler = bind(this, () => {\n            if (this.isDestroyed || this.isDestroying) {\n                return;\n            }\n            this.set('focused', false);\n        });\n\n        const blurHandler = bind(this, () => {\n            if (!document || this.isDestroyed || this.isDestroying) {\n                return;\n            }\n            const nodeName = get(document, 'activeElement.nodeName');\n            if (nodeName && nodeName.toLowerCase() === 'iframe') {\n                this.set('focused', true);\n            }\n        });\n\n        this.set('_focusHandler', focusHandler);\n        this.set('_blurHandler', blurHandler);\n\n        window.addEventListener('focus', focusHandler);\n        window.addEventListener('blur', blurHandler);\n    },\n\n    teardownFocusListener() {\n        window.removeEventListener('focus', this._focusHandler);\n        window.removeEventListener('blur', this._blurHandler);\n\n        this.set('_focusHandler', null);\n        this.set('_blurHandler', null);\n        this.set('_setup', false);\n    }\n});\n","import { cancel, later, scheduleOnce } from '@ember/runloop';\nimport { A } from '@ember/array';\nimport { Promise, resolve, allSettled } from 'rsvp';\nimport EmberObject, { computed, observer, get, set } from '@ember/object';\nimport { reads, sort, readOnly } from '@ember/object/computed';\nimport Evented from '@ember/object/evented';\nimport Service, { inject as service } from '@ember/service';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport { ReportingAlertSummary } from 'web-directory/utils/reporting-alert-summary/reporting-alert-summary';\nimport TtlCache from 'web-directory/utils/ttl-cache';\nimport EvaluationsMixin from '../mixins/evaluations';\nimport FaxesMixin from '../mixins/faxes';\nimport CoachingNotificationModel from '../models/coaching-appointment';\nimport { task, timeout } from 'ember-concurrency';\nimport { batchEntityIds } from './store';\nimport { formatDateForDisplay, formatTimeForDisplay } from '../utils/date-time';\n\nconst MAX_GROUP_MAILBOX = 50;\nconst MAX_GROUP_MAILBOX_REQUESTS = 4;\n\n/**\n * The Inbox service talks to the APIs and handles the state of all things inbox:\n * - voicemails\n * - user Recordings\n * - evaluations\n * - faxes\n * - time off requests\n * - shift trade requests\n * - coaching appointments\n * - Learning Modules\n * - reporting exports\n */\n\nexport default Service.extend(Evented, FaxesMixin, EvaluationsMixin, {\n    session: service(),\n    pigeon: service(),\n    store: service(),\n    timeline: service(),\n    application: service(),\n    permissions: service(),\n    fax: service(),\n    intl: service(),\n    notification: service(),\n    engageanalytics: service(),\n    queueService: service('queue'),\n    wfm: service(),\n    streaming: service(),\n    coaching: service(),\n    learning: service(),\n    sidebar: service(),\n    addressformat: service(),\n    ajax: service(),\n    participantName: service(),\n    logger: service('stash-logger'),\n    cache: null,\n    inboxTabChoice: null,\n    voicemails: null,\n    cachedVoicemails: null,\n    recordings: null,\n    evaluations: null,\n    timeOffRequests: null,\n    shiftTradeRequests: null,\n    coachingAppointments: null,\n    coachingAttendees: null,\n    learningAssignments: null,\n    coachingTopicRegistered: false,\n    learningTopicRegistered: false,\n    faxes: null,\n    reportingExports: null,\n    adherenceExplanations: null,\n    exportExpirationSummary: null,\n\n    pageCount: 0,\n    pageNumber: 1,\n\n    recordingsPageCount: 0,\n    recordingsPageNumber: 1,\n\n    exportsPageCount: 0,\n    exportsPageNumber: 1,\n    exportsPageSize: 25,\n\n    alertsPageCount: 0,\n    alertsPageNumber: 1,\n    alertsPageSize: 25,\n\n    loadingPromise: null,\n\n    loading: {\n        voicemails: false,\n        recordings: false,\n        faxes: false,\n        evaluations: false,\n        notifications: false,\n        coachingAppointments: false,\n        coachingAttendees: false,\n        learningAssignments: false,\n        reportingExports: false\n    },\n\n    validChoices: {\n        voicemails: 'voicemails',\n        faxes: 'faxes',\n        recordings: 'recordings',\n        evaluations: 'evaluations',\n        timeOffRequests: 'timeOffRequests',\n        shiftTradeRequests: 'shiftTradeRequests',\n        coachingAppointments: 'coachingAppointments',\n        learningAssignments: 'learningAssignments',\n        reportingExports: 'reportingExports',\n        reportingAlerts: 'reportingAlerts',\n        explanations: 'explanations'\n    },\n\n    learningTab: {\n        hasError: false,\n        errorState: {}\n    },\n\n    /**\n     *  The unreadCount for non-group voicemails is updated from Hawk or user mailbox API\n     */\n    voicemailStandaloneUnreadVoicemails: 0,\n    /**\n     * User mailbox API doesn't take into consideration of Group VMs.\n     * Stop gap added to track Group VM unread count using IFC.\n     * Once https://inindca.atlassian.net/browse/EC-772 is completed, we\n     * can improve, or remove, this logic.\n     */\n    voicemailStandaloneUnreadGroupVoicemails: 0,\n\n    cachedGroupVoicemails: null,\n    /**\n     *  When useFaxesApp is true faxes are not fetched.\n     *  The unreadCount for faxes is updated from Hawk or fax summary API\n     */\n    faxStandaloneUnreadFaxes: 0,\n    /**\n     * Will be an array of timers to represent the delayed fax summary API request\n     */\n    faxSummaryTimers: null,\n\n    authenticated: reads('session.isAuthenticated'),\n\n    sortingDesc: ['date:desc'],\n    learningAssignmentsSortingDesc: ['dateRecommendedForCompletion:asc'],\n    wfmNotificationSortingDesc: ['timestamp:desc', 'id:desc'],\n    reportingExportsSortingDesc: ['createdDateTime:desc'],\n    reportingAlertsSortingDesc: ['dateStart:desc'],\n    evaluationsSortingDesc: ['changedDate:desc'],\n    sortedRecordings: sort('recordings', 'sortingDesc'),\n    sortedTimeOffRequests: sort('timeOffRequests', 'wfmNotificationSortingDesc'),\n    sortedShiftTradeRequests: sort('shiftTradeRequests', 'wfmNotificationSortingDesc'),\n    sortedReportingExports: sort('reportingExports', 'reportingExportsSortingDesc'),\n    sortedReportingAlerts: sort('reportingAlerts', 'reportingAlertsSortingDesc'),\n    sortedLearningAssignments: sort('learningAssignments', 'learningAssignmentsSortingDesc'),\n    sortedEvaluations: sort('evaluations', 'evaluationsSortingDesc'),\n    sortedAdherenceExplanations: sort('adherenceExplanations', 'wfmNotificationSortingDesc'),\n\n    hasReportingAlertAccess: reads('permissions.hasReportingAlertAccess'),\n\n    totalUnread: computed(\n        'unreadVoicemails',\n        'unreadRecordings',\n        'unreadFaxes',\n        'unreadEvaluations',\n        'unreadTimeOffRequests',\n        'unreadShiftTradeRequests',\n        'unreadCoachingAppointments',\n        'unreadLearningAssignments',\n        'unreadReportingExports',\n        'unreadReportingAlerts',\n        'unreadAdherenceExplanations',\n        function () {\n            let unreadVoicemails = this.unreadVoicemails || 0;\n            let unreadRecordings = this.unreadRecordings || 0;\n            let unreadFaxes = this.unreadFaxes || 0;\n            let unreadEvaluations = this.unreadEvaluations || 0;\n            let unreadTimeOffRequests = this.unreadTimeOffRequests || 0;\n            let unreadShiftTradeRequests = this.unreadShiftTradeRequests || 0;\n            let unreadCoachingAppointments = this.unreadCoachingAppointments || 0;\n            let unreadLearningAssignments = this.unreadLearningAssignments || 0;\n            let unreadReportingExports = this.unreadReportingExports || 0;\n            let unreadReportingAlerts = this.unreadReportingAlerts || 0;\n            let unreadAdherenceExplanations = this.unreadAdherenceExplanations || 0;\n\n            return (\n                unreadVoicemails +\n                unreadRecordings +\n                unreadFaxes +\n                unreadEvaluations +\n                unreadTimeOffRequests +\n                unreadShiftTradeRequests +\n                unreadCoachingAppointments +\n                unreadLearningAssignments +\n                unreadReportingExports +\n                unreadReportingAlerts +\n                unreadAdherenceExplanations\n            );\n        }\n    ),\n\n    totalVoiceMailPages: computed('pageCount', function () {\n        return this.pageCount;\n    }),\n\n    unreadVoicemails: computed(\n        'permissions.hasVoicemailAccess',\n        'voicemailStandaloneUnreadVoicemails',\n        'voicemailStandaloneUnreadGroupVoicemails',\n        function () {\n            if (!this.get('permissions.hasVoicemailAccess')) {\n                return 0;\n            }\n\n            return this.voicemailStandaloneUnreadVoicemails + this.voicemailStandaloneUnreadGroupVoicemails;\n        }\n    ),\n\n    unreadRecordings: computed('recordings.@each.read', function () {\n        let unread = _.reject(this.recordings, function (recording) {\n            if (recording.get('read') !== undefined) {\n                return recording.get('read');\n            }\n        });\n        return unread.length;\n    }),\n\n    legacyUnreadFaxes: computed('faxes.content.@each.read', function () {\n        let unread = _.reject(this.get('faxes.content'), function (fax) {\n            if (fax && fax.get('read') !== undefined) {\n                return fax.get('read');\n            }\n        });\n        return unread.length;\n    }),\n\n    unreadFaxes: computed('faxStandaloneUnreadFaxes', function () {\n        return this.faxStandaloneUnreadFaxes;\n    }),\n\n    unreadEvaluations: computed('permissions.canViewAgentEvaluationsMe', 'evaluations.@each.status', function () {\n        if (!this.get('permissions.canViewAgentEvaluationsMe')) {\n            return 0;\n        }\n\n        const userId = this.get('session.user.id');\n        const unread = _.reject(this.evaluations, function (evaluation) {\n            if (evaluation && evaluation.agent && evaluation.status) {\n                return evaluation.agent.id === userId && evaluation.status.toLowerCase() === 'inreview';\n            }\n        });\n        return unread.length;\n    }),\n\n    unreadTimeOffRequests: computed('timeOffRequests.@each.markedAsRead', function () {\n        let unread = _.reject(this.timeOffRequests, function (timeOffRequest) {\n            if (timeOffRequest.markedAsRead !== undefined) {\n                return timeOffRequest.markedAsRead;\n            }\n        });\n        return unread.length;\n    }),\n\n    unreadShiftTradeRequests: computed('shiftTradeRequests.@each.markedAsRead', function () {\n        let unread = _.reject(this.shiftTradeRequests, function (shiftTradeRequest) {\n            if (shiftTradeRequest.markedAsRead !== undefined) {\n                return shiftTradeRequest.markedAsRead;\n            }\n        });\n        return unread.length;\n    }),\n\n    unreadAdherenceExplanations: computed('adherenceExplanations.@each.markedAsRead', function () {\n        const unread = _.reject(this.adherenceExplanations, function (adherenceExplanation) {\n            if (!_.isUndefined(adherenceExplanation.markedAsRead)) {\n                return adherenceExplanation.markedAsRead;\n            }\n        });\n        return unread.length;\n    }),\n\n    unreadCoachingAppointments: computed('coachingAppointments.@each.markedAsRead', function () {\n        let unread = _.reject(this.coachingAppointments, function (coachingAppointment) {\n            if (coachingAppointment.markedAsRead !== undefined) {\n                return coachingAppointment.markedAsRead;\n            }\n        });\n        return unread.length;\n    }),\n\n    unreadLearningAssignments: computed('learningAssignments.@each.state', function () {\n        const unread = _.filter(this.learningAssignments, function (learningAssignment) {\n            return learningAssignment.state === 'Assigned' || learningAssignment.state === 'InvalidSchedule';\n        });\n        return unread.length;\n    }),\n\n    unreadReportingExports: computed('reportingExports.@each.read', function () {\n        let unread = _.reject(this.reportingExports, function (reportingExport) {\n            if (reportingExport && reportingExport.read !== undefined && reportingExport.status !== undefined) {\n                return (\n                    reportingExport.read ||\n                    (reportingExport.status !== 'COMPLETED' &&\n                        reportingExport.status !== 'COMPLETED_WITH_PARTIAL_RESULTS')\n                );\n            }\n        });\n        return unread.length;\n    }),\n\n    unreadReportingAlerts: computed('reportingAlerts.@each.unread', function () {\n        const unread = (this.reportingAlerts || []).filter(reportingAlert => {\n            return reportingAlert.unread;\n        });\n        return unread.length;\n    }),\n\n    isTrusteeOrg: reads('session.user.isTrustee'),\n\n    canReceiveExplanationNotifications: computed(\n        'permissions.hasAdherenceExplanationNotifyAccess',\n        'permissions.hasAdherenceExplanationEditAccess',\n        function () {\n            return (\n                this.get('permissions.hasAdherenceExplanationNotifyAccess') &&\n                this.get('permissions.hasAdherenceExplanationEditAccess')\n            );\n        }\n    ),\n\n    loadInbox: observer(\n        'session.person',\n        'isLearningAssignmentEnabled',\n        'isTrusteeOrg',\n        'isCoachingEnabled',\n        function () {\n            this.loadInboxData.perform();\n        }\n    ),\n\n    canEditExport: reads('permissions.canEditReportingExports'),\n\n    init() {\n        this._super(...arguments);\n\n        this.set('cachedVoicemails', []);\n\n        this.setProperties({\n            voicemails: [],\n            recordings: [],\n            evaluations: [],\n            timeOffRequests: [],\n            shiftTradeRequests: [],\n            coachingAppointments: [],\n            coachingAttendees: new Map(),\n            learningAssignments: [],\n            faxes: [],\n            reportingExports: [],\n            adherenceExplanations: [],\n            cache: new TtlCache({ defaultTtl: Number.POSITIVE_INFINITY }),\n            cachedGroupVoicemails: {},\n            faxSummaryTimers: []\n        });\n\n        this.registerMessageEvents();\n\n        // Only perform inbox data load if already authenticated (e.g. hot-reload scenario).\n        // The pigeon 'connect' event and the session-authenticated observer will\n        // trigger loadInboxData when the session is ready.\n        //\n        // NOTE: The inbox service can be instantiated lazily during a Glimmer render\n        // transaction (e.g. when CommandButtonFactory.init() calls owner.lookup('service:inbox')).\n        // Calling loadInboxData.perform() synchronously in that case fires ajax requests whose\n        // completions call set() mid-render, causing an unrecoverable Glimmer state.\n        // Schedule after render to break out of the transaction. See ember-3-migration spec.\n        if (this.get('session.isAuthenticated')) {\n            scheduleOnce('afterRender', this, () => {\n                if (!this.isDestroyed && !this.isDestroying) {\n                    this.loadInboxData.perform();\n                }\n            });\n        }\n\n        this.pigeon.on('connect', this, () => {\n            this.loadInboxData.perform();\n        });\n    },\n\n    isCoachingEnabled: readOnly('permissions.hasCoachingParticipate'),\n\n    isLearningAssignmentEnabled: computed('session.products', function () {\n        const products = this.get('session.products') || [];\n        const productsToCheck = ['cloudCX3', 'cloudEX', 'gc1WEMupgrade', 'gc2WEMupgrade'];\n        return products.some(product => productsToCheck.includes(product.id));\n    }),\n\n    buildInteractionDetailRoute(conversationId) {\n        if (conversationId) {\n            return `#/analytics/interactions/${conversationId}/admin/details`;\n        }\n    },\n\n    registerMessageEvents() {\n        const guid = this.get('session.person.guid');\n        this.pigeon.on('messages', this, this.handleVoicemailChange);\n        this.pigeon.on('userrecordings', this, this.handleRecordingsChange);\n        this.pigeon.on('evaluations', this, this.handleEvaluationsChange);\n        this.pigeon.on('documents', this, this.handleFaxChange);\n        this.pigeon.on('notifications', this, this.handleWfmNotificationChange);\n        this.pigeon.on('exports', this, this.handleReportingExportChange);\n        this.pigeon.on('alerts', this, this.handleReportingAlertChange);\n        this.pigeon.on('appointment', this, this.handleCoachingAppointmentChange);\n        this.pigeon.on(`v2.users.${guid}.wem.coaching.notification`, this, this.handleCoachingNotificationChange);\n        if (this.isLearningAssignmentEnabled) {\n            this.pigeon.on('assignment', this, this.handleLearningAssignmentChange);\n        }\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n\n        const guid = this.get('session.person.guid');\n        this.pigeon.off('messages');\n        this.pigeon.off('userrecordings');\n        this.pigeon.off('evaluations');\n        this.pigeon.off('documents');\n        this.pigeon.off('notifications');\n        this.pigeon.off('exports');\n        this.pigeon.off('alerts');\n        this.pigeon.off('appointment');\n        this.pigeon.off('assignment');\n        this.pigeon.off(`v2.users.${guid}.wem.coaching.notification`, this, this.handleCoachingNotificationChange);\n        this.faxSummaryTimers.forEach(timer => cancel(timer));\n    },\n\n    subscribeToV2Topics() {\n        const guid = this.get('session.person.guid');\n        if (guid) {\n            const reportingExportTopic = `v2.users.${guid}.analytics.reporting.exports`;\n            this.pigeon.registerPriorityTopic(reportingExportTopic);\n\n            // Don't load voicemails, recordings, faxes, evaluations, timeOffRequests, alerts or shiftTradeRequests if in trustee org `PCM-308`\n            if (!this.isTrusteeOrg) {\n                if (this.hasReportingAlertAccess) {\n                    this.pigeon.registerPriorityTopic(`v2.users.${guid}.alerting.alerts`);\n                }\n\n                const streamingPromise = this.get('streaming.v2Promise');\n                if (streamingPromise) {\n                    streamingPromise.then(() => {\n                        if (this.isCoachingEnabled) {\n                            console.info('Streaming connected, registering coaching topic.');\n                            const coachingAppointmentTopic = `v2.users.${guid}.wem.coaching.appointment`;\n                            const coachingNotificationTopic = `v2.users.${guid}.wem.coaching.notification`;\n                            this.pigeon.registerPriorityTopic(coachingAppointmentTopic);\n                            this.pigeon.registerPriorityTopic(coachingNotificationTopic);\n                            this.set('coachingTopicRegistered', true);\n                        }\n                        if (this.isLearningAssignmentEnabled) {\n                            console.info('Streaming connected, registering learning topic.');\n                            const learningAssignmentTopic = `v2.users.${guid}.wem.learning.assignment`;\n                            this.pigeon.registerPriorityTopic(learningAssignmentTopic);\n                            this.set('learningTopicRegistered', true);\n                        }\n                    });\n                } else {\n                    console.warn('Streaming promise not available, cannot register coaching and learning topics.');\n                }\n\n                if (\n                    this.get('permissions.hasTimeOffRequestAccess') ||\n                    this.get('permissions.hasAgentShiftTradeRequestAccess') ||\n                    this.canReceiveExplanationNotifications\n                ) {\n                    const wfmNotificationsTopic = `v2.users.${guid}.workforcemanagement.notifications`;\n                    this.pigeon.registerPriorityTopic(wfmNotificationsTopic);\n                }\n            }\n        }\n    },\n\n    groupMailboxEnabled: readOnly('session.features.EC-772_get-groups-mailboxes'),\n\n    loadInboxData: task(function* () {\n        yield timeout(100);\n        this.subscribeToV2Topics();\n        this.loadReportingExports();\n        this.loadExportExpirationSummary();\n\n        // Don't load voicemails, recordings, faxes, evaluations, timeOffRequests, alerts or shiftTradeRequests if in trustee org `PCM-308`\n        if (!this.isTrusteeOrg) {\n            this.loadRecordings();\n            this.loadFaxes();\n            this.loadEvaluations();\n            this.loadWfmNotifications();\n            if (this.isCoachingEnabled) {\n                this.loadCoachingAppointments();\n            }\n            if (this.isLearningAssignmentEnabled) {\n                this.loadLearningAssignments();\n            }\n\n            this.loadReportingAlerts();\n\n            if (this.groupMailboxEnabled) {\n                this.loadVoicemailMailbox();\n            } else {\n                this.loadUserMailbox();\n            }\n        }\n    }).keepLatest(),\n\n    async loadVoicemailMailbox() {\n        let unreadCount = 0;\n        try {\n            const userVMUnreads = await this.loadUserMailbox();\n            unreadCount += userVMUnreads;\n        } catch (err) {\n            console.warn('<service/inbox> Failed to retrieve user voicemail mailbox in loadVoicemailMailbox:', {\n                err\n            });\n            unreadCount += 0;\n        }\n        try {\n            if (this.get('permissions.canViewGroupMailbox')) {\n                // user must have the group mailbox permission to hit the API\n                const groupVMUnreads = await this.loadGroupMailbox();\n                unreadCount += groupVMUnreads;\n            }\n        } catch (err) {\n            console.warn('<service/inbox> Failed to retrieve group voicemail mailbox:', { err });\n            unreadCount += 0;\n        }\n        this.updateUnreadVoicemailsFromVoicemailStandalone(unreadCount);\n    },\n\n    loadUserMailbox() {\n        const url = 'api/v2/voicemail/mailbox';\n        return this.ajax\n            .request(this.application.pcV2Uri(url))\n            .then(results => {\n                if (this.groupMailboxEnabled) {\n                    return results.unreadCount;\n                } else {\n                    this.updateUnreadVoicemailsFromVoicemailStandalone(results.unreadCount);\n                }\n            })\n            .catch(err => {\n                console.warn('Failed to retrieve user voicemail mailbox:', { err });\n                return this.voicemailStandaloneUnreadVoicemails || 0;\n            });\n    },\n\n    async loadGroupMailbox() {\n        const rawGroupIds = this.get('session.person.rawGroupIds');\n        const groupIds = rawGroupIds ? rawGroupIds : [];\n        if (groupIds.length === 0) {\n            return 0;\n        }\n        // group mailbox api has a 100 id limit per request but batch on 50 ids\n        // there is a limit on request url size\n        const allBatches = batchEntityIds(groupIds, MAX_GROUP_MAILBOX);\n\n        // cap the amount of batches to 4 (200 id limit)\n        const groupIdBatches = allBatches.slice(0, MAX_GROUP_MAILBOX_REQUESTS);\n        const groupMailboxPromises = groupIdBatches.map(groupIds => {\n            const url = `api/v2/voicemail/groups/mailbox?groupIds=${encodeURIComponent(groupIds.join())}`;\n            return this.ajax\n                .request(this.application.pcV2Uri(url))\n                .then(results => {\n                    const groupMailboxEntities = results.entities ? results.entities : [];\n                    const groupUnreadCount = groupMailboxEntities.reduce((sum, group) => {\n                        return sum + group.unreadCount;\n                    }, 0);\n                    return groupUnreadCount;\n                })\n                .catch(err => {\n                    console.error('<service/inbox> There was an error loading group mailbox', { err });\n                    return 0;\n                });\n        });\n        try {\n            const groupUnreadCounts = await allSettled(groupMailboxPromises);\n            return groupUnreadCounts\n                .filter(groupUnreadResult => groupUnreadResult.state === 'fulfilled') // filter out failed requests\n                .reduce((partialSum, groupUnreadCount) => partialSum + groupUnreadCount.value, 0);\n        } catch (err) {\n            console.error('<service/inbox> There was an error settling the mailbox requests', { err });\n            return 0;\n        }\n    },\n\n    clearWfmNotifications() {\n        this.set('shiftTradeRequests', []);\n        this.set('timeOffRequests', []);\n        this.set('adherenceExplanations', []);\n    },\n\n    loadWfmNotifications() {\n        let shouldLoadShiftTradeRequests = this.get('permissions.hasAgentShiftTradeRequestAccess');\n        let shouldLoadTimeOffRequests = this.get('permissions.hasTimeOffRequestAccess');\n        let shouldLoadAdherenceExplanation = this.get('permissions.hasAdherenceExplanationViewAccess');\n        let shouldLoadNotifications =\n            shouldLoadShiftTradeRequests || shouldLoadTimeOffRequests || shouldLoadAdherenceExplanation;\n\n        if (!this.authenticated) {\n            this.clearWfmNotifications();\n        } else if (shouldLoadNotifications) {\n            console.info('LOAD NOTIFICATIONS');\n            this.set('loading.notifications', true);\n            this.wfm\n                .getNotifications()\n                .then(content => {\n                    // getNotifications resolves to undefined if its own request\n                    // failed (it swallows the error). Guard so we don't throw a\n                    // \"Cannot read properties of undefined\" here, which would be\n                    // reported as a misleading \"Error getting notifications\".\n                    if (!content) {\n                        return;\n                    }\n                    if (shouldLoadShiftTradeRequests) {\n                        this.set('shiftTradeRequests', content.shiftTradeRequests);\n                    }\n                    if (shouldLoadTimeOffRequests) {\n                        this.set('timeOffRequests', content.timeOffRequests);\n                    }\n                    if (shouldLoadAdherenceExplanation) {\n                        this.set('adherenceExplanations', content.adherenceExplanations);\n                    }\n                })\n                .catch(function (error) {\n                    if (error.status !== 404) {\n                        console.error('Error getting notifications', { error });\n                    }\n                })\n                .finally(() => {\n                    this.set('loading.notifications', false);\n                });\n        }\n    },\n\n    loadLearningAssignments() {\n        const intl = this.intl;\n        this.set('learningTab.hasError', false);\n        this.set('learningTab.errorState', {});\n        if (!this.authenticated) {\n            this.set('learningAssignments', []);\n        } else if (this.isLearningAssignmentEnabled) {\n            console.info('LOAD LEARNING ASSIGNMENTS');\n            this.set('loading.learningAssignments', true);\n            this.learning\n                .getLearningAssignments()\n                .then(response => {\n                    this.set('learningAssignments', response);\n                })\n                .catch(error => {\n                    console.error('Error getting learning assignments', { error });\n                    if (error.status >= 500) {\n                        this.set('learningTab.hasError', true);\n                        this.set('learningTab.errorState', {\n                            title: intl.t('purecloud.error.api.API_ERROR_TITLE'),\n                            message: intl.t('purecloud.error.api.API_ERROR_MESSAGE'),\n                            icon: 'face-sad',\n                            refresh: 'Refresh'\n                        });\n                    }\n                })\n                .finally(() => {\n                    this.set('loading.learningAssignments', false);\n                });\n        }\n    },\n\n    loadCoachingAppointments() {\n        if (!this.authenticated) {\n            this.set('coachingAppointments', []);\n        } else {\n            console.info('LOAD COACHING NOTIFICATIONS');\n            this.set('loading.coachingAppointments', true);\n            const expandAppointment = this.coachingUsabilityEnabled;\n            this.coaching\n                .getCoachingNotifications(expandAppointment ? 'appointment' : undefined)\n                .then(content => {\n                    this.set('coachingAppointments', content);\n                    if (this.coachingUsabilityEnabled) {\n                        this.loadCoachingAttendees();\n                    }\n                })\n                .catch(function (error) {\n                    if (error.status !== 404) {\n                        console.error('Error getting coachingAppointments', { error });\n                    }\n                })\n                .finally(() => {\n                    // Getting some tests occasionally failing because it's trying to set after this is destroyed.\n                    if (this.isDestroyed || this.isDestroying) {\n                        return;\n                    }\n                    this.set('loading.coachingAppointments', false);\n                });\n        }\n    },\n\n    loadCoachingAttendees() {\n        if (!this.authenticated) {\n            this.set('coachingAttendees', new Map());\n        } else {\n            if (!this.coachingAppointments) {\n                return;\n            }\n\n            this.set('loading.coachingAttendees', true);\n            const attendeeSet = new Set();\n            const attendeeIds = [];\n            this.coachingAppointments.forEach(coaching => {\n                coaching.appointment.attendees.forEach(a => {\n                    if (!attendeeSet.has(a.id)) {\n                        attendeeIds.push(a.id);\n                        attendeeSet.add(a.id);\n                    }\n                });\n            });\n\n            this.coaching\n                .getAttendees(attendeeIds)\n                .then(attendeeResponse => {\n                    const newMap = new Map();\n                    for (const attendee of attendeeResponse.entities) {\n                        newMap.set(attendee.id, attendee);\n                    }\n                    this.set('coachingAttendees', newMap);\n                })\n                .catch(function (error) {\n                    if (error.status !== 404) {\n                        console.error('Error getting coachingAttendees', { error });\n                    }\n                })\n                .finally(() => {\n                    // Getting some tests occasionally failing because it's trying to set after this is destroyed.\n                    if (this.isDestroyed || this.isDestroying) {\n                        return;\n                    }\n                    this.set('loading.coachingAttendees', false);\n                });\n        }\n    },\n\n    voicemailsLoaded(promise, data) {\n        const currentPromise = this.loadingPromise;\n        if (promise !== currentPromise) {\n            return; // a newer request was made, ignore this\n        }\n        this.set('loadingPromise', null);\n        this._processVoicemails(data);\n    },\n\n    loadVoicemails(page = 1) {\n        this.set('loading.voicemails', true);\n        let shouldLoadVoicemails = this.get('permissions.hasVoicemailAccess');\n\n        if (!this.authenticated) {\n            this.set('voicemails', []);\n        } else if (shouldLoadVoicemails) {\n            const cache = this.cachedVoicemails;\n            const cachedVoicemails = cache && cache.findBy('pageNumber', page);\n            if (cachedVoicemails && cachedVoicemails.get('voicemails') && cachedVoicemails.get('voicemails').length) {\n                const voicemails = cachedVoicemails.get('voicemails');\n                this.set('voicemails', voicemails);\n                this.set('loading.voicemails', false);\n            } else {\n                const loadingPromise = this._loadVoicemails(page);\n                this.set('loadingPromise', loadingPromise);\n                return loadingPromise.then(voicemails => {\n                    this.voicemailsLoaded(loadingPromise, voicemails);\n                });\n            }\n        }\n    },\n\n    _loadVoicemails(page) {\n        return new Promise((resolve, reject) => {\n            this.store\n                .query('voicemail-message', { pageSize: 200, pageNumber: page })\n                .then(results => {\n                    const metaPageCount = get(results, 'meta.pageCount');\n                    const pageCount = this.pageCount;\n                    this.set('pageNumber', get(results, 'meta.pageNumber'));\n                    if (metaPageCount > 0 && pageCount === 0) {\n                        this.set('pageCount', get(results, 'meta.pageCount'));\n                    }\n                    resolve(results);\n                })\n                .catch(function (error) {\n                    console.error('Error getting voicemails', { error });\n                    reject(error);\n                });\n        });\n    },\n\n    _processVoicemails(results = {}) {\n        // `store.query()` resolves directly to an array of model instances in this Ember Data\n        // version — there is no `.content` of internal-model wrappers needing `.getRecord()`.\n        const voicemailRecords = results.toArray ? results.toArray() : [];\n        if (_.isEmpty(voicemailRecords)) {\n            this.set('loading.voicemails', false);\n            return;\n        }\n        const voicemails = voicemailRecords;\n        const pageNumber = this.pageNumber;\n        const cachedVoicemails = this.cachedVoicemails;\n        const hasPageBeenCachedYet =\n            cachedVoicemails &&\n            cachedVoicemails.some(voicemail => voicemail.pageNumber === pageNumber && voicemail.voicemails.length);\n        if (hasPageBeenCachedYet) {\n            const page = cachedVoicemails.findBy('pageNumber', pageNumber);\n            cachedVoicemails.removeObject(page);\n        }\n        this._setVoicemails(voicemails, pageNumber);\n        this.set('loading.voicemails', false);\n    },\n\n    _setVoicemails(voicemails, pageNumber) {\n        this.cachedVoicemails.pushObject(\n            EmberObject.create({\n                voicemails,\n                pageNumber\n            })\n        );\n        this.set('voicemails', voicemails);\n    },\n\n    updateUnreadVoicemailsFromVoicemailStandalone(unreadCount) {\n        if (typeof unreadCount === 'number') {\n            this.set('voicemailStandaloneUnreadVoicemails', unreadCount < 0 ? 0 : unreadCount);\n        }\n    },\n\n    updateUnreadGroupVoicemails(unreadCount) {\n        if (this.groupMailboxEnabled) {\n            return;\n        }\n        if (typeof unreadCount === 'number') {\n            this.set('voicemailStandaloneUnreadGroupVoicemails', unreadCount < 0 ? 0 : unreadCount);\n        }\n    },\n\n    updateUnreadFaxFromFaxStandalone(unreadCount) {\n        if (typeof unreadCount === 'number') {\n            this.set('faxStandaloneUnreadFaxes', unreadCount);\n        }\n    },\n\n    loadRecordings(page = 1) {\n        if (!this.authenticated) {\n            this.set('recordings', []);\n            return resolve();\n        } else if (this.authenticated) {\n            console.info('LOAD RECORDINGS');\n            this.set('loading.recordings', true);\n            this.set('recordings', []);\n            return this.store\n                .query('recorded-call', { pageSize: 25, pageNumber: page, expand: 'conversation' })\n                .then(results => {\n                    this.set('recordingsPageNumber', get(results, 'meta.pageNumber'));\n                    this.set('recordingsPageCount', get(results, 'meta.pageCount'));\n                    // `store.query()` resolves directly to an array of model instances in this Ember\n                    // Data version — there is no `.content` of internal-model wrappers needing `.getRecord()`.\n                    const recordings = results.toArray ? results.toArray() : [];\n                    if (!_.isEmpty(recordings)) {\n                        this.set('recordings', recordings);\n                    }\n                })\n                .catch(function (error) {\n                    console.error('Error getting recordings', { error });\n                })\n                .finally(() => {\n                    this.set('loading.recordings', false);\n                });\n        }\n    },\n\n    async loadFaxes() {\n        if (!this.authenticated) {\n            this.set('faxes', []);\n        } else if (this.authenticated) {\n            const url = 'api/v2/fax/summary';\n            this.ajax\n                .request(this.application.pcV2Uri(url))\n                .then(results => {\n                    this.updateUnreadFaxFromFaxStandalone(results.unreadCount);\n                })\n                .catch(reason => {\n                    console.warn('Failed to retrieve fax summary:', { reason });\n                });\n        }\n    },\n\n    loadEvaluations() {\n        if (!this.authenticated) {\n            this.set('evaluations', []);\n        } else if (this.authenticated) {\n            console.info('LOAD EVALUATIONS');\n            this.set('loading.evaluations', true);\n            this.getEvaluations()\n                .then(content => {\n                    this.set('evaluations', content);\n                })\n                .catch(function (error) {\n                    console.error('Error getting evaluations', { error });\n                })\n                .finally(() => {\n                    this.set('loading.evaluations', false);\n                });\n        }\n    },\n\n    loadReportingExportsByPage(pageNumber) {\n        this.set('exportsPageNumber', pageNumber);\n        this.loadReportingExports();\n    },\n\n    loadReportingExports() {\n        const shouldLoadExports = this.get('permissions.hasReportingExportAccess');\n        const options = {};\n\n        options.pageNumber = this.exportsPageNumber;\n        options.pageSize = this.exportsPageSize;\n\n        if (this.exportsPageNumber === 1) {\n            this.set('newExportsAvailable', false);\n        }\n\n        if (!this.authenticated) {\n            this.set('reportingExports', []);\n        } else if (this.authenticated && shouldLoadExports) {\n            console.info('LOAD EXPORTS');\n            this.set('loading.reportingExports', true);\n            this.engageanalytics\n                .getAllReportingExports(options)\n                .then(content => {\n                    if (content && content.entities) {\n                        this.set('exportsPageCount', content.pageCount);\n                        this.set('exportsPageNumber', content.pageNumber);\n                        this.set('reportingExports', A(content.entities));\n                    } else {\n                        this.set('exportsPageCount', 0);\n                        this.set('exportsPageNumber', 1);\n                        this.set('reportingExports', A([]));\n                    }\n                })\n                .catch(function (error) {\n                    console.error('Error getting exports', { error });\n                })\n                .finally(() => {\n                    this.set('loading.reportingExports', false);\n                });\n        }\n    },\n\n    loadReportingAlertsByPage(pageNumber) {\n        this.set('alertsPageNumber', pageNumber);\n        this.loadReportingAlerts();\n    },\n\n    loadReportingAlerts() {\n        const shouldLoadAlerts = this.get('permissions.hasReportingAlertAccess');\n        const options = {\n            sortBy: 'DateStart',\n            sortOrder: 'Desc'\n        };\n\n        const pageNumber = this.alertsPageNumber;\n        options.pageNumber = pageNumber;\n        options.pageSize = this.alertsPageSize;\n\n        if (pageNumber === 1) {\n            this.set('newAlertsAvailable', false);\n        }\n\n        if (!this.authenticated) {\n            this.set('reportingAlerts', A([]));\n        } else if (this.authenticated && shouldLoadAlerts) {\n            console.info('LOAD REPORTING ALERTS');\n            this.set('loading.reportingAlerts', true);\n            this.engageanalytics\n                .getReportingAlerts(options)\n                .then(content => {\n                    if (content && content.entities) {\n                        this.set('alertsPageCount', content.pageCount);\n                        this.set('alertsPageNumber', content.pageNumber);\n                        this.set('reportingAlerts', A(content.entities));\n                    } else {\n                        this.set('alertsPageCount', 0);\n                        this.set('alertsPageNumber', 1);\n                        this.set('reportingAlerts', A([]));\n                    }\n                })\n                .catch(function (error) {\n                    console.error('Error getting alerts', { error });\n                })\n                .finally(() => {\n                    this.set('loading.reportingAlerts', false);\n                });\n        }\n    },\n\n    loadExportExpirationSummary() {\n        const url = 'api/v2/analytics/reporting/exports/schedule/summary';\n        this.ajax\n            .request(this.application.pcV2Uri(url))\n            .then(results => {\n                this.set('exportExpirationSummary', results);\n            })\n            .catch(reason => {\n                console.warn('Failed to retrieve export expiration summary:', { reason });\n            });\n    },\n\n    changeReportingAlertReadState(reportingAlert, newState) {\n        set(reportingAlert, 'unread', newState);\n\n        return this.engageanalytics.updateAlert(reportingAlert.id, { unread: newState }).catch(() => {\n            set(reportingAlert, 'unread', !newState);\n            this.notification.error(\n                this.intl.t('notification.inbox.errorUpdatingAlertRead.title'),\n                this.intl.t('notification.inbox.errorUpdatingAlertRead.message')\n            );\n        });\n    },\n\n    /**\n     * Marks all alert rule inbox items as read or unread\n     *\n     * @param {boolean} unread Should the alert be marked as unread, or inverse, read\n     */\n    toggleAllAlertsReadState(unread) {\n        const successMessage = unread\n            ? this.intl.t('components.inbox.toast.markAllAsUnreadSuccess.message')\n            : this.intl.t('components.inbox.toast.markAllAsReadSuccess.message');\n        const failureMessage = unread\n            ? this.intl.t('components.inbox.toast.markAllAsUnreadFailure.message')\n            : this.intl.t('components.inbox.toast.markAllAsReadFailure.message');\n\n        return this.engageanalytics\n            .toggleAllAlertsReadState(unread)\n            .then(() => {\n                this.notification.success(null, successMessage);\n            })\n            .catch(() => {\n                this.notification.error(null, failureMessage);\n            });\n    },\n\n    /**\n     * Deletes all alert rule notifications\n     */\n    deleteAllAlertNotifications() {\n        return this.engageanalytics\n            .deleteAllAlertNotifications()\n            .then(() => {\n                this.notification.success(null, this.intl.t('components.inbox.toast.deleteAllSuccess.message'));\n            })\n            .catch(() => {\n                this.notification.error(null, this.intl.t('components.inbox.toast.deleteAllFailure.message'));\n            });\n    },\n\n    updateReportingAlert(reportingAlert, options) {\n        return this.engageanalytics.patchAlert(reportingAlert.id, options).catch(() => {\n            this.notification.error(\n                this.intl.t('notification.inbox.errorUpdatingAlert.title'),\n                this.intl.t('notification.inbox.errorUpdatingAlert.message')\n            );\n        });\n    },\n\n    deleteAlert(reportingAlert) {\n        this.reportingAlerts.removeObject(reportingAlert);\n\n        this.engageanalytics\n            .deleteAlert(reportingAlert.id)\n            .catch(() => {\n                this.reportingAlerts.pushObject(reportingAlert);\n                this.notification.error(\n                    this.intl.t('notification.inbox.errorDeletingAlert.title'),\n                    this.intl.t('notification.inbox.errorDeletingAlert.message')\n                );\n            })\n            .finally(() => {\n                if (!this.get('reportingAlerts.length') && this.alertsPageCount > 1) {\n                    // if we deleted all the alerts on the page, query for page 1 again\n                    this.loadReportingAlertsByPage(1);\n                }\n            });\n    },\n\n    handleLearningAssignmentChange(event) {\n        const assignmentIndex = this.learningAssignments.findIndex(assignment => assignment.id === event.id);\n        const assignmentExists = assignmentIndex > -1;\n\n        if (\n            (event.state === 'Completed' || event.state === 'Deleted' || event.state === 'NotCompleted') &&\n            assignmentExists\n        ) {\n            this.learningAssignments.removeAt(assignmentIndex);\n        } else if (assignmentExists) {\n            this.learningAssignments.replace(assignmentIndex, 1, [event]);\n        } else {\n            this.learningAssignments.pushObject(event);\n        }\n    },\n\n    coachingUsabilityEnabled: computed('session.features', function () {\n        return this.get('session.features')['coaching.usability.ui'];\n    }),\n\n    handleCoachingAppointmentChange(event) {\n        const currentNotifications = this.coachingAppointments;\n        const coachingNotification = currentNotifications.find(n => n.appointment.id === event.id);\n        const intl = this.intl;\n        const expandAppointment = this.coachingUsabilityEnabled;\n        switch (event.changeType) {\n            case 'Create':\n                this.set('loading.coachingAppointments', true);\n                this.coaching\n                    .getCoachingNotifications(expandAppointment ? 'appointment' : undefined)\n                    .then(results => {\n                        // Find any notifications we don't have yet.\n                        const missingNotifications = results.filter(\n                            n => !currentNotifications.some(a => a.id === n.id)\n                        );\n                        missingNotifications.forEach(a => {\n                            currentNotifications.pushObject(a);\n                        });\n                    })\n                    .finally(() => {\n                        this.set('loading.coachingAppointments', false);\n                        this.coaching.updatePaginationOnCreate();\n                    });\n                //show toast\n                //multiple attendees are yet to be implemented so we just presume there is one\n                this.coaching\n                    .getAttendees(event.attendees.map(a => a.id))\n                    .then(attendeeResponse => {\n                        const newMap = new Map();\n                        for (const attendee of attendeeResponse.entities) {\n                            newMap.set(attendee.id, attendee);\n                            const messageData = {\n                                attendee: attendee.name,\n                                startDate: formatDateForDisplay(event.dateStart, 'long'),\n                                startTime: formatTimeForDisplay(event.dateStart, 'short'),\n                                endTime: formatTimeForDisplay(\n                                    this.coaching.getEndTime(event.dateStart, event.lengthInMinutes),\n                                    'short'\n                                )\n                            };\n                            const title = intl.t('notification.inbox.coachingAppointment.toast.created.title');\n                            const message = intl.t(\n                                'notification.inbox.coachingAppointment.toast.created.message',\n                                messageData\n                            );\n                            this.notification.info(title, message);\n                        }\n                        this.set('coachingAttendees', newMap);\n                    })\n                    .catch(reason => {\n                        console.warn('Failed to retrieve coaching notification attendees:', { reason });\n                    });\n                break;\n            case 'Update':\n                if (event.status === 'Completed') {\n                    const title = intl.t('notification.inbox.coachingAppointment.toast.completed.title');\n                    const messageData = {\n                        title: event.name,\n                        lengthInMinutes: event.lengthInMinutes,\n                        dateStart: formatDateForDisplay(event.dateStart, 'long')\n                    };\n                    const message = intl.t(\n                        'notification.inbox.coachingAppointment.toast.completed.message',\n                        messageData\n                    );\n                    this.notification.info(title, message);\n                    this.coaching.updatePaginationOnDelete(coachingNotification);\n                } else {\n                    const apptStart = new Date(event.dateStart);\n                    const apptEnd = new Date(apptStart.getTime() + event.lengthInMinutes * 60000).getTime();\n                    coachingNotification.set('appointment.isOverdue', Date.now() > apptEnd);\n                    coachingNotification.set('name', event.name);\n                    coachingNotification.set('markedAsRead', false);\n                    coachingNotification.set('actionType', event.changeType);\n                    coachingNotification.set('dateStart', event.dateStart);\n                    coachingNotification.set('lengthInMinutes', event.lengthInMinutes);\n                    coachingNotification.set('status', event.status);\n\n                    // Check if it's open.\n                    const currentUser = this.get('session.user.id');\n                    if (this.get('coaching.activeCoachingModalId') === event.id) {\n                        this.coaching.set('activeCoachingModalId', null);\n\n                        // Don't toast it the change was caused by the current user; they know they've changed it.\n                        if (event.modifiedBy.id !== currentUser) {\n                            const title = intl.t('notification.inbox.coachingAppointment.toast.modified.title');\n                            const message = intl.t('notification.inbox.coachingAppointment.toast.modified.message');\n                            this.notification.info(title, message);\n                        }\n                    }\n                }\n                break;\n            case 'Delete':\n                coachingNotification.set('markedAsRead', false);\n                coachingNotification.set('actionType', event.changeType);\n                this.coaching.patchCoachingNotification(coachingNotification, false);\n                break;\n            case 'Invalidate':\n                this.notification.info(\n                    intl.t('notification.inbox.coachingAppointment.toast.invalidated.title'),\n                    intl.t('notification.inbox.coachingAppointment.toast.invalidated.message', { title: event.name })\n                );\n                coachingNotification.set('status', event.status);\n                break;\n        }\n    },\n\n    async handleCoachingNotificationChange(event) {\n        const coachingNotificationIndex = this.coachingAppointments.findIndex(n => n.id === event.id);\n        const coachingNotification = this.coachingAppointments[coachingNotificationIndex];\n        const intl = this.intl;\n        const eventObject = CoachingNotificationModel.create(event);\n        switch (event.actionType) {\n            case 'Create':\n                this.coachingAppointments.pushObject(eventObject);\n                //show toast\n                var attendeeIds = [this.get('session.person.guid')];\n                if (event.relationship !== 'Attendee') {\n                    //current user is not attendee so we need to get the appointment\n                    const appointmentResponse = await this.coaching.getCoachingAppointment(event.appointment.id);\n                    attendeeIds = appointmentResponse.attendees.map(a => a.id);\n                }\n                this.coaching\n                    .getAttendees(attendeeIds)\n                    .then(attendeeResponse => {\n                        const newMap = new Map();\n                        for (const attendee of attendeeResponse.entities) {\n                            newMap.set(attendee.id, attendee);\n                            const messageData = {\n                                attendee: attendee.name,\n                                startDate: formatDateForDisplay(event.dateStart, 'long'),\n                                startTime: formatTimeForDisplay(event.dateStart, 'short'),\n                                endTime: formatTimeForDisplay(\n                                    this.coaching.getEndTime(event.dateStart, event.lengthInMinutes),\n                                    'short'\n                                )\n                            };\n                            const title = intl.t('notification.inbox.coachingAppointment.toast.created.title');\n                            const message = intl.t(\n                                'notification.inbox.coachingAppointment.toast.created.message',\n                                messageData\n                            );\n                            this.notification.info(title, message);\n                        }\n                        this.set('coachingAttendees', newMap);\n                    })\n                    .catch(reason => {\n                        console.warn('Failed to retrieve coaching notification attendees:', { reason });\n                    });\n                break;\n            case 'Update':\n                if (event.status === 'Completed') {\n                    if (coachingNotification.status !== event.status) {\n                        const title = intl.t('notification.inbox.coachingAppointment.toast.completed.title');\n                        const messageData = {\n                            title: event.name,\n                            lengthInMinutes: event.lengthInMinutes,\n                            dateStart: formatDateForDisplay(event.dateStart, 'long')\n                        };\n                        const message = intl.t(\n                            'notification.inbox.coachingAppointment.toast.completed.message',\n                            messageData\n                        );\n                        this.notification.info(title, message);\n                    }\n                    this.coaching.updatePaginationOnDelete(coachingNotification); // This will remove the notification if it exists\n                } else {\n                    if (coachingNotificationIndex >= 0) {\n                        // Due to modal existing in each item we want to update the props manually so we don't replace the modal discarding any changes\n                        coachingNotification.set('name', event.name);\n                        coachingNotification.set('markedAsRead', event.markedAsRead);\n                        coachingNotification.set('actionType', event.actionType);\n                        coachingNotification.set('dateStart', event.dateStart);\n                        coachingNotification.set('lengthInMinutes', event.lengthInMinutes);\n                        coachingNotification.set('status', event.status);\n                    }\n                }\n                break;\n            case 'Delete':\n                if (event.markedAsRead) {\n                    this.coaching.updatePaginationOnDelete(coachingNotification); // This will remove the notification if it exists\n                } else {\n                    if (coachingNotificationIndex >= 0) {\n                        // if the notification has just been deleted (so it exists in the inbox already), replace it with an unread, 'deleted' one\n                        this.coachingAppointments.replace(coachingNotificationIndex, 1, [eventObject]);\n                    } else {\n                        // if it was read, and is now unread, add it again to the inbox\n                        this.coachingAppointments.pushObject(eventObject);\n                        // sort the appointments by date, then name (otherwise the eventObject just gets appended to the end)\n                        this.set('coachingAppointments', this.coachingAppointments.sortBy('dateStart', 'name'));\n                    }\n                }\n                if (coachingNotification) {\n                    coachingNotification.set('markedAsRead', event.markedAsRead);\n                }\n                break;\n            case 'StatusChange':\n                // No matter what the status changed to we should update the object which will force close the modal\n                if (coachingNotificationIndex >= 0) {\n                    this.coachingAppointments.replace(coachingNotificationIndex, 1, [eventObject]);\n                }\n                if (event.status === 'InvalidSchedule') {\n                    this.notification.info(\n                        intl.t('notification.inbox.coachingAppointment.toast.invalidated.title'),\n                        intl.t('notification.inbox.coachingAppointment.toast.invalidated.message', {\n                            title: event.name\n                        })\n                    );\n                }\n                break;\n        }\n    },\n\n    removeCoachingNotification(notification) {\n        const currentNotifications = this.coachingAppointments;\n        currentNotifications.removeObject(notification);\n    },\n\n    handleWfmNotificationChange(event) {\n        this.set('loading.notifications', true);\n        this.wfm\n            .handleWfmNotificationUpdate(event)\n            .then(content => {\n                if (!event.type || event.type === 'ShiftTrade' || event.type === 'AlternativeShift') {\n                    this.set('shiftTradeRequests', content.shiftTradeRequests);\n                    this.notifyPropertyChange('shiftTradeRequests');\n                }\n\n                if (!event.type || event.type === 'TimeOffRequest') {\n                    this.set('timeOffRequests', content.timeOffRequests);\n                    this.notifyPropertyChange('timeOffRequests');\n                }\n\n                if (\n                    this.get('permissions.hasAdherenceExplanationViewAccess') &&\n                    (!event.type || event.type === 'AdherenceExplanation')\n                ) {\n                    this.set('adherenceExplanations', content.adherenceExplanations);\n                    this.notifyPropertyChange('adherenceExplanations');\n                }\n            })\n            .catch(function (error) {\n                if (error.status !== 404) {\n                    console.error('Error handling notification change', { error });\n                }\n            })\n            .finally(() => {\n                this.set('loading.notifications', false);\n            });\n    },\n\n    handleVoicemailChange(event, rawData) {\n        const intl = this.intl;\n        const notification = this.notification;\n        const action = rawData.metadata.action;\n\n        const shouldReloadTargetVoicemail = _.includes(['note-modified', 'unread', 'read', 'copied'], action);\n        const shouldAddNewVoicemail = _.includes(['create'], action);\n        const shouldRemoveVoicemail = action === 'delete';\n        const shouldMarkVoicemailUnread = action === 'unread';\n        const shouldMarkVoicemailRead = action === 'read';\n\n        const shouldShowNotification =\n            _.includes(['unread', 'read', 'delete'], action) &&\n            event.modifiedByUserId !== this.get('session.person.guid');\n\n        if (shouldAddNewVoicemail) {\n            this.store.find('voicemail-message', rawData.eventBody.id).then(voicemail => {\n                this.handleNewVoicemailChange(voicemail);\n            });\n        }\n\n        if (shouldReloadTargetVoicemail) {\n            // always show the toast if we should since VM iframe won't alert web-directory\n            if (shouldShowNotification) {\n                const title = intl.t('notification.inbox.userAction.title');\n                const message = intl.t('notification.inbox.userAction.message');\n                notification.info(title, message);\n            }\n        }\n\n        if (shouldRemoveVoicemail) {\n            // always show the toast if we should since VM iframe won't alert web-directory\n            if (shouldShowNotification) {\n                const title = intl.t('notification.inbox.userAction.title');\n                const message = intl.t('notification.inbox.userAction.message');\n                notification.info(title, message);\n            }\n        }\n\n        const voicemailStandaloneUnreadVoicemails = this.voicemailStandaloneUnreadVoicemails;\n\n        const isGroupVoicemailCached = this.get(`cachedGroupVoicemails.${rawData.eventBody.id}`);\n\n        if (isGroupVoicemailCached) {\n            // We know this is a group voicemail skip the unread tracking.\n            // Once https://inindca.atlassian.net/browse/EC-772 is completed, we can improve, or remove, this logic.\n            return;\n        }\n\n        const shouldIncrementUnreadCount =\n            (shouldAddNewVoicemail && !rawData.eventBody.read) || shouldMarkVoicemailUnread;\n        const shouldDecrementUnreadCount =\n            ((shouldRemoveVoicemail && !rawData.eventBody.read) || shouldMarkVoicemailRead) &&\n            voicemailStandaloneUnreadVoicemails > 0;\n\n        if (shouldIncrementUnreadCount) {\n            if (this.groupMailboxEnabled) {\n                this.updateUnreadVoicemailsFromVoicemailStandalone(voicemailStandaloneUnreadVoicemails + 1);\n            } else {\n                this.store\n                    .find('voicemail-message', rawData.eventBody.id)\n                    .then(voicemail => {\n                        /**\n                         * Stop gap to resolve an issue with Voicemail Unread/Read status.\n                         * Once https://inindca.atlassian.net/browse/EC-772 is completed, we\n                         * can improve, or remove, this logic.\n                         */\n                        if (!voicemail.get('isGroupVoicemail')) {\n                            this.updateUnreadVoicemailsFromVoicemailStandalone(voicemailStandaloneUnreadVoicemails + 1);\n                        } else {\n                            this.set(`cachedGroupVoicemails.${rawData.eventBody.id}`, true);\n                        }\n                    })\n                    .catch(err => {\n                        if (err.message && err.message.indexOf('Attempted to handle event `reloadRecord`') > -1) {\n                            return; // swallow reload error, reloading multiple times rapidly\n                        }\n                        throw err;\n                    });\n            }\n        } else if (shouldDecrementUnreadCount) {\n            if (this.groupMailboxEnabled) {\n                this.updateUnreadVoicemailsFromVoicemailStandalone(voicemailStandaloneUnreadVoicemails - 1);\n            } else {\n                this.store\n                    .find('voicemail-message', rawData.eventBody.id)\n                    .then(voicemail => {\n                        /**\n                         * Stop gap to resolve an issue with Voicemail Unread/Read status.\n                         * Once https://inindca.atlassian.net/browse/EC-772 is completed, we\n                         * can improve, or remove, this logic.\n                         */\n                        if (!voicemail.get('isGroupVoicemail')) {\n                            this.updateUnreadVoicemailsFromVoicemailStandalone(voicemailStandaloneUnreadVoicemails - 1);\n                        } else {\n                            this.set(`cachedGroupVoicemails.${rawData.eventBody.id}`, true);\n                        }\n                    })\n                    .catch(err => {\n                        if (err.message && err.message.indexOf('Attempted to handle event `reloadRecord`') > -1) {\n                            return; // swallow reload error, reloading multiple times rapidly\n                        }\n                        throw err;\n                    });\n            }\n        }\n    },\n\n    createCachedPage(voicemailsData) {\n        return this.cachedVoicemails.pushObject(\n            EmberObject.create({\n                voicemails: voicemailsData,\n                pageNumber: 1\n            })\n        );\n    },\n\n    fetchGroupMailbox(groupId) {\n        const url = `api/v2/voicemail/groups/${groupId}/mailbox`;\n        return this.ajax.request(this.application.pcV2Uri(url)).catch(() => {\n            console.error(`Failed to retrieve mailbox for group: ${groupId}`, {\n                remoteData: {\n                    groupId\n                }\n            });\n            return null;\n        });\n    },\n\n    handleNewVoicemailChange(voicemail) {\n        voicemail.loadParticipants();\n        let cachedPage1 = this.cachedVoicemails.findBy('pageNumber', 1);\n        if (!cachedPage1) {\n            cachedPage1 = this.createCachedPage([voicemail]);\n            this.set('voicemails', cachedPage1.get('voicemails'));\n        } else {\n            cachedPage1.get('voicemails').unshiftObject(voicemail);\n        }\n        this.timeline.voicemailEvent(voicemail);\n    },\n\n    handleRecordingsChange(event, rawData) {\n        let action = rawData.metadata.action;\n        let shouldLoadRecordings = _.includes(['create', 'delete', 'move'], action);\n        if (shouldLoadRecordings) {\n            this.loadRecordings().then(() => {\n                let latestRecordings = this.recordings;\n                // Sometimes we receive a hawk notification before the delete is \"complete\" due to async nature\n                if (event && event.id && (action === 'delete' || action === 'move')) {\n                    let deletedRecording = latestRecordings.find(recording => get(recording, 'id') === event.id);\n                    if (deletedRecording) {\n                        this.deleteRecording(deletedRecording, 'recording');\n                    }\n                }\n            });\n        }\n    },\n\n    handleFaxChange(event, rawData) {\n        let shouldCheckUnread = _.includes(['create', 'delete', 'move', 'update'], rawData.metadata.action);\n        if (!shouldCheckUnread) {\n            return;\n        }\n\n        const action = rawData.metadata.action;\n        const shouldCreateFax = action === 'create';\n        const shouldRemoveFax = action === 'delete' || action === 'move';\n        const shouldUpdateFax = action === 'update';\n\n        if (shouldRemoveFax && this.faxStandaloneUnreadFaxes > 0 && !rawData.eventBody.read) {\n            this.updateUnreadFaxFromFaxStandalone(this.faxStandaloneUnreadFaxes - 1);\n        }\n        if (shouldCreateFax && !rawData.eventBody.read) {\n            this.updateUnreadFaxFromFaxStandalone(this.faxStandaloneUnreadFaxes + 1);\n        }\n        if (shouldUpdateFax) {\n            // delay the fetch since api request returns incorrect data if too fast\n            // created https://inindca.atlassian.net/browse/CBA-6712 to update hawk topic for easier updates\n            this.faxSummaryTimers.push(later(() => this.loadFaxes(), 500));\n        }\n    },\n\n    legacyHandleFaxChange(event, rawData) {\n        let shouldLoadFaxes = _.includes(['create', 'delete', 'move', 'update'], rawData.metadata.action);\n        if (shouldLoadFaxes) {\n            this.getFaxes().then(content => {\n                if (\n                    event &&\n                    content &&\n                    event.id &&\n                    (rawData.metadata.action === 'delete' || rawData.metadata.action === 'move')\n                ) {\n                    let deletedFax = content.find(fax => get(fax, 'id') === event.id);\n                    if (deletedFax) {\n                        let index = content.indexOf(deletedFax);\n                        if (index >= 0) {\n                            content.removeAt(index);\n                        }\n                    }\n                }\n                this.set('faxes', DS.PromiseArray.create({ promise: new resolve(content) }));\n            });\n        }\n    },\n\n    handleEvaluationsChange() {\n        this.loadEvaluations();\n    },\n\n    handleReportingExportChange(event) {\n        let exportIndex = this.reportingExports.findIndex(\n            reportingExport =>\n                reportingExport.id === event.id && (!reportingExport.runId || reportingExport.runId === event.runId)\n        );\n\n        if (this.exportsPageNumber > 1 && exportIndex < 0) {\n            // we are not in the first page, so don't add it to the list and just add an indicator\n            this.set('newExportsAvailable', true);\n        } else if (exportIndex !== -1) {\n            this.reportingExports.replace(exportIndex, 1, [event]);\n        } else {\n            this.reportingExports.pushObject(event);\n        }\n    },\n\n    async handleReportingAlertChange(event) {\n        let alertIndex = this.reportingAlerts.findIndex(reportingAlert => reportingAlert.id === event.id);\n\n        const currentUserId = this.get('session.person.guid');\n        const ruleCreatorId = event.userId;\n        const intl = this.intl;\n        let title = intl.t('notification.inbox.newAlert');\n\n        const isAlertSummaryAvailable = event.alertSummary;\n        let message = event.rule.name;\n        let reportingAlertSummary;\n\n        if (isAlertSummaryAvailable) {\n            reportingAlertSummary = new ReportingAlertSummary({\n                ruleName: event.rule.name,\n                alertSummary: event.alertSummary,\n                alertingEntitiesOnly: true, // for hawk update, we want to display only alerting entities.\n                intl: this.intl,\n                cache: this.cache,\n                queueService: this.queueService,\n                engageanalytics: this.engageanalytics,\n                logger: this.logger\n            });\n\n            message = await reportingAlertSummary.generateToast();\n        }\n\n        if (event.action === 'DELETE') {\n            return;\n        }\n\n        const sendExitingToast = event.action === 'CLOSE' && event.sendExitingAlarmNotification;\n        if (sendExitingToast) {\n            title = intl.t('notification.inbox.exitingAlert');\n        }\n        if (event.action === 'CREATE' || event.action === 'RENOTIFY' || sendExitingToast) {\n            // If the rule creator is not the current user, only show a toast with no link, and don't update inbox\n            if (ruleCreatorId !== currentUserId) {\n                this.notification.info(title, message, {\n                    target: this,\n                    hideAfter: 10,\n                    showNotificationEverywhere: true,\n                    markdownToHtml: !isAlertSummaryAvailable\n                });\n            } else {\n                const permissions = {\n                    canViewInteractionDetails: this.get('permissions.canViewInteractionDetails'),\n                    canViewAgentStatusDetails: this.get('permissions.canViewAgentStatus'),\n                    canViewQueuePerformance: this.get('permissions.canViewQueuePerformance'),\n                    canViewAgentPerformanceDetails: this.get('permissions.canViewAgentPerformance')\n                };\n\n                const detailPageRoute = reportingAlertSummary\n                    ? reportingAlertSummary.buildDetailPageRoute(permissions)\n                    : undefined;\n\n                const ruleId = event.rule.id;\n                const actionHandlers = {};\n\n                const actions = {\n                    goToAlertRule: () => {\n                        const route = `#/analytics/alerting/rules/${ruleId}/configure`;\n                        window.location.hash = route;\n                        this.sidebar.ensureRouteVisibility();\n                    },\n                    viewDetails: () => {\n                        window.location.hash = detailPageRoute;\n                        this.sidebar.ensureRouteVisibility();\n                    }\n                };\n\n                if (this.get('permissions.canEditReportingAlerts')) {\n                    actionHandlers.goToAlertRule = {\n                        label: this.intl.safestring('notification.inbox.viewRule').toString(),\n                        action: actions.goToAlertRule.bind(this)\n                    };\n                }\n\n                if (isAlertSummaryAvailable && detailPageRoute) {\n                    actionHandlers.viewDetails = {\n                        label: this.intl.safestring('notification.inbox.viewDetails').toString(),\n                        action: actions.viewDetails.bind(this)\n                    };\n                }\n\n                this.notification.info(title, message, {\n                    target: this,\n                    hideAfter: 10,\n                    showNotificationEverywhere: true,\n                    actionHandlers,\n                    markdownToHtml: !isAlertSummaryAvailable\n                });\n\n                if (this.alertsPageNumber > 1 && alertIndex < 0) {\n                    // we are not in the first page, so don't add it to the list and just add an indicator\n                    this.set('newAlertsAvailable', true);\n                } else if (alertIndex !== -1) {\n                    this.reportingAlerts.replace(alertIndex, 1, [event]);\n                } else {\n                    this.reportingAlerts.pushObject(event);\n                }\n            }\n        }\n    },\n\n    deleteRecording(recording, type) {\n        var recordingIndex, recordings;\n        if (type === 'voicemail') {\n            recordings = this.voicemails;\n            recordingIndex = recordings.indexOf(recording);\n        } else if (type === 'recording') {\n            recordings = this.recordings;\n            recordingIndex = recordings.indexOf(recording);\n        }\n        if (recordingIndex >= 0) {\n            recordings.removeAt(recordingIndex);\n\n            // Always unload the deleted recording from the local cache\n            this.store.unloadRecord(recording);\n        }\n    },\n\n    changeReportingExportReadState(reportingExport, newState) {\n        if (this.canEditExport) {\n            set(reportingExport, 'read', newState);\n\n            return this.engageanalytics\n                .updateExportRun(reportingExport.id, { read: newState }, reportingExport.runId)\n                .catch(() => {\n                    set(reportingExport, 'read', !newState);\n                    this.notification.error(\n                        this.intl.t('notification.inbox.errorUpdatingExportRead.title'),\n                        this.intl.t('notification.inbox.errorUpdatingExportRead.message')\n                    );\n                });\n        }\n    },\n\n    deleteExport(reportingExport) {\n        this.reportingExports.removeObject(reportingExport);\n\n        this.engageanalytics\n            .deleteExportRun(reportingExport.id, reportingExport.runId)\n            .catch(() => {\n                this.reportingExports.pushObject(reportingExport);\n                this.notification.error(\n                    this.intl.t('notification.inbox.errorDeletingExport.title'),\n                    this.intl.t('notification.inbox.errorDeletingExport.message')\n                );\n            })\n            .finally(() => {\n                if (!this.get('reportingExports.length') && this.exportsPageCount > 1) {\n                    // if we deleted all the exports on the page, query for page 1 again\n                    this.loadReportingExportsByPage(1);\n                }\n            });\n    },\n\n    runExport(reportingExport) {\n        this.engageanalytics.runExport(reportingExport.id, reportingExport.runId).catch(() => {\n            this.notification.error(\n                this.intl.t('notification.inbox.errorRunningExport.title'),\n                this.intl.t('notification.inbox.errorRunningExport.message')\n            );\n        });\n    },\n\n    cancelExport(reportingExport) {\n        this.engageanalytics.cancelExportRun(reportingExport.id, reportingExport.runId).catch(() => {\n            this.notification.error(\n                this.intl.t('notification.inbox.errorCancellingExport.title'),\n                this.intl.t('notification.inbox.errorCancellingExport.message')\n            );\n        });\n    },\n\n    openCoachingAppointments() {\n        if (this.isCoachingEnabled) {\n            this.sidebar.openPanel('notificationInbox');\n            this.set('inboxTabChoice', this.get('validChoices.coachingAppointments'));\n        }\n    },\n\n    openLearningAssignments() {\n        if (this.isLearningAssignmentEnabled) {\n            this.sidebar.openPanel('notificationInbox');\n            this.set('inboxTabChoice', this.get('validChoices.learningAssignments'));\n        }\n    }\n});\n","import { later, cancel } from '@ember/runloop';\nimport Evented, { on } from '@ember/object/evented';\nimport Service, { inject as service } from '@ember/service';\nimport { computed, observer, get, set } from '@ember/object';\nimport { addPageAction } from '../utils/newrelic';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport moment from 'web-directory/utils/dates';\nimport { batchEntityIds } from './store';\nimport { isPresence } from 'web-directory/mixins/entity-presence';\n\nexport const DEFAULT_PHONE_INTEGRATION_KEY = 'genesys';\nexport const GENESYS_SEARCH_TAB = {\n    key: 'genesys',\n    icon: 'assets/images/svg/genesys-logo-red.svg'\n};\nconst DEFAULT_PRESENCE_INTERVAL_SEC = 60;\nconst INTEGRATIONS_LOADED_EVENT = 'integrationsLoaded';\nconst PRESENCE_BATCH_SIZE_V2 = 25;\nconst NEW_RELIC_NAMESPACE = 'ucc.ui.integration';\n\nexport default Service.extend(Evented, LoggerMixin, {\n    apps: service(),\n    application: service(),\n    ajax: service(),\n    session: service(),\n    intl: service(),\n    permissions: service(),\n    store: service(),\n    notification: service(),\n    sidebar: service(),\n    phoneIntegrations: service(),\n\n    newRelicNamespace: NEW_RELIC_NAMESPACE,\n    presencePollIntervalSec: DEFAULT_PRESENCE_INTERVAL_SEC,\n    presenceIntervalTimers: {},\n    presenceErrors: null,\n\n    presencePollInterval: computed('presencePollIntervalSec', function () {\n        return this.presencePollIntervalSec * 1000;\n    }),\n\n    getFeatureToggle(toggle) {\n        return this.get('session.features') && this.get('session.features')[toggle];\n    },\n\n    alreadyTriggeredPresenceInterval: false,\n\n    triggerPresenceInterval: on(\n        'init',\n        // set up an observer to fire when integrations change\n        observer('phoneIntegrations.integrations.[]', function () {\n            const phoneIntegrations = this.get('phoneIntegrations.integrations');\n\n            // only trigger presence interval if we haven't already and we have integrations\n            if (phoneIntegrations.length > 0 && !this.alreadyTriggeredPresenceInterval) {\n                this.toggleProperty('alreadyTriggeredPresenceInterval');\n                this.trigger(INTEGRATIONS_LOADED_EVENT);\n            }\n        })\n    ),\n\n    presenceUpdateInterval: on(INTEGRATIONS_LOADED_EVENT, function () {\n        const phoneIntegrations = this.get('phoneIntegrations.integrations').filter(\n            integration => integration.pollingEnabled\n        );\n        if (phoneIntegrations.length > 0) {\n            phoneIntegrations.forEach(integration => this._managePolling(integration));\n        }\n    }),\n\n    init() {\n        this._super(...arguments);\n\n        this.set('presenceErrors', {});\n\n        // remove intervals if 401 happens\n        this.session.on('invalidatingAuthSession', this.removeAllPresenceIntervals.bind(this));\n    },\n\n    _managePolling(integration) {\n        const interval =\n            integration.pollIntervalSec && integration.pollIntervalSec > 0\n                ? integration.pollIntervalSec\n                : DEFAULT_PRESENCE_INTERVAL_SEC;\n        const presenceTimer = later(\n            this,\n            function () {\n                this._handlePresenceInterval(integration);\n                this._managePolling(integration);\n            },\n            interval * 1000\n        );\n        if (!this.get(`presenceIntervalTimers.${integration.key}`)) {\n            this.logger.debug(`Starting presence interval for ${integration.key}`, { integration });\n            this.set(`presenceIntervalTimers.${integration.key}`, {\n                timer: presenceTimer,\n                hasSession: false\n            });\n        }\n    },\n\n    removeAllPresenceIntervals() {\n        const timers = this.presenceIntervalTimers;\n        this.logger.info('Stopping all presence intervals due to 401', {\n            intervals: this.presenceIntervalTimers\n        });\n        Object.keys(timers).forEach(timerKey => {\n            cancel(this.get(`presenceIntervalTimers.${timerKey}`));\n        });\n    },\n    removePresenceInterval(integration) {\n        this.logger.info(`Stopping the presence interval for ${integration.key}`, {\n            integration\n        });\n        const timer = this.get(`presenceIntervalTimers.${integration.key}`);\n        cancel(timer);\n    },\n\n    async updateSessionData(integration) {\n        const url = this.application.pcV2Uri(\n            `api/v2/integrations/unifiedcommunications/${integration.key}/auth/users/status`\n        );\n        const sessionData = await this.ajax.request(url);\n        if (sessionData) {\n            if (sessionData.code === 'session.not.available') {\n                this.set(`presenceIntervalTimers.${integration.key}.hasSession`, false);\n            } else {\n                this.set(`presenceIntervalTimers.${integration.key}.hasSession`, true);\n            }\n        }\n        return sessionData;\n    },\n\n    async _handlePresenceInterval(integration) {\n        try {\n            const hasSession = this.get(`presenceIntervalTimers.${integration.key}.hasSession`);\n            if (!hasSession) {\n                await this.updateSessionData(integration);\n                const fetchedSession = this.get(`presenceIntervalTimers.${integration.key}.hasSession`);\n                if (!fetchedSession) return;\n            }\n\n            // try looking at the cache instead of making an api call\n            const users = this.store.peekAll('person');\n            const currentDate = moment();\n            const filteredUsers = users.filter(\n                user =>\n                    user.integrationContactInfo(integration.key) !== undefined &&\n                    user.integrationContactInfo(integration.key) !== null\n            );\n\n            // filter users based on presence modified date\n            let integrationUsers = filteredUsers.filter(user => {\n                const modifiedDate = user.get('integrationPresence.modifiedDate');\n                if (!modifiedDate) {\n                    return true;\n                }\n                return modifiedDate && this._isPresenceStale(currentDate, modifiedDate);\n            });\n\n            if (integrationUsers.length > 0) {\n                const integrationUsersIds = integrationUsers.map(user => user.get('id'));\n                let batchSize = PRESENCE_BATCH_SIZE_V2;\n                // batch integration user ids\n                const batchedIds = batchEntityIds(integrationUsersIds, batchSize);\n\n                const authError = await this._handleBatchPresenceRequest(integration, integrationUsers, batchedIds);\n                if (authError) {\n                    this._handleAuthError(integration);\n                    this.set(`presenceIntervalTimers.${integration.key}.hasSession`, false);\n                }\n            } else {\n                // log no users found\n                this.logger.info(\n                    `services/integrations-presence: (${integration.key}): Did not find users to refresh presence.`\n                );\n            }\n        } catch (err) {\n            // scary err happened, stop the interval\n            this.removePresenceInterval(integration);\n            this.logger.error(`services/integrations-presence: error fetching presence in interval`, {\n                err\n            });\n        }\n    },\n\n    /**\n     * Handle batch presence requests\n     * @param {*} integration client app integration\n     * @param {*} batchedIds 2d array, inner array is list of integration user ids\n     * @param {*} authErrors list of client app integration's that errored on auth\n     */\n    async _handleBatchPresenceRequest(integration, integrationUsers, batchedIds, bypassCache = false) {\n        let authError;\n        for (let i = 0; i < batchedIds.length; i++) {\n            const ids = batchedIds[i];\n            const idParams = ids.join(',');\n            const ucIntegrationId = integration.key;\n            const requestLatest = bypassCache ? 'true' : 'false'; // tells api to bypass cache if true\n            const url = this.application.pcV2Uri(\n                `api/v2/integrations/unifiedcommunications/${ucIntegrationId}/presences?requestLatest=${requestLatest}&id=${idParams}`\n            );\n            // ucIntegrationId should be the integration.key\n            try {\n                const presenceUserList = await this.ajax.request(url);\n\n                // for each presence response, find the user\n                // and update the presence for that user\n                // each user is an Ember model object so should update entire app\n                presenceUserList.forEach(presenceResponse =>\n                    this._handleIndividualPresenceResponse(integrationUsers, presenceResponse)\n                );\n            } catch (err) {\n                if (this.phoneIntegrations.isIntegrationAuthError(err)) {\n                    authError = err;\n                    this.logger.warn(\n                        `services/integrations-presence: You are not authenticated with the following 3rd party integration: ${integration.key}`,\n                        {\n                            err\n                        }\n                    );\n                    break;\n                } else {\n                    throw err;\n                }\n            }\n        }\n        return authError;\n    },\n\n    /**\n     * Finds and updates presence for integration user.\n     * @param {*} integrationUsers list of integration users\n     * @param {*} presenceResponse individual presence response\n     */\n    _handleIndividualPresenceResponse(integrationUsers, presenceResponse) {\n        const user = integrationUsers.find(u => u.get('id') === get(presenceResponse, 'userId'));\n        if (user) {\n            const presence = {\n                source: get(presenceResponse, 'source'),\n                message: get(presenceResponse, 'message'),\n                modifiedDate: get(presenceResponse, 'modifiedDate'),\n                presenceDefinition: get(presenceResponse, 'presenceDefinition')\n            };\n            set(user, 'activities.integrationPresence', presence);\n        }\n    },\n\n    _handleAuthError(integration) {\n        const hasShownError = this.get(`presenceErrors.${integration.key}`);\n        if (!hasShownError) {\n            const title = this.intl.t('integrationPresence.errors.auth.title');\n            // show specific toast with action handler\n            let message = this.intl.t(`integrationPresence.errors.auth.${integration.key}.message`);\n            this.notification.show({\n                title: title,\n                message: message,\n                hideAfter: 8,\n                type: 'info',\n                clickHandler: () => {\n                    let sidebar = this.sidebar;\n                    if (integration) {\n                        let appId = get(integration, 'id');\n                        sidebar.openPanel(appId);\n                    }\n                }\n            });\n            this.set(`presenceErrors.${integration.key}`, true);\n        }\n    },\n\n    async alterUsersWithIntegration(users) {\n        const groupedUsers = this._groupUsersByIntegration(users);\n        const presenceSources = Object.keys(groupedUsers);\n        const phoneIntegrations = this.get('phoneIntegrations.integrations');\n\n        const promises = presenceSources.map(presenceSource => {\n            const integration = phoneIntegrations.find(\n                phoneIntegration =>\n                    phoneIntegration.integrationPresenceSource.toLowerCase() === presenceSource.toLowerCase()\n            );\n            const integrationUsers = groupedUsers[presenceSource];\n            const integrationUsersIds = integrationUsers.map(user => user.get('id'));\n            let batchSize = PRESENCE_BATCH_SIZE_V2;\n            // batch integration user ids\n            const batchedIds = batchEntityIds(integrationUsersIds, batchSize);\n            // ensure that bypassCache is true to get latest presence requests\n            return this._handleBatchPresenceRequest(integration, integrationUsers, batchedIds, true);\n        });\n\n        try {\n            await Promise.all(promises);\n        } catch (err) {\n            this.logger.error('services/integrations-presence: error occurred with alterUsersWithIntegration', {\n                err\n            });\n        }\n\n        return users;\n    },\n\n    _groupUsersByIntegration(users) {\n        const usersGroupedByIntegration = {};\n\n        for (const user of users) {\n            let integrationPhone = get(user, 'integrationPhone');\n            let integrationKey = integrationPhone && integrationPhone.value.integration;\n            const integrationConfig = this.phoneIntegrations.getIntegration(integrationKey);\n            if (integrationConfig) {\n                const presenceSource = integrationConfig.integrationPresenceSource;\n                if (!usersGroupedByIntegration[presenceSource]) {\n                    usersGroupedByIntegration[presenceSource] = [];\n                }\n                usersGroupedByIntegration[presenceSource].push(user);\n            }\n        }\n\n        return usersGroupedByIntegration;\n    },\n\n    sendNewRelicAction(metric, value, ucIntegrationKey) {\n        //capture analytics & send to new relic for UC Integrations\n        addPageAction(this.newRelicNamespace, {\n            metric,\n            value,\n            ucIntegrationKey\n        });\n    },\n    _isPresenceStale(currentDate, modifiedDate) {\n        let diffInMS = moment(currentDate).diff(moment(modifiedDate));\n        return diffInMS > this.presencePollInterval;\n    },\n    _isGCOffline(user) {\n        const presenceDefinition = user.get('activities.presence.presenceDefinition');\n        return isPresence(this.get('session.presenceMap'), presenceDefinition, 'offline');\n    }\n});\n","import { readOnly, reads, and } from '@ember/object/computed';\nimport { getOwner } from '@ember/application';\nimport { A } from '@ember/array';\nimport { computed, get, observer, set } from '@ember/object';\nimport Evented from '@ember/object/evented';\nimport { once } from '@ember/runloop';\nimport Service, { inject } from '@ember/service';\nimport { task, timeout } from 'ember-concurrency';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport debounce from 'lodash/debounce';\nimport RSVP from 'rsvp';\nimport AcdUtilitiesMixin from 'web-directory/mixins/acd-utilities';\nimport { MEDIA_TYPES } from 'web-directory/models/interaction/interaction';\nimport { isTesting } from 'web-directory/utils/testing';\nimport { getQueueMediaSettings } from 'web-directory/utils/acd-ts';\nimport SimpleCache from 'web-directory/utils/simple-cache';\n\nconst MAX_WAIT = 8000;\nconst HoldableInteractions = new Set(['callback', 'chat', 'email', 'message']);\nconst mixins = [Evented, AcdUtilitiesMixin, LoggerMixin];\nconst MISSING_PARTICIPANTS_MONITOR_INTERVAL = 5000;\nconst TEN_MINUTES = 600000;\nconst CACHE_TTL = 5; // minutes\nconst PARK_RESUME_DAYS_CACHE_TTL = 10; //minutes\n\nexport const ANSWER_INTERACTION_EVENT = 'answerInteractionEvent';\n\nexport default Service.extend(...mixins, {\n    application: inject(),\n    intl: inject(),\n    chat: inject(),\n    ajax: inject(),\n    communication: inject(),\n    acdchat: inject(),\n    acdcall: inject(),\n    acdcallback: inject(),\n    acdemail: inject(),\n    acdsms: inject(),\n    acdworkitem: inject('acdworkitem'),\n    session: inject(),\n    sidebar: inject(),\n    commandNav: inject('command-nav'),\n    phone: inject(),\n    sound: inject(),\n    notification: inject(),\n    permissions: inject(),\n    ring: inject(),\n    logger: inject('stash-logger'),\n    pigeon: inject(),\n    queue: inject(),\n    webrtc: inject(),\n    webrtcsdk: inject('webrtc-sdk'),\n\n    /**\n     * the next time that the org settings can be fetched at.\n     * {null | number}\n     */\n    conversationsSettingsFetchAt: null,\n    orgLevelConversationsSettings: { communicationBasedACW: false },\n    optimizeOrgFetching: readOnly('session.features.ACE-4461_org-settings-fetch'),\n    // Feature toggle to enable ring timeouts from qms | ACE-2879 | PURE-3878\n    ftAcdRingTimeout: computed('session.features', function () {\n        return this.get('session.features')['assignment.audioAlertDuration'];\n    }).readOnly(),\n\n    /**\n     * @attribute\n     * Simple cache that holds the audio ring time duration for auto answered workitems.\n     *\n     * We have to request the queue details for workitems because the mediaSettings\n     * are not on the interaction like they are for other digital conversations.\n     */\n    autoAnswerWorkitemRingTimeCache: new SimpleCache(),\n\n    /**\n     * @attribute\n     * Cache for park.resume.days.max limit\n     * We have to request the park resume days limit from the API because it is not on the interaction.\n     */\n    parkResumeDaysLimitCache: new SimpleCache(),\n\n    AAHoldingEnabled: readOnly('session.features.PURE-7111_aa-holding'),\n    acdEngagementSourcesFT: readOnly('session.features.PURE-5534_OpenMessagingEngagementSourceTagging'),\n\n    isTypingInteractions: computed(\n        'activeChats.[]',\n        'acdchat._typingIndicators.@each.timer',\n        'chat.responding.[]',\n        'acdsms.activeSms.[]',\n        'acdsms._typingIndicators.@each.timer',\n        function () {\n            const chats = this.get('interaction.activeChats') || [];\n            const sms = this.get('acdsms.activeSms') || [];\n            const typingChats = chats.reduce((acc, chat) => {\n                const id = get(chat, 'id');\n                if (get(chat, 'isV2Provider')) {\n                    const typingIndicatorForChat = this.acdchat.getTypingIndicator(id);\n                    if (!!typingIndicatorForChat) {\n                        acc.push(id);\n                    }\n                } else {\n                    const responding = this.get('chat.responding');\n                    if (responding) {\n                        const respondingList = responding[get(chat, 'room.jid')];\n                        if (respondingList && respondingList.length > 0) {\n                            acc.push(id);\n                        }\n                    }\n                }\n                return acc;\n            }, []);\n\n            const typingSms = sms.reduce((acc, smsInteraction) => {\n                const id = smsInteraction.get('id');\n                if (!!this.acdsms.getTypingIndicator(id)) {\n                    acc.push(id);\n                }\n                return acc;\n            }, []);\n\n            return typingChats.concat(typingSms);\n        }\n    ),\n\n    canCreateEmail: reads('permissions.canEmailOnBehalfOfQueue'),\n    canSendMessage: and('permissions.canSendMessageOnBehalfOfQueue'),\n    canMakeCall: reads('permissions.phoneEnabled'),\n    canSubscribeToSummary: reads('permissions.canViewSummary'),\n\n    outboundMedia: computed('canSendMessage', 'canCreateEmail', 'canMakeCall', function () {\n        return [\n            {\n                media: 'call',\n                buttonClass: 'new-call',\n                iconClass: 'pc-moon pc-phone',\n                title: 'purecloud.makeACall',\n                canCreate: this.canMakeCall\n            },\n            {\n                media: 'email',\n                buttonClass: 'new-email',\n                iconClass: 'pc-moon pc-email',\n                title: 'purecloud.acdEmail.sendEmail',\n                canCreate: this.canCreateEmail\n            },\n            {\n                media: 'sms',\n                buttonClass: 'new-message',\n                iconType: 'svg',\n                title: 'purecloud.acdInteraction.sms.sendMessage',\n                canCreate: this.canSendMessage\n            }\n        ];\n    }),\n\n    /**\n     * Fetches org settings for conversations\n     * @return {obj} object containing conversation settings\n     * example: {\"communicationBasedACW\":false, \"includeNonAgentConversationSummary\":true}\n     */\n    fetchConversationsSettings() {\n        const url = this.application.pcV2Uri(`api/v2/conversations/settings`);\n        return this.ajax.request(url);\n    },\n\n    /**\n     * Fetches org settings for conversations.\n     * Sets orgLevelConversationsSettings property with object containing conversation settings\n     * example: {\"communicationBasedACW\":false, \"includeNonAgentConversationSummary\":true}\n     *\n     * @returns {Promise<object>} a Promise with an object containing the organization level ACW settings\n     */\n    fetchCommunicationBasedACWSetting() {\n        if (!this.get('permissions.canViewConversationSettings')) {\n            return RSVP.Promise.resolve(this.get('orgLevelConversationsSettings'));\n        }\n\n        if (this.get('optimizeOrgFetching')) {\n            const settings = this.get('orgLevelConversationsSettings');\n            const fetchAt = this.get('conversationsSettingsFetchAt');\n            const shouldFetch = fetchAt ? fetchAt < Date.now() : true;\n\n            // if the fetch time has expired, and settings are set, we can avoid the extra fetch and take the cache\n            if (settings && !shouldFetch) return RSVP.Promise.resolve(settings);\n\n            // reset the timer by default in case of failure or no response\n            this.set('conversationsSettingsFetchAt', null);\n        }\n\n        return this.fetchConversationsSettings()\n            .then(response => {\n                if (response) {\n                    // we only want to store the settings if a value has been returned\n                    this.set('orgLevelConversationsSettings.communicationBasedACW', response.communicationBasedACW);\n\n                    // set the fetchAt 10 minutes from now\n                    this.set('conversationsSettingsFetchAt', new Date().valueOf() + TEN_MINUTES);\n                    this.logger.debug('ACD:ACW:init setting AgentRequest ', {\n                        communicationBasedACW: response.communicationBasedACW\n                    });\n                }\n                return response;\n            })\n            .catch(error => {\n                this.logger.error('ACD:ACW:init reading orgLevelConversationsSettings.communicationBasedACW ', {\n                    error\n                });\n                return this.orgLevelConversationsSettings;\n            })\n            .finally(response => {\n                this.logger.debug('ACD:ACW:init reading orgLevelConversationsSettings.communicationBasedACW ', {\n                    communicationBasedACW: this.get('orgLevelConversationsSettings.communicationBasedACW')\n                });\n                return response;\n            });\n    },\n\n    init() {\n        this._super(...arguments);\n        this.updateOnQueueStatus();\n        this.set('panelStateHash', {});\n        this._listenForAutoAnswer();\n        this.pigeon.on('connect', this, this._subscribeToSummaryTopic);\n\n        if (!isTesting) {\n            this._monitorInteractionsWithMissingParticipants.perform();\n        }\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        this.pigeon.off('connect', this, this._subscribeToSummaryTopic);\n        this._unsubscribeFromSummaryTopic();\n    },\n\n    panelStateHash: null,\n    selectedInteraction: null,\n    isOnQueue: false,\n\n    modalActiveTab: null,\n    showInteractionModal: false,\n    showDialpad: false,\n\n    activeCalls: readOnly('acdcall.activeCalls'),\n    activeChats: readOnly('acdchat.activeChats'),\n\n    /**\n     * Will subscribe to Summary notifications topic\n     */\n    _subscribeToSummaryTopic() {\n        if (this.isDestroyed || this.isDestroying || !this.canSubscribeToSummary) {\n            return;\n        }\n        const guid = this.get('session.person.guid');\n        const summaryTopic = `v2.users.${guid}.conversations.summaries`;\n        this.pigeon.registerPriorityTopic(summaryTopic, 'conversation-summary');\n    },\n    /**\n     * Will unsubscribe to Summary notifications topic\n     */\n    _unsubscribeFromSummaryTopic() {\n        if (!this.canSubscribeToSummary) return;\n        const guid = this.get('session.person.guid');\n        const summaryTopic = `v2.users.${guid}.conversations.summaries`;\n        this.pigeon.unRegisterPriorityTopic(summaryTopic);\n    },\n\n    fixJid(roomId) {\n        return `${roomId.split('@')[0]}@conference.${this.get('session.org.shortName')}.orgspan.com`;\n    },\n\n    getInteraction(interactionId) {\n        return (this.activeInteractions || []).find(model => model.id === interactionId);\n    },\n\n    /**\n     * Gets the messaging park resume days limit from cache or API\n     * Public method that can be called from components\n     * Checks cache first, then delegates to session service for API call if cache miss\n     * @returns {Promise<number>} Promise resolving to the max days offset from today (defaults to 7 if API fails)\n     */\n    getParkResumeDaysLimit() {\n        const cache = this.parkResumeDaysLimitCache;\n        const cacheKey = 'parkResumeDaysMax';\n        const cachedValue = cache.get(cacheKey);\n\n        if (cachedValue !== undefined) {\n            return RSVP.Promise.resolve(cachedValue);\n        }\n\n        return this.session\n            .getOrganizationLimits('messaging')\n            .then(entities => {\n                const parkResumeLimit = entities.find(entity => entity.key === 'park.resume.days.max');\n\n                if (parkResumeLimit && typeof parkResumeLimit.value === 'number') {\n                    const totalDays = Math.floor(parkResumeLimit.value);\n                    cache.set(cacheKey, totalDays, PARK_RESUME_DAYS_CACHE_TTL);\n                    return totalDays;\n                }\n\n                const defaultOffset = 7;\n                cache.set(cacheKey, defaultOffset, PARK_RESUME_DAYS_CACHE_TTL);\n                return defaultOffset;\n            })\n            .catch(error => {\n                this.logger.error('Failed to fetch park.resume.days.max limit', { error });\n                const defaultOffset = 7;\n                cache.set(cacheKey, defaultOffset, PARK_RESUME_DAYS_CACHE_TTL);\n                return defaultOffset;\n            });\n    },\n\n    openAcdInteraction() {\n        if (this.get('session.useNewNav')) {\n            this.commandNav.selectPanel('agent');\n        } else {\n            if (this.get('sidebar.communicationPanel') !== 'acdInteractions') {\n                this.sidebar.togglePanel('acdInteractions');\n            }\n        }\n        this._destroyAutoAnswerNotification();\n    },\n\n    answerInteraction() {\n        const interaction = this.get('alertingInteractions.firstObject');\n        this._answerInteraction.perform(interaction);\n        this.trigger(ANSWER_INTERACTION_EVENT, { interaction });\n    },\n\n    declineInteraction() {\n        const interaction = this.get('alertingInteractions.firstObject');\n        this._declineInteraction.perform(interaction);\n    },\n\n    _answerInteraction: task(function* (interaction) {\n        interaction = interaction || this.selectedInteraction;\n        const type = get(interaction, 'type');\n        let errorKey, promise;\n\n        if (type === 'chat' && this.get('chat.connected')) {\n            promise = this.acdchat.answerChat(interaction);\n            errorKey = 'purecloud.acdInteraction.chats.errors.answer';\n        } else if (type === 'call') {\n            // Error handling and debouncing for calls is in phone service\n            this.phone.answer(interaction.get('conversation'));\n            promise = RSVP.Promise.resolve();\n        } else if (type === 'email') {\n            promise = this.acdemail.answer(interaction);\n            errorKey = 'purecloud.acdInteraction.emails.errors.answer';\n        } else if (type === 'callback') {\n            promise = this.acdcallback.answer(interaction);\n            errorKey = 'purecloud.acdInteraction.callbacks.errors.answer';\n        } else if (type === 'message') {\n            promise = this.acdsms.answer(interaction);\n            errorKey = 'purecloud.acdInteraction.sms.errors.answer';\n        } else {\n            promise = RSVP.Promise.resolve();\n        }\n\n        this.ring.stopRingtone('digital');\n        this.logger.debug('Stop digital alerting due to answering interaction.');\n\n        yield promise\n            .then(() => {\n                this.openAcdInteraction();\n            })\n            .catch(() => {\n                if (errorKey) {\n                    this._displayError(errorKey);\n                }\n            })\n            .finally(() => {\n                const interactionId = get(interaction, 'id');\n                const hostedContext = this.get('application.hostedContext');\n                if (hostedContext) {\n                    hostedContext.dismissNotification(interactionId);\n                }\n            });\n    }).restartable(),\n\n    _declineInteraction: task(function* (interaction) {\n        interaction = interaction || this.selectedInteraction;\n        const type = get(interaction, 'type');\n        let promise, errorKey;\n\n        if (type === 'chat') {\n            promise = this.acdchat.declineChat(interaction);\n            errorKey = 'purecloud.acdInteraction.chats.errors.decline';\n        } else if (type === 'call') {\n            // Error handling and debouncing for calls is in phone service\n            this.phone.endCall(interaction.get('conversation'));\n            promise = RSVP.Promise.resolve();\n        } else if (type === 'email') {\n            promise = this.acdemail.decline(interaction);\n            errorKey = 'purecloud.acdInteraction.emails.errors.decline';\n        } else if (type === 'callback') {\n            promise = this.acdcallback.decline(interaction);\n            errorKey = 'purecloud.acdInteraction.callbacks.errors.decline';\n        } else if (type === 'message') {\n            promise = this.acdsms.decline(interaction);\n            errorKey = 'purecloud.acdInteraction.sms.errors.decline';\n        } else {\n            promise = RSVP.Promise.resolve();\n        }\n\n        this.ring.stopRingtone(this.digital);\n        this.logger.debug('Stop digital alerting due to declining interaction.');\n\n        yield promise\n            .catch(() => {\n                if (errorKey) {\n                    this._displayError(errorKey);\n                }\n            })\n            .finally(() => {\n                const interactionId = get(interaction, 'id');\n                const hostedContext = this.get('application.hostedContext');\n                if (hostedContext) {\n                    hostedContext.dismissNotification(interactionId);\n                }\n            });\n    }).restartable(),\n\n    _destroyAutoAnswerNotification() {\n        if (this.autoAnswerNotification) {\n            this.autoAnswerNotification.hide();\n        }\n        this.set('autoAnswerNotification', null);\n    },\n\n    computeSessionShareConnected() {\n        if (this.isDestroyed || this.isDestroying) {\n            return;\n        }\n        const interactions = this.activeRealtimeInteractions;\n        interactions.forEach(interaction => {\n            if (!interaction || get(interaction, 'isDestroyed') || get(interaction, 'isDestroying')) {\n                return;\n            }\n            if (get(interaction, 'isCallback')) {\n                return;\n            }\n            const state = get(interaction, 'sessionShareState') || '';\n            const isConnected = state.toLowerCase() === 'connected';\n\n            if (isConnected) {\n                // If we find a connected agent without having set the sessionShareExplicitlyInitiated property to true\n                // then we are dealing with a possible new opened tab\n                if (!get(interaction, 'sessionShareExplicitlyInitiated')) {\n                    set(interaction, 'sessionShareActiveOnLoad', true);\n                    set(interaction, 'isSessionSharing', true);\n                }\n                set(interaction, 'isRequestingNewSessionShare', false);\n            }\n        });\n    },\n\n    playSound: debounce(\n        function (autoAnswerSound = false) {\n            const volume = this.get('chat.interactionNotificationVolume') / 100;\n            if (volume <= 0) return;\n\n            if (autoAnswerSound) {\n                return this.sound.playSound('digital-no-repeat', volume);\n            }\n\n            this.sound.playSound('interaction', volume);\n        },\n        500,\n        { leading: true, trailing: false }\n    ),\n\n    stopAnimateAcdIcon: debounce(function () {\n        document\n            .querySelectorAll('.action-item.acd-interactions a')\n            .forEach(el => el.classList.remove('faa-horizontal', 'animated'));\n    }, 100),\n\n    _delayedStopAcdAnimation: task(function* () {\n        yield timeout(MAX_WAIT);\n        this.stopAnimateAcdIcon();\n    }),\n\n    //\n    // TODO for similar code exists in chat-room model\n    //\n    animateAcdIcon: debounce(\n        function () {\n            document\n                .querySelectorAll('.action-item.acd-interactions a')\n                .forEach(el => el.classList.add('faa-horizontal', 'animated'));\n            this._delayedStopAcdAnimation.perform();\n        },\n        MAX_WAIT,\n        { leading: true, trailing: false, maxWait: MAX_WAIT }\n    ),\n\n    activeConsultingInteractions: computed('acdcall.activeCalls.[]', 'acdcallback.activeCallbacks.[]', function () {\n        const interactions = A([]);\n        const activeCalls = this.get('acdcall.activeCalls');\n        const activeCallbacks = this.get('acdcallback.activeCallbacks');\n        activeCalls.concat(activeCallbacks).forEach(call => {\n            if (call.get('iAmConsultInitiator') || call.get('iAmConsulted')) {\n                interactions.pushObject(call);\n            }\n        });\n\n        return interactions;\n    }),\n\n    activeRealtimeInteractions: computed(\n        'acdchat.activeChats.[]',\n        'acdcall.activeCalls.[]',\n        'acdcallback.activeCallbacks.[]',\n        function () {\n            const interactions = A([]);\n\n            const activeChats = this.get('acdchat.activeChats') || [];\n            const activeCalls = this.get('acdcall.activeCalls') || [];\n            const activeCallbacks = this.get('acdcallback.activeCallbacks') || [];\n\n            activeCalls.forEach(call => {\n                if (\n                    !call.get('iAmConsultInitiator') &&\n                    !call.get('iAmConsulted') &&\n                    call.get('conversation.isAgentCall')\n                ) {\n                    interactions.pushObject(call);\n                }\n            });\n\n            activeCallbacks.forEach(callback => {\n                if (!callback.get('iAmConsultInitiator') && !callback.get('iAmConsulted')) {\n                    interactions.pushObject(callback);\n                }\n            });\n\n            activeChats.forEach(chat => {\n                interactions.pushObject(chat);\n            });\n\n            return interactions;\n        }\n    ),\n\n    activeConversations: computed('acdcall.activeCalls.[]', 'acdcallback.activeCallbacks.[]', function () {\n        const allCalls = this.get('acdcall.activeCalls') || [];\n        const activeCallbacks = this.get('acdcallback.activeCallbacks');\n        return A([].concat(allCalls, activeCallbacks))\n            .map(call => call.conversation)\n            .filter(call => !!call && Object.keys(call).length);\n    }),\n\n    activeNonRealtimeInteractions: computed('acdemail.activeEmails.[]', 'acdsms.activeSms.[]', function () {\n        const activeEmails = this.get('acdemail.activeEmails') || [];\n        const activeSms = this.get('acdsms.activeSms') || [];\n        return A([].concat(activeEmails, activeSms));\n    }),\n\n    activeInteractions: computed(\n        'activeRealtimeInteractions.[]',\n        'activeNonRealtimeInteractions.[]',\n        'activeConsultingInteractions.[]',\n        'application.isPopout',\n        function () {\n            return this.activeRealtimeInteractions.concat(\n                this.activeNonRealtimeInteractions,\n                this.activeConsultingInteractions\n            );\n        }\n    ),\n\n    acdCount: readOnly('activeInteractions.length'),\n\n    alertingInteractions: computed('activeInteractions.@each.isAlerting', function () {\n        const interactions = this.activeInteractions || [];\n        return interactions.filter(\n            interaction =>\n                (!interaction.get('isCall') ||\n                    (interaction.get('isCall') && interaction.get('conversation.isAgentCall'))) &&\n                interaction.get('isAlerting')\n        );\n    }),\n\n    connectedInteractions: computed('activeInteractions.@each.isConnected', function () {\n        const interactions = this.activeInteractions || [];\n        return interactions.filter(interaction => interaction.get('isConnected'));\n    }),\n\n    isInteractionViewOpen: computed(\n        'sidebar.communicationPanel',\n        'session.useNewNav',\n        'commandNav.currentPanel',\n        function () {\n            if (this.get('session.useNewNav')) {\n                return this.get('commandNav.currentPanel') === 'agent';\n            } else {\n                return this.get('sidebar.communicationPanel') === 'acdInteractions';\n            }\n        }\n    ),\n\n    hasLiveInteractions: computed('alertingInteractions.length', 'connectedInteractions.length', function () {\n        return this.get('alertingInteractions.length') > 0 || this.get('connectedInteractions.length') > 0;\n    }),\n\n    _missingParticipantsMap: null,\n\n    _monitorInteractionsWithMissingParticipants: task(function* () {\n        yield timeout(MISSING_PARTICIPANTS_MONITOR_INTERVAL);\n        const interactions = this.activeInteractions.filter(i => i.get('participants.length') <= 1);\n        const prevMissingParticipants = this._missingParticipantsMap || {};\n        const missingParticipantsMap = Object.fromEntries(\n            interactions.map(interaction => {\n                const interactionId = interaction.get('id');\n                const tickCount = (prevMissingParticipants[interactionId] || 0) + 1;\n                return [interactionId, tickCount];\n            })\n        );\n        this.set('_missingParticipantsMap', missingParticipantsMap);\n\n        const extractNonCustomerCommunicationData = communication => {\n            const { state, connectedTime, disconnectedTime } = communication;\n            return { state, connectedTime, disconnectedTime };\n        };\n\n        const extractNonCustomerParticipantData = participant => {\n            const communicationData = Object.fromEntries(\n                MEDIA_TYPES.map(type => [type, participant[type]])\n                    .filter(([, comms]) => comms && comms.length > 0)\n                    .map(([type, comms]) => [type, comms.map(extractNonCustomerCommunicationData)])\n            );\n            const { purpose, connectedTime, endTime } = participant;\n            return Object.assign({ purpose, connectedTime, endTime }, communicationData);\n        };\n\n        Object.entries(missingParticipantsMap).forEach(([interactionId, tickCount]) => {\n            const interaction = interactions.findBy('id', interactionId);\n            const participants = interaction.get('participants') || [];\n            if (tickCount >= 1) {\n                this.logger.warn('Found an interaction with missing participants', {\n                    remoteData: {\n                        interactionId,\n                        timestamp: new Date().toISOString(),\n                        duration: tickCount * MISSING_PARTICIPANTS_MONITOR_INTERVAL,\n                        participants: participants.map(extractNonCustomerParticipantData)\n                    }\n                });\n            }\n        });\n\n        this._monitorInteractionsWithMissingParticipants.perform();\n    }),\n\n    updateOnQueueStatus: observer('session.person.isOnQueue', function () {\n        const oldValue = this.isOnQueue;\n        const newValue = this.get('session.person.isOnQueue');\n        const valueChanged = oldValue !== newValue;\n\n        if (valueChanged) {\n            this.set('isOnQueue', newValue);\n        }\n\n        if (!this.get('application.isPopout') && valueChanged && this.isOnQueue) {\n            this.handleGoingOnQueueTask.perform();\n        }\n    }),\n\n    handleGoingOnQueueTask: task(function* () {\n        yield timeout(200);\n\n        if (\n            this.isOnQueue &&\n            !this.get('session.useNewNav') &&\n            this.get('sidebar.communicationPanel') !== 'acdInteractions'\n        ) {\n            this.sidebar.togglePanel('acdInteractions');\n        }\n    }).restartable(),\n\n    hasActiveSessionShare: computed('activeRealtimeInteractions.@each.{sessionShareActive}', function () {\n        return (this.activeRealtimeInteractions || []).some(interaction => interaction.get('sessionShareActive'));\n    }),\n\n    setSessionShareConnected: observer(\n        'activeRealtimeInteractions.@each.{sessionShareState,isCallback,sessionShareExplicitlyInitiated}',\n        function () {\n            once(this, 'computeSessionShareConnected');\n        }\n    ),\n\n    updateOldWrapupCodes: observer('activeInteractions.@each.isWrapupCodeSet', function () {\n        const interactions = this.activeInteractions || [];\n        interactions.forEach(interaction => {\n            if (interaction && !get(interaction, 'isDestroyed') && !get(interaction, 'isDestroying')) {\n                if (\n                    get(interaction, 'isWrapupCodeSet') &&\n                    get(interaction, 'selectedWrapupCode') !== get(interaction, 'oldWrapupCode')\n                ) {\n                    set(interaction, 'wrapupNotSaved', true);\n                }\n                set(interaction, 'oldWrapupCode', get(interaction, 'selectedWrapupCode'));\n            }\n        });\n    }),\n\n    checkDisconnectedChatRooms: observer('acdchat.activeChats.@each.isDisconnected', function () {\n        const disconnectedChats = this.get('acdchat.activeChats').filterBy('isDisconnected', true);\n        disconnectedChats.forEach(chat => {\n            const room = get(chat, 'room');\n            if (room) {\n                const roomId = get(chat, 'roomId');\n                const roomJid = this.fixJid(roomId);\n                this.chat.leaveAcdRoom(roomId);\n                this.chat.leaveAcdRoom(roomJid);\n            }\n        });\n    }),\n\n    /**\n     * Sets the interaction provided as the newly selected interaction while also taking care of\n     * the holding and unholding of the other interactions as needed.\n     *\n     * @note not supported for PEF\n     * @note selectedInteraction can be `null`, which means everything will be held, and nothing unheld in this context.\n     * @param {Object | null} selectedInteraction the interaction to set as the newly selected interaction\n     * @param {boolean} automated `true` if the selection was automated\n     * @returns {Promise<Object | null>} the newly selected interaction or null if no selection was made\n     */\n    async setSelectedInteraction(\n        selectedInteraction,\n        options = {\n            automated: false,\n            skipHolding: false\n        }\n    ) {\n        const { automated, skipHolding } = { automated: false, skipHolding: false, ...options };\n\n        // the currently selected interaction, before the incoming `selectedInteraction` is applied.\n        const currentInteraction = this.selectedInteraction;\n\n        // if the current and selected interactions are equal and the interactions have the same id and\n        // type, lets return the current interaction since it's already selected.\n        // Note that the id AND type comparison is to appease the callback to call scenario.\n        if (\n            selectedInteraction &&\n            currentInteraction &&\n            selectedInteraction.id === currentInteraction.id &&\n            selectedInteraction.type === currentInteraction.type\n        ) {\n            return currentInteraction;\n        }\n\n        // The idea here is that if currentInteraction (which is the current selectedInteraction) does not exist anymore,\n        // meaning it was removed from active interactions array by a media service in the processing chain, then this is\n        // likely the case where it has been cleaned out so we no longer need to hold other interactions.\n        const doesCurrentInteractionExist = currentInteraction && !!this.getInteraction(currentInteraction.id);\n        const currentInteractionDismissed = !doesCurrentInteractionExist && !selectedInteraction;\n\n        // If we don't want to handle holding then skip it.\n        // @note created due to not wanting to manage holding for PEF related selections\n        // If not skipping hold and if current interaction is not dismissed then proceed with hold\n        if (!skipHolding && !currentInteractionDismissed) {\n            // We need to iterate through all of the active interaction in case there was an interaction that was not\n            // held during init or across multiple active sessions. We will determine if each interaction needs to be\n            // held independently from one another. If there is a call-to-call scenario, then we need to wait for the\n            // holding tasks to complete before advancing.\n            const waitForTasks = [];\n            const selectedInteractionType = selectedInteraction ? selectedInteraction.type : null;\n\n            (this.activeInteractions || []).forEach(interaction => {\n                if (!selectedInteraction || selectedInteraction.id !== interaction.id) {\n                    const isCallToCall = interaction.type === 'call' && selectedInteractionType === 'call';\n                    const task = this._getHoldInteractionTask(interaction, isCallToCall, automated);\n                    if (task) {\n                        if (isCallToCall) waitForTasks.push(task());\n                        else {\n                            // we do not want to throw this error, if it's not call to call we can keep moving\n                            task().catch(error => {\n                                this.logger.error('There was an issue during automatic holding', {\n                                    remoteData: { error }\n                                });\n                            });\n                        }\n                    } else if (\n                        !automated &&\n                        interaction.type === 'call' &&\n                        !get(interaction, 'isHeld') &&\n                        selectedInteractionType === 'call'\n                    ) {\n                        /**\n                         * we enforce a `true` for `isCallToCall` because a value here implies that the newly selected\n                         * interaction is a call, and everything in this array is also a call, and we can only allow\n                         * one call stream open at a time.\n                         *\n                         * @example [ACE-4278] On a call, select digital interaction, select a different call. The call\n                         * interaction needs to go on hold, while the new interaction needs to be unheld, which is not\n                         * technically a call-to-call like it's handled above.\n                         */\n                        const task = this._getHoldInteractionTask(interaction, true, false);\n                        if (task) waitForTasks.push(task());\n                    }\n                }\n            });\n\n            // In case there is more than one interaction that needs to be held, we will resolve in a Promise.all to\n            // make the calls happen at the same time, speeding the process up a bit.\n            if (waitForTasks.length) {\n                await RSVP.allSettled(waitForTasks)\n                    .then(promises => {\n                        const hasError = promises.some(p => p.state === 'rejected');\n                        if (hasError) throw Error('There was an error with one of the requests');\n                    })\n                    .catch(error => {\n                        this._displayError('purecloud.acdInteraction.errors.hold');\n                        this.logger.error('There was an issue resolving `waitForTasks` during automatic holding', {\n                            remoteData: { error }\n                        });\n                        throw Error('There was an issue resolving `waitForTasks` during holding');\n                    });\n            }\n\n            // if the incoming interaction is being held, and the selection was not automated or the interaction\n            // is not a call, auto unhold for the user.\n            // Essentially, if it's a manual selection by the user or if the interaction is not a call, then we\n            // can safely unhold the interaction for the user if the interaction was being held.\n            if (\n                selectedInteraction &&\n                (!automated || selectedInteraction.type !== 'call') &&\n                get(selectedInteraction, 'isHeld')\n            ) {\n                this.communication.unhold(selectedInteraction).catch(error => {\n                    this._displayError('purecloud.acdInteraction.errors.unhold');\n                    this.logger.error('There was an issue automatically unholding the interaction', {\n                        remoteData: { id: selectedInteraction.id, error }\n                    });\n                });\n            }\n        }\n\n        // After all of the previous logic runs, lets check if the interaction is still available to be selected.\n        // If the selected interaction is null or there are no active interactions, we want to set our selected\n        // state to `null` to indicate no selection has been made.\n        if (!selectedInteraction || !this.activeInteractions.length) {\n            this.set('selectedInteraction', null);\n            return null;\n        } else if (!get(selectedInteraction, 'isDestroyed') && !get(selectedInteraction, 'isDestroying')) {\n            this.set('selectedInteraction', selectedInteraction);\n            return selectedInteraction;\n        }\n\n        // If we made it to this point, the current interaction should persist, so lets return it.\n        this.set('selectedInteraction', currentInteraction);\n        return currentInteraction;\n    },\n\n    /**\n     * Determines and returns a task for holding the provided interaction based on a few\n     * differing scenarios such as automated selection, is the interaction holdable, connected,\n     * or already held.\n     *\n     * @param {Object} interaction the interaction to get the hold task for\n     * @param {boolean} isCallToCall `true` if the current and newly selected interaction are both calls\n     * @param {boolean} automated `true` if the selecting event was automated\n     * @returns {() => Promise<void> | null} a function to call containing a promise for holding the interaction provided\n     * or `null` if a call could not be determined\n     */\n    _getHoldInteractionTask(interaction, isCallToCall, automated) {\n        // Skip holding if the selection was automated or if the new interaction is not a call.\n        // Essentially, if it's a manual selection by the user or if the interaction is not a\n        // call (unless call-to-call), then we can safetly hold the interaction for the user.\n        if (\n            (!automated || interaction.type !== 'call') &&\n            (HoldableInteractions.has(interaction.type) || isCallToCall) &&\n            get(interaction, 'isConnected') &&\n            !get(interaction, 'isHeld')\n        ) {\n            return () => this.communication.hold(interaction);\n        }\n        return null;\n    },\n\n    _listenForAutoAnswer() {\n        this.webrtcsdk.on('autoAnswer', this, this._onAutoAnswer);\n        this.webrtc.on('autoAnswer', this, this._onAutoAnswer);\n        this.phone.on('autoAnswer', this, this._onAutoAnswer);\n        this.acdsms.on('autoAnswerDigital', this, this._onAutoAnswer);\n        this.acdemail.on('autoAnswerDigital', this, this._onAutoAnswer);\n        this.acdcallback.on('autoAnswerDigital', this, this._onAutoAnswer);\n        this.acdworkitem.on('autoAnswerDigital', this, this._onAutoAnswer);\n    },\n\n    async _onAutoAnswer(conversation, interactionType = 'voice', type = undefined) {\n        this.get('logger').info('Auto-answer event received', {\n            remoteData: {\n                conversationId: conversation ? get(conversation, 'id') : null,\n                interactionType,\n                type\n            }\n        });\n        if (interactionType !== 'voice') {\n            let queueMediaSettings, queueAARingTime;\n            if (this.ftAcdRingTimeout) {\n                const autoAnswerToneKey = 'autoAnswerAlertToneSeconds';\n                /**\n                 * If we have a work item, we need to request the queue details from the api\n                 * since the mediaSettings object does not live on the interaction.\n                 *\n                 * If the conversation is not a workitem, or the workitem has no queue id, or the\n                 * request fails, we fall back to just playing the typical digital alert tone.\n                 */\n                if (interactionType === 'workitem') {\n                    const workitemQueueId = get(conversation, 'workitem.queueId');\n                    if (workitemQueueId) {\n                        const ringTimeCache = this.autoAnswerWorkitemRingTimeCache;\n                        const cachedRingTimeForQueue = ringTimeCache.get(workitemQueueId);\n                        if (cachedRingTimeForQueue) {\n                            queueAARingTime = cachedRingTimeForQueue;\n                        } else {\n                            try {\n                                const res = await this.queue.getQueue(workitemQueueId);\n                                queueAARingTime = get(res, `mediaSettings.workitem.${autoAnswerToneKey}`);\n                                ringTimeCache.set(workitemQueueId, queueAARingTime, CACHE_TTL);\n                            } catch (e) {\n                                this.logger.error(`name: ${e.name}\\nmessage: ${e.message}\\nstack: $${e.stack}`);\n                            }\n                        }\n                    }\n                } else {\n                    queueMediaSettings = getQueueMediaSettings(conversation);\n                    queueAARingTime = get(queueMediaSettings, autoAnswerToneKey);\n                }\n\n                // Play alert tone for set amount of seconds. (0 ≤ x ≤ 900)\n                if (queueAARingTime > 0) {\n                    this.ring.playRingtone(get(conversation, 'id'), false, queueAARingTime * 1000, false, 'digital');\n                    /**\n                     * Filter out zero setting since we dont want to play any\n                     * sound in that case. Below case plays default, single\n                     * digital alert tone.\n                     */\n                } else if (queueAARingTime !== 0) {\n                    this.playSound(true);\n                }\n            } else {\n                this.playSound(true);\n            }\n\n            if (this.AAHoldingEnabled) {\n                // If the interaction is not held upon auto answering, we need to hold it\n                // to ensure only one interaction can be active at a time.\n                const interaction = this.activeInteractions.find(i => get(i, 'id') === get(conversation, 'id'));\n                const selectedInteraction = this.selectedInteraction;\n\n                if (\n                    interaction &&\n                    get(interaction, 'isConnected') &&\n                    !get(interaction, 'isHeld') &&\n                    selectedInteraction &&\n                    interaction.id !== selectedInteraction.id\n                ) {\n                    this.communication.hold(interaction).catch(error => {\n                        this.logger.error('There was an issue holding the auto answered interaction', {\n                            remoteData: { error, id: interaction.id }\n                        });\n                    });\n                }\n            }\n        }\n\n        if (this.isInteractionViewOpen && !this.get('application.browserHidden')) {\n            // Block notification for auto answer if panel is active/focused\n            return;\n        }\n\n        if (this.autoAnswerNotification) {\n            this._destroyAutoAnswerNotification();\n        }\n\n        if (type === 'unparking') {\n            this.set(\n                'parkResumeNotification',\n                this.notification.info(\n                    null,\n                    this.intl.t('purecloud.acdInteraction.parkResume.notification', {\n                        interactionType\n                    }),\n                    {\n                        showNotificationEverywhere: true,\n                        showCloseButton: true,\n                        hideAfter: 5,\n                        messageStyle: 'pin-to-top',\n                        type: 'park-resume-interaction-message',\n                        target: this,\n                        tag: 'park-resume-interaction-message',\n                        actionHandlers: {\n                            openAcdInteraction: this.intl.t('purecloud.acdInteraction.parkResume.view')\n                        }\n                    },\n                    getOwner(this)\n                )\n            );\n        } else {\n            this.set(\n                'autoAnswerNotification',\n                this.notification.info(\n                    null,\n                    this.intl.t('purecloud.acdInteraction.autoAnswer.notification', {\n                        interactionType\n                    }),\n                    {\n                        showNotificationEverywhere: true,\n                        showCloseButton: true,\n                        hideAfter: 5,\n                        messageStyle: 'pin-to-top',\n                        type: 'auto-answer-interaction-message',\n                        target: this,\n                        tag: 'auto-answer-interaction-message',\n                        actionHandlers: {\n                            openAcdInteraction: this.intl.t('purecloud.acdInteraction.autoAnswer.view')\n                        }\n                    },\n                    getOwner(this)\n                )\n            );\n        }\n    }\n});\n","import { and } from '@ember/object/computed';\nimport Service, { inject } from '@ember/service';\nimport RSVP from 'rsvp';\nimport ConversationMixin from 'web-directory/mixins/conversation';\nimport UriBuilder from 'web-directory/mixins/conversation-uri-builder';\nimport participantStatuses from 'web-directory/utils/acdParticipantStatuses';\n\nexport type InternalMessagingDisconnectPayload = {\n    conversationId: string;\n    participantId: string;\n    communicationId: string;\n};\n\nexport type InternalMessagingTransferPayload = {\n    conversationId: string;\n    transferFromParticipantId: string;\n    transferToUserId: string;\n};\n\nexport type InternalMessagingSetupPayload = {\n    conversationId: string;\n    participantId: string;\n    targetUserId: string;\n};\n\nexport default Service.extend(UriBuilder, ConversationMixin, {\n    session: inject('session'),\n    permissions: inject('permissions'),\n\n    canSetupDigitalConsult: and('session.features.PURE-5007_digitalConsult', 'permissions.canSetupDigitalConsult'),\n\n    setup(payload: InternalMessagingSetupPayload) {\n        if (!this.get('canSetupDigitalConsult')) return RSVP.Promise.reject(null);\n\n        const { conversationId, participantId, targetUserId } = payload;\n        const url = this.setupInternalMessageUri(conversationId, participantId);\n        return this.makeRequest(url, { data: { targetUserId } }, 'post');\n    },\n\n    /**\n     * Disconnects the user from the conversation using the required values.\n     * @param payload the additional information needed for a successful disconnect\n     */\n    disconnect(payload: InternalMessagingDisconnectPayload) {\n        const { conversationId, participantId, communicationId } = payload;\n        const url = this.communicationsUri(conversationId, participantId, 'messages', communicationId);\n        return this.makeRequest(url, { data: { state: participantStatuses.DISCONNECTED } }, 'patch');\n    },\n\n    transfer(payload: InternalMessagingTransferPayload) {\n        const { conversationId, transferFromParticipantId, transferToUserId } = payload;\n        const url = this.replaceUri(conversationId, transferFromParticipantId, null, null, 'agent');\n\n        return this.makeRequest(\n            url,\n            {\n                data: {\n                    transferType: 'Attended',\n                    keepInternalMessageAlive: false,\n                    userId: transferToUserId\n                }\n            },\n            'post'\n        );\n    }\n});\n","import { inject as service } from '@ember/service';\nimport { assign } from '@ember/polyfills';\nimport { on } from '@ember/object/evented';\nimport { htmlSafe } from '@ember/template';\nimport { computed, get } from '@ember/object';\nimport RSVP, { resolve, all, allSettled } from 'rsvp';\nimport IntlService from 'ember-intl/services/intl';\nimport _ from 'lodash';\nimport { isSameSiteNoneCompatible } from 'should-send-same-site-none';\nimport config from 'web-directory/config/environment';\nimport escape from 'web-directory/utils/escape';\nimport missingMessage from 'web-directory/utils/intl/missing-message';\nimport { getEnvCookieDomain } from 'web-directory/utils/net';\nimport { isTesting } from 'web-directory/utils/testing';\nimport { duplicateObject } from 'web-directory/utils/duplicate-object';\n\nconst addServerPrefix = function (key) {\n    return `server_translations.${key}`;\n};\n\nconst safeString = function (s) {\n    return htmlSafe(s);\n};\n\nconst rtlLangs = ['he', 'ar'];\n\n// Object [locale String]: languageName String\n// values come directly from each locale's `languageName` key\nconst languages = config.APP.INTL_LANGUAGES;\nconst localeCookie = 'pcAuth-userPrefLangTag';\nconst localeCookieOptions = {\n    path: '/',\n    expires: new Date(Date.now() + 90 * 24 * 60 * 60 * 1000)\n    // expiration is 90 days into the future\n};\nconst TEN_YEARS = 315360000; // in seconds\n\nexport default IntlService.extend({\n    ajax: service(),\n    cookies: service(),\n    application: service(),\n    session: service(),\n\n    loaded: false,\n    loadedPromise: null,\n\n    languages,\n    baseLocale: 'en-us',\n    supportedLocales: Object.keys(languages),\n\n    systemLocale: computed('baseLocale', function () {\n        const { languages, language, userLanguage } = window.navigator;\n        const lang = Array.isArray(languages) && languages[0];\n        const navLocale = lang || language || userLanguage;\n        if (navLocale) {\n            return navLocale;\n        }\n        return this.baseLocale;\n    }),\n\n    /**\n     * Sets the spark-enable-regional-dates cookie on init\n     */\n    updateIntlDateTimeCookieObserver: on('init', function () {\n        this.updateIntlDateTimeCookie();\n    }),\n\n    /**\n     * Sets the spark-enable-regional-dates cookie\n     */\n    updateIntlDateTimeCookie() {\n        this.setIntlDateTimeCookie();\n    },\n\n    /**\n     * Sets the spark-enable-regional-dates cookie on the application. Will alter the cookie values based on conditional values\n     * such as the current locations protocol as well as the current browser being viewed on.\n     * @param {{duration: number, deleteCookie: boolean, setCookie: function}} param0\n     */\n    setIntlDateTimeCookie({ duration = TEN_YEARS, deleteCookie = false, setCookie = this._setCookie } = {}) {\n        let cookieStmt = this.generateCookieStatement();\n        if (deleteCookie) {\n            cookieStmt += `;expires=Thu, 01 Jan 1970 00:00:00 UTC`;\n        } else {\n            cookieStmt += `;max-age=${duration}`;\n        }\n        setCookie(cookieStmt);\n    },\n\n    generateCookieStatement({\n        path = '/',\n        protocol = this._getCurrProtocol(),\n        domain = getEnvCookieDomain(),\n        userAgent = this._getCurrUserAgent()\n    } = {}) {\n        let cookieStmt = `spark-enable-regional-dates=true;path=${path};domain=${domain}`;\n\n        if (protocol === 'https:') {\n            cookieStmt += `;Secure`;\n        }\n\n        if (userAgent && typeof userAgent === 'string' && isSameSiteNoneCompatible(userAgent)) {\n            cookieStmt += `;SameSite=None`;\n        }\n        return cookieStmt;\n    },\n\n    /**\n     * Private function to set the provided cookie on the document\n     * @param {any} cookie the cookie w/ value to set\n     */\n    _setCookie(cookie) {\n        document.cookie = cookie;\n    },\n\n    /**\n     * Returns the windows current protocol. Expected `https:`\n     * @returns the windows protocol\n     */\n    _getCurrProtocol() {\n        if (window && window.location) {\n            return window.location.protocol;\n        }\n\n        return undefined;\n    },\n\n    /**\n     * Returns the users current browser agent\n     * @returns the users current browser agent\n     */\n    _getCurrUserAgent() {\n        if (navigator && navigator.userAgent) {\n            return navigator.userAgent;\n        }\n\n        return undefined;\n    },\n\n    isRTL: computed('isoLocale', function () {\n        const isoLocale = this.isoLocale;\n        return rtlLangs.includes(isoLocale);\n    }),\n\n    isoLocale: computed('locale.firstObject', function () {\n        return this.get('locale.firstObject');\n    }),\n\n    iso2LocaleCountry: computed('isoLocale', function () {\n        const isoLocale = this.isoLocale;\n        if (isoLocale) {\n            const countryData = window.intlTelInputGlobals.getCountryData();\n            const region = isoLocale.split('-')[1] || isoLocale;\n            if (region) {\n                return _.find(countryData, country => country && country.iso2 === region);\n            }\n        }\n        return null;\n    }),\n\n    isoRegionalLocale: computed('isoLocale', function () {\n        const [locale, region] = this.isoLocale.split('-');\n        if (region) {\n            return `${locale}-${region.toUpperCase()}`;\n        }\n        return locale;\n    }),\n\n    t(key, options = {}, noEscape) {\n        if (!key) {\n            console.warn('There was no key provided to translate.');\n            return '';\n        }\n\n        // Guard against null being passed explicitly — JS default params don't\n        // cover null, and the base t() will crash reading options.fallback\n        let opts = duplicateObject(options || {});\n\n        if (!opts.fallback) opts.fallback = key;\n        opts.locale = this.get('locale');\n\n        if (noEscape === true) {\n            return this._super(key, opts);\n        }\n\n        return this._super(key, escape(opts));\n    },\n\n    safestring(key, options = {}, noEscape) {\n        return safeString(this.t(key, options, noEscape));\n    },\n\n    _initialLocale() {\n        const authLocale = this.cookies.read(localeCookie);\n        const systemLocale = this.systemLocale;\n        return authLocale || systemLocale;\n    },\n\n    _normalizeLocale(locale, localeRootFallback = true) {\n        locale = locale.toLowerCase().replace('_', '-');\n        if (locale.startsWith('en')) {\n            locale = 'en-us';\n        }\n        if (locale.startsWith('nn') || locale.startsWith('nb')) {\n            // Norwegian: nn-NO; nb-NO in Windows\n            locale = 'no';\n        }\n        const supportedLocales = this.supportedLocales;\n        if (!supportedLocales.includes(locale)) {\n            const rootLocale = locale.slice(0, 2);\n            if (supportedLocales.includes(rootLocale)) {\n                return rootLocale;\n            } else if (localeRootFallback) {\n                return supportedLocales.find(lang => {\n                    return lang.slice(0, 2) === rootLocale;\n                });\n            } else {\n                return null;\n            }\n        }\n        return locale;\n    },\n\n    getWithServerKey(key) {\n        return safeString(this.t(addServerPrefix(key)));\n    },\n\n    lookup(key, locale, replacements, suppressError) {\n        if (this.exists(addServerPrefix(key))) {\n            return this.getWithServerKey(key);\n        }\n\n        if (!this.exists(key)) {\n            if (!isTesting && this.loaded) {\n                console.warn('Undefined intl key', { key, locale: this.locale });\n            }\n            return missingMessage(key, [this.locale], suppressError);\n        }\n\n        //Achieves parity with old i18n functionality: all HTML was allowed in all translation strings\n        return safeString(this._super(key, this.locale, replacements || {})).toString();\n    },\n\n    query(key) {\n        return this.exists(key) || this.exists(addServerPrefix(key));\n    },\n\n    setLocale(locales) {\n        if (!Array.isArray(locales)) {\n            locales = [locales];\n        }\n\n        let validLocales = locales.map(l => this._normalizeLocale(l)).filter(l => l);\n\n        const baseLocale = this.baseLocale;\n        if (!validLocales.includes(baseLocale)) {\n            validLocales.push(baseLocale);\n        }\n\n        if (validLocales.length) {\n            // Set HTML locale — Spark reads locale from the DOM `lang` attribute\n            const lang = validLocales[0].split('-')[0];\n            document.documentElement.setAttribute('lang', lang);\n        }\n\n        return this._super(validLocales);\n    },\n\n    setPreferredLanguage(locale) {\n        const safeLocale = this._normalizeLocale(locale);\n        if (!safeLocale) {\n            const error = new Error(`\"${locale}\" is not a supported locale.`);\n            return RSVP.reject(error);\n        }\n\n        try {\n            let dynamicCookieOptions = {\n                domain: getEnvCookieDomain()\n            };\n\n            if (window && window.location && window.location.protocol === 'https:') {\n                dynamicCookieOptions.secure = true;\n            }\n\n            if (navigator && navigator.userAgent && isSameSiteNoneCompatible(navigator.userAgent)) {\n                dynamicCookieOptions.sameSite = 'none';\n            }\n\n            const options = assign(dynamicCookieOptions, localeCookieOptions);\n            this.cookies.write(localeCookie, safeLocale, options);\n\n            return RSVP.resolve();\n        } catch (e) {\n            let msg = 'Failed to persist new locale setting.';\n            if (e && e.message) {\n                msg += `  Details: ${e.message}`;\n            }\n            return RSVP.reject(new Error(msg));\n        }\n    },\n\n    init() {\n        this._super(...arguments);\n        this.set('_cache', {});\n        this.setLocale(this._initialLocale());\n\n        const defer = RSVP.defer();\n        this.setProperties({\n            _loadedResolve: defer.resolve,\n            loadedPromise: defer.promise\n        });\n    },\n\n    loadLanguage(locale) {\n        return this.ajax\n            .request(`${this.get('application.urlprefix')}translations/${locale}.json`, { contentType: 'text/plain' })\n            .then(text => {\n                if (!text) {\n                    return RSVP.resolve();\n                }\n\n                try {\n                    // gotta be careful here...\n                    let lang = text;\n                    if (typeof text === 'string') {\n                        lang = JSON.parse(text);\n                    }\n                    if (lang) {\n                        this._cache[locale] = lang;\n                        return this.addTranslations(locale, lang);\n                    }\n                } catch (e) {\n                    return RSVP.resolve();\n                }\n            });\n    },\n\n    loadTranslations() {\n        const baseLocale = this.baseLocale;\n        const isoLocale = this.isoLocale;\n        const locales = [baseLocale];\n        if (isoLocale !== baseLocale) {\n            locales.push(isoLocale);\n        }\n        const translations = locales.map(locale => {\n            let cache = this._cache;\n            const cached = get(cache, locale);\n            if (cached) {\n                return resolve(cached);\n            }\n            return this.loadLanguage(locale);\n        });\n        return all(translations).then(() => {\n            this.set('loaded', true);\n            this._loadedResolve();\n        });\n    },\n\n    setupServerTranslations() {\n        // go ahead and kick off local file loading\n        this.loadTranslations();\n\n        const locale = this.isoLocale;\n        const url = this.application.pcV2Uri('api/v2/languages/translations/organization');\n\n        const defaultRequest = this.ajax.request(url, {\n            data: {\n                language: 'en-us'\n            }\n        });\n\n        let localeRequest = resolve({});\n        if (locale !== 'en-us') {\n            localeRequest = this.ajax.request(url, {\n                data: {\n                    language: locale\n                }\n            });\n        }\n\n        return allSettled([defaultRequest, localeRequest])\n            .then(([defaultTranslationsResult, localeTranslationsResult]) => {\n                const defaultTranslations = defaultTranslationsResult.value;\n                const localeTranslations = localeTranslationsResult.value;\n\n                if (!defaultTranslations) {\n                    console.warn(\"Couldn't load API translations\", {\n                        remoteData: {\n                            reason: defaultTranslationsResult.reason\n                        }\n                    });\n                    return;\n                }\n\n                if (_.isEmpty(localeTranslations)) {\n                    return this.addTranslations(locale, { server_translations: defaultTranslations });\n                }\n\n                _.forIn(defaultTranslations, (value, key) => {\n                    if (!Object.prototype.hasOwnProperty.call(localeTranslations, key)) {\n                        localeTranslations[key] = value;\n                    }\n                });\n\n                return this.addTranslations(locale, { server_translations: localeTranslations });\n            })\n            .catch(err => {\n                console.warn(\"Couldn't load API translations:\", { err });\n            });\n    }\n});\n","import { reads } from '@ember/object/computed';\nimport Service, { inject as service } from '@ember/service';\n\nexport default Service.extend({\n    application: service(),\n    ajax: service(),\n    session: service(),\n    host: reads('application.purecloudV2BaseUri'),\n    namespace: 'api/v2',\n    baseUrl() {\n        return `${this.host}/${this.namespace}`;\n    },\n    getLearningAssignments: function () {\n        const hasLearningAssessmentUI = this.get('session.features')['learning.release.assessment.ui'];\n        let typesParam = ``;\n        if (!hasLearningAssessmentUI) {\n            typesParam = `&types=Informational`;\n        }\n\n        const stateParam = `&states=${encodeURIComponent('InProgress,Assigned,InvalidSchedule')}`;\n        const url = `${this.baseUrl()}/learning/assignments/me?pageSize=250${typesParam}${stateParam}`;\n        return this.ajax\n            .ajaxGet(url)\n            .then(response => response.entities)\n            .catch(reason => {\n                console.warn('Failed to retrieve assignments:', { reason });\n                throw reason;\n            });\n    }\n});\n","import Service, { inject as service } from '@ember/service';\nimport { BrowserLog } from 'supportability-log-capture';\n\nlet _isStarted = false;\nlet _loggers = [];\nconst browserLog = new BrowserLog();\n\nexport default Service.extend({\n    ajax: service(),\n    application: service(),\n    session: service('session'),\n    stashLogger: service('stash-logger'),\n\n    isStarted() {\n        return _isStarted;\n    },\n\n    _registerFrameLoggers() {\n        document.querySelectorAll('iframe').forEach(frame => {\n            try {\n                let console = frame.contentWindow.console;\n                _loggers.push(console);\n            } catch (e) {\n                //This can happen if we've an encountered a frame that is being blocked by CORS.\n            }\n        });\n    },\n\n    restart() {\n        if (_isStarted) {\n            this.stop();\n\n            this.start();\n        }\n    },\n\n    start() {\n        if (!this.get('session.user.logCaptureEnabled')) {\n            return;\n        }\n\n        _loggers.push(console);\n        _loggers.push(this.stashLogger.getOriginalLogger());\n        this._registerFrameLoggers();\n\n        let levels = ['info', 'log', 'warn', 'error'];\n        if (this.get('session.features.browser-log-debug-enabled')) {\n            levels.push('debug');\n        }\n\n        let options = {\n            loggers: _loggers,\n            levels,\n            sizeLimit: 5 * 1024, //5kb\n            interval: 30 * 1000 //30 seconds\n        };\n\n        browserLog.start(buffer => this._flushCallback(buffer), options);\n\n        window.addEventListener('beforeunload', this.stop);\n\n        _isStarted = true;\n    },\n\n    stop() {\n        if (_isStarted) {\n            browserLog.bypass(console, 'browser log stopping', 'debug');\n\n            browserLog.stop();\n\n            _isStarted = false;\n            _loggers = [];\n        }\n    },\n\n    _flushCallback(buffer) {\n        if (!buffer || !buffer.length) {\n            return;\n        }\n\n        browserLog.bypass(console, 'recieved buffered log messages', 'debug');\n\n        const url = this.application.pcV2Uri('api/v2/diagnostics/logcapture/browser/entries');\n\n        this.ajax.post(url, { data: buffer }).catch(error => {\n            if (error.status === 403) {\n                browserLog.bypass(console, 'the browser log capture session has ended', 'debug');\n                this.stop();\n            }\n            browserLog.bypass(console, 'an error occurred posting log messages', 'error');\n        });\n    },\n\n    willDestroy() {\n        this.stop();\n        window.removeEventListener('beforeunload', this.stop);\n    }\n});\n","import { reject } from 'rsvp';\nimport { getOwner } from '@ember/application';\nimport { or, readOnly } from '@ember/object/computed';\nimport { computed } from '@ember/object';\nimport Evented from '@ember/object/evented';\nimport Service, { inject as service } from '@ember/service';\nimport { PROVIDER_ID as INTERNAL_VIDEO_PROVIDER_ID } from 'web-directory/media-providers/purecloud';\nimport LoggerMixin from '../mixins/logger';\n\nexport default Service.extend(Evented, LoggerMixin, {\n    chat: service(),\n    intl: service(),\n    store: service(),\n    webrtc: service(),\n    session: service(),\n    permissions: service(),\n    notification: service(),\n    chatCommands: service(),\n\n    defaultVideoProviders: null,\n\n    activeProvider: null,\n    createZoomMeetingHandler: null,\n    createTeamsMeetingHandler: null,\n\n    // Debug options passed to provider instances for use\n    // during development or debugging\n    debug: {\n        useLocalZoom: false\n    },\n\n    init() {\n        this._super(...arguments);\n\n        if (this.enabled) {\n            this.chatCommands.addCommand(\n                'zoom',\n                this.zoomCommand.bind(this),\n                this.intl.safestring('mediaProviders.zoom.command').toString(),\n                false\n            );\n\n            this.session.on('invalidatingAuthSession', this.handleLogout.bind(this));\n        }\n\n        if (this.teamsEnabled) {\n            this.chatCommands.addCommand(\n                'teams',\n                this.teamsCommand.bind(this),\n                this.intl.safestring('mediaProviders.teams.command').toString(),\n                false\n            );\n        }\n    },\n\n    getProvidersForUser(type, user, chatRoom) {\n        if (type === 'video') {\n            return this.getVideoProviders(user, chatRoom);\n        }\n        return [];\n    },\n\n    getProvider(name, user) {\n        return this.lookup(name, user);\n    },\n\n    getVideoProviders(user, chatRoom = null) {\n        if (!user && !chatRoom) {\n            return [];\n        }\n\n        return [\n            this.lookup('purecloud', user, chatRoom),\n            this.lookup('zoom', user, chatRoom),\n            this.lookup('teams', user, chatRoom)\n        ];\n    },\n\n    usingVideoProvider: computed('activeProvider.type', function () {\n        return this.get('activeProvider.type') === 'video';\n    }),\n\n    enabled: or('teamsEnabled', 'zoomMeetingsEnabled'),\n    zoomMeetingsEnabled: readOnly('permissions.canViewZoomMeetings'),\n    teamsEnabled: readOnly('permissions.canViewTeamsMeetings'),\n\n    // Internal\n\n    handleLogout(blockLogoutCb) {\n        if (this.usingVideoProvider) {\n            blockLogoutCb('add', this);\n\n            let title = this.intl.t('mediaProviders.zoom.errors.cannotLogout.title');\n            let message = this.intl.t('mediaProviders.zoom.errors.cannotLogout.message');\n            this.notification.error(title, message);\n        } else {\n            blockLogoutCb('remove', this);\n        }\n    },\n\n    lookup(providerName, user, chatRoom) {\n        const provider = getOwner(this).lookup(`media-provider:${providerName}`);\n        provider.set('user', user);\n        provider.set('room', chatRoom);\n        provider.set('debug', this.debug);\n        provider.loadData();\n        return provider;\n    },\n\n    async zoomCommand() {\n        if (!this.get('permissions.canViewBusinessChat')) {\n            return;\n        }\n\n        // Do not allow new Zoom meetings while on video\n        if (this.usingVideoProvider || this.get('webrtc.activeRoom.showingVideo')) {\n            let title = this.intl.t('mediaProviders.zoom.cannotCreateMeeting');\n            let message = this.intl.t('mediaProviders.zoom.noCreateOnVideo');\n            this.notification.error(title, message);\n            return;\n        }\n\n        // Capture chat room for later in case user switches rooms\n        let room = this.get('chat.activeRoom');\n\n        const user = await this.store.findRecord('public-api-user', this.get('session.person.id'), {\n            adapterOptions: {\n                expand: 'authorization'\n            }\n        });\n        const provider = this.lookup('zoom', user);\n\n        if (provider.get('haveAccess')) {\n            try {\n                await provider.createMeetingAndUpdateData();\n                this.chat.sendVideoProviderNotification(room, provider);\n            } catch (error) {\n                this.logger.error('Error running Zoom command', {\n                    error\n                });\n            }\n        }\n    },\n\n    async teamsCommand() {\n        if (!this.get('permissions.canViewBusinessChat')) {\n            return;\n        }\n\n        // Do not allow new Teams meetings while on video\n        if (this.usingVideoProvider || this.get('webrtc.activeRoom.showingVideo')) {\n            let title = this.intl.t('mediaProviders.teams.cannotCreateMeeting');\n            let message = this.intl.t('mediaProviders.teams.noCreateOnVideo');\n            this.notification.error(title, message);\n            return;\n        }\n\n        // Capture chat room for later in case user switches rooms\n        const room = this.get('chat.activeRoom');\n\n        const user = await this.store.findRecord('public-api-user', this.get('session.person.id'), {\n            adapterOptions: {\n                expand: 'authorization'\n            }\n        });\n        const provider = this.lookup('teams', user);\n\n        if (provider.get('haveAccess')) {\n            try {\n                await provider.createMeetingAndUpdateData();\n                this.chat.sendVideoProviderNotification(room, provider);\n            } catch (error) {\n                this.logger.error('Error running Teams command', {\n                    error\n                });\n            }\n        }\n    },\n\n    userHasVideoMediaProviders(user) {\n        const providers = this.getProvidersForUser('video', user).filter(provider => provider.get('haveAccess'));\n        return providers.length > 1;\n    },\n\n    setCreateZoomMeetingHandler(handler) {\n        let current = this.createZoomMeetingHandler;\n        if (!current) {\n            this.set('createZoomMeetingHandler', handler);\n        }\n    },\n\n    removeCreateZoomMeetingHandler() {\n        this.set('createZoomMeetingHandler', null);\n    },\n\n    createZoomMeeting(data) {\n        if (this.createZoomMeetingHandler) {\n            return this.createZoomMeetingHandler(data);\n        }\n        return reject(new Error('Zoom create meeting handler not registered.'));\n    },\n\n    setCreateTeamsMeetingHandler(handler) {\n        const current = this.createTeamsMeetingHandler;\n        if (!current) {\n            this.set('createTeamsMeetingHandler', handler);\n        }\n    },\n\n    createTeamsMeeting(data) {\n        if (this.createTeamsMeetingHandler) {\n            return this.createTeamsMeetingHandler(data);\n        }\n        return reject(new Error('Teams create meeting handler not registered.'));\n    },\n\n    removeCreateTeamsMeetingHandler() {\n        this.set('createTeamsMeetingHandler', null);\n    }\n});\n\n/**\n * Returns true if the provided list of providers contains an enabled,\n * supplemental (e.g. teams, zoom) video provider.\n * @param {Ember.Object[]} providers A list of provider Ember instances\n * @returns true if providers contains an enabled, supplemental provider;  false otherwise.\n */\nexport function hasSupplementalVideoProvider(providers) {\n    return providers.some(\n        currProvider =>\n            currProvider.get('type') === 'video' &&\n            currProvider.get('haveAccess') &&\n            currProvider.get('id') &&\n            currProvider.get('id') !== INTERNAL_VIDEO_PROVIDER_ID\n    );\n}\n","import { computed } from '@ember/object';\nimport Service from '@ember/service';\nimport ENV from '../config/environment';\n\nfunction computedFromConfig(prop) {\n  return computed(function(){\n    return ENV['ember-modal-dialog'] && ENV['ember-modal-dialog'][prop];\n  });\n}\n\nexport default Service.extend({\n  hasEmberTether: computedFromConfig('hasEmberTether'),\n  hasLiquidWormhole: computedFromConfig('hasLiquidWormhole'),\n  hasLiquidTether: computedFromConfig('hasLiquidTether'),\n  destinationElementId: null, // injected by initializer\n});\n","import Service from '@ember/service';\nimport { parseQueryParams } from '../utils/query-parser';\n\nexport default Service.extend({\n    displayedModal: null,\n    parsedQueryParams: null,\n    modalData: {},\n    dataHandler() {},\n    dismissHandler() {},\n    init() {\n        this._super(...arguments);\n        this.set('parsedQueryParams', parseQueryParams());\n    },\n    showModal: function (modalRequest, dataHandler, dismissHandler) {\n        this.set('modalData', modalRequest.modalData);\n        this.set('displayedModal', modalRequest.modalId);\n        this.set('dataHandler', dataHandler);\n        this.set('dismissHandler', dismissHandler);\n    },\n    closeModal: function () {\n        this.set('displayedModal', null);\n        this.set('modalData', {});\n    },\n    onData(event) {\n        const dataHandler = this.dataHandler;\n        if (typeof dataHandler === 'function') {\n            dataHandler(event);\n        }\n    },\n    onDismiss(event) {\n        const dismissHandler = this.dismissHandler;\n        if (typeof dismissHandler === 'function') {\n            dismissHandler(event);\n        }\n        this.set('displayedModal', null);\n        this.set('modalData', {});\n    }\n});\n","import { computed, get } from '@ember/object';\nimport { readOnly } from '@ember/object/computed';\nimport { run, later, cancel } from '@ember/runloop';\nimport Service, { inject } from '@ember/service';\nimport RSVP, { Promise } from 'rsvp';\nimport {\n    isWorkitem,\n    resolveConversationType,\n    findCallsToHoldOnSelect\n} from 'web-directory/components/mode-manager/modes/utils';\nimport AcdUtilitiesMixin from 'web-directory/mixins/acd-utilities';\nimport ConversationMixin from 'web-directory/mixins/conversation';\nimport UriBuilder from 'web-directory/mixins/conversation-uri-builder';\nimport SimpleCache from 'web-directory/utils/simple-cache';\nimport QueuedProcessingChain from 'web-directory/utils/queued-processing-chain';\nimport { getQueueMediaSettings } from 'web-directory/utils/acd-ts';\n\nimport {\n    alertingNotification,\n    autoAnswerNotification,\n    callAlertingRingtone,\n    callExternalContactListeners,\n    callFilterAndCreate,\n    callTimedWrapup,\n    callUpdateState,\n    callbackBlockedCallNotification,\n    callbackCleanup,\n    callbackCustomerIntent,\n    callbackDualModelCreate,\n    callbackNotifyPropertyChange,\n    callbackUpdateModelsList,\n    cleanup,\n    nonVoiceAlertingRingtone,\n    emailDraftShortCircuit,\n    emailFetchDraft,\n    emailParkedNotification,\n    externalContactInfo,\n    externalContactListeners,\n    findOrCreateInteraction,\n    holdOnIntake,\n    messageParkedNotification,\n    messageRetrieveDetails,\n    messageTakeoverNotification,\n    selectRequestedInteraction,\n    timedWrapupCheck,\n    updateCallbackModels,\n    updateModelState,\n    updateRoster\n} from './utils/conversation-processing-steps';\n\n// --- Core type definitions for consolidated conversation event processing ---\n\n/** The four conversation/interaction types handled by the unified processing system. acdChat is deprecated and not implemented. */\nexport type ConversationType = 'email' | 'message' | 'callback' | 'call';\n\n/** Indicates how a conversation payload was received. */\nexport type EventSource = 'realtime' | 'api' | 'draftEvent' | 'primaryParticipantDraftUpdate';\n\n/** Options passed to `processEvent`. */\nexport interface ProcessEventOptions {\n    payload: any; // raw conversation payload from pigeon or API\n    eventSource: EventSource;\n}\n\n/** Base chain context created by the find-or-create step and enriched by subsequent steps. */\nexport interface BaseChainContext {\n    eventSource: EventSource;\n    payload: any; // raw conversation payload\n    prevRaw: any | null; // previous `__interaction_metadata__` snapshot\n    newInteraction: boolean;\n    interactionModel: any; // typed Interaction model instance (Email, Message, etc.)\n}\n\n/** Extended context for callback chains carrying both models. */\nexport interface CallbackChainContext extends BaseChainContext {\n    call: any; // CallInteraction model\n    callback: any; // CallbackInteraction model\n}\n\n/** Extended context for call (phone) chains with call-specific state. */\nexport interface CallChainContext extends BaseChainContext {\n    isAgentCall: boolean;\n    isActiveOnCall: boolean;\n    shouldUpdate: boolean;\n    currentCallState: string | null;\n    newCallState: string;\n    participantIsNotVoicemail: boolean;\n}\n\n/** Union of all possible chain context shapes passed between processing steps. */\nexport type ChainContext = BaseChainContext | CallbackChainContext | CallChainContext;\n\n/** Return type for a processing step: `false` halts the chain, an object continues, `void` continues with unchanged context. */\nexport type ChainResult = false | ChainContext | void;\n\n/**\n * Dependencies injected into each processing step factory. Keeps steps pure\n * and testable while giving them access to framework services.\n */\nexport interface StepDependencies {\n    mode: any;\n    conversationModeService: any;\n    rosterSelectionService: any;\n    loggerService: any;\n    sessionService: any;\n    externalContactsService: any;\n    customerIntentService: any;\n    agentAssistChecksService: any;\n    communicationService: any;\n    intlService: any;\n    notificationService: any;\n    preferencesService: any;\n    storeService: any;\n    commandNavService: any;\n    contactObservers: Record<string, Function>;\n    partCommIdMap: Record<string, { prevCommId: string; prevPartId: string }>;\n    triggerAutoAnswer: (model: any, type: string, subType?: string) => void;\n    triggerAlertingNotification: (model: any) => void;\n    fetchDraftForEmail: (emailId: string) => Promise<void>;\n    webrtcSdkService: any;\n    phoneService: any;\n    storageService: any;\n    ringService: any;\n    holdExemptIds: Set<string>;\n}\n\n/** Factory that creates a single processing step from shared dependencies. */\nexport type StepFactory = (deps: StepDependencies) => {\n    label: string;\n    process: (ctx: any) => Promise<ChainResult> | ChainResult;\n};\n\n// --- End core type definitions ---\n\n/** Map from ConversationType to the corresponding chain property name. */\nconst TYPE_TO_CHAIN_KEY: Record<ConversationType, string> = {\n    email: '_emailProcessingChain',\n    message: '_messageProcessingChain',\n    callback: '_callbackProcessingChain',\n    call: '_callProcessingChain'\n};\n\nconst TEN_MINUTES = 600000;\nconst CACHE_TTL = 5; // minutes — mirrors legacy interaction service\n\n/** Fallback expiry for a callback's `isPlacingCall` flag. Mirrors legacy acdcallback.isPlacingCallTimeout. */\nconst IS_PLACING_CALL_TIMEOUT = 10000;\n\nexport default Service.extend(UriBuilder, ConversationMixin, AcdUtilitiesMixin, {\n    loggerService: inject('stash-logger'),\n    sessionService: inject('session'),\n    externalContactsService: inject('external-contacts'),\n    customerIntentService: inject('customer-intent'),\n    agentAssistChecksService: inject('agent-assist-checks'),\n    communicationService: inject('communication'),\n    ajaxService: inject('ajax'),\n    intlService: inject('intl'),\n    notificationService: inject('notification'),\n    preferencesService: inject('preferences'),\n    storeService: inject('store'),\n    commandNavService: inject('command-nav'),\n\n    /** Required by AcdUtilitiesMixin.windowInFocus for hosted context check. */\n    applicationService: inject('application'),\n    // @ts-ignore -> headset service from ember-softphone-integration addon, not in typed registry\n    headsetService: inject('headset'),\n    webrtcSdkService: inject('webrtcSdk'),\n    phoneService: inject('phone'),\n    acdInitializationService: inject('acdinitialization'),\n    storageService: inject('storage'),\n    ringService: inject('ring'),\n    rosterSelectionService: inject('modes/roster-selection-service'),\n    // @ts-ignore -> sound service not in typed registry\n    soundService: inject('sound'),\n    chatService: inject('chat'),\n    queueService: inject('queue'),\n    permissionsService: inject('permissions'),\n\n    /**\n     * Org-level conversations settings. Defaults to false (communication-based ACW disabled)\n     * until `fetchCommunicationBasedACWSetting` resolves.\n     * Mirrors `orgLevelConversationsSettings` on the legacy interaction service.\n     */\n    orgLevelConversationsSettings: { communicationBasedACW: false },\n\n    /**\n     * Timestamp (ms) after which the org settings cache is considered stale and should be\n     * re-fetched. Null means no cached value exists yet.\n     * Mirrors `conversationsSettingsFetchAt` on the legacy interaction service.\n     */\n    conversationsSettingsFetchAt: null as number | null,\n\n    /**\n     * Feature toggle: when enabled, skips the API call if a valid cached value is present\n     * and the cache has not expired.\n     */\n    optimizeOrgFetching: readOnly('session.features.ACE-4461_org-settings-fetch'),\n\n    /**\n     * Cache for workitem auto-answer ring time by queue ID.\n     * Mirrors `autoAnswerWorkitemRingTimeCache` on the legacy interaction service.\n     */\n    _autoAnswerWorkitemRingTimeCache: new SimpleCache<number>(),\n\n    /** Reference to the conversation mode instance for roster mutations and state. */\n    _mode: null as any,\n\n    /** Alerting toast state. Legacy parity: `alerting-manager.alertingInteractionToast`. */\n    _alertingToast: null as any,\n    _alertingToastInteraction: null as any,\n\n    /**\n     * Interactions currently alerting, keyed by id in announcement order. The chain announces an\n     * alert (`alertingNotification`) before `updateRoster` inserts the interaction, and never\n     * announces it again.\n     * Legacy needed no equivalent — its `alertingInteractions` came off the conversation feed\n     * rather than the roster.\n     */\n    _alertingInteractions: null as Map<string, any> | null,\n\n    /**\n     * Conversation id for an agent-initiated outbound create that should become the\n     * roster selection once the interaction appears on the active roster.\n     * Mirrors legacy ACD panel `requestedInteraction`.\n     */\n    _requestedInteractionId: null as string | null,\n\n    /** QueuedProcessingChain instance for email events. */\n    _emailProcessingChain: null as any,\n\n    /** QueuedProcessingChain instance for message events. */\n    _messageProcessingChain: null as any,\n\n    /** QueuedProcessingChain instance for callback events. */\n    _callbackProcessingChain: null as any,\n\n    /** QueuedProcessingChain instance for call events. */\n    _callProcessingChain: null as any,\n\n    /** Per-interaction external contact observer callbacks. */\n    _contactObservers: null as Record<string, Function> | null,\n\n    /** Tracks participant/communication IDs for auto-answer deduplication. */\n    _partCommIdMap: null as Record<string, { prevCommId: string; prevPartId: string }> | null,\n\n    /** Tracks shown blocked-call notifications for callbacks. */\n    _blockedCalls: null as Array<{ interactionId: string; wrapup: { code: string; endTime: string } }> | null,\n\n    /** Cached deployment typing indicator configs for web messaging. */\n    _checkedDeploymentIds: null as Array<{ id: string; enabled: boolean }> | null,\n\n    /** Active auto-expiry timers for typing indicators, keyed by conversation ID. */\n    _typingTimers: null as Record<string, any> | null,\n\n    /** Tracks callback call/callback model pairs, keyed by interaction ID. Mirrors legacy acdcallback.models.\n     *\n     * Note: In legacy, `models` serves both as the pair tracking structure AND the source for `activeCallbacks`\n     * (the UI list). In the new system, this is split: `_callbackModels` handles pair tracking only, while\n     * the mode's `allItems` (managed by `updateRoster`) serves as the UI roster. Both are updated in the same\n     * chain execution but in separate steps — `callbackUpdateModelsList` writes here, `updateRoster` writes\n     * to `allItems`. Removal follows the same pattern: `callbackCleanup` deletes from this map, `updateRoster`\n     * deletes from `allItems`.\n     */\n    _callbackModels: null as Map<string, { interactionId: string; call: any; callback: any }> | null,\n\n    /** Resolve function for the acdinitialization promise, called after initial fetch completes. */\n    _initReadyResolve: null as (() => void) | null,\n\n    /**\n     * Tracks which callback interactions were answered from this browser session.\n     * Used by `incomingCallbackCallsToAutoAnswer` to determine which callbacks\n     * should auto-proceed on WebRTC stations.\n     * Mirrors legacy acdcallback.callBacksAnsweredByClient.\n     */\n    _callBacksAnsweredByClient: null as string[] | null,\n\n    /** Whether initialize() has completed for the current active mode binding. */\n    _initialized: false,\n\n    /** Evented source (headset service or webrtc SDK) with attached hardware button listeners. */\n    _headsetEventSource: null as any,\n\n    /** Whether the webrtcSdk `useSdk` observer has been registered. */\n    _headsetObserverRegistered: false,\n\n    /**\n     * Tracks which headset event source type listeners are attached to.\n     * Avoids re-attaching when the toggle has not changed.\n     */\n    _headsetListenersUseWebrtcSdk: null as boolean | null,\n\n    /**\n     * Raw API call to fetch org-level conversation settings.\n     * Mirrors `fetchConversationsSettings` on the legacy interaction service.\n     */\n    fetchConversationsSettings(): Promise<any> {\n        const url = this.get('applicationService').pcV2Uri('api/v2/conversations/settings');\n        return this.get('ajaxService').request(url);\n    },\n\n    /**\n     * Fetches and caches the org-level `communicationBasedACW` setting. Mirrors\n     * `fetchCommunicationBasedACWSetting` on the legacy interaction service, including\n     * the permissions guard and the 10-minute cache controlled by `ACE-4461_org-settings-fetch`.\n     *\n     * Fire-and-forget: result is written reactively to\n     * `orgLevelConversationsSettings.communicationBasedACW`.\n     */\n    fetchCommunicationBasedACWSetting(): Promise<any> {\n        const permissionsService = this.get('permissionsService') as any;\n        if (!permissionsService?.get('canViewConversationSettings')) {\n            return RSVP.Promise.resolve(this.get('orgLevelConversationsSettings'));\n        }\n\n        if (this.get('optimizeOrgFetching')) {\n            const settings = this.get('orgLevelConversationsSettings');\n            const fetchAt = this.get('conversationsSettingsFetchAt');\n            const shouldFetch = fetchAt ? fetchAt < Date.now() : true;\n\n            // Cache is still valid — return the stored value without hitting the API\n            if (settings && !shouldFetch) {\n                return RSVP.Promise.resolve(settings);\n            }\n\n            // Reset the timer so a failure leaves no stale expiry\n            this.set('conversationsSettingsFetchAt', null);\n        }\n\n        return this.fetchConversationsSettings()\n            .then((response: any) => {\n                if (response) {\n                    // Use set() with the top-level property to trigger KVO for canUseCommunicationACW\n                    const updated = {\n                        ...this.get('orgLevelConversationsSettings'),\n                        communicationBasedACW: response.communicationBasedACW\n                    };\n                    this.set('orgLevelConversationsSettings', updated);\n                    this.set('conversationsSettingsFetchAt', new Date().valueOf() + TEN_MINUTES);\n                    this.get('loggerService').debug('ConversationModeService: fetched communicationBasedACW', {\n                        communicationBasedACW: response.communicationBasedACW\n                    });\n                }\n                return response;\n            })\n            .catch((error: unknown) => {\n                this.get('loggerService').error('ConversationModeService: failed to fetch communicationBasedACW', {\n                    error\n                });\n                return this.get('orgLevelConversationsSettings');\n            });\n    },\n\n    /**\n     * Called once by the conversation mode during init. Stores the mode\n     * reference, initializes state, and creates the five QueuedProcessingChain instances.\n     */\n    initialize(mode: any) {\n        if (this.get('_initialized') || !this.get('sessionService').get('useModes')) return;\n\n        this.set('_initialized', true);\n        this.set('_mode', mode);\n        this.set('_contactObservers', {});\n        this.set('_partCommIdMap', {});\n        this.set('_blockedCalls', []);\n        this.set('_checkedDeploymentIds', []);\n        this.set('_typingTimers', {});\n        this.set('_callbackModels', new Map());\n        this.set('_alertingInteractions', new Map());\n        this.set('_requestedInteractionId', null);\n\n        try {\n            this.set('_callBacksAnsweredByClient', JSON.parse(window.sessionStorage.callBacksAnsweredByClient || '[]'));\n        } catch {\n            this.set('_callBacksAnsweredByClient', []);\n        }\n\n        // Register a promise with acdinitialization so downstream consumers\n        // (e.g. interapptions-manager-v2) wait for the initial fetch to complete.\n        const initPromise = new RSVP.Promise((resolve: () => void) => {\n            this.set('_initReadyResolve', resolve);\n        });\n        this.get('acdInitializationService').registerPromise(initPromise);\n\n        // Build shared dependencies once and reuse across all step factories\n        const deps: StepDependencies = {\n            mode,\n            conversationModeService: this,\n            rosterSelectionService: this.get('rosterSelectionService'),\n            communicationService: this.get('communicationService'),\n            loggerService: this.get('loggerService'),\n            sessionService: this.get('sessionService'),\n            externalContactsService: this.get('externalContactsService'),\n            customerIntentService: this.get('customerIntentService'),\n            agentAssistChecksService: this.get('agentAssistChecksService'),\n            intlService: this.get('intlService'),\n            notificationService: this.get('notificationService'),\n            preferencesService: this.get('preferencesService'),\n            storeService: this.get('storeService'),\n            commandNavService: this.get('commandNavService'),\n            contactObservers: this.get('_contactObservers') as Record<string, Function>,\n            partCommIdMap: this.get('_partCommIdMap') as Record<string, { prevCommId: string; prevPartId: string }>,\n            triggerAutoAnswer: (model: any, type: string, subType?: string) => {\n                this._handleAutoAnswer(model, type, subType);\n            },\n            triggerAlertingNotification: (model: any) => {\n                this._handleAlerting(model);\n            },\n            fetchDraftForEmail: (emailId: string) => this.fetchDraftForEmail(emailId),\n            webrtcSdkService: this.get('webrtcSdkService'),\n            phoneService: this.get('phoneService'),\n            storageService: this.get('storageService'),\n            ringService: this.get('ringService'),\n            holdExemptIds: new Set<string>()\n        };\n\n        // --- Email chain ---\n        const emailChain = QueuedProcessingChain.create({\n            // @ts-expect-error -> unable to provide a valid type for the processing chain\n            lifecycleContainer: this,\n            // @ts-expect-error -> unable to provide a valid type for the processing chain\n            label: 'email-processing-chain'\n        });\n\n        emailChain.setProcessingChain([\n            emailDraftShortCircuit(deps),\n            findOrCreateInteraction(deps),\n            emailFetchDraft(deps),\n            timedWrapupCheck(deps),\n            updateModelState(deps),\n            emailParkedNotification(deps),\n            autoAnswerNotification(deps),\n            nonVoiceAlertingRingtone(deps),\n            alertingNotification(deps),\n            externalContactInfo(deps),\n            externalContactListeners(deps),\n            updateRoster(deps),\n            selectRequestedInteraction(deps),\n            holdOnIntake(deps),\n            cleanup(deps)\n        ]);\n        this.set('_emailProcessingChain', emailChain);\n\n        // --- Message chain ---\n        const messageChain = QueuedProcessingChain.create({\n            // @ts-expect-error -> unable to provide a valid type for the processing chain\n            lifecycleContainer: this,\n            // @ts-expect-error -> unable to provide a valid type for the processing chain\n            label: 'message-processing-chain'\n        });\n\n        messageChain.setProcessingChain([\n            findOrCreateInteraction(deps),\n            messageRetrieveDetails(deps),\n            timedWrapupCheck(deps),\n            updateModelState(deps),\n            messageParkedNotification(deps),\n            autoAnswerNotification(deps),\n            nonVoiceAlertingRingtone(deps),\n            alertingNotification(deps),\n            messageTakeoverNotification(deps),\n            externalContactInfo(deps),\n            externalContactListeners(deps),\n            updateRoster(deps),\n            selectRequestedInteraction(deps),\n            holdOnIntake(deps),\n            cleanup(deps)\n        ]);\n        this.set('_messageProcessingChain', messageChain);\n\n        // --- Callback chain ---\n        const callbackChain = QueuedProcessingChain.create({\n            // @ts-expect-error -> unable to provide a valid type for the processing chain\n            lifecycleContainer: this,\n            // @ts-expect-error -> unable to provide a valid type for the processing chain\n            label: 'callback-processing-chain'\n        });\n\n        callbackChain.setProcessingChain([\n            callbackDualModelCreate(deps),\n            // Customer intent is intentionally skipped here — it is registered for both the\n            // call and callback models by callbackCustomerIntent after externalContactInfo,\n            // mirroring legacy acdcallback.js step ordering (ACE-5407).\n            externalContactListeners(deps, { registerCustomerIntent: false }),\n            timedWrapupCheck(deps),\n            updateCallbackModels(deps),\n            externalContactInfo(deps),\n            callbackCustomerIntent(deps),\n            autoAnswerNotification(deps),\n            nonVoiceAlertingRingtone(deps),\n            alertingNotification(deps),\n            callbackBlockedCallNotification(deps),\n            callbackUpdateModelsList(deps),\n            updateRoster(deps),\n            selectRequestedInteraction(deps),\n            holdOnIntake(deps),\n            callbackCleanup(deps),\n            callbackNotifyPropertyChange(deps)\n        ]);\n        this.set('_callbackProcessingChain', callbackChain);\n\n        // --- Call chain ---\n        const callChain = QueuedProcessingChain.create({\n            // @ts-expect-error -> unable to provide a valid type for the processing chain\n            lifecycleContainer: this,\n            // @ts-expect-error -> unable to provide a valid type for the processing chain\n            label: 'call-processing-chain'\n        });\n\n        callChain.setProcessingChain([\n            callFilterAndCreate(deps),\n            callExternalContactListeners(deps),\n            callTimedWrapup(deps),\n            callUpdateState(deps),\n            callAlertingRingtone(deps),\n            alertingNotification(deps),\n            externalContactInfo(deps),\n            updateRoster(deps),\n            selectRequestedInteraction(deps),\n            holdOnIntake(deps),\n            cleanup(deps)\n        ]);\n        this.set('_callProcessingChain', callChain);\n\n        // --- Headset button listeners ---\n        // Ported from acdcall._headsetFeatures. Maps physical headset events\n        // to phone call controls using the mode's selectedInteraction.\n        this._registerHeadsetListeners();\n    },\n\n    /**\n     * Registers headset hardware button listeners. Uses webrtcSdkService as the\n     * source when SDK is active, otherwise the headset service directly.\n     * Re-registers when SDK toggle changes.\n     *\n     * Mirrors legacy acdcall._headsetFeatures + changeHeadsetSource observer.\n     */\n    _registerHeadsetListeners() {\n        const webrtcSdkService = this.get('webrtcSdkService');\n        const phoneService = this.get('phoneService');\n\n        if (!webrtcSdkService || !phoneService) return;\n\n        const useWebrtcSdk = !!webrtcSdkService.get('useSdk');\n        this._attachHeadsetEventsForSource(useWebrtcSdk);\n\n        if (!this.get('_headsetObserverRegistered')) {\n            webrtcSdkService.addObserver('useSdk', this, this._onWebrtcSdkUseSdkChanged);\n            this.set('_headsetObserverRegistered', true);\n        }\n    },\n\n    _onWebrtcSdkUseSdkChanged() {\n        if (this.get('isDestroyed') || this.get('isDestroying')) return;\n\n        const webrtcSdkService = this.get('webrtcSdkService');\n        const phoneService = this.get('phoneService');\n        if (!webrtcSdkService || !phoneService) return;\n\n        const useWebrtcSdk = !!webrtcSdkService.get('useSdk');\n        if (useWebrtcSdk === this.get('_headsetListenersUseWebrtcSdk')) return;\n\n        this._attachHeadsetEventsForSource(useWebrtcSdk);\n    },\n\n    _detachHeadsetEvents() {\n        const source = this.get('_headsetEventSource');\n        if (!source) return;\n\n        source.off('deviceMuteStatusChanged', this, this._onHeadsetDeviceMuteStatusChanged);\n        source.off('deviceHoldStatusChanged', this, this._onHeadsetDeviceHoldStatusChanged);\n        source.off('deviceEndedCall', this, this._onHeadsetDeviceEndedCall);\n        source.off('deviceAnsweredCall', this, this._onHeadsetDeviceAnsweredCall);\n        source.off('deviceRejectedCall', this, this._onHeadsetDeviceRejectedCall);\n        this.set('_headsetEventSource', null);\n        this.set('_headsetListenersUseWebrtcSdk', null);\n    },\n\n    /**\n     * Resolves the headset event source without eagerly instantiating the headset\n     * service. Only calls `this.get('headsetService')` in the non-SDK path, so the\n     * softphone addon's vendor implementations (and their transitive imports, e.g.\n     * `ember-uuid`) are never required when the WebRTC SDK is active. Mirrors the\n     * legacy `call-controls`/`phone` gating behind `!useSdk`.\n     */\n    _getHeadsetEventSource(useWebrtcSdk: boolean) {\n        return useWebrtcSdk ? this.get('webrtcSdkService') : this.get('headsetService');\n    },\n\n    /**\n     * Attaches headset event handlers to the given source (headset service or webrtcSdk).\n     * Each handler reads the currently selected call from the mode's roster.\n     */\n    _attachHeadsetEventsForSource(useWebrtcSdk: boolean) {\n        const source = this._getHeadsetEventSource(useWebrtcSdk);\n        if (!source) return;\n\n        this._detachHeadsetEvents();\n        this.set('_headsetEventSource', source);\n        this.set('_headsetListenersUseWebrtcSdk', useWebrtcSdk);\n\n        source.on('deviceMuteStatusChanged', this, this._onHeadsetDeviceMuteStatusChanged);\n        source.on('deviceHoldStatusChanged', this, this._onHeadsetDeviceHoldStatusChanged);\n        source.on('deviceEndedCall', this, this._onHeadsetDeviceEndedCall);\n        source.on('deviceAnsweredCall', this, this._onHeadsetDeviceAnsweredCall);\n        source.on('deviceRejectedCall', this, this._onHeadsetDeviceRejectedCall);\n    },\n\n    _onHeadsetDeviceMuteStatusChanged(isMuted: boolean) {\n        if (!this._isModeAlive()) return;\n\n        const conversation = this._getSelectedCallConversation();\n        if (!conversation) return;\n\n        if (conversation.get('isMuted') !== isMuted) {\n            this.get('phoneService').mute(conversation);\n        }\n    },\n\n    _onHeadsetDeviceHoldStatusChanged(holdRequested: boolean, toggle: boolean) {\n        if (!this._isModeAlive()) return;\n\n        const conversation = this._getSelectedCallConversation();\n        if (!conversation) return;\n\n        // Jabra sends an unmute request after the call ends to reset headset state\n        if (toggle && !conversation.get('isConnected')) return;\n\n        if (toggle || conversation.get('isHeld') !== holdRequested) {\n            this.get('phoneService').hold(conversation);\n        }\n    },\n\n    _onHeadsetDeviceEndedCall() {\n        if (!this._isModeAlive()) return;\n\n        const conversation = this._getSelectedCallConversation();\n        if (!conversation) return;\n\n        this.get('phoneService').endCall(conversation);\n    },\n\n    _onHeadsetDeviceAnsweredCall() {\n        if (!this._isModeAlive()) return;\n\n        const mode = this.get('_mode');\n        if (!mode) return;\n\n        // Find the last alerting call interaction, matches legacy behavior in acdcall service\n        const allItems = mode.get('allItems');\n        let alertingConversation: any = null;\n        if (allItems) {\n            allItems.forEach((item: any) => {\n                if (item.get('isCall') && item.get('isAlerting')) {\n                    alertingConversation = item.get('conversation');\n                }\n            });\n        }\n\n        if (alertingConversation) {\n            this._stopVoiceAlerting();\n            this.get('phoneService').answer(alertingConversation);\n        }\n    },\n\n    _onHeadsetDeviceRejectedCall() {\n        if (!this._isModeAlive()) return;\n\n        const conversation = this._getSelectedCallConversation();\n        if (!conversation) return;\n\n        this._stopVoiceAlerting();\n        this.get('phoneService').endCall(conversation);\n    },\n\n    _isModeAlive(): boolean {\n        const mode = this.get('_mode');\n        return mode != null && mode._isAlive();\n    },\n\n    /**\n     * Returns the ConversationModel for the currently selected call interaction\n     * in the mode's roster. Returns null if no call is selected.\n     */\n    _getSelectedCallConversation(): any {\n        const selected = this.get('rosterSelectionService').get('selection');\n        const payload = selected?.payload;\n        if (!payload || !payload.get('isCall')) return null;\n\n        return payload.get('conversation');\n    },\n\n    /**\n     * Handles auto-answer events for all interaction types. Shows a notification\n     * when the interaction panel isn't visible, and plays an alert tone for\n     * digital (non-voice) types. Holds the auto-answered interaction if AA-holding\n     * is enabled and another interaction is currently selected.\n     *\n     * Mirrors legacy interaction._onAutoAnswer behavior.\n     *\n     * @param model - The interaction model that was auto-answered.\n     * @param type - The conversation type ('call', 'email', 'message', 'callback'). acdChat is deprecated.\n     * @param subType - Optional sub-type (e.g. 'unparking' for park-resume).\n     */\n    _handleAutoAnswer(model: any, type: string, subType?: string) {\n        const intlService = this.get('intlService');\n        const notificationService = this.get('notificationService');\n        const commandNavService = this.get('commandNavService');\n        // @ts-ignore -> browserHidden is not in the typed ApplicationService interface\n        const browserHidden: boolean = this.get('applicationService').get('browserHidden');\n\n        // Play digital alert tone for non-voice types\n        if (type !== 'call') {\n            this._playAutoAnswerTone(model);\n            this._holdIfAAHoldingEnabled(model);\n        }\n\n        // Show notification only when the interaction panel isn't visible\n        const panelVisible = commandNavService.get('currentPanel') === 'agent';\n\n        if (panelVisible && !browserHidden) {\n            return;\n        }\n\n        const interactionType = type === 'call' ? 'voice' : type;\n\n        if (subType === 'unparking') {\n            notificationService.info(\n                null,\n                intlService.t('purecloud.acdInteraction.parkResume.notification', { interactionType }),\n                {\n                    showNotificationEverywhere: true,\n                    showCloseButton: true,\n                    hideAfter: 5,\n                    messageStyle: 'pin-to-top',\n                    type: 'park-resume-interaction-message',\n                    target: this,\n                    tag: 'park-resume-interaction-message',\n                    actionHandlers: {\n                        openAcdInteraction: intlService.t('purecloud.acdInteraction.parkResume.view')\n                    }\n                }\n            );\n        } else {\n            notificationService.info(\n                null,\n                intlService.t('purecloud.acdInteraction.autoAnswer.notification', { interactionType }),\n                {\n                    showNotificationEverywhere: true,\n                    showCloseButton: true,\n                    hideAfter: 5,\n                    messageStyle: 'pin-to-top',\n                    type: 'auto-answer-interaction-message',\n                    target: this,\n                    tag: 'auto-answer-interaction-message',\n                    actionHandlers: {\n                        openAcdInteraction: intlService.t('purecloud.acdInteraction.autoAnswer.view')\n                    }\n                }\n            );\n        }\n    },\n\n    /**\n     * Opens the ACD/agent panel.\n     * `openAcdInteraction` action handler (the handler key must match this method name so\n     * `desktop-notification` can dispatch to it via `target[key]`).\n     *\n     * Mirrors legacy `interaction.openAcdInteraction` — new-nav branch only\n     */\n    openAcdInteraction() {\n        this.get('commandNavService').selectPanel('agent');\n    },\n\n    /** Shows/dismisses the alerting toast per interaction state. Legacy parity: `alerting-manager.manageAcdNotification`. */\n    _handleAlerting(model: any) {\n        const id = get(model, 'id') as string;\n        const shouldShow = !!get(model, 'isAlerting') && !this._isAutoAnswerCall(model);\n        const alerting = this.get('_alertingInteractions') as Map<string, any>;\n        const toastInteraction = this.get('_alertingToastInteraction');\n\n        if (shouldShow) {\n            alerting.set(id, model);\n            if (this.get('_alertingToast')) return; // single toast at a time, legacy parity\n            this.set('_alertingToastInteraction', model);\n            this._showAlertingToast();\n            return;\n        }\n\n        alerting.delete(id);\n        if (toastInteraction && get(toastInteraction, 'id') === id) {\n            this._retargetOrDismissAlertingToast();\n        }\n    },\n\n    /**\n     * Moves the toast to the next interaction still alerting, dismissing only when none remain —\n     * legacy's `alertingConversation` rebinds to the next alerting interaction, so its toast\n     * survives until nothing is alerting. Callers drop the outgoing interaction from\n     * `_alertingInteractions` first, so the first remaining entry is the next owner.\n     */\n    _retargetOrDismissAlertingToast() {\n        const next = (this.get('_alertingInteractions') as Map<string, any>).values().next().value;\n\n        if (next) {\n            this.set('_alertingToastInteraction', next);\n        } else {\n            this._dismissAlertingToast();\n        }\n    },\n\n    /** Whether a call will be auto-answered. Legacy parity: `alerting-manager.isAutoAnswerCall`. */\n    _isAutoAnswerCall(model: any): boolean {\n        if (get(model, 'type') !== 'call') return false;\n\n        // @ts-ignore -> publicApiUser is not in the typed SessionService interface\n        const loggedInUser = this.get('sessionService').get('publicApiUser');\n        // Chain-safety guard (legacy omits): a throw here would break later steps like roster update.\n        if (!loggedInUser) return false;\n\n        const iAmAgent = get(model, 'conversation.isAgentCall');\n        const participants = get(model, 'participants') || [];\n        const currentUserParticipant = participants.find(\n            (p: any) => p.purpose === 'agent' && p.userId === loggedInUser.id\n        );\n        const queueMediaSettings = get(currentUserParticipant || {}, 'calls.firstObject.queueMediaSettings') || {};\n        const transferSource = get(currentUserParticipant || {}, 'calls.firstObject.transferSource');\n        const isTransferSourceACD = transferSource === 'ACD';\n\n        const agentAASetting = isTransferSourceACD && iAmAgent && loggedInUser.acdAutoAnswer;\n        const queueAASetting = isTransferSourceACD && queueMediaSettings.enableAutoAnswer;\n        return agentAASetting || queueAASetting;\n    },\n\n    /** Creates the pin-to-top toast; handler keys must match service method names. Legacy parity: `alerting-manager.displayIncomingAcdNotification`. */\n    _showAlertingToast() {\n        const intlService = this.get('intlService');\n        const intlNS = 'purecloud.acdInteraction.alertingACDNotification';\n\n        const toast = this.get('notificationService').info(null, intlService.t(`${intlNS}.alertingInteractions`), {\n            // Toast-only for now; legacy's allowActionableNotifications path (forceBrowserNotification + native notification) is deferred to a separate PR.\n            showNotificationEverywhere: true,\n            showCloseButton: true,\n            hideAfter: false,\n            messageStyle: 'pin-to-top',\n            type: 'alerting-interaction-message',\n            target: this,\n            tag: 'alerting-interaction-message',\n            actionHandlers: {\n                answerInteraction: intlService.t(`${intlNS}.answer`),\n                openAcdInteraction: intlService.t(`${intlNS}.openAcdPanel`)\n            }\n        });\n\n        this.set('_alertingToast', toast);\n    },\n\n    /** Hides the toast and clears tracking. Legacy parity: `alerting-manager.destroyNotification`. */\n    _dismissAlertingToast() {\n        const toast = this.get('_alertingToast');\n        if (toast && typeof toast.hide === 'function') {\n            toast.hide();\n        }\n        this.set('_alertingToast', null);\n        this.set('_alertingToastInteraction', null);\n    },\n\n    /**\n     * Answers the interaction backing the toast: selects its roster card, answers, then opens the\n     * agent panel. Selecting first registers a pending roster selection so `holdOnIntake` leaves the\n     * just-answered interaction unheld and holds the previously active calls/interaction —\n     * same order as the roster Answer button (`active.answer`).\n     * Legacy parity: `interaction._answerInteraction` opens the ACD panel once the answer settles.\n     */\n    answerInteraction(): Promise<void> {\n        const interaction = this.get('_alertingToastInteraction');\n        if (!interaction) {\n            this._dismissAlertingToast();\n            return Promise.resolve();\n        }\n\n        //  Legacy re-reads `alertingInteractions.firstObject` per click, and that only moves once the answered\n        // interaction leaves the alerting set, so a repeat click there re-targets the same\n        // interaction. `_handleAlerting` re-points the toast when `isAlerting` flips.\n        const mode = this.get('_mode');\n        if (mode) mode.selectItem(interaction);\n\n        // `answer` surfaces its own errors and never rejects, so navigation is unconditional here\n        // (legacy skips it on a failed answer).\n        return this.answer(interaction).then(() => this.openAcdInteraction());\n    },\n\n    /**\n     * Plays the auto-answer alert tone for digital interactions.\n     * Mirrors legacy interaction._onAutoAnswer tone logic:\n     * - Workitems: async queue API fetch with cache for `autoAnswerAlertToneSeconds`\n     * - Conversations: reads `autoAnswerAlertToneSeconds` from queue media settings on model\n     * - Volume: reads `chat.interactionNotificationVolume`, silent if volume <= 0\n     * - Falls back to a debounced single digital alert tone when no ring time is configured\n     */\n    _playAutoAnswerTone(model: any) {\n        const ftAcdRingTimeout: boolean = this.get('sessionService').get('features')?.['assignment.audioAlertDuration'];\n        const soundService = this.get('soundService');\n        const ringService = this.get('ringService');\n\n        // Read notification volume — mirrors legacy interaction.playSound using chat.interactionNotificationVolume\n        const rawVolume: number | undefined = (this.get('chatService') as any)?.get('interactionNotificationVolume');\n        const volume: number = typeof rawVolume === 'number' ? rawVolume / 100 : 1;\n        if (volume <= 0) return;\n\n        if (ftAcdRingTimeout) {\n            if (isWorkitem(model)) {\n                // Workitems: autoAnswerAlertToneSeconds lives on the queue API response, not the model.\n                // Mirrors legacy _onAutoAnswer workitem branch with cache.\n                const workitemQueueId: string | undefined = model?.workitem?.queueId;\n                if (workitemQueueId) {\n                    const ringTimeCache = this.get('_autoAnswerWorkitemRingTimeCache') as SimpleCache<number>;\n                    const cachedRingTime = ringTimeCache.get(workitemQueueId);\n                    if (cachedRingTime) {\n                        this._playRingTimeOrDefault(cachedRingTime, model, ringService, soundService, volume);\n                    } else {\n                        this.get('queueService')\n                            .getQueue(workitemQueueId)\n                            .then((res: any) => {\n                                const queueAARingTime: number | undefined = get(\n                                    res,\n                                    'mediaSettings.workitem.autoAnswerAlertToneSeconds'\n                                );\n                                if (queueAARingTime != null) {\n                                    ringTimeCache.set(workitemQueueId, queueAARingTime, CACHE_TTL);\n                                }\n                                this._playRingTimeOrDefault(queueAARingTime, model, ringService, soundService, volume);\n                            })\n                            .catch((e: unknown) => {\n                                this.get('loggerService').error(\n                                    'ConversationModeService: failed to fetch workitem queue for ring time',\n                                    { e }\n                                );\n                                this._debouncedPlaySound(soundService, volume);\n                            });\n                    }\n                } else {\n                    this._debouncedPlaySound(soundService, volume);\n                }\n            } else {\n                const queueMediaSettings = getQueueMediaSettings(model);\n                const queueAARingTime: number | undefined = queueMediaSettings?.autoAnswerAlertToneSeconds;\n                this._playRingTimeOrDefault(queueAARingTime, model, ringService, soundService, volume);\n            }\n        } else {\n            this._debouncedPlaySound(soundService, volume);\n        }\n    },\n\n    /**\n     * Plays a timed ringtone if `queueAARingTime > 0`, falls back to the debounced\n     * default tone if undefined/null, and plays nothing if explicitly 0.\n     * Mirrors the `queueAARingTime > 0 / !== 0` branching in legacy _onAutoAnswer.\n     */\n    _playRingTimeOrDefault(\n        queueAARingTime: number | undefined,\n        model: any,\n        ringService: any,\n        soundService: any,\n        volume: number\n    ) {\n        if (queueAARingTime && queueAARingTime > 0) {\n            const id = model.get ? model.get('id') : model.id;\n            ringService.playRingtone(id, false, queueAARingTime * 1000, false, 'digital');\n        } else if (queueAARingTime !== 0) {\n            // undefined/null → play default; 0 → silent\n            this._debouncedPlaySound(soundService, volume);\n        }\n    },\n\n    /**\n     * Debounced wrapper around soundService.playSound.\n     * 500ms leading debounce mirrors legacy interaction.playSound debounce behavior.\n     * Stores args on the instance so the stable method reference deduplicates correctly.\n     */\n    _debouncedPlaySound(soundService: any, volume: number) {\n        this._pendingSoundService = soundService;\n        this._pendingSoundVolume = volume;\n        run.debounce(this, this._playDefaultSound, 500, true);\n    },\n\n    _playDefaultSound() {\n        this._pendingSoundService?.playSound('digital-no-repeat', this._pendingSoundVolume ?? 1);\n    },\n\n    _pendingSoundService: null as any,\n    _pendingSoundVolume: null as number | null,\n\n    /**\n     * Holds the auto-answered interaction if AA-holding is enabled and another\n     * interaction is currently selected. Prevents multiple unheld interactions.\n     *\n     * Mirrors legacy interaction._onAutoAnswer AA-holding logic.\n     */\n    _holdIfAAHoldingEnabled(model: any) {\n        // @ts-ignore -> session.features is a dynamic hash\n        const aaHoldingEnabled: boolean = this.get('sessionService').get('features')?.['PURE-7111_aa-holding'];\n        if (!aaHoldingEnabled) return;\n\n        const mode = this.get('_mode');\n        if (!mode) return;\n\n        const modelId = model.get ? model.get('id') : model.id;\n        const selection = this.get('rosterSelectionService').get('selection');\n        const selectedId = selection?.id;\n\n        if (!selection || selectedId === modelId) return;\n\n        // Check if the auto-answered interaction is connected and not already held\n        const isConnected = model.get ? model.get('isConnected') : false;\n        const isHeld = model.get ? model.get('isHeld') : false;\n\n        if (isConnected && !isHeld) {\n            const communicationService = this.get('communicationService');\n            communicationService.hold(model).catch((error: any) => {\n                this.get('loggerService').error('ConversationModeService: failed to hold auto-answered interaction', {\n                    remoteData: { error, id: modelId }\n                });\n            });\n        }\n    },\n\n    /**\n     * Fetches the current draft for an email conversation and stores it in the\n     * mode's draftUpdateHash array. Mirrors legacy acdemail.fetchDraftForEmail.\n     *\n     * @param emailId - The conversation ID of the email interaction.\n     */\n    fetchDraftForEmail(emailId: string) {\n        // draftUri comes from UriBuilder mixin: /api/v2/conversations/emails/{id}/messages/draft\n        const url = this.draftUri(emailId, 'emails');\n        return this.get('ajaxService')\n            .ajaxGet(url)\n            .then((draft: any) => {\n                if (!this._isModeAlive()) return;\n                draft.conversationId = emailId;\n                this.setDraftUpdate(emailId, draft);\n            })\n            .catch(() => {\n                this.get('loggerService').error('ConversationModeService: failed to fetch draft for email', {\n                    remoteData: { conversationId: emailId }\n                });\n            });\n    },\n\n    /**\n     * Upserts a draft object into the mode's draftUpdateHash array. If a draft\n     * with the same conversationId already exists, its properties are merged;\n     * otherwise the draft is appended.\n     *\n     * @param interactionId - The conversation ID to key on.\n     * @param draft - The draft payload to store.\n     */\n    setDraftUpdate(interactionId: string, draft: any) {\n        const mode = this.get('_mode');\n        if (!mode || !mode._isAlive()) return;\n\n        const draftUpdateHash = mode.get('draftUpdateHash');\n        if (!draftUpdateHash) return;\n\n        const existing = draftUpdateHash.findBy('conversationId', interactionId);\n        if (existing) {\n            existing.setProperties ? existing.setProperties(draft) : Object.assign(existing, draft);\n        } else {\n            draftUpdateHash.pushObject(draft);\n        }\n        mode.notifyPropertyChange('draftUpdateHash');\n    },\n\n    /**\n     * Handles an inbound typing event from pigeon. Determines the platform type,\n     * checks deployment config for web messaging, and adds/refreshes a typing\n     * indicator on the mode's isTypingInteractions array with an auto-expiry timer.\n     *\n     * Mirrors legacy acdsms._handleTypingEvent + _handleTypingIndicator.\n     */\n    handleTypingEvent(payload: any) {\n        const platformType: string = (payload?.normalizedMessage?.channel?.platform || '').toLowerCase();\n\n        if (platformType === 'open' || platformType === 'apple') {\n            this._addTypingIndicator(payload);\n        } else if (platformType === 'webmessaging') {\n            const configId: string = payload?.normalizedMessage?.channel?.to?.additionalIds?.[0]?.value;\n            const typingConfig = this._hasTypingConfigForId(configId);\n\n            if (typingConfig.found === false) {\n                this.get('communicationService')\n                    .getDeploymentConfig(configId)\n                    .then((result: any) => {\n                        if (!this._isModeAlive()) return;\n\n                        const isTypingEnabled: boolean =\n                            result?.configurationVersion?.messenger?.apps?.conversations?.showUserTypingIndicator;\n                        this._setTypingIndicatorConfig(configId, isTypingEnabled);\n                        if (isTypingEnabled) {\n                            this._addTypingIndicator(payload);\n                        }\n                    })\n                    .catch(() => {\n                        // Silently ignore — typing indicator is non-critical\n                    });\n            } else if (typingConfig.enabled) {\n                this._addTypingIndicator(payload);\n            }\n        }\n    },\n\n    /**\n     * Adds or refreshes a typing indicator for a conversation.\n     * Mirrors legacy acdsms._handleTypingIndicator.\n     */\n    _addTypingIndicator(payload: any) {\n        const mode = this.get('_mode');\n        if (!this._isModeAlive()) return;\n\n        const conversationId: string = payload?.conversationId;\n        if (!conversationId) return;\n\n        const duration: number = payload?.normalizedMessage?.events?.[0]?.typing?.duration || 5000;\n        const isTypingInteractions = mode.get('isTypingInteractions');\n        if (!isTypingInteractions) return;\n\n        const existingIdx = isTypingInteractions.indexOf(conversationId);\n        const timers = (this.get('_typingTimers') || {}) as Record<string, any>;\n        if (timers[conversationId]) {\n            run.cancel(timers[conversationId]);\n        }\n\n        if (existingIdx === -1) {\n            isTypingInteractions.pushObject(conversationId);\n        }\n\n        timers[conversationId] = run.later(() => {\n            if (!mode.get('isDestroyed') && !mode.get('isDestroying')) {\n                isTypingInteractions.removeObject(conversationId);\n            }\n            delete timers[conversationId];\n        }, duration);\n    },\n\n    /**\n     * Removes the typing indicator for a conversation. Called when an inbound\n     * message arrives.\n     */\n    removeTypingIndicator(conversationId: string) {\n        const mode = this.get('_mode');\n        if (!mode) return;\n\n        const isTypingInteractions = mode.get('isTypingInteractions');\n        if (!isTypingInteractions) return;\n\n        const timers = (this.get('_typingTimers') || {}) as Record<string, any>;\n        if (timers[conversationId]) {\n            run.cancel(timers[conversationId]);\n            delete timers[conversationId];\n        }\n\n        isTypingInteractions.removeObject(conversationId);\n    },\n\n    _hasTypingConfigForId(configId: string): { found: boolean | null; enabled: boolean | null } {\n        const result: { found: boolean | null; enabled: boolean | null } = { found: null, enabled: null };\n        if (!configId) return result;\n\n        const checkedDeploymentIds = this.get('_checkedDeploymentIds') as Array<{ id: string; enabled: boolean }>;\n        const cached = checkedDeploymentIds?.find((entry: { id: string }) => entry.id === configId);\n        if (cached) {\n            result.found = true;\n            result.enabled = cached.enabled;\n        } else {\n            result.found = false;\n        }\n        return result;\n    },\n\n    _setTypingIndicatorConfig(configId: string, enabled: boolean) {\n        const checkedDeploymentIds = this.get('_checkedDeploymentIds') as Array<{ id: string; enabled: boolean }>;\n        if (checkedDeploymentIds) {\n            checkedDeploymentIds.push({ id: configId, enabled });\n        }\n    },\n\n    /**\n     * Entry point for all conversation events. Resolves the conversation type\n     * and enqueues on the appropriate per-type chain.\n     */\n    processEvent(options: ProcessEventOptions) {\n        // @ts-ignore -> session.person.guid is a nested path on the Ember session service\n        const userId: string = this.get('sessionService.person.guid');\n\n        const type = resolveConversationType(options.payload, userId);\n\n        if (!type) {\n            this.get('loggerService').warn(\n                'ConversationModeService: could not resolve conversation type, skipping event',\n                {\n                    remoteData: { conversationId: options.payload?.id }\n                }\n            );\n            return;\n        }\n\n        const chainKey = TYPE_TO_CHAIN_KEY[type];\n        // @ts-ignore -> chainKey is a dynamic property name for the per-type chain\n        const chain = this.get(chainKey);\n\n        if (!chain) {\n            this.get('loggerService').warn(\n                'ConversationModeService: no processing chain registered for type, skipping event',\n                {\n                    remoteData: { conversationId: options.payload?.id, type }\n                }\n            );\n            return;\n        }\n\n        this.get('loggerService').info('CP: Chain being processed', chainKey as String);\n\n        chain.enqueueEvent(options.payload.id, {\n            eventSource: options.eventSource,\n            payload: options.payload\n        });\n    },\n\n    /**\n     * Records a conversation id from an outbound create so the matching interaction\n     * is selected when it first appears on the active roster. Callers (e.g. mode\n     * outbound create panels) invoke this with the create API response id — modes\n     * must not depend on legacy consumeRequestedInteractionSelection/acdsms create-event broadcasts.\n     *\n     * Mirrors legacy ACD panel `requestInteraction`.\n     *\n     * @param conversationId - Conversation id returned by the outbound create API.\n     */\n    requestInteractionSelection(conversationId: string | null | undefined) {\n        if (conversationId) this.set('_requestedInteractionId', conversationId);\n    },\n\n    /**\n     * Consumes a pending outbound-create selection request when the conversation\n     * id matches. Returns true once so the processing chain can select the interaction.\n     *\n     * @param conversationId - Interaction id from the current processing chain context.\n     * @returns True when this id was the pending request and has now been cleared.\n     */\n    consumeRequestedInteractionSelection(conversationId: string | null | undefined): boolean {\n        if (!conversationId) return false;\n        if (this.get('_requestedInteractionId') !== conversationId) return false;\n        this.set('_requestedInteractionId', null);\n        return true;\n    },\n\n    /**\n     * Destroys all chain instances and clears state. Called from the mode's willDestroy.\n     */\n    teardown() {\n        this._detachHeadsetEvents();\n        this._dismissAlertingToast();\n\n        const webrtcSdkService = this.get('webrtcSdkService');\n        if (webrtcSdkService && this.get('_headsetObserverRegistered')) {\n            webrtcSdkService.removeObserver('useSdk', this, this._onWebrtcSdkUseSdkChanged);\n            this.set('_headsetObserverRegistered', false);\n        }\n\n        const chainKeys = [\n            '_emailProcessingChain',\n            '_messageProcessingChain',\n            '_callbackProcessingChain',\n            '_callProcessingChain'\n        ] as const;\n\n        for (const key of chainKeys) {\n            const chain = this.get(key);\n            if (chain) {\n                chain.destroy();\n                this.set(key, null);\n            }\n        }\n\n        this.set('_mode', null);\n        this.set('_contactObservers', null);\n        this.set('_partCommIdMap', null);\n        this.set('_blockedCalls', null);\n        this.set('_callbackModels', null);\n        this.set('_alertingInteractions', null);\n        this.set('_requestedInteractionId', null);\n\n        // Cancel all typing indicator auto-expiry timers\n        const timers = this.get('_typingTimers') as Record<string, any> | null;\n        if (timers) {\n            Object.values(timers).forEach((timer: any) => run.cancel(timer));\n        }\n        this.set('_typingTimers', null);\n        this.set('_checkedDeploymentIds', null);\n\n        // Resolve the init promise if still pending (mode destroyed before fetch completed)\n        this._resolveInitReadyIfPending();\n\n        this.set('_initialized', false);\n    },\n\n    /**\n     * Resolves the acdinitialization promise registered during initialize().\n     * Safe to call multiple times; no-ops when already resolved or service is tearing down.\n     */\n    _resolveInitReadyIfPending() {\n        if (this.get('isDestroyed') || this.get('isDestroying')) return;\n\n        const resolve = this.get('_initReadyResolve') as (() => void) | null;\n        if (!resolve) return;\n\n        this.set('_initReadyResolve', null);\n        resolve();\n    },\n\n    /**\n     * Fetches all of the conversations for the current user\n     */\n    fetchAll() {\n        const url = this.baseUri();\n        return this.makeRequest(url, {}, 'get').then((response: { entities: any[] }) =>\n            response.entities.filter(c => c && c.id)\n        );\n    },\n\n    /**\n     * Signals that the initial fetch and processing is complete. Resolves the\n     * promise registered with acdinitialization so downstream consumers know\n     * all existing interactions have been loaded.\n     */\n    signalReady() {\n        this._resolveInitReadyIfPending();\n    },\n\n    /**\n     * Returns the outbound CALL models for callbacks whose outbound leg should auto-proceed on\n     * WebRTC stations. Mirrors legacy acdcallback.incomingCallbackCallsToAutoAnswer.\n     *\n     * Checks: WebRTC station, browser answer preference, client-answered tracking, fully automated\n     * callbacks, and the CALL model's `isContacting` state (see note in the body on why the callback\n     * model's `isContacting` cannot be used here).\n     */\n    incomingCallbackCallsToAutoAnswer: computed(\n        '_callbackAutoAnswerTrigger',\n        'phoneService.station.isWebrtc',\n        function () {\n            const phoneService = this.get('phoneService');\n            // @ts-ignore -> station.isWebrtc is a nested path on the phone service\n            if (!phoneService.get('station.isWebrtc')) {\n                return [];\n            }\n\n            const callbackModels = this.get('_callbackModels') as Map<\n                string,\n                { interactionId: string; call: any; callback: any }\n            > | null;\n            if (!callbackModels || callbackModels.size === 0) return [];\n\n            const answerFromThisBrowser = phoneService.get('thisBrowserIsTheOneToAnswerFrom');\n            const answeredByClient = (this.get('_callBacksAnsweredByClient') || []) as string[];\n            const result: any[] = [];\n\n            callbackModels.forEach(({ call, callback }: { call: any; callback: any }) => {\n                if (!call || !call.get('isContacting')) return;\n\n                const isFullyAutomated =\n                    callback.get('participantForCurrentUser.attributes.sys_callback_auto_answered') &&\n                    callback.get('participantForCurrentUser.attributes.sys_callback_auto_dialed');\n                const thisClientAnsweredTheCall = answeredByClient.includes(callback.id) || isFullyAutomated;\n\n                if (thisClientAnsweredTheCall || answerFromThisBrowser) {\n                    // Mirrors legacy, which pushed the call model here.\n                    result.push(call);\n                }\n            });\n\n            return result;\n        }\n    ),\n\n    /**\n     * Trigger property for incomingCallbackCallsToAutoAnswer recomputation.\n     * Incremented by the callback chain after roster updates.\n     */\n    _callbackAutoAnswerTrigger: 0,\n\n    /**\n     * Call this after callback roster changes to recompute incomingCallbackCallsToAutoAnswer.\n     */\n    notifyCallbackAutoAnswerChange() {\n        this.incrementProperty('_callbackAutoAnswerTrigger');\n    },\n\n    /**\n     * Tracks a callback as answered by this browser session. Used by\n     * incomingCallbackCallsToAutoAnswer to determine auto-proceed eligibility.\n     * Mirrors legacy acdcallback.answer() tracking.\n     */\n    trackCallbackAnsweredByClient(interactionId: string) {\n        const list = (this.get('_callBacksAnsweredByClient') || []) as string[];\n        if (!list.includes(interactionId)) {\n            list.push(interactionId);\n            try {\n                window.sessionStorage.callBacksAnsweredByClient = JSON.stringify(list);\n            } catch (_e) {\n                // sessionStorage may be unavailable\n            }\n        }\n        this.notifyCallbackAutoAnswerChange();\n    },\n\n    /**\n     * Holds every connected, unheld call interaction other than the specified interaction.\n     * Called before placing an outbound call from a callback so voice stays single-occupancy.\n     *\n     * Each hold is fire-and-forget (failures swallowed per-call, matching legacy behavior)\n     * and the returned promise array lets the caller `all(...)` them before proceeding.\n     *\n     * @param currentInteractionId - The id of the callback placing the call (excluded from holds).\n     * @returns Array of hold promises (empty if no mode or no calls to hold).\n     */\n    holdOtherConnectedCalls(currentInteractionId: string): Promise<any>[] {\n        const mode = this.get('_mode');\n        if (!mode || !mode._isAlive()) return [];\n\n        const allItems = mode.get('allItems') as Map<string, any> | null;\n        if (!allItems || allItems.size === 0) return [];\n\n        const callsToHold = findCallsToHoldOnSelect(currentInteractionId, allItems.values());\n        const communicationService = this.get('communicationService');\n\n        return callsToHold.map((call: any) => communicationService.hold(call).catch(() => {}));\n    },\n\n    /**\n     * Places the outbound call for a callback interaction.\n     *\n     * On WebRTC stations, records the dialing client in `_callBacksAnsweredByClient` so that\n     * `incomingCallbackCallsToAutoAnswer` includes this callback when the outbound leg's\n     * pending session arrives — ensuring it is auto-accepted regardless of how the callback\n     * leg was originally answered.\n     *\n     * @param interaction - The callback interaction the call is being placed for.\n     * @param phoneNumber - The number to dial.\n     * @param phoneColumn - For a dialer preview/scheduled callback, the phone column for the number.\n     */\n    beginCallback(interaction: any, phoneNumber: string, phoneColumn?: string): Promise<void> {\n        if (!interaction) return Promise.resolve();\n        interaction.set('isPlacingCall', true);\n\n        return (this.get('communicationService') as any)\n            .addCall(interaction, phoneNumber, phoneColumn)\n            .then(() => {\n                this._scheduleIsPlacingCallTimer(interaction);\n\n                // @ts-ignore -> station.isWebrtc is a nested path on the phone service\n                if (this.get('phoneService.station.isWebrtc')) {\n                    // Make sure the client that places the call is the one that answers the\n                    // resulting outbound leg's pending WebRTC session.\n                    this.trackCallbackAnsweredByClient(get(interaction, 'id'));\n                }\n            })\n            .catch((error: unknown) => {\n                interaction.set('isPlacingCall', false);\n                throw error;\n            });\n    },\n\n    /**\n     * Sets up a fallback timer to expire `isPlacingCall` in case no further conversation event\n     * arrives for this callback (the callback chain's `updateCallbackModels` also clears it on the\n     * next event). Ported from legacy `acdcallback._scheduleIsPlacingCallTimer`.\n     */\n    _scheduleIsPlacingCallTimer(interaction: any) {\n        // Cancel any existing timer so we don't expire isPlacingCall prematurely — e.g. if the\n        // agent places a call, wraps it up, and places another within the timeout window.\n        if (interaction.get('isPlacingCallTimer')) {\n            cancel(interaction.get('isPlacingCallTimer'));\n        }\n\n        const isPlacingCallTimer = later(() => interaction.set('isPlacingCall', false), IS_PLACING_CALL_TIMEOUT);\n        interaction.set('isPlacingCallTimer', isPlacingCallTimer);\n    },\n\n    /**\n     * Answers an alerting interaction using the mode-specific services.\n     * Voice calls are routed through the phone service, which owns WebRTC\n     * pending-session acceptance, headset state, debouncing, and its own error handling. All\n     * digital types (chat, email, message, callback) are connected through the communication\n     * service by patching the agent participant to `connected`.\n     *\n     * Callbacks additionally record that this browser answered the call so the auto-answer\n     * bookkeeping in `incomingCallbackCallsToAutoAnswer` stays consistent across sessions.\n     *\n     * Mirrors legacy `interaction._answerInteraction` without depending on the interaction service.\n     *\n     * @param interaction - The alerting interaction model from the active roster.\n     * @returns A promise that resolves once the answer request settles.\n     */\n    answer(interaction: any): Promise<void> {\n        if (!interaction) return Promise.resolve();\n\n        const type = get(interaction, 'type') as string;\n        this._stopDigitalAlerting();\n\n        if (type === 'call') {\n            this._stopVoiceAlerting();\n            this.get('phoneService').answer(get(interaction, 'conversation'));\n            return Promise.resolve();\n        }\n\n        // @ts-ignore -> station.isWebrtc is a nested path on the phone service\n        if (type === 'callback' && this.get('phoneService').get('station.isWebrtc')) {\n            this.trackCallbackAnsweredByClient(get(interaction, 'id'));\n        }\n\n        return this.get('communicationService')\n            .answer(interaction)\n            .catch((error: unknown) => this._notifyInteractionActionError(type, 'answer', interaction, error));\n    },\n\n    /**\n     * Declines an alerting interaction using the mode-specific services rather than the legacy\n     * interaction service. Voice calls are ended through the phone service; all digital types\n     * are declined by disconnecting the agent participant through the communication service.\n     *\n     * Mirrors legacy `interaction._declineInteraction` without depending on the interaction service.\n     *\n     * @param interaction - The alerting interaction model from the active roster.\n     * @returns A promise that resolves once the decline request settles.\n     */\n    decline(interaction: any): Promise<void> {\n        if (!interaction) return Promise.resolve();\n\n        const type = get(interaction, 'type') as string;\n        this._stopDigitalAlerting();\n\n        if (type === 'call') {\n            this._stopVoiceAlerting();\n            this.get('phoneService').endCall(get(interaction, 'conversation'));\n            return Promise.resolve();\n        }\n\n        return this.get('communicationService')\n            .disconnect(interaction)\n            .catch((error: unknown) => this._notifyInteractionActionError(type, 'decline', interaction, error));\n    },\n\n    /**\n     * Stops the digital alerting ringtone. Mirrors the `ring.stopRingtone('digital')` call\n     * made by the legacy interaction service on answer/decline.\n     */\n    _stopDigitalAlerting(): void {\n        this.get('ringService').stopRingtone('digital');\n    },\n\n    /**\n     * Stops the voice alerting ringtone. Called on answer/decline via the modes UI\n     * so the ring stops immediately rather than waiting for the next pigeon event\n     * to transition state in the processing chain (ACE-5496).\n     */\n    _stopVoiceAlerting(): void {\n        this.get('ringService').stopRingtone();\n    },\n\n    /**\n     * Logs and surfaces a user-facing error when a digital answer/decline request fails. Voice\n     * errors are handled inside the phone service, so only digital types resolve to a message key.\n     *\n     * @param type - The interaction type ('chat' | 'email' | 'message' | 'callback').\n     * @param action - Which action failed ('answer' | 'decline').\n     * @param interaction - The interaction the action was attempted on.\n     * @param error - The rejection reason from the communication service.\n     */\n    _notifyInteractionActionError(type: string, action: 'answer' | 'decline', interaction: any, error: unknown): void {\n        const errorKeys: Record<string, { answer: string; decline: string }> = {\n            chat: {\n                answer: 'purecloud.acdInteraction.chats.errors.answer',\n                decline: 'purecloud.acdInteraction.chats.errors.decline'\n            },\n            email: {\n                answer: 'purecloud.acdInteraction.emails.errors.answer',\n                decline: 'purecloud.acdInteraction.emails.errors.decline'\n            },\n            callback: {\n                answer: 'purecloud.acdInteraction.callbacks.errors.answer',\n                decline: 'purecloud.acdInteraction.callbacks.errors.decline'\n            },\n            message: {\n                answer: 'purecloud.acdInteraction.sms.errors.answer',\n                decline: 'purecloud.acdInteraction.sms.errors.decline'\n            }\n        };\n\n        this.get('loggerService').error(`ConversationModeService: failed to ${action} interaction`, {\n            remoteData: { error, id: get(interaction, 'id'), type }\n        });\n\n        const messageKey = errorKeys[type]?.[action];\n        if (messageKey) {\n            this.get('notificationService').error(null, this.get('intlService').t(messageKey), {});\n        }\n    },\n\n    /**\n     * Fetches all of the conversations for the current user by type\n     * @param communicationType - The type of communication to fetch conversations for\n     */\n    fetchAllByType(communicationType: string) {\n        const url = this.baseUri();\n        return this.makeRequest(url, { data: { communicationType } }, 'get').then(\n            (response: { entities: any[] }) => response.entities\n        );\n    }\n});\n","import { computed } from '@ember/object';\nimport { readOnly } from '@ember/object/computed';\nimport Service, { inject } from '@ember/service';\nimport type { AppPool } from '@genesys/apps-v2-host';\nimport type { Maybe } from 'web-directory/types';\nimport type { AppContext } from 'web-directory/utils/apps';\n\nexport type ScriptState = {\n    scriptAvailable: boolean;\n    changeCount: number;\n};\n\n/**\n * Shared state service for interapptions data in the Modes architecture.\n *\n * Acts as a communication bus between the `interapptions-container` (which renders\n * `interapptions-manager-v2` and writes outputs here) and mode-specific main stage\n * components (which read from here to pass data to the interaction component).\n *\n * Also computes derived state from the mode-service (activeAppContexts, selectedAppContext)\n * so that both the interapptions-container and main stage components read from a single source.\n *\n * This service persists across mode switches, ensuring the interapptions manager's\n * iframe pool and app state are not lost.\n */\nexport default Service.extend({\n    // --- Services ---\n    modeService: inject('modes/mode-service'),\n    rosterSelectionService: inject('modes/roster-selection-service'),\n\n    // --- Derived from mode-service (computed, read by both interapptions-container and main stage) ---\n\n    /**\n     * All modes that have opted into interapptions.\n     */\n    interapptionModes: computed('modeService.modes.@each.hasInterapptions', function (): any[] {\n        const modes = this.get('modeService.modes') || [];\n        return modes.filter((m: any) => m.get('hasInterapptions'));\n    }),\n\n    /**\n     * Committed roster selection payload. Reads directly from the selection service so\n     * switching roster tabs does not clear selection while the main stage remains visible.\n     */\n    selectedItem: readOnly('rosterSelectionService.selection.payload'),\n\n    /**\n     * Array of AppContext objects representing all interactions/workitems from modes\n     * that have opted into interapptions (hasInterapptions: true). Aggregated from\n     * all such modes so that apps persist across mode switches.\n     */\n    activeAppContexts: computed('interapptionModes.@each.allItems', function (): AppContext[] {\n        const modes = this.get('interapptionModes') as any[];\n        if (!modes || modes.length === 0) return [];\n\n        const contexts: AppContext[] = [];\n        for (const mode of modes) {\n            const allItems = mode.get('allItems') as Map<string, any> | null;\n            if (!allItems) continue;\n            contexts.push(...mode.convertToAppContexts(allItems));\n        }\n        return contexts;\n    }),\n\n    /**\n     * The currently selected AppContext.\n     * Matches by both `id` and `type` to avoid collisions when a live conversation and its\n     * historical counterpart share the same conversation ID across different modes.\n     */\n    selectedAppContext: computed(\n        'activeAppContexts',\n        'rosterSelectionService.selection',\n        'modeService.modes.[]',\n        function (): Maybe<AppContext> {\n            const activeAppContexts = this.get('activeAppContexts') as AppContext[];\n            const selection = this.get('rosterSelectionService.selection');\n            if (!selection) return null;\n\n            // Determine expected context type from the mode that owns the selection\n            const modes = this.get('modeService.modes') || [];\n            const selectionMode = modes.find((m: any) => m.get('id') === selection.modeId);\n            if (selectionMode) {\n                // Build a single-item map to get the expected AppContext type for this selection\n                const singleItemMap = new Map<string, any>();\n                singleItemMap.set(selection.id, selection.payload);\n                const expectedContexts: AppContext[] = selectionMode.convertToAppContexts(singleItemMap);\n                const expectedType = expectedContexts.length > 0 ? expectedContexts[0].type : undefined;\n\n                if (expectedType) {\n                    return activeAppContexts.find(ctx => ctx.id === selection.id && ctx.type === expectedType) || null;\n                }\n            }\n\n            // Fallback: match by id only (legacy behavior)\n            return activeAppContexts.find(ctx => ctx.id === selection.id) || null;\n        }\n    ),\n\n    // --- Written by interapptions-container, read by main stage components ---\n\n    /**\n     * The AppPool instance created by interapptions-manager-v2.\n     */\n    appPoolV2: null as Maybe<AppPool>,\n\n    /**\n     * Whether the current interaction has a conversation-level app registered.\n     */\n    hasConversationAppForCurrInteraction: false,\n\n    /**\n     * Array of visible contextual app def IDs for the current interaction.\n     */\n    visibleContextualAppsForCurrInteraction: [] as string[],\n\n    /**\n     * Whether contextual focus mode is enabled (an app is focused full-width).\n     */\n    hasContextualFocusModeEnabled: false,\n\n    /**\n     * Map of composite app IDs to their attention/badge counts.\n     */\n    attentionCountPerCompositeId: {} as Record<string, number>,\n\n    // --- Written by interapptions-container (canned responses), read by main stage ---\n\n    /**\n     * Canned response text to insert into the chat input.\n     */\n    cannedResponseChatText: null as Maybe<string>,\n\n    /**\n     * Canned response text to insert into the SMS input.\n     */\n    cannedResponseSmsText: null as Maybe<string>,\n\n    /**\n     * Canned response text to insert into the email input.\n     */\n    cannedResponseEmailText: null as Maybe<string>,\n\n    /**\n     * Structured message payload for SMS canned responses.\n     */\n    structuredMessage: null as Maybe<string>,\n\n    // --- Written by main stage, read by interapptions-container ---\n\n    /**\n     * Map of interaction IDs to their script availability state.\n     * Updated by the displayed mode (via contextualScriptAvailabilityChanged on base/mode.ts)\n     * when the interaction component reports script availability changes.\n     */\n    contextualInteractionScriptStateMap: {} as Record<string, ScriptState>,\n\n    // --- Methods ---\n\n    init() {\n        this._super(...arguments);\n        // Ensure array/object properties are instance-level (not shared on prototype)\n        this.set('visibleContextualAppsForCurrInteraction', []);\n        this.set('attentionCountPerCompositeId', {});\n        this.set('contextualInteractionScriptStateMap', {});\n    }\n});\n","import { readOnly } from '@ember/object/computed';\nimport Service, { inject } from '@ember/service';\nimport LruCache from 'web-directory/utils/lru-cache';\nimport type { Maybe } from 'web-directory/types';\nimport { addPageAction } from 'web-directory/utils/newrelic';\nimport {\n    buildMainstageResizePageAction,\n    buildValidMainstageLayout,\n    DEFAULT_MAINSTAGE_LAYOUT,\n    ephemeralMainstageKey,\n    MAINSTAGE_PREFERENCE_NAMESPACE,\n    persistentMainstageKey,\n    type MainstageLayout,\n    type MainstageSize\n} from 'web-directory/utils/mainstage';\nimport type { RosterSelectedItem } from 'web-directory/services/modes/roster-selection-service';\n\n/**\n * Mode ids whose main stage is a custom `mode-manager/main-stages/*` component (rather than the\n * legacy `acd-interactions-panel-v2/interaction`). Only these modes drive their mainstage layout\n * through this service; Active/Inactive continue to use the legacy component's own logic.\n */\nconst CUSTOM_MAINSTAGE_MODE_IDS = ['history', 'externalContact'] as const;\n\n/**\n * Maps custom main-stage mode ids to their interaction type string\n * (the key used for ephemeral/persistent storage).\n */\nconst MODE_ID_TO_INTERACTION_TYPE: Record<string, string> = {\n    history: 'analyticsConversation',\n    externalContact: 'externalContact'\n};\n\n/**\n * Maximum number of ephemeral (in-session) per-item layout entries retained.\n *\n * History/Contacts items do not \"leave\" the roster the way live interactions do (there is no wrapup/close),\n * so there is no natural purge event; a fixed LRU cap keeps the cache bounded regardless of how many items an agent\n * views in a session. Evicted items transparently fall back to the persisted per-type default.\n */\nconst EPHEMERAL_MAX_SIZE = 50;\n\nconst RESIZE_PAGE_ACTION = 'acdAgentUiMultipanelMainstageUserResize';\n\n/**\n * Owns all mainstage presentation state for the custom-main-stage Modes (History, Contacts):\n *\n * - Persistent tier: per-interaction-type layout defaults, loaded from and written to the\n *   `preferences` service under the `agentUiMainstage.<type>` key space shared with the legacy\n *   interaction panel.\n * - Ephemeral tier: per-item layout, keyed `<id>.<type>`, held in an LRU-capped `Map` that does not\n *   survive a refresh.\n * - Focus: `isMainstageFocused`, a transient flag moved here from the interapptions-state-service so\n *   all mainstage presentation state lives in one place. It is never persisted or cached.\n *\n * Layout resolution mirrors the legacy `updateMainstage`: on selection commit the layout is resolved\n * (ephemeral hit → persisted default → hard default) and, on a cache miss, the default entry is\n * written eagerly. This eager write is what pins a viewed item's layout so later changes to the\n * persisted default do not retroactively alter it.\n */\nexport default Service.extend({\n    preferencesService: inject('preferences'),\n    loggerService: inject('stash-logger'),\n    sessionService: inject('session'),\n    rosterSelectionService: inject('modes/roster-selection-service'),\n\n    /**\n     * Persistent per-interaction-type layout defaults, loaded from preferences on init. Keyed by\n     * interaction type (e.g. `analyticsConversation`, `externalContact`).\n     */\n    _persistentDefaults: null as Record<string, MainstageLayout> | null,\n\n    /**\n     * Ephemeral per-item layout cache keyed `<id>.<type>`. Created per-instance in `init` and bounded\n     * to {@link EPHEMERAL_MAX_SIZE} entries via LRU eviction. Deliberately NOT an observed dependency of\n     * `_currentLayout` — the current layout is set imperatively on selection/user action.\n     */\n    _ephemeral: null as LruCache<string, MainstageLayout> | null,\n\n    /**\n     * The layout of the currently selected item. Set imperatively when a selection commits (via the\n     * roster-selection `select` handler) and after a user action. `currentSize`/`currentCollapsed`\n     * are read-only projections consumed by `mode-manager` and the custom main-stage components.\n     */\n    _currentLayout: DEFAULT_MAINSTAGE_LAYOUT as MainstageLayout,\n\n    currentSize: readOnly('_currentLayout.mainstageSize'),\n    currentCollapsed: readOnly('_currentLayout.mainstageCollapsed'),\n\n    /**\n     * Whether the mainstage is in focused mode (expanded to hide contextual panels). Transient and\n     * cross-mode; written by `base/mode.onMainstageFocusedChanged` and reset by\n     * `interapptions-container` when an app is forced open. Never persisted.\n     */\n    isMainstageFocused: false,\n\n    init() {\n        this._super(...arguments);\n        this.set('_ephemeral', new LruCache<string, MainstageLayout>(EPHEMERAL_MAX_SIZE));\n        this.set('_persistentDefaults', {});\n        this._loadPersistentDefaults();\n        this._registerSelectionHandlers();\n    },\n\n    /**\n     * Loads the persisted `agentUiMainstage` preference into `_persistentDefaults`. On failure logs\n     * and leaves an empty map so the UI still resolves from ephemeral/hard defaults.\n     */\n    _loadPersistentDefaults(): Promise<void> {\n        return this.get('preferencesService')\n            .getPreference(MAINSTAGE_PREFERENCE_NAMESPACE)\n            .then((result: Record<string, MainstageLayout> | null) => {\n                if (this.get('isDestroyed') || this.get('isDestroying')) return;\n                this.set('_persistentDefaults', result || {});\n            })\n            .catch((error: unknown) => {\n                this.get('loggerService').error('Error getting Mainstage preferences:', { error });\n                if (this.get('isDestroyed') || this.get('isDestroying')) return;\n                this.set('_persistentDefaults', {});\n            });\n    },\n\n    /**\n     * Registers a `select` handler on the roster-selection-service for each custom-main-stage mode.\n     * The handler fires right after the selection commits — the analog of legacy `updateMainstage`\n     * running on interaction change — and eagerly resolves the layout for the new item.\n     *\n     * The roster-selection-service is an app-lifetime singleton, so no teardown is required.\n     */\n    _registerSelectionHandlers(): void {\n        const rosterSelectionService = this.get('rosterSelectionService');\n        CUSTOM_MAINSTAGE_MODE_IDS.forEach(modeId => {\n            rosterSelectionService.registerHandlers(modeId, {\n                select: (selection: RosterSelectedItem) => {\n                    this._onSelectionCommitted(selection);\n                    return Promise.resolve();\n                }\n            });\n        });\n    },\n\n    /**\n     * Resolves the layout for the just-committed selection and sets it as the current layout.\n     */\n    _onSelectionCommitted(selection: Maybe<RosterSelectedItem>): void {\n        if (!selection) {\n            this.set('_currentLayout', { ...DEFAULT_MAINSTAGE_LAYOUT });\n            return;\n        }\n\n        const interactionType = MODE_ID_TO_INTERACTION_TYPE[selection.modeId];\n        if (!interactionType) {\n            this.set('_currentLayout', { ...DEFAULT_MAINSTAGE_LAYOUT });\n            return;\n        }\n\n        this.set('_currentLayout', this._resolveEphemeralLayout(selection.id, interactionType));\n    },\n\n    /**\n     * Resolves the layout for an item from the ephemeral cache. On a cache miss, initializes the\n     * entry from the persisted per-type default (or hard default) and writes it to the cache so the\n     * item's layout is pinned for the remainder of the session.\n     */\n    _resolveEphemeralLayout(id: string, interactionType: string): MainstageLayout {\n        const key = ephemeralMainstageKey(id, interactionType);\n        const cache = this.get('_ephemeral')!;\n        const existing = cache.get(key);\n\n        if (existing) {\n            return buildValidMainstageLayout(existing);\n        }\n\n        const persistentDefaults = this.get('_persistentDefaults') || {};\n        const defaultLayout = buildValidMainstageLayout(persistentDefaults[interactionType]);\n\n        cache.set(key, defaultLayout);\n        return defaultLayout;\n    },\n\n    /**\n     * Applies a user-initiated layout change for the currently selected item: writes the ephemeral\n     * entry, persists the per-type default, emits telemetry, and updates the current layout. No-op\n     * when nothing is selected or the selection belongs to a mode this service doesn't manage.\n     */\n    _applyUserChange(partial: Partial<MainstageLayout>): void {\n        const selection = this.get('rosterSelectionService').get('selection');\n        if (!selection) return;\n\n        const interactionType = MODE_ID_TO_INTERACTION_TYPE[selection.modeId];\n        if (!interactionType) return;\n\n        const key = ephemeralMainstageKey(selection.id, interactionType);\n\n        const cache = this.get('_ephemeral')!;\n        const prev = cache.get(key) ?? undefined;\n        const next = buildValidMainstageLayout({ ...this.get('_currentLayout'), ...partial });\n\n        cache.set(key, next);\n\n        const persistentDefaults = this.get('_persistentDefaults') || {};\n        this.set('_persistentDefaults', { ...persistentDefaults, [interactionType]: next });\n        this.get('preferencesService')\n            .setPreference(persistentMainstageKey(interactionType), next)\n            .catch((error: unknown) => {\n                this.get('loggerService').error('Error saving Mainstage preferences:', { error });\n                return {};\n            });\n\n        addPageAction(\n            RESIZE_PAGE_ACTION,\n            buildMainstageResizePageAction({\n                userId: (this.get('sessionService') as any).get('person.guid'),\n                interactionId: selection.id,\n                interactionType,\n                prev,\n                next\n            })\n        );\n\n        this.set('_currentLayout', next);\n    },\n\n    /**\n     * Sets the mainstage size (and clears the collapsed state, mirroring legacy `_sizeMainstage`).\n     */\n    updateSize(size: MainstageSize): void {\n        this._applyUserChange({ mainstageSize: size, mainstageCollapsed: false });\n    },\n\n    /**\n     * Toggles the collapsed state (and clears focus, mirroring legacy `_toggleMainstageCollapse`).\n     */\n    toggleCollapse(): void {\n        const collapsed = !this.get('currentCollapsed');\n        this.set('isMainstageFocused', false);\n        this._applyUserChange({ mainstageCollapsed: collapsed });\n    },\n\n    /**\n     * Sets the transient focus flag.\n     */\n    setFocused(value: boolean): void {\n        this.set('isMainstageFocused', value);\n    },\n\n    /**\n     * Resets the transient focus flag (called when an app is forced open).\n     */\n    resetFocused(): void {\n        this.set('isMainstageFocused', false);\n    }\n});\n","import { getOwner } from '@ember/application';\nimport { computed, get } from '@ember/object';\nimport Service, { inject } from '@ember/service';\nimport { type ModeModel } from 'web-directory/components/mode-manager/modes';\nimport ActiveMode from 'web-directory/components/mode-manager/modes/active';\nimport ExternalContactMode from 'web-directory/components/mode-manager/modes/external-contact';\nimport HistoryMode from 'web-directory/components/mode-manager/modes/history';\nimport InactiveMode from 'web-directory/components/mode-manager/modes/inactive';\nimport { Maybe } from 'web-directory/types';\n\nconst LAST_MODE_PREF = 'modeManager.lastSelectedModeId';\n\nexport type ModeRegistrationPredicate = () => boolean;\n\nexport type ModeRegistrationEntry = {\n    factory: { create(ownerInjection: object): unknown };\n    predicate: ModeRegistrationPredicate;\n};\n\nexport default Service.extend({\n    rosterSidePanelService: inject('modes/roster-side-panel-service'),\n    rosterSelectionService: inject('modes/roster-selection-service'),\n    preferences: inject('preferences'),\n    permissions: inject('permissions'),\n    session: inject('session'),\n\n    /**\n     * Registered modes, derived from `modeRegistrations`. Reuses existing instances by id\n     * when permissions change so stateful modes keep processing chain state, allItems, etc.\n     */\n    modes: computed(\n        'modeRegistrations',\n        'permissions.{canViewWorkitem,canViewExternalContactInteractionHistory,hasExternalContactsViewContactAccess,canGoOnQueue}',\n        function (this: any): ModeModel[] {\n            return this._syncModesFromRegistrations();\n        }\n    ),\n\n    /**\n     * Register every mode here: Ember factory plus predicate evaluated before `factory.create`.\n     * Add a new row when introducing a mode so availability stays centralized.\n     */\n    modeRegistrations: computed(\n        'permissions.{canViewWorkitem,canViewExternalContactInteractionHistory,hasExternalContactsViewContactAccess,canGoOnQueue}',\n        function (): ModeRegistrationEntry[] {\n            const p = this.get('permissions');\n            if (!p) return [];\n            return [\n                { factory: ActiveMode, predicate: () => p.get('canGoOnQueue') },\n                { factory: InactiveMode, predicate: () => p.get('canViewWorkitem') },\n                { factory: HistoryMode, predicate: () => p.get('canViewExternalContactInteractionHistory') },\n                { factory: ExternalContactMode, predicate: () => p.get('hasExternalContactsViewContactAccess') }\n            ];\n        }\n    ),\n\n    currentMode: computed('selectedModeId', 'modes.[]', function (): Maybe<ModeModel> {\n        const id: string = this.get('selectedModeId');\n        const modes = this.get('modes') || [];\n        const found = modes.find((m: ModeModel) => get(m, 'id') === id);\n        return found ?? null;\n    }),\n\n    /**\n     * Flat list of alerting groups across all registered modes, each tagged with the mode that owns it.\n     */\n    resolvedAlertingGroups: computed('modes.[]', 'modes.@each.allItems', function (this: any) {\n        const modes: ModeModel[] = this.get('modes') || [];\n\n        return modes.flatMap((mode: ModeModel) => {\n            const groups: any[] = get(mode, 'alertingGroups') || [];\n            return groups.map((group: any) => ({ group, alertingMode: mode }));\n        });\n    }),\n\n    /**\n     * The mode whose main stage is currently displayed. Derives from `pendingModeId` on the\n     * roster-selection-service — set synchronously when a selection is enqueued — so the main\n     * stage appears immediately on roster click without waiting for the async drain. Falls back\n     * to `selection.modeId` once committed. Null when nothing is selected (e.g. after wrapup).\n     */\n    displayedMainStageMode: computed(\n        'rosterSelectionService.pendingModeId',\n        'rosterSelectionService.selection',\n        'modes.[]',\n        function (this: any): Maybe<ModeModel> {\n            const id: string | undefined =\n                this.get('rosterSelectionService.pendingModeId') || this.get('rosterSelectionService.selection.modeId');\n            if (!id) return null;\n\n            const modes = this.get('modes') || [];\n            return modes.find((m: ModeModel) => get(m, 'id') === id) ?? null;\n        }\n    ),\n    hasModeSwitcher: computed('modes.[]', function (): boolean {\n        return ((this.get('modes') as ModeModel[] | null) ?? []).length > 1;\n    }),\n\n    /**\n     * Cached mode instances synced by `_syncModesFromRegistrations`.\n     */\n    _modes: null as ModeModel[] | null,\n\n    /**\n     * Id of the selected mode in roster (e.g. `active`). Default until preferences load.\n     */\n    selectedModeId: null as Maybe<string>,\n\n    init() {\n        this._super(...arguments);\n        this.set('_modes', [] as ModeModel[]);\n        if (!this.get('session.useModes' as any)) {\n            return;\n        }\n\n        this._restoreLastSelectedModeFromPreferences();\n    },\n\n    willDestroy() {\n        if (this.get('session.useModes' as any)) {\n            const modes = ((this.get('_modes') as ModeModel[] | null) ?? this.get('modes') ?? []) as ModeModel[];\n            modes.forEach((m: ModeModel) => {\n                if (typeof m.destroy === 'function') m.destroy();\n            });\n        }\n\n        this._super(...arguments);\n    },\n\n    /**\n     * Instantiates only modes whose registration predicate passes. Reuses cached\n     * instances by id and destroys modes whose predicate no longer passes.\n     */\n    _syncModesFromRegistrations(): ModeModel[] {\n        const owner = getOwner(this);\n        if (!this.get('session.useModes' as any) || !owner) return (this.get('_modes') as ModeModel[] | null) ?? [];\n\n        const injection = owner.ownerInjection();\n        const registrations: ModeRegistrationEntry[] = this.get('modeRegistrations');\n        const previousModes = ((this.get('_modes') as ModeModel[] | null) ?? []) as ModeModel[];\n\n        const newModes: ModeModel[] = [];\n        const keptIds = new Set<string>();\n\n        for (const { factory, predicate } of registrations) {\n            if (!predicate()) continue;\n\n            const modeId = (factory as any).prototype.id;\n            const existing = previousModes.find((m: ModeModel) => get(m, 'id') === modeId);\n\n            if (existing) {\n                newModes.push(existing);\n            } else {\n                newModes.push(factory.create(injection) as ModeModel);\n            }\n            keptIds.add(modeId);\n        }\n\n        for (const mode of previousModes) {\n            if (!keptIds.has(get(mode, 'id') as string)) {\n                if (typeof mode.destroy === 'function') mode.destroy();\n            }\n        }\n\n        this.set('_modes', newModes);\n        return newModes;\n    },\n\n    /**\n     * Restore the last selected mode from preferences.\n     */\n    async _restoreLastSelectedModeFromPreferences() {\n        try {\n            const id = await this.get('preferences').getPreference(LAST_MODE_PREF);\n            if (this.get('isDestroyed') || this.get('isDestroying')) return;\n\n            if (id && typeof id === 'string' && this._hasMode(id)) {\n                this.selectMode(id, false);\n            } else {\n                this._selectFirstMode();\n            }\n        } catch (error) {\n            if (this.get('isDestroyed') || this.get('isDestroying')) return;\n            // if preferences fail, select the first mode\n            this._selectFirstMode();\n        }\n    },\n\n    /**\n     * Select the first mode in the list of modes.\n     */\n    _selectFirstMode() {\n        const modes = this.get('modes') ?? [];\n        const firstMode: ModeModel | undefined = modes[0];\n        if (firstMode) {\n            this.selectMode(firstMode.get('id'), true);\n        }\n    },\n\n    /**\n     * Switch roster/sidebar context to the mode with the given id (no-op if unknown).\n     */\n    selectMode(modeId: string, setPreference: boolean = true) {\n        const modes: ModeModel[] | null = this.get('modes') || [];\n        if (!modes.some(m => m.get('id') === modeId)) return;\n\n        this.get('rosterSidePanelService').close();\n        this.set('selectedModeId', modeId);\n\n        this.get('currentMode')?.select();\n\n        if (setPreference) {\n            this.get('preferences').setPreference(LAST_MODE_PREF, modeId, true);\n        }\n    },\n\n    _hasMode(modeId: string): boolean {\n        return ((this.get('modes') as ModeModel[] | null) ?? []).some(mode => mode.get('id') === modeId);\n    }\n});\n","import { next } from '@ember/runloop';\nimport Service from '@ember/service';\nimport { Maybe } from 'web-directory/types';\n\n/**\n * Serializes roster selection changes through an ordered FIFO queue.\n *\n * Each `select()` enqueues a request keyed by the entity id (insertion order is processing order),\n * and the queue is drained one entry at a time, fully awaiting each transition:\n * postSelect (previous) → preSelect → commit `selection` → select. Every queued transition runs in\n * order — there is no superseding, so a committed selection is always given its `postSelect`.\n *\n * The queue is keyed by entity id for O(1) association: re-selecting an id that is still waiting\n * updates its payload and moves it to the back of the queue (the most recent click wins its final\n * position), and every caller waiting on that id resolves together when it is processed.\n *\n * Handler failures are isolated: a handler that throws (e.g. a hold/unhold rejected by the\n * platform or by rate limiting) is caught and swallowed so it can never prevent `selection` from\n * being committed or cleared, nor block the queue from advancing. There is intentionally no retry —\n * a failed side effect is dropped rather than re-hammering the API. Handlers own their own error\n * logging.\n *\n * Handler keys (most → least specific):\n * - `{modeId}.{type}.{id}` — e.g. `active.call.abc-123`\n * - `{modeId}.{type}`       — e.g. `active.call`\n * - `{modeId}`              — e.g. `active`\n */\n\n/** Committed roster selection — mode identity plus the roster item payload at selection time. */\nexport type RosterSelectedItem<T = any> = {\n    modeId: string;\n    id: string;\n    payload: T;\n};\n\nexport type RosterSelectionHandlerName = 'preSelect' | 'select' | 'postSelect';\n\n/**\n * The selection change a handler is participating in. Lets handlers reason about both ends\n * of the transition — e.g. an outgoing call can decide whether to hold based on what is being\n * selected next. `previous` is the committed selection before this transition (the outgoing\n * item); `next` is the incoming target (`null` when the selection is being cleared).\n */\nexport type RosterSelectionTransition = {\n    previous: RosterSelectedItem | null;\n    next: RosterSelectedItem | null;\n};\n\n/**\n * A selection lifecycle handler. The `transition` is always supplied by the service; it is\n * optional in the type so handlers that don't need it can omit the parameter.\n */\nexport type RosterSelectionHandler = (\n    selection: RosterSelectedItem,\n    transition?: RosterSelectionTransition\n) => Promise<void>;\n\nexport type RosterSelectionHandlers = {\n    /** Runs before the selection is committed. */\n    preSelect?: RosterSelectionHandler;\n    /** Runs after the selection is committed. */\n    select?: RosterSelectionHandler;\n    /** Runs after this selection is unselected (superseded or cleared). */\n    postSelect?: RosterSelectionHandler;\n};\n\n/**\n * A queued selection request. Multiple `select()` callers that target the same id before it is\n * processed are coalesced into a single entry; all of their resolvers/rejecters settle together\n * when the entry is processed.\n */\ntype QueuedSelectionRequest = {\n    key: string;\n    selection: RosterSelectedItem | null;\n    resolvers: Array<() => void>;\n    rejecters: Array<(error: unknown) => void>;\n};\n\nexport function createRosterSelectedItem<T extends object = any>(\n    modeId: string,\n    item: T | null\n): RosterSelectedItem<T> | null {\n    if (item == null) return null;\n\n    let id = null;\n    if ('get' in item && typeof item.get === 'function') {\n        id = item.get('id');\n    } else if ('id' in item) {\n        id = item.id;\n    }\n\n    if (id == null) return null;\n    return { modeId, id: String(id), payload: item };\n}\n\nexport function rosterSelectedItemsEqual(\n    curr: RosterSelectedItem | null | undefined,\n    next: RosterSelectedItem | null | undefined\n): boolean {\n    if (!curr || !next) return curr === next;\n    return curr.modeId === next.modeId && curr.id === next.id;\n}\n\n/**\n * Resolves a roster entity type from its payload when available.\n *\n * Workitem interactions are plain objects keyed by a `workitem` property and carry no `type`\n * field, so they are mapped to the synthetic `workitem` type. This lets the active mode register\n * workitem-specific hold/unhold behavior under the `{mode}.workitem` key alongside the\n * conversation `{mode}.{type}` handlers.\n */\nexport function resolveSelectionPayloadType(payload: any): string | null {\n    if (payload == null) return null;\n    if (payload.workitem != null) return 'workitem';\n    const type = typeof payload.get === 'function' ? payload.get('type') : payload.type;\n    if (type == null || type === '') return null;\n    return String(type);\n}\n\n/**\n * Handler lookup keys from most specific to least: `{mode}.{type}.{id}`, `{mode}.{type}`, `{mode}`.\n */\nexport function resolveSelectionHandlerKeys(selection: RosterSelectedItem): string[] {\n    const { modeId, id, payload } = selection;\n    const type = resolveSelectionPayloadType(payload);\n    const keys: string[] = [];\n\n    if (id && type) keys.push(`${modeId}.${type}.${id}`);\n    if (type) keys.push(`${modeId}.${type}`);\n    keys.push(modeId);\n\n    return keys;\n}\n\n/**\n * Returns the most specific registered handler for a selection and hook name.\n */\nexport function resolveSelectionHandler(\n    handlersByKey: Record<string, RosterSelectionHandlers> | null | undefined,\n    selection: RosterSelectedItem,\n    handlerName: RosterSelectionHandlerName\n): RosterSelectionHandler | undefined {\n    if (!handlersByKey) return undefined;\n\n    for (const key of resolveSelectionHandlerKeys(selection)) {\n        const handler = handlersByKey[key]?.[handlerName];\n        if (handler) return handler;\n    }\n\n    return undefined;\n}\n\n/** Sentinel queue key for a clear/`null` selection, which carries no entity id. */\nconst CLEAR_SELECTION_KEY = '\\u0000roster-selection-clear';\n\nexport default Service.extend({\n    /**\n     * Committed roster selection, or `null` when nothing is selected.\n     */\n    selection: null as Maybe<RosterSelectedItem>,\n\n    /**\n     * The modeId of the most recently enqueued (pending or committed) selection.\n     * Set synchronously when `select()` enqueues a request, cleared when the queue fully drains.\n     * This allows `displayedMainStageMode` in `mode-service` to update immediately on roster click\n     * rather than waiting for the async drain, preventing a blank main-stage flash on mode switch.\n     */\n    pendingModeId: null as Maybe<string>,\n\n    _handlersByKey: null as Record<string, RosterSelectionHandlers> | null,\n\n    /**\n     * Pending selection requests keyed by entity id (or {@link CLEAR_SELECTION_KEY} for a clear).\n     * A `Map` preserves insertion order, so iteration order is the processing order.\n     */\n    _queue: null as Map<string, QueuedSelectionRequest> | null,\n\n    _isProcessing: false,\n\n    /** True while a drain is scheduled on the run loop (coalesces same-turn enqueues). */\n    _drainScheduled: false,\n\n    init() {\n        this._super(...arguments);\n        this.set('_handlersByKey', {});\n        this.set('_queue', new Map());\n    },\n\n    /**\n     * Register pre/select/post hooks for a handler key.\n     *\n     * Keys may be a mode id (`active`), mode + type (`active.call`), or mode + type + id\n     * (`active.call.conv-123`). Handlers registered at the same key are merged.\n     */\n    registerHandlers(handlerKey: string, handlers: Partial<RosterSelectionHandlers>) {\n        const existing = this.get('_handlersByKey') ?? {};\n        existing[handlerKey] = { ...existing[handlerKey], ...handlers };\n        this.set('_handlersByKey', existing);\n    },\n\n    /**\n     * Removes all handlers registered for a mode id and its type/id sub-keys\n     * (e.g. `active`, `active.call`, `active.workitem`). Called from mode\n     * `willDestroy` so queued selection work cannot invoke hold/unhold on a\n     * destroyed mode instance.\n     */\n    unregisterHandlersForMode(modeId: string) {\n        const existing = this.get('_handlersByKey') ?? {};\n        const prefix = `${modeId}.`;\n        const updated = { ...existing };\n\n        for (const key of Object.keys(updated)) {\n            if (key === modeId || key.startsWith(prefix)) {\n                delete updated[key];\n            }\n        }\n\n        this.set('_handlersByKey', updated);\n    },\n\n    /**\n     * True when `id` is the committed selection or is queued to become the selection.\n     *\n     * `select()` enqueues synchronously and commits on a later run-loop turn, so a just-answered\n     * interaction can still be mid-flight when its connected event reaches the processing chain.\n     * Intake hold logic consults this to leave the actively-viewed (or just-answered) interaction\n     * unheld instead of racing the selection state machine.\n     *\n     * @param id - The roster item id to test.\n     * @returns True if `id` is the committed selection or has a pending (non-clear) queue entry.\n     */\n    isSelectedOrPendingSelection(id: string | null | undefined): boolean {\n        if (id == null) return false;\n        const key = String(id);\n\n        const selection = this.get('selection') as RosterSelectedItem | null;\n        if (selection && selection.id === key) return true;\n\n        // A queue entry keyed by the id always carries a non-null selection for that id\n        // (clears are stored under CLEAR_SELECTION_KEY), so its presence means a pending select.\n        const queue = this.get('_queue') as Map<string, QueuedSelectionRequest> | null;\n        return !!queue?.get(key);\n    },\n\n    /**\n     * Enqueue a selection change. Returns a Promise that resolves once this request has been\n     * processed (committed, cleared, or found to already be the committed selection). If the same\n     * id is selected again before it is processed, this caller resolves together with that update.\n     * Handler failures are isolated and do not reject this Promise — the selection still transitions.\n     */\n    select(modeId: string, item: any | null): Promise<void> {\n        const selection = createRosterSelectedItem(modeId, item);\n        const key = selection ? selection.id : CLEAR_SELECTION_KEY;\n        const queue = this.get('_queue') as Map<string, QueuedSelectionRequest>;\n\n        return new Promise<void>((resolve, reject) => {\n            const existing = queue.get(key);\n            if (existing) {\n                // Coalesce by id: refresh the payload, attach this caller, and move the entry to\n                // the back so the most recent selection of this id wins its final position.\n                existing.selection = selection;\n                existing.resolvers.push(resolve);\n                existing.rejecters.push(reject);\n                queue.delete(key);\n                queue.set(key, existing);\n            } else {\n                queue.set(key, { key, selection, resolvers: [resolve], rejecters: [reject] });\n            }\n\n            // Update pendingModeId synchronously so displayedMainStageMode can resolve\n            // immediately (before the async drain commits selection), preventing a blank\n            // main-stage flash on mode switch.\n            if (selection) {\n                this.set('pendingModeId', selection.modeId);\n            }\n\n            this._scheduleDrain();\n        });\n    },\n\n    /**\n     * Coalesce same-turn enqueues onto a single scheduled drain; the drain then processes the\n     * whole queue in insertion order.\n     */\n    _scheduleDrain() {\n        if (this._drainScheduled) return;\n        this._drainScheduled = true;\n\n        next(this, () => {\n            this._drainScheduled = false;\n            this._drainQueue();\n        });\n    },\n\n    /**\n     * Process queued requests in insertion order, one at a time. Requests enqueued while one is in\n     * flight are picked up by the same loop, preserving order without re-entrancy.\n     */\n    async _drainQueue() {\n        if (this._isProcessing) return;\n        const queue = this.get('_queue') as Map<string, QueuedSelectionRequest>;\n\n        this._isProcessing = true;\n        try {\n            while (queue.size > 0) {\n                const first = queue.keys().next();\n                if (first.done) break;\n                const key = first.value;\n                const request = queue.get(key);\n                queue.delete(key);\n                if (!request) continue;\n\n                try {\n                    await this._processRequest(request);\n                    request.resolvers.forEach(resolve => resolve());\n                } catch (error) {\n                    request.rejecters.forEach(reject => reject(error));\n                }\n            }\n        } finally {\n            this._isProcessing = false;\n            // If nothing is selected after draining, clear pendingModeId so the main stage\n            // correctly empties (e.g. after wrapup completes and the interaction leaves the roster).\n            if (!this.get('selection')) {\n                this.set('pendingModeId', null);\n            }\n        }\n    },\n\n    /**\n     * Run the selection state machine for one request: tear down the outgoing committed selection,\n     * then prepare, commit, and notify the incoming one. With FIFO processing there is no\n     * supersession, so every committed selection is guaranteed its `postSelect`.\n     *\n     * Handler steps run through `_runHandler`, which never throws, so `selection` is always cleared\n     * and re-committed even when a `postSelect`/`preSelect`/`select` side effect fails.\n     */\n    async _processRequest(request: QueuedSelectionRequest) {\n        if (this.get('isDestroyed') || this.get('isDestroying')) return;\n\n        const currentSelection = this.get('selection') as RosterSelectedItem | null;\n        const targetSelection = request.selection;\n\n        // Same item already selected — nothing to tear down or set up.\n        if (rosterSelectedItemsEqual(currentSelection, targetSelection)) return;\n\n        // The transition both halves of the pipeline see, so handlers can reason about the\n        // outgoing and incoming selections together (e.g. an outgoing call deciding whether\n        // to hold based on what is being selected next).\n        const transition: RosterSelectionTransition = { previous: currentSelection, next: targetSelection };\n\n        // 1. Tear down the outgoing selection. `selection` is cleared only after `postSelect`\n        //    resolves so a re-entrant drain cannot tear it down twice.\n        if (currentSelection) {\n            await this._runHandler('postSelect', currentSelection, transition);\n            this.set('selection', null);\n        }\n\n        // Clear-only request — teardown above is the full operation.\n        if (!targetSelection) return;\n\n        // 2. Prepare, commit, then notify.\n        await this._runHandler('preSelect', targetSelection, transition);\n        this.set('selection', targetSelection);\n        await this._runHandler('select', targetSelection, transition);\n    },\n\n    /**\n     * Resolve and run a single handler step. A handler failure is caught and swallowed here, never\n     * rethrown, so a rejected side effect (e.g. a hold/unhold blocked by rate limiting) can never\n     * stop the selection state machine from committing or clearing `selection`. There is no retry —\n     * the failed side effect is simply dropped. Handlers are responsible for their own error logging.\n     */\n    async _runHandler(\n        handlerName: RosterSelectionHandlerName,\n        selection: RosterSelectedItem,\n        transition: RosterSelectionTransition\n    ) {\n        const handler = resolveSelectionHandler(this.get('_handlersByKey'), selection, handlerName);\n        if (!handler) return;\n        if (this.get('isDestroyed') || this.get('isDestroying')) return;\n\n        try {\n            await handler(selection, transition);\n        } catch {\n            // Intentionally swallowed — selection/unselection must proceed regardless of failure.\n        }\n    }\n});\n","import { set } from '@ember/object';\nimport Service from '@ember/service';\nimport { Maybe } from 'web-directory/types';\n\nexport type ModeManagerRosterSidePanelOpenOptions = {\n    /**\n     * Ember component layout name (e.g. `mode-manager/roster-side-panels/outbound-panel`).\n     */\n    componentName: string;\n    /** Passed through to the dynamic panel as `context`. */\n    context?: unknown;\n    /**\n     * Identity for toggle(): when the panel is already open with the same key, it closes.\n     * Defaults to `componentName` when omitted.\n     */\n    panelKey?: string;\n};\n\n/**\n * Owns roster side-panel visibility and which component is rendered inside\n * `mode-manager/mode-roster-side-panel`. Mode instances may inject this service when\n * created via `mode-manager/modes` using `owner.ownerInjection()`.\n */\nexport default Service.extend({\n    isOpen: false,\n\n    panelComponentName: null as Maybe<string>,\n\n    panelContext: null as Maybe<unknown>,\n\n    _activePanelKey: null as Maybe<string>,\n\n    open(options: ModeManagerRosterSidePanelOpenOptions) {\n        const panelKey = options.panelKey ?? options.componentName;\n        set(this, 'panelComponentName', options.componentName);\n        set(this, 'panelContext', options.context === undefined ? null : options.context);\n        set(this, '_activePanelKey', panelKey);\n        set(this, 'isOpen', true);\n    },\n\n    toggle(options: ModeManagerRosterSidePanelOpenOptions) {\n        const panelKey = options.panelKey ?? options.componentName;\n        if (this.get('isOpen') && this.get('_activePanelKey') === panelKey) {\n            this.close();\n        } else {\n            this.open({ ...options, panelKey });\n        }\n    },\n\n    close() {\n        set(this, 'isOpen', false);\n        set(this, 'panelComponentName', null);\n        set(this, 'panelContext', null);\n        set(this, '_activePanelKey', null);\n    },\n\n    closeSpecificSidePanel(panelKey: string) {\n        if (this.get('isOpen') && this.get('_activePanelKey') === panelKey) {\n            this.close();\n        }\n    }\n});\n","import { getOwner } from '@ember/application';\nimport { get, set } from '@ember/object';\nimport CallInteraction from 'web-directory/models/interaction/call-interaction';\nimport Interaction from 'web-directory/models/interaction/interaction';\nimport ConversationModel from 'web-directory/models/conversation-legacy';\nimport { isScreenMonitoringParticipant, setInteractionModelMetadata } from 'web-directory/utils/acd';\nimport { getQueueMediaSettings } from 'web-directory/utils/acd-ts';\nimport { addPageAction } from 'web-directory/utils/newrelic';\n\nimport type { StepDependencies, EventSource, CallChainContext } from '../../conversation-mode-service';\n\nfunction createConversationModel(payload: object, ownerInjection: object): { destroy(): void; [key: string]: any } {\n    return ConversationModel.create(Object.assign({}, payload, ownerInjection));\n}\n\n/**\n * Creates an Ember-owned interaction model (CallInteraction or Interaction) that wraps a\n * ConversationModel — the UI/presentation layer. Copies conversation properties onto the model and\n * sets `model.conversation` to the backing ConversationModel.\n */\nfunction createInteractionFromConversation(ModelClass: any, conversationModel: any, ownerInjection: object) {\n    const model = ModelClass.create(ownerInjection);\n\n    Object.keys(conversationModel).forEach((key: string) => {\n        model.set(key, conversationModel[key]);\n    });\n\n    model.set('conversation', conversationModel);\n    return model;\n}\n\n/**\n * Extracts the current call state from an existing CallInteraction's inner\n * ConversationModel. Finds the current user's participant and reads the first\n * call communication's state. Mirrors legacy phone.js `_getCallState`.\n */\nfunction getCallState(interactionModel: any, userId: string): string | null {\n    const conversation = get(interactionModel, 'conversation');\n    if (!conversation) return null;\n\n    const participants: any[] = get(conversation, 'participants') || [];\n    const participant = [...participants].reverse().find((p: any) => p.userId === userId);\n    if (!participant) return null;\n\n    const participantCall = participant.calls && participant.calls.length ? participant.calls[0] : null;\n    return participantCall?.state ? participantCall.state.toLowerCase() : null;\n}\n\n/**\n * Call-specific step factory: filters incoming call payloads and creates or\n * retrieves the CallInteraction (backed by a ConversationModel). Rejects\n * callbacks, fax calls, non-agent (non-ACD) calls, and calls where the current\n * user is only a screen-monitoring participant. Determines call state metadata\n * (isAgentCall, isActiveOnCall, shouldUpdate, currentCallState, newCallState).\n *\n * For new interactions, creates a ConversationModel then wraps it in a\n * CallInteraction with `conversation` set — mirroring the legacy phone.js +\n * acdcall.js two-layer model pattern, consolidated into a single step.\n *\n * Mirrors legacy phone.js \"Filtering and Context Acquisition\" step +\n * acdcall.js `_updateInteractionModels` model creation.\n */\nexport function callFilterAndCreate(deps: StepDependencies): { label: string; process: (ctx: any) => any } {\n    return {\n        label: 'callFilterAndCreate',\n        process({ eventSource, payload }: { eventSource: EventSource; payload: any }) {\n            if (!payload || !payload.id) {\n                return false;\n            }\n\n            const { mode, conversationModeService, sessionService, triggerAutoAnswer, phoneService } = deps;\n\n            // Use the mixin's type detection to reject non-call payloads\n            const interactionType = conversationModeService.getInteractionTypeFromCP(payload);\n            if (\n                !interactionType.isCall ||\n                (interactionType.isCall && interactionType.isCallback) ||\n                interactionType.isFax\n            ) {\n                return false;\n            }\n\n            const userId: string = get(sessionService.get('person'), 'guid');\n            const participants = get(payload, 'participants') || [];\n            const isAgentCall = participants.some((party: any) => party.purpose && party.purpose === 'agent');\n\n            // Non-ACD calls (UC/communicate calls, etc.) have no agent participant. They are\n            // owned exclusively by the phone service's (ungated) processing chain and must never\n            // enter the Modes roster. Mirrors legacy acdcall._updateInteractionModels, which only\n            // created/retained CallInteractions when isAgentCall was true.\n            if (!isAgentCall) {\n                return false;\n            }\n\n            // Find the current user's participant (last match, matching phone.js behavior),\n            // excluding screen-monitoring participants. A supervisor only screen-monitoring an\n            // agent call has no non-monitoring participant of their own, so the call is halted\n            // and never enters the roster. Mirrors legacy phone.js participant selection.\n            const userParticipants = participants.filter(\n                (p: any) => p.userId === userId && !isScreenMonitoringParticipant(p)\n            );\n            const participant = userParticipants[userParticipants.length - 1];\n\n            if (!participant) {\n                return false;\n            }\n\n            // Get the participant's call communication\n            const participantCall = participant.calls && participant.calls.length ? participant.calls[0] : null;\n\n            if (!participantCall) {\n                return false;\n            }\n\n            const participantOnCall = participantCall\n                ? ['alerting', 'contacting', 'dialing', 'connected'].includes(participantCall.state.toLowerCase())\n                : false;\n            const participantIsNotVoicemail = (participant.purpose || '').toLowerCase() !== 'voicemail';\n            const isActiveOnCall = participantCall && participantOnCall && participantIsNotVoicemail;\n            const newCallState = participantCall.state.toLowerCase();\n\n            // Check for existing model in the mode's roster\n            const existing = mode.get('allItems').get(payload.id);\n            const newInteraction = !existing;\n            let interactionModel = existing;\n\n            // Extract current call state from the existing model before payload merge.\n            // Mirrors legacy phone.js _getCallState.\n            const currentCallState: string | null = existing ? getCallState(existing, userId) : null;\n\n            const onCall = interactionModel ? get(interactionModel, 'onCall') : false;\n            const shouldUpdate = isAgentCall || isActiveOnCall || onCall || newCallState === 'terminated';\n\n            if (newInteraction) {\n                const ownerInjection = getOwner(mode).ownerInjection();\n\n                // Create a candidate ConversationModel (data layer) — mirrors phone.js\n                // ownerInjection() must be the first arg in Ember 3.28\n                let conversationModel = createConversationModel(payload, ownerInjection);\n                set(conversationModel, 'type', 'call');\n\n                const tempInteraction = createInteractionFromConversation(\n                    Interaction,\n                    conversationModel,\n                    ownerInjection\n                );\n                const isActive = get(tempInteraction, 'isInteractionActive');\n                tempInteraction.destroy();\n\n                if (!isActive) {\n                    conversationModel.destroy();\n                    return false;\n                }\n\n                // Resolve the single shared ConversationModel for this call id. Phone owns the\n                // `phone.conversations` registry (and WebRTC binds to those instances), so the\n                // Modes implementation must wrap that same instance. `addOrGetConversation` registers our\n                // candidate if phone hasn't created one yet, or returns phone's existing\n                // instance (in which case we discard our duplicate candidate).\n                const canonical = phoneService.addOrGetConversation(conversationModel);\n                if (canonical !== conversationModel) {\n                    conversationModel.destroy();\n                    conversationModel = canonical;\n                }\n\n                // Auto-answer trigger for new connected calls\n                if (get(conversationModel, 'callState.initialState') === 'connected') {\n                    triggerAutoAnswer(conversationModel, 'call');\n                }\n\n                // Create CallInteraction wrapping the shared ConversationModel — mirrors phone.js\n                interactionModel = createInteractionFromConversation(\n                    CallInteraction,\n                    conversationModel,\n                    ownerInjection\n                );\n\n                // Mirrors legacy interaction component calling fetchCommunicationBasedACWSetting()\n                // on each new interaction. The cache in conversation-mode-service prevents redundant\n                // API calls for interactions arriving within the 10-minute cache window.\n                deps.conversationModeService.fetchCommunicationBasedACWSetting();\n            }\n\n            const prevRaw = newInteraction ? null : interactionModel.get('__interaction_metadata__');\n\n            return {\n                eventSource,\n                payload,\n                prevRaw,\n                newInteraction,\n                interactionModel,\n                isAgentCall,\n                isActiveOnCall,\n                shouldUpdate,\n                currentCallState,\n                newCallState,\n                participantIsNotVoicemail\n            } as CallChainContext;\n        }\n    };\n}\n\n/**\n * Call-specific step factory: registers external contact change listeners using\n * the buildModel factory pattern. Creates temporary ConversationModel and\n * CallInteraction instances for listener registration, then destroys them.\n *\n * Mirrors legacy phone.js \"Listen for changes on External Contacts\" step.\n */\nexport function callExternalContactListeners(deps: StepDependencies): { label: string; process: (ctx: any) => any } {\n    return {\n        label: 'callExternalContactListeners',\n        async process(ctx: any) {\n            const { mode, loggerService, externalContactsService, customerIntentService, contactObservers } = deps;\n            const modelsToDestroy: any[] = [];\n\n            // Factory that creates temporary models for external contact listener registration\n            const buildModel = (rawData: any) => {\n                const ownerInjection = getOwner(mode).ownerInjection();\n                const conversationModel = createConversationModel(rawData, ownerInjection);\n                set(conversationModel, 'type', 'call');\n                modelsToDestroy.push(conversationModel);\n\n                return createInteractionFromConversation(CallInteraction, conversationModel, ownerInjection);\n            };\n\n            const { id } = ctx.payload;\n            if (!contactObservers[id]) {\n                contactObservers[id] = function () {};\n            }\n            const observer = contactObservers[id];\n\n            try {\n                await externalContactsService.addContactChangeListenersForInteraction(\n                    buildModel,\n                    ctx.payload,\n                    ctx.prevRaw,\n                    observer\n                );\n            } catch (e) {\n                loggerService.error(\n                    'ConversationModeService: failed to add external contact change listeners on call',\n                    {\n                        e,\n                        remoteData: { interactionId: id }\n                    }\n                );\n                externalContactsService.removeContactChangeListenersForInteraction(ctx.interactionModel, observer);\n                contactObservers[id] = undefined as any;\n            }\n\n            try {\n                await customerIntentService.addCustomerIntentListenerForInteraction(\n                    buildModel,\n                    ctx.payload,\n                    ctx.interactionModel\n                );\n            } catch (e) {\n                loggerService.error('ConversationModeService: failed to add customer intent listener on call', {\n                    e,\n                    remoteData: { interactionId: id }\n                });\n                customerIntentService.removeCustomerIntentListenerForInteraction(ctx.interactionModel);\n            }\n\n            // Clean up temporary models\n            modelsToDestroy.forEach(m => m.destroy());\n        }\n    };\n}\n\n/**\n * Call-specific step factory: checks for missed timed wrapup timers on existing\n * call interactions. Creates a temporary ConversationModel with `type: 'call'`\n * for the timer check, matching the phone service's approach.\n *\n * Mirrors legacy phone.js \"Timedboxed Wrapup Missed Timer\" step.\n */\nexport function callTimedWrapup(deps: StepDependencies): { label: string; process: (ctx: any) => any } {\n    return {\n        label: 'callTimedWrapup',\n        process(ctx: any) {\n            if (!ctx.newInteraction) {\n                const { mode, conversationModeService, loggerService } = deps;\n\n                try {\n                    // Use the existing model's inner ConversationModel for the timer check,\n                    // or create a temporary one if needed. The handleMissedTimedBoxTimer\n                    // method expects a ConversationModel as the last argument.\n                    const existingConversation = get(ctx.interactionModel, 'conversation');\n                    let conversationModel = existingConversation;\n                    let shouldDestroy = false;\n\n                    if (!conversationModel) {\n                        conversationModel = createConversationModel(ctx.payload, getOwner(mode).ownerInjection());\n                        set(conversationModel, 'type', 'call');\n                        shouldDestroy = true;\n                    }\n\n                    conversationModeService.handleMissedTimedBoxTimer(\n                        conversationModeService,\n                        ctx.payload,\n                        CallInteraction,\n                        conversationModel\n                    );\n\n                    if (shouldDestroy) {\n                        conversationModel.destroy();\n                    }\n                } catch (e) {\n                    loggerService.error('ConversationModeService: callTimedWrapup failed', {\n                        e,\n                        remoteData: { interactionId: ctx.payload?.id }\n                    });\n                }\n            }\n        }\n    };\n}\n\n/**\n * Call-specific step factory: updates the CallInteraction and its inner\n * ConversationModel with the latest payload, guarded by `shouldUpdate`.\n * Sets `acceptedByClient` to false on alerting transitions and retains\n * `consultParticipantId` across state changes. Syncs the ConversationModel\n * into `phone.conversations` for WebRTC binding and call controls compatibility.\n *\n * Mirrors legacy phone.js \"Update State Step\" + acdcall.js model sync.\n */\nexport function callUpdateState(deps: StepDependencies): { label: string; process: (ctx: any) => any } {\n    return {\n        label: 'callUpdateState',\n        process(ctx: any) {\n            const {\n                payload,\n                isAgentCall,\n                currentCallState,\n                interactionModel,\n                newCallState,\n                newInteraction,\n                shouldUpdate\n            } = ctx;\n\n            const { phoneService } = deps;\n            const conversationModel = get(interactionModel, 'conversation');\n\n            if (shouldUpdate) {\n                if (!newInteraction) {\n                    // Sync both layers — mirrors legacy phone.js setProperties on ConversationModel\n                    // + acdcall.js setProperties on CallInteraction\n                    if (conversationModel) {\n                        conversationModel.setProperties(payload);\n                        conversationModel.notifyPropertyChange('participants');\n                    }\n                    interactionModel.setProperties(payload);\n                    // setProperties is a no-op when the payload reuses the same participants\n                    // array; consult flags (onConsult, consultAgentParticipant) depend on nested\n                    // fields and must recompute immediately so the consult bar can appear.\n                    interactionModel.notifyPropertyChange('participants');\n                    interactionModel.notifyPropertyChange('onConsult');\n                }\n\n                // Set metadata on both the ConversationModel and the CallInteraction.\n                // - ConversationModel: phone.js cleanup reads __interaction_metadata__ from it.\n                // - CallInteraction: interapptions reads __interaction_metadata__ from from it.\n                if (conversationModel) {\n                    setInteractionModelMetadata(conversationModel, payload);\n                }\n                setInteractionModelMetadata(interactionModel, payload);\n\n                // Set acceptedByClient to false when transitioning to alerting\n                if (isAgentCall && currentCallState !== 'connected' && newCallState === 'alerting') {\n                    set(interactionModel, 'acceptedByClient', false);\n                }\n            }\n\n            // Retain consultParticipantId across state changes (SERVOPS-11175)\n            const participants = get(interactionModel, 'participants') || [];\n            const customerParticipants = participants.filter((p: any) => get(p, 'purpose') === 'customer');\n            const consultIds = customerParticipants.map((p: any) => get(p, 'consultParticipantId')).filter(Boolean);\n            const consultParticipantId = consultIds[consultIds.length - 1];\n\n            if (consultParticipantId) {\n                set(interactionModel, 'consultParticipantId', consultParticipantId);\n            }\n\n            // --- Notify phone.conversations consumers (WebRTC binding, call controls) ---\n            // The canonical ConversationModel is already registered in phone.conversations by\n            // callFilterAndCreate (via phone.addOrGetConversation), so we must NOT push again here —\n            // doing so previously created a second instance for the same id. We still notify phone\n            // so its WebRTC/call-control consumers react to the update.\n            if (shouldUpdate) {\n                phoneService.trigger(`conversations.${get(interactionModel, 'id')}`);\n            }\n\n            if (shouldUpdate || newCallState === 'terminated') {\n                phoneService.notifyPropertyChange('conversations');\n                phoneService.notifyPropertyChange('recentDisconnectedAgentCalls');\n            }\n        }\n    };\n}\n\nconst DEFAULT_ALERT_TIMEOUT_MS = 30000;\nconst MILLIS_IN_SECS = 1000;\n\n/**\n * Call-specific step: plays/stops the voice ringtone based on alerting state\n * transitions (ACE-5496).\n *\n * - New call entering `alerting` (not auto-answer): starts the ringtone\n * - Existing call transitioning FROM `alerting` to another state: stops the ringtone\n *\n * Auto-answer detection uses the same `transferSource`-based logic as the alerting\n * toast (`_isAutoAnswerCall`), ensuring consistent behavior between sound and UI.\n *\n * Runs after `callUpdateState` so the model is fully synced before we read\n * queue media settings for the ring timeout.\n */\nexport function callAlertingRingtone(deps: StepDependencies): { label: string; process: (ctx: any) => any } {\n    return {\n        label: 'callAlertingRingtone',\n        process(ctx: any) {\n            const { newCallState, currentCallState, interactionModel, newInteraction } = ctx as CallChainContext;\n            const { conversationModeService, sessionService, ringService, phoneService } = deps;\n\n            // Transition away from alerting → stop the voice ringtone\n            if (currentCallState === 'alerting' && newCallState !== 'alerting') {\n                ringService.stopRingtone();\n                return;\n            }\n\n            // Only start ringing on a fresh alerting state\n            if (newCallState !== 'alerting') return;\n            if (!newInteraction && currentCallState === 'alerting') return; // already ringing\n\n            // Auto-answer calls should not ring — use the same transferSource-based\n            // detection as the alerting toast (ACE-5483 parity).\n            if (conversationModeService._isAutoAnswerCall(interactionModel)) return;\n\n            // Determine ring timeout mirroring alerting-manager.getAlertRingTimeout for voice\n            const ftAcdRingTimeout: boolean = !!sessionService.get('features')?.['assignment.audioAlertDuration'];\n            const conversationId = get(interactionModel, 'id');\n\n            let alertTimeout: number = DEFAULT_ALERT_TIMEOUT_MS;\n\n            if (ftAcdRingTimeout) {\n                const queueMediaSettings = getQueueMediaSettings(interactionModel);\n                const manualRingTime = queueMediaSettings?.manualAnswerAlertToneSeconds;\n\n                addPageAction('voiceRingtoneAlertingEvent', {\n                    autoAnswer: false,\n                    conversationId,\n                    alertTimout: manualRingTime != null ? manualRingTime * MILLIS_IN_SECS : alertTimeout\n                });\n\n                if (manualRingTime != null && manualRingTime >= 0) {\n                    alertTimeout = manualRingTime * MILLIS_IN_SECS;\n                }\n\n                // Ring time explicitly 0 → silent\n                if (alertTimeout === 0) return;\n            } else {\n                addPageAction('voiceRingtoneAlertingEvent', {\n                    autoAnswer: false,\n                    conversationId\n                });\n\n                // Fallback: agent's alertingTimeoutMs\n                const agentAlertTimeout = get(interactionModel, 'conversation.myself.alertingTimeoutMs');\n                if (agentAlertTimeout) {\n                    alertTimeout = agentAlertTimeout;\n                }\n            }\n\n            // hasOtherActiveCalls affects ringer volume level\n            const hasOtherActiveCalls = !!phoneService.get('isOnConnectedCall');\n\n            ringService.playRingtone(conversationId, hasOtherActiveCalls, alertTimeout);\n        }\n    };\n}\n","import { getOwner } from '@ember/application';\nimport { get } from '@ember/object';\nimport ConversationModel from 'web-directory/models/conversation-legacy';\nimport CallInteraction from 'web-directory/models/interaction/call-interaction';\nimport CallbackInteraction from 'web-directory/models/interaction/callback-interaction';\nimport { setInteractionModelMetadata } from 'web-directory/utils/acd';\nimport { cleanupAfterWrapupGadgetSubmit } from 'web-directory/utils/acw-wrapup-gadget-cleanup';\nimport { cleanupScheduleCallbackGadgetSessionStorage } from 'web-directory/utils/schedule-callback-gadget';\n\nimport type { CallbackChainContext, EventSource, StepDependencies } from '../../conversation-mode-service';\n\n/** Wrapup codes that indicate a blocked outbound call attempt. */\nconst CALL_BLOCKED_CODES = [\n    'ININ-OUTBOUND-AUTOMATIC-TIME-ZONE-BLOCKED-SKIPPED',\n    'ININ-OUTBOUND-CONTACT-ATTEMPT-LIMIT-SKIPPED',\n    'ININ-OUTBOUND-NUMBER-ATTEMPT-LIMIT-SKIPPED',\n    'ININ-OUTBOUND-CONTACT-UNCALLABLE-SKIPPED',\n    'ININ-OUTBOUND-DNC-SKIPPED',\n    'ININ-OUTBOUND-ZONE-BLOCKED-SKIPPED',\n    'ININ-OUTBOUND-NO-CALLABLE-NUMBERS-SKIPPED',\n    'ININ-OUTBOUND-NUMBER-UNCALLABLE-SKIPPED',\n    'ININ-OUTBOUND-NUMBERS-INVALID',\n    'ININ-OUTBOUND-RULE-SKIPPED'\n];\n\n/** Wrapup codes that indicate an error during outbound call attempt. */\nconst CALL_ERROR_CODES = ['ININ-OUTBOUND-RULE-ERROR-SKIPPED', 'ININ-OUTBOUND-INTERNAL-ERROR-SKIPPED'];\n\n/** All blocked + error codes combined for quick lookup. */\nconst ALL_BLOCKED_ERROR_CODES = [...CALL_BLOCKED_CODES, ...CALL_ERROR_CODES];\n\n/**\n * Returns true if the callback requires wrapup — i.e. wrapup is required\n * but has not been submitted or skipped yet.\n */\nfunction callbackRequiresWrapup(callback: any): boolean {\n    const wrapupRequired = get(callback, 'participantForCurrentUser.wrapupRequired');\n    const hasWrapup = get(callback, 'participantForCurrentUser.wrapup');\n    const wrapupSkipped = get(callback, 'participantForCurrentUser.wrapupSkipped');\n    return wrapupRequired && !(hasWrapup || wrapupSkipped);\n}\n\n/**\n * Returns true if the callback has an active callback communication or\n * a disconnected callback that still needs wrapup.\n */\nfunction isCallbackActive(callback: any): boolean {\n    const hasActiveCallback = get(callback, 'hasActiveCallback');\n    const hasCallbackThatNeedsWrapup = callbackRequiresWrapup(callback);\n    return hasActiveCallback || hasCallbackThatNeedsWrapup;\n}\n\n/**\n * Returns true if the call model associated with a callback still requires\n * wrapup — i.e. there is an ongoing call or the most recent call has not\n * been wrapped up yet.\n *\n * Mirrors legacy acdcallback.callbacksRequiringCallWrapUp computed logic.\n */\nfunction callRequiresWrapUp(call: any, callback: any): boolean {\n    if (!call) return false;\n\n    const participantCalls = get(call, 'participantForCurrentUser.calls');\n    if (!participantCalls || !participantCalls.length) return false;\n\n    // If we find a call without a `disconnectedTime` then it must be ongoing\n    // and therefore we should display as a call\n    const ongoingCall = participantCalls.find((c: any) => !c.disconnectedTime);\n    if (ongoingCall) return true;\n\n    // Find the most recently disconnected call\n    const disconnectedCalls = participantCalls.filter((c: any) => c.disconnectedTime);\n    if (!disconnectedCalls.length) return false;\n\n    const mostRecentCall = disconnectedCalls.sort(\n        (a: any, b: any) => new Date(a.disconnectedTime).getTime() - new Date(b.disconnectedTime).getTime()\n    )[disconnectedCalls.length - 1];\n\n    // Check if wrapup has been applied for the most recent call\n    const wrapupEndTime = get(call, 'participantForCurrentUser.wrapup.endTime');\n    let hasWrappedUpMostRecentCall =\n        wrapupEndTime && new Date(wrapupEndTime).getTime() > new Date(mostRecentCall.disconnectedTime).getTime();\n\n    // If aftercallWork.state exist then assume communication level wrapup and grab state here\n    // instead of looking at timestamps.\n    if (call && call.get('useCommunicationACW') && mostRecentCall.afterCallWork?.state) {\n        hasWrappedUpMostRecentCall = mostRecentCall.afterCallWork.state === 'complete';\n    }\n\n    // Check agent-requested ACW — read from callback model, matching legacy\n    // UI and conversation service toggles: pure-3213 & pure-2752\n    // Is queue configured for ACW requested wrapup_prompt\n    const isAgentRequestedACWFeatureOn = get(callback, 'canAgentRequestACW');\n    const hasAgentCompletedOrSkippedACW =\n        mostRecentCall.afterCallWork?.state === 'complete' || mostRecentCall.afterCallWork?.state === 'skipped';\n\n    const wrapupHandled = hasWrappedUpMostRecentCall || (isAgentRequestedACWFeatureOn && hasAgentCompletedOrSkippedACW);\n\n    return !wrapupHandled;\n}\n\n/**\n * Callback-specific step factory: creates both CallbackInteraction and CallInteraction\n * models from the payload, sharing a single Conversation model. For existing interactions,\n * retrieves the existing model pair. Replaces the shared `findOrCreateInteraction` for\n * the callback chain.\n *\n * Mirrors legacy acdcallback.js \"Filtering / Context Acquisition\" step.\n */\nexport function callbackDualModelCreate(deps: StepDependencies): { label: string; process: (ctx: any) => any } {\n    return {\n        label: 'callbackDualModelCreate',\n        process({ eventSource, payload }: { eventSource: EventSource; payload: any }) {\n            if (!payload || !payload.id) {\n                return false;\n            }\n\n            const { mode, conversationModeService } = deps;\n\n            // const userId: string = Ember.get(sessionService.get('person'), 'guid');\n            const interactionType = conversationModeService.getInteractionTypeFromCP(payload);\n            if (!interactionType.isCallback) {\n                return false;\n            }\n\n            // Check for existing callback model in the mode's roster\n            const existing = mode.get('allItems').get(payload.id);\n            const newInteraction = !existing;\n\n            let call: any;\n            let callback: any;\n\n            if (newInteraction) {\n                const ownerInjection = getOwner(mode).ownerInjection();\n                // Deep clone without lodash — JSON round-trip for plain payload objects\n                const payloadCopy = JSON.parse(JSON.stringify(payload));\n\n                callback = CallbackInteraction.create(Object.assign(payloadCopy, ownerInjection));\n                const conversation = ConversationModel.create(\n                    Object.assign(JSON.parse(JSON.stringify(payload)), ownerInjection)\n                );\n                callback.set('conversation', conversation);\n\n                call = CallInteraction.create(Object.assign(JSON.parse(JSON.stringify(payload)), ownerInjection));\n                call.set('dialerPreview', callback.get('dialerPreview'));\n                call.set('conversation', callback.get('conversation'));\n\n                // If callback is not active, destroy both models and halt\n                if (!isCallbackActive(callback)) {\n                    call.destroy();\n                    callback.destroy();\n                    return false;\n                }\n\n                // Mirrors legacy interaction component calling fetchCommunicationBasedACWSetting()\n                // on each new interaction. The cache in conversation-mode-service prevents redundant\n                // API calls for interactions arriving within the 10-minute cache window.\n                deps.conversationModeService.fetchCommunicationBasedACWSetting();\n            } else {\n                // Existing interaction — retrieve the stored call/callback pair from the tracking map\n                const models = conversationModeService.get('_callbackModels') as Map<\n                    string,\n                    { interactionId: string; call: any; callback: any }\n                >;\n                const tracked = models?.get(payload.id);\n                if (tracked) {\n                    callback = tracked.callback;\n                    call = tracked.call;\n                } else {\n                    // Fallback: model exists in roster but not in tracking map (e.g. after a reload\n                    // where the roster was populated but the map wasn't). Use the roster model as\n                    // callback and create a fresh call model.\n                    callback = existing;\n                    const ownerInjection = getOwner(mode).ownerInjection();\n                    call = CallInteraction.create(Object.assign(JSON.parse(JSON.stringify(payload)), ownerInjection));\n                    call.set('conversation', callback.get('conversation'));\n                }\n            }\n\n            return {\n                eventSource,\n                payload,\n                prevRaw: newInteraction ? null : callback.get('__interaction_metadata__'),\n                newInteraction,\n                interactionModel: callback,\n                call,\n                callback\n            } as CallbackChainContext;\n        }\n    };\n}\n\n/**\n * Callback-specific step factory: updates both call and callback models with\n * the latest payload data and metadata. For existing interactions, merges new\n * properties into both models and their shared conversation.\n *\n * Mirrors legacy acdcallback.js \"Update Call/Callback Models\" step.\n */\nexport function updateCallbackModels(_: StepDependencies): { label: string; process: (ctx: any) => any } {\n    return {\n        label: 'updateCallbackModels',\n        process(ctx: any) {\n            const { payload, newInteraction, call, callback } = ctx;\n\n            if (!newInteraction) {\n                // Deep clone payload for each model update without lodash\n                const payloadCopy = JSON.parse(JSON.stringify(payload));\n                callback.setProperties(payloadCopy);\n                callback.get('conversation').setProperties(JSON.parse(JSON.stringify(payload)));\n                call.setProperties(JSON.parse(JSON.stringify(payload)));\n                call.get('conversation').setProperties(JSON.parse(JSON.stringify(payload)));\n            }\n\n            callback.set('isPlacingCall', false);\n            setInteractionModelMetadata(callback, payload);\n            setInteractionModelMetadata(call, payload);\n        }\n    };\n}\n\n/**\n * Callback-specific step factory: displays a notification when an outbound call\n * attempt is blocked or errors out. Deduplicates notifications by tracking\n * previously shown combinations of interaction ID, wrapup code, and end time.\n *\n * Mirrors legacy acdcallback.js \"Handle Blocked Call Notification\" step.\n */\nexport function callbackBlockedCallNotification(deps: StepDependencies): {\n    label: string;\n    process: (ctx: any) => any;\n} {\n    return {\n        label: 'callbackBlockedCallNotification',\n        process(ctx: any) {\n            const { conversationModeService } = deps;\n            const { payload, callback } = ctx;\n\n            if (!get(callback, 'hasActiveCallback')) {\n                return;\n            }\n\n            const wrapup = get(callback, 'participantForCurrentUser.wrapup');\n            if (!wrapup) {\n                return;\n            }\n\n            const isBlockedOrError = ALL_BLOCKED_ERROR_CODES.includes(wrapup.code);\n            if (!isBlockedOrError) {\n                return;\n            }\n\n            // safe: _blockedCalls is initialized in initialize()\n            const blockedCalls = conversationModeService.get('_blockedCalls') as Array<{\n                interactionId: string;\n                wrapup: { code: string; endTime: string };\n            }>;\n\n            const alreadyShown = blockedCalls.some(\n                (entry: { interactionId: string; wrapup: { code: string; endTime: string } }) =>\n                    entry.interactionId === payload.id &&\n                    entry.wrapup.code === wrapup.code &&\n                    entry.wrapup.endTime === wrapup.endTime\n            );\n\n            if (alreadyShown) {\n                return;\n            }\n\n            const isBlockedCode = CALL_BLOCKED_CODES.includes(wrapup.code);\n            if (isBlockedCode) {\n                conversationModeService._displayNotification(\n                    'purecloud.acdInteraction.callbacks.errors.blocked.title',\n                    'purecloud.acdInteraction.callbacks.errors.blocked.' + wrapup.code\n                );\n            } else {\n                conversationModeService._displayError(\n                    'purecloud.acdInteraction.callbacks.errors.blocked.title',\n                    'purecloud.acdInteraction.callbacks.errors.blocked.' + wrapup.code\n                );\n            }\n\n            blockedCalls.push({ interactionId: payload.id, wrapup });\n        }\n    };\n}\n\n/**\n * Callback-specific step factory: fetches and subscribes to customer intent for\n * both the callback and call models. Both must be registered because the roster\n * can display either model depending on call wrapup state (see\n * `callbackUpdateModelsList`). Runs after `externalContactInfo` so Relate\n * enrichment is applied before intent resolution. Each registration catches\n * errors independently, removes its own listener on failure, and continues.\n *\n * Mirrors legacy acdcallback.js \"Fetch and subscribe to customer intent for callback\"\n * step (ACE-5407).\n */\nexport function callbackCustomerIntent(deps: StepDependencies): { label: string; process: (ctx: any) => any } {\n    return {\n        label: 'callbackCustomerIntent',\n        async process(ctx: any) {\n            const { customerIntentService, loggerService } = deps;\n            const { payload, call, callback } = ctx;\n\n            if (!isCallbackActive(callback)) return;\n\n            const intentTargets = [\n                { ModelBuilder: CallbackInteraction, interactionModel: callback },\n                { ModelBuilder: CallInteraction, interactionModel: call }\n            ];\n\n            for (const { ModelBuilder, interactionModel } of intentTargets) {\n                try {\n                    await customerIntentService.addCustomerIntentListenerForInteraction(\n                        ModelBuilder,\n                        payload,\n                        interactionModel\n                    );\n                } catch (e) {\n                    loggerService.error('ConversationModeService: failed to add customer intent listener on callback', {\n                        e,\n                        remoteData: { interactionId: payload?.id }\n                    });\n                    customerIntentService.removeCustomerIntentListenerForInteraction(interactionModel);\n                }\n            }\n        }\n    };\n}\n\n/**\n * Callback-specific step factory: maintains the call/callback model pair tracking\n * and determines which model (call or callback) should be stored in the roster.\n *\n * Legacy's `activeCallbacks` maps each entry to either the call or callback model\n * depending on `callbacksRequiringCallWrapUp`. This step mirrors that by setting\n * `ctx.interactionModel` to the appropriate model before `updateRoster` runs.\n *\n * Mirrors legacy acdcallback.js \"Update Models List\" step + `activeCallbacks` computed.\n */\nexport function callbackUpdateModelsList(deps: StepDependencies): { label: string; process: (ctx: any) => any } {\n    return {\n        label: 'callbackUpdateModelsList',\n        process(ctx: any) {\n            const { conversationModeService, rosterSelectionService } = deps;\n            const { payload, call, callback } = ctx;\n\n            if (!isCallbackActive(callback)) return;\n\n            const models = conversationModeService.get('_callbackModels') as Map<\n                string,\n                { interactionId: string; call: any; callback: any }\n            >;\n            if (models) {\n                models.set(payload.id, { interactionId: payload.id, call, callback });\n            }\n\n            // Determine which model the roster should display — mirrors legacy acdcallback.activeCallbacks\n            // which maps to the call model when call wrapup is needed, otherwise the callback model.\n            ctx.interactionModel = callRequiresWrapUp(call, callback) ? call : callback;\n\n            // If this interaction is the committed selection and the model instance changed\n            // (callback→call or call→callback), update the selection payload so the main stage\n            // renders the correct controls. This is a same-conversation swap (same id), not a\n            // true selection change, so we replace the selection object directly rather than going\n            // through select() — which would no-op (same id equality check) and also shouldn't\n            // trigger hold/unhold side effects. Mirrors legacy processActiveRoutableChanges which\n            // re-set selectedInteraction to the new model without additional hold logic.\n            const selection = rosterSelectionService.get('selection');\n            if (selection && selection.id === payload.id && selection.payload !== ctx.interactionModel) {\n                rosterSelectionService.set('selection', {\n                    modeId: selection.modeId,\n                    id: selection.id,\n                    payload: ctx.interactionModel\n                });\n            }\n        }\n    };\n}\n\n/**\n * Callback-specific step factory: performs callback-specific cleanup when the\n * interaction becomes inactive. Resets the call model's wrapup state (ACE-2805),\n * removes the model triple from tracking, clears blocked call notifications,\n * removes external contact and customer intent listeners, runs wrapup gadget\n * cleanup, and cleans up schedule callback session storage.\n *\n * Mirrors legacy acdcallback.js \"Cleanup\" step.\n */\nexport function callbackCleanup(deps: StepDependencies): { label: string; process: (ctx: any) => any } {\n    return {\n        label: 'callbackCleanup',\n        async process(ctx: any) {\n            const {\n                conversationModeService,\n                loggerService,\n                externalContactsService,\n                customerIntentService,\n                contactObservers,\n                rosterSelectionService\n            } = deps;\n            const { payload, call, callback } = ctx;\n\n            // ACE-2805: Reset re-used Call model to reset timeouts, saved ACW, notes, etc.\n            // Only reset if the call does not still require wrapup.\n            const callShouldBeActive = callRequiresWrapUp(call, callback);\n            if (!callShouldBeActive && call) {\n                call.setProperties({\n                    notes: null,\n                    selectedWrapupCode: null,\n                    wrapupNotSaved: true,\n                    oldWrapupCode: null,\n                    skipAfterCallWork: false,\n                    isAfterCallWorkTimerExpired: false\n                });\n            }\n\n            if (isCallbackActive(callback)) return;\n\n            const interactionId = payload?.id;\n\n            // Remove the model pair from the tracking map\n            const models = conversationModeService.get('_callbackModels') as Map<\n                string,\n                { interactionId: string; call: any; callback: any }\n            >;\n            if (models) {\n                models.delete(interactionId);\n            }\n\n            // Clear blocked call notifications for this interaction\n            const blockedCalls = conversationModeService.get('_blockedCalls') as Array<{\n                interactionId: string;\n                wrapup: { code: string; endTime: string };\n            }>;\n\n            if (blockedCalls) {\n                const filtered = blockedCalls.filter(\n                    (entry: { interactionId: string }) => entry.interactionId !== interactionId\n                );\n                conversationModeService.set('_blockedCalls', filtered);\n            }\n\n            // Remove external contact and customer intent listeners. Intent is\n            // registered on both the callback and call models (see\n            // `callbackCustomerIntent`), so both must be removed here.\n            const observer = contactObservers[interactionId];\n            if (observer) {\n                externalContactsService.removeContactChangeListenersForInteraction(callback, observer);\n                contactObservers[interactionId] = undefined as any;\n            }\n            customerIntentService.removeCustomerIntentListenerForInteraction(callback);\n            customerIntentService.removeCustomerIntentListenerForInteraction(call);\n\n            // Run wrapup gadget cleanup — passes communicationService for call/callback disconnect\n            try {\n                const selectedId = rosterSelectionService.get('selection')?.id;\n                await cleanupAfterWrapupGadgetSubmit({\n                    interaction: callback,\n                    isSelectedInteraction: selectedId === interactionId,\n                    logger: loggerService,\n                    agentAssistChecksService: deps.agentAssistChecksService,\n                    communicationService: deps.communicationService\n                });\n            } catch (e) {\n                loggerService.error('ConversationModeService: callback wrapup gadget cleanup failed', {\n                    e,\n                    remoteData: { interactionId }\n                });\n            }\n\n            // Clean up schedule callback gadget session storage\n            if (interactionId) {\n                cleanupScheduleCallbackGadgetSessionStorage([interactionId], deps.storageService);\n            }\n        }\n    };\n}\n\n/**\n * Callback-specific step factory: triggers recomputation of\n * `incomingCallbackCallsToAutoAnswer` on conversation-mode-service after\n * the roster has been updated. Replaces the legacy\n * `notifyPropertyChange('activeCallbacks')` workaround.\n */\nexport function callbackNotifyPropertyChange(deps: StepDependencies): { label: string; process: (ctx: any) => any } {\n    return {\n        label: 'callbackNotifyPropertyChange',\n        process() {\n            deps.conversationModeService.notifyCallbackAutoAnswerChange();\n        }\n    };\n}\n","import { get } from '@ember/object';\nimport type { StepDependencies, EventSource } from '../../conversation-mode-service';\n\n/**\n * Email-specific step factory: short-circuits the processing chain for draft\n * events and primary participant draft updates. Draft events update the draft\n * hash on the mode and halt; primary participant draft updates halt immediately.\n * All other event sources continue the chain.\n *\n * Mirrors legacy acdemail.js \"Auto Association - Draft Primary Participant Change\" step.\n */\nexport function emailDraftShortCircuit(deps: StepDependencies): { label: string; process: (ctx: any) => any } {\n    return {\n        label: 'emailDraftShortCircuit',\n        process({ eventSource, payload }: { eventSource: EventSource; payload: any }) {\n            const { conversationModeService } = deps;\n\n            if (eventSource === 'draftEvent') {\n                // Upsert draft into the mode's draftUpdateHash array — mirrors legacy acdemail.setDraftUpdate\n                const conversationId = payload?.conversationId;\n                if (conversationId) {\n                    conversationModeService.setDraftUpdate(conversationId, payload);\n                }\n                return false;\n            }\n            if (eventSource === 'primaryParticipantDraftUpdate') {\n                return false;\n            }\n\n            return;\n        }\n    };\n}\n\n/**\n * Email-specific step factory: fetches draft content for new email conversations\n * and re-fetches drafts when an existing email transitions from a disconnected/terminated\n * state back to alerting or connected (reconnect scenario).\n *\n * Mirrors legacy acdemail.js draft fetch behavior in the \"Filtering and Context Acquisition\"\n * and \"Update Interaction Model State\" steps.\n */\nexport function emailFetchDraft(deps: StepDependencies): { label: string; process: (ctx: any) => any } {\n    return {\n        label: 'emailFetchDraft',\n        process(ctx: any) {\n            const { loggerService, fetchDraftForEmail } = deps;\n\n            try {\n                if (ctx.newInteraction) {\n                    // Fire-and-forget to match legacy acdemail.js behavior — draft fetch\n                    // runs in parallel with the rest of the chain.\n                    fetchDraftForEmail(ctx.interactionModel.get('id') || ctx.payload?.id);\n                    return;\n                }\n\n                // Check if existing email is transitioning from disconnected to alerting/connected.\n                // Uses prevRaw (the pre-update metadata snapshot) to determine the previous state,\n                // since this step runs before updateModelState merges the new payload.\n                const agentParticipantId = get(ctx.interactionModel, 'participantForCurrentUser.id');\n\n                // Determine previous state from prevRaw snapshot\n                const prevParticipants = ctx.prevRaw?.participants || [];\n                const prevAgentParticipant = prevParticipants.find((p: any) => p.id === agentParticipantId);\n                const prevState = (prevAgentParticipant?.emails?.[0]?.state || '').toLowerCase();\n                const wasDisconnected = prevState === 'disconnected' || prevState === 'terminated';\n\n                // Determine new state from incoming payload\n                const newParticipants = ctx.payload?.participants || [];\n                const newAgentParticipant = newParticipants.find((p: any) => p.id === agentParticipantId);\n                const newState = (newAgentParticipant?.emails?.[0]?.state || '').toLowerCase();\n                const isReconnecting = newState === 'alerting' || newState === 'connected';\n\n                if (wasDisconnected && isReconnecting) {\n                    // Fire-and-forget on reconnect as well\n                    fetchDraftForEmail(ctx.payload?.id);\n                }\n            } catch (e) {\n                loggerService.error('ConversationModeService: failed to fetch draft for email', {\n                    e,\n                    remoteData: { interactionId: ctx.payload?.id }\n                });\n            }\n        }\n    };\n}\n\n/**\n * Email-specific step factory: displays a parked notification for existing email\n * interactions that have transitioned to a parked state. Skips notification for\n * new interactions.\n *\n * Mirrors legacy acdemail.js \"Handle Parked Interactions\" step.\n * * Requires `deps.conversationModeService` to have `_displayNotification` (via AcdUtilitiesMixin).\n */\nexport function emailParkedNotification(deps: StepDependencies): { label: string; process: (ctx: any) => any } {\n    return {\n        label: 'emailParkedNotification',\n        process(ctx: any) {\n            const { conversationModeService, sessionService } = deps;\n\n            if (ctx.newInteraction) {\n                return;\n            }\n\n            if (get(ctx.interactionModel, 'isParked')) {\n                const useNewNav = sessionService.get('useNewNav');\n                const titleKey = 'purecloud.acdInteraction.park.success.title';\n                const messageKey = useNewNav\n                    ? 'purecloud.acdInteraction.park.success.messageNewNav'\n                    : 'purecloud.acdInteraction.park.success.message';\n\n                conversationModeService._displayNotification(titleKey, messageKey);\n            }\n        }\n    };\n}\n","import { get } from '@ember/object';\nimport Ember from 'ember';\nimport { fetchParticipantName } from 'web-directory/utils/participant-name';\nimport type { StepDependencies } from '../../conversation-mode-service';\n\n// --- Pure helper functions ported from legacy acdsms.js ---\n\n/**\n * Extracts all nested message objects from a raw conversation payload.\n * Walks participants → messages (communications) → messages (individual messages).\n *\n * Mirrors legacy acdsms._getMessagesFromInteraction.\n */\nfunction getMessagesFromPayload(payload: any): any[] {\n    const participants: any[] = payload?.participants || [];\n    return participants\n        .flatMap((participant: any) => (participant ? participant.messages : []))\n        .flatMap((entry: any) => (entry ? entry.messages : []))\n        .filter(Boolean);\n}\n\n/**\n * Returns the latest message from an array by comparing messageTime/timestamp.\n *\n * Mirrors legacy acdsms._getLatestMessage.\n */\nfunction getLatestMessage(messages: any[]): any | null {\n    if (!messages || messages.length === 0) return null;\n    return messages.reduce((a: any, b: any) => {\n        const timestampA = new Date(a.messageTime || a.timestamp).getTime();\n        const timestampB = new Date(b.messageTime || b.timestamp).getTime();\n        return timestampA >= timestampB ? a : b;\n    });\n}\n\n/**\n * Returns the messageId of the latest message in the payload, or null.\n *\n * Mirrors legacy acdsms._getLatestMessasgeId.\n */\nfunction getLatestMessageId(payload: any): string | null {\n    const messages = getMessagesFromPayload(payload);\n    const latest = getLatestMessage(messages);\n    return latest ? latest.messageId : null;\n}\n\n/**\n * Collects all unique SMS communication objects (the ones that carry a messages array)\n * from the raw payload. These are the objects whose properties get merged with\n * the fetched detail response.\n *\n * Mirrors legacy acdsms.getSmsObjects.\n */\nfunction getSmsObjects(payload: any): any[] {\n    const smsObjs: any[] = [];\n    const seenIds = new Set<string>();\n    const participants: any[] = payload?.participants || [];\n\n    for (const participant of participants) {\n        const comms: any[] = participant?.messages || [];\n        for (const sms of comms) {\n            const messages: any[] = sms?.messages || [];\n            for (const message of messages) {\n                if (message?.messageId && !seenIds.has(message.messageId)) {\n                    seenIds.add(message.messageId);\n                    smsObjs.push(message);\n                }\n            }\n        }\n    }\n    return smsObjs;\n}\n\n/**\n * Determines the sub-message type (e.g. 'instagram') from the payload by\n * inspecting the first participant that has a messages communication.\n *\n * Mirrors legacy acdsms \"Retrieve message details Step\" subMessageType extraction.\n */\nfunction getSubMessageType(payload: any): string {\n    const participants: any[] = payload?.participants || [];\n    const sampleParticipant = participants.find((p: any) => p && p.messages && p.messages.length);\n    if (!sampleParticipant || !sampleParticipant.messages.length) return '';\n    return sampleParticipant.messages[0].type || '';\n}\n\n/**\n * Checks the existing interaction model's messages before hitting the API.\n * If all requested message IDs are found in the model, returns them directly\n * (avoiding a network call). Falls back to the API if any ID is missing,\n * the feature toggle is off, or the message type is Instagram (which allows\n * message deletion, so cached data may be stale).\n *\n * Mirrors legacy acdsms.verifyBeforeFetchingMessageDetails.\n */\nasync function verifyBeforeFetchingMessageDetails(\n    interactionId: string,\n    smsIdsToLookup: string[],\n    interactionModel: any,\n    payload: any,\n    sessionService: any,\n    communicationService: any\n): Promise<{ entities: any[] }> {\n    const subMessageType = getSubMessageType(payload);\n    const isInstagram = subMessageType.toLowerCase() === 'instagram';\n    const canVerifyBeforeFetch = sessionService.get('features.ACE-4461_org-settings-fetch') && !isInstagram;\n\n    if (!canVerifyBeforeFetch) {\n        return communicationService.getSMSDetails(interactionId, smsIdsToLookup);\n    }\n\n    const existingMessages = getMessagesFromPayload(interactionModel);\n    const messageIdSet = new Set(existingMessages.map((msg: any) => msg.messageId || msg.id));\n\n    const entities: any[] = [];\n    const notFoundMsgIds: string[] = [];\n\n    smsIdsToLookup.forEach((msgId: string) => {\n        if (messageIdSet.has(msgId)) {\n            const foundMsg = existingMessages.find((msg: any) => msg.messageId === msgId || msg.id === msgId);\n            if (foundMsg) {\n                entities.push(foundMsg);\n            }\n        } else {\n            notFoundMsgIds.push(msgId);\n        }\n    });\n\n    if (notFoundMsgIds.length > 0) {\n        return communicationService.getSMSDetails(interactionId, smsIdsToLookup);\n    }\n\n    return { entities };\n}\n\n/**\n * Determines whether a message is \"new\" (not previously seen by the interaction model).\n * Used to gate toast notifications — only new inbound messages should trigger a toast.\n *\n * Mirrors legacy acdsms.getSMSDetails newMessage computation.\n */\nfunction isNewMessage(\n    messageId: string,\n    interactionModel: any,\n    payload: any,\n    newInteraction: boolean,\n    eventSource: string\n): boolean {\n    const eventSrcFromAPI = eventSource === 'api';\n\n    if (newInteraction && !eventSrcFromAPI) {\n        return true;\n    }\n\n    const existingMessages = getMessagesFromPayload(interactionModel);\n    const msgFound = existingMessages.some((msg: any) => msg.messageId === messageId || msg.id === messageId);\n\n    if (msgFound) {\n        return false;\n    }\n\n    const currentMessagesLength = getMessagesFromPayload(interactionModel).length;\n    const newMessagesLength = getMessagesFromPayload(payload).length;\n\n    return currentMessagesLength !== newMessagesLength;\n}\n\n/**\n * Shows a toast notification for a new inbound message. Resolves the customer\n * participant's display name, extracts the message body (or a media-sent\n * fallback), and fires an info notification with sound.\n *\n * Lives here (rather than on conversation-mode-service) because it is\n * message-specific logic and all the services it needs are available via\n * StepDependencies.\n *\n * Mirrors legacy acdsms.toastNewMessage + sendAcdMessageNotification.\n */\nasync function toastNewMessage(\n    smsDetail: any,\n    payload: any,\n    interactionModel: any,\n    eventSource: string,\n    deps: StepDependencies\n): Promise<void> {\n    if (eventSource === 'api') return;\n\n    const direction = (smsDetail?.direction || '').toLowerCase();\n    if (direction !== 'inbound') return;\n\n    const {\n        intlService,\n        notificationService,\n        sessionService,\n        preferencesService,\n        storeService,\n        externalContactsService,\n        loggerService,\n        commandNavService,\n        mode,\n        rosterSelectionService,\n        conversationModeService\n    } = deps;\n\n    // Extract message body — fall back to media attachment label\n    let messageBody: string = smsDetail?.normalizedMessage?.text || '';\n    const hasMediaAttachment = !!smsDetail?.normalizedMessage?.content?.[0]?.attachment;\n    if (!messageBody.trim() && hasMediaAttachment) {\n        messageBody = intlService.lookup\n            ? intlService.lookup('purecloud.acdInteraction.sms.mediaSent') || ''\n            : intlService.t('purecloud.acdInteraction.sms.mediaSent').toString();\n    }\n    if (!messageBody) return;\n\n    // Resolve customer name\n    const customerParticipantId = interactionModel.get ? interactionModel.get('participantForCustomer.id') : null;\n    if (!customerParticipantId) return;\n\n    const rawConversation = (interactionModel.get ? interactionModel.get('__interaction_metadata__') : null) || payload;\n    const rawParticipant = (rawConversation?.participants || []).find((p: any) => p.id === customerParticipantId);\n    if (!rawParticipant) return;\n\n    let displayName: string;\n    try {\n        const name = await fetchParticipantName(rawParticipant, storeService, externalContactsService, loggerService);\n        const noName = intlService.t('purecloud.acdInteraction.noName').toString();\n        displayName = name || noName;\n    } catch {\n        displayName = intlService.t('purecloud.acdInteraction.noName').toString();\n    }\n\n    // Check busy state — don't toast busy users\n    const isBusy = get(sessionService, 'person.presence') === 'busy';\n    if (isBusy) return;\n\n    // Determine if the interaction view is open — mirrors legacy interaction.isInteractionViewOpen.\n    const isInteractionViewOpen = get(commandNavService, 'currentPanel') === 'agent';\n\n    // Determine if the window has focus — uses AcdUtilitiesMixin.windowInFocus on the service,\n    // which checks hosted context for embedded/iframe scenarios and falls back to document.hasFocus()\n    const windowFocused = conversationModeService.windowInFocus();\n\n    // Show popup only when the interaction panel isn't visible — mirrors legacy showPopup logic\n    const showPopup = !isInteractionViewOpen || (!windowFocused && !isInteractionViewOpen);\n\n    // Notification options\n    const soundsMuted = get(preferencesService, 'chat.global.soundsMuted');\n    let volume: number = get(preferencesService, 'chat.chatNotificationVolume') || 0;\n    if (volume > 1) {\n        volume = volume / 100;\n    }\n\n    const interactionId = payload?.id;\n\n    notificationService.info(displayName, messageBody, {\n        messageStyle: 'acd-toast-notification',\n        tag: interactionId,\n        hideAfter: false,\n        soundId: 'chat',\n        shouldShowPopup: showPopup,\n        shouldPlaySound: !soundsMuted,\n        volume,\n        clickHandler: () => {\n            // Legacy checks both old nav (sidebar.communicationPanel === 'acdInteractions') and new nav\n            // (commandNav.currentPanel === 'agent'). We only check new nav here because the mode-manager\n            // only runs in the new nav context, and injecting the sidebar service would transitively\n            // instantiate the interaction service which we are actively replacing.\n\n            // Navigate to the agent panel if not already open\n            if (get(commandNavService, 'currentPanel') !== 'agent') {\n                commandNavService.selectPanel('agent');\n            }\n\n            // Select the interaction in the roster\n            if (mode && interactionId) {\n                const interaction = mode.get('allItems')?.get(interactionId);\n                if (interaction) {\n                    rosterSelectionService.select(get(mode, 'id'), interaction);\n                }\n            }\n        }\n    });\n}\n\n// --- Step factories ---\n\n/**\n * Message-specific step factory: retrieves message details for the latest message\n * in the payload. Identifies the latest message by timestamp across all participants,\n * fetches its details via the communication service's bulk endpoint, and merges\n * the response back into the raw payload's message objects.\n *\n * Mirrors legacy acdsms.js \"Retrieve message details Step\".\n */\nexport function messageRetrieveDetails(deps: StepDependencies): { label: string; process: (ctx: any) => any } {\n    return {\n        label: 'messageRetrieveDetails',\n        async process(ctx: any) {\n            const { communicationService, conversationModeService, loggerService, sessionService } = deps;\n            const { eventSource, payload } = ctx;\n\n            try {\n                const smsMessagesFromCP = getSmsObjects(payload);\n                const lastMessageId = getLatestMessageId(payload);\n\n                if (!lastMessageId) return;\n\n                const smsIdsToLookup = [lastMessageId];\n                const smsMessagesFromCPToFill = smsMessagesFromCP.filter((sms: any) =>\n                    smsIdsToLookup.includes(sms.messageId)\n                );\n\n                loggerService.debug('ConversationModeService: message ids to lookup', {\n                    eventSource,\n                    interactionId: payload?.id,\n                    smsIdsToLookup\n                });\n\n                const smsMessageDetails = await verifyBeforeFetchingMessageDetails(\n                    payload.id,\n                    smsIdsToLookup,\n                    ctx.interactionModel,\n                    payload,\n                    sessionService,\n                    communicationService\n                );\n                const entities: any[] = smsMessageDetails?.entities || [];\n\n                smsMessagesFromCPToFill.forEach((sms: any) => {\n                    const smsDetail = entities.find((detail: any) => detail.id === sms.messageId);\n                    if (smsDetail) {\n                        // Backend uses 'id', hawk uses 'messageId' — normalize\n                        smsDetail.messageId = smsDetail.id;\n\n                        const newMessage = isNewMessage(\n                            smsDetail.id,\n                            ctx.interactionModel,\n                            payload,\n                            ctx.newInteraction,\n                            eventSource\n                        );\n\n                        Ember.setProperties(sms, smsDetail);\n\n                        // Remove typing indicator when an inbound message arrives\n                        if ((smsDetail.direction || '').toLowerCase() === 'inbound') {\n                            conversationModeService.removeTypingIndicator(payload?.id);\n                        }\n\n                        if (newMessage) {\n                            toastNewMessage(smsDetail, payload, ctx.interactionModel, eventSource, deps);\n                        }\n                    }\n                });\n            } catch (e) {\n                loggerService.error('ConversationModeService: failed to retrieve message details', {\n                    e,\n                    remoteData: { interactionId: payload?.id }\n                });\n                conversationModeService._displayApiError(e, 'purecloud.acdInteraction.sms.errors.process');\n            }\n        }\n    };\n}\n\n/**\n * Message-specific step factory: displays a parked notification for existing message\n * interactions that have transitioned to a parked state. Skips notification for\n * new interactions.\n *\n * Mirrors legacy acdsms.js \"Handle Parked Interactions\" step.\n * Requires `deps.conversationModeService` to have `_displayNotification` (via AcdUtilitiesMixin).\n */\nexport function messageParkedNotification(deps: StepDependencies): { label: string; process: (ctx: any) => any } {\n    return {\n        label: 'messageParkedNotification',\n        process(ctx: any) {\n            const { conversationModeService, sessionService } = deps;\n\n            if (ctx.newInteraction) {\n                return;\n            }\n\n            if (get(ctx.interactionModel, 'isParked')) {\n                const useNewNav = sessionService.get('useNewNav');\n                const titleKey = 'purecloud.acdInteraction.sms.park.success.title';\n                const messageKey = useNewNav\n                    ? 'purecloud.acdInteraction.sms.park.success.messageNewNav'\n                    : 'purecloud.acdInteraction.sms.park.success.message';\n\n                conversationModeService._displayNotification(titleKey, messageKey);\n            }\n        }\n    };\n}\n\n/**\n * Message-specific step factory: notifies the agent when a supervisor takes over their message\n * conversation. Detects a transition of the current user's message media into a `takeover`\n * disconnect (by diffing the previous raw payload) and shows the toast once per interaction.\n *\n * Mirrors legacy acdsms.js \"Notify User of Supervisor Takeover\" step (PURE-6914). Requires\n * `deps.conversationModeService` to have `_displayNotification` (via AcdUtilitiesMixin).\n */\nexport function messageTakeoverNotification(deps: StepDependencies): { label: string; process: (ctx: any) => any } {\n    return {\n        label: 'messageTakeoverNotification',\n        process(ctx: any) {\n            const { conversationModeService, sessionService } = deps;\n            const { eventSource, interactionModel, prevRaw } = ctx;\n\n            if (!sessionService.get('features.PURE-6914')) return;\n            if (!interactionModel) return;\n\n            // Only notify on realtime updates, not on initial API/bootstrap loads\n            if (eventSource !== 'realtime') return;\n            if (get(interactionModel, 'takeoverNotified')) return;\n\n            const currentParticipant = get(interactionModel, 'participantForCurrentUser');\n            const currentMedia = get(currentParticipant || {}, 'messages.firstObject');\n            const currentDisconnect = (get(currentMedia || {}, 'disconnectType') || '').toLowerCase();\n\n            // Use the previous raw payload, if present, to detect a transition into takeover\n            let previousDisconnect = '';\n            if (prevRaw && currentParticipant && get(currentParticipant, 'id')) {\n                const prevParticipant =\n                    (prevRaw.participants || []).find((p: any) => p && p.id === get(currentParticipant, 'id')) || {};\n                const prevMedia = get(prevParticipant, 'messages.firstObject');\n                previousDisconnect = (get(prevMedia || {}, 'disconnectType') || '').toLowerCase();\n            }\n\n            const transitionedToTakeover = currentDisconnect === 'takeover' && previousDisconnect !== 'takeover';\n            if (!transitionedToTakeover) return;\n\n            conversationModeService._displayNotification(null, 'purecloud.acdInteraction.takeoverNotification');\n            interactionModel.set('takeoverNotified', true);\n        }\n    };\n}\n","import { getOwner } from '@ember/application';\nimport { get } from '@ember/object';\nimport { resolveConversationType, resolveInteractionModel } from 'web-directory/components/mode-manager/modes/utils';\nimport { setInteractionModelMetadata } from 'web-directory/utils/acd';\nimport { getQueueMediaSettings } from 'web-directory/utils/acd-ts';\nimport { cleanupAfterWrapupGadgetSubmit } from 'web-directory/utils/acw-wrapup-gadget-cleanup';\nimport { cleanupScheduleCallbackGadgetSessionStorage } from 'web-directory/utils/schedule-callback-gadget';\n\nimport { ModeItemsMap } from 'web-directory/components/mode-manager/modes';\nimport type { ConversationType, EventSource, StepDependencies } from '../../conversation-mode-service';\n\n/**\n * Detects \"unpark via transfer\" for email and message conversations. When a conversation parked\n * by one agent is transferred to the current user, the current user's own communication has no\n * `parkTime` (they're freshly connected), but another participant's communication still reports\n * `state === 'parked'`.\n *\n * Mirrors the `isUnparkedViaTransfer` checks in legacy acdemail.js and acdsms.js.\n */\nexport function hasParkedCommunicationForTransfer(\n    participants: any[] | undefined,\n    type: ConversationType | null\n): boolean {\n    if (type !== 'email' && type !== 'message') {\n        return false;\n    }\n\n    return (participants || [])\n        .flatMap(p => {\n            return type === 'message' ? [...(p?.messages || []), ...(p?.internalMessages || [])] : p?.emails || [];\n        })\n        .some(comm => {\n            return comm?.state === 'parked';\n        });\n}\n\n/**\n * Determines whether the current user's communication of the given media type (`commKey`) was in\n * the `alerting` state in a raw conversation snapshot (`prevRaw`). Applies to all non-voice\n * (digital) types — email, message, callback — which share the single `'digital'` ringtone channel.\n * Used to detect a genuine alerting → non-alerting transition rather than reacting to every\n * steady-state update on a connected interaction.\n */\nexport function wasCommunicationAlertingInPreviousEvent(\n    prevRaw: any,\n    participantForCurrentUser: any,\n    commKey: string\n): boolean {\n    if (!prevRaw || !participantForCurrentUser) return false;\n\n    const participantId = get(participantForCurrentUser, 'id');\n    const userId = get(participantForCurrentUser, 'userId');\n\n    const participants: any[] = prevRaw.participants || [];\n    const prevParticipant = participants.find(\n        p => (participantId && p?.id === participantId) || (userId && p?.userId === userId)\n    );\n    if (!prevParticipant) return false;\n\n    const comms = prevParticipant[commKey] || [];\n    return (comms[0]?.state || '').toLowerCase() === 'alerting';\n}\n\n/**\n * Shared step factory: finds an existing interaction model in the mode's roster\n * or creates a new one from the raw payload. Used by email, message, callback, and call chains.\n * Callback and call chains have their own specialized find-or-create steps.\n *\n * Returns `false` to halt the chain when the payload is invalid, the model class\n * cannot be resolved, or a newly created model is already inactive.\n */\nexport function findOrCreateInteraction(deps: StepDependencies): { label: string; process: (ctx: any) => any } {\n    return {\n        label: 'findOrCreateInteraction',\n        process({ eventSource, payload }: { eventSource: EventSource; payload: any }) {\n            if (!payload?.id) {\n                return false;\n            }\n            const { mode, sessionService } = deps;\n            const userId = get(sessionService, 'person.guid');\n            let newInteraction = false;\n            let prevRaw = null;\n            let interactionModel = null;\n\n            // Check the mode's roster for an existing model with this conversation ID\n            // Note that allItems is a native JS Map, so the two \"get\"s here are different\n            const allItems: ModeItemsMap = get(mode, 'allItems');\n            const existing = allItems?.get(payload.id);\n\n            if (existing) {\n                newInteraction = false;\n                interactionModel = existing;\n                prevRaw = interactionModel.get('__interaction_metadata__');\n            } else {\n                const ModelClass = resolveInteractionModel(payload, userId);\n                if (!ModelClass) {\n                    return false;\n                }\n\n                // Ember 3.x does not allow passing properties to create() when computed\n                // properties exist in the class hierarchy. Create with owner injection only,\n                // then apply the payload via setProperties().\n                interactionModel = ModelClass.create(getOwner(mode).ownerInjection());\n                interactionModel.setProperties(payload);\n\n                if (!get(interactionModel, 'isInteractionActive')) {\n                    // New interaction is inactive and has never been added to the roster — clean up locally\n                    interactionModel.destroy();\n                    return false;\n                }\n\n                newInteraction = true;\n                prevRaw = null;\n\n                // Mirrors legacy interaction component calling fetchCommunicationBasedACWSetting()\n                // on each new interaction. The cache in conversation-mode-service prevents redundant\n                // API calls for interactions arriving within the 10-minute cache window.\n                deps.conversationModeService.fetchCommunicationBasedACWSetting();\n            }\n\n            return {\n                eventSource,\n                payload,\n                prevRaw,\n                newInteraction,\n                interactionModel\n            };\n        }\n    };\n}\n\n/**\n * Shared step factory: checks for missed timed wrapup timers on existing interactions.\n * Skips the check for new interactions. Catches errors internally and continues the chain.\n *\n * Requires `deps.conversationModeService` to have `handleMissedTimedBoxTimer` (via AcdUtilitiesMixin).\n */\nexport function timedWrapupCheck(deps: StepDependencies): { label: string; process: (ctx: any) => any } {\n    return {\n        label: 'timedWrapupCheck',\n        process(ctx: any) {\n            if (!ctx.newInteraction) {\n                const { conversationModeService, loggerService, sessionService } = deps;\n\n                try {\n                    const userId: string = get(sessionService.get('person'), 'guid');\n                    const ModelClass = resolveInteractionModel(ctx.payload, userId);\n                    // handleMissedTimedBoxTimer is from AcdUtilitiesMixin — first arg is the\n                    // \"container\" used for Ember.getOwner, second is the raw payload, third is\n                    // the Interaction model class used to create a temporary model for timer check.\n                    conversationModeService.handleMissedTimedBoxTimer(conversationModeService, ctx.payload, ModelClass);\n                } catch (e) {\n                    loggerService.error('ConversationModeService: timedWrapupCheck failed', {\n                        e,\n                        remoteData: { interactionId: ctx.payload?.id }\n                    });\n                }\n            }\n        }\n    };\n}\n\n/**\n * Shared step factory: updates the interaction model's properties and metadata\n * from the latest payload. For existing interactions, calls `setProperties` to\n * merge new data. For all interactions, calls `setInteractionModelMetadata` to\n * store the raw payload snapshot.\n */\nexport function updateModelState(_: StepDependencies): { label: string; process: (ctx: any) => any } {\n    return {\n        label: 'updateModelState',\n        process(ctx: any) {\n            // Clone the payload before setProperties to avoid shared references between\n            // the Ember model and the object passed to setInteractionModelMetadata.\n            // ModelClass.create(payload) and setProperties(payload) copy array/object\n            // references onto the Ember instance; Ember then decorates those shared\n            // references with mandatory setters, causing lodash cloneDeep (inside\n            // setInteractionModelMetadata) to throw when it traverses into them.\n            const metadataSnapshot = JSON.parse(JSON.stringify(ctx.payload));\n\n            if (!ctx.newInteraction) {\n                ctx.interactionModel.setProperties(ctx.payload);\n                // Nested consult fields often change on the same participants array\n                // reference; notify so the consult bar computeds recompute without remount.\n                ctx.interactionModel.notifyPropertyChange('participants');\n                ctx.interactionModel.notifyPropertyChange('onConsult');\n            }\n            setInteractionModelMetadata(ctx.interactionModel, metadataSnapshot);\n        }\n    };\n}\n\n/**\n * Shared step factory: resolves external contact information on the interaction\n * model from the raw payload. Catches errors and continues the chain.\n */\nexport function externalContactInfo(deps: StepDependencies): { label: string; process: (ctx: any) => any } {\n    return {\n        label: 'externalContactInfo',\n        async process(ctx: any) {\n            const { externalContactsService, loggerService } = deps;\n\n            // For callbacks, legacy sets external contact info on three targets:\n            // callback, callback.conversation, and call. For other types, just the\n            // interaction model.\n            const targets = [ctx.interactionModel];\n            if (ctx.call && ctx.call !== ctx.interactionModel) {\n                const conversation = get(ctx.interactionModel, 'conversation');\n                if (conversation) {\n                    targets.push(conversation);\n                }\n                targets.push(ctx.call);\n            }\n\n            for (const target of targets) {\n                try {\n                    await externalContactsService.setExternalContactInfo(target, ctx.payload);\n                } catch (e) {\n                    loggerService.error('ConversationModeService: failed to set external contact info', {\n                        e,\n                        remoteData: { interactionId: ctx.payload?.id }\n                    });\n                }\n            }\n        }\n    };\n}\n\n/**\n * Shared step factory: attaches external contact change listeners and customer\n * intent listeners for active interactions. Catches errors from each registration\n * independently, removes partial listeners on failure, and continues the chain.\n *\n * @param options.registerCustomerIntent - When false, skips customer intent\n * registration. Used by the callback chain, which registers intent for both its\n * call and callback models in a dedicated later step (`callbackCustomerIntent`)\n * after external contact info has been applied — mirrors legacy acdcallback.js\n * step ordering (ACE-5407).\n */\nexport function externalContactListeners(\n    deps: StepDependencies,\n    options: { registerCustomerIntent?: boolean } = {}\n): { label: string; process: (ctx: any) => any } {\n    const { registerCustomerIntent = true } = options;\n    return {\n        label: 'externalContactListeners',\n        async process(ctx: any) {\n            if (!get(ctx.interactionModel, 'isInteractionActive')) {\n                return;\n            }\n\n            const { externalContactsService, customerIntentService, sessionService, loggerService, contactObservers } =\n                deps;\n            const { id } = ctx.payload;\n            const userId: string = get(sessionService.get('person'), 'guid');\n\n            // Ensure an observer callback exists for this interaction\n            if (!contactObservers[id]) {\n                contactObservers[id] = function () {};\n            }\n            const observer = contactObservers[id];\n\n            try {\n                const ModelClass = resolveInteractionModel(ctx.payload, userId);\n                await externalContactsService.addContactChangeListenersForInteraction(\n                    ModelClass,\n                    ctx.payload,\n                    ctx.prevRaw,\n                    observer\n                );\n            } catch (e) {\n                loggerService.error('ConversationModeService: failed to add external contact change listeners', {\n                    e,\n                    remoteData: { interactionId: id }\n                });\n                externalContactsService.removeContactChangeListenersForInteraction(ctx.interactionModel, observer);\n                contactObservers[id] = undefined as any;\n            }\n\n            if (!registerCustomerIntent) {\n                return;\n            }\n\n            try {\n                const ModelClass = resolveInteractionModel(ctx.payload, userId);\n                await customerIntentService.addCustomerIntentListenerForInteraction(\n                    ModelClass,\n                    ctx.payload,\n                    ctx.interactionModel\n                );\n            } catch (e) {\n                loggerService.error('ConversationModeService: failed to add customer intent listener', {\n                    e,\n                    remoteData: { interactionId: id }\n                });\n                customerIntentService.removeCustomerIntentListenerForInteraction(ctx.interactionModel);\n            }\n        }\n    };\n}\n\n/**\n * Shared step factory: triggers auto-answer notifications for initially connected\n * or unparked conversations. Tracks participant and communication IDs per interaction\n * to deduplicate notifications. Seeds the tracking map for API events without\n * triggering a notification.\n */\nexport function autoAnswerNotification(deps: StepDependencies): { label: string; process: (ctx: any) => any } {\n    return {\n        label: 'autoAnswerNotification',\n        process(ctx: any) {\n            const { eventSource, interactionModel, newInteraction } = ctx;\n            const { sessionService, triggerAutoAnswer, partCommIdMap } = deps;\n            const userId: string = get(sessionService.get('person'), 'guid');\n\n            // Determine the conversation type to find the correct communication array\n            const type = resolveConversationType(ctx.payload, userId);\n            if (!type) {\n                return;\n            }\n\n            const COMM_KEY_MAP: Record<typeof type, string> = {\n                callback: 'callbacks',\n                call: 'calls',\n                email: 'emails',\n                message: 'messages'\n            };\n            const commKey = COMM_KEY_MAP[type] ?? null;\n            if (!commKey) return;\n\n            const interactionId = get(interactionModel, 'id');\n            const commId = get(interactionModel, `participantForCurrentUser.${commKey}.firstObject.id`);\n            const partId = get(interactionModel, 'participantForCurrentUser.id');\n\n            const checkAndSetCommAndPartId = (): boolean => {\n                if (\n                    typeof partCommIdMap[interactionId] === 'undefined' ||\n                    partCommIdMap[interactionId].prevCommId !== commId ||\n                    partCommIdMap[interactionId].prevPartId !== partId\n                ) {\n                    partCommIdMap[interactionId] = { prevCommId: commId, prevPartId: partId };\n                    return true;\n                }\n                return false;\n            };\n\n            // Seed tracking map for API events without triggering notification\n            if (typeof partCommIdMap[interactionId] === 'undefined' && eventSource === 'api') {\n                partCommIdMap[interactionId] = { prevCommId: commId, prevPartId: partId };\n            }\n\n            if (eventSource !== 'realtime') {\n                return;\n            }\n\n            const isInitiallyConnected =\n                get(interactionModel, `participantForCurrentUser.${commKey}.firstObject.initialState`) === 'connected';\n\n            const isOutbound =\n                (\n                    get(interactionModel, `participantForCurrentUser.${commKey}.firstObject.direction`) || ''\n                ).toLowerCase() === 'outbound';\n\n            // Check for unparking via parkTime on the communication\n            const isUnparked = !!get(interactionModel, `participantForCurrentUser.${commKey}.firstObject.parkTime`);\n\n            // Email & message: also detect unparking via transfer. When a conversation parked by one\n            // agent is transferred to the current user, the current user's own communication won't have\n            // a parkTime (they're freshly connected), but another participant's communication still\n            // shows state === 'parked'. Email inspects `emails`; messaging inspects `messages` and\n            // `internalMessages`. Mirrors legacy acdemail.js / acdsms.js `isUnparkedViaTransfer` checks.\n            const isUnparkedViaTransfer =\n                newInteraction && hasParkedCommunicationForTransfer(get(interactionModel, 'participants'), type);\n\n            // A new outbound interaction (agent-initiated) that is NOT being unparked should never\n            // trigger auto-answer. Seed the comm/part tracking map and bail: seeding means the\n            // subsequent connected event finds a matching prevCommId/prevPartId, so\n            // `checkAndSetCommAndPartId` returns false and we don't ring. A later genuine unpark\n            // changes the comm/part id (and is caught by the unpark path above), so it still rings.\n            if (newInteraction && isOutbound && !isUnparked && !isUnparkedViaTransfer) {\n                checkAndSetCommAndPartId();\n                return;\n            }\n\n            if ((isUnparked || isUnparkedViaTransfer) && newInteraction) {\n                triggerAutoAnswer(interactionModel, type, 'unparking');\n            } else if (isInitiallyConnected && !isOutbound) {\n                if (!newInteraction) {\n                    if (checkAndSetCommAndPartId()) {\n                        triggerAutoAnswer(interactionModel, type);\n                    }\n                    return;\n                }\n                checkAndSetCommAndPartId();\n                triggerAutoAnswer(interactionModel, type);\n            }\n        }\n    };\n}\n\n/** Step: forwards the interaction to `_handleAlerting` for the alerting toast. Legacy parity: `alerting-manager.manageAcdNotification`. */\nexport function alertingNotification(deps: StepDependencies): { label: string; process: (ctx: any) => any } {\n    return {\n        label: 'alertingNotification',\n        process(ctx: any) {\n            if (ctx.interactionModel) deps.triggerAlertingNotification(ctx.interactionModel);\n        }\n    };\n}\n\n/**\n * Shared step factory: updates the conversation mode's roster based on the\n * interaction model's active state. Active models are added/updated via\n * `setItem`. Any inactive model — including parked — is removed from the active\n * roster via `deleteItem` (mirrors legacy, where parked interactions are filtered\n * out of the active view). When the removed item is the committed roster selection,\n * the selection is cleared first so the main stage doesn't keep rendering it.\n */\nexport function updateRoster(deps: StepDependencies): { label: string; process: (ctx: any) => any } {\n    return {\n        label: 'updateRoster',\n        process(ctx: any) {\n            const { mode, rosterSelectionService } = deps;\n            if (!mode || !mode._isAlive()) return;\n\n            if (get(ctx.interactionModel, 'isInteractionActive')) {\n                mode.setItem(ctx.interactionModel);\n            } else {\n                const id = ctx.interactionModel.id || get(ctx.interactionModel, 'id');\n\n                if (id && rosterSelectionService.get('selection')?.id === id) {\n                    rosterSelectionService.select(mode.get('id'), null);\n                }\n\n                mode.deleteItem(id);\n            }\n        }\n    };\n}\n\n/**\n * Shared step factory: selects a newly created outbound interaction when it matches\n * a pending create request (from `conversationModeService.requestInteractionSelection`).\n *\n * Mirrors legacy ACD panel `requestedInteraction` + `processActiveRoutableChanges`: the\n * create API response stores a conversation id before the interaction reaches the roster;\n * once the model is active and on the roster, it becomes the committed selection via\n * `mode.selectItem` so roster-selection handlers (hold/unhold, main-stage promotion) run.\n *\n * Additionally detects outbound calls on their first realtime event (newInteraction +\n * isContacting + isOutbound) and proactively registers the selection. This handles the\n * race where the realtime notification arrives before the create API response has called\n * `requestInteractionSelection` — without this, the subsequent connected event would\n * trigger holdOnIntake before the pending selection is registered.\n *\n * Must run after `updateRoster` (so the item is in `allItems`) and before `holdOnIntake`\n * (so the enqueued selection is pending and intake hold skips this interaction).\n */\nexport function selectRequestedInteraction(deps: StepDependencies): { label: string; process: (ctx: any) => any } {\n    return {\n        label: 'selectRequestedInteraction',\n        process(ctx: any) {\n            const { mode, conversationModeService } = deps;\n            if (!mode || !mode._isAlive()) return;\n            if (!ctx.interactionModel || !get(ctx.interactionModel, 'isInteractionActive')) return;\n\n            const id = get(ctx.interactionModel, 'id');\n            if (!id) return;\n\n            // Standard path: consume a pending selection registered by the create API response.\n            if (conversationModeService.consumeRequestedInteractionSelection(id)) {\n                if (typeof mode.selectItem === 'function') {\n                    mode.selectItem(ctx.interactionModel);\n                }\n                return;\n            }\n\n            // Race-condition path: the realtime event for a new outbound call can potentially\n            // arrive before the create API response could call requestInteractionSelection. Detect this by\n            // checking that this is a brand-new outbound interaction in the contacting state\n            // and proactively register the selection so holdOnIntake skips it on the next\n            // (connected) event.\n            if (\n                ctx.newInteraction &&\n                get(ctx.interactionModel, 'conversation.isContacting') &&\n                get(ctx.interactionModel, 'conversation.isOutbound')\n            ) {\n                if (typeof mode.selectItem === 'function') {\n                    mode.selectItem(ctx.interactionModel);\n                }\n            }\n        }\n    };\n}\n\n/**\n * Shared step factory: enforces the single-unheld-interaction invariant as interactions\n * are intaken. A freshly added/updated roster item inherits whatever hold state the\n * platform reports, so a load can surface several unheld interactions at once. This step\n * holds every connected, non-alerting interaction on intake, leaving only the actively\n * selected (or just-answered) interaction unheld.\n *\n * Holds are dispatched fire-and-forget through the communication service for every\n * interaction type — failures are logged, never thrown, so a failed hold can never stall\n * the processing chain. The hold is skipped when the interaction:\n * - is not connected (the platform rejects holds on non-connected interactions),\n * - is alerting (it must stay answerable),\n * - is already held (avoids a redundant request),\n * - is the committed or pending roster selection (the agent is viewing it, or just\n *   answered it — answering enqueues a selection that unholds it),\n * - is a voice interaction while a digital interaction is selected (voice and digital\n *   can coexist unheld — hold is only enforced within the same media type),\n * - just transitioned from contacting/dialing to connected on an outbound call (the\n *   call is still being established — holding it would interrupt the connection), or\n * - is a new inbound ACD call with auto-answer enabled (the call was answered by the\n *   platform before selection could be registered).\n *\n * The latter two cases use `holdExemptIds` to persist protection across subsequent\n * events for the same interaction until another interaction is selected or the\n * interaction becomes inactive.\n */\nexport function holdOnIntake(deps: StepDependencies): { label: string; process: (ctx: any) => any } {\n    return {\n        label: 'holdOnIntake',\n        process(ctx: any) {\n            const { communicationService, rosterSelectionService, loggerService, sessionService, holdExemptIds } = deps;\n            const interaction = ctx.interactionModel;\n            if (!interaction) return;\n\n            const id = get(interaction, 'id');\n            if (!id) return;\n\n            if (!get(interaction, 'isConnected')) return;\n            if (get(interaction, 'isAlerting')) return;\n            if (get(interaction, 'isHeld')) return;\n            if (rosterSelectionService.isSelectedOrPendingSelection(id)) return;\n\n            // Skip hold for voice interactions when the selected interaction is digital.\n            // Voice and digital can coexist unheld — hold is only enforced when another\n            // call is selected (same media type).\n            const selection = rosterSelectionService.get('selection');\n            if (selection && get(interaction, 'isCall')) {\n                const selectedPayload = selection.payload;\n                if (selectedPayload && !get(selectedPayload, 'isCall')) {\n                    return;\n                }\n            }\n\n            // Skip hold for outbound calls that just transitioned from contacting/dialing\n            // to connected. Add the interaction to the hold-exempt set so subsequent events\n            // in the series are also protected. This covers the callback-to-call scenario\n            // where the interaction was not selected.\n            if (!holdExemptIds.has(id) && ctx.prevRaw && get(interaction, 'conversation.isOutbound')) {\n                const userId: string = get(sessionService.get('person'), 'guid');\n                const prevParticipant = (ctx.prevRaw.participants || []).filter((p: any) => p.userId === userId).pop();\n                const prevCallState = prevParticipant?.calls?.[0]?.state?.toLowerCase();\n                if (prevCallState === 'contacting' || prevCallState === 'dialing') {\n                    holdExemptIds.add(id);\n                    return;\n                }\n            }\n\n            // Skip hold for inbound ACD calls with auto-answer enabled. Multiple rapid\n            // realtime events can arrive before the selection state machine catches up.\n            // Detect via the agent participant's call communication transferSource === 'ACD'\n            // and queueMediaSettings.enableAutoAnswer.\n            if (!holdExemptIds.has(id)) {\n                const agentParticipant = get(interaction, 'participantForCurrentUser');\n                if (agentParticipant) {\n                    const transferSource = get(agentParticipant, 'calls.firstObject.transferSource') || '';\n                    if (\n                        transferSource.toUpperCase() === 'ACD' &&\n                        get(agentParticipant, 'calls.firstObject.queueMediaSettings.enableAutoAnswer')\n                    ) {\n                        holdExemptIds.add(id);\n                        return;\n                    }\n                }\n            }\n\n            // If the interaction is hold-exempt and nothing else is selected, skip hold.\n            // Once another interaction is selected, the exemption no longer applies — the\n            // user has engaged with a different interaction, so normal hold logic should\n            // take over. The ID is NOT removed from the set — it stays for the interaction's\n            // lifetime so the auto-answer detection doesn't re-fire on subsequent events.\n            // Cleanup removes it when the interaction becomes inactive.\n            if (holdExemptIds.has(id) && !rosterSelectionService.get('selection')) {\n                return;\n            }\n\n            communicationService.hold(interaction).catch((error: unknown) => {\n                loggerService.error('ConversationModeService: failed to hold interaction on intake', {\n                    remoteData: { error, id }\n                });\n            });\n        }\n    };\n}\n\n/**\n * Shared step factory: performs cleanup after a conversation ends.\n *\n * Mirrors legacy's two distinct teardown mechanisms:\n * - **Wrapup-gadget cleanup** (`cleanupAfterWrapupGadgetSubmit` + schedule-callback gadget\n *   storage) runs only for inactive, **non-parked** interactions — parking isn't a wrapup, so\n *   wrapup cleanup must be skipped (legacy gates this on `!isParked` in its chain cleanup step).\n * - **Listener teardown** (external-contact + customer-intent) runs for **any** inactive\n *   interaction, including parked (legacy does this in `_cleanUpOldEmails`/`_cleanUpOldSms`,\n *   which are not gated on `isParked`). On unpark, the chain re-registers listeners.\n */\nexport function cleanup(deps: StepDependencies): { label: string; process: (ctx: any) => any } {\n    return {\n        label: 'cleanup',\n        async process(ctx: any) {\n            const {\n                loggerService,\n                agentAssistChecksService,\n                communicationService,\n                externalContactsService,\n                customerIntentService,\n                contactObservers,\n                storageService,\n                rosterSelectionService,\n                holdExemptIds\n            } = deps;\n            const interactionId = get(ctx.interactionModel, 'id');\n            const isActive = get(ctx.interactionModel, 'isInteractionActive');\n            const isParked = get(ctx.interactionModel, 'isParked');\n\n            if (isActive) return;\n\n            // Clear hold exemption for this interaction now that it's inactive.\n            if (interactionId) {\n                holdExemptIds.delete(interactionId);\n            }\n\n            if (!isParked) {\n                try {\n                    const selectedId = rosterSelectionService.get('selection')?.id;\n                    await cleanupAfterWrapupGadgetSubmit({\n                        interaction: ctx.interactionModel,\n                        isSelectedInteraction: selectedId === interactionId,\n                        logger: loggerService,\n                        agentAssistChecksService,\n                        communicationService\n                    });\n                } catch (e) {\n                    loggerService.error('ConversationModeService: cleanup failed', {\n                        e,\n                        remoteData: { interactionId }\n                    });\n                }\n\n                // Schedule-callback gadget storage is only relevant to call/callback interactions\n                const isCallOrCallback = get(ctx.interactionModel, 'isCall') || get(ctx.interactionModel, 'isCallback');\n                if (interactionId && isCallOrCallback) {\n                    cleanupScheduleCallbackGadgetSessionStorage([interactionId], storageService);\n                }\n            }\n\n            // --- Listener teardown: runs for any inactive interaction, including parked ---\n            // (legacy _cleanUpOldEmails/_cleanUpOldSms strip listeners regardless of isParked).\n            const observer = contactObservers[interactionId];\n            if (observer) {\n                externalContactsService.removeContactChangeListenersForInteraction(ctx.interactionModel, observer);\n                contactObservers[interactionId] = undefined as any;\n            }\n            customerIntentService.removeCustomerIntentListenerForInteraction(ctx.interactionModel);\n        }\n    };\n}\n\nconst DEFAULT_ALERT_TIMEOUT_MS = 30000;\nconst MILLIS_IN_SECS = 1000;\n\n/**\n * Shared step: plays/stops the digital ringtone for email and message interactions\n * that arrive in alerting state (manual answer). (ACE-5496)\n *\n * - New interaction entering alerting (not auto-answer): starts the digital ringtone\n * - Existing interaction transitioning away from alerting: stops the digital ringtone\n *\n * Auto-answer interactions (initialState === 'connected') are handled by\n * `autoAnswerNotification` → `_playAutoAnswerTone` and never reach alerting state.\n *\n * Runs after `updateModelState` so the model's `isAlerting` property is synced.\n */\nexport function nonVoiceAlertingRingtone(deps: StepDependencies): { label: string; process: (ctx: any) => any } {\n    return {\n        label: 'nonVoiceAlertingRingtone',\n        process(ctx: any) {\n            const { interactionModel, newInteraction, eventSource } = ctx;\n            const { sessionService, ringService } = deps;\n\n            // Only act on realtime events — API hydration shouldn't trigger sounds\n            if (eventSource !== 'realtime') return;\n\n            // This step only handles manual-answer interactions. Auto-answer is owned\n            // by autoAnswerNotification → _playAutoAnswerTone. Bail early so we never\n            // interfere with the auto-answer tone on subsequent update events.\n            const type = get(interactionModel, 'type');\n            const COMM_KEY_MAP: Record<string, string> = {\n                email: 'emails',\n                message: 'messages',\n                callback: 'callbacks'\n            };\n            const commKey = COMM_KEY_MAP[type];\n            if (!commKey) return;\n\n            const initialState = get(interactionModel, `participantForCurrentUser.${commKey}.firstObject.initialState`);\n            if (initialState === 'connected') return;\n\n            const isAlerting: boolean = !!get(interactionModel, 'isAlerting');\n\n            // Stop the digital ringtone only on a genuine alerting → non-alerting transition for THIS\n            // interaction. Comparing against the previous snapshot (prevRaw) is essential: the digital\n            // ringtone is a single shared channel, so firing stopRingtone on every steady-state update\n            // to a connected interaction (which is always `!isAlerting && !newInteraction`) would\n            // silence a DIFFERENT interaction that is currently alerting. Mirrors the prev-vs-current\n            // approach in callAlertingRingtone.\n            const participantForCurrentUser = get(interactionModel, 'participantForCurrentUser');\n            const wasAlerting = wasCommunicationAlertingInPreviousEvent(\n                ctx.prevRaw,\n                participantForCurrentUser,\n                commKey\n            );\n\n            // wasAlerting is derived from prevRaw, which is null for new interactions, so it already\n            // implies !newInteraction — no separate new-interaction guard needed.\n            if (wasAlerting && !isAlerting) {\n                ringService.stopRingtone('digital');\n                return;\n            }\n\n            // Only start ringing on a fresh alerting interaction\n            if (!isAlerting) return;\n            if (!newInteraction) return; // already ringing from initial event\n\n            // Determine ring timeout\n            const ftAcdRingTimeout: boolean = !!sessionService.get('features')?.['assignment.audioAlertDuration'];\n            const conversationId = get(interactionModel, 'id');\n            let alertTimeout: number = DEFAULT_ALERT_TIMEOUT_MS;\n\n            if (ftAcdRingTimeout) {\n                const queueMediaSettings = getQueueMediaSettings(interactionModel);\n                const manualRingTime = queueMediaSettings?.manualAnswerAlertToneSeconds;\n\n                if (manualRingTime != null && manualRingTime >= 0) {\n                    alertTimeout = manualRingTime * MILLIS_IN_SECS;\n                }\n\n                // Ring time explicitly 0 → silent\n                if (alertTimeout === 0) return;\n            } else {\n                // Fallback: alertingTimeoutMs from the participant\n                const participantTimeout = get(interactionModel, 'participantForCurrentUser.alertingTimeoutMs');\n                if (participantTimeout) {\n                    alertTimeout = participantTimeout;\n                }\n            }\n\n            ringService.playRingtone(conversationId, false, alertTimeout, false, 'digital');\n        }\n    };\n}\n","import { get, set } from '@ember/object';\nimport type { Workitem, WorkitemApi, WorkitemInteraction } from '@genesys/genesys-cloud-conversation-utils';\nimport { convertApiWorkitem, createWorkitemInteraction } from '@genesys/genesys-cloud-conversation-utils';\nimport type { WorkitemChainContext, WorkitemEventSource, WorkitemStepDependencies } from '../workitem-mode-service';\nimport { WORKITEM_ACTIVE_STATES, WORKITEM_INACTIVE_STATES } from '../workitem-mode-service';\n\n/**\n * Step 1: Convert raw workitem payload to a WorkitemInteraction model.\n * API payloads use `convertApiWorkitem` first; realtime event payloads are already in Workitem shape.\n */\nexport function workitemConvert(_deps: WorkitemStepDependencies) {\n    return {\n        label: 'workitemConvert',\n        process({ eventSource, payload }: { eventSource: WorkitemEventSource; payload: any }) {\n            if (!payload || !payload.id) {\n                return false;\n            }\n\n            const workitem: Workitem = eventSource === 'api' ? convertApiWorkitem(payload as WorkitemApi) : payload;\n            const workitemInteraction = createWorkitemInteraction(workitem);\n\n            return {\n                eventSource,\n                payload,\n                workitemInteraction,\n                currentWorkitemInteraction: null,\n                currentLocation: null\n            };\n        }\n    };\n}\n\n/**\n * Step 2: Find existing workitem in either mode's roster, or prepare a new one.\n * For new workitems: fetches details for realtime events, expands details.\n * For existing workitems: merges updated workitem data and refreshes status if changed.\n */\nexport function workitemStoreMerge(deps: WorkitemStepDependencies) {\n    return {\n        label: 'workitemStoreMerge',\n        async process(ctx: WorkitemChainContext) {\n            if (!ctx.workitemInteraction) {\n                return false;\n            }\n\n            const { activeMode, getInactiveMode, workitemModeService, loggerService } = deps;\n            const inactiveMode = getInactiveMode();\n            const workitemId = ctx.workitemInteraction.id;\n\n            // Look in both modes for existing workitem\n            let currentWorkitemInteraction: WorkitemInteraction | undefined;\n            let currentLocation: 'active' | 'inactive' | null = null;\n\n            const activeItems: Map<string, any> = get(activeMode, 'allItems');\n            if (activeItems?.has(workitemId)) {\n                currentWorkitemInteraction = activeItems.get(workitemId);\n                currentLocation = 'active';\n            }\n\n            if (!currentWorkitemInteraction && inactiveMode) {\n                const inactiveItems: Map<string, any> = get(inactiveMode, 'allItems');\n                if (inactiveItems?.has(workitemId)) {\n                    currentWorkitemInteraction = inactiveItems.get(workitemId);\n                    currentLocation = 'inactive';\n                }\n            }\n\n            if (!currentWorkitemInteraction) {\n                // New workitem — for realtime events, fetch full details (event payloads are sparse)\n                if (ctx.eventSource === 'realtime') {\n                    try {\n                        const workitemDetails = await workitemModeService.getWorkitemById(workitemId);\n                        ctx.workitemInteraction.workitem = {\n                            ...ctx.workitemInteraction.workitem,\n                            ...workitemDetails\n                        };\n                    } catch (error) {\n                        loggerService.warn(\n                            'WorkitemModeService: Failed to load workitem details for new realtime workitem',\n                            { remoteData: { workitemId } }\n                        );\n                    }\n                }\n\n                // Expand details (schema, status, workbin, worktype)\n                await workitemModeService.expandWorkitemInteractionDetails(ctx.workitemInteraction);\n                currentWorkitemInteraction = ctx.workitemInteraction;\n            } else {\n                // Existing workitem — check if status changed and refresh if needed\n                if (currentWorkitemInteraction.workitem.statusId !== ctx.workitemInteraction.workitem.statusId) {\n                    try {\n                        const updatedWorkitem = await workitemModeService.getWorkitemById(workitemId);\n                        set(currentWorkitemInteraction as any, 'data.status', updatedWorkitem.status);\n                        set(currentWorkitemInteraction as any, 'workitem.statusId', updatedWorkitem.status.id);\n                    } catch (error) {\n                        loggerService.warn('WorkitemModeService: Failed to refresh workitem status', {\n                            remoteData: { workitemId }\n                        });\n                    }\n                }\n\n                // Merge workitem data\n                set(currentWorkitemInteraction as any, 'workitem', ctx.workitemInteraction.workitem);\n            }\n\n            ctx.currentWorkitemInteraction = currentWorkitemInteraction;\n            ctx.currentLocation = currentLocation;\n            return ctx;\n        }\n    };\n}\n\n/**\n * Step 3: Detect auto-answered workitems (AcdStarted → Connected, skipping Alerting).\n */\nexport function workitemAutoAnswer(deps: WorkitemStepDependencies) {\n    return {\n        label: 'workitemAutoAnswer',\n        process(ctx: WorkitemChainContext) {\n            if (!ctx.workitemInteraction) return;\n\n            const { changes }: any = ctx.workitemInteraction.workitem;\n            const assignmentStateChange = changes?.find((change: any) => change.field === 'assignmentState');\n\n            if (assignmentStateChange) {\n                const { oldValue, newValue } = assignmentStateChange;\n                if (oldValue === 'AcdStarted' && newValue === 'Connected') {\n                    deps.triggerAutoAnswer(ctx.workitemInteraction, 'workitem');\n                }\n            }\n        }\n    };\n}\n\n/**\n * Step 4: Update external contact listeners when externalContactId changes.\n * Mirrors legacy acdworkitem \"Update Interaction External Contact\" step.\n */\nexport function workitemExternalContact(deps: WorkitemStepDependencies) {\n    return {\n        label: 'workitemExternalContact',\n        async process(ctx: WorkitemChainContext) {\n            if (!ctx.workitemInteraction || !ctx.currentWorkitemInteraction) return;\n\n            const { externalContactsService, contactObservers, loggerService } = deps;\n            const { changes }: any = ctx.workitemInteraction.workitem;\n            const contactStateChange = changes?.find((change: any) => change.field === 'externalContactId');\n\n            if (!contactStateChange) return;\n\n            const { oldValue, newValue } = contactStateChange;\n            if (oldValue === newValue) return;\n\n            const externalContactId = ctx.workitemInteraction.customer?.externalContactId;\n            const callback = contactObservers[ctx.workitemInteraction.id] || function () {};\n\n            try {\n                set(ctx.currentWorkitemInteraction as any, 'customer', ctx.workitemInteraction.customer);\n                await externalContactsService.addContactChangeListener(externalContactId, callback);\n            } catch (error) {\n                loggerService.error(\n                    'WorkitemModeService: Failed to add external contact change listener for workitem',\n                    { error, remoteData: { externalContactId } }\n                );\n                externalContactsService.removeContactChangeListenersForInteraction(externalContactId, callback);\n                contactObservers[ctx.workitemInteraction.id] = undefined as any;\n            }\n        }\n    };\n}\n\n/**\n * Step 5: Add/update customer intent listener for the workitem.\n * Mirrors legacy acdworkitem \"Customer Intent\" step.\n */\nexport function workitemCustomerIntent(deps: WorkitemStepDependencies) {\n    return {\n        label: 'workitemCustomerIntent',\n        async process(ctx: WorkitemChainContext) {\n            if (!ctx.workitemInteraction?.customer?.externalContactId || !ctx.currentWorkitemInteraction) return;\n\n            const { customerIntentService, loggerService } = deps;\n            try {\n                await customerIntentService.addCustomerIntentListenerForWorkitem(\n                    ctx.workitemInteraction,\n                    ctx.currentWorkitemInteraction\n                );\n            } catch (error) {\n                loggerService.error('WorkitemModeService: Failed to add customer intent listener for workitem', {\n                    error,\n                    remoteData: { workitemId: ctx.workitemInteraction.id }\n                });\n                customerIntentService.removeCustomerIntentListenerForInteraction(ctx.currentWorkitemInteraction);\n            }\n        }\n    };\n}\n\n/**\n * Step 6: Notify user when a workitem is disconnected/terminated by another user.\n */\nexport function workitemDisconnectNotification(deps: WorkitemStepDependencies) {\n    return {\n        label: 'workitemDisconnectNotification',\n        process(ctx: WorkitemChainContext) {\n            if (!ctx.workitemInteraction) return;\n\n            const { assigneeId, modifiedBy, changes }: any = ctx.workitemInteraction.workitem;\n\n            const stateFromConnectedToDisconnected = changes?.find(\n                (change: any) =>\n                    change.field === 'assignmentState' &&\n                    change.oldValue === 'Connected' &&\n                    (change.newValue === 'Disconnected' || change.newValue === 'Terminated')\n            );\n\n            if (stateFromConnectedToDisconnected && modifiedBy !== assigneeId) {\n                const { notificationService, intlService } = deps;\n                notificationService.info(\n                    null,\n                    intlService.t('purecloud.acdInteraction.workitem.notification.workitemDisconnected')\n                );\n            }\n        }\n    };\n}\n\n/**\n * Step 7: Route workitem to the correct mode roster based on assignment state.\n * Handles transitions between modes (active ↔ inactive).\n */\nexport function workitemUpdateRoster(deps: WorkitemStepDependencies) {\n    return {\n        label: 'workitemUpdateRoster',\n        process(ctx: WorkitemChainContext) {\n            if (!ctx.currentWorkitemInteraction) return;\n\n            const { activeMode, getInactiveMode, rosterSelectionService } = deps;\n            const inactiveMode = getInactiveMode();\n            if (!activeMode || !activeMode._isAlive()) return;\n\n            const state = ctx.currentWorkitemInteraction.workitem.assignmentState;\n            const isActive = WORKITEM_ACTIVE_STATES.includes(state);\n            const isInactive = WORKITEM_INACTIVE_STATES.includes(state);\n\n            if (isActive) {\n                // Should be in active mode\n                if (ctx.currentLocation === 'inactive' && inactiveMode?._isAlive()) {\n                    const selection = rosterSelectionService.get('selection');\n\n                    if (\n                        selection?.modeId === inactiveMode.get('id') &&\n                        selection?.id === ctx.currentWorkitemInteraction.id\n                    ) {\n                        // Clear selection if this workitem is currently selected in inactive mode\n                        rosterSelectionService.select(inactiveMode.get('id'), null);\n                    }\n\n                    inactiveMode.deleteItem(ctx.currentWorkitemInteraction.id);\n                }\n\n                activeMode.setItem(ctx.currentWorkitemInteraction);\n            } else if (isInactive) {\n                // Should be in inactive mode\n                if (ctx.currentLocation === 'active') {\n                    // Clear selection if this workitem is currently selected\n                    const selection = rosterSelectionService.get('selection');\n\n                    if (\n                        selection?.modeId === activeMode.get('id') &&\n                        selection?.id === ctx.currentWorkitemInteraction.id\n                    ) {\n                        rosterSelectionService.select(activeMode.get('id'), null);\n                    }\n\n                    activeMode.deleteItem(ctx.currentWorkitemInteraction.id);\n                }\n\n                if (inactiveMode?._isAlive()) {\n                    inactiveMode.setItem(ctx.currentWorkitemInteraction);\n                }\n            } else {\n                // Unknown/terminal state — remove from both\n                if (ctx.currentLocation === 'active') {\n                    const selection = rosterSelectionService.get('selection');\n\n                    if (\n                        selection?.modeId === activeMode.get('id') &&\n                        selection?.id === ctx.currentWorkitemInteraction.id\n                    ) {\n                        rosterSelectionService.select(activeMode.get('id'), null);\n                    }\n\n                    activeMode.deleteItem(ctx.currentWorkitemInteraction.id);\n                } else if (ctx.currentLocation === 'inactive' && inactiveMode?._isAlive()) {\n                    inactiveMode.deleteItem(ctx.currentWorkitemInteraction.id);\n                }\n            }\n        }\n    };\n}\n\n/**\n * Step 8: Auto-select a workitem that transitions Held → Connected via a realtime event\n * when nothing is currently selected.\n *\n * This handles the multi-client scenario: when another tab/client unholds a workitem\n * (because it was selected there), this tab receives the Connected event. Without a\n * local selection, `holdWorkitemOnIntake` would immediately re-hold it — undoing the\n * other client's action and causing the buttons to disappear.\n *\n * By auto-selecting the workitem here, `holdWorkitemOnIntake` (which runs next) sees it\n * as the active selection and skips the hold. This keeps both tabs in sync.\n *\n * Conditions for auto-selection:\n * - The event is from realtime (not an API fetch on boot)\n * - The workitem transitioned from Held → Connected (an explicit unhold, not initial load)\n * - Nothing is currently selected or pending in this client\n *\n * Must run after `workitemUpdateRoster` (so the item is in `allItems`) and before\n * `holdWorkitemOnIntake` (so the enqueued selection is pending and intake hold skips it).\n */\nexport function selectUnheldWorkitem(deps: WorkitemStepDependencies) {\n    return {\n        label: 'selectUnheldWorkitem',\n        process(ctx: WorkitemChainContext) {\n            if (!ctx.currentWorkitemInteraction) return;\n            if (ctx.eventSource !== 'realtime') return;\n\n            const { changes }: any = ctx.workitemInteraction.workitem;\n            const assignmentStateChange = changes?.find(\n                (change: any) =>\n                    change.field === 'assignmentState' && change.oldValue === 'Held' && change.newValue === 'Connected'\n            );\n\n            if (!assignmentStateChange) return;\n\n            const { activeMode, rosterSelectionService } = deps;\n            if (!activeMode || !activeMode._isAlive()) return;\n\n            // Auto-select if nothing is selected, or if a different workitem is selected.\n            // This keeps tabs in sync — the unheld workitem is always the \"active\" one\n            // across all clients regardless of local selection state.\n            const currentSelection = rosterSelectionService.get('selection');\n            if (currentSelection?.id === ctx.currentWorkitemInteraction.id) return;\n\n            if (typeof activeMode.selectItem === 'function') {\n                activeMode.selectItem(ctx.currentWorkitemInteraction);\n            }\n        }\n    };\n}\n\n/**\n * Step 9: Enforce the single-unheld-interaction invariant as workitems are intaken.\n *\n * A workitem added/updated in the active roster keeps whatever assignment state the\n * platform reports, so a fresh load can surface several connected (unheld) workitems\n * at once. This step holds every connected workitem on intake, leaving only the actively\n * selected (or just-answered) workitem unheld. Mirrors the conversation `holdOnIntake`\n * step, but a workitem's hold state is its assignment state, so the hold is driven\n * through task management (`Connected` → `Held`) rather than the communication service.\n *\n * The hold is awaited so the local model is updated immediately on success, preventing a\n * race where the user selects the workitem before the pigeon event round-trips. Failures\n * are logged but never thrown, so a failed hold can never stall the processing chain.\n * The hold is skipped when the workitem:\n * - is not `connected` (alerting/held/parked/disconnected/etc. must be left untouched —\n *   `connected` is the only active, unheld agent state), or\n * - is the committed or pending roster selection (the agent is viewing it, or just\n *   answered it — answering enqueues a selection that unholds it).\n */\nexport function holdWorkitemOnIntake(deps: WorkitemStepDependencies) {\n    return {\n        label: 'holdWorkitemOnIntake',\n        async process(ctx: WorkitemChainContext) {\n            const workitemInteraction = ctx.currentWorkitemInteraction;\n            if (!workitemInteraction) return;\n\n            const id = workitemInteraction.id;\n            if (!id) return;\n\n            if (workitemInteraction.workitem?.state.toLowerCase() !== 'connected') return;\n\n            const { rosterSelectionService, taskManagementService, loggerService } = deps;\n            if (rosterSelectionService.isSelectedOrPendingSelection(id)) return;\n\n            try {\n                await taskManagementService.holdWorkitemInteraction(workitemInteraction);\n            } catch (error: unknown) {\n                loggerService.error('WorkitemModeService: failed to hold workitem on intake', {\n                    error,\n                    remoteData: { workitemId: id }\n                });\n            }\n        }\n    };\n}\n\n/**\n * Step 10: Cleanup — remove external contact and customer intent listeners for\n * workitems leaving both rosters (terminal states).\n */\nexport function workitemCleanup(deps: WorkitemStepDependencies) {\n    return {\n        label: 'workitemCleanup',\n        process(ctx: WorkitemChainContext) {\n            if (!ctx.currentWorkitemInteraction) return;\n\n            const state = ctx.currentWorkitemInteraction.workitem.assignmentState;\n\n            // Only cleanup listeners for workitems not in either roster\n            if (WORKITEM_ACTIVE_STATES.includes(state) || WORKITEM_INACTIVE_STATES.includes(state)) return;\n\n            const { externalContactsService, customerIntentService, contactObservers } = deps;\n            const workitemId = ctx.currentWorkitemInteraction.id;\n\n            // Remove external contact listeners\n            const observer = contactObservers[workitemId];\n            if (observer) {\n                externalContactsService.removeContactChangeListenersForInteraction(workitemId, observer);\n                contactObservers[workitemId] = undefined as any;\n            }\n\n            // Remove customer intent listener\n            customerIntentService.removeCustomerIntentListenerForInteraction(ctx.currentWorkitemInteraction);\n        }\n    };\n}\n\nconst DEFAULT_ALERT_TIMEOUT_MS = 30000;\nconst MILLIS_IN_SECS = 1000;\n\n/**\n * Workitem alerting ringtone step: plays/stops the digital ringtone for workitems\n * arriving in Alerting assignmentState (manual answer). (ACE-5496)\n *\n * Auto-answered workitems (AcdStarted → Connected, skipping Alerting) are handled\n * by `workitemAutoAnswer` → `_playAutoAnswerTone`. This step bails early for those.\n *\n * Runs after `workitemAutoAnswer` so auto-answer detection has already fired.\n */\nexport function workitemAlertingRingtone(deps: WorkitemStepDependencies) {\n    return {\n        label: 'workitemAlertingRingtone',\n        process(ctx: WorkitemChainContext) {\n            if (!ctx.currentWorkitemInteraction) return;\n\n            const { ringService, sessionService } = deps;\n            const workitem = ctx.currentWorkitemInteraction.workitem;\n            const assignmentState = workitem?.assignmentState;\n\n            // Auto-answered workitems skip Alerting entirely (AcdStarted → Connected).\n            // If assignmentState was never 'Alerting', this step has nothing to do.\n            // Also bail for any state that isn't Alerting or a transition away from it.\n            const isAlerting = assignmentState === 'Alerting';\n\n            // Detect transition away from alerting via changes array\n            const { changes }: any = workitem;\n            const stateChange = changes?.find((c: any) => c.field === 'assignmentState');\n            const wasAlerting = stateChange?.oldValue === 'Alerting';\n\n            // Transition away from alerting → stop the digital ringtone\n            if (!isAlerting && wasAlerting) {\n                ringService.stopRingtone('digital');\n                return;\n            }\n\n            // Only start ringing when entering alerting state\n            if (!isAlerting) return;\n\n            // Only ring on the first event for this workitem (new to roster)\n            if (ctx.currentLocation !== null && !stateChange) return;\n\n            // Determine ring timeout\n            const ftAcdRingTimeout: boolean = !!sessionService.get('features')?.['assignment.audioAlertDuration'];\n            const workitemId = ctx.currentWorkitemInteraction.id;\n            let alertTimeout: number = DEFAULT_ALERT_TIMEOUT_MS;\n\n            if (ftAcdRingTimeout) {\n                // alertTimeoutSeconds is on the workitem payload when available\n                const alertTimeoutSeconds = workitem?.alertTimeoutSeconds;\n                if (alertTimeoutSeconds != null && alertTimeoutSeconds >= 0) {\n                    alertTimeout = alertTimeoutSeconds * MILLIS_IN_SECS;\n                }\n                if (alertTimeout === 0) return;\n            } else {\n                const alertTimeoutSeconds = workitem?.alertTimeoutSeconds;\n                if (alertTimeoutSeconds) {\n                    alertTimeout = alertTimeoutSeconds * MILLIS_IN_SECS;\n                }\n            }\n\n            ringService.playRingtone(workitemId, false, alertTimeout, false, 'digital');\n        }\n    };\n}\n","import { get } from '@ember/object';\nimport Service, { inject } from '@ember/service';\nimport type { WorkitemApi, WorkitemInteraction } from '@genesys/genesys-cloud-conversation-utils';\nimport ConversationMixin from 'web-directory/mixins/conversation';\nimport QueuedProcessingChain from 'web-directory/utils/queued-processing-chain';\nimport type {\n    CreateWorkitemPayload,\n    StatusOption,\n    TaskManagementQueryResponse,\n    WorkbinOption,\n    WorktypeOption\n} from 'web-directory/utils/workitem-create';\nimport {\n    holdWorkitemOnIntake,\n    selectUnheldWorkitem,\n    workitemAlertingRingtone,\n    workitemAutoAnswer,\n    workitemCleanup,\n    workitemConvert,\n    workitemCustomerIntent,\n    workitemDisconnectNotification,\n    workitemExternalContact,\n    workitemStoreMerge,\n    workitemUpdateRoster\n} from './utils/workitem-processing-steps';\n\nconst BASE_URI_V2 = 'api/v2/taskmanagement';\n\n/** Active workitem states — shown in the Active mode roster. */\nexport const WORKITEM_ACTIVE_STATES = ['Alerting', 'Connected', 'Held'];\n\n/** Inactive workitem states — shown in the Inactive mode roster. */\nexport const WORKITEM_INACTIVE_STATES = ['Parked', 'Disconnected', 'Idle', 'Declined'];\n\n/** Page size used when paging through task management query endpoints for the outbound dropdowns. */\nexport const TASK_MANAGEMENT_QUERY_PAGE_SIZE = 100;\n\n/** Safety cap on query pages to avoid runaway pagination on very large orgs. */\nexport const TASK_MANAGEMENT_QUERY_MAX_PAGES = 20;\n\n/** Event source for workitem payloads. */\nexport type WorkitemEventSource = 'realtime' | 'api';\n\n/** Options passed to `processEvent`. */\nexport interface WorkitemProcessEventOptions {\n    payload: any;\n    eventSource: WorkitemEventSource;\n}\n\n/**\n * Context passed between workitem processing chain steps.\n */\nexport interface WorkitemChainContext {\n    eventSource: WorkitemEventSource;\n    payload: any;\n    workitemInteraction: WorkitemInteraction;\n    /** The existing workitem interaction found in either mode's roster (if any). */\n    currentWorkitemInteraction: WorkitemInteraction | null;\n    /** Which mode currently holds this workitem ('active' | 'inactive' | null for new). */\n    currentLocation: 'active' | 'inactive' | null;\n}\n\n/**\n * Dependencies injected into workitem processing steps. The `getInactiveMode` getter\n * reads dynamically from the service at step execution time, allowing the inactive\n * mode to register after chain creation.\n */\nexport interface WorkitemStepDependencies {\n    workitemModeService: any;\n    activeMode: any;\n    getInactiveMode: () => any;\n    rosterSelectionService: any;\n    taskManagementService: any;\n    loggerService: any;\n    notificationService: any;\n    intlService: any;\n    externalContactsService: any;\n    customerIntentService: any;\n    contactObservers: Record<string, Function>;\n    triggerAutoAnswer: (model: any, type: string, subType?: string) => void;\n    ringService: any;\n    sessionService: any;\n}\n\nexport default Service.extend(ConversationMixin, {\n    sessionService: inject('session'),\n    applicationService: inject('application'),\n    taskManagementService: inject('task-management'),\n    rosterSelectionService: inject('modes/roster-selection-service'),\n    loggerService: inject('stash-logger'),\n    notificationService: inject('notification'),\n    intlService: inject('intl'),\n    externalContactsService: inject('external-contacts'),\n    customerIntentService: inject('customer-intent'),\n    ringService: inject('ring'),\n\n    /** Reference to the active mode instance. */\n    _activeMode: null as any,\n\n    /** Reference to the inactive mode instance. */\n    _inactiveMode: null as any,\n\n    /** The single workitem processing chain. */\n    _processingChain: null as any,\n\n    /** Per-workitem external contact observer callbacks. */\n    _contactObservers: null as Record<string, Function> | null,\n\n    /** Whether the service has been initialized with the active mode. */\n    _initialized: false,\n\n    baseUri(): string {\n        const applicationService = this.get('applicationService');\n        return applicationService.pcV2Uri(BASE_URI_V2);\n    },\n\n    /**\n     * Initializes the workitem processing chain. Called by the active mode during init.\n     * The inactive mode registers itself separately via `registerInactiveMode`.\n     *\n     * @param activeMode - The active mode instance (conversations + active workitems).\n     * @param options.triggerAutoAnswer - Callback for auto-answer notifications (provided by conversation-mode-service).\n     */\n    initialize(activeMode: any, options: { triggerAutoAnswer: (model: any, type: string, subType?: string) => void }) {\n        if (this.get('_initialized') || !this.get('sessionService').get('useModes')) return;\n\n        this.set('_activeMode', activeMode);\n        this.set('_contactObservers', {});\n        this.set('_initialized', true);\n\n        const deps: WorkitemStepDependencies = {\n            workitemModeService: this,\n            activeMode,\n            getInactiveMode: () => this.get('_inactiveMode'),\n            rosterSelectionService: this.get('rosterSelectionService'),\n            taskManagementService: this.get('taskManagementService'),\n            loggerService: this.get('loggerService'),\n            notificationService: this.get('notificationService'),\n            intlService: this.get('intlService'),\n            externalContactsService: this.get('externalContactsService'),\n            customerIntentService: this.get('customerIntentService'),\n            contactObservers: this.get('_contactObservers') as Record<string, Function>,\n            triggerAutoAnswer: options.triggerAutoAnswer,\n            ringService: this.get('ringService'),\n            sessionService: this.get('sessionService')\n        };\n\n        const chain = QueuedProcessingChain.create({\n            // @ts-expect-error -> unable to provide a valid type for the processing chain\n            lifecycleContainer: this,\n            // @ts-expect-error -> unable to provide a valid type for the processing chain\n            label: 'workitem-processing-chain'\n        });\n\n        chain.setProcessingChain([\n            workitemConvert(deps),\n            workitemStoreMerge(deps),\n            workitemAutoAnswer(deps),\n            workitemAlertingRingtone(deps),\n            workitemExternalContact(deps),\n            workitemCustomerIntent(deps),\n            workitemDisconnectNotification(deps),\n            workitemUpdateRoster(deps),\n            selectUnheldWorkitem(deps),\n            holdWorkitemOnIntake(deps),\n            workitemCleanup(deps)\n        ]);\n\n        this.set('_processingChain', chain);\n    },\n\n    /**\n     * Registers the inactive mode with the service. Called by the inactive mode\n     * during its init. The chain steps use `getInactiveMode()` to access it\n     * dynamically, so registration order doesn't matter.\n     */\n    registerInactiveMode(inactiveMode: any) {\n        this.set('_inactiveMode', inactiveMode);\n    },\n\n    /**\n     * Clears the inactive mode reference when the inactive mode instance is destroyed\n     * (e.g. permission revoked). The chain steps treat a missing inactive mode safely.\n     */\n    unregisterInactiveMode(inactiveMode: any) {\n        if (this.get('_inactiveMode') === inactiveMode) {\n            this.set('_inactiveMode', null);\n        }\n    },\n\n    /**\n     * Enqueues a workitem event for processing. Called by both modes when they\n     * receive workitem events from pigeon.\n     */\n    processEvent(options: WorkitemProcessEventOptions) {\n        const chain = this.get('_processingChain');\n        if (!chain) {\n            this.get('loggerService').warn('WorkitemModeService: processing chain not initialized, skipping event', {\n                remoteData: { workitemId: options.payload?.id }\n            });\n            return;\n        }\n\n        const id = options.payload?.id;\n        if (!id) return;\n\n        chain.enqueueEvent(id, {\n            eventSource: options.eventSource,\n            payload: options.payload\n        });\n    },\n\n    /**\n     * Destroys the processing chain and clears state. Called from the active mode's willDestroy.\n     */\n    teardown() {\n        const chain = this.get('_processingChain');\n        if (chain) {\n            chain.destroy();\n            this.set('_processingChain', null);\n        }\n\n        this.set('_activeMode', null);\n        this.set('_inactiveMode', null);\n        this.set('_contactObservers', null);\n        this.set('_initialized', false);\n    },\n\n    // --- Answer / Decline ---\n\n    /**\n     * Accepts an alerting workitem by transitioning its assignment state to `Connected`\n     * through task management.\n     *\n     * @param workitem - The alerting workitem interaction from the active roster.\n     * @returns A promise that resolves once the assignment-state change settles.\n     */\n    async answer(workitem: WorkitemInteraction): Promise<unknown> {\n        if (!workitem) return;\n        try {\n            return await this.get('taskManagementService').acceptWorkitemInteraction(workitem);\n        } catch (e) {\n            this.get('loggerService').error('WorkitemModeService: failed to accept workitem', {\n                workitemId: workitem.id,\n                error: e\n            });\n            throw e;\n        }\n    },\n\n    /**\n     * Declines an alerting workitem by transitioning its assignment state to `Declined` through\n     * task management, routing it to another agent.\n     *\n     * @param workitem - The alerting workitem interaction from the active roster.\n     * @returns A promise that resolves once the assignment-state change settles.\n     */\n    async decline(workitem: WorkitemInteraction): Promise<unknown> {\n        if (!workitem) return;\n        try {\n            return await this.get('taskManagementService').declineWorkitemInteraction(workitem);\n        } catch (e) {\n            this.get('loggerService').error('WorkitemModeService: failed to decline workitem', {\n                workitemId: workitem.id,\n                error: e\n            });\n            throw e;\n        }\n    },\n\n    /**\n     * Returns an inactive workitem to active mode by transitioning its assignment state\n     * directly to Connected. This skips the alerting state so the workitem appears\n     * immediately in the active roster as a connected interaction.\n     *\n     * @param workitem - The inactive workitem interaction to return.\n     * @returns A promise that resolves on success, rejects on failure.\n     */\n    returnToActiveMode(workitem: WorkitemInteraction): Promise<unknown> {\n        if (!workitem) return Promise.resolve();\n        return this.get('taskManagementService').changeAssignmentState(workitem, 'Connected');\n    },\n\n    // --- Data fetching ---\n\n    /**\n     * Fetches workitems for the current user filtered by assignment states.\n     */\n    async fetchByAssignmentStates(states: string[]): Promise<WorkitemApi[]> {\n        const sessionService = this.get('sessionService');\n        if (!sessionService) return [];\n        const userId = get(sessionService, 'person.guid' as any);\n\n        const url = this.baseUri() + '/workitems/query';\n        const options = {\n            method: 'post',\n            data: {\n                filters: [\n                    {\n                        name: 'assigneeId',\n                        type: 'String',\n                        operator: 'EQ',\n                        values: [userId]\n                    },\n                    {\n                        name: 'assignmentState',\n                        type: 'String',\n                        operator: 'IN',\n                        values: states\n                    }\n                ],\n                expands: ['type', 'workbin', 'status']\n            }\n        };\n\n        const response: { entities: WorkitemApi[] } = await this.makeRequest(url, options, 'post');\n        return response.entities.filter(w => w && w.id);\n    },\n\n    /**\n     * Fetches active workitems (Alerting, Connected, Held) for the Active mode.\n     */\n    async fetchActive(): Promise<WorkitemApi[]> {\n        return this.fetchByAssignmentStates(WORKITEM_ACTIVE_STATES);\n    },\n\n    /**\n     * Fetches inactive workitems (Parked, Disconnected, Idle, Declined) for the Inactive mode.\n     */\n    async fetchInactive(): Promise<WorkitemApi[]> {\n        return this.fetchByAssignmentStates(WORKITEM_INACTIVE_STATES);\n    },\n\n    /**\n     * Safely expands workitem interaction details (status, workbin, worktype, schema).\n     */\n    async expandWorkitemInteractionDetails(workitemInteraction: WorkitemInteraction): Promise<void> {\n        const workitem: any = workitemInteraction.workitem;\n\n        workitemInteraction.data = {\n            status: workitem.status ? { ...workitem.status } : { id: workitem.statusId },\n            workbin: workitem.workbin ? { ...workitem.workbin } : { id: workitem.workbinId },\n            worktype: workitem.type ? { ...workitem.type } : { id: workitem.typeId },\n            schema: workitem.schema\n                ? { ...workitem.schema }\n                : { id: workitem.schemaId, version: workitem.schemaVersion }\n        };\n\n        const schemaId = workitem.schema?.id || workitem.schemaId;\n        const schemaVersion = workitem.schema?.version || workitem.schemaVersion;\n\n        if (schemaId && schemaVersion) {\n            try {\n                workitemInteraction.data.schema = await this.get('taskManagementService').getSchemaById(\n                    schemaId,\n                    schemaVersion\n                );\n            } catch (error) {\n                this.get('loggerService').warn('WorkitemModeService: Failed to load workitem schema details.', {\n                    remoteData: { workitemId: workitemInteraction.id }\n                });\n            }\n        }\n    },\n\n    /**\n     * Fetches full workitem details by ID.\n     */\n    async getWorkitemById(workitemId: string): Promise<any> {\n        return this.get('taskManagementService').getWorkitemById(workitemId);\n    },\n\n    /**\n     * Pages through a cursor-paginated task management query endpoint, following the\n     * `after` cursor. Bounded by {@link TASK_MANAGEMENT_QUERY_MAX_PAGES} so a very large\n     * org can't spawn unbounded requests. Entities without an id are skipped and a\n     * missing name falls back to the id.\n     *\n     * @param query - A bound task management query method accepting `{ pageSize, after }`.\n     * @returns All collected options (`{ id, name }`).\n     */\n    async _fetchAllQueryOptions(\n        query: (request: { pageSize: number; after?: string }) => Promise<TaskManagementQueryResponse>\n    ): Promise<Array<{ id: string; name: string }>> {\n        const options: Array<{ id: string; name: string }> = [];\n        let after: string | undefined;\n\n        for (let page = 0; page < TASK_MANAGEMENT_QUERY_MAX_PAGES; page++) {\n            const response: TaskManagementQueryResponse = await query({\n                pageSize: TASK_MANAGEMENT_QUERY_PAGE_SIZE,\n                after\n            });\n\n            const entities = response?.entities ?? [];\n            for (const entity of entities) {\n                if (entity?.id) {\n                    options.push({ id: entity.id, name: entity.name || entity.id });\n                }\n            }\n\n            after = response?.after;\n            if (!after || entities.length === 0) break;\n        }\n\n        return options;\n    },\n\n    /**\n     * Fetches all workbins available for outbound workitem creation. Failures are\n     * logged and rethrown so the caller can surface a load error.\n     *\n     * @returns Workbin options (`{ id, name }`).\n     */\n    async fetchWorkbins(): Promise<WorkbinOption[]> {\n        try {\n            return await this._fetchAllQueryOptions(request =>\n                this.get('taskManagementService').queryWorkbins(request)\n            );\n        } catch (error: unknown) {\n            this.get('loggerService').error('WorkitemModeService: failed to fetch workbins', {\n                remoteData: { error }\n            });\n            throw error;\n        }\n    },\n\n    /**\n     * Fetches all worktypes available for outbound workitem creation. Failures are\n     * logged and rethrown so the caller can surface a load error.\n     *\n     * @returns Worktype options (`{ id, name }`).\n     */\n    async fetchWorktypes(): Promise<WorktypeOption[]> {\n        try {\n            return await this._fetchAllQueryOptions(request =>\n                this.get('taskManagementService').queryWorktypes(request)\n            );\n        } catch (error: unknown) {\n            this.get('loggerService').error('WorkitemModeService: failed to fetch worktypes', {\n                remoteData: { error }\n            });\n            throw error;\n        }\n    },\n\n    /**\n     * Fetches the statuses defined on a worktype for outbound workitem creation.\n     * Failures are logged and rethrown so the caller can surface a load error.\n     *\n     * @param worktypeId - The selected worktype whose statuses to load.\n     * @returns Status options (`{ id, name }`).\n     */\n    async fetchWorktypeStatuses(worktypeId: string): Promise<StatusOption[]> {\n        try {\n            const response: TaskManagementQueryResponse = await this.get('taskManagementService').getStatusesByWorktype(\n                worktypeId\n            );\n            const entities = response?.entities ?? [];\n            return entities\n                .filter(entity => entity?.id)\n                .map(entity => ({ id: entity.id as string, name: entity.name || (entity.id as string) }));\n        } catch (error: unknown) {\n            this.get('loggerService').error('WorkitemModeService: failed to fetch worktype statuses', {\n                remoteData: { error }\n            });\n            throw error;\n        }\n    },\n\n    // --- Create ---\n\n    /**\n     * Creates a workitem through task management. Used by the outbound create panel.\n     * Callers own UI error handling; failures are logged here then rethrown.\n     *\n     * @param payload - Workitem create body.\n     * @returns The created workitem entity from the API.\n     */\n    async createWorkitem(payload: CreateWorkitemPayload): Promise<any> {\n        try {\n            return await this.get('taskManagementService').createWorkitem(payload);\n        } catch (error: unknown) {\n            this.get('loggerService').error('WorkitemModeService: failed to create workitem', {\n                remoteData: { error }\n            });\n            throw error;\n        }\n    }\n});\n","import Service from '@ember/service';\nimport { getOwner } from '@ember/application';\nimport { addObserver, removeObserver } from '@ember/object/observers';\nimport { assertNever } from 'web-directory/utils/types';\nimport { ThrottlingMonitor, WorkerScheduler, ThrottlingReport } from '@genesys/throttling-monitoring';\nimport { addPageAction } from 'web-directory/utils/newrelic';\n\nenum LogLevel {\n    DEBUG = 'debug',\n    INFO = 'info',\n    ERROR = 'error'\n}\n\nconst FEATURE_TOGGLE_NAME = 'AURA-763_enableThrottlingMonitoring';\n\nexport interface MonitoringService {\n    // Public properties\n    isInitialized: boolean;\n    isEnabled: boolean;\n\n    // Public API methods\n    getWorkerScheduler(): WorkerScheduler | null;\n    getThrottlingMonitor(): ThrottlingMonitor | null;\n    enableMonitoring(): void;\n    disableMonitoring(): void;\n}\n\nexport default class MonitoringServiceImpl extends Service implements MonitoringService {\n    // Service identifier for logging\n    private static readonly SERVICE_NAME = '[MonitoringService]';\n\n    // Resolved from the container in init(). Do NOT use the classic field-injection form\n    // (`logger = inject('stash-logger')`): on a native class under Ember 3.28 the decorator is stored\n    // on the field verbatim, so `this.logger` was the injection descriptor and every log call failed\n    // with \"_this$get5.info is not a function\". These were also injected by\n    // app/initializers/monitoring-service.js, which installed them as getter-only properties and made\n    // them unassignable; that injection has been removed in favour of the lookups below.\n    // See .kiro/steering/ember-3-migration.md.\n    declare logger: any;\n    declare session: any;\n\n    throttlingMonitor: ThrottlingMonitor | null = null;\n    workerScheduler: WorkerScheduler | null = null;\n    isInitialized: boolean = false;\n    isEnabled: boolean = false;\n\n    /**\n     * Ember Service lifecycle hook - called when service is created\n     */\n    public init() {\n        super.init();\n        const owner = getOwner(this);\n        this.logger = owner.lookup('service:stash-logger');\n        this.session = owner.lookup('service:session');\n        this.log('Monitoring service initialized but not enabled yet', LogLevel.INFO);\n        addObserver(this, `session.features.${FEATURE_TOGGLE_NAME}` as any, this, this._onFeatureToggleChanged);\n    }\n\n    /**\n     * Ember Service lifecycle hook - called when service is destroyed\n     */\n    public willDestroy() {\n        this.destroyMonitoring();\n        // Must mirror the addObserver() call in init() exactly, including the `this` target.\n        // Omitting it shifts the method into the target position, so the listener never matches\n        // and is never removed (Ember asserts, and the observer leaks onto the session service).\n        removeObserver(this, `session.features.${FEATURE_TOGGLE_NAME}` as any, this, this._onFeatureToggleChanged);\n        super.willDestroy();\n    }\n\n    /**\n     * Enable monitoring based on feature toggle\n     * This method should be called after feature toggles are loaded\n     */\n    public enableMonitoring(): void {\n        if (this.isEnabled) {\n            this.log('Monitoring is already enabled', LogLevel.DEBUG);\n            return;\n        }\n\n        // Check if monitoring is enabled via feature toggle\n        if (!this.get('session')?.features?.[FEATURE_TOGGLE_NAME]) {\n            this.log('Monitoring disabled by feature toggle', LogLevel.INFO);\n            return;\n        }\n\n        this.log('Enabling monitoring based on feature toggle', LogLevel.INFO);\n\n        // Initialize worker and monitoring\n        this.initializeWorker();\n        this.initializeMonitoring();\n\n        if (this.workerScheduler && this.throttlingMonitor && this.isInitialized) {\n            this.isEnabled = true;\n            this.log('Monitoring successfully enabled', LogLevel.INFO);\n        } else {\n            this.isEnabled = false;\n            this.log('Monitoring failed to enable - initialization incomplete', LogLevel.ERROR, {\n                remoteData: {\n                    workerSchedulerInitialized: !!this.workerScheduler,\n                    throttlingMonitorInitialized: !!this.throttlingMonitor\n                }\n            });\n        }\n    }\n\n    /**\n     * Get the WorkerScheduler instance\n     * @returns The WorkerScheduler instance or null if not initialized\n     */\n    public getWorkerScheduler(): WorkerScheduler | null {\n        return this.workerScheduler;\n    }\n\n    /**\n     * Get the ThrottlingMonitor instance\n     * @returns The ThrottlingMonitor instance or null if not initialized\n     */\n    public getThrottlingMonitor(): ThrottlingMonitor | null {\n        return this.throttlingMonitor;\n    }\n\n    /**\n     * Initialize WorkerScheduler instance\n     */\n    public initializeWorker(): void {\n        try {\n            this.workerScheduler = new WorkerScheduler({\n                maxRetryAttempts: 3,\n                logger: this.get('logger')\n            });\n            this.log('Successfully initialized WorkerScheduler', LogLevel.INFO);\n        } catch (error) {\n            this.log('Failed to initialize WorkerScheduler', LogLevel.ERROR, {\n                remoteData: {\n                    error: error instanceof Error ? error.message : String(error)\n                }\n            });\n        }\n    }\n\n    /**\n     * Initialize ThrottlingMonitor instance\n     */\n    public initializeMonitoring(): void {\n        try {\n            // Check if WorkerScheduler is available\n            if (!this.workerScheduler) {\n                this.log('Cannot initialize ThrottlingMonitor: WorkerScheduler not available', LogLevel.ERROR);\n                this.isInitialized = false;\n                return;\n            }\n\n            // Initialize ThrottlingMonitor\n            this.throttlingMonitor = new ThrottlingMonitor({\n                windowMs: 60000, // Check every 60 seconds\n                tickIntervalMs: 1000, // Tick every 1 second,\n                logger: this.get('logger'),\n                workerScheduler: this.workerScheduler,\n                // Using the onWindowSummary callback to log the throttling report and add the New Relic event - each minute (windowMs)\n                onWindowSummary: this._onWindowSummary.bind(this)\n            });\n\n            // Start monitoring\n            this.throttlingMonitor.start();\n            this.isInitialized = true;\n\n            this.log('Successfully initialized ThrottlingMonitor', LogLevel.INFO);\n        } catch (error) {\n            this.log('Failed to initialize monitoring', LogLevel.ERROR, {\n                remoteData: { error: error instanceof Error ? error.message : String(error) }\n            });\n            this.isInitialized = false;\n        }\n    }\n\n    /**\n     * Disable monitoring based on feature toggle\n     * This is the public API method for disabling monitoring\n     */\n    public disableMonitoring(): void {\n        if (!this.isEnabled) {\n            this.log('Monitoring is already disabled', LogLevel.DEBUG);\n            return;\n        }\n\n        this.log('Disabling monitoring based on feature toggle', LogLevel.INFO);\n        this.destroyMonitoring();\n    }\n\n    /**\n     * Clean up resources when service is destroyed\n     */\n    public destroyMonitoring(): void {\n        try {\n            if (this.throttlingMonitor) {\n                this.throttlingMonitor.stop();\n                this.throttlingMonitor.destroy();\n                this.throttlingMonitor = null;\n            }\n\n            if (this.workerScheduler) {\n                this.workerScheduler.destroy();\n                this.workerScheduler = null;\n            }\n\n            this.isInitialized = false;\n            this.isEnabled = false;\n            this.log('Successfully cleaned up monitoring resources', LogLevel.DEBUG);\n        } catch (error) {\n            this.log('Error during cleanup', LogLevel.ERROR, {\n                remoteData: { error: error instanceof Error ? error.message : String(error) }\n            });\n            // Ensure state is reset even if cleanup fails\n            this.isInitialized = false;\n            this.isEnabled = false;\n        }\n    }\n\n    /**\n     * Helper method to log messages with the service name prefix\n     * @param message - The log message\n     * @param logLevel - The log level from LogLevel enum (default: LogLevel.DEBUG)\n     * @param metadata - Optional metadata object for logs (supported by all log levels)\n     */\n    public log(message: string, logLevel: LogLevel = LogLevel.DEBUG, metadata?: Record<string, any>): void {\n        const logMessage = `${MonitoringServiceImpl.SERVICE_NAME} ${message}`;\n        switch (logLevel) {\n            case LogLevel.DEBUG:\n                if (metadata) {\n                    this.get('logger')?.debug(logMessage, metadata);\n                } else {\n                    this.get('logger')?.debug(logMessage);\n                }\n                break;\n            case LogLevel.INFO:\n                if (metadata) {\n                    this.get('logger')?.info(logMessage, metadata);\n                } else {\n                    this.get('logger')?.info(logMessage);\n                }\n                break;\n            case LogLevel.ERROR:\n                if (metadata) {\n                    this.get('logger')?.error(logMessage, metadata);\n                } else {\n                    this.get('logger')?.error(logMessage);\n                }\n                break;\n            default:\n                assertNever(logLevel);\n        }\n    }\n\n    /**\n     * Handler for window summary reports from ThrottlingMonitor\n     * Processes throttling reports and sends them to logging and New Relic\n     * @param report - The throttling report from the monitor\n     */\n    _onWindowSummary(report: ThrottlingReport): void {\n        // Common data for logging and New Relic\n        let commonData: Record<string, any> = {\n            timerType: report.timerType,\n            actualTicks: report.actualTicks,\n            expectedTicks: report.expectedTicks,\n            severity: report.severity,\n            reportType: report.reportType\n        };\n\n        if (report.cpuHoleDurationMs !== undefined) {\n            commonData.cpuHoleDurationMs = report.cpuHoleDurationMs;\n        }\n\n        if (report.nbMissingWindows !== undefined) {\n            commonData.nbMissingWindows = report.nbMissingWindows;\n        }\n\n        // Add SUMO log trace as INFO level - with low cardinality\n        // Important: the `loggingOptions` in `stash-logger.js` conditioned the serverLogs to be sent based on an FT\n        // Note: DEBUG level does not work here - no data in either Production or Development with this level\n        this.log(`${report.timerType.toUpperCase()} ${report.severity} timer report`, LogLevel.INFO, {\n            remoteData: {\n                ...commonData,\n                ticksDataString: report.ticksDataString,\n                reportTimestamp: report.timestamp\n            }\n        });\n\n        // Not reporting missing windows to New Relic (because the timestamps are invalidly the same for all windows)\n        if (report.reportType !== 'missing') {\n            // Add New Relic event\n            // - excluding ticksDataString\n            // - including timestamp (even if custom timestamp could not be overridden anymore)\n            // - including reportTimestamp (to be used for analysis in NR)\n            addPageAction('webdirThrottling', {\n                ...commonData,\n                timestamp: report.timestamp,\n                reportTimestamp: report.timestamp\n            });\n        }\n    }\n\n    /**\n     * Handler for feature toggle changes\n     * This is used to enable or disable monitoring based on the feature toggle\n     */\n    _onFeatureToggleChanged() {\n        const isFeatureEnabled = this.get('session')?.features?.[FEATURE_TOGGLE_NAME];\n\n        // Only act if there's a state change needed\n        if (isFeatureEnabled && !this.isEnabled) {\n            // Feature toggle is on but monitoring is disabled - enable it\n            this.log('FT change - enableMonitoring', LogLevel.INFO);\n            this.enableMonitoring();\n        } else if (!isFeatureEnabled && this.isEnabled) {\n            // Feature toggle is off but monitoring is enabled - disable it\n            this.log('FT change - disableMonitoring', LogLevel.INFO);\n            this.disableMonitoring();\n        }\n    }\n}\n\n// TypeScript module declaration to register the service with Ember's system\ndeclare module '@ember/service' {\n    interface Registry {\n        monitoring: MonitoringService;\n    }\n}\n","import Service, { inject as service } from '@ember/service';\n\nexport default Service.extend({\n    intl: service(),\n    session: service(),\n\n    _getNamePart: function (externalContact, namePart) {\n        const result = externalContact[namePart];\n        return (\n            (typeof result === 'string' ? result : false) || (externalContact.get ? externalContact.get(namePart) : '')\n        );\n    },\n\n    _getNames: function (externalContact) {\n        return {\n            familyName: this._getNamePart(externalContact, 'lastName'),\n            givenName: this._getNamePart(externalContact, 'firstName')\n        };\n    },\n\n    initials: function (externalContact) {\n        // TODO: RELATE-1038 UI - ACD Need to localize the code for harvesting initials for display when transferring a call to a Relate External contact\n        const { familyName, givenName } = this._getNames(externalContact);\n\n        if (givenName) {\n            const givenNameInitial = givenName.charAt(0).toUpperCase();\n            if (familyName) {\n                const familyNameInitial = familyName.charAt(0).toUpperCase();\n                return this.intl.t('purecloud.acdInteraction.relate.misc.initials', {\n                    givenNameInitial,\n                    familyNameInitial\n                });\n            }\n            return givenNameInitial;\n        }\n        if (familyName) {\n            return familyName.charAt(0).toUpperCase();\n        }\n        return '';\n    },\n\n    fullName: function (externalContact) {\n        if (!externalContact) {\n            return;\n        }\n\n        const { familyName, givenName } = this._getNames(externalContact);\n        const optionalMiddleName = this._getNamePart(externalContact, 'middleName') || null;\n        if (familyName) {\n            if (givenName) {\n                return this.get('intl').t(\n                    'purecloud.acdInteraction.relate.misc.fullName',\n                    { familyName, givenName, optionalMiddleName },\n                    true\n                );\n            } else {\n                return familyName;\n            }\n        }\n        return givenName;\n    }\n});\n","import { getOwner } from '@ember/application';\nimport { A } from '@ember/array';\nimport Service from '@ember/service';\nimport merge from 'lodash/merge';\nimport DesktopNotificationComponent, { LocalMessenger } from '../components/desktop-notification/component';\nimport { addPageAction } from 'web-directory/utils/newrelic';\n\nexport const DEFAULTS = {\n    hideAfter: 8,\n    forceBrowserNotification: false,\n    canShowNativeChatNotification: !!window._HostedContextFunctions,\n    isMobile: /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|Tablet|Silk/i.test(\n        navigator.userAgent\n    )\n};\n\nexport default Service.extend({\n    getOptions(type, title, message, extra) {\n        return merge({}, DEFAULTS, extra, {\n            title,\n            message,\n            type\n        });\n    },\n\n    /**\n     * Tracks notification invocation metrics to New Relic\n     * @private\n     * @param {string} type - Notification type (info, error, success)\n     * @param {object} options - Notification options\n     * @param {boolean} isLegacyShowApi - Whether this was called via the legacy show() API\n     */\n    _trackNotification(type, options, isLegacyShowApi = false) {\n        try {\n            // Determine the source of the notification\n            let source = 'native';\n            let ifcClientId = null;\n            let appId = null;\n\n            // Check for IFC client ID (from frame-router)\n            if (options.ifcClientId) {\n                source = 'ifcClient';\n                ifcClientId = options.ifcClientId;\n            } else if (options.appId) {\n                // Apps framework notifications pass appId directly\n                // This works for both 3rd party apps (UUIDs) and 1st party apps (string IDs like 'co-pilot')\n                source = 'appsFramework';\n                appId = options.appId;\n            } else if (options.embeddedAdminFrame) {\n                // Embedded admin frames (legacy admin UI in iframes)\n                source = 'embeddedAdminFrame';\n            }\n            // If no identifiers present, source remains 'native'\n\n            // Count action handlers\n            const actionHandlerCount = options.actionHandlers ? Object.keys(options.actionHandlers).length : 0;\n\n            // Build telemetry payload with configuration options\n            const telemetry = {\n                type,\n                source,\n                actionHandlerCount,\n                isLegacyShowApi,\n                // Configuration options\n                hideAfter: options.hideAfter !== undefined ? options.hideAfter : DEFAULTS.hideAfter,\n                forceBrowserNotification: !!options.forceBrowserNotification,\n                showCloseButton: options.showCloseButton !== undefined ? options.showCloseButton : true,\n                fallbackToInBrowser: options.fallbackToInBrowser !== undefined ? options.fallbackToInBrowser : true,\n                markdownToHtml: options.markdownToHtml !== undefined ? options.markdownToHtml : true,\n                showNotificationEverywhere: !!options.showNotificationEverywhere,\n                shouldShowPopup: options.shouldShowPopup !== undefined ? options.shouldShowPopup : true,\n                shouldPlaySound: options.shouldPlaySound !== undefined ? options.shouldPlaySound : true,\n                // Additional context\n                hasTag: !!options.tag,\n                hasIcon: !!options.icon,\n                hasSoundId: !!options.soundId,\n                hasClickHandler: !!options.clickHandler,\n                hasMessageStyle: !!options.messageStyle,\n                // Content length metrics\n                titleLength: options.title ? options.title.length : 0,\n                messageLength: options.message ? options.message.length : 0\n            };\n\n            // Add IFC client ID if present\n            if (ifcClientId) {\n                telemetry.ifcClientId = ifcClientId;\n            }\n\n            // Add app ID if present (works for both UUID and string IDs)\n            if (appId) {\n                telemetry.appId = appId;\n            }\n\n            addPageAction('notificationInvoked', telemetry);\n        } catch (error) {\n            // Silently fail - don't break notifications if tracking fails\n        }\n    },\n\n    info(title, message, options = {}) {\n        const owner = getOwner(this);\n        options = this.getOptions('info', ...arguments);\n        this._trackNotification('info', options);\n        return DesktopNotificationComponent.show(options, owner, false);\n    },\n\n    error(title, message, options = {}) {\n        const owner = getOwner(this);\n        options = this.getOptions('error', ...arguments);\n        this._trackNotification('error', options);\n        return DesktopNotificationComponent.show(options, owner, false);\n    },\n\n    success(title, message, options = {}) {\n        const owner = getOwner(this);\n        options = this.getOptions('success', ...arguments);\n        this._trackNotification('success', options);\n        return DesktopNotificationComponent.show(options, owner, false);\n    },\n\n    /**\n     @desc Dismisses a notification with the given ID, hiding it in the tray. If no notification with the given ID is found, nothing will be done.\n     @param {string} id\n  */\n    dismiss(id) {\n        if (!id || !LocalMessenger) {\n            return;\n        }\n\n        const history = A(LocalMessenger.history || []);\n        const notification = history.find(n => n && n.msg && n.msg.options && n.msg.options.id === id && n.msg.shown);\n\n        if (notification && typeof notification.msg.hide === 'function') {\n            notification.msg.hide();\n        }\n\n        return notification;\n    },\n\n    // Legacy support\n    show(options) {\n        const owner = getOwner(this);\n        // Track legacy show() calls\n        if (options && options.type) {\n            this._trackNotification(options.type, options, true);\n        }\n        return DesktopNotificationComponent.show(options, owner, false);\n    }\n});\n","import { defineProperty } from '@ember/object';\nimport Service, { inject } from '@ember/service';\nimport { isGuid } from 'web-directory/utils/conversation';\nimport Ember from 'ember';\nimport type {\n    Participant,\n    Communication,\n    CommunicationType,\n    ParticipantPurposeType\n} from '@genesys/genesys-cloud-conversation-utils';\nimport type { Maybe } from 'web-directory/types';\n\nconst { Promise } = Ember.RSVP;\n\n/**\n **********************************************************************************\n * General Rules for Participant Name Derivation\n **********************************************************************************\n *\n * Note: Names derived via this service are done so in this order.  A consumer\n * could optionally request the synchronously or asynchronously derived name, but\n * should consider both for displaying a participant's name.\n *\n * Global Asynchronous Rules\n *\n * 1. If the participant purpose is `acd` and a queueId is provided, fetch\n *    the queue name via publicApi.\n * 2. If a userId is provided, look up the internal user name via publicApi.\n * 3. If an externalContactId is provided, fetch the canonical contact via\n *    external-contacts service and publicApi.\n *\n * Global Synchronous Rules\n *\n * 1. Use the `participant.name` value.\n * 2. Use `participant.attributes` values (e.g. `name`, `context.firstName`, etc.)\n *\n * Call Communication Rules\n *\n * 1. Use `communication.self.name` if available (inbound) or\n *    `communication.other.name` (outbound).\n * 2. Use `communication.self.addressNormalized` if available (inbound) or\n *    `communication.other.addressNormalized` (outbound).\n *\n * Message Communication Rules\n *\n * 1. Use `communication.fromAddress.addressNormalized` (inbound) or\n *    `communication.toAddress.addressNormalized` (outbound).\n *\n * Email Communication Rules\n *\n * 1. Use `from.name` from first fetched message object.\n * 2. Use `from.email` from first fetched message object.\n * 3. Use first email object on `draft.to` on draft state.\n * 4. Use first email (`to.email`) on outbound message object.\n */\nexport default class ParticipantNameService extends Service {\n    // `inject(...)` returns a classic-decorator descriptor, not a resolved service instance.\n    // Assigning it as a bare native class field (e.g. `logger = inject('stash-logger')`) just\n    // stores that raw descriptor as a plain instance property — it is never wired up as a real\n    // property, so `this.get('logger')` (or plain `this.logger`) returns the descriptor itself\n    // instead of the injected service, causing `this.get('logger').debug is not a function` at\n    // runtime. Installing these via `defineProperty` in `init()` registers them as real service\n    // injections. Mirrors the same class of bug fixed in `services/case-association.ts` for\n    // `computed(...)` class fields.\n    declare store: ReturnType<typeof inject>;\n    declare externalContacts: ReturnType<typeof inject>;\n    declare addressformat: ReturnType<typeof inject>;\n    declare interaction: ReturnType<typeof inject>;\n    declare logger: ReturnType<typeof inject>;\n\n    init() {\n        super.init();\n        defineProperty(this, 'store', inject('store'));\n        defineProperty(this, 'externalContacts', inject('externalContacts'));\n        defineProperty(this, 'addressformat', inject('addressformat'));\n        defineProperty(this, 'interaction', inject('interaction'));\n        defineProperty(this, 'logger', inject('stash-logger'));\n    }\n\n    /**\n     * Determine the best name for participant from a conversation object\n     * using synchronous data (e.g. conversation payload)\n     * @param participant Participant to name\n     * @returns The name for given participant\n     */\n    getRawParticipantName(participant: Participant): Maybe<string> {\n        if (!participant) {\n            return null;\n        }\n\n        try {\n            const { attributes } = participant;\n\n            // Our existing code seems to primarily perfer participant.name\n            // if set so it's first in priortiy here.\n            if (participant.name) {\n                return participant.name;\n            }\n\n            // Attributes appears to be primarily used for chats,\n            // but in case other media set them, it's still here\n            // to be picked up.\n            if (attributes) {\n                const name: string = attributes['name'] || '';\n                const firstName: string = attributes['context.firstName'] || '';\n                const lastName: string = attributes['context.lastName'] || '';\n\n                if (name) {\n                    return name.trim();\n                } else if (firstName || lastName) {\n                    return `${firstName} ${lastName}`.trim();\n                }\n            }\n\n            if (this._hasMedia(participant, 'calls')) {\n                const call = participant.calls![0];\n                const nameFromCall = this._getNameForCall(call);\n                if (nameFromCall) {\n                    return nameFromCall;\n                }\n            }\n\n            if (this._hasMedia(participant, 'messages')) {\n                const message = participant.messages![0];\n                const nameFromMessage = this._getNameForMessage(message);\n                if (nameFromMessage) {\n                    return nameFromMessage;\n                }\n            }\n\n            if (this._hasMedia(participant, 'emails')) {\n                const nameFromEmail = this._getNameForEmail(participant);\n                if (nameFromEmail) {\n                    return nameFromEmail;\n                }\n            }\n        } catch (err) {\n            if (this.get('logger').debug)\n                this.get('logger').debug('ACD: Unable to parse name from participant', {\n                    error: err\n                });\n        }\n\n        return null;\n    }\n\n    /**\n     * Determine the best name for a participant from a conversation object\n     * using asynchronous data (e.g. store lookups)\n     * @param participant\n     * @returns A promise resolving the name as a string.\n     */\n    async fetchNameFromParticipant(participant: Participant): Promise<Maybe<string>> {\n        if (!participant) {\n            return Promise.resolve(null);\n        }\n\n        const purpose: ParticipantPurposeType = participant.purpose;\n        const queuePurpose: ParticipantPurposeType = 'acd';\n\n        if (purpose === queuePurpose) {\n            return this.fetchQueueName(participant.queueId);\n        }\n\n        const externalContactName = participant.externalContactId\n            ? await this._fetchExternalContactName(participant.externalContactId)\n            : null;\n\n        if (externalContactName) {\n            return externalContactName;\n        }\n\n        if (participant.userId) {\n            return this._fetchUserName(participant.userId);\n        }\n\n        return this.getRawParticipantName(participant);\n    }\n\n    /**\n     * Fetch an external contact name from the service\n     * @param externalContactId The external contact's guid\n     * @returns A promise resolving the external contact as a string\n     */\n    async _fetchExternalContactName(externalContactId: Maybe<string>): Promise<Maybe<string>> {\n        if (!externalContactId) {\n            if (this.get('logger').debug) this.get('logger').debug('ACD: No externalContactId provided');\n            return Promise.resolve(null);\n        }\n\n        try {\n            const contact = await this.get('externalContacts').getCanonicalExternalContact(externalContactId, false);\n            if (contact) {\n                const name = Ember.get(contact, 'name');\n                if (name) {\n                    return Promise.resolve(name);\n                }\n            }\n        } catch (error) {\n            if (this.get('logger').error)\n                this.get('logger').error('ACD: Participant name service was unable to fetch external contact', {\n                    error,\n                    remoteData: { externalContactId }\n                });\n        }\n\n        return Promise.resolve(null);\n    }\n\n    /**\n     * Fetch an internal user's name from the store\n     * @param userId The user's guid\n     * @returns A promise resolving the internal user as a string\n     */\n    async _fetchUserName(userId: Maybe<string>): Promise<Maybe<string>> {\n        if (!userId) {\n            if (this.get('logger').debug) this.get('logger').debug('ACD: No externalContactId provided');\n            return Promise.resolve(null);\n        }\n\n        try {\n            const person = await this.get('store').findRecord('person', userId);\n            if (person) {\n                const name = person.get('name');\n                if (name) {\n                    return Promise.resolve(name);\n                }\n            }\n        } catch (error) {\n            if (this.get('logger').error)\n                this.get('logger').error('ACD: Participant name service was unable to fetch user record', {\n                    error,\n                    remoteData: { userId }\n                });\n        }\n\n        return Promise.resolve(null);\n    }\n\n    /**\n     * Fetch a queue name from the store\n     * @param userId The queue's guid\n     * @returns A promise resolving the queue name as a string\n     */\n    async fetchQueueName(queueId: Maybe<string>): Promise<Maybe<string>> {\n        if (!queueId) {\n            if (this.get('logger').debug) this.get('logger').debug('ACD: No queueId provided');\n            return Promise.resolve(null);\n        }\n\n        try {\n            const queue = await this.get('store').findRecord('queue', queueId);\n            if (queue) {\n                const name = queue.get('name');\n                if (name) {\n                    return Promise.resolve(name);\n                }\n            }\n        } catch (error) {\n            if (this.get('logger').error)\n                this.get('logger').error('ACD: Participant name service was unable to fetch queue record', {\n                    error,\n                    remoteData: { queueId }\n                });\n        }\n\n        return Promise.resolve(null);\n    }\n\n    /**\n     * Utility to determine if participant has media of specific type\n     * @param participant The conversation participant to check\n     * @param commType The media type to check\n     * @returns A boolean indicating media presence\n     */\n    _hasMedia(participant: Participant, commType: CommunicationType) {\n        return (participant[commType] || []).length > 0;\n    }\n\n    /**\n     * Determine a participant name for a participant with email media\n     * @param participant Participant to name\n     * @returns The name as a string or null\n     */\n    _getNameForEmail(participant: Participant): Maybe<string> {\n        const interactions = this.get('interaction').get('activeInteractions');\n        const interaction = interactions.find((interaction: any) => {\n            return Ember.get(interaction, 'participantForCustomer.id') === participant.id;\n        });\n\n        const fromEmail = interaction.get('messages.firstObject.from.email');\n        const fromName = interaction.get('messages.firstObject.from.name');\n        const draftTo = interaction.get('draft.to.firstObject.email');\n        const messageTo = interaction.get('messages.firstObject.to.email');\n\n        const name: Maybe<string> = fromName || fromEmail || draftTo || messageTo;\n        if (name) {\n            return name;\n        }\n\n        return null;\n    }\n\n    /**\n     * Determine a participant name from a message communcation\n     * @param message Message communication object\n     * @returns The name as a string or null\n     */\n    _getNameForMessage(message: Communication & { type?: string }): Maybe<string> {\n        const toAddress = message.toAddress?.addressNormalized;\n        const fromAddress = message.fromAddress?.addressNormalized;\n        const formatter = (val: string): string =>\n            this.get('addressformat').formatAddressForDisplay(val, undefined, message?.type);\n\n        if (fromAddress && !isGuid(fromAddress) && message.type !== 'apple') {\n            return formatter(fromAddress);\n        } else if (toAddress && !isGuid(toAddress)) {\n            return formatter(toAddress);\n        }\n\n        return null;\n    }\n\n    /**\n     * Determine a participant name from a call communcation\n     * @param call Call communication object\n     * @returns The name as a string or null\n     */\n    _getNameForCall(call: Communication): Maybe<string> {\n        const direction = call.direction ?? '';\n        const isOutbound = direction.toLowerCase() === 'outbound';\n        const formatter = (val: string): string => this.get('addressformat').formatAddressForDisplay(val);\n\n        if (isOutbound && call.self) {\n            if (call.self.name) {\n                return call.self.name;\n            } else if (call.self.addressNormalized) {\n                return formatter(call.self.addressNormalized);\n            }\n        } else if (!isOutbound && call.other) {\n            if (call.other.name) {\n                return call.other.name;\n            } else if (call.other.addressNormalized) {\n                return formatter(call.other.addressNormalized);\n            }\n        }\n\n        return null;\n    }\n}\n\n/** DO NO REMOVE MODULE DECLARATION **/\ndeclare module '@ember/service' {\n    interface Registry {\n        participantName: ParticipantNameService;\n        'participant-name': ParticipantNameService;\n    }\n}\n","import { reads, bool } from '@ember/object/computed';\nimport { computed } from '@ember/object';\nimport Service, { inject as service } from '@ember/service';\nimport _ from 'lodash';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nconst WILDCARD = '*';\n\nfunction isPermissionInList(item, targetList) {\n    let inList = item === WILDCARD || targetList === WILDCARD;\n\n    if (!inList) {\n        const listItems = targetList.split(',');\n\n        inList = _.includes(listItems, item);\n    }\n\n    return inList;\n}\n\n/**\n * Compare provided permission divisions against a secific division\n *\n * @item the division to look for\n * @targetList comma-delimited string representation of permission divisions\n */\nfunction shouldAllowBasedOnDivision(item, targetList) {\n    // if the wildcard is present in permission list\n    // if no divisions are returned from PAPI\n    // if the requested division is the WILDCARD\n    // if the requested division was an empty string\n    // -- bypass the division check\n    if (targetList.length === 0 || targetList === WILDCARD || item === WILDCARD || item.length === 0) {\n        return true;\n    }\n\n    const divisions = targetList.split(',');\n    return divisions.includes(item);\n}\n\nfunction isAllowedOrgPermission(allowedOrgPermissions, targetDomain, targetEntity, targetAction) {\n    let domainPermissionMap = _.head(_.map(_.filter(allowedOrgPermissions, { domain: targetDomain }), 'permissionMap'));\n\n    domainPermissionMap = _.flatten(_.map(domainPermissionMap, value => value));\n\n    return (\n        domainPermissionMap &&\n        domainPermissionMap.length &&\n        (targetEntity === WILDCARD || _.find(domainPermissionMap, { entityType: targetEntity })) &&\n        (targetAction === WILDCARD || _.find(domainPermissionMap, { action: targetAction }))\n    );\n}\n\nexport function checkDonutPermission(permissions, permissionValue, allowedOrgPermissions, targetDivision) {\n    let isAllowed = false;\n\n    if (!permissions) {\n        permissions = [];\n    }\n\n    //change domain:* -> domain:*:*\n    if (permissionValue.match(/^[a-zA-Z0-9]+:\\*$/)) {\n        permissionValue = permissionValue.replace('*', '*:*');\n    }\n\n    const permissionsToValidate = permissionValue.split(':'),\n        targetDomain = permissionsToValidate[0],\n        targetEntity = permissionsToValidate[1],\n        targetAction = permissionsToValidate[2];\n\n    if (isAllowedOrgPermission(allowedOrgPermissions, targetDomain, targetEntity, targetAction)) {\n        permissions.forEach(function (permission) {\n            const permissions = permission.split(':'),\n                domain = permissions[0],\n                entity = permissions[1],\n                actionSet = permissions[2],\n                divisions = permissions[3] || '';\n\n            if (targetDomain === domain) {\n                const matchesEntity = isPermissionInList(targetEntity, entity);\n                const matchesAction = isPermissionInList(targetAction, actionSet);\n                const matchesDivision = shouldAllowBasedOnDivision(targetDivision, divisions);\n\n                if (matchesEntity && matchesAction && matchesDivision) {\n                    isAllowed = true;\n                }\n            }\n        });\n    }\n\n    return isAllowed;\n}\n\nexport default Service.extend(LoggerMixin, {\n    session: service(),\n    adminAccess: service(),\n\n    permissions: reads('session.permissions'),\n    rolePermissions: reads('session.roleNames'), //Deprecated\n\n    allowedOrgPermissions: reads('session.allowedOrgPermissions'),\n\n    trusteeOrg: reads('session.trusteeOrg'),\n\n    hasUnifiedCommunications: computed('session.org.hasUnifiedCommunications', 'trusteeOrg', function () {\n        return !!(\n            this.get('session.org.hasUnifiedCommunications') || this.get('trusteeOrg.features.unifiedCommunications')\n        );\n    }),\n\n    directoryPermissions: computed('permissions.[]', function () {\n        const permissions = this.permissions;\n        return _.reject(permissions, permission => {\n            return _.includes(permission, ':');\n        });\n    }),\n\n    donutPermissions: computed('permissions.[]', function () {\n        const permissions = this.permissions;\n        return _.filter(permissions, permission => {\n            return _.includes(permission, ':');\n        });\n    }),\n\n    hasSupervisorAccess: computed('rolePermissions', 'donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('routing:queue:edit');\n    }),\n\n    validateDonutPermission: function (permission, division = '*') {\n        const isAuthenticated = this.get('session.isAuthenticated');\n        const logger = this.logger;\n\n        if (!isAuthenticated) {\n            logger.debug('attempted to check a permission before authenticated', { permission });\n        }\n\n        if (typeof division !== 'string') {\n            logger.error('Division argument for permission check must be a string.');\n            return false;\n        }\n\n        return checkDonutPermission(this.donutPermissions, permission, this.allowedOrgPermissions, division.trim());\n    },\n\n    validateDirectoryPermission: function (permission) {\n        const isAuthenticated = this.get('session.isAuthenticated');\n        const logger = this.logger;\n\n        if (!isAuthenticated) {\n            logger.debug('attempted to check a permission before authenticated', { permission });\n        }\n\n        const permissions = this.directoryPermissions || [];\n        return _.includes(permissions, permission);\n    },\n\n    validateAllPermissions: function (permissionsList) {\n        return (permissionsList || []).every(permission => this.validateDonutPermission(permission));\n    },\n\n    validateAnyPermissions: function (permissionsList) {\n        const permissionsSet = permissionsList || [];\n        return permissionsSet.some(permission => this.validateDonutPermission(permission));\n    },\n\n    canCreateGroups: computed('directoryPermissions.[]', 'donutPermissions.[]', function () {\n        const permissions = this.directoryPermissions;\n        const hasDirectoryPermissions =\n            _.includes(permissions, 'group_creation') || _.includes(permissions, 'group_administration');\n        const hasDonutPermission = this.validateDonutPermission('directory:group:add');\n        return hasDirectoryPermissions || hasDonutPermission;\n    }),\n\n    canDeleteGroups: computed('directoryPermissions.[]', 'donutPermissions', function () {\n        const permissions = this.directoryPermissions;\n        const hasDirectoryPermissions = _.includes(permissions, 'group_administration');\n        const hasDonutPermission = this.validateDonutPermission('directory:group:edit');\n        return hasDirectoryPermissions || hasDonutPermission;\n    }),\n\n    canInvitePeople: computed('directoryPermissions.[]', function () {\n        const permissions = this.directoryPermissions;\n        return _.includes(permissions, 'person_administration');\n    }),\n\n    canGoOnQueue: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('routing:agent:onqueue');\n    }),\n\n    canUseGiphy: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('chat:giphy:access');\n    }),\n\n    canViewTelemetry: computed('donutPermissions', function () {\n        return this.validateDonutPermission('ui:networkPerformanceIndicators:view');\n    }),\n\n    canPark: computed('donutPermissions', function () {\n        return this.validateDonutPermission('conversation:email:park');\n    }),\n\n    canParkMessage: computed('donutPermissions', function () {\n        return this.validateDonutPermission('conversation:message:park');\n    }),\n\n    canViewInteractionDetails: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return (\n            this.validateDonutPermission('analytics:conversationDetail:view') &&\n            this.validateDonutPermission('analytics:conversationAggregate:view') &&\n            (this.validateDonutPermission('conversation:communication:view') ||\n                this.validateDonutPermission('quality:evaluation:add') ||\n                this.validateDonutPermission('quality:calibration:view') ||\n                this.validateDonutPermission('quality:evaluation:editScore'))\n        );\n    }),\n\n    canViewExternalContactInteractionHistory: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return (\n            this.validateDonutPermission('analytics:conversationDetail:view') ||\n            this.validateDonutPermission('externalContacts:conversation:viewAll')\n        );\n    }),\n\n    canActivateQueues: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('routing:queue:join');\n    }),\n\n    canEditQueues: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('routing:queue:edit');\n    }),\n\n    canScreenRecordingParticipate: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('recording:screenRecording:participate');\n    }),\n\n    canRealtimeMonitorScreenParticipate: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('realtimeMonitor:screen:participate');\n    }),\n\n    canSecurePause: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('conversation:recording:pause');\n    }),\n\n    canViewQueue: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('routing:queue:view');\n    }),\n\n    canViewConversationSettings: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('conversation:settings:view');\n    }),\n\n    canSearchQueue: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('routing:queue:search');\n    }),\n\n    canViewWrapUpCode: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('routing:wrapupCode:view');\n    }),\n\n    canViewEvaluationForms: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('quality:evaluationForm:view');\n    }),\n\n    canViewSurveyForms: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('quality:surveyForm:view');\n    }),\n\n    canViewCases: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('case:case:view');\n    }),\n\n    canViewCaseAssociation: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('caseManagement:caseAssociation:view');\n    }),\n\n    canViewQueueObservations: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('analytics:queueObservation:view');\n    }),\n\n    canViewQueuePerformance: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return (\n            this.validateDonutPermission('ui:supervisorQueueDetails:view') &&\n            this.validateDonutPermission('analytics:conversationAggregate:view') &&\n            this.canViewQueue\n        );\n    }),\n\n    canViewSurveysPerformance: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return (\n            this.validateDonutPermission('quality:surveyForm:view') &&\n            this.validateDonutPermission('analytics:surveyAggregate:view')\n        );\n    }),\n\n    canViewSurveysPerformanceDetail: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return (\n            this.validateDonutPermission('quality:surveyForm:view') &&\n            this.validateDonutPermission('analytics:surveyAggregate:view')\n        );\n    }),\n\n    canViewSkillsPerformance: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return (\n            this.validateDonutPermission('ui:supervisorPerformance:view') &&\n            this.validateDonutPermission('analytics:conversationAggregate:view') &&\n            this.canViewQueuePerformance\n        );\n    }),\n\n    canViewWrapupPerformance: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return (\n            this.validateDonutPermission('ui:supervisorWrapUpPerformance:view') &&\n            this.canViewQueuePerformance &&\n            this.canViewWrapUpCode\n        );\n    }),\n\n    canViewDnisPerformance: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return (\n            this.validateDonutPermission('ui:supervisorDnisPerformance:view') &&\n            this.validateDonutPermission('analytics:conversationAggregate:view') &&\n            this.canViewQueuePerformance\n        );\n    }),\n\n    canViewFlowPerformance: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return (\n            this.canViewFlowAggregates && this.canViewFlows && this.canViewInsightConfigurations && this.canSearchFlows\n        );\n    }),\n\n    canViewOutcomePerformance: computed('donutPermisions', 'allowedOrgPermissions', function () {\n        return this.canViewFlowAggregates && this.canViewOutcomes && this.canViewFlows && this.canSearchFlows;\n    }),\n\n    canViewOutcomes: computed('donutPermissions', function () {\n        return this.validateDonutPermission('architect:flowOutcome:view');\n    }),\n\n    canViewAgentDevelopment: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return (\n            (this.validateDonutPermission('coaching:appointment:view') ||\n                this.validateDonutPermission('learning:assignment:view')) &&\n            this.hasAgentSupervisorAccess\n        );\n    }),\n\n    canViewAgentPerformance: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.hasAgentSupervisorAccess && this.validateDonutPermission('analytics:conversationAggregate:view');\n    }),\n\n    canViewAgentPerformanceMe: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('analytics:conversationAggregate:view');\n    }),\n\n    canViewAgentStatus: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.hasAgentSupervisorAccess && this.validateDonutPermission('analytics:userAggregate:view');\n    }),\n\n    canViewAgentWrapup: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return (\n            this.hasAgentSupervisorAccess &&\n            this.canViewWrapUpCode &&\n            this.validateDonutPermission('ui:supervisorWrapUpPerformance:view')\n        );\n    }),\n\n    canViewAgentStatusMe: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('analytics:userAggregate:view');\n    }),\n\n    canViewAgentEvaluations: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.hasAgentSupervisorAccess && this.validateDonutPermission('quality:evaluation:view');\n    }),\n\n    canViewAgentEvaluationsMe: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('quality:evaluation:view');\n    }),\n\n    canViewQueueActivity: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return (\n            this.validateDonutPermission('ui:supervisorQueueDetails:view') &&\n            this.validateDonutPermission('analytics:queueObservation:view') &&\n            this.validateDonutPermission('analytics:conversationAggregate:view') &&\n            this.validateDonutPermission('analytics:conversationDetail:view') &&\n            this.canViewQueue\n        );\n    }),\n\n    canViewAgentQueueActivity: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return (\n            this.validateDonutPermission('analytics:queueObservation:view') &&\n            this.validateDonutPermission('analytics:conversationAggregate:view') &&\n            this.validateDonutPermission('ui:agentQueueActivity:view') &&\n            this.canViewQueue\n        );\n    }),\n\n    canViewInsightConfigurations: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('analytics:insightConfigurations:view');\n    }),\n\n    canViewDashboardConfigurations: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('analytics:dashboardConfigurations:view');\n    }),\n\n    canEditDashboardConfigurations: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('analytics:dashboardConfigurations:edit');\n    }),\n\n    canMakePublicDashboards: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('analytics:dashboardConfigurations:publish');\n    }),\n\n    canViewSkillsAndLanguages: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('routing:skill:manage');\n    }),\n\n    canViewAlerting: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('alerting:alert:*') || this.validateDonutPermission('alerting:rule:*');\n    }),\n\n    canViewAcdScreenShare: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('acdscreenshare:session:view');\n    }),\n\n    canViewAcdCoBrowseForCall: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return (\n            this.validateDonutPermission('cobrowse:session:view') &&\n            this.validateDonutPermission('cobrowse:voice:escalate')\n        );\n    }),\n\n    canViewRecordings: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        if (this.get('session.features')['hideAdhocRecordingsUi']) {\n            return this.validateDonutPermission('recording:recording:access');\n        }\n        return true;\n    }),\n\n    canViewAgentAssistance: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('chat:agentassistance:access');\n    }),\n\n    canViewAcdCoBrowseForChat: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return (\n            this.validateDonutPermission('cobrowse:session:view') &&\n            this.validateDonutPermission('cobrowse:chat:escalate')\n        );\n    }),\n\n    canViewAcdCoBrowseForWebMessaging: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('conversation:cobrowse:add');\n    }),\n\n    canViewAcdCoBrowseV2ForVoice: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('conversation:cobrowseVoice:add');\n    }),\n\n    canViewAcdVideo: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('acdvideo:session:view');\n    }),\n\n    canViewAcdVideoForWebMessaging: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('conversation:video:add');\n    }),\n\n    canViewAgentActivity: computed('session.features', 'donutPermissions', 'allowedOrgPermissions', function () {\n        const isQueuePerformanceWidgetEnabled = this.get('session.features.WEM-1368_Queue-Performance-Widget');\n        const canViewQueueMonitoring =\n            this.validateDonutPermission('ui:supervisorQueueDetails:view') && isQueuePerformanceWidgetEnabled;\n        return (\n            this.validateDonutPermission('ui:agentActivity:view') ||\n            this.validateDonutPermission('ui:supervisorActivity:view') ||\n            canViewQueueMonitoring\n        );\n    }),\n\n    canViewBusinessChat: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('chat:chat:access');\n    }),\n\n    canViewCollaborateVideo: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('video:video:access');\n    }),\n\n    canViewPublishedScripts: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('scripter:publishedScript:view');\n    }),\n\n    canViewAudits: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('audits:audit:view');\n    }),\n\n    hasAcdVoicemailAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('voicemail:acdVoicemail:view');\n    }),\n    hasAcdVoicemailStreamAccess: computed(\n        'donutPermissions',\n        'allowedOrgPermissions',\n        'session.features.PURE-7570',\n        function () {\n            if (this.get('session.features.PURE-7570')) {\n                return this.validateDonutPermission('voicemail:acdVoicemail:stream');\n            }\n            return true;\n        }\n    ),\n\n    hasVoicemailAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('voicemail:*:*');\n    }),\n\n    canViewGroupMailbox: computed('session.features', 'donutPermissions', 'allowedOrgPermissions', function () {\n        return (\n            this.get('session.features.EC-772_get-groups-mailboxes') &&\n            this.validateDonutPermission('voicemail:groupMailbox:view')\n        );\n    }),\n\n    hasEvaluationAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return (\n            this.validateDonutPermission('quality:evaluation:edit') ||\n            this.validateDonutPermission('quality:evaluation:editScore') ||\n            this.validateDonutPermission('quality:evaluation:view')\n        );\n    }),\n\n    hasEvaluationAggregateAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('analytics:evaluationAggregate:view');\n    }),\n\n    hasTimeOffRequestAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('wfm:agentTimeOffRequest:submit');\n    }),\n\n    hasSupervisorShiftTradeRequestAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('wfm:shiftTradeRequest:edit');\n    }),\n\n    hasLearningAssignmentViewAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('learning:assignment:view');\n    }),\n\n    hasCoachingParticipate: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('coaching:appointment:participate');\n    }),\n\n    hasAgentShiftTradeRequestAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return (\n            this.validateDonutPermission('wfm:agentShiftTradeRequest:participate') ||\n            this.hasSupervisorShiftTradeRequestAccess\n        );\n    }),\n\n    hasAgentAdherenceNotifyAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return (\n            this.validateDonutPermission('wfm:agentSchedule:view') &&\n            this.validateDonutPermission('wfm:agentAdherence:notify')\n        );\n    }),\n\n    hasAgentAlternativeShiftAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('wfm:agentAlternativeShift:submit');\n    }),\n\n    hasShrinkageViewAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('wfm:shrinkage:view');\n    }),\n\n    hasAgentScheduleAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('wfm:agentSchedule:view');\n    }),\n\n    hasAgentScheduleNotificationAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('wfm:agentScheduleNotification:view');\n    }),\n\n    hasAgentScheduleSyncAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('wfm:agentSchedule:sync');\n    }),\n\n    canViewAnAgentsSchedule: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return (\n            (this.validateDonutPermission('wfm:activityCode:administer') ||\n                this.validateDonutPermission('wfm:activityCode:view')) &&\n            (this.validateDonutPermission('wfm:schedule:administer') ||\n                this.validateDonutPermission('wfm:schedule:view')) &&\n            this.hasAgentSupervisorAccess\n        );\n    }),\n\n    canViewAnAgentsScheduleMe: bool('hasAgentScheduleAccess'),\n\n    hasAgentSupervisorAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('ui:supervisorAgentDetails:view') && this.canViewUsers;\n    }),\n\n    hasRelateAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('externalContacts:*:*');\n    }),\n\n    canEmailOnBehalfOfQueue: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('conversation:email:create');\n    }),\n\n    canForwardEmail: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('conversation:email:forward');\n    }),\n\n    canSendMessageOnBehalfOfQueue: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('conversation:message:create');\n    }),\n\n    canViewWebMessaging: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return (\n            this.validateDonutPermission('conversation:message:view') ||\n            this.validateDonutPermission('conversation:webmessaging:view')\n        );\n    }),\n\n    hasExternalContactsViewContactAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('externalContacts:contact:view');\n    }),\n\n    hasExternalContactsAddContactAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('externalContacts:contact:add');\n    }),\n\n    hasExternalContactsEditContactAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('externalContacts:contact:edit');\n    }),\n\n    hasExternalContactsDeleteContactAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('externalContacts:contact:delete');\n    }),\n\n    hasExternalContactsViewOrganizationAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('externalContacts:externalOrganization:view');\n    }),\n\n    hasExternalContactsAddOrganizationAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('externalContacts:externalOrganization:add');\n    }),\n\n    hasExternalContactsEditOrganizationAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('externalContacts:externalOrganization:edit');\n    }),\n\n    hasExternalContactsDeleteOrganizationAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('externalContacts:externalOrganization:delete');\n    }),\n\n    hasExternalContactsExternalEntityImportAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('externalContacts:externalEntity:import');\n    }),\n\n    hasExternalContactsConversationAssociationPrivilege: computed(\n        'donutPermissions',\n        'allowedOrgPermissions',\n        function () {\n            return this.validateDonutPermission('externalContacts:conversation:associate');\n        }\n    ),\n\n    hasConversationAssociationPrivilege: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.hasExternalContactsConversationAssociationPrivilege;\n    }),\n\n    hasExternalContactsAddSchemaAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('externalContacts:customFields:add');\n    }),\n\n    hasExternalContactsEditSchemaAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('externalContacts:customFields:edit');\n    }),\n\n    hasExternalContactsViewSchemaAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('externalContacts:customFields:view');\n    }),\n\n    hasViewEvaluationAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('quality:evaluation:view');\n    }),\n\n    // Check permission to notify the adherence explanation\n    hasAdherenceExplanationNotifyAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('wfm:adherenceExplanation:notify');\n    }),\n\n    // Check permission to view the adherence explanation\n    hasAdherenceExplanationViewAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('wfm:adherenceExplanation:view');\n    }),\n\n    // Check permission to edit the adherence explanations\n    hasAdherenceExplanationEditAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('wfm:adherenceExplanation:edit');\n    }),\n\n    // Checking against the donut permission: conversation:call:add or unified_communications\n    // Eventually when unified_communications is removed, we can remove the check here\n    phoneEnabled: computed(\n        'hasUnifiedCommunications',\n        'donutPermissions',\n        'directoryPermissions.[]',\n        'allowedOrgPermissions.[]',\n        function () {\n            const hasUnifiedCommunications = this.hasUnifiedCommunications;\n            const legacyUnifiedCommunicationsPermission = _.includes(\n                this.directoryPermissions,\n                'unified_communications'\n            );\n            const canCall = this.validateDonutPermission('conversation:call:add');\n\n            const phoneEnabled = hasUnifiedCommunications && (legacyUnifiedCommunicationsPermission || canCall);\n            return phoneEnabled;\n        }\n    ),\n\n    canDisassociateSelf: computed('donutPermissions', function () {\n        return this.validateDonutPermission('telephony:station:disassociateSelf');\n    }),\n\n    conferenceEnabled: true,\n\n    canCallForward: computed('phoneEnabled', 'donutPermissions', 'allowedOrgPermissions.[]', function () {\n        return this.validateDonutPermission('conversation:callForwarding:edit') && this.phoneEnabled;\n    }),\n\n    canRecord: computed('rolePermissions', 'donutPermisions', 'allowedOrgPermissions.[]', function () {\n        const canRecord = this.validateDonutPermission('conversation:call:record');\n        const isBusinessUserOrSupervisor =\n            this.rolePermissions.indexOf('businessUser') > -1 || this.rolePermissions.indexOf('supervisor') > -1;\n        return isBusinessUserOrSupervisor || canRecord;\n    }),\n\n    canFax: computed('donutPermissions', 'allowedOrgPermissions.[]', function () {\n        return this.validateDonutPermission('conversation:fax:send');\n    }),\n\n    canDeleteFiles: computed('donutPermissions', function () {\n        return this.validateDonutPermission('chat:file:delete');\n    }),\n\n    hasEngageAccess: computed('session.org.enabledFeatures.{purecloud,contactCenter}', function () {\n        let hasContactCenter = this.get('session.org').getFieldValue('enabledFeatures.contactCenter');\n        return hasContactCenter && hasContactCenter.value;\n    }),\n\n    canViewOutboundCampaigns: computed('donutPermissions', function () {\n        return this.validateDonutPermission('outbound:campaign:view');\n    }),\n\n    canSearchOutboundCampaigns: computed('donutPermissions', function () {\n        return this.validateDonutPermission('outbound:campaign:search');\n    }),\n\n    canViewContactLists: computed('donutPermissions', function () {\n        return this.validateDonutPermission('outbound:contactList:view');\n    }),\n\n    canViewFlows: computed('donutPermissions', function () {\n        return this.validateDonutPermission('architect:flow:view');\n    }),\n\n    canViewFlowAggregates: computed('donutPermissions', function () {\n        return this.validateDonutPermission('analytics:flowAggregate:view');\n    }),\n\n    canSearchFlows: computed('donutPermissions', function () {\n        return this.validateDonutPermission('architect:flow:search');\n    }),\n\n    canViewAssociateDashboard: computed('donutPermissions', 'session.features.PURE-6631', function () {\n        const permission = this.validateDonutPermission('associateUser:associateUserDashboard:view');\n        const featureToggle = this.get('session.features.PURE-6631');\n        return permission && featureToggle;\n    }),\n\n    hasSavedFilterAccess: computed('donutPermissions', function () {\n        return (\n            this.validateDonutPermission('analytics:viewConfigurations:view') &&\n            this.validateDonutPermission('analytics:viewConfigurations:edit')\n        );\n    }),\n\n    canViewUsers: computed('donutPermissions', function () {\n        return this.validateDonutPermission('directory:user:view');\n    }),\n\n    hasReportingExportAccess: computed('donutPermissions', function () {\n        return this.validateDonutPermission('analytics:dataExport:view');\n    }),\n\n    canCreateReportingExports: computed('donutPermissions', function () {\n        return this.validateDonutPermission('analytics:dataExport:add');\n    }),\n\n    canEditReportingExports: computed('donutPermissions', function () {\n        return this.validateDonutPermission('analytics:dataExport:edit');\n    }),\n\n    canDeleteReportingExports: computed('donutPermissions', function () {\n        return this.validateDonutPermission('analytics:dataExport:delete');\n    }),\n\n    canViewStaticLink: computed('donutPermissions', function () {\n        return this.validateDonutPermission('analytics:dataExportStaticLink:view');\n    }),\n\n    hasReportingAlertAccess: computed('donutPermissions', function () {\n        return this.validateDonutPermission('alerting:alert:view');\n    }),\n\n    canEditReportingAlerts: computed('donutPermissions', function () {\n        return this.validateDonutPermission('alerting:alert:edit');\n    }),\n\n    canEditReportingAlertRules: computed('donutPermissions', function () {\n        return this.validateDonutPermission('alerting:rule:edit');\n    }),\n\n    canDeleteReportingAlerts: computed('donutPermissions', function () {\n        return this.validateDonutPermission('alerting:alert:delete');\n    }),\n\n    canViewSupervisorStatusControls: computed('donutPermissions', function () {\n        return this.validateDonutPermission('ui:supervisorStatusControl:view');\n    }),\n\n    canEditProfiles: computed('donutPermissions', function () {\n        return this.validateDonutPermission('directory:user:edit');\n    }),\n\n    canReadProfiles: computed('donutPermissions', function () {\n        return this.validateDonutPermission('directory:user:view');\n    }),\n\n    canViewGroups: computed('donutPermissions', function () {\n        return this.validateDonutPermission('directory:group:view');\n    }),\n\n    canEditGroups: computed('donutPermissions', function () {\n        return this.validateDonutPermission('directory:group:edit');\n    }),\n\n    canEditSkillGroups: computed('donutPermissions', function () {\n        return this.validateDonutPermission('routing:skillgroup:edit');\n    }),\n\n    canViewOAuthClients: computed('donutPermissions', function () {\n        return this.validateDonutPermission('oauth:client:view');\n    }),\n\n    canDeleteParticipantFromGroup: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('chat:participant:delete');\n    }),\n\n    canViewZoomMeetings: computed('donutPermissions', function () {\n        return this.validateDonutPermission('integration:zoomMeetings:view');\n    }),\n\n    canViewTeamsMeetings: computed('donutPermissions', function () {\n        return this.validateDonutPermission('integration:microsoftTeamsMeetings:view');\n    }),\n\n    canViewJourneyAggregates: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('analytics:journeyAggregate:view');\n    }),\n\n    canViewActionMaps: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('journey:actionmap:view');\n    }),\n\n    canViewTopicTrends: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return (\n            this.validateDonutPermission('analytics:speechAndTextAnalyticsAggregates:view') &&\n            this.validateDonutPermission('speechAndTextAnalytics:topic:view')\n        );\n    }),\n\n    canViewBotAggregates: computed('donutPermissions', function () {\n        return this.validateDonutPermission('analytics:botAggregate:view');\n    }),\n\n    canViewDirectory: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('ui:myOrganization:view');\n    }),\n\n    canTargetUserSearchOutsideOfDivision: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('conversation:communication:target');\n    }),\n\n    canTargetQueueSearchOutsideOfDivision: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('conversation:communication:target');\n    }),\n\n    canEditGroupTelephonySettings: computed(\n        'donutPermissions',\n        'allowedOrgPermissions',\n        'session.features',\n        function () {\n            return this.validateDonutPermission('telephony:plugin:all');\n        }\n    ),\n\n    hasPredictiveRoutingAccess: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return (\n            this.validateDonutPermission('routing:queue:view') && this.validateDonutPermission('routing:predictor:view')\n        );\n    }),\n\n    canViewIntegrationPresence: computed('donutPermissions', 'allowedOrgPermissions', 'session.features', function () {\n        return this.validateDonutPermission('integration:presence:view');\n    }),\n\n    canEditOwnDirectRoutingSettings: computed('donutPermissions', function () {\n        return this.validateDonutPermission('routing:directRoutingBackup:selfEdit');\n    }),\n\n    canViewOwnDirectRoutingSettings: computed('donutPermissions', function () {\n        return this.validateDonutPermission('routing:directRoutingBackup:selfView');\n    }),\n\n    canDeleteOwnDirectRoutingSettings: computed('donutPermissions', function () {\n        return this.validateDonutPermission('routing:directRoutingBackup:selfDelete');\n    }),\n\n    canViewWorkitem: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('workitems:workitem:view');\n    }),\n\n    canViewParkedEmails: computed('donutPermissions', function () {\n        return this.validateAnyPermissions(['conversation:email:park', 'conversation:message:park']);\n    }),\n\n    canViewJourneyAnalytics: computed('donutPermissions', function () {\n        return this.validateDonutPermission('journey:views:view');\n    }),\n\n    canViewSummary: computed('donutPermissions', function () {\n        return this.validateDonutPermission('conversation:summary:view');\n    }),\n\n    canViewDirectTransferToVoicemail: computed('donutPermissions', 'allowedOrgPermissions', function () {\n        return this.validateDonutPermission('user:voicemail:transfer');\n    }),\n\n    canBlindTransfer: computed('donutPermissions', function () {\n        return this.validateDonutPermission('conversation:communication:blindTransfer');\n    }),\n\n    canBlindTransferAgent: computed('donutPermissions', 'canBlindTransfer', function () {\n        return this.canBlindTransfer || this.validateDonutPermission('conversation:communication:blindTransferAgent');\n    }),\n\n    canBlindTransferQueue: computed('donutPermissions', 'canBlindTransfer', function () {\n        return this.canBlindTransfer || this.validateDonutPermission('conversation:communication:blindTransferQueue');\n    }),\n\n    canBlindTransferExternal: computed('donutPermissions', 'canBlindTransfer', function () {\n        return (\n            this.canBlindTransfer ||\n            this.validateDonutPermission('conversation:communication:blindTransferExternalContact')\n        );\n    }),\n\n    canConsultTransfer: computed('donutPermissions', function () {\n        return this.validateDonutPermission('conversation:communication:consultTransfer');\n    }),\n\n    canConsultTransferAgent: computed('donutPermissions', 'canConsultTransfer', function () {\n        return (\n            this.canConsultTransfer || this.validateDonutPermission('conversation:communication:consultTransferAgent')\n        );\n    }),\n\n    canConsultTransferQueue: computed('donutPermissions', 'canConsultTransfer', function () {\n        return (\n            this.canConsultTransfer || this.validateDonutPermission('conversation:communication:consultTransferQueue')\n        );\n    }),\n\n    canConsultTransferExternal: computed('donutPermissions', 'canConsultTransfer', function () {\n        return (\n            this.canConsultTransfer ||\n            this.validateDonutPermission('conversation:communication:consultTransferExternalContact')\n        );\n    }),\n\n    canSetupDigitalConsult: computed('donutPermissions', 'session.features.PURE-5007_digitalConsult', function () {\n        if (!this.get('session.features.PURE-5007_digitalConsult')) return false;\n        return this.validateDonutPermission('conversation:internalMessaging:setupWithUser');\n    }),\n\n    canReceiveInteractionsAvailableOffQueue: computed('donutPermissions', function () {\n        return this.validateDonutPermission('routing:conversation:acceptOffQueue');\n    }),\n\n    canViewCopilot: computed('donutPermissions', function () {\n        return this.validateDonutPermission('assistants:copilot:view');\n    }),\n\n    canViewAgentGreetings: computed('donutPermissions', function () {\n        return this.validateDonutPermission('telephony:selfAgentGreeting:view');\n    }),\n\n    allowOutboundExternalCall: computed('donutPermissions', function () {\n        return this.validateDonutPermission('telephony:outboundExternal:allowCommunicateCall');\n    }),\n\n    allowOutboundUserCall: computed('donutPermissions', function () {\n        return this.validateDonutPermission('telephony:outboundUser:allowCommunicateCall');\n    }),\n\n    canAddLogCaptureOnDemand: computed('donutPermissions', function () {\n        return this.validateDonutPermission('troubleshooting:logCaptureOnDemand:add');\n    }),\n\n    canViewCopilotFrameworkMessage: computed('donutPermissions', function () {\n        return this.validateDonutPermission('copilot:message:view');\n    }),\n\n    canSnippetRecord: computed('donutPermissions', 'session.features.WEM-118_snippet-recording', function () {\n        if (!this.get('session.features.WEM-118_snippet-recording')) return false;\n        return this.validateDonutPermission('conversation:recording:snippetRecord');\n    }),\n\n    canViewCustomerIntents: computed('donutPermissions', 'session.features.PURE-6462_CustomerIntents', function () {\n        // if the feature toggle is not enabled then the user automatically is exempt from access\n        if (!this.get('session.features.PURE-6462_CustomerIntents')) return false;\n        return this.validateDonutPermission('externalContacts:customerIntentAssignments:view');\n    }),\n\n    canTakeoverMessage: computed('donutPermissions', 'session.features.PURE-6914', function () {\n        if (!this.get('session.features.PURE-6914')) return false;\n        return this.validateDonutPermission('conversation:message:takeover');\n    })\n});\n","import { typeOf } from '@ember/utils';\nimport { Promise } from 'rsvp';\nimport Evented, { on } from '@ember/object/evented';\nimport Service, { inject as service } from '@ember/service';\nimport { computed, observer, get } from '@ember/object';\nimport _ from 'lodash';\nimport { addPageAction } from '../utils/newrelic';\n\nexport const DEFAULT_PHONE_INTEGRATION_KEY = 'genesys';\nexport const GENESYS_SEARCH_TAB = {\n    key: 'genesys',\n    icon: 'assets/images/svg/genesys-logo-red.svg'\n};\nconst CONFIG_PAGE_SIZE = 25;\nconst CONFIGS_API_URL_V2 = 'api/v2/integrations/unifiedcommunications/clientapps'; // New integrations config endpoint\nconst NEW_RELIC_NAMESPACE = 'ucc.ui.integration';\n\nexport default Service.extend(Evented, {\n    application: service(),\n    ajax: service(),\n    session: service(),\n    intl: service(),\n    permissions: service(),\n    store: service(),\n    notification: service(),\n    sidebar: service(),\n    integrationsPresence: service(),\n    logger: service('stash-logger'),\n\n    newRelicNamespace: NEW_RELIC_NAMESPACE,\n\n    integrations: computed('allApps', 'permissions.donutPermissions', 'permissions.allowedOrgPermissions', function () {\n        const allApps = this.allApps;\n        return allApps.filter(this._isValidIntegrationTab.bind(this));\n    }),\n\n    canUseIncludeBadge: computed('session.features', function () {\n        return this.getFeatureToggle('GCUCCUI-2587_includeBadge');\n    }),\n\n    allApps: [],\n    integrationConfigs: [],\n\n    onAuthenticated: on(\n        'init',\n        observer('session.isAuthenticated', async function () {\n            // only try to fetch configs if we're authenticated\n            if (this.get('session.isAuthenticated') && !this.integrationConfigsInitialized) {\n                this.toggleProperty('integrationConfigsInitialized');\n\n                this._fetchConfigs()\n                    .then(configs => {\n                        this.set('integrationConfigs', configs);\n\n                        // configs have enough information to gate users\n                        this.set('allApps', configs);\n                    })\n                    .catch(err => {\n                        this.logger.error(\n                            `services/phone-integration: Phone Integration Service: error fetching integration configurations`,\n                            { err }\n                        );\n                    });\n            }\n        })\n    ),\n\n    init() {\n        this._super(...arguments);\n\n        // use this to trigger observer to fetch configs\n        this.get('session.isAuthenticated');\n    },\n    getIntegrationTabs() {\n        const integrations = this.integrations;\n        const tabs = [\n            GENESYS_SEARCH_TAB,\n            ...integrations.map(integration => {\n                return {\n                    key: integration.key,\n                    integrationPresenceSource: integration.integrationPresenceSource,\n                    icon: integration.icon,\n                    translation: integration.translation\n                };\n            })\n        ];\n        return integrations.length > 0 ? tabs : [];\n    },\n    getIntegration(key) {\n        const integrations = this.getIntegrationTabs();\n        return integrations.find(i => i.key === key);\n    },\n\n    canViewThirdPartyPresence(source) {\n        const integration = this.getIntegrationFromSource(source);\n        return integration && this._isValidIntegrationTab(integration);\n    },\n\n    getIntegrationFromSource(source) {\n        const allApps = this.allApps;\n        return allApps.find(integration => {\n            return (\n                integration.integrationPresenceSource &&\n                integration.integrationPresenceSource.toLowerCase() === source.toLowerCase()\n            );\n        });\n    },\n\n    async getIntegrationTransferTarget(person, integrationKey) {\n        if (!person || !person.integrationContactInfo || !integrationKey) {\n            return null;\n        }\n\n        let contact = person.integrationContactInfo(integrationKey);\n        if (contact) {\n            try {\n                // make users api call to get address\n                const url = this.application.pcV2Uri(`api/v2/users/${person.get('id')}`);\n                const user = await this.ajax.ajaxGet(url, { dataType: 'json' });\n                const addressObj = user.addresses.find(add => add.integration && add.integration === integrationKey);\n                if (addressObj) {\n                    return addressObj.address;\n                }\n            } catch (err) {\n                // if error, we'll fallback to how we were initially attempting with e164 data\n                this.logger.warn(\n                    'PBX Transfer: attempted to fetch user address, but failed. Falling back to e164 data.',\n                    {\n                        err\n                    }\n                );\n            }\n\n            // fallback\n            if (contact.rel && contact.rel.e164) {\n                return contact.rel.e164;\n            } else {\n                this.logger.warn('Attempted transfer to integration user, but e164 data not found:', {\n                    remoteData: {\n                        userId: person.get('id'),\n                        integration: integrationKey\n                    }\n                });\n            }\n        }\n        return null;\n    },\n\n    /**\n     * Creates an instant meeting for the provided 3rd party integration.\n     * @param {string} integrationId 3rd party integration id (zoomphone, microsoftteams)\n     * @returns\n     */\n    async createInstantMeeting(integrationId) {\n        const createMeetingUrl = this.application.pcV2Uri(\n            `api/v2/integrations/unifiedcommunications/${integrationId}/meetings`\n        );\n        const meeting = await this.ajax.post(createMeetingUrl, {\n            dataType: 'json',\n            data: {\n                title: 'Genesys Instant Meeting'\n            }\n        });\n        return meeting;\n    },\n\n    getFeatureToggle(toggle) {\n        return this.get('session.features') && this.get('session.features')[toggle];\n    },\n\n    isIntegrationAuthError(err) {\n        return err.payload && err.payload.message === 'Session not available, new authorization code must be defined!';\n    },\n\n    _fetchConfigs() {\n        let allConfigsPromise = new Promise((resolve, reject) => {\n            this._accumulateConfigs(\n                configs => {\n                    resolve(configs);\n                },\n                reason => {\n                    reject(reason);\n                },\n                1,\n                CONFIG_PAGE_SIZE,\n                null\n            );\n        });\n        return allConfigsPromise;\n    },\n\n    /**\n     * Recursively get integration configuration objects.\n     * @param {function} resolve resolver function to call with the configurations as the parameter\n     * @param {function} reject rejection function to call with the rejection reason as the parameter\n     * @param {number} pageNumber current page number\n     * @param {number} pageSize current page size\n     * @param {object} configs accumulated configuration objects\n     */\n    _accumulateConfigs(resolve, reject, pageNumber, pageSize, configs) {\n        if (typeof configs === 'undefined' || configs === null) {\n            configs = [];\n        }\n        let configsUrl = this.application.pcV2Uri(CONFIGS_API_URL_V2);\n        let queryParams = {\n            pageNumber,\n            pageSize\n        };\n        configsUrl += `?${new URLSearchParams(queryParams).toString()}`;\n        this.ajax\n            .request(configsUrl)\n            .then(result => {\n                if (!result) {\n                    reject('Invalid integration configs return value');\n                    return;\n                }\n                if (Array.isArray(result.entities)) {\n                    let validConfigObjs = _.chain(result.entities)\n                        .filter(config => this._isValidIntegrationConfig(config))\n                        .map(config => this._mapIntegrationConfig(config))\n                        .value();\n\n                    configs.push(...validConfigObjs);\n                }\n                // continue accumulating configs if more pages exist\n                if (result.pageNumber < result.pageCount) {\n                    this._accumulateConfigs(resolve, reject, result.pageNumber + 1, pageSize, configs);\n                } else {\n                    resolve(configs);\n                }\n            })\n            .catch(reject);\n    },\n\n    _isValidIntegrationConfig(config) {\n        return (\n            config &&\n            typeof config === 'object' &&\n            typeOf(get(config, 'id')) === 'string' &&\n            typeOf(get(config, 'ucIntegrationKey.id')) === 'string'\n        );\n    },\n\n    _mapIntegrationConfig(config) {\n        const key = get(config, 'ucIntegrationKey.id');\n\n        const i10n = get(config, 'i10n');\n        const systemLocale = this.get('intl.systemLocale').toLowerCase();\n        let translation = key;\n\n        if (i10n !== undefined) {\n            if (i10n[systemLocale] && i10n[systemLocale].name) {\n                translation = i10n[systemLocale].name;\n            }\n        }\n\n        return {\n            id: get(config, 'id'),\n            key,\n            integrationPresenceSource: get(config, 'integrationPresenceSource'),\n            icon: get(config, 'icon.vector'),\n            badgeIcons: {\n                light: get(config, 'badgeIcons.light.vector'),\n                dark: get(config, 'badgeIcons.dark.vector')\n            },\n            translation,\n            pbxPermission: get(config, 'pbxPermission'),\n            pollingEnabled: get(config, 'polledPresence'),\n            pollIntervalSec: get(config, 'pollIntervalSec'),\n            includeBadge: this.canUseIncludeBadge ? get(config, 'includeBadge') : true\n        };\n    },\n\n    _isValidIntegrationTab(clientApp) {\n        const key = get(clientApp, 'key');\n        const hasUcIntegrationKey = key && key !== '';\n        const pbxPermission = get(clientApp, 'pbxPermission');\n        // gate the integration tab based on pbx permission\n        if (pbxPermission !== undefined) {\n            const permissionService = this.permissions;\n            const canViewPbxTab = permissionService.validateDonutPermission(pbxPermission);\n            return hasUcIntegrationKey && canViewPbxTab;\n        }\n        return hasUcIntegrationKey;\n    },\n    sendNewRelicAction(metric, value, ucIntegrationKey) {\n        //capture analytics & send to new relic for UC Integrations\n        addPageAction(this.newRelicNamespace, {\n            metric,\n            value,\n            ucIntegrationKey\n        });\n    }\n});\n","/* eslint no-console: \"off\" */\n\nimport { alias, and, equal, readOnly, reads } from '@ember/object/computed';\n\nimport { getOwner } from '@ember/application';\nimport { computed, get, observer, set } from '@ember/object';\nimport Evented from '@ember/object/evented';\nimport Service, { inject as service } from '@ember/service';\nimport RSVP from 'rsvp';\n\nimport { A } from '@ember/array';\nimport Ember from 'ember';\nimport { task, timeout } from 'ember-concurrency';\nimport _ from 'lodash';\n\n// models\nimport ConversationModel from 'web-directory/models/conversation-legacy';\nimport CallInteraction from 'web-directory/models/interaction/call-interaction';\nimport Interaction from 'web-directory/models/interaction/interaction';\n\n// mixins\nimport AcdUtilitiesMixin from 'web-directory/mixins/acd-utilities';\nimport ConversationMixin from 'web-directory/mixins/conversation';\nimport UriBuilderMixin from 'web-directory/mixins/conversation-uri-builder';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport ActiveCallMixin from 'web-directory/mixins/phone-service/active-call';\nimport CallControlsMixin from 'web-directory/mixins/phone-service/call-controls';\nimport CallForwardMixin from 'web-directory/mixins/phone-service/call-forward';\nimport ConversationManagerMixin from 'web-directory/mixins/phone-service/conversation-manager';\nimport EventsMixin from 'web-directory/mixins/phone-service/events';\nimport PhoneNotificationsMixin from 'web-directory/mixins/phone-service/notifications';\nimport StationMixin from 'web-directory/mixins/phone-service/station';\n\n// utils\nimport { isTesting } from 'web-directory/utils/testing';\nimport webrtcConversationTypes from 'web-directory/utils/webrtc-conversation-types';\nimport { isScreenMonitoringParticipant, setInteractionModelMetadata } from '../utils/acd';\nimport QueuedProcessingChain from '../utils/queued-processing-chain';\n\nexport function isDefinedAndLengthGreaterThan(obj, n) {\n    if (obj) {\n        if (!obj.length) {\n            return false;\n        } else if (obj.length > n) {\n            return true;\n        }\n        return false;\n    }\n    return false;\n}\nconst { Logger } = Ember;\n\nconst VOICEMAIL_URL = '@127.0.0.1;user=voicemail';\nconst MAX_CALL_HISTORY_SIZE = 15;\n\nconst mixins = [\n    AcdUtilitiesMixin,\n    ActiveCallMixin,\n    CallControlsMixin,\n    CallForwardMixin,\n    ConversationMixin,\n    ConversationManagerMixin,\n    EventsMixin,\n    LoggerMixin,\n    PhoneNotificationsMixin,\n    StationMixin,\n    UriBuilderMixin\n];\n\nexport default Service.extend(Evented, ...mixins, {\n    isDefinedAndLengthGreaterThan: isDefinedAndLengthGreaterThan,\n\n    // services\n    session: service(),\n    application: service(),\n    pigeon: service(),\n    streaming: service(),\n    communication: service(),\n    permissions: service(),\n    webrtc: service(),\n    sidebar: service(),\n    commandNav: service('command-nav'),\n    intl: service(),\n    addressformat: service(),\n    notification: service(),\n    ajax: service(),\n    preferences: service(),\n    externalContacts: service(),\n    customerIntent: service(),\n    acdcall: service(),\n    ring: service(),\n    headset: service(),\n    webrtcSdkService: service('webrtcSdk'),\n    acdinitialization: service(),\n\n    applicationController: null, // needed?\n\n    _processingChain: null,\n    _contactObservers: null,\n\n    ringerVolume: alias('ring.ringerVolume'),\n    callVolume: alias('ring.callVolume'),\n    callActiveRingerVolume: alias('ring.callActiveRingerVolume'),\n    _callsReadyPromise: null,\n    _callsReadyResolve: null,\n\n    currentCallHistory: [],\n    allEmergencyNumbers: null,\n\n    init() {\n        this._super(...arguments);\n        this.set('_contactObservers', {});\n        this._callsReadyPromise = new RSVP.Promise(resolve => {\n            this._callsReadyResolve = resolve;\n        });\n        this.acdinitialization.registerPromise(this._callsReadyPromise);\n        this._initializeProcessingChain();\n        try {\n            this.preferences.getPreference('phone.thisBrowserIsTheOneToAnswerFrom').then(value => {\n                if (!this.isDestroyed && !this.isDestroying) {\n                    this.set('thisBrowserIsTheOneToAnswerFrom', value);\n                }\n            });\n\n            this.communication.on('callTransferred', this, this._handleCallTransferred);\n        } catch (err) {\n            if (!isTesting) throw err;\n        }\n    },\n\n    _initializeProcessingChain() {\n        const interactionProcessingChain = QueuedProcessingChain.create({\n            lifecycleContainer: this,\n            label: 'phone service: interaction processing chain'\n        });\n        this.set('_processingChain', interactionProcessingChain);\n        interactionProcessingChain.setProcessingChain([\n            {\n                label: 'Filtering and Context Acquisition',\n                process: ({ eventSource, payload }) => {\n                    if (!payload || !payload.id) return false;\n\n                    const interactionType = this.getInteractionTypeFromCP(payload);\n                    if (\n                        !interactionType.isCall ||\n                        (interactionType.isCall && interactionType.isCallback) ||\n                        interactionType.isFax\n                    ) {\n                        return false;\n                    }\n\n                    const calls = this.conversations;\n                    let interactionModel = calls.findBy('id', payload.id);\n                    const newInteraction = !interactionModel;\n                    const prevRaw = interactionModel && interactionModel.get('__interaction_metadata__');\n                    const currentCallState = interactionModel ? this._getCallState(interactionModel) : null;\n                    const participants = get(payload, 'participants');\n                    const isAgentCall = participants.any(party => party.purpose && party.purpose === 'agent');\n\n                    // Halt chain and filter out interaction when user is only screen monitoring\n                    const participant = _.last(\n                        participants.filter(p => p.userId === this.personGuid && !isScreenMonitoringParticipant(p))\n                    );\n\n                    if (!participant) {\n                        return false;\n                    }\n\n                    const participantCall = this.getParticipantCall(participant);\n                    const participantOnCall = participantCall\n                        ? ['alerting', 'contacting', 'dialing', 'connected'].indexOf(\n                              participantCall.state.toLowerCase()\n                          ) > -1\n                        : false;\n                    const participantIsNotVoicemail = (participant.purpose || '').toLowerCase() !== 'voicemail';\n                    const isActiveOnCall = participantCall && participantOnCall && participantIsNotVoicemail;\n                    const newCallState = participantCall.state.toLowerCase();\n\n                    const onCall = interactionModel && interactionModel.get('onCall');\n                    const shouldUpdate = isAgentCall || isActiveOnCall || onCall || newCallState === 'terminated';\n\n                    if (newInteraction) {\n                        // ownerInjection() must be the first arg in Ember 3.28\n                        interactionModel = ConversationModel.create(\n                            Object.assign({}, payload, getOwner(this).ownerInjection())\n                        );\n                        // Immediately destroy the model and halt the chain if we\n                        // get a new inactive interaction.\n                        if (isAgentCall && !this._isInteractionActive(interactionModel)) {\n                            interactionModel.destroy();\n                            return false;\n                        }\n\n                        if (isAgentCall && get(interactionModel, 'callState.initialState') === 'connected') {\n                            // i.e. call was auto answered\n                            this.trigger('autoAnswer', get(interactionModel, 'id'));\n                        }\n                    }\n\n                    // Log a message for the webrtc timeline if the state changes\n                    if (!currentCallState || currentCallState !== newCallState) {\n                        this.logger.info('Received conversationUpdate with new call state', {\n                            remoteData: { conversationId: payload.id, participantState: newCallState }\n                        });\n                    }\n\n                    return {\n                        eventSource,\n                        payload,\n                        prevRaw,\n                        isAgentCall,\n                        isActiveOnCall,\n                        currentCallState,\n                        interactionModel,\n                        newCallState,\n                        newInteraction,\n                        participantIsNotVoicemail,\n                        shouldUpdate\n                    };\n                }\n            },\n            {\n                label: 'Answer Call',\n                process: ({ payload, currentCallState, newCallState, participantIsNotVoicemail }) => {\n                    if (\n                        currentCallState &&\n                        participantIsNotVoicemail &&\n                        currentCallState !== 'connected' &&\n                        newCallState === 'connected' &&\n                        !this.get('webrtcSdkService.useSdk')\n                    ) {\n                        this.headset.answerCall(payload.id, this.get('connectedConversations.length') >= 1);\n                    }\n                }\n            },\n            {\n                label: 'After connected task',\n                process: ({ payload, currentCallState, newCallState, participantIsNotVoicemail }) => {\n                    /**\n                     * SERVOPS-34068 ACE-2594 when an agent has a dialing outbound call and receives an inbound\n                     * call, there is a chance that both are answered almost simultaneously. If that happens, the\n                     * agent ends up connected to two calls where both are active and not held/confined. Hold\n                     * attempt at the time of incoming-call answer (agent action) is too early as the conversation\n                     * is not connected yet. This ensures the hold attempt happens after conversation is connected.\n                     */\n                    if (!currentCallState || !newCallState) return; // Protection from undefined states\n                    if (participantIsNotVoicemail && currentCallState !== 'connected' && newCallState === 'connected') {\n                        const conversationId = payload.id;\n                        const conversations = this.conversations || [];\n                        const currConversation = conversations.find(convo => convo.id === conversationId);\n\n                        this._holdOtherActiveConversations(currConversation);\n                    }\n                }\n            },\n            {\n                label: 'End Call',\n                process: ({ payload, currentCallState, newCallState }) => {\n                    if (!currentCallState) {\n                        return;\n                    }\n\n                    if (this.get('webrtcSdkService.useSdk')) {\n                        return;\n                    }\n\n                    if (currentCallState !== 'disconnected' && newCallState === 'disconnected') {\n                        this.headset.endCall(payload.id, this.get('connectedConversations.length') > 1);\n                    }\n                }\n            },\n            {\n                label: 'Listen for changes on External Contacts attached to customer participant',\n                process: async ({ prevRaw, payload, interactionModel, isAgentCall }) => {\n                    // Under PURE-7222 Associate User (Modes), the conversation-mode-service call chain owns ACD-specific\n                    // processing (external contacts, customer intent) for agent calls. Skip here\n                    // to avoid double-registering listeners. Phone still owns non-ACD/UC calls.\n                    if (this.get('session.useModes') && isAgentCall) {\n                        return;\n                    }\n                    const modelsToDestroy = [];\n                    const buildModel = rawData => {\n                        // ownerInjection() must be the first arg in Ember 3.28\n                        const conversationModel = ConversationModel.create(\n                            Object.assign({}, rawData, getOwner(this).ownerInjection())\n                        );\n                        set(conversationModel, 'type', 'call');\n                        modelsToDestroy.push(conversationModel);\n\n                        const interactionModel = CallInteraction.create(getOwner(this).ownerInjection());\n                        Object.keys(conversationModel).forEach(key => {\n                            interactionModel.set(key, conversationModel[key]);\n                        });\n                        interactionModel.set('conversation', conversationModel);\n                        return interactionModel;\n                    };\n                    const { id } = payload;\n                    const contactObserver = this.get(`_contactObservers.${id}`) || function () {};\n                    this.set(`_contactObservers.${id}`, contactObserver);\n                    const externalContacts = this.externalContacts;\n\n                    try {\n                        await externalContacts.addContactChangeListenersForInteraction(\n                            buildModel,\n                            payload,\n                            prevRaw,\n                            contactObserver\n                        );\n                    } catch (e) {\n                        this.logger.error('ACD: Failed to add external contact change listeners on phone interaction', {\n                            e,\n                            remoteData: {\n                                interactionId: id\n                            }\n                        });\n                        externalContacts.removeContactChangeListenersForInteraction(interactionModel, contactObserver);\n                        this.set(`_contactObservers.${id}`, undefined);\n                    }\n\n                    modelsToDestroy.forEach(m => m.destroy());\n                }\n            },\n            {\n                label: 'Timedboxed Wrapup Missed Timer',\n                process: ({ payload, newInteraction, isAgentCall }) => {\n                    // Under PURE-7222 Associate User (Modes), the conversation-mode-service call chain owns the timed-wrapup\n                    // timer for agent calls. Skip here to avoid double-handling.\n                    if (this.get('session.useModes') && isAgentCall) {\n                        return;\n                    }\n                    if (!newInteraction) {\n                        // ownerInjection() must be the first arg in Ember 3.28\n                        const conversationModel = ConversationModel.create(\n                            Object.assign({}, payload, getOwner(this).ownerInjection())\n                        );\n                        set(conversationModel, 'type', 'call');\n                        this.handleMissedTimedBoxTimer(this, payload, CallInteraction, conversationModel);\n                        conversationModel.destroy();\n                    }\n                }\n            },\n            {\n                label: 'Update State Step',\n                process: ({\n                    payload,\n                    isAgentCall,\n                    currentCallState,\n                    interactionModel,\n                    newCallState,\n                    newInteraction,\n                    shouldUpdate\n                }) => {\n                    if (shouldUpdate) {\n                        if (!newInteraction) {\n                            interactionModel.setProperties(payload);\n                        }\n\n                        setInteractionModelMetadata(interactionModel, payload);\n\n                        if (isAgentCall && currentCallState !== 'connected' && newCallState === 'alerting') {\n                            set(interactionModel, 'acceptedByClient', false);\n                        }\n                    }\n\n                    // the consultParticipantId needs to be retained even when the call is no longer\n                    // on consult because of use cases identified in SERVOPS-11175\n                    const consultParticipantId = _.last(\n                        interactionModel.participants.filterBy('purpose', 'customer').mapBy('consultParticipantId')\n                    );\n                    if (consultParticipantId) {\n                        set(interactionModel, 'consultParticipantId', consultParticipantId);\n                    }\n\n                    if (shouldUpdate) {\n                        if (newInteraction) {\n                            // Under Modes, the conversation-mode-service call chain processes the same\n                            // agent-call events and also registers a ConversationModel for this id. Route\n                            // through addOrGetConversation so both chains share a single instance. The Modes\n                            // chain registers in its first step while phone registers here (a later step), so\n                            // the Modes instance is usually already canonical; in that case addOrGetConversation\n                            // returns it and we destroy phone's losing candidate to avoid leaking it.\n                            // Non-agent (UC) calls have no competing producer, so phone pushes directly.\n                            if (this.get('session.useModes') && isAgentCall) {\n                                const canonical = this.addOrGetConversation(interactionModel);\n                                if (canonical !== interactionModel) {\n                                    const losingCandidate = interactionModel;\n                                    interactionModel = canonical;\n                                    losingCandidate.destroy();\n                                }\n                            } else {\n                                this.get('conversations').pushObject(interactionModel);\n                            }\n                        }\n                        this.trigger(`conversations.${interactionModel.get('id')}`);\n                    }\n\n                    if (shouldUpdate || newCallState === 'terminated') {\n                        this.notifyPropertyChange('conversations');\n                        this.notifyPropertyChange('recentDisconnectedAgentCalls');\n                        this._logConversationDetails(interactionModel);\n                    }\n                }\n            },\n            {\n                label: 'Update Interaction Model - External Contact',\n                process: async ({ shouldUpdate, interactionModel, payload, isAgentCall }) => {\n                    // Under PURE-7222 Associate User (Modes), the conversation-mode-service call chain owns external-contact\n                    // info for agent calls. Skip here to avoid double-setting. Phone still owns\n                    // non-ACD/UC calls.\n                    if (this.get('session.useModes') && isAgentCall) {\n                        return;\n                    }\n                    if (!shouldUpdate) {\n                        return;\n                    }\n\n                    // TechDebt:  For now, we'll maintain feature parity.  But, eventually, we should\n                    // not mix server and UI state\n                    try {\n                        await this.externalContacts.setExternalContactInfo(interactionModel, payload);\n                    } catch (e) {\n                        this.logger.error('ACD Phone: Failed to set External Contact Model data', {\n                            e,\n                            remoteData: {\n                                interactionId: interactionModel.get('id')\n                            }\n                        });\n                    }\n                }\n            },\n            {\n                label: 'Cleanup Step',\n                process: () => {\n                    // Ideally, we would definitively know when a conversation is inactive\n                    // and only clean up that instance.  However, isInteractionActive is not\n                    // supported on conversation models. Rather than build an interim\n                    // model, we'll just call the throttled cleanup method.\n                    this._throttledRemoveDisconnectedConversations.perform();\n                }\n            }\n        ]);\n    },\n\n    _onMyConversationEvent(conversation) {\n        if (this.isDestroyed || this.isDestroying) return;\n        if (!conversation || !conversation.id) return;\n        this._processingChain.enqueueEvent(conversation.id, {\n            eventSource: 'realtime',\n            payload: conversation\n        });\n    },\n\n    _onPigeonConnect() {\n        if (this.isDestroyed || this.isDestroying) return;\n        this.fetchActiveCallConversations()\n            .then(conversations => {\n                conversations.forEach(conversation => {\n                    if (!conversation || !conversation.id) return;\n                    this._processingChain.enqueueEvent(conversation.id, {\n                        eventSource: 'api',\n                        payload: conversation\n                    });\n                });\n            })\n            .catch(err => {\n                this.logger.error('ACD Phone Service: Failed to load active conversations', { err });\n            })\n            .finally(() => {\n                this._throttledRemoveDisconnectedConversations.perform();\n                if (this._callsReadyResolve) {\n                    this._callsReadyResolve();\n                    this._callsReadyResolve = null;\n                }\n            });\n    },\n\n    _getCallState(interaction) {\n        const participant = interaction.get('participants').findBy('userId', this.personGuid);\n        if (!participant) {\n            Logger.error(\n                `Expected to find person {{personGuid}} on conversation {{conversationId}} but person was not found`,\n                { personGuid: this.personGuid, conversationId: interaction.get('id') }\n            );\n            return;\n        }\n        const participantCall = this.getParticipantCall(participant);\n        return participantCall.state ? participantCall.state.toLowerCase() : null;\n    },\n\n    // This is no bueno and needs to go - who knows of all the side effects.\n    // It creates an interaction model to use a utility computed to check if active\n    // then immediately destroys it.\n    // Also note that type is set on the conversation as a side effect.\n    // No idea if it's needed, but it's one obvious side effect that needs to be\n    // considered if we do away with this check.\n    _isInteractionActive(conversation) {\n        set(conversation, 'type', 'call');\n        const interaction = Interaction.create(getOwner(this).ownerInjection());\n        Object.keys(conversation).forEach(key => {\n            interaction.set(key, conversation[key]);\n        });\n        interaction.set('conversation', conversation);\n        const isActive = get(interaction, 'isInteractionActive');\n        interaction.destroy();\n        return isActive;\n    },\n\n    fetchActiveCallConversations() {\n        const url = this.pcUri(`api/${this.convAPIVersion}/conversations`) + '?communicationType=Call';\n        return this.makeRequest(url, { type: 'get' }).then(response => response.entities);\n    },\n\n    // Returns conversation version to use\n    convAPIVersion: 'v2',\n\n    // presence and carrier pigeon stuff\n    presence: reads('session.person.presence'),\n    onQueue: equal('presence', 'on_queue'),\n    carrierPigeonConnected: reads('pigeon.connected'),\n\n    // permissions\n    enabled: reads('permissions.phoneEnabled'),\n    conferenceEnabled: reads('permissions.conferenceEnabled'),\n    canRecord: reads('permissions.canRecord'),\n    canCallForward: reads('permissions.canCallForward'),\n\n    // user info\n    user: reads('session.publicApiUser'),\n    personGuid: reads('session.person.guid'),\n\n    hasAppropriateStreamingConnection: readOnly('streaming.connectedV2'),\n\n    // stations and phone permissions\n    phoneDisabled: computed('webrtc.canUseWebrtcSoftphone', 'station.isWebrtc', 'streaming.connectedV2', function () {\n        return (\n            this.get('station.isWebrtc') &&\n            (!this.get('webrtc.canUseWebrtcSoftphone') || !this.get('streaming.connectedV2'))\n        );\n    }),\n\n    phoneDisabledMessage: computed('phoneDisabled', 'webrtc.{hasMicrophone,audioCallCapable}', function () {\n        if (this.phoneDisabled === false) {\n            return '';\n        }\n        const webrtc = this.webrtc;\n        const audioCallCapable = webrtc.get('audioCallCapable');\n        const hasMicrophone = webrtc.get('hasMicrophone');\n        let key = 'notification.purecloud.selectPhone.unsupportedPhone';\n        if (audioCallCapable && !hasMicrophone) {\n            key = 'notification.purecloud.selectPhone.noMicrophone';\n        }\n        return this.intl.safestring(key).toString();\n    }),\n    phoneAvailable: computed('noStationSelected', 'phoneDisabled', function () {\n        return !(this.noStationSelected || this.phoneDisabled);\n    }),\n    stationHasPersistentConnection: and('station.persistentConnection', 'station.isWebrtc'),\n    persistentConnectionActive: computed(\n        'webrtc.conversations.@each._state',\n        'stationHasPersistentConnection',\n        'webrtcSdkService.{useSdk,isPersistentConnection,hasActiveSoftphoneSession}',\n        function () {\n            if (this.get('webrtcSdkService.useSdk')) {\n                return (\n                    this.get('webrtcSdkService.isPersistentConnection') &&\n                    this.get('webrtcSdkService.hasActiveSoftphoneSession')\n                );\n            }\n\n            if (!this.stationHasPersistentConnection) {\n                return false;\n            }\n            const conversations = this.get('webrtc.conversations');\n            return conversations && !!conversations.findBy('conversationType', webrtcConversationTypes.SOFTPHONE);\n        }\n    ),\n\n    // Toggle to enable answering of calls from this browser session.\n    thisBrowserIsTheOneToAnswerFrom: false,\n    toggleBrowserAnswer() {\n        this.toggleProperty('thisBrowserIsTheOneToAnswerFrom');\n        this.preferences.setPreference('phone.thisBrowserIsTheOneToAnswerFrom', this.thisBrowserIsTheOneToAnswerFrom);\n    },\n\n    // debounce timers and timeout values\n    timeOutToRemove: 8000,\n\n    lastConversationError: null,\n    callsWithErrors: [],\n\n    loaded: false,\n    loading: {\n        muted: false,\n        held: false\n    },\n\n    dtmf: true, // HACK: enable/disable calling pub api for sending dtmf\n\n    // utils\n    guidFromUri(uri) {\n        return uri.substring(uri.lastIndexOf('/') + 1);\n    },\n    generateConversationsUrl(callId, participantId, action, query) {\n        const origin = `api/v2/conversations/calls`;\n        let parts = [origin, callId, 'participants', participantId];\n        if (action) {\n            parts.push(action);\n        }\n        if (query) {\n            parts.push(query);\n        }\n        return this.pcUri(parts);\n    },\n    generateCommunicationUrl(conversationId, participantId, communicationId) {\n        return this.application.pcV2Uri(\n            `api/v2/conversations/calls/${conversationId}/participants/${participantId}/communications/${communicationId}`\n        );\n    },\n    generateConversationUrl(conversationId) {\n        return this.application.pcV2Uri(`api/v2/conversations/calls/${conversationId}`);\n    },\n    _findPendingSessionsByConversationId(id) {\n        if (this.get('webrtcSdkService.useSdk')) {\n            return this.get('webrtcSdkService.pendingSessions').findBy('conversationId', id);\n        } else {\n            return this.get('webrtc.pendingSessions').findBy('callInfo.conversationId', id);\n        }\n    },\n    _logConversationDetails(conversation) {\n        if (conversation != null) {\n            let logObject = {};\n            get(conversation, 'participants').forEach(party => {\n                const communication = this.getParticipantCall(party) || get(party, 'callbacks.firstObject');\n                if (communication) {\n                    const { id, userId, name, address, purpose } = party;\n                    const { state, confined, muted, held } = communication;\n                    return (logObject[id] = { userId, name, address, state, confined, muted, held, purpose });\n                }\n            });\n            if (console.table) {\n                return console.table(logObject);\n            }\n            return console.log(logObject);\n        }\n    },\n    isDisconnected(conversation) {\n        if (!conversation) {\n            return false;\n        }\n        const callState = get(conversation, 'callState');\n        if (!callState) {\n            return false;\n        }\n        return callState.state ? ['disconnected', 'terminated'].indexOf(callState.state.toLowerCase()) > -1 : false;\n    },\n    // helper to get participant.calls[0] and return false if any of it is undefined\n    getParticipantCall(participant) {\n        if (!participant) {\n            return false;\n        }\n        if (participant.calls) {\n            if (participant.calls.length) {\n                return participant.calls[0];\n            }\n        }\n        return false;\n    },\n\n    updateVolumes(deviceVolumes) {\n        this.set('callVolume', deviceVolumes.callVolume);\n        this.set('ringerVolume', deviceVolumes.ringerVolume);\n        this.set('callActiveRingerVolume', deviceVolumes.callActiveRingerVolume);\n    },\n    // end utils\n\n    // UI state helpers\n    isInteractionViewOpen: computed(\n        'sidebar.communicationPanel',\n        'session.useNewNav',\n        'commandNav.currentPanel',\n        function () {\n            if (this.get('session.useNewNav')) {\n                return this.get('commandNav.currentPanel') === 'agent';\n            } else {\n                return this.get('sidebar.communicationPanel') === 'acdInteractions';\n            }\n        }\n    ),\n    isShowCallControlsViewOpen: reads('sidebar.showCallControls'),\n    showFloatingCalls: computed(\n        'onCall',\n        'isActiveCallACD',\n        'session.useNewNav',\n        'sidebar.communicationPanel',\n        'commandNav.{currentPanel,currentDrawer}',\n        'showNavbarAlert',\n        function () {\n            let callPanelClosed =\n                this.get('sidebar.communicationPanel') !== 'callControls' &&\n                this.get('sidebar.communicationPanel') !== 'acdInteractions';\n            if (this.get('session.useNewNav')) {\n                callPanelClosed = this.get('commandNav.currentPanel') !== 'voice';\n            }\n            return this.onCall && !this.isActiveCallACD && !this.showNavbarAlert && callPanelClosed;\n        }\n    ),\n    showNavbarAlert: computed(\n        'activeAcdCalls.[]',\n        'activeCall',\n        'incomingNonAcdConversations.[]',\n        'isShowCallControlsViewOpen',\n        'isInteractionViewOpen',\n        function () {\n            const activeAcdCallState = this.get('activeAcdCalls.firstObject.callState.state');\n            const state = typeof activeAcdCallState === 'string' ? activeAcdCallState.toLowerCase() : null;\n            if (this.isShowCallControlsViewOpen || (this.isInteractionViewOpen && state === 'connected')) {\n                return false;\n            }\n\n            const hasIncomingNonAcdCalls = this.get('incomingNonAcdConversations.length') > 0;\n            const alertingCall =\n                !this.get('activeCall.isIncoming') && hasIncomingNonAcdCalls\n                    ? this.get('incomingNonAcdConversations.firstObject')\n                    : this.activeCall;\n\n            const isAlertingCallACD =\n                alertingCall &&\n                get(alertingCall, 'isAgentCall') &&\n                !get(alertingCall, 'myselfIsMonitor') &&\n                !get(alertingCall, 'myselfIsCoach') &&\n                !get(alertingCall, 'myselfIsBarged')\n                    ? true\n                    : false;\n            return !isAlertingCallACD && hasIncomingNonAcdCalls;\n        }\n    ),\n    // end UI state helpers\n\n    activeRoom: null,\n\n    async _loadEmergencyNumberPlans() {\n        const BASE_URI = `api/v2/telephony/emergencynumberplans`;\n        const url = `${this.get('application').pcV2Uri(BASE_URI)}`;\n        const response = await this.makeRequest(url, {}, 'get');\n\n        const allEmergencyNumbers = response\n            .flatMap(plan => plan.numbers || [])\n            .flatMap(numberRange => {\n                if (numberRange.start && numberRange.end) {\n                    const start = parseInt(numberRange.start, 10);\n                    const end = parseInt(numberRange.end, 10);\n                    return Array.from({ length: end - start + 1 }, (_, i) => String(start + i));\n                }\n                if (numberRange.start) {\n                    return [String(numberRange.start)];\n                }\n                return [];\n            });\n\n        this.set('allEmergencyNumbers', allEmergencyNumbers);\n    },\n\n    bootstrapPurecloudApiOnAuth: observer('session.isAuthenticated', 'enabled', 'canCallForward', function () {\n        if (!this.enabled) {\n            return;\n        }\n        if (this.get('session.isAuthenticated')) {\n            if (this.get('session.features.PURE-5487_require_queue')) this._loadEmergencyNumberPlans();\n            if (this.get('canCallForward')) {\n                this.fetchCallForwarding();\n            }\n            if (!isTesting && !this.loaded) {\n                this.set('loaded', true);\n                this.doLoginAssociationLogic();\n                return this.delayedNotification.perform();\n            }\n        } else {\n            this.set('loaded', false);\n        }\n    }),\n\n    delayedNotification: task(function* (delay = 5000) {\n        yield timeout(delay);\n\n        if (this.get('station.isWebrtc') && !this.get('webrtc.canUseWebrtcSoftphone')) {\n            const message = this.phoneDisabledMessage;\n            const title = this.intl.t('notification.purecloud.selectPhone.selectPhone');\n            return this.notification.error(title, message);\n        }\n    }),\n\n    refreshPublicApiUser() {\n        return this.session.refreshPublicApiUser();\n    },\n\n    handleMuteParticipants: observer('activeConversations.@each.isMuted', function () {\n        this.activeConversations.forEach(conversation => {\n            if (conversation.get('webrtcSession')) {\n                let webrtcConversation = this.webrtc.getConversation({\n                    conversationId: conversation.get('id'),\n                    conversationType: webrtcConversationTypes.SOFTPHONE\n                });\n                if (webrtcConversation) {\n                    if (conversation.get('isMuted')) {\n                        webrtcConversation.muteAudio();\n                    } else {\n                        webrtcConversation.unmuteAudio();\n                    }\n                }\n            }\n        });\n    }),\n\n    getNotificationOutputDeviceId() {\n        return this.get('webrtc.notificationOutputDeviceId');\n    },\n\n    transferToVoicemail(selectedUserUserId, participantId, conversationId) {\n        const voicemailPolicy = this.application.pcV2Uri('api/v2/voicemail/userpolicies/' + selectedUserUserId);\n        return this.makeRequest(voicemailPolicy)\n            .then(policy => {\n                if (!policy.enabled) {\n                    throw new Error('voicemail not enabled');\n                }\n                const data = {};\n                const vmAdressString = selectedUserUserId + VOICEMAIL_URL;\n                data.address = vmAdressString;\n                data.transferType = 'Unattended';\n                const options = { data };\n                const mediaType = null;\n                const entityType = 'byVoicemail';\n                const url = this.replaceUri(conversationId, participantId, null, mediaType, entityType);\n                return this.makeRequest(url, options, 'post').then(() => {\n                    this._handleCallTransferred();\n                });\n            })\n            .catch(error => {\n                const title = this.intl.t('purecloud.acdInteraction.voicemail.errors.error');\n                const message = this.intl.t('purecloud.acdInteraction.voicemail.errors.transferToVoicemail');\n                this.notification.error(title, message);\n                this.logger.error('Error while tranferring to voicemail', { error });\n            });\n    },\n\n    _answeredSoundIncomingConversationRing() {\n        this.logger.debug('phone:_soundIncomingConversationRing: stop ringing (answered)');\n        this.ring.stopRingtone();\n    },\n\n    /**\n     * Truncates the call history to the last MAX_CALL_HISTORY_SIZE length\n     */\n    truncateCallHistory() {\n        const currentCallHistory = this.currentCallHistory;\n        this.set('currentCallHistory', currentCallHistory.slice(0, MAX_CALL_HISTORY_SIZE));\n    },\n\n    /**\n     * fetchCallHistory - Fetches the call history.\n     * @return {Promise} Resolves to an array of conversations.\n     */\n    fetchCallHistory() {\n        return this.store.query('callv2', {}).then(data => {\n            // data is a record array, we need the models\n            const history = data.map(d => d);\n            history.forEach(call => {\n                if (typeof call.loadConversation === 'function') {\n                    call.loadConversation();\n                }\n            });\n            this.set('currentCallHistory', A([].concat(this.currentCallHistory, history)).uniqBy('id'));\n            return history;\n        });\n    },\n    /**\n     * fetchRecentCallHistory - Fetch the conversations by conversationId\n     *\n     * @param conversationsToFetch Array of conversationIds\n     * @param isInit boolean, if initializing\n     */\n    fetchRecentCallHistory(conversationsToFetch, isInit) {\n        let promise;\n\n        if (isInit) {\n            promise = this.store.query('callv2', {\n                findLatestCalls: true,\n                resetIntervals: true\n            });\n        } else {\n            promise = this.store.query('callv2', {\n                findLatestCalls: true,\n                calls: conversationsToFetch\n            });\n        }\n\n        return promise.then(data => {\n            // `store.query()` resolves directly to an array of model instances in this Ember Data\n            // version — there is no `.content` of internal-model wrappers needing `.getRecord()`.\n            const conversations = (data || []).filter(conversation => {\n                if (isInit) return true;\n                return A(conversationsToFetch).isAny('id', get(conversation, 'id'));\n            });\n            conversations.forEach(call => {\n                if (typeof call.loadConversation === 'function') {\n                    call.loadConversation();\n                }\n            });\n            this.set('currentCallHistory', A([].concat(this.currentCallHistory, conversations)).uniqBy('id'));\n        });\n    }\n});\n","import { reads } from '@ember/object/computed';\nimport { A } from '@ember/array';\nimport { assert } from '@ember/debug';\nimport { computed, get, observer } from '@ember/object';\nimport Evented from '@ember/object/evented';\nimport { run, cancel } from '@ember/runloop';\nimport Service, { inject as service } from '@ember/service';\nimport Ember from 'ember';\nimport { copy } from 'ember-copy';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport StreamingService from 'web-directory/services/streaming';\nimport moment from 'web-directory/utils/dates';\nimport { getPigeonMaxPriority, topicPriority } from 'web-directory/utils/pigeon';\nimport xor from 'lodash/xor';\nimport RSVP, { Promise, resolve } from 'rsvp';\n\nconst maxSubscribeableTopics = 1000;\n\nexport function eventFromTopic(topic) {\n    if (topic.indexOf('v2.system.no_longer_subscribed') > -1) {\n        return 'no_longer_subscribed';\n    }\n    return [].concat(topic.split('.')).pop();\n}\n\nexport default Service.extend(Evented, LoggerMixin, {\n    streaming: service(),\n\n    user: null,\n    topicKeepAlive: null,\n    registerDebounce: null,\n    connected: false,\n    topics: A(),\n    priorityTopics: A(),\n    customTopicNames: {},\n    registerTopicsDebouncePeriod: 1000,\n    checkForCarrierPigeonDelayPeriod: 20000,\n    checkingCarrierPigeonSubscription: false,\n    timeUnit: 'hours',\n    carrierPigeonExpiration: {\n        unit: 'hours',\n        value: 23\n    },\n    shortInterval: 2,\n    initialized: false,\n    features: null,\n\n    v2: reads('streaming.pubsubV2'),\n\n    prioritizedTopics: computed('topics.length', function () {\n        const sortedTopics = this.topics.slice(0);\n\n        const sortFunction = (topicA, topicB) => {\n            return this.getTopicPriority(topicA) - this.getTopicPriority(topicB);\n        };\n\n        sortedTopics.sort(sortFunction);\n\n        return sortedTopics;\n    }),\n\n    getTopicPriority(topic) {\n        const priorities = topicPriority;\n        return priorities[topic.split('.').pop()] || priorities.other;\n    },\n\n    initialize({ features, subscribeUrl, publicApiUser, accessToken }) {\n        if (this.initialized) {\n            return;\n        }\n\n        if (publicApiUser) {\n            this.logger.info('CP: Initializing', {\n                userId: get(publicApiUser, 'id'),\n                features\n            });\n        } else {\n            this.logger.warn('CP: pigeon service not provided with api user');\n        }\n\n        this.set('subscribeUrl', subscribeUrl);\n        this.set('features', features);\n        this.set('user', publicApiUser);\n        this.set('accessToken', accessToken);\n\n        this.streaming.set('pubsubV2', true);\n        this.streaming.subscribeToConnection(this);\n\n        const checkLastConnectionTimeHandler = () => this.checkLastConnectionTime();\n        this.set('_checkLastConnectionTimeHandler', checkLastConnectionTimeHandler);\n        window.addEventListener('focus', checkLastConnectionTimeHandler);\n\n        this.set('initialized', true);\n    },\n\n    // Check the last time client successfully subscribed and if it was over 23 hrs ago, do it again.\n    checkLastConnectionTime() {\n        const now = moment();\n        const intervalValue = this.get('carrierPigeonExpiration.value');\n        if (now.diff(this.lastCarrierPigeonSubscription, this.get('carrierPigeonExpiration.unit')) >= intervalValue) {\n            this.set('lastCarrierPigeonSubscription', null);\n            this.logger.info('CP: last successful subscribe was too long ago. Attempt to re-subscribe to topics.', {\n                intervalValue\n            });\n            this._registerTopics();\n        }\n    },\n\n    isStreamingConnected() {\n        return this.connected;\n    },\n\n    registerPriorityTopic(topic, customName) {\n        assert('topic parameter cannot be null when registering a priority topic for subscription.', topic !== null);\n        this.priorityTopics.addObject(topic);\n\n        if (customName) {\n            this.customTopicNames[topic] = customName;\n        }\n    },\n\n    registerPriorityTopics(topics) {\n        assert(\n            'topics parameter cannot be null when registering priority topics for subscription.',\n            topics !== null && topics.length > 0\n        );\n        this.get('priorityTopics').unshiftObjects(topics);\n    },\n\n    immediatelyRegisterPriorityTopics(topics) {\n        this.priorityTopics.addObjects(topics);\n        if (this.connected && this.initialized) {\n            // Don't wait for observer to run. Cancel any current debounce. Immediately run the function, but still\n            // debounce for any future callers to appropriately wait.\n            cancel(this.registerDebounce);\n            this.set(\n                'registerDebounce',\n                run.debounce(this, this._registerTopics, this.registerTopicsDebouncePeriod, true)\n            );\n        }\n    },\n\n    unRegisterPriorityTopic(topic) {\n        this.priorityTopics.removeObject(topic);\n        const customNames = this.customTopicNames;\n        delete customNames[topic];\n    },\n\n    unRegisterPriorityTopics(topics) {\n        this.get('priorityTopics').removeObjects(topics);\n        const customNames = this.get('customTopicNames');\n        topics.forEach(topic => {\n            delete customNames[topic];\n        });\n    },\n\n    registerTopic(topic, customName) {\n        assert('topic parameter cannot be null when registering a topic for subscription.', topic !== null);\n        this.topics.unshiftObject(topic);\n        if (customName) {\n            this.customTopicNames[topic] = customName;\n        }\n    },\n\n    registerTopics(topics) {\n        assert(\n            'topics parameter cannot be null when registering a topic for subscription.',\n            topics !== null && topics.length > 0\n        );\n        this.topics.unshiftObjects(topics);\n    },\n\n    unRegisterTopic(topic) {\n        this.topics.removeObject(topic);\n        const customNames = this.customTopicNames;\n        delete customNames[topic];\n    },\n\n    unRegisterTopics(topics) {\n        this.topics.removeObjects(topics);\n        const customNames = this.customTopicNames;\n        topics.forEach(topic => {\n            delete customNames[topic];\n        });\n    },\n\n    _observeTopics: observer('priorityTopics.[]', 'topics.[]', 'connected', 'initialized', function () {\n        if (this.connected && this.initialized) {\n            this.set('registerDebounce', run.debounce(this, this._registerTopics, this.registerTopicsDebouncePeriod));\n        }\n    }),\n\n    willDestroy() {\n        this._super(...arguments);\n        run.cancel(this.topicKeepAlive);\n        run.cancel(this.registerDebounce);\n        window.removeEventListener('focus', this._checkLastConnectionTimeHandler);\n    },\n\n    _registerTopics() {\n        run.cancel(this.topicKeepAlive);\n        const topicKeepAlive = run.later(\n            this,\n            function () {\n                this.logger.info('CP: _register: topicKeepAlive triggered');\n                this._registerTopics();\n            },\n            moment\n                .duration(this.get('carrierPigeonExpiration.value'), this.get('carrierPigeonExpiration.unit'))\n                .asMilliseconds()\n        );\n        this.set('topicKeepAlive', topicKeepAlive);\n\n        const prioritizedTopics = this.prioritizedTopics;\n        const priorityTopics = this.priorityTopics;\n        const topics = [...priorityTopics, ...prioritizedTopics];\n\n        let keptTopics = topics;\n        const truncateTopics = topics => {\n            let kept = topics.slice(0, maxSubscribeableTopics);\n            if (topics.length > maxSubscribeableTopics) {\n                let droppedTopics = topics.slice(maxSubscribeableTopics);\n                if (droppedTopics.length > 20) {\n                    const length = droppedTopics.length - 20;\n                    droppedTopics = droppedTopics.slice(20);\n                    droppedTopics.push(`...and ${length} more`);\n                }\n                this.logger.warn('CP: Too many topics to subscribe to, truncating extra topics', {\n                    droppedTopics\n                });\n            }\n            return kept;\n        };\n\n        // If we don't truncate to the maximum topic length, the subscribe request\n        // will fail, and nothing will change.\n        keptTopics = truncateTopics(topics);\n        if (this.v2) {\n            return this._registerUserSessionTopicsV2(keptTopics).then(() => {\n                this.trigger('topicsRegistered', keptTopics);\n            });\n        } else {\n            return this._registerUserSessionTopics(keptTopics).then(() => {\n                this.trigger('topicsRegistered', keptTopics);\n            });\n        }\n    },\n\n    triggerTopicEvent(topic, eventName, eventBody, data, source) {\n        this.logger.debug('CP: topic triggered', {\n            source,\n            carrierPigeonTopic: eventName,\n            update: eventBody\n        });\n        if (source === 'realtime' && this.v2) {\n            return;\n        }\n        this.trigger(eventName, copy(eventBody), copy(data));\n    },\n\n    onMessage(source, message) {\n        if (!message) {\n            return;\n        }\n\n        let data = message;\n        if (typeof message.data === 'string') {\n            try {\n                data = JSON.parse(message.data);\n            } catch (err) {\n                this.logger.error('CP: Unable to parse event data.', {\n                    error: err\n                });\n            }\n        }\n\n        const topic = data.topicName;\n        const eventBody = data.eventBody;\n        const eventName = this.customTopicNames[topic] || eventFromTopic(topic);\n        const userId = this.get('user.id');\n\n        if (topic !== 'channel.metadata') {\n            this.triggerTopicEvent(topic, eventName, eventBody, data, source);\n        }\n\n        // If the topic includes the current user's ID, also emit an event 'my-conversations'\n        if (eventName === 'conversations' && topic.indexOf(userId) > -1) {\n            this.triggerTopicEvent(topic, 'my-conversations', eventBody, data, source);\n        }\n\n        if (topic !== eventName) {\n            this.triggerTopicEvent(topic, topic, eventBody, data, source);\n        }\n    },\n\n    _registerUserSessionTopics(topics) {\n        if (this.pendingRequest) {\n            this.pendingRequest.abort();\n            this.set('pendingRequest', null);\n        }\n\n        const headers = {\n            'ININ-Session': this.accessToken\n        };\n        // This requires public-api v1 because of carrier pigeon over realtime:\n        const url = this.subscribeUrl;\n        const userId = this.get('user.id');\n        const userTopics = (topics || []).filter(topic => topic.indexOf(userId) > -1);\n\n        const requestedTopicsLength = topics.length || 0;\n\n        const request = {\n            url,\n            headers,\n            type: 'put',\n            contentType: 'application/json; charset=UTF-8',\n            dataType: 'json',\n            data: JSON.stringify(topics),\n            cache: false,\n            context: this\n        };\n\n        const successHandler = response => {\n            this.set('pendingRequest', null);\n\n            if (response && response.entities) {\n                const subscribedTopicsLength = response.entities.length || 0;\n                const subscribedUserTopics = response.entities\n                    .map(topic => topic.id)\n                    .filter(topic => topic.indexOf(userId) > -1);\n\n                const unexpectedOrMissingUserTopics = xor(userTopics, subscribedUserTopics);\n                if (unexpectedOrMissingUserTopics.length > 0) {\n                    this.logger.warn('CP: _register: Not subscribed to expected user topics', {\n                        userId,\n                        unexpectedOrMissingUserTopics\n                    });\n                    return;\n                }\n\n                // check this value on focus to see if we need to re-subscribe\n                this.set('lastCarrierPigeonSubscription', moment());\n\n                this.logger.info('CP: _register: Successful subscribe for user', {\n                    userId,\n                    requestedTopicsLength,\n                    subscribedTopicsLength,\n                    diff: requestedTopicsLength - subscribedTopicsLength,\n                    subscribedUserTopics,\n                    connected: this.connected\n                });\n            } else {\n                this.logger.error('CP: _register: Response did not return requested topic \"response.entities\"', {\n                    userId\n                });\n            }\n        };\n\n        const errorHandler = jqXHR => {\n            this.set('pendingRequest', null);\n\n            if (jqXHR && jqXHR.statusText !== 'abort') {\n                this.logger.error('CP: _register: Failed to register to topics for user', {\n                    jqXHR,\n                    remoteData: {\n                        userId\n                    }\n                });\n                Ember.onerror(jqXHR);\n            }\n        };\n\n        this.logger.info('CP: _register: Attempting to subscribe', {\n            userId,\n            requestedTopicsLength,\n            userTopics,\n            cpConnected: this.connected\n        });\n\n        // Using XMLHttpRequest directly to make request due to:\n        // https://github.com/ember-cli/ember-ajax/issues/133\n        let xhr = this._makeAjaxRequest(request);\n        this.set('pendingRequest', xhr);\n\n        xhr.then(successHandler, errorHandler);\n\n        return RSVP.cast(xhr);\n    },\n\n    _makeAjaxRequest(request) {\n        const xhr = new XMLHttpRequest();\n        xhr.open(request.type, request.url);\n        xhr.setRequestHeader('Content-Type', request.contentType || 'application/json; charset=UTF-8');\n        if (request.headers) {\n            Object.keys(request.headers).forEach(key => xhr.setRequestHeader(key, request.headers[key]));\n        }\n        xhr.responseType = 'json';\n\n        // Build a promise that also exposes .abort() — mirrors the jQuery XHR interface\n        // used by callers (pendingRequest.abort(), xhr.then(), RSVP.cast(xhr))\n        let resolvePromise, rejectPromise;\n        const promise = new RSVP.Promise((res, rej) => {\n            resolvePromise = res;\n            rejectPromise = rej;\n        });\n        promise.abort = () => xhr.abort();\n\n        xhr.onload = () => {\n            if (xhr.status >= 200 && xhr.status < 300) {\n                resolvePromise(xhr.response);\n            } else {\n                rejectPromise({ status: xhr.status, statusText: xhr.statusText, responseJSON: xhr.response });\n            }\n        };\n        xhr.onerror = () => rejectPromise({ status: xhr.status, statusText: xhr.statusText });\n        xhr.onabort = () => rejectPromise({ statusText: 'abort' });\n        xhr.send(request.data);\n\n        return promise;\n    },\n\n    _registerUserSessionTopicsWithPriorityV2: async function (topics) {\n        const allPriorities = {};\n\n        topics.forEach(topic => {\n            allPriorities[topic] = this.getTopicPriority(topic);\n        });\n\n        const priorityTopics = this.priorityTopics;\n        priorityTopics.forEach(topic => {\n            allPriorities[topic] = getPigeonMaxPriority();\n        });\n        return this._registerUserSessionTopicsV2(topics, allPriorities);\n    },\n\n    _registerUserSessionTopicsV2: async function (topics, allPriorities = {}) {\n        if (!this.v2) {\n            this.logger.error(\n                '_registerUserSessionTopicsV2 called when feature toggle was off. Not registering any topics'\n            );\n            return resolve(); // Log the error, but don't break, since it's based on feature toggle state, this is semantic error, not application error\n        }\n        const connection = await this.get('streaming.v2Promise');\n        if (!connection.connected) {\n            await new Promise(resolve => {\n                connection.on('connected', resolve);\n            });\n        }\n        if (!this.connected) {\n            this.logger.info('CP: Streaming Client -> CP Connected');\n\n            this.set('connected', true);\n            this.trigger('connect');\n        }\n\n        return connection.notifications.bulkSubscribe(topics, { replace: true }, allPriorities).catch(err => {\n            this.trigger('hawkSubscriptionError', err);\n        });\n    },\n\n    isConnectionConnecting() {\n        return this.streaming.isConnectionConnecting();\n    },\n\n    // **************************************************************************\n    // Streaming Service Events\n    // **************************************************************************\n\n    carrierPigeonSubscribed: StreamingService.streamingEvent(function () {\n        if (this.v2) {\n            return;\n        }\n        this.logger.info('CP: Realtime -> CP Connected');\n\n        this.set('connected', true);\n        this.trigger('connect');\n    }),\n\n    carrierPigeonMessage: StreamingService.streamingEvent(function (message) {\n        this.onMessage('realtime', message);\n    }),\n\n    streamingClientMessage: StreamingService.streamingEvent('*', 'notify', function (message) {\n        this.onMessage('streaming', message.data);\n    }),\n\n    disconnect: StreamingService.streamingEvent(function () {\n        if (this.v2) {\n            return;\n        }\n        this.logger.info('CP: Realtime -> CP disconnected');\n        if (!this.isDestroyed) {\n            this.set('connected', false);\n        }\n        this.trigger('disconnect');\n    }),\n\n    onV2Disconnect: StreamingService.streamingEvent('*', 'disconnected', function () {\n        if (!this.v2) {\n            return;\n        }\n        this.logger.info('CP: Streaming service -> CP disconnected');\n        if (!this.isDestroyed) {\n            this.set('connected', false);\n        }\n        this.trigger('disconnect');\n    }),\n\n    onV2Connected: StreamingService.streamingEvent('*', 'connected', function () {\n        if (!this.v2) {\n            return;\n        }\n        this.logger.info('CP: Streaming service -> CP Connected');\n\n        this.set('connected', true);\n        this.trigger('connect');\n    })\n});\n","import { assert } from '@ember/debug';\nimport { computed } from '@ember/object';\nimport Evented from '@ember/object/evented';\nimport Service, { inject as injectService } from '@ember/service';\nimport RSVP, { allSettled } from 'rsvp';\nimport StreamingService from 'web-directory/services/streaming';\nimport { PIGEON_MAX_PRIORITY, topicPriority } from 'web-directory/utils/pigeon';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface HandlerInfo {\n    handler: (message: any) => void;\n    customName: string | null;\n    priority: number;\n}\n\ninterface InitializeOptions {\n    features: any;\n    subscribeUrl: string;\n    publicApiUser: any;\n    accessToken: string;\n}\n\ninterface StreamingMessage {\n    topicName?: string;\n    eventBody?: any;\n}\n\n/**\n * Extract the event name from a topic string.\n * e.g. \"v2.users.123.conversations\" → \"conversations\"\n */\nexport function eventFromTopic(topic: string): string {\n    if (topic.indexOf('v2.system.no_longer_subscribed') > -1) {\n        return 'no_longer_subscribed';\n    }\n    const parts = topic.split('.');\n    return parts[parts.length - 1] || '';\n}\n\n// ============================================================================\n// Service\n// ============================================================================\n\n/**\n * Pigeon V2 — simplified WebSocket subscription management.\n *\n * Uses individual subscribe() calls with handlers instead of bulkSubscribe(),\n * which enables reference counting and eliminates race conditions with\n * iframe-coordinator app subscriptions. Retry, reconnection, and resubscription\n * are delegated entirely to the streaming client.\n *\n * Activated via the ATLAS-1709_pigeon-service feature toggle.\n */\nexport default Service.extend(Evented, {\n    streaming: injectService() as any,\n    logger: injectService('stash-logger') as any,\n\n    /** @attribute The authenticated user object */\n    user: null as any,\n\n    /** @attribute Whether the streaming connection is active */\n    connected: false,\n\n    /** @attribute Whether initialize() has been called */\n    initialized: false,\n\n    /** @attribute Feature toggle configuration */\n    features: null as any,\n\n    /** @private Map of topic → HandlerInfo for cleanup tracking */\n    _handlers: null as Map<string, HandlerInfo> | null,\n\n    /**\n     * Topics currently subscribed at max priority.\n     * Read by external-contacts.js, acdsms.js, and customer-intent.ts to\n     * avoid duplicate registrations.\n     *\n     * Volatile computed — always reads fresh from _handlers since Map\n     * mutations aren't tracked by Ember's dependency system.\n     */\n    priorityTopics: computed(function (this: any): string[] {\n        const handlers = this.get('_handlers') as Map<string, HandlerInfo>;\n        if (!handlers) return [];\n        return Array.from(handlers.entries())\n            .filter(([, info]) => info.priority === PIGEON_MAX_PRIORITY)\n            .map(([topic]) => topic);\n    }).volatile(),\n\n    init(this: any) {\n        this._super(...arguments);\n        this.set('_handlers', new Map<string, HandlerInfo>());\n    },\n\n    getTopicPriority(this: any, topic: string): number {\n        const priorities = topicPriority as Record<string, number>;\n        const lastPart = topic.split('.').pop();\n        return (lastPart && priorities[lastPart]) || priorities.other;\n    },\n\n    initialize(this: any, { features, subscribeUrl, publicApiUser, accessToken }: InitializeOptions): void {\n        if (this.get('initialized')) {\n            return;\n        }\n\n        if (publicApiUser) {\n            this.get('logger').info('CP: Initializing', { userId: publicApiUser.id });\n        } else {\n            this.get('logger').warn('CP: pigeon service not provided with api user');\n        }\n\n        this.set('subscribeUrl', subscribeUrl);\n        this.set('features', features);\n        this.set('user', publicApiUser);\n        this.set('accessToken', accessToken);\n\n        this.get('streaming').set('pubsubV2', true);\n        this.get('streaming').subscribeToConnection(this);\n\n        this.set('initialized', true);\n    },\n\n    isStreamingConnected(this: any): boolean {\n        return this.get('connected');\n    },\n\n    async registerPriorityTopic(this: any, topic: string, customName?: string): Promise<void> {\n        assert('topic parameter cannot be null when registering a priority topic for subscription.', topic !== null);\n        await this._subscribeTopic(topic, PIGEON_MAX_PRIORITY, customName || null);\n    },\n\n    async registerPriorityTopics(this: any, topics: string[]): Promise<void> {\n        assert(\n            'topics parameter cannot be null when registering priority topics for subscription.',\n            topics !== null && topics.length > 0\n        );\n        await allSettled(topics.map(topic => this._subscribeTopic(topic, PIGEON_MAX_PRIORITY, null)));\n    },\n\n    async registerTopic(this: any, topic: string, customName?: string): Promise<void> {\n        assert('topic parameter cannot be null when registering a topic for subscription.', topic !== null);\n        await this._subscribeTopic(topic, this.getTopicPriority(topic), customName || null);\n    },\n\n    async registerTopics(this: any, topics: string[]): Promise<void> {\n        assert(\n            'topics parameter cannot be null when registering topics for subscription.',\n            topics !== null && topics.length > 0\n        );\n        await allSettled(topics.map(topic => this._subscribeTopic(topic, this.getTopicPriority(topic), null)));\n    },\n\n    async immediatelyRegisterPriorityTopics(this: any, topics: string[]): Promise<void> {\n        await allSettled(topics.map(topic => this._subscribeTopic(topic, PIGEON_MAX_PRIORITY, null)));\n    },\n\n    async unRegisterPriorityTopic(this: any, topic: string): Promise<void> {\n        await this._unsubscribeTopic(topic);\n    },\n\n    async unRegisterPriorityTopics(this: any, topics: string[]): Promise<void> {\n        await allSettled(topics.map(topic => this._unsubscribeTopic(topic)));\n    },\n\n    async unRegisterTopic(this: any, topic: string): Promise<void> {\n        await this._unsubscribeTopic(topic);\n    },\n\n    async unRegisterTopics(this: any, topics: string[]): Promise<void> {\n        await allSettled(topics.map(topic => this._unsubscribeTopic(topic)));\n    },\n\n    /** No-op in v2 — streaming client handles resubscription automatically on reconnect */\n    _registerTopics(this: any): Promise<void> {\n        return RSVP.resolve();\n    },\n\n    async _subscribeTopic(this: any, topic: string, priority: number, customName: string | null): Promise<void> {\n        const handlers = this.get('_handlers') as Map<string, HandlerInfo>;\n\n        if (handlers.has(topic)) {\n            this.get('logger').debug('CP: Already subscribed to topic', { topic });\n            return;\n        }\n\n        // Create and store the handler before awaiting to prevent duplicate\n        // subscriptions if this method is called concurrently for the same topic.\n        const handler = (message: StreamingMessage) => {\n            const payload = message?.eventBody ?? message;\n            const messageTopic = message?.topicName || topic;\n            this.get('logger').debug('CP: topic to handle', { topic, messageTopic });\n            this._handleTopicMessage(messageTopic, customName, payload);\n        };\n\n        handlers.set(topic, { handler, customName, priority });\n\n        try {\n            const connection = await this.get('streaming.v2Promise');\n            await connection.notifications.subscribe(topic, handler, false, priority);\n            this.get('logger').debug('CP: Subscribed to topic', { topic, priority });\n        } catch (err) {\n            // Clean up the optimistic entry on failure so callers can retry\n            handlers.delete(topic);\n            this.get('logger').error('CP: Failed to subscribe to topic', { topic, error: err });\n            this.trigger('hawkSubscriptionError', { topic, error: err });\n        }\n    },\n\n    async _unsubscribeTopic(this: any, topic: string): Promise<void> {\n        const handlers = this.get('_handlers') as Map<string, HandlerInfo>;\n        const handlerInfo = handlers.get(topic);\n\n        if (!handlerInfo) {\n            this.get('logger').debug('CP: Topic not subscribed', { topic });\n            return;\n        }\n\n        try {\n            const connection = await this.get('streaming.v2Promise');\n            await connection.notifications.unsubscribe(topic, handlerInfo.handler, false);\n            this.get('logger').debug('CP: Unsubscribed from topic', { topic });\n        } catch (err) {\n            this.get('logger').warn('CP: Error unsubscribing from topic', { topic, error: err });\n        } finally {\n            handlers.delete(topic);\n        }\n    },\n\n    _handleTopicMessage(this: any, topic: string, customName: string | null, payload: any): void {\n        const eventName = customName || eventFromTopic(topic);\n        const userId = this.get('user.id');\n\n        if (topic !== 'channel.metadata') {\n            this.trigger(eventName, payload);\n        }\n\n        // Trigger my-conversations based on the topic name, not eventName,\n        // so it fires correctly even when a custom name is registered.\n        // Use endsWith to avoid false matches on topics like 'conversationsummary'.\n        if (topic.endsWith('.conversations') && topic.indexOf(userId) > -1) {\n            this.trigger('my-conversations', payload);\n        }\n\n        if (topic !== eventName) {\n            this.trigger(topic, payload);\n        }\n    },\n\n    willDestroy(this: any) {\n        this._super(...arguments);\n        const handlers = this.get('_handlers') as Map<string, HandlerInfo>;\n        if (handlers?.size > 0) {\n            this.get('logger').info('CP: Cleaning up subscriptions on destroy', { count: handlers.size });\n            Array.from(handlers.keys()).forEach(topic => this._unsubscribeTopic(topic));\n        }\n    },\n\n    // @ts-ignore - StreamingService.streamingEvent is a custom decorator\n    onV2Disconnect: StreamingService.streamingEvent('*', 'disconnected', function (this: any) {\n        this.get('logger').info('CP: Streaming disconnected');\n        if (!this.isDestroyed) {\n            this.set('connected', false);\n        }\n        this.trigger('disconnect');\n    }),\n\n    // @ts-ignore - StreamingService.streamingEvent is a custom decorator\n    onV2Connected: StreamingService.streamingEvent('*', 'connected', function (this: any) {\n        this.get('logger').info('CP: Streaming connected');\n        this.set('connected', true);\n        this.trigger('connect');\n    })\n});\n","import Ember from 'ember';\nimport Service, { inject as injectService } from '@ember/service';\nimport { set } from '@ember/object';\nimport Evented from '@ember/object/evented';\nimport { Models } from 'purecloud-platform-client-internal-v2';\nimport { ICustomerIntentChanged } from 'web-directory/types/customer-intent-changed.type';\nimport { IVideoConferenceDetails } from 'web-directory/types/video-conference-details.type';\nimport { IWebrtcSettings } from 'web-directory/types/webrtc-settings.type';\n\n// ============================================================================\n// Pigeon Event Types\n// ============================================================================\n\n/**\n * Conversation notification payload delivered on a user's conversations topics\n * (e.g. `v2.users.{id}.conversations`). Shaped like the platform conversation\n * event model; the optional `normalizedMessage` is only present on messaging\n * typing-event topics (`...conversations.inbound.typing.event`).\n */\nexport interface PigeonConversationEvent extends Models.ConversationEventTopicConversation {\n    normalizedMessage?: Models.NormalizedMessage;\n}\n\n/**\n * Email draft notification delivered on the `draft` pigeon event. Carries the\n * draft email fields keyed by the owning `conversationId`; `state` reflects the\n * draft lifecycle (e.g. `ready`, `edited`).\n */\nexport interface PigeonDraftEvent extends Partial<Models.EmailMessage> {\n    conversationId: string;\n}\n\n/** Maps pigeon event names to their payload types */\nexport type PigeonEvents = {\n    connect: void;\n    disconnect: void;\n    webrtcSettingsUpdate: IWebrtcSettings;\n    videoConferenceUpdate: IVideoConferenceDetails;\n    adherence: Models.WfmUserScheduleAdherenceUpdatedTopicUserScheduleAdherenceUpdate;\n    schedules: Models.WfmAgentScheduleUpdateTopicAgentScheduleUpdateNotification;\n    // TODO - make a proper type for this\n    workitems: any;\n    // todo: update with event typing details\n    'conversation-summary': any;\n    'screen-monitor-started': any;\n    'screen-monitor-stopped': any;\n    'customer-intent-changed': ICustomerIntentChanged;\n    // Generic per-topic conversation notification; handled the same as 'my-conversations'.\n    event: PigeonConversationEvent;\n    'my-conversations': PigeonConversationEvent;\n    draft: PigeonDraftEvent;\n};\n\nexport interface PigeonService extends Ember.Service {\n    // The pigeon-v1 implementation is synchronous (returns undefined), while\n    // pigeon-v2 returns Promises. Accept both to allow the delegator to forward\n    // calls transparently regardless of which implementation is active.\n    registerPriorityTopic(hawkTopic: string, pigeonServiceEventName?: keyof PigeonEvents): void | Promise<void>;\n    registerTopic(hawkTopic: string, pigeonServiceEventName?: keyof PigeonEvents): void | Promise<void>;\n    unRegisterTopic(hawkTopic: string): void | Promise<void>;\n    unRegisterPriorityTopic(hawkTopic: string): void | Promise<void>;\n\n    registerTopics(topics: string[]): void | Promise<void>;\n    registerPriorityTopics(topics: string[]): void | Promise<void>;\n    immediatelyRegisterPriorityTopics(topics: string[]): void | Promise<void>;\n    unRegisterTopics(topics: string[]): void | Promise<void>;\n    unRegisterPriorityTopics(topics: string[]): void | Promise<void>;\n\n    // v1 may be synchronous; v2 returns an Ember.RSVP.Promise. Accept either.\n    _registerTopics(): Ember.RSVP.Promise<void> | void;\n\n    on<K extends keyof PigeonEvents>(eventName: K, handler: (data: PigeonEvents[K]) => any | void): void;\n    on<K extends keyof PigeonEvents>(eventName: K, context: any, handler: (data: PigeonEvents[K]) => any | void): void;\n\n    one<K extends keyof PigeonEvents>(eventName: K, handler: (data: PigeonEvents[K]) => any | void): void;\n    one<K extends keyof PigeonEvents>(eventName: K, context: any, handler: (data: PigeonEvents[K]) => any | void): void;\n\n    off<K extends keyof PigeonEvents>(eventName: K, handler: (data: PigeonEvents[K]) => any | void): void;\n    off<K extends keyof PigeonEvents>(eventName: K, context: any, handler: (data: PigeonEvents[K]) => any | void): void;\n\n    connected: boolean;\n}\n\n// Register with Ember's service registry so `inject.service('pigeon')` is typed\ndeclare module '@ember/service' {\n    interface Registry {\n        pigeon: PigeonService;\n    }\n}\n\n// ============================================================================\n// Delegator Implementation\n// ============================================================================\n\n/**\n * Stores the active delegate (pigeon-v1 or pigeon-v2) per delegator instance,\n * outside Ember's property system to prevent observation/tracking.\n */\nconst DELEGATES = new WeakMap<object, any>();\n\n/**\n * Tracks which delegates have already had event forwarding wired up,\n * keyed on the delegate itself to avoid double-patching.\n */\nconst EVENT_FORWARDING_SETUP = new WeakSet<object>();\n\n/**\n * Patch the delegate's trigger method to also fire on the delegator, and\n * keep the delegator's observable `connected` property in sync so that\n * computed properties that depend on `pigeon.connected` react correctly.\n *\n * Without this, `connected` lives only inside the delegate (stored in the\n * WeakMap, outside Ember's property system) and Ember never invalidates\n * downstream computed caches when it changes.\n */\nfunction setupEventForwarding(delegator: any, delegate: any): void {\n    if (EVENT_FORWARDING_SETUP.has(delegate)) {\n        return;\n    }\n\n    const originalTrigger = delegate.trigger;\n    if (typeof originalTrigger !== 'function') {\n        return;\n    }\n\n    EVENT_FORWARDING_SETUP.add(delegate);\n\n    // Observe the delegate's `connected` property directly so the delegator\n    // stays in sync even if the delegate sets connected=false without triggering\n    // a disconnect event (e.g. destroyed early, future refactor, etc.).\n    // This is the primary sync mechanism for property changes.\n    Ember.addObserver(delegate, 'connected', () => {\n        set(delegator, 'connected', !!delegate.get('connected'));\n    });\n\n    delegate.trigger = function (eventName: string, ...args: any[]): any {\n        const result = originalTrigger.call(this, eventName, ...args);\n        try {\n            delegator.trigger(eventName, ...args);\n        } catch (e: any) {\n            delegator.get('logger').error('[ATLAS-1709] Error forwarding event:', { eventName, error: e.message });\n        }\n        return result;\n    };\n}\n\n/**\n * Pigeon Service Delegator\n *\n * Transparent proxy that routes all calls to either pigeon-v1 (default) or\n * pigeon-v2, selected at initialize() time based on the ATLAS-1709_pigeon-service\n * feature toggle. Toggle off → v1 (bulk subscriptions). Toggle on → v2\n * (individual subscriptions, leverages streaming client retry logic).\n *\n * External code injects and listens to `service:pigeon` as normal — the\n * delegator is invisible to consumers.\n */\nexport default Service.extend(Evented, {\n    logger: injectService('stash-logger') as any,\n\n    /**\n     * Observable mirror of the active delegate's `connected` state.\n     * Kept in sync via an Ember observer on the delegate's `connected` property,\n     * so Ember computed properties depending on `pigeon.connected` invalidate\n     * correctly regardless of whether the delegate fires a trigger event or just\n     * sets the property directly (e.g. on early destroy or connection drop).\n     */\n    connected: false,\n\n    _getDelegate(this: any): any {\n        let delegate = DELEGATES.get(this);\n        if (!delegate) {\n            delegate = Ember.getOwner(this).lookup('service:pigeon-v1');\n            // Use _setDelegate to get the initial connected sync for free\n            this._setDelegate(delegate);\n        }\n        return delegate;\n    },\n\n    _setDelegate(this: any, delegate: any): void {\n        DELEGATES.set(this, delegate);\n        setupEventForwarding(this, delegate);\n        // Sync the observable property immediately so consumers don't read a\n        // stale value between the delegate swap and the next connect/disconnect.\n        set(this, 'connected', !!delegate.get('connected'));\n    },\n\n    /**\n     * Initialize the pigeon service. Called once during bootstrap after feature\n     * toggles are loaded, so this is the right place to select the implementation.\n     */\n    initialize(this: any, options: { features?: Record<string, any>; [key: string]: any }): any {\n        const features = options?.features ?? {};\n        const usePigeonV2 = !!features['ATLAS-1709_pigeon-service'];\n\n        if (usePigeonV2) {\n            const current = DELEGATES.get(this);\n            const v2 = Ember.getOwner(this).lookup('service:pigeon-v2');\n            if (v2 && v2 !== current) {\n                this.get('logger').info('[ATLAS-1709] Using pigeon-v2');\n                this._setDelegate(v2);\n            }\n        }\n\n        return this._getDelegate().initialize(options);\n    },\n\n    // Delegated methods — forward directly to the active implementation\n\n    getTopicPriority(this: any, ...args: any[]): any {\n        return this._getDelegate().getTopicPriority(...args);\n    },\n\n    isStreamingConnected(this: any): boolean {\n        return this._getDelegate().isStreamingConnected();\n    },\n\n    registerPriorityTopic(this: any, ...args: any[]): Promise<void> {\n        return this._getDelegate().registerPriorityTopic(...args);\n    },\n\n    registerTopic(this: any, ...args: any[]): Promise<void> {\n        return this._getDelegate().registerTopic(...args);\n    },\n\n    registerTopics(this: any, ...args: any[]): Promise<void> {\n        return this._getDelegate().registerTopics(...args);\n    },\n\n    registerPriorityTopics(this: any, ...args: any[]): Promise<void> {\n        return this._getDelegate().registerPriorityTopics(...args);\n    },\n\n    immediatelyRegisterPriorityTopics(this: any, ...args: any[]): Promise<void> {\n        return this._getDelegate().immediatelyRegisterPriorityTopics(...args);\n    },\n\n    unRegisterPriorityTopic(this: any, ...args: any[]): Promise<void> {\n        return this._getDelegate().unRegisterPriorityTopic(...args);\n    },\n\n    unRegisterTopic(this: any, ...args: any[]): Promise<void> {\n        return this._getDelegate().unRegisterTopic(...args);\n    },\n\n    unRegisterTopics(this: any, ...args: any[]): Promise<void> {\n        return this._getDelegate().unRegisterTopics(...args);\n    },\n\n    unRegisterPriorityTopics(this: any, ...args: any[]): Promise<void> {\n        return this._getDelegate().unRegisterPriorityTopics(...args);\n    },\n\n    _registerTopics(this: any, ...args: any[]): any {\n        return this._getDelegate()._registerTopics(...args);\n    },\n\n    // Dynamic property delegation — Ember calls these for unknown keys\n\n    unknownProperty(this: any, key: string): any {\n        return DELEGATES.get(this)?.get(key);\n    },\n\n    setUnknownProperty(this: any, key: string, value: any): any {\n        return DELEGATES.get(this)?.set(key, value);\n    }\n});\n","import { on } from '@ember/object/evented';\nimport { run } from '@ember/runloop';\nimport EmberObject, { computed, set, get } from '@ember/object';\nimport RSVP, { all } from 'rsvp';\nimport Service, { inject as service } from '@ember/service';\nimport localforage from 'localforage';\nimport _ from 'lodash';\n\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport safeSet from 'web-directory/utils/safeSet';\nimport { isTesting } from 'web-directory/utils/testing';\nimport timeoutPromise from '../utils/timeout-promise';\n\nconst PREFERENCE_LOAD_TIME_ALLOWANCE = 5000;\n\nexport default Service.extend(LoggerMixin, {\n    logger: service('stash-logger'),\n    session: service(),\n    feature: service(),\n    ajax: service(),\n    application: service(),\n\n    namespaces: [\n        'chat',\n        'geolocation',\n        'notifications',\n        'sidebar',\n        'webrtc',\n        'test',\n        'widgets',\n        'meta',\n        'phone',\n        'scripts',\n        'deviceVolumes',\n        'panelManager',\n        'panelManagerLayoutTemplateV1',\n        'panelManagerLayoutTemplateV2',\n        'agentUiMainstage',\n        'interactions',\n        'relateSparkification',\n        'commandNav',\n        'modeManager'\n    ],\n\n    error: false,\n\n    syncEnabled: false,\n\n    deferredPersistRequests: null,\n    settingsPath: 'api/v2/settings',\n\n    registerNamespaces: on('init', function () {\n        localforage.config({\n            name: 'orgspan',\n            version: 1.0,\n            storeName: 'preferences',\n            description: 'Storing local preferences for the web client'\n        });\n\n        //need to wrap in a run since there is a lot of non-ember asynchonicity in this code path\n        const promises = this.namespaces.map(namespace => {\n            return localforage\n                .getItem(namespace)\n                .then(data => {\n                    // protect from users whose preferences.chat don't have a \"global\" property\n                    if (namespace == 'chat' && data && !data.global) {\n                        data.global = {};\n                    }\n                    run(() => this._initializeNamespace(namespace, data));\n                })\n                .catch(error => {\n                    // Ensure rejected promises have an Error object, not undefined\n                    const err = error || new Error(`Failed to load preference namespace: ${namespace}`);\n                    this.logger.warn('Error loading preference namespace', { namespace, error: err });\n                    // Initialize with empty data on error so the service can still function\n                    run(() => this._initializeNamespace(namespace, null));\n                });\n        });\n\n        const ready = timeoutPromise(all(promises), PREFERENCE_LOAD_TIME_ALLOWANCE, 'preferences#registerNamespaces')\n            .then(() => this._waitForAccessToken())\n            .then(() => this._enableService())\n            .catch(error => {\n                this._disableService(error);\n            });\n\n        this.set('ready', ready);\n        this.set('deferredPersistRequests', []);\n\n        // used to resolve races in setPreference('namespace.property');\n        this.set('pendingSets', EmberObject.create());\n    }),\n\n    getPreference(path) {\n        const ready = this.ready;\n        return ready.then(() => {\n            return this._getPreference(path);\n        });\n    },\n\n    setPreference(path, value, persist = true) {\n        const ready = this.ready;\n        return ready.then(() => this._setPreference(path, value, persist));\n    },\n\n    _getPreference(path) {\n        const namespaceDelimiter = path.indexOf('.');\n\n        if (namespaceDelimiter === -1) {\n            return localforage.getItem(path);\n        }\n\n        const namespace = path.slice(0, namespaceDelimiter);\n        const keyPath = path.slice(namespaceDelimiter + 1);\n\n        // to avoid race condition with localforage, wait for previous local save to finish.\n        const previousSet = this.get(`pendingSets.${namespace}`) || RSVP.resolve();\n        return previousSet\n            .then(() => {\n                return localforage.getItem(namespace);\n            })\n            .then(settings => {\n                if (!settings) {\n                    return;\n                }\n                let setting = get(settings, keyPath);\n                return setting;\n            })\n            .catch(err => {\n                if (!isTesting) throw err;\n                // swallow the error in tests\n                return RSVP.Promise.resolve();\n            });\n    },\n\n    _setPreference(path, value, persist = true) {\n        if (this.isDestroyed) {\n            return RSVP.resolve({});\n        }\n\n        const namespaceDelimiter = path.indexOf('.');\n\n        if (namespaceDelimiter === -1) {\n            if (value && !Array.isArray(value) && typeof value === 'object') {\n                this.set(path, EmberObject.create(value));\n            } else {\n                this.set(path, value);\n            }\n\n            const syncEnabled = this.get('syncEnabled');\n            return localforage.setItem(path, value).then(() => {\n                if (persist && syncEnabled) {\n                    return this.persistPreferences();\n                }\n            });\n        }\n\n        const namespace = path.slice(0, namespaceDelimiter);\n        const keyPath = path.slice(namespaceDelimiter + 1);\n        const syncEnabled = this.syncEnabled;\n\n        let currentNamespaceObject = this.get(namespace);\n        if (!currentNamespaceObject) {\n            this.set(namespace, EmberObject.create());\n            currentNamespaceObject = this.get(namespace);\n        }\n\n        // to avoid race condition with localforage, wait for previous local save to finish.\n        const previousSet = this.get(`pendingSets.${namespace}`) || RSVP.resolve();\n        const pendingSet = previousSet\n            .then(() => {\n                return this._getPreference(namespace);\n            })\n            .then(setting => {\n                let data = setting || {};\n                set(data, keyPath, value);\n\n                return localforage.setItem(namespace, data);\n            })\n            .finally(() => {\n                this.set(`pendingSets.${namespace}`, null);\n            });\n        this.set(`pendingSets.${namespace}`, pendingSet);\n\n        // after localforage\n        return pendingSet\n            .then(() => {\n                // get the namespace again in case there were multiple sets on the namespace\n                return this._getPreference(namespace);\n            })\n            .then(setting => {\n                let data = setting || {};\n                safeSet(data, keyPath, value);\n                currentNamespaceObject.set(keyPath, value);\n\n                if (persist && syncEnabled) {\n                    return this.persistPreferences();\n                }\n\n                return setting;\n            })\n            .catch(error => {\n                if (isTesting) return RSVP.resolve();\n                this.logger.warn('Error saving preferences', { path, error });\n                return RSVP.reject(error);\n            });\n    },\n\n    async _waitForAccessToken() {\n        if (this.isDestroyed || this.isDestroying) {\n            return RSVP.Promise.resolve();\n        }\n\n        if (this.get('session.accessToken') || isTesting) {\n            return RSVP.Promise.resolve();\n        }\n\n        return new RSVP.Promise(resolve => {\n            this.logger.info('Preferences: waiting for access token');\n\n            const handler = () => {\n                if (this.isDestroyed || this.isDestroying) {\n                    this.removeObserver('session.accessToken', this, handler);\n                    resolve();\n                    return;\n                }\n                if (this.get('session.accessToken')) {\n                    this.removeObserver('session.accessToken', this, handler);\n                    resolve();\n                }\n            };\n\n            this.addObserver('session.accessToken', this, handler);\n        });\n    },\n\n    _enableService() {\n        if (this._isNotDead() && this.get('session.accessToken')) {\n            this.logger.info('Enabling preference API sync');\n            return this._enableSync()\n                .then(() => {\n                    this.logger.info('Initial preferences loaded successfully');\n                })\n                .catch(error => {\n                    this.logger.info('There was an issue enabling sync:', error);\n                    this.set('profileSyncSupport', false);\n                });\n        }\n\n        // Token is not available yet (can happen during auth transitions with\n        // gcmfeauth where the token is momentarily null). Wait for it and retry.\n        // In tests, _waitForAccessToken short-circuits so skip this branch to\n        // preserve the original synchronous resolution behavior. (ATLAS-2431)\n        if (!isTesting && this._isNotDead() && !this.get('session.accessToken')) {\n            this.logger.info('Preferences: token not available at enable time, waiting for token');\n            return this._waitForAccessToken().then(() => {\n                if (this._isNotDead() && this.get('session.accessToken')) {\n                    this.logger.info('Enabling preference API sync (after token wait)');\n                    return this._enableSync()\n                        .then(() => {\n                            this.logger.info('Initial preferences loaded successfully');\n                        })\n                        .catch(error => {\n                            this.logger.info('There was an issue enabling sync:', error);\n                            this.set('profileSyncSupport', false);\n                        });\n                }\n                return RSVP.resolve();\n            });\n        }\n\n        return RSVP.resolve();\n    },\n\n    _disableService(error) {\n        if (this._isNotDead()) {\n            this.logger.error('Error loading preferences', { error });\n            this.set('error', true);\n        }\n    },\n\n    _initializeNamespace(namespace, data) {\n        if (this._isNotDead()) {\n            if (!data) {\n                data = {};\n                localforage.setItem(namespace, data);\n            }\n            this.set(namespace, EmberObject.create(data));\n        }\n    },\n\n    _isNotDead() {\n        return !this.isDestroyed && !this.isDestroying;\n    },\n\n    _enableSync() {\n        const logger = this.logger;\n        const settingsUrl = this.application.pcV2Uri(this.settingsPath);\n        const ajax = this.ajax;\n\n        if (this.syncEnabled) {\n            return RSVP.reject('Preference sync can only be enabled once.');\n        }\n\n        this.set('syncEnabled', true);\n        return ajax\n            .ajaxGet(settingsUrl)\n            .then(preferencesToSync => this._saveSettingsFromServer(preferencesToSync))\n            .then(() => {\n                logger.info('Loaded preferences from server');\n                return RSVP.resolve();\n            })\n            .catch(err => {\n                logger.error('Error getting preferences from server', { err });\n                return RSVP.reject(err);\n            });\n    },\n\n    _saveSettingsFromServer(settings) {\n        const promises = [];\n\n        _.forIn(settings, (data, namespace) => {\n            if (this.namespaces.includes(namespace)) {\n                // default the global setting for chat namespace\n                if (namespace === 'chat' && data && !data.global) {\n                    data.global = {};\n                }\n                promises.push(this._setPreference(namespace, data, false));\n            }\n        });\n\n        return all(promises).then(() => {\n            return this._performPersistPreferences();\n        });\n    },\n\n    profileSyncSupport: computed('session.person.fieldConfig.preferences.preferences', function () {\n        const field = this.get('session.person.fieldConfig.preferences.preferences');\n        return !_.isEmpty(field);\n    }),\n\n    userPreferences: computed('session.person.preferences.preferences.[]', function () {\n        let entry = this.get('session.person').getFieldValue('preferences.preferences');\n        if (entry && typeof entry.value === 'string') {\n            return JSON.parse(entry.value);\n        } else if (entry && entry.value && typeof entry.value === 'object') {\n            return entry.value;\n        }\n        return {};\n    }),\n\n    allLocalPreferences: computed('namespaces.[]', function () {\n        return this.getProperties(this.namespaces);\n    }),\n\n    persistPreferences() {\n        const deferred = RSVP.defer();\n        this.get('deferredPersistRequests').pushObject(deferred);\n        // 100ms debounce — short enough that panel state changes are unlikely to be\n        // lost on tab close, while still coalescing rapid sequential writes.\n        run.debounce(this, this._performPersistPreferences, 100);\n        return deferred.promise;\n    },\n\n    // Should be moved to ember-concurrency model to handle\n    // service teardown during promise resolution\n    _performPersistPreferences() {\n        if (this.isDestroyed) {\n            return;\n        }\n\n        const logger = this.get('logger');\n        const settingsUrl = this.get('application').pcV2Uri(this.get('settingsPath'));\n\n        // If a save is already in-flight, schedule a retry after it completes\n        // rather than silently dropping the request. This prevents the last\n        // panel state from being lost when the user closes the tab mid-save\n        // or when rapid preference changes trigger concurrent persist calls.\n        if (this.get('saving')) {\n            const retryAfterSave = this.get('_pendingSaveRetry');\n            if (!retryAfterSave) {\n                this.set(\n                    '_pendingSaveRetry',\n                    this.get('_currentSavePromise').finally(() => {\n                        this.set('_pendingSaveRetry', null);\n                        if (!this.isDestroyed && !this.isDestroying) {\n                            this._performPersistPreferences();\n                        }\n                    })\n                );\n            }\n            return this.get('_pendingSaveRetry');\n        }\n\n        logger.info('Saving local settings to server');\n\n        // Read preferences fresh rather than through the cached allLocalPreferences\n        // computed — that computed depends only on namespaces.[] which never changes,\n        // so it returns a permanent snapshot from first evaluation and misses any\n        // subsequent in-memory updates (e.g. commandNav state changes).\n        const preferences = this.getProperties(this.get('namespaces'));\n        preferences.meta = preferences.meta || {};\n        preferences.meta.version = Date.now();\n\n        this.set('saving', true);\n        const savePromise = this.get('ajax')\n            .put(settingsUrl, { data: preferences })\n            .then(() => {\n                if (this.isDestroyed) {\n                    return;\n                }\n                logger.info('Settings saved successfully');\n            })\n            .then(() => {\n                if (this.isDestroyed) {\n                    return;\n                }\n                this.setPreference('meta', preferences.meta, false);\n                const deferredPersistRequests = this.deferredPersistRequests;\n                deferredPersistRequests.forEach(deferred => deferred.resolve());\n                return all(deferredPersistRequests.map(deferred => deferred.promise)).then(() =>\n                    deferredPersistRequests.clear()\n                );\n            })\n            .catch(error => {\n                logger.error('There was an error saving preferences', { error });\n                // Reject pending deferred requests so callers that explicitly chain\n                // .catch() on setPreference() (e.g. command-bookmarks) can handle\n                // the failure. Other callers without .catch() handlers are unaffected.\n                const deferredPersistRequests = this.get('deferredPersistRequests');\n                deferredPersistRequests.forEach(deferred => deferred.reject(error));\n                deferredPersistRequests.clear();\n            })\n            .finally(() => {\n                // Clear saving and the promise reference together so there is no\n                // window where saving===false but _currentSavePromise is still set,\n                // which could allow a concurrent ajax.put to start prematurely.\n                this.set('saving', false);\n                this.set('_currentSavePromise', null);\n            });\n\n        this.set('_currentSavePromise', savePromise);\n        return savePromise;\n    }\n});\n","import { resolve } from 'rsvp';\nimport EmberObject, { observer, set, get, computed } from '@ember/object';\nimport { run, once, join } from '@ember/runloop';\nimport Service, { inject as service } from '@ember/service';\nimport _ from 'lodash';\nimport StreamingService from 'web-directory/services/streaming';\nimport moment from '../utils/dates';\nimport { FL } from '../utils/entity-fields';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport { isConflictError } from 'ember-ajax/errors';\nimport { isPurecloudSource } from 'web-directory/utils/presence-utils';\nimport { isPresence } from 'web-directory/mixins/entity-presence';\n\nexport default Service.extend(LoggerMixin, {\n    eventMap: {\n        presence: 'primaryPresenceEvent',\n        outofoffice: 'outOfOfficeEvent',\n        conversationsummary: 'conversationSummaryEvent',\n        routingStatus: 'routingStatusEvent',\n        geolocation: 'geolocationEvent'\n    },\n\n    trackedGuids: null,\n\n    intl: service(),\n    ajax: service(),\n    store: service(),\n    pigeon: service(),\n    session: service(),\n    streaming: service(),\n    application: service(),\n    notification: service(),\n    batchDataRequests: service(),\n    presenceService: service('presence'),\n    permissions: service(),\n\n    phoneIntegrations: service(),\n\n    isRequestingOffQueueEnabled: computed.readOnly('session.features.PURE-5013_enableRequestingOffQueue'),\n\n    init() {\n        this._super(...arguments);\n\n        if (this.get('permissions.canViewIntegrationPresence')) {\n            this.eventMap.integrationpresence = 'integrationpresence';\n            delete this.eventMap.presence;\n            this.set('eventMap', this.eventMap);\n        }\n\n        _.forIn(this.eventMap, (value, key) => this.pigeon.on(key, this, this.events[value]));\n\n        this.set('trackedGuids', EmberObject.create());\n        this.subscribeToMyself();\n        this.streaming.subscribeToConnection(this);\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        _.forIn(this.eventMap, (value, key) => this.pigeon.off(key, this, this.events[value]));\n    },\n\n    _getPresenceDefinition(presence) {\n        if (typeof presence === 'string') {\n            return this.session.getPresence(presence);\n        } else {\n            return this.presenceService.getPresenceDefinition(presence);\n        }\n    },\n\n    isPresence(presence, testValue) {\n        const definition = this._getPresenceDefinition(presence);\n        return isPresence(this.get('session.presenceMap'), definition, testValue);\n    },\n\n    subscribeToMyself() {\n        const guid = this.get('session.person.guid');\n        const id = this.get('session.person.id');\n\n        if (guid && id) {\n            const pigeon = this.pigeon;\n            this.logger.debug('subscribing to myself');\n\n            this.set(`trackedGuids.${guid}`, true);\n            this._getTopicsForUser(guid).forEach(topic => pigeon.registerPriorityTopic(topic));\n        }\n    },\n\n    _getTopicsForUser(guid) {\n        if (!guid) {\n            return [];\n        }\n\n        return [`v2.users.${guid}?${Object.keys(this.eventMap).join('&')}`];\n    },\n\n    _guidFromTopicName(topic) {\n        const guidPattern = /([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/gi;\n        const guids = topic.match(guidPattern);\n\n        if (guids && guids.length > 0) {\n            return guids[0];\n        }\n        return '';\n    },\n\n    connect: StreamingService.streamingEvent(function () {\n        run.debounce(this, this.refreshPeopleActivityState, 1000);\n    }),\n\n    refreshPeopleActivityState() {\n        const personId = this.get('session.person.guid');\n        const ids = Object.keys(this.trackedGuids);\n\n        if (personId) {\n            ids.push(personId);\n        }\n\n        if (!_.isEmpty(ids)) {\n            this.logger.debug('PRESENCE-SUBSCRIPTION: Reloading activity state for people: ', ids.length);\n            this.store.findMany('person', ids, FL.person);\n        }\n    },\n\n    watchAuthForSubscribe: observer('session.isAuthenticated', 'session.person.guid', function () {\n        this.subscribeToMyself();\n    }),\n\n    subscribeToPresence(person) {\n        const pigeon = this.pigeon;\n\n        const id = person.get('id');\n        const guid = person.get('guid');\n        const jid = person.get('jid');\n\n        this.set(`trackedGuids.${guid}`, true);\n        let callback = function () {};\n\n        if (this.get('streaming.connection') && jid && jid !== this.get('session.person.jid')) {\n            if (0 === person.get('presenceSubscriptionCounter')) {\n                this._getTopicsForUser(guid).forEach(topic => pigeon.registerTopic(topic));\n                once(this, this.refreshUser, id);\n            }\n\n            person.incrementProperty('presenceSubscriptionCounter');\n\n            callback = () => {\n                if (0 < person.get('presenceSubscriptionCounter')) {\n                    person.decrementProperty('presenceSubscriptionCounter');\n                }\n\n                if (0 === person.get('presenceSubscriptionCounter')) {\n                    this._getTopicsForUser(guid).forEach(topic => pigeon.unRegisterTopic(topic));\n                    this.set(`trackedGuids.${guid}`, undefined);\n                }\n            };\n        }\n\n        return callback;\n    },\n\n    refreshUser(id) {\n        this.batchDataRequests.refreshUser(id);\n    },\n\n    bulkSubscribeToPresence(people) {\n        let callbacks = people.map(p => this.subscribeToPresence(p));\n        return () => {\n            callbacks.forEach(cb => cb());\n        };\n    },\n\n    autoSubscribe(people, context, type = '') {\n        let callbackKey = `${type}PresenceSubscriptionCallback`;\n        let previousCallback = context.get(callbackKey);\n        let newCallback = null;\n\n        if (people) {\n            newCallback = this.bulkSubscribeToPresence(people);\n        }\n\n        if (typeof previousCallback === 'function') {\n            previousCallback();\n        }\n\n        try {\n            context.set(callbackKey, newCallback);\n        } catch (e) {\n            // sometimes we are trying to clear out subscription callbacks after an object was destroyed by ember\n            // we dont want to run the function, but we can't use `set`, so clear it out forcefully\n            if (!newCallback) {\n                context[callbackKey] = newCallback;\n            }\n        }\n    },\n\n    changePresence(presence) {\n        let promise = resolve();\n        const session = this.session;\n        const isOutOfOffice = session.get('person.isOutOfOffice');\n        const currentPresence = session.get('person.primaryPresence.presenceDefinition');\n        const activityPresence = session.get('person.activityPresence') || '';\n\n        if (isOutOfOffice) {\n            promise = this.toggleOutOfOffice();\n        }\n\n        presence = this._getPresenceDefinition(presence);\n\n        if (this.get('isRequestingOffQueueEnabled')) {\n            if (activityPresence.toLowerCase() !== 'on_queue') {\n                session.set('person.primaryPresence.presenceDefinition', presence);\n            }\n        } else {\n            session.set('person.primaryPresence.presenceDefinition', presence);\n        }\n\n        return promise.then(() => {\n            if (presence && presence.id) {\n                return this.presenceService.setUsersPresence(session.get('person'), presence).catch(err => {\n                    this.logger.error('PRESENCE-SUBSCRIPTION: Failed to set presence with public api', {\n                        error: err\n                    });\n                    session.set('person.primaryPresence.presenceDefinition', currentPresence);\n\n                    if (isConflictError(err)) {\n                        this._alertDeletedPresence(presence);\n                    }\n                });\n            }\n        });\n    },\n\n    _alertDeletedPresence(presence) {\n        const intl = this.intl;\n        const title = intl.t('chat.presence.errorSettingDeletedPresence.title');\n        const message = intl.t('chat.presence.errorSettingDeletedPresence.message');\n        this.notification.error(title, message);\n\n        this.presenceService.removeDeletedPresence(presence);\n    },\n\n    changeRoutingStatus(status) {\n        const id = this.get('session.person.guid');\n        const url = this.application.pcV2Uri(`api/v2/users/${id}/routingStatus`);\n        const data = {\n            userId: id,\n            status: status,\n            startTime: new Date(moment.now()).toISOString()\n        };\n\n        this.ajax.put(url, { data }).catch(error => {\n            this.logger.error('PRESENCE-SUBSCRIPTION: Error when changing routing status', {\n                error\n            });\n        });\n    },\n\n    toggleOutOfOffice() {\n        return this.setOutOfOffice(null, null, !this.get('session.person.isOutOfOffice'));\n    },\n\n    doUserPresenceStatusChanged(person, statusUpdate) {\n        const { source } = statusUpdate;\n        const phoneIntegrations = this.phoneIntegrations;\n\n        const isSourceOnUsableList = phoneIntegrations.canViewThirdPartyPresence(source);\n        if (isSourceOnUsableList) {\n            // set the integration presence value\n            // using Ember.set as person is an object by this point\n            set(person, 'activities.integrationPresence', statusUpdate);\n        } else {\n            let existingPresenceIndex = null;\n            let existingPresenceObj = null;\n            if (person.get('presenceList')) {\n                existingPresenceObj = person.get('presenceList').find(function (presence, index) {\n                    if (presence.source.toLowerCase() === source.toLowerCase()) {\n                        existingPresenceIndex = index;\n                        return true;\n                    }\n                });\n            }\n\n            if (existingPresenceObj && existingPresenceIndex > -1) {\n                const presenceListStored = person.get('presenceList');\n                presenceListStored[existingPresenceIndex] = EmberObject.create(statusUpdate);\n                person.notifyPropertyChange('presenceList');\n            } else {\n                person.get('presenceList').pushObject(EmberObject.create(statusUpdate));\n            }\n            this.checkRequestingOffQueue(person, statusUpdate);\n        }\n    },\n\n    doUserPrimaryPresenceSourceChanged(person, statusUpdate) {\n        let newSource = statusUpdate.source;\n        const phoneIntegrations = this.phoneIntegrations;\n        const isThirdPartySource = !!phoneIntegrations.getIntegrationFromSource(newSource);\n        if (!isThirdPartySource) {\n            // convert PURECLOUD -> default\n            if (isPurecloudSource(newSource)) {\n                newSource = 'default';\n            }\n            person.set('currentPresenceSource', newSource);\n        }\n    },\n\n    handleIntegrationPresenceEvent(presenceEvent) {\n        join(() => {\n            this.batchDataRequests.getUser(presenceEvent.userId).then(person => {\n                const { eventType } = presenceEvent;\n                if (eventType === 'UserPresenceStatusChanged') {\n                    this.doUserPresenceStatusChanged(person, presenceEvent);\n                } else if (eventType === 'UserPrimaryPresenceSourceChanged') {\n                    this.doUserPrimaryPresenceSourceChanged(person, presenceEvent);\n                }\n            });\n        });\n    },\n\n    setOutOfOffice(startDate, endDate, isIndefinite, newOutOfOffice = false) {\n        const url = this.application.pcV2Uri(`api/v2/users/${this.get('session.person.guid')}/outofoffice`);\n        const isOutOfOffice = this.get('session.person.isOutOfOffice');\n\n        // SHIA-927: Client workaround until CORE-4132 is done; this lets the streaming service know the user is available xmpp presence while ooto.\n        if (newOutOfOffice) {\n            const availablePresence = this.session.getPresence('available');\n            this.get('session.person').set('activities.outOfOffice.active', true);\n            this.get('session.user').set('outOfOffice.active', true);\n            this.presenceService.setUsersPresence(this.get('session.person'), availablePresence).catch(err => {\n                this.logger.error('PRESENCE-SUBSCRIPTION: Failed to set presence to available during out of office', {\n                    err\n                });\n            });\n        }\n\n        const payload = { startDate: startDate, endDate: endDate, indefinite: isIndefinite };\n\n        const promise = this.ajax.put(url, {\n            contentType: 'application/json; charset=UTF-8',\n            dataType: 'json',\n            data: JSON.stringify(payload)\n        });\n        promise\n            .then(data => {\n                this.get('session.person').set('activities.outOfOffice', data);\n                this.get('session.user').set('outOfOffice', data);\n            })\n            .catch(error => {\n                this.logger.error('PRESENCE-SUBSCRIPTION: Failed to toggle out of office to: ', {\n                    newOutOfOffice,\n                    error\n                });\n\n                this.get('session.person').set('activities.outOfOffice.active', isOutOfOffice);\n                this.get('session.user').set('outOfOffice.active', isOutOfOffice);\n            });\n        return promise;\n    },\n\n    startOfTime: () => '1970-01-01T12:00:00.000Z',\n    endOfTime: () => '9999-12-31T00:00:00.000Z',\n    rightAboutMeow: () => moment().subtract(1, 'year').toISOString(),\n    handleRoutingStatusError(errorCode) {\n        if (typeof errorCode === 'string' && errorCode.toLowerCase() === 'user.noskills') {\n            const intl = this.intl;\n            const title = intl.t('notification.purecloud.errorSkillsRouting.title');\n            const message = intl.t('notification.purecloud.errorSkillsRouting.message');\n            this.notification.error(title, message);\n        }\n    },\n    checkRequestingOffQueue(person, incomingPresenceEvent) {\n        // only trigger requesting off queue toast for authenticated user\n        if (\n            person.get('id') === this.get('session.person.id') &&\n            get(incomingPresenceEvent, 'futurePresenceDefinition') &&\n            this.get('isRequestingOffQueueEnabled')\n        ) {\n            const intl = this.get('intl');\n            const title = intl.t('chat.presence.requestingOffQueueNotification.title');\n            const message = intl.t('chat.presence.requestingOffQueueNotification.message');\n            this.get('notification').info(title, message);\n        }\n    },\n\n    events: {\n        conversationSummaryEvent(conversationSummary, { topicName }) {\n            const guid = this._guidFromTopicName(topicName);\n            join(() => {\n                this.batchDataRequests.getUser(guid).then(person => {\n                    person.set('activities.conversationSummary', conversationSummary);\n                });\n            });\n        },\n\n        outOfOfficeEvent(outOfOfficeDef, { topicName }) {\n            const guid = this._guidFromTopicName(topicName);\n            join(() => {\n                this.batchDataRequests\n                    .getUser(guid)\n                    .then(person => person.set('activities.outOfOffice', outOfOfficeDef));\n            });\n        },\n\n        routingStatusEvent({ errorInfo, id, routingStatus }) {\n            if (errorInfo && errorInfo.errorCode) {\n                this.handleRoutingStatusError(errorInfo.errorCode);\n            }\n\n            join(() => {\n                this.batchDataRequests\n                    .getUser(id)\n                    .then(person => person.set('activities.routingStatus', routingStatus));\n            });\n        },\n\n        integrationpresence(event) {\n            if (this.get('permissions.canViewIntegrationPresence')) {\n                this.handleIntegrationPresenceEvent(event);\n            }\n        },\n\n        primaryPresenceEvent(primaryPresence, { topicName }) {\n            const guid = this._guidFromTopicName(topicName);\n            join(() => {\n                this.get('batchDataRequests')\n                    .getUser(guid)\n                    .then(person => {\n                        person.set('activities.presence', primaryPresence);\n                        this.checkRequestingOffQueue(person, primaryPresence);\n                    });\n            });\n        },\n\n        geolocationEvent(geolocation, { topicName }) {\n            this.logger.debug('PRESENCE-SUBSCRIPTION: geolocationEvent', arguments);\n            const guid = this._guidFromTopicName(topicName);\n            if (geolocation && (geolocation.city || geolocation.region || geolocation.country)) {\n                this.logger.debug(\n                    'PRESENCE-SUBSCRIPTION: gelocationEvent user/self',\n                    guid,\n                    this.get('session.person.guid')\n                );\n                if (guid && guid === this.get('session.person.guid')) {\n                    this.logger.debug('PRESENCE-SUBSCRIPTION: adding geolocation to self');\n                    this.set('session.person.activities.geolocation', geolocation);\n                }\n                join(() => {\n                    this.batchDataRequests.getUser(guid).then(person => {\n                        person.set('activities.geolocation', geolocation);\n                    });\n                });\n            }\n        }\n    }\n});\n","import { readOnly } from '@ember/object/computed';\nimport { getOwner } from '@ember/application';\nimport { A } from '@ember/array';\nimport { computed, get, set } from '@ember/object';\nimport Service, { inject as service } from '@ember/service';\nimport Ember from 'ember';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport Presence from 'web-directory/models/presence';\nimport { formatPresenceLanguageLabelLocale } from 'web-directory/utils/intl';\nimport { addPageAction } from 'web-directory/utils/newrelic';\nimport TimeoutPromise from 'web-directory/utils/timeout-promise';\nimport _ from 'lodash';\nimport RSVP from 'rsvp';\n\nexport const systemPresences = {\n    // Green\n    AVAILABLE: 'AVAILABLE',\n    // Orange\n    AWAY: 'AWAY',\n    BREAK: 'BREAK',\n    MEAL: 'MEAL',\n    TRAINING: 'TRAINING',\n    IDLE: 'IDLE',\n    // Red\n    BUSY: 'BUSY',\n    MEETING: 'MEETING',\n    // Gray\n    OFFLINE: 'OFFLINE',\n    // Blue\n    ON_QUEUE: 'ON_QUEUE'\n};\n\nlet _mapping;\n\nconst getPresenceMappings = function (lookup) {\n    // This is a function because the lookups need to happen after the app is boostrapped.\n    // Attempts made to refactor that have ended in failure: 2.5\n    // last attempt date: 01/05/2015 - eric lifka\n    // most recent attempt: 06/02/2015 - sam wenke\n    // Ability to lookup via entity.presence, entity.presence, presence code, or guid.\n    if (!_mapping) {\n        _mapping = {\n            available: lookup('chat.presence.available').toString(),\n            online: lookup('chat.presence.available').toString(),\n            busy: lookup('chat.presence.busy').toString(),\n            idle: lookup('chat.presence.away').toString(),\n            away: lookup('chat.presence.away').toString(),\n            on_queue: lookup('chat.presence.onQueue').toString(),\n            out_of_office: lookup('chat.presence.outOfOffice.title').toString(),\n            offline: lookup('chat.presence.offline').toString(),\n            not_responding: lookup('chat.presence.notResponding').toString(),\n            meal: lookup('chat.presence.meal').toString(),\n            training: lookup('chat.presence.training').toString(),\n            break: lookup('chat.presence.break').toString(),\n            meeting: lookup('chat.presence.meeting').toString()\n        };\n    }\n\n    return _mapping;\n};\n\nexport default Service.extend(LoggerMixin, {\n    ajax: service(),\n    intl: service(),\n    notification: service(),\n\n    presenceDefinitions: null,\n\n    // Dynamically injected services\n    session: null,\n    application: null,\n    presenceSubscription: null,\n\n    acdDivisionPresenceProfileToggle: readOnly('session.features.acdDivisionPresenceProfileToggle'),\n\n    init() {\n        this._super(...arguments);\n\n        const owner = getOwner(this);\n        const session = owner.lookup('service:session');\n        const application = owner.lookup('service:application');\n        const presenceSubscription = owner.lookup('service:presenceSubscription');\n        if (!application || !session || !presenceSubscription) {\n            this.logger.error('Application, session, and presence subscriptions services are required, but not found');\n            return;\n        }\n\n        this.setProperties({\n            session,\n            application,\n            presenceSubscription,\n            presenceDefinitions: A([]),\n            outOfBandPresenceDefinitions: A([])\n        });\n    },\n\n    allPresences: computed('primaryPresences.[]', 'allSecondaryPresences', function () {\n        const secondary = Object.values(this.allSecondaryPresences || {}).flat();\n        return [].concat(this.primaryPresences, secondary);\n    }),\n\n    allActivePresences: computed('primaryPresences.[]', 'allSecondaryPresences', function () {\n        const secondary = Object.values(this.allSecondaryPresences || {}).flat();\n        return [].concat(this.primaryPresences, secondary).reject(presence => presence.get('deactivated'));\n    }),\n\n    primaryPresences: computed('presenceDefinitions.[]', function () {\n        return this.presenceDefinitions\n            .filter(presence => {\n                if (Object.prototype.hasOwnProperty.call(presence, 'type')) {\n                    return presence.type.toLowerCase() === 'system';\n                }\n            })\n            .map(presence => {\n                // ownerInjection() must be the first arg in Ember 3.28\n                return Presence.create(Object.assign({ presence }, getOwner(this).ownerInjection()));\n            });\n    }),\n\n    secondaryPresences: computed('allSecondaryPresences.[]', function () {\n        const presences = this.allSecondaryPresences || {};\n        const keys = Object.keys(presences);\n        keys.forEach(key => {\n            if (presences[key]) {\n                presences[key] = A(presences[key]).reject(presence => presence.get('deactivated'));\n            }\n        });\n        return presences;\n    }),\n\n    allSecondaryPresences: computed('presenceDefinitions.[]', function () {\n        const secondaryPresenceDefinitions = (this.presenceDefinitions || [])\n            .filter(presence => {\n                return Object.prototype.hasOwnProperty.call(presence, 'type') && presence.type.toLowerCase() === 'user';\n            })\n            .map(presence => {\n                // ownerInjection() must be the first arg in Ember 3.28\n                return Presence.create(Object.assign({ presence }, getOwner(this).ownerInjection()));\n            });\n\n        return _.groupBy(secondaryPresenceDefinitions, presence => presence.get('key'));\n    }),\n\n    loadPresences() {\n        const definitions = this.loadAllPresenceDefinitions();\n\n        const promise = RSVP.resolve(definitions);\n\n        promise\n            .then((definitions = []) => {\n                this.set('presenceDefinitions', A(definitions));\n\n                const definitionIds = this.presenceDefinitions.mapBy('id');\n                const currentId = this.get('session.person.presenceDefinition.id');\n                if (currentId && definitionIds.indexOf(currentId) === -1) {\n                    return this.findPresence(currentId).catch(error => {\n                        this.logger.error('Presence: Could not fetch out-of-band presence.', {\n                            error,\n                            remoteData: {\n                                currentId\n                            }\n                        });\n                    });\n                }\n            })\n            .catch(error => {\n                this.logger.error('Presence: Could not get presence definitions:', {\n                    error\n                });\n\n                this.set('presenceDefinitions', []);\n\n                console.error('presenceDefinitionsFetchFailure');\n                return;\n            });\n\n        return promise;\n    },\n\n    loadAllPresenceDefinitions() {\n        const deferred = RSVP.defer();\n\n        this.loadPresenceDefinitions().then(data => {\n            (data.entities || []).forEach(entity => {\n                Object.keys(entity.languageLabels || {}).forEach(key => {\n                    entity.languageLabels[key] = Ember.Handlebars.Utils.escapeExpression(entity.languageLabels[key]);\n                });\n            });\n\n            this.handlePresenceData(data, deferred);\n        });\n        let presenceTimeout = Ember.testing ? 2000 : 20000;\n        return TimeoutPromise(deferred.promise, presenceTimeout, 'presence#loadAllPresenceDefinitions');\n    },\n    loadPresenceDefinitions() {\n        const url = this.application.pcV2Uri('api/v2/presence/definitions');\n        return this.ajax.request(url, {\n            method: 'GET',\n            contentType: 'application/json; charset=UTF-8'\n        });\n    },\n\n    handlePresenceData(data, deferred) {\n        const presences = data.entities.map(value => {\n            if (value.systemPresence.toLowerCase() === 'onqueue') {\n                value.systemPresence = 'ON_QUEUE';\n            }\n            return value;\n        });\n        return deferred.resolve(presences);\n    },\n\n    localizePresenceString(presence) {\n        const intl = this.intl;\n        const lookup = intl.t.bind(intl);\n        const mapping = getPresenceMappings(lookup);\n        return mapping[presence] || mapping.offline;\n    },\n\n    getPresence(presenceString) {\n        const primary = this.primaryPresences;\n        const presenceStrFormatted = presenceString.toLowerCase();\n        const secondary = this.secondaryPresences[presenceStrFormatted];\n        const isPresenceOnQueue = presenceStrFormatted === systemPresences.ON_QUEUE.toLowerCase();\n\n        let collection = primary;\n        if (!_.isEmpty(secondary) && !isPresenceOnQueue) {\n            collection = A(secondary).sortBy('presence.createdDate');\n        }\n\n        return A(collection).find(mapPresence => {\n            const rawPresence = mapPresence.get('presence');\n            const mapHasPresence = rawPresence.id === presenceString.toString();\n            const systemPresence = rawPresence.systemPresence;\n            const mapHasSystemPresence =\n                systemPresence &&\n                (systemPresence.toLowerCase() === presenceStrFormatted ||\n                    systemPresence.toLowerCase() === presenceStrFormatted.replace(/-|\\s/g, '_'));\n            if (mapHasPresence || mapHasSystemPresence) {\n                return rawPresence;\n            }\n        });\n    },\n\n    getPresenceDefinition(presence) {\n        const presenceMap = this.presenceDefinitions;\n        return presenceMap.find(mapPresence => {\n            return mapPresence.id === presence.id;\n        });\n    },\n\n    getPresenceFallback(presence) {\n        if (presence) {\n            return presence.toLowerCase().replace(/-|\\s/g, '_');\n        }\n    },\n\n    localizePresence(presence, fallback) {\n        if (typeof fallback === 'string' && fallback.toLowerCase() === 'out_of_office') {\n            return this.localizePresenceString(fallback);\n        }\n\n        if (typeof presence === 'string' && !fallback) {\n            return this.localizePresenceString(presence);\n        }\n\n        if (presence) {\n            if (typeof presence === 'object') {\n                presence = this.getPresenceDefinition(presence);\n            }\n\n            if (presence && presence.languageLabels && presence.systemPresence !== 'IDLE') {\n                // en-us => en_US\n                let locale = formatPresenceLanguageLabelLocale(this.get('intl.locale.0'));\n                let languageLabel = get(presence.languageLabels, locale);\n                if (this.acdDivisionPresenceProfileToggle && !languageLabel) {\n                    languageLabel = get(presence.languageLabels, locale.toLowerCase());\n                }\n                if (fallback === undefined) {\n                    fallback = this.getPresenceFallback(presence.systemPresence);\n                }\n                return languageLabel || this.localizePresenceString(fallback);\n            }\n        }\n\n        return this.localizePresenceString(fallback);\n    },\n\n    removeDeletedPresence(presence) {\n        this.presenceDefinitions.removeObject(presence);\n    },\n\n    findPresence(id, presenceDef = false) {\n        if (!id) {\n            return RSVP.resolve({});\n        }\n\n        const currentPresence = this.presenceDefinitions.find(presence => presence.id === id);\n        if (currentPresence) {\n            // ownerInjection() must be the first arg in Ember 3.28\n            const instance = Presence.create(\n                Object.assign({ presence: currentPresence }, getOwner(this).ownerInjection())\n            );\n            return RSVP.resolve(instance);\n        }\n\n        const url = this.application.pcV2Uri(['api/v2/presencedefinitions', id]);\n        return this.ajax\n            .request(url)\n            .then(presence => {\n                // ownerInjection() must be the first arg in Ember 3.28\n                const model = Presence.create(Object.assign({ presence }, getOwner(this).ownerInjection()));\n\n                this.presenceDefinitions.addObject(presence);\n\n                return model;\n            })\n            .catch(error => {\n                if (this.get('session.features.acdDivisionPresenceProfileToggle')) {\n                    if (id && presenceDef && presenceDef.systemPresence) {\n                        // We need to map the out of band presence to a primary presence for translation sake.\n                        return this.primaryPresences.find(presence => {\n                            const matchingPrimaryPresence =\n                                presence.get('presence.systemPresence').toLowerCase() ===\n                                presenceDef.systemPresence.toLowerCase();\n                            if (matchingPrimaryPresence) {\n                                const newPresence = presence.get('presence');\n                                // Replace the id of the actual def instead of the primary presences id\n                                set(newPresence, 'id', presenceDef.id);\n                                // ownerInjection() must be the first arg in Ember 3.28\n                                const instance = Presence.create(\n                                    Object.assign({ presence: newPresence }, getOwner(this).ownerInjection())\n                                );\n                                this.outOfBandPresenceDefinitions.addObject(instance);\n                                return instance;\n                            }\n                            return false;\n                        });\n                    }\n                }\n                this.logger.error('Presence: Couldnt find given presence', {\n                    error,\n                    remoteData: {\n                        presenceId: id\n                    }\n                });\n            });\n    },\n\n    selectPresence(presenceModel) {\n        this.presenceSubscription.changePresence(presenceModel.get('presence'));\n    },\n\n    setUsersPresence(entity, presence) {\n        if (typeof presence === 'string') {\n            // Need to convert string lookups to actual internal models\n            presence = this.getPresence(presence);\n        }\n\n        addPageAction('emberPurecloudComponents.entity.changeStatus', {\n            presence: get(presence, 'presence.systemPresence')\n        });\n\n        const url = this.application.pcV2Uri(['api/v2/users', get(entity, 'id'), 'presences/PURECLOUD']);\n\n        return this.ajax.patch(url, {\n            contentType: 'application/json',\n            data: {\n                presenceDefinition: {\n                    id: get(presence, 'id')\n                }\n            }\n        });\n    },\n\n    setUsersStatus(entity, status) {\n        const url = this.application.pcV2Uri(['api/v2/users', get(entity, 'id'), 'presences/PURECLOUD']);\n        return this.ajax.patch(url, {\n            contentType: 'application/json',\n            data: {\n                message: status\n            }\n        });\n    },\n\n    logoffUser(entity) {\n        const tokensUrl = this.application.pcV2Uri(['api/v2/apps/users', get(entity, 'id'), 'logout']);\n        return this.ajax\n            .del(tokensUrl, { dataType: 'text' })\n            .then(() => {\n                this.notification.info(null, this.intl.t('purecloud-components.logOffNotification'));\n            })\n            .catch(error => {\n                this.logger.error('Presence: Unable to logout user.', {\n                    entity,\n                    error\n                });\n            })\n            .finally(() => {\n                addPageAction('emberPurecloudComponents.entity.logoff');\n            });\n    },\n\n    disassociateUserFromStation(entity) {\n        const stationUrl = this.application.pcV2Uri(['api/v2/users', get(entity, 'id'), 'station/associatedstation']);\n        return this.ajax\n            .del(stationUrl)\n            .then(() => {\n                this.notification.info(null, this.intl.t('purecloud-components.stationDisassociateNotification'));\n            })\n            .catch(error => {\n                this.logger.error('Presence: Unable to dissociate user station.', {\n                    entity,\n                    error\n                });\n            })\n            .finally(() => {\n                addPageAction('emberPurecloudComponents.entity.stationDisassociate');\n            });\n    }\n});\n","import { typeOf } from '@ember/utils';\nimport Service, { inject as service } from '@ember/service';\nimport Ember from 'ember';\nimport _ from 'lodash';\nimport { isSameSiteNoneCompatible } from 'should-send-same-site-none';\nimport moment from '../utils/dates';\nimport config from '../config/environment';\nimport netUtils from '../utils/net';\n\nconst LOGOUT_BOUNCE_COOKIE_NAME = 'lastLogoutTimestamp';\nconst LOGOUT_BOUNCE_COOKIE_DURATION_MILLIS = 5000;\nconst LOGOUT_BOUNCE_THREASHOLD_MILLIS = 5000;\n\nconst { Logger } = Ember;\n\n/**\n *  Service containing utility methods and metadata used in the PureCloud OAuth flows\n *\n *  service:purecloud-oauth - utilities and state for the oauth flow\n *  authenticator:directory - Handles direct interface with the auth endpoints\n *  service:session - holds state for the current user authentication/authorization context\n *  authorizer:directory - Handles future request authorization\n */\nexport default Service.extend({\n    cookies: service(),\n    session: service(),\n\n    _restoreState: null,\n\n    // Flag to indicate if we're in the logout/login bounce used to re-prime the oauth flow to Collaborate upon logout\n    inLogoutBounce: false,\n\n    init() {\n        this._super(...arguments);\n        if (this._isInLogoutBounce()) {\n            this.set('inLogoutBounce', true);\n            this._clearLogoutTime();\n        }\n    },\n\n    getClientId() {\n        const { oauthProps } = config;\n        if (\n            oauthProps &&\n            typeof oauthProps === 'object' &&\n            !Object.prototype.hasOwnProperty.call(oauthProps, 'clientId')\n        ) {\n            try {\n                const { runtime } = netUtils.getEnvDetails();\n                return runtime.name in oauthProps ? oauthProps[runtime.name].clientId : '' || '';\n            } catch (e) {\n                return '';\n            }\n        }\n        return '';\n    },\n\n    /**\n     * Generates a string value that can be passed via the state parameter\n     * to restore the current state post authentication\n     */\n    serializeRestoreState(baseLocation = window.location) {\n        let result = null;\n\n        const searchString = baseLocation.search;\n        const internalRoute = this.get('session.attemptedTransition.intent.url');\n\n        if (searchString && _.trim(searchString).length > 0) {\n            result = (result || '') + searchString;\n        }\n\n        if (internalRoute && _.trim(internalRoute).length > 0) {\n            result = (result || '') + `#${internalRoute}`;\n        }\n\n        // Make sure we don't redirect to login-oauth; should never be the case though\n        return result && result.indexOf('login-oauth') === -1 ? result : null;\n    },\n\n    /**\n     * Parse and store the state param for later use to restore the app to\n     * pre-auth state.\n     */\n    deserializeRestoreState(stateParamValue, baseLocation = window.location) {\n        let redirectUrl = null;\n        let prunedStateParamValue = typeOf(stateParamValue) === 'string' ? stateParamValue.trim() : undefined;\n\n        if (prunedStateParamValue) {\n            let firstChar = prunedStateParamValue.charAt(0);\n            if (firstChar === '?' || firstChar === '#') {\n                // Rebuild pre-redirect state\n                try {\n                    // ensure pathname ends with .html or / for s3 redirect\n                    let s3SafePathname = baseLocation.pathname;\n                    if (!s3SafePathname.endsWith('.html') && !s3SafePathname.endsWith('/')) {\n                        s3SafePathname += '/';\n                    }\n\n                    let parsedStateParam = new URL(prunedStateParamValue, 'https://example.com');\n                    // if no search was provided via state, use the current\n                    // FUTURE: We could merge the query params if we wanted, but not currently applicable and probably overkill\n                    let finalSearch = parsedStateParam.search || baseLocation.search;\n                    // if no hash was provided via state, use the current\n                    let finalHash = parsedStateParam.hash || baseLocation.hash;\n\n                    redirectUrl = new URL(\n                        `${s3SafePathname}${finalSearch}${finalHash}`,\n                        baseLocation.origin || `${baseLocation.protocol}//${baseLocation.host}`\n                    ).toString();\n                } catch (e) {\n                    if (baseLocation) {\n                        // prunedStateParamValue or final url is invalid\n                        Logger.error('Failed to restore URL state after authentication', { error: e });\n                    }\n\n                    redirectUrl = null;\n                }\n            }\n        }\n\n        if (redirectUrl) {\n            this.set('_restoreState', { url: redirectUrl });\n        } else {\n            this.set('_restoreState', null);\n        }\n    },\n\n    /**\n     * Pop the restore state object {url: 'url'}\n     * to restore the app to pre-auth state\n     */\n    popRestoreState() {\n        const result = this._restoreState;\n        this.set('_restoreState', null);\n        return result;\n    },\n\n    /**\n     * Persist the logout time in browser storage for logout bounce detection on\n     * the next application load\n     */\n    recordLogoutTime() {\n        let now = moment();\n\n        let cookieOptions = {\n            expires: moment(now).add(LOGOUT_BOUNCE_COOKIE_DURATION_MILLIS, 'milliseconds').toDate()\n        };\n\n        if (window && window.location && window.location.protocol === 'https:') {\n            cookieOptions.secure = true;\n        }\n\n        if (navigator && navigator.userAgent && isSameSiteNoneCompatible(navigator.userAgent)) {\n            cookieOptions.sameSite = 'none';\n        }\n\n        this.cookies.write(LOGOUT_BOUNCE_COOKIE_NAME, '' + now.valueOf(), cookieOptions);\n    },\n\n    _clearLogoutTime() {\n        this.cookies.clear(LOGOUT_BOUNCE_COOKIE_NAME);\n    },\n\n    _isInLogoutBounce() {\n        let result = false;\n\n        let now = moment();\n        let lastLogout = Number(this.cookies.read(LOGOUT_BOUNCE_COOKIE_NAME));\n\n        if (lastLogout) {\n            result = now.diff(moment(lastLogout)) <= LOGOUT_BOUNCE_THREASHOLD_MILLIS;\n        }\n\n        return result;\n    }\n});\n","import { reads, not } from '@ember/object/computed';\nimport Service, { inject as service } from '@ember/service';\n\nconst AVAILABLE = 'available';\nconst ON_QUEUE = 'on_queue';\n\nexport default Service.extend({\n    intl: service(),\n    phone: service(),\n    webrtc: service(),\n    presenceService: service('presence'),\n    presenceSubscription: service(),\n    session: service(),\n    sidebar: service(),\n    commandNav: service('command-nav'),\n    permissions: service(),\n    notification: service(),\n    logger: service('stash-logger'),\n\n    presence: reads('session.person.activityPresence'),\n    checkQueue: false,\n\n    selectPhoneNotification: null,\n\n    presenceHistory: [],\n\n    hasStation: not('phone.noStationSelected'),\n\n    continueOnQueue(entity = null) {\n        if (this.selectPhoneNotification) {\n            this.selectPhoneNotification.hide();\n            this.set('selectPhoneNotification', null);\n        }\n\n        let presence = this.presence;\n        const systemPresence = this.get('session.person.presenceDefinition');\n        if (systemPresence) {\n            presence = systemPresence;\n        }\n\n        this.presenceHistory.pushObject(presence);\n\n        if (entity) {\n            this.presenceService.setUsersPresence(entity, ON_QUEUE);\n        } else {\n            this.presenceSubscription.changePresence(ON_QUEUE);\n        }\n    },\n\n    selectPhone() {\n        if (this.get('phone.enabled')) {\n            if (this.get('session.useNewNav')) {\n                this.set('commandNav.callControlsTab', 'followMeSettings');\n                this.commandNav.selectPanel('voice');\n            } else {\n                this.sidebar.togglePanelSubstate('callControls', 'currentTab', 'followMeSettings');\n                this.sidebar.openPanel('callControls');\n            }\n        }\n        if (this.selectPhoneNotification) {\n            this.selectPhoneNotification.hide();\n        }\n        this.set('selectPhoneNotification', null);\n    },\n\n    handleToggle(entity = null, continueOnQueue = false) {\n        const intl = this.intl;\n        let presence = this.presence;\n        if (entity && entity.get('presence')) {\n            presence = entity.get('presence');\n        }\n\n        // If an entity is provided, do not consider state of checkQueue as that is specific to the current logged-in user.\n        // The entity could be any user.\n        if ((entity || !this.checkQueue) && presence !== ON_QUEUE) {\n            // prompt user to select a phone if they don't\n            // have one currently selected\n            const hasStation = this.hasStation;\n            const canMakeCall = this.get('permissions.phoneEnabled');\n            const canDisassociateSelf = this.get('permissions.canDisassociateSelf');\n            if (!hasStation && canMakeCall && !continueOnQueue) {\n                if (this.selectPhoneNotification === null) {\n                    const actionHandlers = {\n                        selectPhone: intl.t('notification.purecloud.selectPhone.selectPhone')\n                    };\n                    if (canDisassociateSelf) {\n                        actionHandlers.continueOnQueue = {\n                            label: intl.t('notification.purecloud.selectPhone.doNotSelectPhone'),\n                            action: () => this.continueOnQueue(entity)\n                        };\n                    }\n                    this.set(\n                        'selectPhoneNotification',\n                        this.notification.info(null, intl.t('notification.purecloud.selectPhone.message'), {\n                            forceBrowserNotification: true,\n                            showCloseButton: false,\n                            hideAfter: false,\n                            messageStyle: 'pin-to-top',\n                            type: 'select-phone-message',\n                            target: this,\n                            tag: 'select-phone-message',\n                            actionHandlers\n                        })\n                    );\n                }\n            } else if (this.get('phone.phoneDisabled') && !continueOnQueue) {\n                this.set(\n                    'selectPhoneNotification',\n                    this.notification.info(null, this.get('phone.phoneDisabledMessage'), {\n                        showNotificationEverywhere: false,\n                        showCloseButton: false,\n                        hideAfter: false,\n                        messageStyle: 'pin-to-top',\n                        type: 'select-phone-message',\n                        target: this,\n                        tag: 'select-phone-message',\n                        actionHandlers: {\n                            selectPhone: intl.t('notification.purecloud.selectPhone.selectPhone'),\n                            continueOnQueue: {\n                                label: intl.t('notification.purecloud.selectPhone.doNotSelectPhone'),\n                                action: () => this.continueOnQueue(entity)\n                            }\n                        }\n                    })\n                );\n            } else {\n                this.continueOnQueue(entity);\n            }\n        } else {\n            if (this.selectPhoneNotification) {\n                this.selectPhoneNotification.hide();\n            }\n            this.set('selectPhoneNotification', null);\n\n            presence = this.presenceHistory.popObject();\n\n            this.logger.debug('<services/queue-toggle> going off queue: users previous presence: ', presence);\n\n            if (entity) {\n                if (!presence) {\n                    this.presenceService.setUsersPresence(entity, AVAILABLE);\n                } else {\n                    this.presenceService.setUsersPresence(entity, presence);\n                }\n            } else {\n                if (!presence) {\n                    this.logger.debug(\n                        '<services/queue-toggle> going off queue - no presence - setting user to Available'\n                    );\n                    this.presenceSubscription.changePresence(AVAILABLE);\n                } else if (!this.presenceSubscription.isPresence(presence, 'offline')) {\n                    this.logger.debug(\n                        '<services/queue-toggle> going off queue - setting user presence to previous presence: ',\n                        presence\n                    );\n                    this.presenceSubscription.changePresence(presence);\n                } else {\n                    this.logger.debug(\n                        '<services/queue-toggle> going off queue - presence was offline, setting users presence to Available',\n                        presence\n                    );\n                    this.presenceSubscription.changePresence(AVAILABLE);\n                }\n            }\n        }\n    }\n});\n","import { get } from '@ember/object';\nimport { resolve, reject, allSettled } from 'rsvp';\nimport Service, { inject as service } from '@ember/service';\nimport DS from 'ember-data';\nimport _ from 'lodash';\nimport moment from 'moment';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport { FL } from '../utils/entity-fields';\n\nconst QUEUE_ID_LIMIT = 100;\nconst QUEUES_BRIEF_ID_LIMIT = 50;\nconst BASE_URI = 'api/v2/routing/queues';\nconst BRIEF_URI = 'api/v2/routing/queues/divisionviews';\nconst USERS_URI = 'api/v2/users';\nconst WRAPUP_URI = 'api/v2/routing/wrapupcodes';\nconst OFF_QUEUE = 'OFF_QUEUE',\n    ON_QUEUE = 'ON_QUEUE',\n    INTERACTING = 'INTERACTING',\n    COMMUNICATING = 'COMMUNICATING',\n    NOT_RESPONDING = 'NOT_RESPONDING',\n    IDLE = 'IDLE';\n\nexport default Service.extend(LoggerMixin, {\n    application: service(),\n    intl: service(),\n    store: service(),\n    ajax: service(),\n    permissions: service(),\n    presence: service(),\n    preferences: service(),\n\n    setDefaultQueue(queue, type) {\n        let promise = this.preferences.getPreference('interactions.defaultQueuesEnabled').then(enabled => {\n            if (enabled && queue) {\n                return resolve(this.preferences.setPreference(`interactions.defaultQueue-${type}`, queue.id));\n            }\n            return resolve();\n        });\n        return DS.PromiseObject.create({ promise });\n    },\n\n    getDefaultQueue(type) {\n        let promise = this.preferences.getPreference('interactions.defaultQueuesEnabled').then(enabled => {\n            if (enabled) {\n                //\n                return this.preferences.getPreference(`interactions.defaultQueue-${type}`).then(queueId => {\n                    if (queueId) {\n                        return DS.PromiseObject.create({\n                            promise: this.store.find('queue', queueId).then(q => {\n                                if (!q.data) q.data = {};\n                                q.data.id = queueId;\n                                return this._validateDefaultQueue(q, 1);\n                            })\n                        });\n                    } else {\n                        return resolve();\n                    }\n                });\n                //\n            } else {\n                return resolve();\n            }\n        });\n        return DS.PromiseObject.create({ promise });\n    },\n\n    clearDefaultQueue(type) {\n        this.preferences.setPreference(`interactions.defaultQueue-${type}`, null);\n    },\n\n    _validateDefaultQueue(q, pageNumber) {\n        const queueId = q.data.id;\n        const parameters = Object.assign(\n            {},\n            {\n                pageSize: 25,\n                pageNumber\n            }\n        );\n        const uri = this.application.pcUri(`${BASE_URI}/me`);\n\n        return this.ajax.ajaxGet(uri, { data: parameters }).then(res => {\n            // Check if entites array is empty.\n            if (!res.entities || !res.entities.length) {\n                return null;\n            }\n\n            // Check if queue id is in the entity array.\n            const validQueues = res.entities.mapBy('id');\n            if (validQueues.includes(queueId)) {\n                // Found a match in the response\n                return Object.assign({}, res.entities.findBy('id', queueId));\n            }\n\n            // Check if page count is greater than zero, shouldnt happen since should get caught\n            // in above entity check. Check if there are more pages to check.\n            if (res.pageCount > 0 && res.pageNumber < res.pageCount) {\n                return this._validateDefaultQueue(q, res.pageNumber + 1);\n            }\n        });\n    },\n\n    getQueues(options, ids = [], doExactNameSearch = false) {\n        return this._buildQueueRequests(options, ids, BASE_URI, QUEUE_ID_LIMIT, 'entities', doExactNameSearch);\n    },\n\n    // Returns brief queue objects regardless of access control\n    // Takes 1 name string OR some queue IDs\n    getQueuesBrief(options = {}, ids) {\n        // We need the routing:queue:search permission\n        // We need make sure that we have one of the types of search criteria\n        // We need to make sure we do not have both of the types of search criteria\n        if (\n            !this.permissions.validateDonutPermission('routing:queue:search') ||\n            (!_.has(options, 'name') && !ids) ||\n            (_.has(options, 'name') && ids && ids.length)\n        ) {\n            return reject();\n        }\n        return this._buildQueueRequests(options, ids, BRIEF_URI, QUEUES_BRIEF_ID_LIMIT, 'entities');\n    },\n\n    _buildQueueRequests(options, ids, uri, limit, resultsString, doExactNameSearch = false) {\n        let parameters = Object.assign(\n            {},\n            {\n                pageNumber: 1,\n                pageSize: 25\n            },\n            options\n        );\n\n        let nameSearchString;\n\n        if (_.has(parameters, 'name')) {\n            nameSearchString = _.trim(parameters.name);\n        }\n\n        let baseUri = this.application.pcUri(uri);\n\n        let promises = [];\n        const divisionIds = parameters.divisionIds;\n\n        // Division IDs will be manually added, so remove it from the parameters object\n        delete parameters.divisionIds;\n\n        const buildUri = queueIds => {\n            const isQueueIds = queueIds && queueIds.length;\n            const isDivisionIds = divisionIds && divisionIds.length;\n            let queryString = isQueueIds || isDivisionIds ? '?' : '';\n\n            // API does not allow querying for both queue IDs and division IDs, so only query for division IDs if no queue IDs specified\n            if (isQueueIds) {\n                queryString += `id=${queueIds.join('&id=')}`;\n            } else if (isDivisionIds) {\n                queryString += `divisionId=${divisionIds.join('&divisionId=')}`;\n            }\n\n            return `${baseUri}${queryString}`;\n        };\n\n        if (nameSearchString) {\n            if (doExactNameSearch) {\n                // do an exact search as well\n                parameters.name = nameSearchString;\n                promises.push(this.ajax.ajaxGet(buildUri(), { data: parameters }));\n            }\n            parameters.name = `*${nameSearchString}*`;\n        }\n\n        if (ids && ids.length) {\n            // If we have too many queus, break it up\n            if (ids.length > limit) {\n                _.chunk(ids, limit).forEach(chunk => {\n                    promises.push(this.ajax.ajaxGet(buildUri(chunk), { data: parameters }));\n                });\n            } else {\n                // If we don't have too many, proceed as usual\n                promises.push(this.ajax.ajaxGet(buildUri(ids), { data: parameters }));\n            }\n        } else {\n            // if no IDs were passed in, don't add any id query params\n            promises.push(this.ajax.ajaxGet(buildUri(), { data: parameters }));\n        }\n\n        return allSettled(promises).then(results => {\n            const data = {};\n            data[resultsString] = [];\n            if (results && results.length) {\n                results.forEach(result => {\n                    if (result.state === 'fulfilled' && result.value && result.value[resultsString]) {\n                        const value = result.value;\n\n                        data[resultsString] = _.uniq(data[resultsString].concat(result.value[resultsString]), queue => {\n                            return queue.id;\n                        });\n\n                        // if we didn't search for a set of IDs, we are looking at a full list, so make sure we still track these values\n                        if (!(ids && ids.length)) {\n                            data.total = value.total;\n                            data.pageSize = value.pageSize;\n                            data.pageCount = value.pageCount;\n                            data.pageNumber = value.pageNumber;\n                        } else {\n                            // we have a selected set of queues, so set the total to the length of the entities array\n                            data.total = data[resultsString].length;\n                        }\n                    }\n                });\n            }\n\n            return data;\n        });\n    },\n\n    getQueue(queueId) {\n        const uri = this.application.pcUri(BASE_URI + '/' + queueId);\n        return this.ajax.ajaxGet(uri);\n    },\n\n    getQueueByUri(uri) {\n        return this.ajax.ajaxGet(uri);\n    },\n\n    getQueueEstimatedWaitTime(queueId, mediaType = 'all') {\n        const uri =\n            this.application.pcUri(BASE_URI) + '/' + queueId + '/mediatypes/' + mediaType + '/estimatedwaittime';\n        return this.ajax.ajaxGet(uri);\n    },\n\n    getWrapupCodes(options, ids) {\n        const parameters = Object.assign(\n            {},\n            {\n                pageNumber: 1,\n                pageSize: 25\n            },\n            options\n        );\n\n        if (_.has(options, 'name')) {\n            parameters.name = '*' + _.trim(parameters.name) + '*';\n        }\n\n        let uri = this.application.pcV2Uri(WRAPUP_URI);\n\n        if (ids && ids.length) {\n            uri = `${uri}?id=${ids.join('&id=')}`;\n        }\n\n        return this.ajax.ajaxGet(uri, { data: parameters });\n    },\n\n    getUsers(queueId, options) {\n        let parameters = Object.assign(\n            {},\n            {\n                pageSize: 25,\n                pageNumber: 1,\n                expand: 'routingStatus'\n            },\n            options\n        );\n\n        if (_.has(options, 'name')) {\n            parameters.name = '*' + _.trim(parameters.name) + '*';\n        }\n\n        const uri = this.application.pcUri(BASE_URI + '/' + queueId + '/users');\n        return this.ajax.ajaxGet(uri, { data: parameters });\n    },\n\n    updateUsers(queueId, users) {\n        const uri = this.application.pcUri(BASE_URI + '/' + queueId + '/users');\n        return this.ajax.patch(uri, { data: users });\n    },\n\n    updateUser(queueId, user) {\n        const uri = this.application.pcUri(BASE_URI + '/' + queueId + '/users/' + user.id);\n        return this.ajax.patch(uri, { data: user });\n    },\n\n    updateUserJoinedQueues(userId, queues) {\n        const uri = this.application.pcUri(USERS_URI + '/' + userId + '/queues');\n        return this.ajax.patch(uri, { data: queues });\n    },\n\n    getAllUsers(options, divisions) {\n        // not just queue\n        const parameters = Object.assign(\n            {},\n            {\n                pageNumber: 1,\n                pageSize: 25\n            },\n            options\n        );\n\n        let uri = this.application.pcUri(USERS_URI);\n\n        if (divisions && divisions.length) {\n            uri = `${uri}?divisionId=${divisions.join('&divisionId=')}`;\n        }\n\n        return this.ajax.ajaxGet(uri, { data: parameters });\n    },\n\n    // returns a user's queues regardless of divisions\n    getMyQueues(options) {\n        const parameters = Object.assign(\n            {},\n            {\n                pageSize: 25,\n                pageNumber: 1\n            },\n            options\n        );\n\n        const uri = this.application.pcUri(`${BASE_URI}/me`);\n\n        return this.ajax.ajaxGet(uri, { data: parameters });\n    },\n\n    getUserQueues(userId, options) {\n        const parameters = Object.assign(\n            {},\n            {\n                pageSize: 25,\n                pageNumber: 1\n            },\n            options\n        );\n\n        let uri = this.application.pcUri(`${USERS_URI}/${userId}/queues`);\n        const divisionIds = parameters.divisionIds;\n\n        if (divisionIds && divisionIds.length) {\n            uri += `?divisionId=${divisionIds.join('&divisionId=')}`;\n            delete parameters.divisionIds;\n        }\n\n        return this.ajax.ajaxGet(uri, { data: parameters });\n    },\n\n    // Computes an agent's status (string) and time in that status (milliseconds) based on routingStatus, presence, and outOfOffice\n    // Takes agent as returned from /api/v2/routing/queues/{queueId}/users\n    // Returns null if status could not be determined\n    getAgentStatus(agent, showSecondaryPresence = false, presenceOnly = false, routingStatusOnly = false) {\n        function intlStatus(s) {\n            const lookupKey = `chat.presence.${s}`;\n            if (intl.query(lookupKey)) {\n                return intl.t(lookupKey);\n            }\n            return intl.t(`chat.presence.${s}.title`);\n        }\n\n        const intl = this.intl;\n        const now = moment();\n        let routingStatus;\n\n        if (agent) {\n            routingStatus = get(agent, 'routingStatus') || get(agent, 'user.routingStatus');\n        } else {\n            this.logger.error(\n                '[queue-service] In getAgentStatus, agent argument or the routingStatus property of that agent was null or undefined. Status could not be determined.',\n                agent\n            );\n            return null;\n        }\n\n        if (!agent.user) {\n            agent.user = {\n                presence: agent.presence,\n                outOfOffice: agent.outOfOffice\n            };\n        }\n\n        // Time in milliseconds between status start and now\n        function tis(start) {\n            return start ? now.diff(moment(start)) : 0;\n        }\n\n        const presenceService = this.presence;\n        const presenceDefinition = agent.user.presence\n            ? presenceService.getPresenceDefinition(agent.user.presence.presenceDefinition)\n            : '';\n        const systemPresence = presenceDefinition ? presenceDefinition.systemPresence : '';\n\n        // System presence On Queue: Idle, Interacting, Not Responding, Off Queue\n        // Otherwise: Out of Office (takes precedence over other presence values), Available, Busy, Away, Break, Meal, Meeting, Training\n        if ((systemPresence === ON_QUEUE && !presenceOnly) || routingStatusOnly) {\n            let result = {\n                timeInStatus: tis(routingStatus.startTime)\n            };\n\n            result.enStatusKey = routingStatus.status;\n\n            if (routingStatus.status === NOT_RESPONDING) {\n                result.status = intlStatus('notResponding');\n            } else if (routingStatus.status === INTERACTING) {\n                result.status = intlStatus('interacting');\n            } else if (routingStatus.status === COMMUNICATING) {\n                result.status = intlStatus('communicating');\n            } else if (routingStatus.status === IDLE) {\n                result.status = intlStatus('idle');\n            } else if (routingStatus.status === OFF_QUEUE) {\n                result.status = intlStatus('offQueue');\n            } else {\n                return null;\n            }\n\n            return result;\n        } else {\n            if (agent.user.outOfOffice && agent.user.outOfOffice.active) {\n                return {\n                    // Time in OOO cannot currently be computed accurately (UI-2517)\n                    enStatusKey: 'outOfOffice',\n                    status: intlStatus('outOfOffice'),\n                    timeInStatus: null\n                };\n            } else if (agent.user.presence) {\n                const status = showSecondaryPresence\n                    ? presenceService.localizePresence(agent.user.presence.presenceDefinition)\n                    : presenceService.localizePresenceString(systemPresence.toLowerCase());\n\n                return {\n                    status,\n                    timeInStatus: tis(agent.user.presence.modifiedDate)\n                };\n            }\n        }\n\n        return null;\n    },\n\n    // Returns the Person entities for the given list of agent IDs\n    getAgentEntities(ids) {\n        return this.store.findMany('person', ids, FL.person);\n    },\n\n    // Given an agent and media type, returns the total number of interactions of that media type currently active or in ACW for the agent\n    // Media type can be any key in the conversationSummary hash at the endpoint /api/v2/routing/queues/{queueId}/users (https://developer.mypurecloud.com/api/rest/v2/routing/index.html)\n    // Returns null if count could not be determined\n    getAgentInteractionCount(agent, mediaType) {\n        if (!agent || !agent.user || !agent.user.conversationSummary) {\n            this.logger.error(\n                '[queue-service] In getAgentInteractionCount, agent, agent.user, or agent.user.conversationSummary was null or undefined. No interaction count could be computed.',\n                agent,\n                mediaType\n            );\n            return null;\n        }\n\n        if (mediaType) {\n            const summary = agent.user.conversationSummary[mediaType].contactCenter;\n\n            return (summary.active || 0) + (summary.acw || 0);\n        } else {\n            // return count of all interactions\n            const conversationSummary = agent.user.conversationSummary;\n            return _.sum(\n                _.map(Object.keys(conversationSummary), function (key) {\n                    const contactCenter = conversationSummary[key].contactCenter;\n                    const enterprise = conversationSummary[key].enterprise;\n                    return (\n                        (contactCenter.active || 0) +\n                        (contactCenter.acw || 0) +\n                        (enterprise.active || 0) +\n                        (enterprise.acw || 0)\n                    );\n                })\n            );\n        }\n    }\n});\n","import { resolve, reject } from 'rsvp';\nimport { schedule, cancel, later } from '@ember/runloop';\nimport { underscore } from '@ember/string';\nimport { A } from '@ember/array';\nimport { observer, get } from '@ember/object';\nimport { alias } from '@ember/object/computed';\nimport Evented from '@ember/object/evented';\nimport Service, { inject as service } from '@ember/service';\nimport _ from 'lodash';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport { task, timeout } from 'ember-concurrency';\n\nexport const RELATE_FRAME_ID = '#relateFrame';\n\nconst DEFAULT_ROUTE_MAP = {\n    'relate-engine': {\n        list: {\n            contacts: 'contacts',\n            organizations: 'organizations'\n        },\n        contact: {\n            edit: 'contacts/profile/edit',\n            show: 'contacts/profile',\n            new: 'contacts/add'\n        },\n        organization: {\n            edit: 'organizations/profile/edit',\n            show: 'organizations/profile',\n            new: 'organizations/add'\n        },\n        upload: 'csv'\n    }\n};\n\nexport const VERIFICATION_RELEVANT_DATA_MESSAGE = {\n    command: 'verificationRelevantData'\n};\n\nexport const CONTACTS_ENDPOINT = 'api/v2/externalcontacts/contacts/';\nexport const CONVERSATIONS_ENDPOINT = 'api/v2/externalcontacts/conversations/';\n\nconst STRICT = true;\nconst NO_OP = 'noop';\nconst REGISTER_SIDEBAR_STATE = {\n    command: 'registerSidebarState',\n    sidebarState: ''\n};\nconst PROFILE_VERIFICATION_EVENT_NAME = 'profileVerified';\nconst SHOW_PROFILE_EVENT_NAME = 'showProfile';\n\nexport const EXTERNAL_CONTACT = 'externalcontacts/contact';\n\nconst ADAPTER_CACHE_TIMEOUT = 3 * 1000;\n\nexport const CHANNEL_MODEL_TYPE = 'externalcontacts/channel-record';\n\nexport default Service.extend(Evented, LoggerMixin, {\n    application: service(),\n    session: service(),\n    addressformat: service(),\n    ajax: service(),\n    intl: service(),\n    sidebar: service(),\n    store: service(),\n    interaction: service(),\n    notification: service(),\n    names: service(),\n    permissions: service(),\n\n    adapterCache: {},\n\n    isRelateActive: false,\n    route: NO_OP,\n    navigationRoute: null,\n    redirectRoute: null,\n    externalContactProfiles: [],\n    navTree: null,\n    helpURL: alias('route'),\n    relateFrameOrigin: null,\n    profileVerificationEventName: PROFILE_VERIFICATION_EVENT_NAME,\n    showProfileEventName: SHOW_PROFILE_EVENT_NAME,\n\n    hasRelateAccess: alias('permissions.hasExternalContactsViewContactAccess'),\n\n    init() {\n        this._super(...arguments);\n        this.onChangeInteraction();\n    },\n\n    /**\n     * The list of contacts associated with an interaction\n     *\n     * Contacts with 'wasAutoverified' were automatically associated\n     * interactionId => [ externalContact1, externalContact2, ... ]\n     */\n    contactAssociationMap: {},\n\n    /**\n     * The list of contacts that have been manually disassociated with an interaction\n     *   Will remove this when conversation service keeps track of the dissassociation list\n     *   For now, users will have to manually disassociate contacts again if the app is refreshed\n     *\n     * interactionId => [ externalContact1, externalContact2, ... ]\n     */\n    contactDisassociationMap: {},\n\n    /**\n     * Updates the relate frame with the current interactions information and verification state.\n     */\n    onChangeInteraction: observer(\n        'interaction.selectedInteraction.id',\n        'contactAssociationMap',\n        'contactDisassociationMap',\n        function () {\n            const interactionId = this.get('interaction.selectedInteraction.id');\n            const hasRelateAccess = this.hasRelateAccess;\n\n            if (interactionId && hasRelateAccess) {\n                let interactionAssociatedContacts = this.get(`contactAssociationMap.${interactionId}`);\n                let interactionDisassociatedContacts = this.get(`contactDisassociationMap.${interactionId}`);\n\n                if (!interactionAssociatedContacts) {\n                    this.set(`contactAssociationMap.${interactionId}`, A([]));\n                }\n                if (!interactionDisassociatedContacts) {\n                    this.set(`contactDisassociationMap.${interactionId}`, A([]));\n                }\n                this.updateRelateFrame.perform();\n            }\n        }\n    ),\n\n    /**\n     * Updates the relate frame when the interaction ID changes\n     * @returns {Promise.<void>}\n     */\n    updateRelateFrame: task(function* () {\n        const hasRelateAccess = this.hasRelateAccess;\n        if (!hasRelateAccess) {\n            return;\n        }\n\n        yield timeout(100);\n\n        const hasSelectedInteraction = this.get('interaction.selectedInteraction');\n        if (!hasSelectedInteraction) {\n            return;\n        }\n\n        const { type, id, communicationId } = this.get('interaction.selectedInteraction');\n        const interactionAssociatedContacts = this.get(`contactAssociationMap.${id}`) || A();\n        const mediaType = underscore(type);\n        const { id: externalContactId } = interactionAssociatedContacts.length\n            ? interactionAssociatedContacts.get('firstObject')\n            : {};\n\n        if (communicationId && externalContactId) {\n            schedule('afterRender', () => {\n                const communicationPanelOpen = !!this.get('sidebar.communicationPanel');\n                this.registerSidebarState(communicationPanelOpen ? 'open/minimized' : '');\n                this.postVerificationRelevantDataV2(id, communicationId, mediaType, externalContactId);\n            });\n        }\n    }).keepLatest(),\n\n    findMatchingExternalContacts(searchTerm, pageOffset, pageSize, expandField, originator) {\n        if (!searchTerm) {\n            return resolve([]);\n        }\n\n        let url = this.application.pcUri(CONTACTS_ENDPOINT);\n\n        if (this.addressformat.isValidNumber(searchTerm, null, STRICT)) {\n            searchTerm = this.addressformat.formatAddress(searchTerm);\n        }\n\n        let data = {};\n        if (searchTerm) {\n            data.q = searchTerm.replace('tel:', ''); // Strip the 'tel:', if any\n        }\n        if (pageOffset) {\n            data.pageNumber = pageOffset;\n        }\n        if (pageSize) {\n            data.pageSize = pageSize;\n        }\n        if (expandField) {\n            data.expand = expandField;\n        }\n        if (originator) {\n            data.originator = originator;\n        }\n\n        return this.ajax.ajaxGet(url + `?${new URLSearchParams(data).toString()}`, {\n            timeout: 2000 //msec - we saw ~100 msec latency for this call in DCA testing.  This ought to cover it.\n        });\n    },\n\n    registerSidebarState(state) {\n        const message = Object.assign({}, REGISTER_SIDEBAR_STATE);\n        message.sidebarState = state;\n        this.postMessage(message);\n    },\n\n    getEngineHelp(currentRouteName) {\n        const contextHelpUrls = this.contextHelpUrls || {};\n        const path = get(_.merge(DEFAULT_ROUTE_MAP, contextHelpUrls), currentRouteName);\n        return path ? `relate.${path}` : currentRouteName;\n    },\n\n    handleNavigation(navEvent) {\n        this.set('navigationRoute', navEvent);\n    },\n\n    handleRedirect(navEvent) {\n        this.set('redirectRoute', navEvent);\n        this.notifyPropertyChange('redirectRoute');\n    },\n\n    registerNavEntries(navEntries) {\n        this.set('navTree', navEntries);\n    },\n\n    /**\n     * Binds a non-agent participant to an external contact the given external contact between the conversation, communication, and the media type\n     *  Note: Currently we only support a 1:1 relationship between interaction and contact. In the future we plan to adjust this\n     *          to be a 1:n relationship between interaction and its associated contacts\n     *\n     * @param conversationId - the conversation ID to which the external contact should be bound.\n     * @param externalContactId - (optional) if the external contact ID is missing the association is removed.\n     * @param communicationId - (optional) the communication ID for the conversation.\n     * @param mediaType - (optional)  Should be one of 'call', 'email', 'chat',\n     * @returns An Ember RSVP promise\n     */\n    associateConversationWithInteraction(conversationId, communicationId, externalContactId, mediaType) {\n        const url = this.application.pcUri(CONVERSATIONS_ENDPOINT + conversationId);\n        const data = {\n            communicationId: communicationId,\n            mediaType: mediaType,\n            conversationId: conversationId\n        };\n        if (externalContactId) {\n            data.externalContactId = externalContactId;\n        }\n        return this.ajax.put(url, { data: data, dataType: 'text' });\n    },\n\n    profileVerified(verificationInteractionData, displayNotification) {\n        if (displayNotification) {\n            verificationInteractionData.shouldNotify = true;\n        }\n        this.trigger(this.profileVerificationEventName, verificationInteractionData);\n        this.processFrameVerificationEvent(verificationInteractionData);\n    },\n\n    closeRelateFrame(isClosedInteraction) {\n        // First \"close the Relate frame\" by using the sidebar service to open the ACD interactions panel maximized\n        this.set('sidebar.communicationSidebarExpanded', true);\n        if (!isClosedInteraction) {\n            this.trigger(this.showProfileEventName, true);\n        }\n    },\n\n    postMessage(message) {\n        try {\n            const relateIframe = document.querySelector(RELATE_FRAME_ID);\n            if (!relateIframe) {\n                return;\n            }\n\n            relateIframe.contentWindow.postMessage(message, this.relateFrameOrigin);\n        } catch (e) {\n            this.logger.error('Could not postMessage', { error: e, message });\n        }\n    },\n\n    postVerificationRelevantDataV2(conversationId, communicationId, mediaType, contactId) {\n        let message = Object.assign({}, VERIFICATION_RELEVANT_DATA_MESSAGE);\n\n        const contactAssociationMap = this.contactAssociationMap;\n        const associatedContacts = contactAssociationMap[conversationId] || [];\n        const hasActiveAssociation = associatedContacts.length;\n\n        const verified =\n            hasActiveAssociation &&\n            associatedContacts.find(contact => {\n                return contact.get('id') === contactId;\n            });\n\n        const wasAutoVerified = verified && verified.get('wasAutoverified');\n\n        message.verificationRelevantData = {\n            mediaType: mediaType,\n            contactId,\n            conversationId,\n            communicationId,\n            wasAutoVerified,\n            isVerified: !!hasActiveAssociation,\n            activeProfileIsVerified: !!verified\n        };\n        this.postMessage(message);\n    },\n\n    getCachedAdapter(queryData, context, timeout) {\n        if (!context.ajax) {\n            this.logger.error(`Relate Service: Relate Service: adapter not valid`);\n            return reject({});\n        }\n        const { url, data, TIME_OUT } = queryData;\n        const adapterCache = this.adapterCache;\n\n        const q = data.lookupVal || data.q;\n        const exp = data.expand || '';\n        const num = data.pageNumber || 0;\n        const siz = data.pageSize || 0;\n        const ord = data.sortOrder || 0;\n\n        const key = `${url}_${q}_${exp}_${num}_${siz}_${ord}`;\n\n        let { promise, timer } = adapterCache[key] || {};\n\n        if (!promise) {\n            promise = context.ajax(url, 'GET', { data, timeout: TIME_OUT }).catch(error => {\n                this.clearCachedAdapter(key);\n                const errorType = data.lookupVal ? 'reverse whitePage lookup' : 'search';\n\n                this.logger.error(`Relate Service: error getting data`, {\n                    remoteData: {\n                        error,\n                        errorType,\n                        sensitive: {\n                            data\n                        }\n                    }\n                });\n                return error;\n            });\n        }\n        if (timer) {\n            cancel(timer);\n        }\n        timer = later(this, 'clearCachedAdapter', key, timeout || ADAPTER_CACHE_TIMEOUT);\n        adapterCache[key] = { promise, timer };\n        return promise;\n    },\n\n    clearCachedAdapter(key) {\n        if (!key) {\n            return this.set('adapterCache', {});\n        }\n        const adapterCache = this.adapterCache;\n        const { timer } = adapterCache[key] || {};\n        if (timer) {\n            cancel(timer);\n        }\n        delete adapterCache[key];\n    },\n\n    interactionEnded(interactionId) {\n        const clear = map => {\n            interactionId &&\n                map[interactionId] &&\n                map[interactionId].clear() &&\n                map[interactionId].length === 0 &&\n                delete map[interactionId];\n        };\n        clear(this.contactAssociationMap);\n        clear(this.contactDisassociationMap);\n    }\n});\n","import Service, { inject as service } from '@ember/service';\nimport { computed } from '@ember/object';\nimport { run, next } from '@ember/runloop';\nimport Evented from '@ember/object/evented';\nimport { EVENTS } from 'web-directory/utils/hosted-context';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport { task } from 'ember-concurrency';\nimport { Howl, Howler } from 'howler';\n\nconst ringtoneIds = [\n    'phone',\n    // 'ringtone-1',\n    'ringtone-2',\n    'ringtone-3',\n    'ringtone-4',\n    'ringtone-5',\n    'ringtone-6',\n    'ringtone-7',\n    'ringtone-8',\n    'ringtone-9',\n    'ringtone-10'\n];\n\nexport default Service.extend(LoggerMixin, Evented, {\n    sound: service(),\n    session: service(),\n    headset: service(),\n    application: service(),\n    webrtc: service(),\n    preferences: service(),\n    webrtcSdkService: service('webrtcSdk'),\n    webrtcSettings: service(),\n    intl: service(),\n\n    _playRingtoneTimeout: null,\n    _ringing: false,\n\n    ringtoneSelection: computed('webrtcSettings.settings.generalSettings.ringtoneSelection', function () {\n        const selection = this.get('webrtcSettings.settings.generalSettings.ringtoneSelection');\n        if (selection === 'ringtone-1') {\n            return 'phone';\n        }\n        return selection;\n    }),\n\n    phoneRingtoneSoundId: computed('ringtoneSelection', function () {\n        if (this.ringtoneSelection) {\n            return this.ringtoneSelection;\n        }\n        return 'phone';\n    }),\n\n    enableAlertablePresencesOverrides: computed('session.features', function () {\n        const features = this.get('session.features');\n        return features && features['PURE-5149_ui_enableAlertablePresencesOverrides'];\n    }),\n\n    isPhoneRingtone(soundId) {\n        return soundId === this.ringtoneSelection || soundId === 'phone';\n    },\n\n    playRingtone(\n        conversationId,\n        hasOtherActiveCalls,\n        duration = 12000,\n        ignoreHeadset = false,\n        soundId = this.phoneRingtoneSoundId\n    ) {\n        const sound = this.sound;\n        if (!this.enableAlertablePresencesOverrides && this.presence === 'busy') {\n            return;\n        }\n\n        this.logger.debug('ring service: start ringing.');\n\n        const ringerOutputDeviceId = this.getRingerOutputDeviceId();\n        const ringerVolume = this.ringerVolume / 100;\n        const callActiveRingerVolume = this.callActiveRingerVolume / 100;\n\n        const volume = hasOtherActiveCalls ? callActiveRingerVolume : ringerVolume;\n        const interactionVolume = this.interactionVolume / 100;\n\n        run.cancel(this._playRingtoneTimeout);\n\n        if (this.isPhoneRingtone(soundId)) {\n            sound.playRingtone(volume, ringerOutputDeviceId, soundId);\n            this.set('_ringing', true);\n            if (!ignoreHeadset && !this.get('webrtcSdkService.useSdk')) {\n                this.headset.incomingCall({ conversationId }, hasOtherActiveCalls);\n            }\n        } else {\n            sound.playDigitalRingtone(interactionVolume, ringerOutputDeviceId);\n        }\n\n        this.set(\n            '_playRingtoneTimeout',\n            run.later(\n                this,\n                () => {\n                    this._timeoutSoundIncomingConversationRing(soundId);\n                },\n                duration\n            )\n        );\n    },\n\n    stopRingtone(soundId = this.phoneRingtoneSoundId) {\n        const sound = this.sound;\n        this.logger.debug('ring: stop ringing');\n\n        run.cancel(this._playRingtoneTimeout);\n\n        try {\n            sound.stopRingtone(soundId);\n        } catch (err) {\n            this.logger.debug('ring: stop ringing error', err);\n        }\n\n        if (this.isPhoneRingtone(soundId)) {\n            this.set('_ringing', false);\n\n            this.get('application.hostedContext').sendEventToDesktop(EVENTS.STOPPED_RINGING, {\n                callsLeft: 0\n            });\n        }\n    },\n\n    _timeoutSoundIncomingConversationRing(soundId = 'phone') {\n        const soundObjects = this.get('sound.sounds') || [];\n        const sound = soundObjects[soundId];\n\n        if (!sound) return;\n\n        const isRinging = sound.playing ? sound.playing() : false;\n        const logMsg = `ring:playRingtone: stop ringing (timeout), isRinging: ${isRinging}`;\n        this.logger.debug(logMsg);\n        this.sound.stopRingtone(soundId);\n    },\n\n    init() {\n        next(() => {\n            this.initRingerVolume.perform();\n        });\n        // Make sure translations are loaded before creating ringtones.\n        this.get('intl.loadedPromise').then(() => {\n            this.createRingtones();\n        });\n        this._super(...arguments);\n    },\n\n    initRingerVolume: task(function* () {\n        const preferences = this.preferences;\n        if (!preferences) {\n            return;\n        }\n        const ringerVolume = yield this.get('webrtcSettings.settings.volumeSettings.default.ringerVolume');\n        const callVolume = yield preferences.getPreference('phone.callVolume');\n        const interactionVolume = yield preferences.getPreference('chat.interactionNotificationVolume');\n        const callActiveRingerVolume = yield preferences.getPreference('phone.callActiveRingerVolume');\n        if (ringerVolume !== undefined) {\n            this.set('_ringerVolume', ringerVolume);\n        }\n\n        if (callVolume !== undefined) {\n            this.set('_callVolume', callVolume);\n        }\n\n        if (interactionVolume !== undefined) {\n            this.set('_interactionVolume', interactionVolume);\n        }\n\n        if (callActiveRingerVolume !== undefined) {\n            this.set('_callActiveRingerVolume', callActiveRingerVolume);\n        }\n    }),\n\n    _ringerVolume: 100,\n    ringerVolume: computed('_ringerVolume', {\n        get: function () {\n            return this._ringerVolume;\n        },\n        set: function (key, val) {\n            this.set('_ringerVolume', val);\n            return val;\n        }\n    }),\n\n    _callVolume: 100,\n    callVolume: computed('_callVolume', {\n        get: function () {\n            return this._callVolume;\n        },\n        set: function (key, val) {\n            this.set('_callVolume', val);\n            this.trigger('callVolumeChange', val);\n            return val;\n        }\n    }),\n\n    _interactionVolume: 100,\n    interactionVolume: computed('_interactionVolume', {\n        get: function () {\n            return this._interactionVolume;\n        },\n        set: function (key, val) {\n            this.set('_interactionVolume', val);\n            return val;\n        }\n    }),\n\n    _callActiveRingerVolume: 100,\n    callActiveRingerVolume: computed('_callActiveRingerVolume', {\n        get: function () {\n            return this._callActiveRingerVolume;\n        },\n        set: function (key, val) {\n            this.set('_callActiveRingerVolume', val);\n            return val;\n        }\n    }),\n\n    getRingerOutputDeviceId: function () {\n        return this.get('webrtc.notificationOutputDeviceId'); // In services/phone.js\n    },\n\n    createRingtones: function () {\n        const intl = this.intl;\n        const urlPrefix = this.get('application.urlprefix');\n\n        // Each ringtone is created with `html5: true` and draws from howler's shared HTML5 audio\n        // pool (default size 10). With more ringtones than the default pool size, creation exhausts\n        // the pool and howler logs \"HTML5 Audio pool exhausted\". Grow the pool to cover every\n        // ringtone plus headroom for the other app sounds (phone, digital, etc.).\n        const requiredPoolSize = ringtoneIds.length + 10;\n        if (Howler.html5PoolSize < requiredPoolSize) {\n            Howler.html5PoolSize = requiredPoolSize;\n        }\n\n        ringtoneIds.forEach((id, index) => {\n            if ('phone' === id) {\n                this.get('sound.ringtones').pushObject({\n                    id,\n                    label: intl.t('preferences.sound.ringtoneLabelPhone'),\n                    options: this.get('sound.sounds')['phone']\n                });\n                return;\n            }\n\n            const ringtoneOptions = {\n                src: [\n                    urlPrefix + `assets/sounds/${id}.mp3`,\n                    urlPrefix + `assets/sounds/${id}.aac`,\n                    urlPrefix + `assets/sounds/${id}.ogg`\n                ],\n                loop: true,\n                html5: true\n            };\n            const label = intl.t('preferences.sound.ringtoneLabel', { ringtoneNumber: index + 1 });\n            // Create a single Howl per ringtone and share the same instance between the sound\n            // registry and the ringtones list. Previously two Howls were created per ringtone,\n            // doubling consumption of howler's shared HTML5 audio pool (default size 10) and\n            // producing \"HTML5 Audio pool exhausted\" warnings. Matches the 'phone' branch above,\n            // which already reuses the registered Howl.\n            const ringtone = new Howl(ringtoneOptions);\n            this.get('sound.sounds')[id] = ringtone;\n            this.get('sound.ringtones').pushObject({ id, label, options: ringtone });\n        });\n    }\n});\n","import Service, { inject as service } from '@ember/service';\nimport { BrowserRollingLog } from 'supportability-log-capture';\n\nlet _isStarted = false;\nconst browserRollingLog = new BrowserRollingLog();\n\nconst POST_SIZE_LIMIT = 5 * 100000; // Public API has a request size limit of 500kb.\n\nexport default Service.extend({\n    ajax: service(),\n    application: service(),\n    session: service('session'),\n    stashLogger: service('stash-logger'),\n\n    isStarted() {\n        return _isStarted;\n    },\n\n    restart() {\n        if (_isStarted) {\n            this.stop();\n\n            this.start();\n        }\n    },\n\n    // Will subscribe to any new loggers that exist\n    refresh() {\n        browserRollingLog.addLoggers(this._gatherLoggers());\n    },\n\n    start() {\n        let _loggers = this._gatherLoggers();\n\n        let levels = ['info', 'log', 'warn', 'error'];\n        if (this.get('session.features.browser-log-debug-enabled')) {\n            levels.push('debug');\n        }\n\n        let options = {\n            loggers: _loggers,\n            levels\n        };\n\n        if (this.get('session.features.PURE-7606_in_memory_storage')) {\n            options.useMemoryStorage = true;\n        }\n\n        browserRollingLog.start(options);\n\n        window.addEventListener('beforeunload', this.stop);\n\n        _isStarted = true;\n    },\n\n    stop() {\n        if (_isStarted) {\n            browserRollingLog.stop();\n\n            _isStarted = false;\n        }\n    },\n\n    async postMessages() {\n        let messages = browserRollingLog.getMessages();\n        if (!messages || !messages.length) {\n            const error = new Error('No log messages to post');\n            error.name = 'NoMessagesError';\n            error.code = 'NO_MESSAGES';\n            throw error;\n        }\n\n        let chunks = [messages];\n        if (JSON.stringify(messages).length > this._getChunkSize()) {\n            chunks = this._chunkMessages(messages);\n        }\n\n        const url = this.application.pcV2Uri('api/v2/diagnostics/logcapture/browser/ondemand/entries');\n\n        const promises = chunks.map(messages => {\n            this.ajax.post(url, { data: messages });\n        });\n\n        try {\n            await Promise.all(promises);\n            browserRollingLog.clearMessages();\n        } catch (error) {\n            this.stashLogger.error('An error occurred submitting captured logs', { error });\n            throw error;\n        }\n    },\n\n    _gatherLoggers() {\n        let _loggers = [];\n\n        _loggers.push(console);\n        _loggers.push(this.stashLogger.getOriginalLogger());\n        return _loggers.concat(this._registerFrameLoggers());\n    },\n\n    _registerFrameLoggers() {\n        return Array.from(document.querySelectorAll('iframe'))\n            .map(frame => {\n                try {\n                    return frame.contentWindow.console;\n                } catch (e) {\n                    //This can happen if we've an encountered a frame that is being blocked by CORS.\n                    return null;\n                }\n            })\n            .filter(logger => logger !== null); // Remove any null loggers from CORS errors\n    },\n\n    _chunkMessages(messages) {\n        const chunks = [];\n        let currentChunk = [];\n        let currentSize = 0;\n\n        for (let message of messages) {\n            const itemSize = JSON.stringify(message).length;\n\n            if (currentSize + itemSize > this._getChunkSize()) {\n                chunks.push(currentChunk);\n                currentChunk = [];\n                currentSize = 0;\n            }\n\n            currentChunk.push(message);\n            currentSize += itemSize;\n        }\n\n        if (currentChunk.length) {\n            chunks.push(currentChunk);\n        }\n\n        return chunks;\n    },\n\n    _getChunkSize() {\n        return POST_SIZE_LIMIT;\n    },\n\n    willDestroy() {\n        this.stop();\n        window.removeEventListener('beforeunload', this.stop);\n    }\n});\n","import { union } from '@ember/object/computed';\nimport { defer } from 'rsvp';\nimport { A } from '@ember/array';\nimport Service, { inject as service } from '@ember/service';\nimport { computed } from '@ember/object';\nimport BadgeTrackingMixin from '../mixins/roster-badge-tracking';\n\nexport default Service.extend(BadgeTrackingMixin, {\n    chat: service(),\n\n    favorites: null,\n    people: null,\n    groups: null,\n    adhocs: null,\n    closed: null,\n\n    init() {\n        this._super(arguments);\n        this.setProperties({\n            favorites: A(),\n            people: A(),\n            groups: A(),\n            adhocs: A(),\n            closed: A()\n        });\n    },\n\n    allRoomsInRoster: union('favorites', 'people', 'groups', 'adhocs', 'closed'),\n\n    /**\n     * Computed array of all the rooms in the roster with mentions or unseens.\n     * The results are chunked by \"priority\": [person unseens, group mentions, group unseens]\n     * Within those chunks, favorited rooms occur before non-favorited rooms.\n     */\n    allRoomsWithMentionsOrUnseen: computed('allRoomsInRoster.@each.{unseen,mentions}', function () {\n        const personUnseens = [];\n        const groupMentions = [];\n        const groupUnseens = [];\n        this.allRoomsInRoster.forEach(room => {\n            const roomHasMentions = room.get('mentions') > 0;\n            const roomHasUnseens = room.get('unseen') > 0;\n            if (room.isOneToOneRoom()) {\n                if (roomHasMentions || roomHasUnseens) {\n                    personUnseens.push(room);\n                }\n            } else {\n                if (roomHasMentions) {\n                    groupMentions.push(room);\n                } else if (roomHasUnseens) {\n                    groupUnseens.push(room);\n                }\n            }\n        });\n        return [...personUnseens, ...groupMentions, ...groupUnseens];\n    }),\n\n    unseenCount: computed('allRoomsInRoster.@each.unseen', function () {\n        let unseen = 0;\n\n        this.allRoomsInRoster.forEach(room => {\n            if (room.get('isSupervisorRoom')) {\n                return;\n            }\n\n            if (!room.isOneToOneRoom()) {\n                unseen += room.get('unseen');\n            }\n        });\n\n        return unseen;\n    }),\n\n    mentionsCount: computed('allRoomsInRoster.@each.{unseen,mentions}', function () {\n        let mentions = 0;\n\n        this.allRoomsInRoster.forEach(room => {\n            if (room.get('isSupervisorRoom')) {\n                return;\n            }\n\n            if (!room.isOneToOneRoom()) {\n                mentions += room.get('mentions');\n            } else {\n                mentions += room.get('unseen');\n            }\n        });\n\n        return mentions;\n    }),\n\n    unseenPersonalMessages: computed('people.@each.unseen', function () {\n        return this.people.mapBy('unseen').reduce((a, b) => a + b, 0);\n    }),\n\n    unseenGroupMessages: computed('groups.@each.unseen', function () {\n        return this.groups.mapBy('unseen').reduce((a, b) => a + b, 0);\n    }),\n\n    unseenAdhocMessages: computed('adhocs.@each.unseen', function () {\n        return this.adhocs.mapBy('unseen').reduce((a, b) => a + b, 0);\n    }),\n\n    unseenGroupFavoritesMessages: computed('favorites.@each.unseen', function () {\n        const favoriteGroups = this.favorites.filter(room => !room.isOneToOneRoom());\n        return A(favoriteGroups)\n            .mapBy('unseen')\n            .reduce((a, b) => a + b, 0);\n    }),\n\n    unseenPersonalFavoritesMessages: computed('favorites.@each.unseen', function () {\n        const personalFavorites = this.favorites.filter(room => room.isOneToOneRoom());\n        return A(personalFavorites)\n            .mapBy('unseen')\n            .reduce((a, b) => a + b, 0);\n    }),\n\n    allUnseenGroupMessages: computed(\n        'unseenGroupMessages',\n        'unseenAdhocMessages',\n        'unseenGroupFavoritesMessages',\n        function () {\n            return this.unseenGroupMessages + this.unseenAdhocMessages + this.unseenGroupFavoritesMessages;\n        }\n    ),\n\n    allUnseenDirectMessages: computed('unseenPersonalMessages', 'unseenPersonalFavoritesMessages', function () {\n        return this.unseenPersonalMessages + this.unseenPersonalFavoritesMessages;\n    }),\n\n    addRoomToFavorites(room) {\n        var favorites, ref;\n        if (room.get('isClosed') || !room.get('roster')) {\n            return;\n        }\n        if ((ref = room.get('roster')) != null) {\n            ref.removeObject(room);\n        }\n        favorites = this.favorites;\n        favorites.addObject(room);\n        return room.set('roster', favorites);\n    },\n\n    removeRoomFromFavorites(room) {\n        if (room.get('isClosed') || !room.get('roster')) {\n            return;\n        }\n\n        const groups = this.groups;\n        const people = this.people;\n        const adhocs = this.adhocs;\n        const roster = room.get('roster');\n\n        if (roster) {\n            roster.removeObject(room);\n        }\n\n        if (room.get('isAdhocRoom') && !room.isGroupRoom()) {\n            adhocs.addObject(room);\n            room.set('roster', adhocs);\n        } else if (room.isGroupRoom()) {\n            groups.addObject(room);\n            room.set('roster', groups);\n        } else if (room.isOneToOneRoom()) {\n            people.addObject(room);\n            room.set('roster', people);\n        }\n    },\n\n    addRoomToClosed(room) {\n        room.set('isClosed', true);\n        return this.closed.addObject(room);\n    },\n\n    removeRoomFromClosed(room) {\n        if (room.get('isClosed')) {\n            room.set('isClosed', false);\n            return this.closed.removeObject(room);\n        }\n    },\n\n    reestablishPresenceToStreamingService() {\n        const activatedRooms = this.favorites\n            .concat(this.people, this.adhocs, this.groups)\n            .filter(room => room.get('activated'));\n        const deferred = defer();\n        this.recursivelyReactivateRooms(A(activatedRooms), deferred);\n        return deferred.promise;\n    },\n\n    recursivelyReactivateRooms(activatedRooms, deferred) {\n        if (activatedRooms.length === 0) {\n            return deferred.resolve();\n        }\n        const room = activatedRooms.pop();\n        this.chat.joinRoom(room.get('jid'), true).then(() => {\n            this.recursivelyReactivateRooms(activatedRooms, deferred);\n        });\n    },\n\n    getNextRoomFromActiveSection() {\n        const choice =\n            this.getFirstNonDuplicateFromRoster(this.people) ||\n            this.getFirstNonDuplicateFromRoster(this.groups) ||\n            this.getFirstNonDuplicateFromRoster(this.adhocs);\n\n        return Promise.resolve(choice);\n    },\n\n    getFirstNonDuplicateFromRoster(roster) {\n        if (roster.get('firstObject.jid') !== this.get('activeRoom.jid')) {\n            return roster.get('firstObject');\n        } else {\n            return roster.objectAt(1);\n        }\n    }\n});\n","import Service from '@ember/service';\nimport { getOwner } from '@ember/application';\n\nexport interface IMediaMetadata {\n    trackId: string;\n    screenId: string;\n    originX: number;\n    originY: number;\n    resolutionX: number;\n    resolutionY: number;\n    primary: boolean;\n    main?: boolean;\n}\n\nexport interface IShareableScreenInfo {\n    shareid: string;\n    width: number;\n    height: number;\n    isPrimary: boolean;\n    isMain: boolean;\n    x: number;\n    y: number;\n}\n\nexport class BrowserScreenRecordingError extends Error {}\n\n/**\n * NOTE: this is a native class, so services are resolved with an explicit container lookup in\n * init() rather than the classic field-injection form (`application = inject('application')`).\n * Under Ember 3.28 a decorator assigned to a native class field is stored verbatim, so\n * `this.get('application')` returned the injection descriptor instead of the service — which made\n * `_isHosted()` read `undefined.hostedContext` and every logger call a no-op on a function object.\n * See .kiro/steering/ember-3-migration.md.\n */\nexport default class ScreenMediaService extends Service {\n    declare application: any;\n    declare session: any;\n    declare logger: any;\n\n    // set this through Orgpsan for testing\n    allowScreenRecordingInBrowser!: false;\n    debugScreenSelectionOpen = false;\n\n    init() {\n        super.init();\n        const owner = getOwner(this);\n        this.application = owner.lookup('service:application');\n        this.session = owner.lookup('service:session');\n        this.logger = owner.lookup('service:stash-logger');\n    }\n\n    _getHostedContext() {\n        return (this.get as any)('application.hostedContext');\n    }\n\n    _isHosted(): boolean {\n        return this._getHostedContext()?.isHosted();\n    }\n\n    canDoScreenRecording(): boolean {\n        return this._isHosted() || this.get('allowScreenRecordingInBrowser');\n    }\n\n    async _debugScreenRecordingInBrowser(): Promise<MediaStream> {\n        this.set('debugScreenSelectionOpen', true);\n        const stream = await navigator.mediaDevices.getDisplayMedia();\n        this.set('debugScreenSelectionOpen', false);\n\n        return stream;\n    }\n\n    async getMediaStreamWithAllMonitors(\n        conversationId: string\n    ): Promise<{ stream: MediaStream; metadatas: IMediaMetadata[] }> {\n        if (!this._isHosted()) {\n            this.get('logger').warn('screenMedia was requested in non-hosted env', { remoteData: { conversationId } });\n        }\n\n        if (this.get('allowScreenRecordingInBrowser')) {\n            const stream = await this._debugScreenRecordingInBrowser();\n            const track = stream.getTracks()[0];\n            const { height, width, deviceId } = track.getSettings();\n            const metadata: IMediaMetadata = {\n                trackId: track.id,\n                screenId: deviceId!, // some applications give you a deviceId on the track which is uniquely tied to a specific monitor\n                originX: 0,\n                originY: 0,\n                resolutionX: width!,\n                resolutionY: height!,\n                primary: true\n            };\n\n            return { stream, metadatas: [metadata] };\n        } else if (!this._isHosted()) {\n            throw new BrowserScreenRecordingError('Cannot do screen recording in browser env');\n        }\n\n        // get a list of monitors so we can gather media for each one\n        const screens = await this._getHostedContext().getShareableScreens();\n\n        const stream = this.createMediaStream();\n        const metadatas = [];\n\n        for (const screen of screens) {\n            const track = await this.getVideoTrackForScreenId(screen.shareid, conversationId);\n\n            // if we have a track, create the metadata to go with it\n            if (track) {\n                stream.addTrack(track);\n                metadatas.push(this.createTrackMetadata(screen, track));\n            }\n        }\n\n        return { stream, metadatas };\n    }\n\n    createMediaStream() {\n        return new MediaStream();\n    }\n\n    // tries 3 times to add a screen to the media stream\n    async getVideoTrackForScreenId(\n        screenId: string,\n        conversationId: string,\n        attemptsRemaining = 3\n    ): Promise<MediaStreamTrack | undefined> {\n        try {\n            const stream = await this.getHostedScreenMedia(screenId);\n\n            if (stream && stream.getVideoTracks().length) {\n                return stream.getVideoTracks()[0];\n            }\n\n            return;\n        } catch (err) {\n            if (!attemptsRemaining) {\n                this.get('logger').error(new Error('Failed to initialize screen recording for screen') as any, {\n                    remoteData: { screenId, conversationId, error: err }\n                });\n                return;\n            }\n\n            return this.getVideoTrackForScreenId(screenId, conversationId, attemptsRemaining - 1);\n        }\n    }\n\n    getHostedScreenMedia(screenId: string, maxFrameRate = 3): Promise<MediaStream> {\n        return window.navigator.mediaDevices.getUserMedia({\n            audio: false,\n            video: {\n                mandatory: {\n                    chromeMediaSource: 'desktop',\n                    chromeMediaSourceId: screenId,\n                    maxFrameRate\n                }\n            } as any\n        });\n    }\n\n    createTrackMetadata(screenInfo: IShareableScreenInfo, track: MediaStreamTrack): IMediaMetadata {\n        const isWindows = navigator.appVersion.indexOf('Win') > -1;\n        // purecloud-mac uses the bottom-left corner of the screen as its origin, with positive numbers representing higher origins\n        // purecloud-directory-window uses the top-left corner of the screen as its origin, with positive numbers representing lower origins\n        return {\n            trackId: track.id,\n            screenId: screenInfo.shareid,\n            originX: screenInfo.x,\n            originY: isWindows ? screenInfo.y : -1 * screenInfo.y,\n            resolutionX: screenInfo.width,\n            resolutionY: screenInfo.height,\n            primary: !!screenInfo.isPrimary,\n            main: !!screenInfo.isMain\n        };\n    }\n}\n\n/** DO NO REMOVE MODULE DECLARATION **/\ndeclare module '@ember/service' {\n    interface Registry {\n        screenMedia: ScreenMediaService;\n        'screen-media': ScreenMediaService;\n    }\n}\n","import Service from '@ember/service';\nimport { getOwner } from '@ember/application';\n\n/**\n * NOTE: this is a native class, so services are resolved with an explicit container lookup in\n * init() rather than the classic field-injection form (`pigeon = inject('pigeon')`). Under Ember\n * 3.28 a decorator assigned to a native class field is stored verbatim, so `this.get('pigeon')`\n * returned the injection descriptor instead of the service. The same applied to\n * `computed.readOnly()` on a field: `screenMonitorFt` evaluated to a truthy descriptor object, so\n * the WEM-437 toggle read as enabled for every user and the monitoring topics were always\n * registered. `screenMonitorFt` is a plain getter now.\n * See .kiro/steering/ember-3-migration.md.\n */\nexport default class ScreenMonitorNotificationsService extends Service {\n    declare logger: any;\n    declare pigeon: any;\n    declare session: any;\n    declare intl: any;\n    declare notification: any;\n\n    notificationsSubscribed = false;\n\n    get screenMonitorFt(): boolean {\n        return !!this.session?.features?.['WEM-437_screen-monitoring'];\n    }\n\n    public init() {\n        // Must use super.init() with native class syntax per Ember 3.28 assertion\n        super.init();\n        const owner = getOwner(this);\n        this.logger = owner.lookup('service:stash-logger');\n        this.pigeon = owner.lookup('service:pigeon');\n        this.session = owner.lookup('service:session');\n        this.intl = owner.lookup('service:intl');\n        this.notification = owner.lookup('service:notification');\n\n        this.get('pigeon').on('connect', this, this._setupMonitorEvents);\n    }\n\n    public willDestroy() {\n        this.get('pigeon').off('connect', this, this._setupMonitorEvents);\n        if (this.get('notificationsSubscribed')) {\n            this.get('pigeon').off('screen-monitor-started', this, this._screenMonitorStarted);\n            this.get('pigeon').off('screen-monitor-stopped', this, this._screenMonitorStopped);\n        }\n        // Must use super.willDestroy() with native class syntax per Ember 3.28 assertion\n        super.willDestroy();\n    }\n\n    _setupMonitorEvents(this: any) {\n        if (this.get('isDestroyed') || this.get('isDestroying')) {\n            return;\n        }\n\n        const screenMonitorFtEnabled = this.get('screenMonitorFt');\n        const guid = this.get('session.person.guid');\n\n        if (screenMonitorFtEnabled && guid && this.get('pigeon.connected')) {\n            this.get('pigeon').registerPriorityTopic(\n                `v2.screenmonitoring.agent.${guid}.started`,\n                'screen-monitor-started'\n            );\n            this.get('pigeon').registerPriorityTopic(\n                `v2.screenmonitoring.agent.${guid}.stopped`,\n                'screen-monitor-stopped'\n            );\n            this.get('pigeon').on('screen-monitor-started', this, this._screenMonitorStarted);\n            this.get('pigeon').on('screen-monitor-stopped', this, this._screenMonitorStopped);\n            this.set('notificationsSubscribed', true);\n        }\n    }\n\n    _screenMonitorStarted(this: any) {\n        this.get('notification').info('', this.get('intl').t('purecloud.screenMonitor.agentMonitorStarted'), {\n            showNotificationEverywhere: true\n        });\n    }\n\n    _screenMonitorStopped(this: any) {\n        this.get('notification').info('', this.get('intl').t('purecloud.screenMonitor.agentMonitorStopped'), {\n            showNotificationEverywhere: true\n        });\n    }\n}\n\ndeclare module '@ember/service' {\n    interface Registry {\n        'screen-monitor-notifications': ScreenMonitorNotificationsService;\n    }\n}\n","import Service, { inject as service } from '@ember/service';\nimport EmberObject, { observer } from '@ember/object';\nimport { run, later } from '@ember/runloop';\nimport RSVP from 'rsvp';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nconst RESET_INTERVAL = 45000;\nconst GCBA_PORT = 8191;\nconst GCBA_PING_INTERVAL_SECONDS = 30;\nconst EXTENSION_ID = 'aakckhgbcoaajnpjkalnjigkfgdheboe';\nconst INITIAL_RETRY_PERIOD_SECONDS = 4;\nconst MAX_RETRY_PERIOD_SECONDS = 256;\nconst FINAL_RETRY_PERIOD_SECONDS = 300;\nconst GCBA_VERSION_TIMEOUT_MS = 10000;\n\nexport default Service.extend(LoggerMixin, {\n    conversation: service(),\n    webrtc: service(),\n    application: service(),\n    session: service(),\n    ajax: service(),\n    feature: service(),\n    permissions: service(),\n\n    // Exposed as a property so tests can override the 10s default to avoid timeouts.\n    gcbaVersionTimeoutMs: GCBA_VERSION_TIMEOUT_MS,\n    // Exposed so tests can shorten the 45s retry-reset window.\n    resetIntervalMs: RESET_INTERVAL,\n\n    recordingRetries: null,\n\n    authenticatedGcba: false,\n    authenticatedGcbaThroughExtension: false,\n    gcbaAuthenticationRetryPeriodSeconds: INITIAL_RETRY_PERIOD_SECONDS,\n\n    init() {\n        this._super(...arguments);\n        this.set('recordingRetries', EmberObject.create());\n        this.set('extensionReady', false);\n        this.set('screenRecordingThroughExtension', false);\n        this.set('gcbaVersion', null);\n        this.set('_versionCheckPromise', null);\n        // Handles for fire-and-forget runloop timers this service schedules (the GCBA auth-retry\n        // later() and any in-flight version-request timeout). Tracked so willDestroy can cancel them;\n        // otherwise a retry armed up to 300s out — or a 10s version timeout — fires after the service\n        // is torn down and either touches a destroyed object or, in tests, leaks into a later test.\n        this._authRetryTimer = null;\n        this._versionTimeoutTimers = new Set();\n        this._retryResetTimers = new Set();\n    },\n\n    willDestroy() {\n        // Cancel timers first: the retry timer can be armed up to 300s out and the version-request\n        // timeout up to 10s out, so without this they outlive the service. See\n        // .kiro/skills/fix-timer-leaks.md — destroy/cancel the owner's own timers, never\n        // run.cancelTimers().\n        if (this._authRetryTimer) {\n            run.cancel(this._authRetryTimer);\n            this._authRetryTimer = null;\n        }\n        this._versionTimeoutTimers.forEach(timer => run.cancel(timer));\n        this._versionTimeoutTimers.clear();\n\n        // Each active conversation retains a 45s retries-reset timer; cancel any still pending.\n        this._retryResetTimers.forEach(timer => run.cancel(timer));\n        this._retryResetTimers.clear();\n\n        this._super(...arguments);\n    },\n\n    _updateRecordingRetries(conversationId) {\n        let retryInfo = this.get(`recordingRetries.${conversationId}`);\n\n        if (!retryInfo) {\n            retryInfo = this.set(\n                `recordingRetries.${conversationId}`,\n                EmberObject.create({\n                    retries: 0,\n                    warned: false\n                })\n            );\n        } else {\n            const previousResetTimeout = retryInfo.get('resetTimeout');\n            run.cancel(previousResetTimeout);\n            this._retryResetTimers.delete(previousResetTimeout);\n            retryInfo.incrementProperty('retries');\n            this.logger.info('screen recording session failed, retrying', { remoteData: { conversationId } });\n        }\n\n        const resetTimeout = run.later(() => {\n            this._retryResetTimers.delete(resetTimeout);\n            retryInfo.set('retries', 0);\n        }, this.resetIntervalMs);\n        this._retryResetTimers.add(resetTimeout);\n        retryInfo.set('resetTimeout', resetTimeout);\n    },\n\n    async _authenticateGcbaWithRetry(context, isRetry = false) {\n        // if this is the first call, we need create a deferred\n        if (!isRetry) {\n            const authPromise = context.get('authDeferred.promise');\n\n            // if auth is already in progress, return it.\n            if (authPromise) {\n                return authPromise;\n            }\n\n            const authDeferred = RSVP.defer();\n            context.set('authDeferred', authDeferred);\n        }\n\n        const result = context.screenRecordingThroughExtension\n            ? await context._authenticateGcbaThroughExtension()\n            : await context._authenticateGcba();\n\n        if (!result) {\n            // auth attempt failed, we need to retry again\n            const retryPeriod = context.gcbaAuthenticationRetryPeriodSeconds;\n            context.logger.info(`Will retry GCBA authentication in ${retryPeriod} seconds`);\n\n            // Cancel any previously-armed retry before scheduling the next, and retain the handle so\n            // willDestroy can cancel it. Left uncancelled, this later() (up to 300s out) fires after\n            // the service is destroyed.\n            if (context._authRetryTimer) {\n                run.cancel(context._authRetryTimer);\n            }\n            context._authRetryTimer = later(() => {\n                context._authRetryTimer = null;\n                context._authenticateGcbaWithRetry(context, true);\n            }, retryPeriod * 1000);\n            context._doubleRetryPeriod();\n        } else {\n            context.set('gcbaAuthenticationRetryPeriodSeconds', INITIAL_RETRY_PERIOD_SECONDS);\n            context.authDeferred.resolve();\n            context.set('authDeferred', null);\n        }\n    },\n\n    _doubleRetryPeriod() {\n        const currentPeriod = this.gcbaAuthenticationRetryPeriodSeconds;\n        if (currentPeriod < MAX_RETRY_PERIOD_SECONDS) {\n            this.set('gcbaAuthenticationRetryPeriodSeconds', currentPeriod * 2);\n        } else {\n            this.set('gcbaAuthenticationRetryPeriodSeconds', FINAL_RETRY_PERIOD_SECONDS);\n        }\n    },\n\n    async _authenticateGcba() {\n        if (this.authenticatedGcba) {\n            return true;\n        }\n\n        try {\n            const gcbaId = await this._getGcbaId();\n            const jwt = await this._getJwtToken(gcbaId);\n            const result = await this._passJwtToken(jwt);\n            if (!result) {\n                throw new Error(`Failed to pass the JWT to GCBA`);\n            }\n\n            this.logger.info('Successfully authenticated GCBA.');\n            this.set('authenticatedGcba', true);\n\n            this._schedulePingingGcba();\n            return true;\n        } catch (error) {\n            this.logger.error(`Failed to authenticate gcba: ${error}: ${error.payload}`);\n            return false;\n        }\n    },\n\n    async _authenticateGcbaThroughExtension() {\n        if (this.authenticatedGcbaThroughExtension) {\n            return true;\n        }\n\n        try {\n            const gcbaId = await this._getGcbaIdThroughExtension();\n            const jwt = await this._getJwtToken(gcbaId);\n            const result = await this._passJwtTokenThroughExtension(jwt);\n            if (!result) {\n                throw new Error(`Failed to pass the JWT to GCBA through extension`);\n            }\n\n            this.logger.info('Successfully authenticated GCBA through extension.');\n            this.set('authenticatedGcbaThroughExtension', true);\n\n            this._schedulePingingGcba();\n            return true;\n        } catch (error) {\n            this.logger.error(`Failed to authenticate GCBA through extension: ${error}: ${error.payload}`);\n            return false;\n        }\n    },\n\n    async _getGcbaId() {\n        const uri = this.application.localGCBAUri('gcbaId', GCBA_PORT);\n        try {\n            const response = await this.ajax.ajaxGet(uri, { retry: true });\n            if (!response.gcbaId) {\n                throw new Error(`Can't find gcbaId in the response`);\n            }\n\n            return response.gcbaId;\n        } catch (error) {\n            this.logger.error(`Failed to get gcbaId: ${error}: ${error.payload}`);\n            throw error;\n        }\n    },\n\n    async _getGcbaIdThroughExtension() {\n        try {\n            const userId = this.get('session.publicApiUser.id');\n            const request = {\n                type: 'gcbaId',\n                body: {\n                    userId: userId\n                }\n            };\n            const response = await this._sendMessageToExtension(request);\n            const { gcbaId } = response && response.body ? response.body : null;\n\n            if (gcbaId) {\n                this.logger.info('GCBA ID received from GCBA through extension is: ', gcbaId);\n                return gcbaId;\n            }\n\n            throw new Error(`Can't find gcbaId in the response received from GCBA through extension`);\n        } catch (error) {\n            this.logger.error(`Failed to get gcbaId from GCBA through extension: ${error}: ${error.payload}`);\n            throw error;\n        }\n    },\n\n    async _getGcbaVersion() {\n        const uri = this.application.localGCBAUri('version', GCBA_PORT);\n        let timeoutTimer;\n        try {\n            const timeoutPromise = new RSVP.Promise((resolve, reject) => {\n                timeoutTimer = run.later(() => {\n                    this._versionTimeoutTimers.delete(timeoutTimer);\n                    reject(new Error('Version request timed out'));\n                }, this.gcbaVersionTimeoutMs);\n                this._versionTimeoutTimers.add(timeoutTimer);\n            });\n\n            const versionPromise = this.ajax.ajaxGet(uri, { retry: false });\n            const response = await RSVP.race([versionPromise, timeoutPromise]);\n            run.cancel(timeoutTimer);\n            this._versionTimeoutTimers.delete(timeoutTimer);\n\n            if (response && response.version) {\n                this.logger.info('GCBA version received: ', response.version);\n                this.set('gcbaVersion', response.version);\n                return response.version;\n            }\n\n            this.logger.warn('No version found in GCBA response');\n            return null;\n        } catch (error) {\n            run.cancel(timeoutTimer);\n            this._versionTimeoutTimers.delete(timeoutTimer);\n            this.logger.warn(`Failed to get GCBA version (will use legacy endpoint): ${error}`);\n            return null;\n        }\n    },\n\n    async _getGcbaVersionThroughExtension() {\n        let timeoutTimer;\n        try {\n            const userId = this.get('session.publicApiUser.id');\n            const request = {\n                type: 'version',\n                body: {\n                    userId: userId\n                }\n            };\n\n            const timeoutPromise = new RSVP.Promise((resolve, reject) => {\n                timeoutTimer = run.later(() => {\n                    this._versionTimeoutTimers.delete(timeoutTimer);\n                    reject(new Error('Version request timed out'));\n                }, this.gcbaVersionTimeoutMs);\n                this._versionTimeoutTimers.add(timeoutTimer);\n            });\n\n            const versionPromise = this._sendMessageToExtension(request);\n            const response = await RSVP.race([versionPromise, timeoutPromise]);\n            run.cancel(timeoutTimer);\n            this._versionTimeoutTimers.delete(timeoutTimer);\n\n            if (response && response.body && response.body.version) {\n                this.logger.info('GCBA version received from extension: ', response.body.version);\n                this.set('gcbaVersion', response.body.version);\n                return response.body.version;\n            }\n\n            this.logger.warn('No version found in GCBA extension response');\n            return null;\n        } catch (error) {\n            run.cancel(timeoutTimer);\n            this._versionTimeoutTimers.delete(timeoutTimer);\n            this.logger.warn(`Failed to get GCBA version from extension (will use legacy endpoint): ${error}`);\n            return null;\n        }\n    },\n\n    _shouldUseNewTokenEndpoint() {\n        const version = this.gcbaVersion;\n\n        if (!version || typeof version !== 'string') {\n            return false;\n        }\n\n        try {\n            const parts = version.split('.');\n            const major = parseInt(parts[0], 10) || 0;\n            const minor = parseInt(parts[1], 10) || 0;\n\n            // Version >= 1.7.0\n            return major > 1 || (major === 1 && minor >= 7);\n        } catch (error) {\n            this.logger.error(`Failed to parse GCBA version: ${error}`);\n            return false;\n        }\n    },\n\n    async _sendMessageToExtension(request) {\n        try {\n            const response = await chrome.runtime.sendMessage(EXTENSION_ID, request);\n\n            if (response && response.status === 'success') {\n                this.logger.info(\n                    `${request.type} request to GCBA through extension is successful with response: ${response.message}`\n                );\n                return response;\n            } else if (request.type !== 'logout') {\n                throw new Error(`${request.type} request to GCBA through extension has failed`);\n            }\n        } catch (error) {\n            this.logger.error(`Failed to process the request to GCBA through extension: ${error}: ${error.payload}`);\n\n            if (\n                this.get('session.isAuthenticated') &&\n                (await this._shouldScreenRecordWithGcba()) &&\n                this.screenRecordingThroughExtension\n            ) {\n                this.logger.info('Reauthenticating GCBA through extension');\n                this.set('authenticatedGcbaThroughExtension', false);\n                run.debounce(this, this._authenticateGcbaWithRetry, this, 500, true);\n            }\n        }\n    },\n\n    async _getJwtToken(gcbaId) {\n        if (!gcbaId) {\n            throw new Error(`gcbaId is not provided`);\n        }\n\n        const useNewEndpoint = this._shouldUseNewTokenEndpoint();\n        const endpoint = useNewEndpoint ? 'api/v2/backgroundassistant/token' : 'api/v2/screenrecording/token';\n        const uri = this.application.pcV2Uri(endpoint);\n\n        this.logger.info(`Using ${useNewEndpoint ? 'new' : 'legacy'} token endpoint: ${endpoint}`);\n\n        const payload = {\n            data: {\n                backgroundAssistantId: gcbaId\n            },\n            retry: true\n        };\n        try {\n            const response = await this.ajax.post(uri, payload);\n            if (!response.jwt) {\n                throw new Error(`Can't find gcba JWT in the response`);\n            }\n\n            return response.jwt;\n        } catch (error) {\n            this.logger.error(`Failed to get JWT for gcba: ${error}: ${error.payload}`);\n            throw error;\n        }\n    },\n\n    _getEnvironment() {\n        return this.get('application.runtime.publicDomainName');\n    },\n\n    _getDomain() {\n        return window.location.hostname;\n    },\n\n    async _passJwtToken(jwtToken) {\n        if (!jwtToken) {\n            throw new Error(`gcba jwtToken is not provided`);\n        }\n\n        const payload = {\n            data: {\n                environment: this._getEnvironment(),\n                domain: this._getDomain()\n            },\n            headers: {\n                'Content-Type': 'application/json',\n                Authorization: `bearer ${jwtToken}`\n            },\n            retry: true\n        };\n        const uri = this.application.localGCBAUri('login', GCBA_PORT);\n        try {\n            await this.ajax.post(uri, payload);\n        } catch (error) {\n            this.logger.error(`Failed to pass jwt token to GCBA: ${error}: ${error.payload}`);\n            return false;\n        }\n        return true;\n    },\n\n    async _passJwtTokenThroughExtension(jwtToken) {\n        if (!jwtToken) {\n            throw new Error(`Error getting gcba jwtToken for extension`);\n        }\n\n        try {\n            const userId = this.get('session.publicApiUser.id');\n            const request = {\n                type: 'login',\n                body: {\n                    jwt: jwtToken,\n                    environment: this._getEnvironment(),\n                    domain: this._getDomain(),\n                    userId: userId\n                }\n            };\n            const response = await this._sendMessageToExtension(request);\n\n            if (response.status === 'success') {\n                this.logger.info('Successfully passed jwt token to GCBA through extension');\n                return true;\n            }\n\n            throw new Error(`Unable to process the login request to GCBA through extension`);\n        } catch (error) {\n            this.logger.error(`Failed to pass jwt token to GCBA through extension: ${error}: ${error.payload}`);\n            return false;\n        }\n    },\n\n    async _logoutGcba(context) {\n        context.set('authenticatedGcba', false);\n        const userId = context.get('session.publicApiUser.id');\n        const uri = context.application.localGCBAUri(`logout/${userId}`, GCBA_PORT);\n        try {\n            await context.ajax.post(uri, {\n                retry: true\n            });\n        } catch (error) {\n            context.logger.error(`Failed to logout GCBA: ${error}: ${error.payload}`);\n        }\n    },\n\n    async _logoutGcbaThroughExtension(context) {\n        context.set('authenticatedGcbaThroughExtension', false);\n        try {\n            const userId = context.get('session.publicApiUser.id');\n            const request = {\n                type: 'logout',\n                body: {\n                    userId: userId\n                }\n            };\n            const response = await context._sendMessageToExtension(request);\n\n            if (response.status === 'success') {\n                context.logger.info('Successfully logged out of GCBA through extension');\n            }\n        } catch (error) {\n            context.logger.error(`Failed to logout GCBA through extension: ${error}: ${error.payload}`);\n        }\n    },\n\n    _schedulePingingGcba() {\n        if (this.screenRecordingThroughExtension) {\n            run.debounce(this, this._pingGcbaThroughExtension, this, GCBA_PING_INTERVAL_SECONDS * 1000);\n        } else {\n            run.debounce(this, this._pingGcba, this, GCBA_PING_INTERVAL_SECONDS * 1000);\n        }\n    },\n\n    async _pingGcba(context) {\n        const userId = context.get('session.publicApiUser.id');\n        const uri = context.application.localGCBAUri(`ping/${userId}`, GCBA_PORT);\n        try {\n            await context.ajax.ajaxGet(uri, {\n                retry: true\n            });\n\n            context._schedulePingingGcba();\n        } catch (error) {\n            context.logger.warn(`Failed to ping Gcba: ${error}: ${error.payload}`);\n\n            if (context.get('session.isAuthenticated') && (await context._shouldScreenRecordWithGcba())) {\n                context.logger.info('Reauthenticating GCBA');\n\n                context.set('authenticatedGcba', false);\n                run.debounce(context, context._authenticateGcbaWithRetry, context, 500, true);\n            }\n        }\n    },\n\n    async _pingGcbaThroughExtension(context) {\n        try {\n            const userId = context.get('session.publicApiUser.id');\n            const request = {\n                type: 'ping',\n                body: {\n                    userId: userId\n                }\n            };\n            const response = await context._sendMessageToExtension(request);\n\n            if (response.status === 'success') {\n                context.logger.info('Ping to GCBA through extension is successful');\n            }\n\n            context._schedulePingingGcba();\n        } catch (error) {\n            context.logger.warn(`Failed to ping GCBA through extension: ${error}: ${error.payload}`);\n        }\n    },\n\n    _handleAuthChange: observer('session.isAuthenticated', 'session.singleSignOutInProgress', async function () {\n        // _shouldScreenRecordWithGcba now checks version and detects extension\n        if (!(await this._shouldScreenRecordWithGcba())) {\n            return;\n        }\n\n        const isSessionAuthenticated = this.get('session.isAuthenticated');\n        const shouldLogout = !isSessionAuthenticated || this.get('session.singleSignOutInProgress');\n        const usingExtension = this.screenRecordingThroughExtension;\n\n        if (usingExtension) {\n            this._handleExtensionAuth(isSessionAuthenticated, shouldLogout);\n        } else {\n            this._handleLoopbackAuth(isSessionAuthenticated, shouldLogout);\n        }\n    }),\n\n    async _detectExtension() {\n        if (!this.extensionReady) {\n            return;\n        }\n\n        try {\n            const userId = this.get('session.publicApiUser.id');\n            const request = {\n                type: 'detect',\n                body: { userId }\n            };\n\n            const response = await chrome.runtime.sendMessage(EXTENSION_ID, request);\n            this.set('screenRecordingThroughExtension', response.status === 'success');\n        } catch (error) {\n            this.logger.error(`Failed to detect GCBA through extension: ${error}`);\n            this.set('screenRecordingThroughExtension', false);\n        }\n    },\n\n    _handleExtensionAuth(isSessionAuthenticated, shouldLogout) {\n        const isAuthenticatedViaExtension = this.authenticatedGcbaThroughExtension;\n\n        if (isAuthenticatedViaExtension && shouldLogout) {\n            run.debounce(this, this._logoutGcbaThroughExtension, this, 500, true);\n        } else if (!isAuthenticatedViaExtension && isSessionAuthenticated) {\n            this.logger.info('Will retry GCBA authentication through extension');\n            run.debounce(this, this._authenticateGcbaWithRetry, this, 500, true);\n        }\n    },\n\n    _handleLoopbackAuth(isSessionAuthenticated, shouldLogout) {\n        const isAuthenticatedViaLoopback = this.authenticatedGcba;\n\n        if (isAuthenticatedViaLoopback && shouldLogout) {\n            run.debounce(this, this._logoutGcba, this, 500, true);\n        } else if (!isAuthenticatedViaLoopback && isSessionAuthenticated) {\n            run.debounce(this, this._authenticateGcbaWithRetry, this, 500, true);\n        }\n    },\n\n    _hasRequiredPermissionsForVersion() {\n        const hasScreenRecordingPermission = this.get('permissions.canScreenRecordingParticipate');\n        const hasRealtimeMonitorPermission = this.get('permissions.canRealtimeMonitorScreenParticipate');\n        const useNewEndpoint = this._shouldUseNewTokenEndpoint();\n\n        if (useNewEndpoint) {\n            // New GCBA (>= 1.7.0): Either permission is acceptable\n            return hasScreenRecordingPermission || hasRealtimeMonitorPermission;\n        } else {\n            // Old GCBA (< 1.7.0 or unknown): Must have screenRecording permission only\n            if (!hasScreenRecordingPermission && hasRealtimeMonitorPermission) {\n                this.logger.warn(\n                    'User has only realtimeMonitor:screen:participate permission, but GCBA version is below 1.7.0 or unknown. Blocking GCBA connection.'\n                );\n                return false;\n            }\n            return hasScreenRecordingPermission;\n        }\n    },\n\n    async _fetchGcbaVersion() {\n        // Detect if extension is available first\n        await this._detectExtension();\n\n        const usingExtension = this.screenRecordingThroughExtension;\n        if (usingExtension) {\n            await this._getGcbaVersionThroughExtension();\n        } else {\n            await this._getGcbaVersion();\n        }\n    },\n\n    async _shouldScreenRecordWithGcba() {\n        const context = this.get('application.hostedContext');\n        const isEdge = navigator.userAgent.indexOf('Edg') > -1;\n        const isWindows = navigator.userAgent.indexOf('Win') > -1;\n\n        // Edge extension check\n        if (\n            this.get('session.features.WEM-1142_MSEdgeNativeMessaging') &&\n            isEdge &&\n            typeof chrome !== 'undefined' &&\n            chrome &&\n            chrome.runtime &&\n            chrome.runtime.sendMessage\n        ) {\n            this.set('extensionReady', true);\n        }\n\n        // Check basic permissions first - user must have at least one permission\n        const hasScreenRecordingPermission = this.get('permissions.canScreenRecordingParticipate');\n        const hasRealtimeMonitorPermission = this.get('permissions.canRealtimeMonitorScreenParticipate');\n\n        if (!hasScreenRecordingPermission && !hasRealtimeMonitorPermission) {\n            return false;\n        }\n\n        // Check conditions\n        const isHosted = context && context.isHosted();\n        const iframedFn = this.get('application.iframed');\n        const isIframed = iframedFn && iframedFn();\n\n        if (isHosted || !isWindows || isIframed) {\n            if (context && !this._gcbaConditionsLogged) {\n                const reason = isHosted\n                    ? 'application is hosted'\n                    : !isWindows\n                    ? 'not running on Windows'\n                    : 'application is iframed';\n                this.logger.warn(`GCBA connection is not required: ${reason}`);\n                this.set('_gcbaConditionsLogged', true);\n            }\n            return false;\n        }\n\n        // Check GCBA version to determine if realtimeMonitor permission is sufficient\n        // Only check version if not already cached or in progress\n        if (!this.gcbaVersion) {\n            // If a version check is already in progress, wait for it\n            if (this._versionCheckPromise) {\n                await this._versionCheckPromise;\n            } else {\n                // Start version check and cache the promise\n                const versionPromise = this._fetchGcbaVersion();\n                this.set('_versionCheckPromise', versionPromise);\n\n                try {\n                    await versionPromise;\n                } finally {\n                    this.set('_versionCheckPromise', null);\n                }\n            }\n        }\n\n        // Apply version-aware permission check\n        return this._hasRequiredPermissionsForVersion();\n    }\n});\n","import { on } from '@ember/object/evented';\nimport { assert } from '@ember/debug';\nimport { later } from '@ember/runloop';\nimport { getOwner } from '@ember/application';\nimport RSVP from 'rsvp';\nimport { reads, map, readOnly } from '@ember/object/computed';\nimport { inject as service } from '@ember/service';\nimport { computed, get, observer } from '@ember/object';\nimport { isAbortError } from 'ember-ajax/errors';\nimport DS from 'ember-data';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport EsaSessionService from 'ember-simple-auth/services/session';\nimport _ from 'lodash';\nimport { isTesting } from 'web-directory/utils/testing';\nimport FieldConfig from '../field-config/field-config';\nimport moment from '../utils/dates';\nimport featureToggles, { v1Toggles, v1WhiteList } from '../utils/feature-toggles';\nimport { addPageAction } from '../utils/newrelic';\nimport { getLoggableRequestFailureDetails } from '../utils/request';\nimport { isAccessDeniedDueToPolicy } from '../utils/policy-access-denied';\nimport { executeChain, isChainStepFailure } from '../utils/serial-processing-chain';\nimport { buildCommonTelemetryContext } from './analytics';\nimport { formatTimestampForDisplay } from 'web-directory/utils/date-time';\nimport { task } from 'ember-concurrency';\n\n// TECHDEBT: Make this a proper type/error and part of the method signature when moving to TS\nexport const SESSION_BOOTSTRAP_ERROR_TYPE = 'sessionBootstrapError';\n\n/** Bootstrap failed because ABAC/security policy denied access (IAM-4413). */\nexport const POLICY_ACCESS_DENIED_TYPE = 'policyAccessDenied';\n\nconst sdkOrVoltBlocker = 'sdkOrVoltConversation';\n\nexport default EsaSessionService.extend(LoggerMixin, {\n    ajax: service(),\n    intl: service(),\n    clock: service(),\n    pigeon: service(),\n    stashLogger: service('stash-logger'),\n    logCapture: service('log-capture'),\n    rollingLogCapture: service('rolling-log-capture'),\n    cookies: service(),\n    application: service(),\n    featureService: service('feature'),\n    storage: service('storage'),\n    presence: service(),\n    presenceSubscription: service(),\n    // Store conflicts with ESA Session Service property\n    dataStore: service('store'),\n    phone: service(),\n    webrtcSdkService: service('webrtc-sdk'),\n    volt: service(),\n    permissionService: service('permissions'),\n\n    // Access token — available during bootstrap via _bootstrapAccessToken (set by\n    // the authenticator before ESA persists session data) and after bootstrap via\n    // ESA's session store (data.authenticated.access_token).\n    _bootstrapAccessToken: null,\n\n    accessToken: computed('data.authenticated.access_token', '_bootstrapAccessToken', function () {\n        return this.get('data.authenticated.access_token') || this._bootstrapAccessToken;\n    }),\n\n    person: null,\n    presenceMap: reads('presence.presenceDefinitions'),\n\n    user: null, // Legacy - Directory session user - Move to permissions where possible.\n    namedPermissions: reads('permissions'), // Backwards compatibility - Directory namedPermissions now point to public-api permissions\n\n    permissions: reads('publicApiUser.authorization.permissions'),\n    lastLoginDateFormatted: computed('publicApiUser.dateLastLogin', function () {\n        const lastLoginDate = this.get('publicApiUser.dateLastLogin');\n        if (!lastLoginDate) return '';\n\n        return formatTimestampForDisplay(lastLoginDate);\n    }),\n    roleNames: map('publicApiUser.authorization.roles', role => role.name),\n\n    readWritePermissionsDeferred: null,\n\n    allowedOrgPermissions: null,\n    features: null,\n    enabledFeatures: [],\n\n    products: [],\n\n    authInProgress: false,\n    /**\n     * Marker boolean to indicate that the current session is being torn down\n     */\n    logoutInProgress: false,\n    /**\n     * Marker boolean to indicate that a hard logout has been requested\n     */\n    singleSignOutInProgress: false,\n\n    offset: 0,\n\n    blockers: [],\n\n    _timeAuthenticated: null,\n\n    /**\n     * Property to store whether the account switcher should be shown.\n     * This is set by the updateAccountSwitcherVisibility task.\n     */\n    showAccountSwitcher: false,\n\n    init() {\n        this._super(...arguments);\n\n        let deferred = this.readWritePermissionsDeferred;\n        if (!deferred) {\n            deferred = RSVP.defer();\n            this.set('readWritePermissionsDeferred', deferred);\n        }\n    },\n\n    /**\n     * Override ESA's setup() to capture the promise so route mixins can\n     * await it before checking isAuthenticated. (ATLAS-2418)\n     */\n    setup() {\n        const promise = this._super(...arguments);\n        this._setupPromise = promise;\n        return promise;\n    },\n\n    /**\n     * Promise for the in-flight session bootstrap (`authenticateWithSession`), or\n     * null when no bootstrap is running.\n     *\n     * `isAuthenticated` requires both an ESA session and a populated `user`, and\n     * `user` is only populated part way through the bootstrap chain. Route gates\n     * await this so they can tell \"bootstrap still running\" from\n     * \"unauthenticated\" instead of bouncing a valid load to login-oauth. (ATLAS-2424)\n     */\n    _bootstrapPromise: null,\n\n    // isAuthenticated conflicts with ESA Session Service property\n    isAuthenticated: computed('session.isAuthenticated', 'user', 'person', function () {\n        return this.get('session.isAuthenticated') && !_.isEmpty(this.user);\n    }),\n\n    hasAppAccess: computed('namedPermissions', 'user.isSuper', 'user.isTrustee', function () {\n        if (this.get('user.isSuper') || this.get('user.isTrustee')) {\n            return true;\n        }\n\n        var permissions = this.namedPermissions;\n\n        const hasDirectoryUserViewPermission = (permissions || []).some(perm => {\n            return perm.indexOf('directory:user:view') > -1;\n        });\n\n        return (\n            _.includes(permissions, 'employee') ||\n            _.includes(permissions, 'external') ||\n            _.includes(permissions, 'associate') ||\n            hasDirectoryUserViewPermission\n        );\n    }),\n\n    hasTrusteeAccess: computed('user.isTrustee', function () {\n        return this.get('user.isTrustee');\n    }),\n\n    // Has permission that is division aware.\n    hasPermissionAndDivision: function (permission, division) {\n        const result = {\n            hasPermission: false,\n            divisions: [],\n            hasDivision: false,\n            hasDivisions: false\n        };\n\n        if (!permission) {\n            return result;\n        }\n\n        const permissions = this.namedPermissions;\n        const expression = '^'.concat(permission, ':', '([0-9A-Fa-f]{8}(?:-[0-9A-Fa-f]{4}){3}-[0-9A-Fa-f]{12},|)+');\n        const regEx = new RegExp(expression);\n        let isPermission = false;\n        let isPermissionWithDivisions = false;\n        let permissionDivisions = [];\n\n        const foundPermission = _.find(permissions, p => {\n            isPermission = p === permission;\n            isPermissionWithDivisions = regEx.test(p);\n            if (isPermissionWithDivisions) {\n                permissionDivisions = _.last(p.split(':'));\n            }\n            return isPermission || isPermissionWithDivisions;\n        });\n\n        if (foundPermission) {\n            result.hasPermission = true;\n            if (isPermissionWithDivisions) {\n                result.hasDivisions = true;\n                if (permissionDivisions && permissionDivisions.length > 0) {\n                    result.divisions = permissionDivisions.split(',');\n                    if (division && _.includes(permissionDivisions, division)) {\n                        result.hasDivision = true;\n                    }\n                }\n            }\n            return result;\n        }\n        return result;\n    },\n\n    readWritePermissions: computed(function () {\n        const deferred = this.readWritePermissionsDeferred;\n        if (!deferred) {\n            // return dummy on the off chance that the laws of physics no longer apply\n            if (this.logger) {\n                this.logger.warn('readWritePermissionsDeferred never instantiated in Session `init` call');\n            }\n            return RSVP.defer().promise;\n        }\n        return deferred.promise;\n    }),\n\n    groupMailboxEnabled: readOnly('features.EC-772_get-groups-mailboxes'),\n\n    /**\n     * `true` if the new multipanel experience is able to be rendered.\n     *\n     * @note multipanel is currently not supporting PEF. We use `application.isPopout` to currently check for that instance, but\n     * a more reliable way might be needed later.\n     */\n    useMultipanel: computed('application.isPopout', function () {\n        // Multipanel does not support PEF\n        if (this.get('application.isPopout')) return false;\n        return true;\n    }),\n\n    /**\n     * `true` if the user is using the new modes feature.\n     */\n    useModes: computed('application.isPopout', 'features.PURE-7222_associate-user', function () {\n        // No PEF support\n        if (this.get('application.isPopout')) {\n            return false;\n        }\n\n        //@todo PURE-7222: add permissions check once confirmed\n        return this.get('features.PURE-7222_associate-user');\n    }),\n\n    /**\n     * Gates the ability to create workitems from the modes outbound form.\n     * Hard-coded off; force `true` via the console for usage.\n     *\n     * @note\n     * - Not intended for actual use by end users, only for development and testing.\n     *\n     * @usage\n     * - `Orgspan.serviceFor('session').set('allowCreateWorkitemOutbound', true);`\n     */\n    allowCreateWorkitemOutbound: computed(function () {\n        return false;\n    }),\n\n    /**\n     * `true` if the new navigation UI should be enabled\n     */\n    useNewNav: computed('application.isPopout', function () {\n        // No PEF support\n        if (this.get('application.isPopout')) {\n            return false;\n        }\n\n        return true;\n    }),\n\n    /**\n     * Determines if the app should use the new gc-mfe-auth library or the legacy pc-ui-auth library.\n     */\n    useGCMFEAuth: computed('features.PLATFORM-4742_use-gc-mfe-auth', function () {\n        // https://grandcentral.ininica.com/#/feature-toggles/PLATFORM-4742_use-gc-mfe-auth\n        // When this feature toggle is removed, this property should be removed and all usages of it should be reduced to the TRUE path\n\n        // Get cached value and active FT value\n        const cachedUseGCMFEAuth = this.get('storage').getLocalStorageItem('useGCMFEAuth') === 'true';\n        const ftUseGCMFEAuth = this.get('features.PLATFORM-4742_use-gc-mfe-auth');\n\n        // Pre-initialize: return the cached value to use last known state\n        if (ftUseGCMFEAuth === undefined) return cachedUseGCMFEAuth;\n\n        // If the cached value and the active FT value are different, update the cache and reload the app\n        if (ftUseGCMFEAuth !== cachedUseGCMFEAuth) {\n            // Update cache to match the feature toggle value\n            this.storage.setLocalStorageItem('useGCMFEAuth', ftUseGCMFEAuth === true ? 'true' : 'false');\n\n            // Rebootstrap app using new stored setting\n            window.location.reload();\n        }\n\n        return ftUseGCMFEAuth;\n    }),\n\n    /**\n     * Concurrency task to update the account switcher visibility.\n     * This task checks all conditions and sets the showAccountSwitcher property.\n     */\n    updateAccountSwitcherVisibility: task(function* () {\n        const useGCMFEAuth = yield this.useGCMFEAuth;\n        if (useGCMFEAuth !== true) {\n            if (this.logger) {\n                this.logger.warn('updateAccountSwitcherVisibility: gc-mfe-auth is not active');\n            }\n        }\n\n        const permissions = this.permissions || [];\n        const hasPermission =\n            permissions.includes('multiOrg:accountSwitching:enable') ||\n            permissions.includes('multipleRegionMultipleOrg:accountSwitching:enable');\n        this.set('showAccountSwitcher', hasPermission);\n        return hasPermission;\n    }).drop(),\n\n    /**\n     * Observer that triggers the updateAccountSwitcherVisibilityTask when dependencies change.\n     * This replaces the async computed property pattern with a more maintainable approach.\n     * Watches: permissions, user, and session.isAuthenticated\n     */\n    _accountSwitcherVisibilityObserver: observer('permissions.[]', 'user', 'session.isAuthenticated', function () {\n        // Guard: Don't run during initialization or if storage service isn't available\n        if (!this.get('storage')) {\n            return;\n        }\n\n        const isAuthenticated = this.get('isAuthenticated');\n        const isTaskRunning = this.get('updateAccountSwitcherVisibility.isRunning');\n\n        // Only trigger if authenticated and the task is not already running\n        if (isAuthenticated && !isTaskRunning) {\n            this.get('updateAccountSwitcherVisibility').perform();\n        }\n    }),\n\n    popoutAuthForIframes: computed('org.orgPreferences.popoutAuthForIframes', function () {\n        return !!this.get('org.orgPreferences.popoutAuthForIframes');\n    }),\n\n    /**\n     * Determines if the app should try to detect API requests to the UI hosting domain and\n     * rewrite them to our API domain. This is to help with the transition to our new\n     * hosting where API calls are not available on the same domain.\n     */\n    rewriteRootAPIRequests: computed('features.comui-disable-legacy-api-url', function () {\n        // Only do this we are on the new hosting and the feature toggle is enabled.\n        return window.location.hostname.startsWith('app.') && this.get('features.comui-disable-legacy-api-url');\n    }),\n\n    createFieldConfigs: function (fieldConfigs) {\n        for (const value of Object.values(fieldConfigs)) {\n            this.createFieldConfig(value);\n        }\n    },\n\n    createFieldConfig: function (fieldConfig) {\n        FieldConfig.createFieldConfig(fieldConfig, getOwner(this));\n    },\n\n    createPresences: function () {\n        return this.presence.loadPresences();\n    },\n\n    loadAllowedOrgPermissions: function () {\n        const url = this.application.pcV2Uri('api/v2/authorization/permissions?pageSize=99999');\n        return this.ajax\n            .request(url)\n            .then(data => {\n                this.set('allowedOrgPermissions', data.entities);\n            })\n            .catch(error => {\n                this.set('allowedOrgPermissions', null);\n                this.logger.error('Could not get org permissions:', { error });\n                return RSVP.reject('orgPermissionsFetchFailure');\n            });\n    },\n\n    loadOrgProducts: function () {\n        const url = this.application.pcV2Uri('api/v2/authorization/products');\n        return this.ajax\n            .request(url)\n            .then(data => {\n                this.set('products', data.entities);\n            })\n            .catch(error => {\n                this.set('products', []);\n                this.logger.error('Could not get org products:', { error });\n                return RSVP.reject('orgProductsFetchFailure');\n            });\n    },\n\n    async getOrganizationTranscriptSettings() {\n        const ajax = this.ajax;\n        const application = this.application;\n        const hasPermission = (this.permissions || []).includes('routing:transcriptionSettings:view');\n\n        if (!hasPermission) {\n            return {};\n        }\n\n        let transcriptSettings = {};\n\n        try {\n            const settingsUri = application.pcV2Uri('api/v2/routing/settings/transcription');\n            const response = await ajax.request(settingsUri);\n\n            transcriptSettings = response || {};\n        } catch (error) {\n            this.logger.error('directory failed to retrieve org transcript settings', { error });\n        }\n\n        this.set('transcriptSettings', transcriptSettings);\n        return transcriptSettings;\n    },\n\n    /**\n     * Fetches organization limits for a specific namespace\n     * @param {string} namespace - The namespace (e.g., 'conversations','messaging')\n     * @returns {Promise<Array>} Promise resolving to the entities array from the limits API\n     * Returns empty array on error\n     */\n    async getOrganizationLimits(namespace) {\n        const ajax = this.ajax;\n        const application = this.application;\n        const url = application.pcV2Uri(`api/v2/organizations/limits/namespaces/${namespace}`);\n\n        try {\n            const response = await ajax.request(url);\n            return (response && response.entities) || [];\n        } catch (error) {\n            this.logger.error(`Failed to fetch organization limits for namespace: ${namespace}`, { error });\n            return [];\n        }\n    },\n\n    getPresence(presence) {\n        return this.presence.getPresence(presence);\n    },\n\n    authenticateWithSession(forceDirectory = false) {\n        if (this.isAuthenticated) {\n            return RSVP.resolve();\n        }\n\n        this.set('authInProgress', true);\n\n        const bootstrapPromise = executeChain(\n            [\n                {\n                    stepDesc: 'loadFeatureToggles',\n                    process: () => this.getFeatures()\n                },\n                {\n                    stepDesc: 'loadOrgPermissions',\n                    process: () => this.loadAllowedOrgPermissions()\n                },\n                {\n                    stepDesc: 'setupIntlCookie',\n                    processSync: () => {\n                        this.intl.updateIntlDateTimeCookie();\n                    }\n                },\n                {\n                    stepDesc: 'setupUserAndTrustee',\n                    process: () => {\n                        if (!forceDirectory) {\n                            return this.trusteeBootstrap();\n                        }\n\n                        return RSVP.resolve();\n                    }\n                },\n                {\n                    stepDesc: 'setupLogCapture',\n                    processSync: () => {\n                        if (this.get('user.logCaptureEnabled')) {\n                            this.logCapture.start();\n                        }\n\n                        if (this.get('permissionService.canAddLogCaptureOnDemand')) {\n                            this.rollingLogCapture.start();\n                        }\n                    }\n                },\n                {\n                    stepDesc: 'establishDirectorySession',\n                    process: () => {\n                        // Don't call directory session for login when we have trustee features on\n                        if (this.get('user.isTrustee')) {\n                            return RSVP.resolve();\n                        }\n\n                        const url = this.application.pcV2Uri('api/v2/apps/legacy/session');\n                        const data = { lang: this.get('intl.isoLocale') };\n                        return this.ajax.post(url, { data }).then(data => this.establishSession(data));\n                    }\n                },\n                {\n                    stepDesc: 'initServerTranslations',\n                    process: () => this.intl.setupServerTranslations()\n                },\n                {\n                    stepDesc: 'loadPresences',\n                    process: () => this.createPresences()\n                },\n                {\n                    stepDesc: 'loadUserDetails',\n                    process: () => {\n                        if (this.get('user.isSuper') || this.get('user.isTrustee')) {\n                            return RSVP.resolve([]);\n                        }\n                        return this.refreshPublicApiUser();\n                    }\n                },\n                {\n                    stepDesc: 'loadUserFavorites',\n                    processSync: () => {\n                        if (this.get('user.isSuper') || this.get('user.isTrustee')) {\n                            return;\n                        }\n\n                        return this.get('person.favorites');\n                    }\n                },\n                {\n                    stepDesc: 'setupCarrierPigeon',\n                    process: () => this.setupCarrierPigeon()\n                },\n                {\n                    stepDesc: 'initAppSession',\n                    process: () => this.updateAppSession()\n                },\n                {\n                    stepDesc: 'loadOrgProducts',\n                    process: () => {\n                        return this.loadOrgProducts();\n                    }\n                },\n                {\n                    stepDesc: 'loadOrgTranscriptSettings',\n                    process: () => this.getOrganizationTranscriptSettings()\n                },\n                {\n                    stepDesc: 'loadPerson',\n                    processSync: () => this.person\n                },\n                {\n                    stepDesc: 'loadUserPreferences',\n                    process: () => this.getPreferences()\n                }\n                // DO NOT add additional processing blocks here unless it is REQUIRED for app bootstrap\n            ],\n            {\n                loggingConfig: {\n                    logger: this.stashLogger,\n                    logMsgPrefix: 'Session Bootstrap Chain: '\n                }\n            }\n        )\n            .then(() => {\n                this.set('authInProgress', false);\n                this._bootstrapPromise = null;\n            })\n            .catch(reason => {\n                this.set('authInProgress', false);\n                this._bootstrapPromise = null;\n\n                let error = reason;\n                let failedStep;\n\n                // Theoretically, reason should always be a ChainStepFailure, but .. promise rejection typings\n                if (isChainStepFailure(reason)) {\n                    error = reason.origReason;\n                    failedStep = reason.stepDesc;\n                }\n\n                /* Legacy Checks */\n                let legacyInvalidSessionToken = false;\n                let legacyErrorCode = null;\n                if (error && error.status === 200) {\n                    legacyErrorCode = 'directorySessionParseFailure';\n                }\n\n                if (error && error.status === 403) {\n                    legacyInvalidSessionToken = true;\n                    legacyErrorCode = 'invalidSessionToken';\n                }\n                /* End Legacy Checks */\n\n                const telemetryContext = buildCommonTelemetryContext({\n                    applicationService: this.application,\n                    sessionService: this,\n                    intlService: this.intl\n                });\n                const loggableRequestFailureDetails = getLoggableRequestFailureDetails(error);\n\n                this.stashLogger.error('Session bootstrap failed', {\n                    error,\n                    remoteData: Object.assign(\n                        {\n                            failedStep,\n                            legacyErrorCode,\n                            requestFailureDetails: loggableRequestFailureDetails\n                        },\n                        telemetryContext\n                    )\n                });\n\n                addPageAction(\n                    'sessionBootstrapFailure',\n                    Object.assign(\n                        {\n                            failedStep,\n                            legacyErrorCode\n                        },\n                        loggableRequestFailureDetails,\n                        telemetryContext\n                    )\n                );\n\n                if (isAccessDeniedDueToPolicy(error)) {\n                    return RSVP.reject({\n                        type: POLICY_ACCESS_DENIED_TYPE,\n                        failedStep,\n                        status: loggableRequestFailureDetails ? loggableRequestFailureDetails.status : undefined,\n                        legacyInvalidSessionToken\n                    });\n                }\n\n                return RSVP.reject({\n                    type: SESSION_BOOTSTRAP_ERROR_TYPE,\n                    failedStep,\n                    status: loggableRequestFailureDetails ? loggableRequestFailureDetails.status : undefined,\n                    legacyInvalidSessionToken\n                });\n            });\n\n        // Published for route gates to await. Not returned in place of the chain so\n        // the re-entrant `authenticateWithSession(true)` call in trusteeBootstrap\n        // still gets its own promise rather than waiting on the chain containing it.\n        this._bootstrapPromise = bootstrapPromise;\n\n        return bootstrapPromise;\n    },\n\n    trusteeBootstrap() {\n        const expands = ['fieldconfigs', 'organization'];\n\n        return new RSVP.Promise((resolve, reject) => {\n            this.refreshPublicApiUser(expands)\n                .then(data => {\n                    this.setServerTimeOffset();\n                    moment.now = () => {\n                        const offset = this.offset;\n                        return +new Date() + offset;\n                    };\n\n                    this.set('_timeAuthenticated', moment.now());\n\n                    this.createFieldConfigs(data.fieldConfigs);\n\n                    const user = this.setupStoreData('public-api-user', data);\n                    this.set('user', user);\n                    this.set('trusteeOrg', data.organization);\n\n                    const groupMailboxEnabled = this.groupMailboxEnabled;\n\n                    const groupAdapterOptions = groupMailboxEnabled\n                        ? {\n                              extraExpands: ['group']\n                          }\n                        : null;\n\n                    // See if the person exists, if not, trustee user.\n                    // This will be changed to an directory session call when they support\n                    // trustees...soon...\n                    this.dataStore\n                        .findRecord('person', user.get('id'), {\n                            adapterOptions: groupAdapterOptions\n                        })\n\n                        .then(person => {\n                            this.set('person', person);\n\n                            // Trigger the profile load\n                            user.get('profile');\n\n                            resolve(person);\n                        })\n                        .catch(error => {\n                            if (error && error.status === 404) {\n                                this.set('user.isTrustee', true);\n\n                                const person = this.dataStore.createRecord('person', {\n                                    id: 'trustee',\n                                    general: {\n                                        name: [{ value: user.get('name') }],\n                                        department: [{ value: user.get('department') }],\n                                        title: [{ value: user.get('title') }]\n                                    }\n                                });\n                                this.set('person', person);\n\n                                resolve();\n                            } else {\n                                reject(error);\n                            }\n                        });\n                })\n                .catch(error => {\n                    if (error.status === 404 || _.includes(error.message, 'not found')) {\n                        resolve(this.authenticateWithSession(true));\n                    } else {\n                        this.logger.error('trusteeBootstrap failed', {\n                            error,\n                            remoteData: {\n                                error: error\n                            }\n                        });\n                        reject(error);\n                    }\n                });\n        });\n    },\n\n    /**\n     * Initiates logout if the user is deleted outside of a logout request\n     */\n    onLegacySessionInvalidation: observer('user', function () {\n        if (_.isEmpty(this.user) && !this.logoutInProgress) {\n            this.invalidate();\n        }\n    }),\n\n    /**\n     * If no critical work is in progress, invalidates the session with both ESA\n     * and any local cleanup triggering the 'invalidationSucceeded' event when complete.\n     * This method should be used to invalidate the current session as opposed to\n     * logging out of PureCloud.  For a full, single-sign-out logout, call logout.\n     *\n     * This method triggers 'invalidatingAuthSession' to allow any listeners to\n     * register critical functionality that cannot be currently aborted.\n     *\n     * Note: This method is multi-call, burst tolerant to handle multiple\n     * 401 responses from the ajaxError handler and bubbling logout events.\n     *\n     * @returns A rejected promise if any listeners have registered critical functionality\n     * in progress; Otherwise, a logout promise that will be the same instance for the duration\n     * of the logout attempt.  It will only be reattempted if the logout attempt\n     * fails.\n     */\n    invalidate(options) {\n        options = options || {};\n        const LOGOUT_PROMISE_PROP_NAME = '_logoutPromise';\n        let logoutPromise = this.get(LOGOUT_PROMISE_PROP_NAME);\n\n        //workaround for an odd bug that is causing the call to super below to hit the wrong super class.\n        //the context of `this` does not change, but _super does.\n        let _super = this._super.bind(this);\n\n        // notify services that we're attempting to logout.\n        this.trigger('invalidatingAuthSession', this.addRemoveBlockers.bind(this));\n        // Check if we're in an active volt or softphone via SDK session.\n        try {\n            this.invalidatingSdkOrVolt();\n        } catch (error) {\n            /* no-op: don't let errors here stop us from logging out */\n        }\n\n        if (this.get('blockers.length') > 0) {\n            this.set('shouldPreventLogout', true);\n            const unauthorized = !!(options.unauthorized || options.notified);\n            // Force a boolean value\n            this.set('logoutSinceUnauthorized', unauthorized);\n            return RSVP.reject('prevent this logout');\n\n            // if we got blocked due to webrtc sessions, we want to bypass this because it means they've already seen a notification\n        } else if (!this.logoutSinceUnauthorized) {\n            this.set('shouldPreventLogout', false);\n            this.set('logoutSinceUnauthorized', false);\n        }\n        if (!logoutPromise) {\n            logoutPromise = new RSVP.Promise((resolve, reject) => {\n                this.set('logoutInProgress', true);\n\n                RSVP.resolve()\n                    .then(() => {\n                        if (this.singleSignOutInProgress) {\n                            return this.phone.doLogoutAssociationLogic().catch(error =>\n                                this.logger.error('doLogoutAssociationLogic error', {\n                                    error,\n                                    remoteData: {\n                                        error: error\n                                    }\n                                })\n                            );\n                        }\n                    })\n                    .finally(() => {\n                        if (this.get('session.isAuthenticated')) {\n                            _super(...arguments)\n                                .then(resolve)\n                                .catch(() => {\n                                    // Currently, this will only happen if ESA fails to remove the auth creds\n\n                                    this.set('logoutInProgress', false);\n\n                                    // kill user to force isAuthenticated computed to false\n                                    // Note: user observer fires immediately and gets same rejected promise; no duplicate call risk\n                                    this.set('user', null);\n\n                                    // Reset the promise so they can attempt to logout again\n                                    this.set(LOGOUT_PROMISE_PROP_NAME, null);\n\n                                    // ESA will fire a failure event\n                                    reject();\n                                });\n                        } else {\n                            /* ESA is already unauth'd (Ex: no-access route).\n                             * Simply do some local cleanup and redirect to the login screen\n                             * Note: This op could have no effect and result in the user landing back on the same page.\n                             * For Example: The no-access page\n                             */\n\n                            const authenticator = getOwner(this).lookup('authenticator:directory');\n                            if (authenticator) {\n                                authenticator.cleanCustomBrowserStorage();\n                            }\n                            this.trigger('invalidationSucceeded');\n\n                            resolve();\n                        }\n                    });\n            }); // end logoutPromise\n\n            this.set(LOGOUT_PROMISE_PROP_NAME, logoutPromise);\n        } // end if (!logoutPromise)\n\n        return logoutPromise;\n    },\n\n    invalidatingSdkOrVolt() {\n        const webrtcSdkService = this.webrtcSdkService;\n        // Exclude screen-recording and live screen monitoring sessions from SDK logout blockers.\n        const sdkActiveSessions = webrtcSdkService\n            .getAllActiveSessions()\n            .filter(\n                session => session.sessionType !== 'screenRecording' && session.sessionType !== 'liveScreenMonitoring'\n            );\n        const hasVoltSession = this.get('volt.isShowingVideo');\n        if (sdkActiveSessions.length || hasVoltSession) {\n            this.addRemoveBlockers('add', sdkOrVoltBlocker);\n            return;\n        }\n        this.addRemoveBlockers('remove', sdkOrVoltBlocker);\n    },\n\n    addRemoveBlockers(action, blocker) {\n        let arr = this.blockers;\n        if (action === 'add') {\n            arr.pushObject(blocker);\n        }\n        if (action === 'remove') {\n            arr.removeObject(blocker);\n        }\n        this.blockers.setObjects(arr.uniq());\n    },\n\n    proxyLogin(orgId, hash) {\n        this.set('proxyLoginInfo', { org: orgId, hash: hash });\n        return this.invalidate({ notified: true }).catch(() => {\n            this.set('proxyLoginInfo', null);\n        });\n    },\n\n    retrieveProxyLoginInfo() {\n        return this.proxyLoginInfo;\n    },\n\n    /**\n     * If no critical work is in progress, log out of entire PureCloud suite.\n     *\n     * Kills currently issued auth token and all other tokens issued within the\n     * current auth session.  Also kills RememberMe context (if applicable).\n     *\n     * @returns A rejected promise if critical work is in progress; otherwise, a\n     * \"singleton\" promise that will reject or resolve on eventual completion. The\n     * promise allows burst calls of logout to be debounced until the promise\n     * resolves.\n     *\n     * @see #invalidate() for burst and critical work details\n     */\n    logout() {\n        this.set('singleSignOutInProgress', true);\n        return this.invalidate({ notified: true }).catch(reason => {\n            // Invalidate failed due to active call, interal issue, etc.\n\n            // Clear the SSO boolean for recoverable failure cases\n            this.set('singleSignOutInProgress', false);\n            return RSVP.reject(reason);\n        });\n    },\n\n    setupStoreData(type, data) {\n        let store = this.dataStore;\n        let model = store.modelFor(type);\n        let serializer = store.serializerFor(type);\n        data = serializer.normalizeSingleResponse(store, model, data, data.guid);\n        return store.push(data);\n    },\n\n    establishSession(data, redirect) {\n        let response = data.res;\n\n        if (!_.isEmpty(redirect)) {\n            later(\n                this,\n                function () {\n                    window.location = redirect;\n                },\n                100\n            );\n\n            return;\n        }\n\n        this.setServerTimeOffset();\n        moment.now = () => {\n            const offset = this.offset;\n            return +new Date() + offset;\n        };\n\n        this.createFieldConfigs(response.fieldConfigs);\n\n        let person = null;\n        if (response.person && response.person.guid) {\n            person = this.setupStoreData('person', response.person);\n            this.set('person', person);\n        }\n\n        let user = this.setupStoreData('user', response.user);\n\n        this.set('app', response.app);\n        this.set('_rawResponse', response);\n\n        if (response.org && response.org._id) {\n            let org = this.setupStoreData('org', response.org);\n            // reload to load preferences\n            org.reload();\n            this.set('org', org);\n        }\n\n        const cookieProxyPerson = this.cookies.read('proxyPerson');\n        const personId = cookieProxyPerson || user.get('personGuid');\n\n        if (personId && !person) {\n            let store = this.dataStore;\n            let shouldReload = store.hasRecordForId('person', personId);\n            let promise = store\n                .find('person', personId)\n                .then(person => {\n                    if (shouldReload) {\n                        person.reload();\n                    }\n\n                    this.set('user', user);\n                    this.set('person', person);\n\n                    // Notify read-write perm handlers\n                    const deferred = this.readWritePermissionsDeferred;\n                    if (deferred) {\n                        deferred.resolve(person.get('readWritePermissions'));\n                    }\n\n                    return person;\n                })\n                .finally(() => {\n                    this.set('authInProgress', false);\n                });\n\n            return DS.PromiseObject.create({\n                promise: promise\n            });\n        }\n\n        return new RSVP.Promise(resolve => {\n            this.set('authInProgress', false);\n            if (!get(user, 'isSuper')) {\n                return resolve(person);\n            }\n            let superPerson = this.dataStore.createRecord('person', { id: 'super' });\n\n            this.set('user', user);\n            this.set('person', superPerson);\n\n            return resolve(person);\n        });\n    },\n\n    _reloadApplication: function () {\n        this.cookies.clear(this.get('application.cookies.session'));\n\n        var href = window.location.href;\n        var hashIndex = href.indexOf('#');\n        if (hashIndex > -1) {\n            href = href.substring(0, hashIndex);\n        }\n        window.location.replace(href);\n    },\n\n    /**\n     * used to load in user preferences that are required to be determined at bootstrap.\n     *\n     * @warning only add preferences here that are needed for bootstrap.\n     */\n    getPreferences: function () {\n        return Promise.all([]);\n    },\n\n    getFeatures: function (forceUpdate = false) {\n        const featureService = this.featureService;\n\n        // featureToggles is an array of all toggle keys to fetch from the backend\n        // forceUpdate bypasses the cache and forces a fresh fetch\n        return featureService\n            .getFeatureToggles(...featureToggles, forceUpdate)\n            .then(features => {\n                // Disable v1 toggles if ft key resolve true\n                if (features['ATLAS-1921_disable-v1-toggles'] === true) {\n                    this.stashLogger.info('==== V1 FEATURE TOGGLES ARE DISABLED ====');\n                    for (const [key] of Object.entries(features)) {\n                        if (v1Toggles.includes(key) && !v1WhiteList.includes(key)) {\n                            features[key] = false;\n                        }\n                    }\n                }\n\n                this.set('features', features);\n\n                // Sometimes it's nicer to just have a list of all of the enabled features\n                this.set(\n                    'enabledFeatures',\n                    Object.keys(features).filter(feature => {\n                        return features[feature];\n                    })\n                );\n            })\n            .catch(error => {\n                if (!isAbortError(error)) {\n                    this.logger.error('Could not fetch feature toggles:', {\n                        error,\n                        remoteData: {\n                            error: error\n                        }\n                    });\n                }\n                return RSVP.reject(error);\n            });\n    },\n\n    setServerTimeOffset: observer('isAuthenticated', 'clock.day', function () {\n        const BASE_URI = 'api/v2/date';\n        const CLIENT_REQUEST_TIME_DIFF = 30000; //30 sec in milliseconds; Represents the acceptable time gap on the client between t3 and t0\n\n        this.get('clock.day'); //force consumption\n\n        if (this.isAuthenticated) {\n            const t0 = moment(new Date());\n            const url = this.application.pcV2Uri(BASE_URI);\n            this.ajax\n                .raw(url)\n                .then(response => {\n                    const serverDate = response.response;\n                    const t1 = moment(serverDate.currentDate);\n                    let correlationId = null;\n                    if (response.jqXHR) {\n                        correlationId = response.jqXHR.getResponseHeader('ININ-Correlation-id');\n                    }\n                    // TODO: Pull DATE header from response to get better measure of when the\n                    // response was sent.\n                    const t2 = t1;\n                    const t3 = moment(new Date());\n                    const clientSystemTimeSuspect = t3.diff(t0) >= CLIENT_REQUEST_TIME_DIFF;\n\n                    if (clientSystemTimeSuspect) {\n                        this.set('offset', t2.diff(t3));\n                    } else {\n                        this.set('offset', (t1.diff(t0) + t2.diff(t3)) / 2); //Offset algorithm:  http://en.wikipedia.org/wiki/Network_Time_Protocol#Clock_synchronization_algorithm\n                    }\n\n                    this.logger.debug(`Session timer offset: Server time offset is ${this.offset / 1000} seconds`);\n                    this.set('sessionTimers', {\n                        serverTimet1: t1.format(),\n                        clientTimet3: t3.format(),\n                        clientTimet0: t0.format(),\n                        offsetCalculated: this.offset,\n                        clientSystemTimeSuspect,\n                        correlationId\n                    });\n                })\n                .catch(err => {\n                    this.logger.debug(\n                        'Session timer offset: An error occured when getting the server time to calculate offset. Using offset 0.',\n                        err\n                    );\n                    this.set('offset', 0);\n                });\n        } else {\n            this.set('offset', 0);\n        }\n    }),\n\n    setupCarrierPigeon() {\n        const subscription = this.presenceSubscription;\n        const pigeon = this.pigeon;\n        const channelId = this.accessToken;\n        const subscribeUrl = this.application.pcUri(`api/v2/notifications/channels/${channelId}/subscriptions`);\n        pigeon.initialize({\n            // Use public-api v2 and the access token as the channel id until realtime can use real channels\n            subscribeUrl,\n            features: this.features,\n            publicApiUser: this.publicApiUser,\n            accessToken: channelId\n        });\n\n        // application service will tell pigeon to register topics after streaming service is connected\n\n        if (isTesting) return RSVP.resolve();\n        subscription.subscribeToMyself();\n    },\n\n    /**\n     * Updates the session with public api used for things such as Download.\n     * A valid session establishment will set a cookie used for auth on certain routes.\n     */\n    updateAppSession() {\n        const url = this.application.pcV2Uri(['api/v2/apps/session']);\n        return this.ajax\n            .post(url, {\n                xhrFields: {\n                    withCredentials: true\n                },\n                headers: {\n                    Authorization: `bearer ${this.accessToken}`\n                }\n            })\n            .catch(reason => {\n                this.logger.error('Failed to obtain Apps Session', { error: reason });\n\n                // This request is allowed to fail since its only required for embeds\n                // We shouldnt break the app for that...\n                return RSVP.resolve();\n            });\n    },\n\n    refreshPublicApiUser(expand) {\n        const url = this.application.pcV2Uri('api/v2/users/me');\n        const options = {};\n\n        let baseExpands = [\n            'authorization',\n            'conversationSummary',\n            //'date'\n            'fieldConfigs',\n            'geolocation',\n            //'geolocationsettings'\n            //'locations'\n            'dateLastLogin',\n            'organization',\n            'outOfOffice',\n            'presence',\n            //'presencedefinitions'\n            //'profileSkills'\n            'routingStatus',\n            'station',\n            'token',\n            'logCapture'\n        ];\n\n        if (expand) {\n            options.data = {\n                expand: _.uniq(baseExpands.concat(expand)).join(',')\n            };\n        } else {\n            options.data = {\n                expand: baseExpands.join(',')\n            };\n        }\n\n        return this.ajax\n            .request(url, options)\n            .then(data => {\n                this.set('publicApiUser', data);\n                return data;\n            })\n            .catch(error => {\n                if (!isAbortError(error)) {\n                    console.warn('Failed to fetch purecloud user in session:', { error });\n                }\n                return RSVP.reject(error);\n            });\n    },\n\n    resetPassword(newPassword, currentPassword) {\n        let url;\n        let data;\n\n        assert('Please provide the current password', currentPassword);\n\n        url = this.application.pcV2Uri('api/v2/users/me/password');\n        data = {\n            oldPassword: currentPassword,\n            newPassword: newPassword\n        };\n\n        return this.ajax.post(url, { data });\n    },\n\n    // Forward ESA Events from internal session to this session service\n    _setupSessionInvalidationFailed: on('init', function () {\n        const session = this.session;\n        if (session) {\n            session.on('sessionInvalidationFailed', this, this._forwardSessionInvalidationFailedEvent);\n        }\n    }),\n\n    _forwardSessionInvalidationFailedEvent() {\n        this.trigger('sessionInvalidationFailed', ...arguments);\n    },\n\n    _teardownSessionInvalidationFailed: on('willDestroy', function () {\n        const session = this.session;\n        if (session) {\n            session.off('sessionInvalidationFailed', this, this._forwardSessionInvalidationFailedEvent);\n        }\n    }),\n\n    async handleUserFieldUpdated() {\n        return await this.reloadPerson();\n    },\n\n    async handleUpdateProfileImage(updatedEntityJid) {\n        const personJid = this.get('person.jid');\n        if (personJid != updatedEntityJid) {\n            return null;\n        }\n\n        return await this.reloadPerson();\n    },\n\n    async reloadPerson() {\n        const person = this.person;\n        const personId = person ? person.id : null;\n\n        if (!personId) {\n            return null;\n        }\n\n        try {\n            const store = this.dataStore;\n            const shouldReload = store.hasRecordForId('person', personId);\n            const foundPerson = await store.find('person', personId);\n\n            if (shouldReload) {\n                await foundPerson.reload();\n            }\n\n            this.set('person', foundPerson);\n\n            // Notify read-write perm handlers\n            const deferred = this.readWritePermissionsDeferred;\n            if (deferred) {\n                deferred.resolve(foundPerson.get('readWritePermissions'));\n            }\n\n            return foundPerson;\n        } catch (error) {\n            this.logger.error('Failed to update user field', { error, personId });\n            throw error;\n        }\n    }\n});\n","import { not, and, alias } from '@ember/object/computed';\nimport { Promise } from 'rsvp';\nimport { computed } from '@ember/object';\nimport { run } from '@ember/runloop';\nimport Service, { inject as service } from '@ember/service';\nimport Evented from '@ember/object/evented';\nimport BrowserUtils from 'web-directory/utils/browser';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nexport default Service.extend(Evented, LoggerMixin, {\n    intl: service(),\n    phone: service(),\n    session: service(),\n    application: service(),\n    permissions: service(),\n    directRouting: service(),\n    ajax: service(),\n\n    _isDesktop: computed('application.hostedContext', function () {\n        const context = this.get('application.hostedContext');\n        return context && context.isHosted();\n    }),\n\n    _isDesktopUnifiedPreferences: computed('application.hostedContext', function () {\n        const context = this.get('application.hostedContext');\n        if (context) {\n            return context.isHosted() && context.supportsUnifiedPreferences();\n        }\n\n        return false;\n    }),\n\n    canShowChatPreference: not('session.user.isTrustee'),\n\n    canShowAgentGreeting: and('permissions.canViewAgentGreetings', 'session.features.ACT-1205'),\n    canShowGeneralPreference: alias('_isDesktop'),\n    canShowPasswordPreference: computed(\n        'session.isAuthenticated',\n        'session.user.isTrustee',\n        'session.features.IAM-4157_new_security_page',\n        function () {\n            if (this.get('session.features.IAM-4157_new_security_page')) {\n                return false;\n            }\n\n            if (this.get('session.user.isTrustee')) {\n                return false;\n            }\n\n            return this.get('session.isAuthenticated');\n        }\n    ),\n\n    canShowNotificationsPreference: computed('_isDesktop', '_isDesktopUnifiedPreferences', function () {\n        if (BrowserUtils.isIE) {\n            return false;\n        }\n\n        const isDesktop = this._isDesktop;\n        const isUnified = this._isDesktopUnifiedPreferences;\n        return !(isDesktop && !isUnified);\n    }),\n\n    canShowVoiceMailPinPreference: and('permissions.hasVoicemailAccess', 'permissions.phoneEnabled'),\n\n    canShowDirectRoutingPreference: alias('directRouting.canViewOwnSettings'),\n\n    _commonPreferenceComponents: computed('_isDesktopUnifiedPreferences', function () {\n        const isUnified = this._isDesktopUnifiedPreferences;\n\n        return {\n            chat: 'preferences-chat',\n            general: 'preferences-general',\n            language: 'preferences-language',\n            notifications: isUnified ? 'preferences-notifications-desktop' : 'preferences-notifications',\n            password: 'change-password',\n            pin: 'change-pin',\n            sound: 'application-preferences/preferences-sound',\n            video: 'preferences-video',\n            direct_routing: 'preferences-direct-routing',\n            agent_greeting: 'agent-greeting'\n        };\n    }),\n\n    commonPreferences: computed(\n        'intl.isoLocale',\n        'canShowChatPreference',\n        'canShowGeneralPreference',\n        'canShowNotificationsPreference',\n        'canShowPasswordPreference',\n        'canShowSoundPreference',\n        'canShowVoiceMailPinPreference',\n        '_commonPreferenceComponents',\n        'canShowAgentGreeting',\n        function () {\n            const intl = this.intl;\n            const components = this._commonPreferenceComponents;\n            return [\n                {\n                    key: 'chat',\n                    name: intl.safestring('preferences.tabs.chat'),\n                    canShow: this.canShowChatPreference,\n                    component: components.chat\n                },\n                {\n                    key: 'general',\n                    name: intl.safestring('preferences.tabs.general'),\n                    canShow: this.canShowGeneralPreference,\n                    component: components.general\n                },\n                {\n                    key: 'language',\n                    name: intl.safestring('preferences.tabs.language'),\n                    canShow: true,\n                    component: components.language\n                },\n                {\n                    key: 'notifications',\n                    name: intl.safestring('preferences.tabs.notifications'),\n                    canShow: this.canShowNotificationsPreference,\n                    component: components.notifications\n                },\n                {\n                    key: 'password',\n                    name: intl.safestring('preferences.tabs.password'),\n                    canShow: this.canShowPasswordPreference,\n                    component: components.password\n                },\n                {\n                    key: 'pin',\n                    name: intl.safestring('preferences.tabs.pin'),\n                    canShow: this.canShowVoiceMailPinPreference,\n                    component: components.pin\n                },\n                {\n                    key: 'sound',\n                    name: intl.safestring('preferences.tabs.sound'),\n                    canShow: true,\n                    component: components.sound\n                },\n                {\n                    key: 'video',\n                    name: intl.safestring('preferences.tabs.video'),\n                    canShow: true,\n                    component: components.video\n                },\n                {\n                    key: 'direct_routing',\n                    name: intl.safestring('preferences.tabs.direct-routing'),\n                    canShow: this.canShowDirectRoutingPreference,\n                    component: components.direct_routing\n                },\n                {\n                    key: 'agent_greeting',\n                    name: intl.safestring('preferences.tabs.agent-greeting'),\n                    canShow: this.canShowAgentGreeting,\n                    component: components.agent_greeting\n                }\n            ];\n        }\n    ),\n\n    commonPreferencesSortOrder: computed(function () {\n        return [\n            'notifications',\n            'general',\n            'chat',\n            'password',\n            'pin',\n            'language',\n            'sound',\n            'video',\n            'direct_routing',\n            'agent_greeting'\n        ];\n    }),\n\n    customPreferences: [],\n\n    preferences: computed('commonPreferences', 'customPreferences', function () {\n        const commonPreferences = this.commonPreferences;\n        const customPreferences = this.customPreferences;\n        return [...commonPreferences, ...customPreferences];\n    }),\n\n    // <Custom Preference API>\n    addPreference(key, options) {\n        const { name, component } = options;\n        if (!(key && name && component)) {\n            throw new Error('Custom preferences require a key, name, and component name');\n        }\n        const existingPreference = this.preferences.find(preference => preference.key === key);\n        if (existingPreference) {\n            throw new Error(`Preference with key \"${key}\" already exists`);\n        }\n        const canShow = true; // otherwise remove the preference\n        const newPreference = { key, name, component, canShow };\n        this.set('customPreferences', this.customPreferences.concat(newPreference));\n    },\n\n    removePreference(key) {\n        const customPreferences = this.customPreferences;\n        const otherPreferences = customPreferences.filter(preference => preference.key !== key);\n        this.set('customPreferences', otherPreferences);\n    },\n    // </Custom Preference API>\n\n    // <Global Preferences API>\n    isOpen: false,\n\n    open() {\n        this.set('isOpen', true);\n    },\n\n    close() {\n        this.set('isOpen', false);\n    },\n\n    canOpenPreference(preferenceKey) {\n        const preferences = this.preferences;\n        const preference = preferences.find(preference => preference.key === preferenceKey);\n        return preference && preference.canShow;\n    },\n\n    openPreference(preferenceKey) {\n        return new Promise(resolve => {\n            const preferences = this.preferences;\n            const preference = preferences.find(preference => preference.key === preferenceKey);\n            if (!preference) {\n                throw new Error(`\"${preference}\" is not a valid preference name`);\n            }\n            if (!preference.canShow) {\n                throw new Error(`Preference \"${preference}\" cannot be shown`);\n            }\n            this.open();\n            run.later(() => {\n                // this delay lets the listening components open first\n                this.trigger('openPreference', preferenceKey);\n                resolve();\n            }, 100);\n        });\n    },\n\n    // common preferences access\n    openChatPreference() {\n        this.openPreference('chat');\n    },\n\n    openGeneralPreference() {\n        this.openPreference('general');\n    },\n\n    openLanguagePreference() {\n        this.openPreference('language');\n    },\n\n    openNotificationsPreference() {\n        this.openPreference('notifications');\n    },\n\n    openPasswordPreference() {\n        this.openPreference('password');\n    },\n\n    openSoundPreference() {\n        this.openPreference('sound');\n    },\n    openVideoPreference() {\n        this.openPreference('video');\n    },\n\n    openVoiceMailPinPreference() {\n        this.openPreference('pin');\n    },\n    // </Global Preferences API>\n\n    /**\n     * Gets the current value for the user's send email notifications\n     * @returns sendEmailNotifications @boolean\n     */\n    async getUserVoicemailEmailNotification() {\n        const url = this.application.pcV2Uri(`api/v2/voicemail/me/policy`);\n        try {\n            const { sendEmailNotifications } = await this.ajax.ajaxGet(url, { dataType: 'json' });\n            return sendEmailNotifications;\n        } catch (err) {\n            this.logger.error(`services/settings: error fetching user's voicemail policy`, {\n                err\n            });\n        }\n        return false;\n    },\n    /**\n     * Sets the user's send email notification value in the voicemail policy.\n     * @param {boolean} sendEmailNotifications\n     * @returns Promise\n     */\n    async setUserVoicemailEmailNotification(sendEmailNotifications) {\n        const url = this.application.pcV2Uri(`api/v2/voicemail/me/policy`);\n        return this.ajax.patch(url, {\n            data: {\n                sendEmailNotifications\n            },\n            timeout: 5000\n        });\n    }\n});\n","import Service from '@ember/service';\n\nexport default Service.extend({\n    template: null,\n    templateProps: {},\n    panelClasses: null,\n\n    headerText: null,\n    confirmText: null,\n    cancelText: null,\n\n    showHeader: true,\n    showFooter: true,\n\n    cancelAction: null,\n    confirmAction: null,\n    confirmDisabled: false,\n\n    init() {\n        this._super(...arguments);\n    },\n\n    resetSidePanel() {\n        this.setProperties({\n            template: null,\n            templateProps: {},\n            panelClasses: null,\n            headerText: null,\n            confirmText: null,\n            cancelText: null,\n            showHeader: true,\n            showFooter: true,\n            cancelAction: null,\n            confirmAction: null,\n            confirmDisabled: false\n        });\n    }\n});\n","import { dasherize } from '@ember/string';\nimport { lt, or, reads, bool, and, equal, readOnly } from '@ember/object/computed';\nimport EmberObject, { observer, computed, get, set } from '@ember/object';\nimport { run, cancel, throttle, once, bind, debounce } from '@ember/runloop';\nimport Service, { inject as service } from '@ember/service';\nimport { getOwner } from '@ember/application';\nimport Ember from 'ember';\nimport _ from 'lodash';\nimport { APP_SIDEBAR_PANEL_NAME_PREFIX } from './apps';\nimport { APPS_RELOADED_EVENT } from '../models/app-pool';\nimport { doFocus } from 'web-directory/utils/focus-management';\nimport { addPageAction } from '../utils/newrelic';\nimport { isPurecloudSource } from '../utils/presence-utils';\nimport { NOOP_TRANSITION } from 'web-directory/router';\n\nexport default Service.extend({\n    application: service(),\n    apps: service(),\n    chat: service(),\n    interaction: service(),\n    acdworkitem: service(),\n    phone: service(),\n    preferences: service(),\n    session: service(),\n    webrtc: service(),\n    permissions: service(),\n    fullscreen: service(),\n    help: service(),\n\n    /**\n     * Holds the panel value, if any, that was restored from user preferences.\n     *\n     * undefined - no restored value (e.g. not stored, pref load failure)\n     * null/empty - preference is no open sidebar panel\n     * panel name - the panel name restored from preferences at service init\n     */\n    _restoredCommunicationPanel: undefined,\n\n    communicationPanel: '',\n    communicationSidebarExpanded: false,\n    unreadCount: 0,\n    _appsUsageCount: 0,\n\n    allowedPopoutPanels: null,\n    panelExpandedState: null,\n\n    _monitoredAppPool: null,\n    _widgetApps: null,\n    _widgetAppsFailureReason: null,\n    _widgetAppsAttentionCount: reads('apps.widgetAppPool.totalAttentionCount'),\n\n    listViewActionHandler: null,\n    activateListView: false,\n    firstLoadOfAcdInteractions: null,\n\n    substates: EmberObject.create({\n        callControls: EmberObject.create({\n            currentTab: 'callHistory'\n        })\n    }),\n\n    init() {\n        this._super(...arguments);\n\n        this.set('_router', getOwner(this).lookup('router:main'));\n\n        if (this.get('session.useNewNav')) {\n            return;\n        }\n\n        this._loadStateFromPreferences();\n        this._addWindowResize();\n        this._onAppsEnvChange();\n\n        this.set('allowedPopoutPanels', []);\n        this.set('panelExpandedState', {\n            acdInteractions: true,\n            conversations: false,\n            help: false,\n            webrtc: false,\n            agentAssistance: false,\n            workitemsList: false,\n            listView: false\n        });\n\n        this.addListenerForNoopTransitions();\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        window.removeEventListener('resize', this._resizeHandler);\n        cancel(this.resizeDebounceTimer);\n    },\n\n    // TODO: Should probably renamed to indicate boolean state as we no longer render\n    // a count of active conversations\n    acdCount: computed('interaction.acdCount', 'acdworkitem.activeWorkitems', function () {\n        const acdCount = this.get('interaction.acdCount') || 0;\n        const workitemCount = this.get('acdworkitem.activeWorkitems.length') || 0;\n        return acdCount + workitemCount;\n    }),\n\n    hasActiveWorkitems: bool('acdworkitem.activeWorkitems.length'),\n    hasActiveWorkitemsWithFT: and('hasActiveWorkitems', 'enableWorkitems'),\n\n    deferAppsDisplay: lt('_appsUsageCount', 1),\n    restrictSidebar: or('application.adminUIContext', 'application.isPopout'),\n\n    showAgentAssistance: equal('communicationPanel', 'agentAssistance'),\n    showCallControls: equal('communicationPanel', 'callControls'),\n    showContactsInbox: equal('communicationPanel', 'contactsInbox'),\n    showConversations: equal('communicationPanel', 'conversations'),\n    showNotificationInbox: equal('communicationPanel', 'notificationInbox'),\n    showUser: equal('communicationPanel', 'user'),\n    showWebrtc: equal('communicationPanel', 'webrtc'),\n    showAcdInteractions: equal('communicationPanel', 'acdInteractions'),\n    showMeetings: equal('communicationPanel', 'meetings'),\n    showHelp: equal('communicationPanel', 'help'),\n    showWorkitemsList: equal('communicationPanel', 'workitemsList'),\n    showListView: equal('communicationPanel', 'listView'),\n\n    communicationOffset: computed(\n        'communicationPanel',\n        'session.isAuthenticated',\n        'showApps',\n        'enableApps',\n        function () {\n            const panel = this.communicationPanel;\n\n            if (panel && this.get('session.isAuthenticated')) {\n                let appPanelGeneralOffset = '';\n                if (this.showApps) {\n                    if (this.enableApps) {\n                        // Add a common selector for all apps\n                        appPanelGeneralOffset = 'apps-offset';\n                    } else {\n                        // No Offset - trying to restore the app panel, but apps aren't available\n                        return '';\n                    }\n                }\n\n                if (panel === 'notificationInbox') {\n                    return `action-bar-open notification-inbox-v2-offset ${appPanelGeneralOffset} ${dasherize(\n                        panel\n                    )}-offset`;\n                } else {\n                    return `action-bar-open ${appPanelGeneralOffset} ${dasherize(panel)}-offset`;\n                }\n            } else {\n                return '';\n            }\n        }\n    ),\n\n    sidebarCollapsed: computed('communicationPanel', 'communicationSidebarExpanded', function () {\n        return this.communicationPanel === '' && !this.communicationSidebarExpanded;\n    }),\n\n    sidebarExpanded: computed(\n        'communicationPanel',\n        'communicationSidebarExpanded',\n        'application.isPopout',\n        function () {\n            if (this.get('application.isPopout')) return true;\n            return this.communicationPanel !== '' && this.communicationSidebarExpanded;\n        }\n    ),\n\n    enableAgentAssistance: computed(\n        'chat.enabled',\n        'session.person.isEngageSupervisor',\n        'permissions.canGoOnQueue',\n        'permissions.canViewBusinessChat',\n        function () {\n            if (!this.get('permissions.canViewBusinessChat')) {\n                if (this.communicationPanel === 'agentAssistance') {\n                    throttle(this, this.closePanel, 200);\n                }\n                return false;\n            }\n            const isChatEnabled = this.get('chat.enabled');\n            const isEngageAgent = this.get('permissions.canGoOnQueue');\n            const isEngageSupervisor = this.get('session.person.isEngageSupervisor');\n\n            return isChatEnabled && (isEngageAgent || isEngageSupervisor);\n        }\n    ),\n\n    enableInteractions: computed('permissions.canGoOnQueue', 'acdCount', 'session.hasTrusteeAccess', function () {\n        // If we have an interaction, we should show it, otherwise, make sure we can go on queue and that we are not a trustee\n        const isEnabled =\n            this.acdCount || (this.get('permissions.canGoOnQueue') && !this.get('session.hasTrusteeAccess'));\n\n        if (!isEnabled && this.communicationPanel === 'acdInteractions') {\n            throttle(this, this.closePanel, 200);\n        }\n\n        return isEnabled;\n    }),\n\n    enableWorkitems: readOnly('permissions.canViewWorkitem'),\n\n    enableParkedConversations: readOnly('permissions.canViewParkedEmails'),\n\n    /**\n     * Computed to dictate if the apps menu item and panel should be shown.\n     *\n     * @returns true if apps are enabled (FT, browser support, etc.) and\n     * apps are available or the initial load failed and we know a user was\n     * supposed to have apps (i.e. apps panel restore from prefs)\n     */\n    enableApps: computed('_widgetApps', '_widgetAppsFailureReason', '_restoredCommunicationPanel', function () {\n        let restoredPanel = this._restoredCommunicationPanel;\n        return !!(this.get('_widgetApps.length') || (this._widgetAppsFailureReason && this._isAppPanel(restoredPanel)));\n    }),\n\n    /**\n     * Returns the id of the widget app that is currently shown; null otherwise.\n     *\n     * In this case, shown means the widget that is selected when the apps\n     * sidebar is open.\n     *\n     * @return the id of the widget app that is currently shown; null otherwise.\n     */\n    shownAppId: computed('communicationPanel', function () {\n        let result = null;\n\n        let communicationPanel = this.communicationPanel;\n        if (this._isAppPanel(communicationPanel) && communicationPanel.length > APP_SIDEBAR_PANEL_NAME_PREFIX.length) {\n            result = communicationPanel.substring(APP_SIDEBAR_PANEL_NAME_PREFIX.length);\n        }\n\n        return result;\n    }),\n\n    visibleChatRoom: computed(\n        'communicationPanel',\n        'phone.activeRoom',\n        'chat.activeRoom',\n        'webrtc.activeRoom',\n        'chat.rooms.supervisorassistance',\n        function () {\n            switch (this.communicationPanel) {\n                case 'conversations':\n                    return this.get('chat.activeRoom');\n                case 'callControls':\n                    return this.get('phone.activeRoom');\n                case 'webrtc':\n                    return this.get('webrtc.activeRoom');\n                case 'agentAssistance':\n                    return this.get('chat.rooms.supervisorassistance');\n                default:\n                    return null;\n            }\n        }\n    ),\n\n    showApps: computed('communicationPanel', function () {\n        // Should be true for 'apps-' (No selected app - sidebar icon click) and 'apps-<appId>'\n        return this._isAppPanel(this.communicationPanel);\n    }),\n\n    saveSidebarStateToPreferences: observer(\n        'communicationPanel',\n        'communicationSidebarExpanded',\n        'session.useNewNav',\n        function () {\n            if (this.get('session.useNewNav')) {\n                return;\n            }\n\n            this.preferences.setPreference(\n                'sidebar.global',\n                this.getProperties('communicationPanel', 'communicationSidebarExpanded')\n            );\n        }\n    ),\n\n    _onAppsEnvChange: observer('session.{useNewNav,isAuthenticated}', 'apps.widgetAppPool', function () {\n        if (this.get('session.useNewNav')) {\n            return;\n        }\n\n        let monitoredAppPool = this._monitoredAppPool;\n        let widgetAppPool = this.get('apps.widgetAppPool');\n\n        if (!this.get('session.isAuthenticated') || !widgetAppPool) {\n            // Apps are not applicable at this time ... stop listening and clear out props to hide apps icon\n            this.set('_widgetApps', null);\n\n            if (monitoredAppPool) {\n                monitoredAppPool.off(APPS_RELOADED_EVENT, this, '_fetchWidgetApps');\n                this.set('_monitoredAppPool', null);\n            }\n        } else if (widgetAppPool !== monitoredAppPool) {\n            if (monitoredAppPool) {\n                monitoredAppPool.off(APPS_RELOADED_EVENT, this, '_fetchWidgetApps');\n            }\n\n            widgetAppPool.on(APPS_RELOADED_EVENT, this, '_fetchWidgetApps');\n            this.set('_monitoredAppPool', widgetAppPool);\n            this._fetchWidgetApps();\n        }\n    }),\n\n    /**\n     * Sets the general apps panel or the specified app as the active sidebar panel.\n     * In additon to visibly showing the panel, will be used to restore the sidebar across application reloads\n     */\n    openAppsPanel(appId) {\n        if (this.get('session.useNewNav')) {\n            return;\n        }\n\n        this.openPanel(`${APP_SIDEBAR_PANEL_NAME_PREFIX}${appId}`);\n    },\n\n    isExpandable(panel) {\n        if (this.get('session.useNewNav')) {\n            return;\n        }\n\n        if (panel === 'conversations' && !this.get('permissions.canViewBusinessChat')) {\n            return false;\n        }\n        return (\n            panel === 'acdInteractions' ||\n            panel === 'conversations' ||\n            panel === 'help' ||\n            panel === 'webrtc' ||\n            panel === 'agentAssistance' ||\n            panel === 'workitemsList' ||\n            panel === 'listView'\n        );\n    },\n\n    togglePanelSubstate(panel, key, value) {\n        if (this.get('session.useNewNav')) {\n            return;\n        }\n\n        const subStatePanel = this.substates.get(panel);\n        if (subStatePanel) {\n            subStatePanel.set(key, value);\n\n            // Sometimes the key doesnt change, but you want the panel change to fire listeners\n            subStatePanel.notifyPropertyChange(key);\n        }\n    },\n\n    togglePanel(panel) {\n        if (this.get('session.useNewNav')) {\n            return;\n        }\n\n        if (panel === 'conversations' && !this.get('permissions.canViewBusinessChat')) {\n            return;\n        }\n\n        if (\n            (this.restrictSidebar && !this.allowedPopoutPanels.includes(panel)) ||\n            (panel === 'webrtc' && !this.get('webrtc.videoCallCapable'))\n        ) {\n            return;\n        }\n\n        if (panel === 'acdInteractions' && !isPurecloudSource(this.get('session.user.presence.source'))) {\n            return;\n        }\n\n        const prevPanel = this.communicationPanel;\n        const prevExpanded = this.communicationSidebarExpanded;\n\n        if (panel === this.communicationPanel || (this.showApps && panel === APP_SIDEBAR_PANEL_NAME_PREFIX)) {\n            this.closePanel(false);\n            this._instrumentSidebarPanel('togglePanel', {\n                prevPanel,\n                prevExpanded,\n                newPanel: '',\n                newExpanded: false\n            });\n            return;\n        }\n        if (this.firstLoadOfAcdInteractions && prevPanel === 'acdInteractions') {\n            this.set('firstLoadOfAcdInteractions', false);\n        }\n\n        this.openPanel(panel, false);\n\n        if (panel === 'workitemsList' || panel === 'listView') {\n            this.expandCommunicationSidebar();\n            if (this.get('permissions.canViewParkedEmails')) {\n                this.set('activateListView', true);\n                this.listViewActionHandler();\n            }\n            return;\n        }\n\n        let newExpanded = false;\n        if (\n            panel === 'conversations' ||\n            panel === 'acdInteractions' ||\n            panel === 'webrtc' ||\n            panel === 'help' ||\n            panel === 'agentAssistance' ||\n            panel === 'workitemsList' ||\n            panel === 'listView'\n        ) {\n            if (this.get(`panelExpandedState.${panel}`)) {\n                this.expandCommunicationSidebar();\n                newExpanded = true;\n                if (this.get('permissions.canViewParkedEmails')) {\n                    this.set('activateListView', true);\n                    this.listViewActionHandler();\n                }\n            } else {\n                this.minimizeCommunicationSidebar();\n            }\n        } else {\n            this.minimizeCommunicationSidebar();\n        }\n\n        this._instrumentSidebarPanel('togglePanel', {\n            prevPanel,\n            prevExpanded,\n            newPanel: panel,\n            newExpanded\n        });\n        this.checkThresholds();\n    },\n\n    /**\n     * Prevent the parked conversation router from restarting when being navigated away to a different view.\n     * @param handler Function to trigger setActiveView when the list view button is interacted.\n     */\n    registerListViewActionHandler(handler) {\n        if (this.get('session.useNewNav')) {\n            return;\n        }\n\n        if (this.get('permissions.canViewParkedEmails')) {\n            this.set('listViewActionHandler', handler);\n        }\n    },\n\n    openPanel(panel, instrumentCall = true) {\n        if (this.get('session.useNewNav')) {\n            return;\n        }\n\n        if (panel === 'conversations' && !this.get('permissions.canViewBusinessChat')) {\n            return;\n        }\n\n        if (this.restrictSidebar && !this.allowedPopoutPanels.includes(panel)) {\n            return;\n        }\n\n        const prevPanel = this.communicationPanel;\n        this.set('communicationPanel', panel);\n        if (instrumentCall) {\n            this._instrumentSidebarPanel('openPanel', { prevPanel, newPanel: panel });\n        }\n        this.checkThresholds();\n\n        if (this._isAppPanel(panel)) {\n            this.incrementProperty('_appsUsageCount');\n        }\n\n        if (this.get('fullscreen.isFullScreen')) {\n            this.fullscreen.endFullScreen();\n        }\n        const focusTarget = '.action-panel:not(.hidden-panel)';\n        doFocus(Ember, focusTarget);\n    },\n\n    closePanel(instrumentCall = true) {\n        if (this.get('session.useNewNav')) {\n            return;\n        }\n\n        if (instrumentCall) {\n            this._instrumentSidebarPanel('closePanel', { prevPanel: this.communicationPanel, newPanel: '' });\n        }\n        this.setProperties({\n            communicationPanel: '',\n            communicationSidebarExpanded: false\n        });\n    },\n\n    toggleCommunicationSidebarExpanded() {\n        if (this.get('session.useNewNav')) {\n            return;\n        }\n\n        const currExpanded = this.communicationSidebarExpanded;\n        if (currExpanded) {\n            this.minimizeCommunicationSidebar();\n        } else {\n            this.expandCommunicationSidebar();\n        }\n        this._instrumentSidebarPanel('togglePanelExpanded', {\n            prevExpanded: currExpanded,\n            newExpanded: !currExpanded\n        });\n        this.checkThresholds();\n    },\n\n    setCommunicationSidebarState(state) {\n        if (this.get('session.useNewNav')) {\n            return;\n        }\n\n        this.set('communicationSidebarExpanded', state);\n        const panel = this.communicationPanel;\n        if (panel) {\n            this.set(`panelExpandedState.${panel}`, state);\n\n            // Prevent parked conversation router from restarting when listView is the initial active view\n            if (this.get('permissions.canViewParkedEmails') && this.listViewActionHandler) {\n                this.listViewActionHandler();\n            }\n        }\n    },\n\n    expandCommunicationSidebar() {\n        once(this, this.setCommunicationSidebarState, true);\n    },\n\n    minimizeCommunicationSidebar() {\n        once(this, this.setCommunicationSidebarState, false);\n    },\n\n    ensureRouteVisibility() {\n        if (this.get('session.useNewNav')) {\n            return;\n        }\n\n        const panel = this.communicationPanel;\n        if (this.firstLoadOfAcdInteractions && panel === 'acdInteractions') {\n            this.set('firstLoadOfAcdInteractions', false);\n            return;\n        }\n        if (this.isExpandable(panel)) {\n            const isWorkitemsListPanel = 'workitemsList' === panel;\n            const isListViewPanel = 'listView' === panel;\n\n            if (this._isBelowWidthThreshold() || isWorkitemsListPanel || isListViewPanel) {\n                this.closePanel();\n                this._instrumentSidebarPanel('ensureRouteVisibility', { op: 'sidebarClosed' });\n            } else {\n                const panelExpanded = this.communicationSidebarExpanded;\n                this.minimizeCommunicationSidebar();\n                this._instrumentSidebarPanel('ensureRouteVisibility', {\n                    op: panelExpanded ? 'sidebarMinimized' : 'noOp'\n                });\n            }\n        }\n    },\n\n    checkThresholds() {\n        // Two async paths reach here after teardown: the 250ms resize debounce armed in\n        // _addWindowResize, and the afterRender callback scheduled from _loadStateFromPreferences\n        // (which checks for destruction before scheduling but not inside the callback). Guarding\n        // here covers every caller rather than each scheduling site.\n        if (this.isDestroying || this.isDestroyed) {\n            return;\n        }\n\n        if (this.get('session.useNewNav')) {\n            return;\n        }\n\n        const panel = this.communicationPanel;\n        if (this._isBelowWidthThreshold() && this.isExpandable(panel)) {\n            const panelExpanded = this.communicationSidebarExpanded;\n            this.expandCommunicationSidebar();\n            if (!panelExpanded) {\n                this._instrumentSidebarPanel('checkThresholds', { op: 'sidebarExpanded' });\n            }\n        }\n\n        // Container teardown destroys services in cache order, so `application` can already be\n        // destroyed while this service is not. Writing to it then raises \"calling set on destroyed\n        // object\", which lands as an uncaught error between tests instead of a test failure.\n        const application = this.application;\n        if (application && !application.isDestroying && !application.isDestroyed) {\n            set(application, 'belowMobileThreshold', this._isBelowMobileThreshold());\n        }\n    },\n\n    addListenerForNoopTransitions() {\n        if (this.get('session.useNewNav')) {\n            return;\n        }\n\n        const router = this._router;\n        if (router) {\n            router.on(NOOP_TRANSITION, () => {\n                this.ensureRouteVisibility();\n            });\n        }\n    },\n\n    _fetchWidgetApps() {\n        // findAllApps will only fail on initial load, otherwise, this method is called in response to a successful reload\n        this.get('apps.widgetAppPool')\n            .findAllApps()\n            .then(\n                widgetApps => {\n                    this.set('_widgetApps', widgetApps);\n                    this.set('_widgetAppsFailureReason', null);\n                },\n                reason => {\n                    console.error('Failed to fetch widget apps for sidebar', { error: reason });\n                    this.set('_widgetApps', null);\n                    this.set('_widgetAppsFailureReason', reason || true);\n                }\n            );\n    },\n\n    _loadStateFromPreferences() {\n        if (!this.get('application.adminUIContext') && !this.get('application.isPopout')) {\n            let canDisplayVideoPanel = true;\n            this.preferences\n                .getPreference('sidebar.global')\n                .then(preferences => {\n                    if (!preferences || this.isDestroyed || this.isDestroying) {\n                        return;\n                    }\n\n                    let restoredPanel = get(preferences, 'communicationPanel');\n\n                    if (restoredPanel === 'conversations' && !this.get('permissions.canViewBusinessChat')) {\n                        restoredPanel = '';\n                    }\n\n                    if (restoredPanel === 'acdInteractions') {\n                        this.set('firstLoadOfAcdInteractions', true);\n                        set(preferences, 'communicationSidebarExpanded', true);\n                    }\n\n                    if (this._isAppPanel(restoredPanel)) {\n                        this.incrementProperty('_appsUsageCount');\n                    }\n\n                    if (restoredPanel === '') {\n                        set(preferences, 'communicationSidebarExpanded', false);\n                    }\n\n                    this.set('_restoredCommunicationPanel', restoredPanel);\n                    this.setProperties(preferences);\n                })\n                .catch(e => {\n                    if (!this.isDestroying && !this.isDestroyed) {\n                        console.error('Error getting preference:', { error: e });\n                    }\n                })\n                .finally(() => {\n                    if (!this.isDestroying && !this.isDestroyed) {\n                        // Defer this check until afterRender to maximize chances all sidebar layout is complete\n                        // This should be moved into a sidebar component long-term\n                        if (canDisplayVideoPanel) {\n                            run.scheduleOnce('afterRender', () => this.checkThresholds());\n                        } else {\n                            this.closePanel();\n                        }\n                    }\n                });\n        }\n    },\n\n    _addWindowResize() {\n        if (!this.get('application.adminUIContext')) {\n            const resizeHandler = bind(this, function () {\n                const timer = debounce(this, this.checkThresholds, 250);\n                this.set('resizeDebounceTimer', timer);\n            });\n            this.set('_resizeHandler', resizeHandler);\n            window.addEventListener('resize', resizeHandler);\n        }\n    },\n\n    _isBelowWidthThreshold() {\n        return window.innerWidth < 1280;\n    },\n\n    _isBelowMobileThreshold() {\n        return window.innerWidth < 1200;\n    },\n\n    _isAppPanel(panel) {\n        return _.startsWith(panel, APP_SIDEBAR_PANEL_NAME_PREFIX);\n    },\n\n    instrumentSidebarPanel(sidebarChangeType, additionalData = {}) {\n        if (this.get('session.useNewNav')) {\n            return;\n        }\n\n        this._instrumentSidebarPanel(sidebarChangeType, additionalData);\n    },\n\n    _instrumentSidebarPanel(sidebarChangeType, additionalData = {}) {\n        const sidebarData = {\n            currPanel: this.communicationPanel,\n            // Heads up: can get set via run.once, so, not guaranteed to be correct in all events\n            currExpanded: this.communicationSidebarExpanded\n        };\n\n        const router = this._router;\n        if (router) {\n            sidebarData.currRouteName = get(router, 'currentRouteName');\n        }\n\n        const activeInteractions = this.get('interaction.activeInteractions') || [];\n        const interactionData = {\n            totalInteractionCount: activeInteractions.length\n        };\n        activeInteractions.forEach(curr => {\n            const currInteractionType = curr.get('type');\n            if (currInteractionType) {\n                const propName = `${currInteractionType}InteractionCount`;\n                if (interactionData[propName]) {\n                    interactionData[propName]++;\n                } else {\n                    interactionData[propName] = 1;\n                }\n            }\n        });\n        const selectedInteraction = this.get('interaction.selectedInteraction');\n        if (selectedInteraction) {\n            interactionData.selectedInteractionId = get(selectedInteraction, 'id');\n            interactionData.selectedInteractionType = get(selectedInteraction, 'type');\n        }\n\n        const contextualHelpAnchor = this.get('help.contextualHelpAnchor');\n        if (contextualHelpAnchor) {\n            this.set('help.contextualHelpAnchor', undefined);\n        }\n\n        const evtPayload = Object.assign({ sidebarChangeType }, sidebarData, interactionData, additionalData);\n        addPageAction('sidebarStateChange', evtPayload);\n    }\n});\n","import { observer } from '@ember/object';\nimport { on } from '@ember/object/evented';\nimport Service, { inject as service } from '@ember/service';\nimport Ember from 'ember';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport { Howl } from 'howler';\nimport merge from 'lodash/merge';\nimport partial from 'lodash/partial';\nimport { A } from '@ember/array';\nimport { addPageAction } from 'web-directory/utils/newrelic';\n\nexport default Service.extend(LoggerMixin, {\n    application: service(),\n    session: service(),\n\n    sounds: {},\n    ringtones: A([]),\n    phoneRinging: false,\n    digitalRinging: false,\n    digitalSoundId: 'digital',\n\n    onAuthenticated: on(\n        'init',\n        observer('session.isAuthenticated', function () {\n            if (this.get('session.isAuthenticated')) {\n                this.initSounds();\n            }\n        })\n    ),\n\n    maybeLog() {\n        this.logger.debug(...arguments);\n    },\n\n    handleForceStopRinging(self, soundId) {\n        addPageAction('voiceRingtoneEvent', {\n            action: 'forceStopRinging',\n            soundId\n        });\n        self.maybeLog('sound:howler onplay event: Ringing should be stopped. Force stopping ringing', {\n            soundId\n        });\n        self.stopSound(soundId);\n    },\n\n    onPlay(self, soundId) {\n        self.maybeLog(`sound:howler onplay event: sound playing`, {\n            source: this._src,\n            soundId\n        });\n\n        const shouldHandleDigital = soundId === 'digital' && !self.get('digitalRinging');\n        const shouldHandlePhone = (soundId === 'phone' || self.isRingtone(soundId)) && !self.get('phoneRinging');\n        if (shouldHandleDigital || shouldHandlePhone) {\n            self.handleForceStopRinging(self, soundId);\n        }\n    },\n\n    onStop(self, soundId) {\n        self.maybeLog(`sound:howler onstop event: Stopping Ringing`, {\n            soundId\n        });\n    },\n\n    createSound(id, urls, extraOptions = {}) {\n        const defaultOptions = {\n            src: urls,\n            loop: false,\n            html5: true\n        };\n\n        const options = merge({}, defaultOptions, extraOptions);\n        this.sounds[id] = new Howl(options);\n\n        if (id === 'phone' || id === 'digital' || this.isRingtone(id)) {\n            this.sounds[id].on('play', partial(this.onPlay, this, id));\n            this.sounds[id].on('stop', partial(this.onStop, this, id));\n        }\n\n        return this.sounds[id];\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        this.sounds['phone'].off('play');\n        this.sounds['phone'].off('stop');\n    },\n\n    init() {\n        this._super(...arguments);\n    },\n\n    initSounds() {\n        const urlPrefix = this.get('application.urlprefix');\n\n        this.createSound('chat', [\n            urlPrefix + 'assets/sounds/chat-notification.mp3',\n            urlPrefix + 'assets/sounds/chat-notification.aac',\n            urlPrefix + 'assets/sounds/chat-notification.ogg'\n            // urlPrefix + 'assets/sounds/chat-notification.wav'\n        ]);\n\n        this.createSound('interaction', [\n            urlPrefix + 'assets/sounds/chat-notification.mp3',\n            urlPrefix + 'assets/sounds/chat-notification.aac',\n            urlPrefix + 'assets/sounds/chat-notification.ogg'\n            // urlPrefix + 'assets/sounds/chat-notification.wav'\n        ]);\n\n        this.createSound(\n            'phone',\n            [\n                urlPrefix + 'assets/sounds/phone-ringtone.mp3',\n                urlPrefix + 'assets/sounds/phone-ringtone.aac',\n                urlPrefix + 'assets/sounds/phone-ringtone.ogg'\n                // urlPrefix + 'assets/sounds/phone-ringtone.wav'\n            ],\n            {\n                loop: true\n            }\n        );\n\n        // sound acquired from: https://www.freesound.org/people/rhodesmas/sounds/322895/ licensed under cc-attribution\n        this.createSound('hangup', [\n            urlPrefix + 'assets/sounds/disconnect.mp3',\n            urlPrefix + 'assets/sounds/disconnect.aac',\n            urlPrefix + 'assets/sounds/disconnect.ogg'\n        ]);\n\n        // webrtc softphone dialpad (non-dtmf)\n        // sound acquire from: https://www.freesound.org/people/Gorky173/sounds/169191/ licensed uder cc-attribution\n        this.createSound(\n            'softphone',\n            [\n                urlPrefix + 'assets/sounds/softphonedialpad.mp3',\n                urlPrefix + 'assets/sounds/softphonedialpad.aac',\n                urlPrefix + 'assets/sounds/softphonedialpad.ogg'\n            ],\n            { volume: 0.2 }\n        );\n\n        // Alerting sound for non call interactions\n        this.createSound(\n            'digital',\n            [\n                urlPrefix + 'assets/sounds/digital-ringtone.mp3',\n                urlPrefix + 'assets/sounds/digital-ringtone.aac',\n                urlPrefix + 'assets/sounds/digital-ringtone.ogg'\n            ],\n            { loop: true }\n        );\n\n        // Alerting sound for auto answer, same as digital with no looping\n        this.createSound('digital-no-repeat', [\n            urlPrefix + 'assets/sounds/digital-ringtone.mp3',\n            urlPrefix + 'assets/sounds/digital-ringtone.aac',\n            urlPrefix + 'assets/sounds/digital-ringtone.ogg'\n        ]);\n    },\n\n    playSound(soundId, volume, outputDeviceId = null) {\n        const sound = this.sounds[soundId];\n        const embeddedMute =\n            this.get('application.isInteractionPopout') || this.get('application.isScreenRecordingPopout');\n\n        if ((soundId === 'phone' || soundId === 'digital' || this.isRingtone(soundId)) && embeddedMute) {\n            return;\n        }\n\n        this.maybeLog(`sound:howler playSound`, {\n            soundId\n        });\n\n        if (sound && !Ember.testing) {\n            sound.seek(0);\n            if (volume !== undefined) {\n                sound.volume(volume);\n            } else {\n                sound.volume(1);\n            }\n\n            if (outputDeviceId) {\n                sound.setOutputDevice(outputDeviceId);\n            }\n\n            sound.play();\n        }\n        if (this.isRingtone(soundId) || soundId === 'phone') {\n            this.set('phoneRinging', true);\n        } else if (soundId === 'digital') {\n            this.set('digitalRinging', true);\n        }\n    },\n\n    stopSound(soundId) {\n        this.maybeLog(`sound:howler stopSound`, {\n            soundId\n        });\n        if (this.sounds[soundId]) {\n            this.sounds[soundId].stop();\n            if (this.isRingtone(soundId) || soundId === 'phone') {\n                this.set('phoneRinging', false);\n            } else if (soundId === 'digital') {\n                this.set('digitalRinging', false);\n            }\n        }\n    },\n\n    isRinging() {\n        const ringtones = this.ringtones;\n        const sound = this.sounds['phone'];\n        return (sound && sound.playing()) || ringtones.some(ringtone => ringtone.options.playing());\n    },\n\n    playRingtone(volume, outputDeviceId, ringtoneSelectionId = 'phone') {\n        this.playSound(ringtoneSelectionId, volume, outputDeviceId);\n    },\n\n    playDigitalRingtone(volume, outputDeviceId) {\n        this.playSound(this.digitalSoundId, volume, outputDeviceId);\n    },\n\n    stopRingtone(soundId = 'phone') {\n        this.stopSound(soundId);\n    },\n\n    isRingtone(soundId) {\n        const ringtones = this.ringtones;\n        return ringtones.some(ringtone => soundId === ringtone.id);\n    }\n});\n","/* eslint no-console: \"off\" */\n\n/**\n * Welcome to the stash-logger service. This service is responsible for logging data locally to your console as well\n * as gathering logs to send to Sumo. There are a couple rules, though.\n *\n * In order to ensure that customer data does not flow into Sumo, all logging that is intended to leave\n * a customer's machine is opt-in. We will not send any object information up to Sumo unless you wrap it\n * in a specific key.\n *\n * If you tend to log data in the usual manner:\n * [\n *  \"Bunch of descriptive information\",\n *  { ... some data in an object ... }\n * ]\n * What will be sent to Sumo will only be: \"Bunch of descriptive information\"\n *\n * If you wish to send an object of information, you need to use a specific key, \"remoteData\":\n * [\n *  \"Bunch of description information\",\n *  {\n *   remoteData: {\n *     data: \"Data\"\n *   }\n *  }\n * ]\n * The data that will be sent will be the string AND everything in the remoteData object.\n *\n * Do you need to send customer data? Really? If so, PLEASE mark it as sensitive. You do this by including that data\n * under the \"sensitive\" key. For example:\n * [\n *  \"Bunch of description information\",\n *  {\n *   remoteData: {\n *    data: \"Data\",\n *    sensitive: {\n *     data: \"Data\"\n *    }\n *   }\n *  }\n * ]\n * The sensitive data will be wrapped with GCPII[] in order to be hashed by Sumo hashing rules. Any questions? Reach\n * out to the Web UI team.\n */\n\nimport RSVP, { resolve } from 'rsvp';\nimport { A } from '@ember/array';\n\nimport { computed, observer } from '@ember/object';\nimport Service, { inject as service } from '@ember/service';\n\nimport { typeOf } from '@ember/utils';\nimport { isAbortError, isAjaxError } from 'ember-ajax/errors';\nimport { task, timeout } from 'ember-concurrency';\nimport uuid from 'uuid';\nimport { isTesting } from 'web-directory/utils/testing';\nimport config from '../config/environment';\nimport moment from '../utils/dates';\nimport ExponentialIntervalGenerator from '../utils/exponential-interval-generator';\nimport { extractRawData } from '../utils/objects';\n\nconst DEBUG = true;\nconst LOG_LEVELS = ['trace', 'log', 'debug', 'info', 'warn', 'error'];\n\nconst TRUNCATED_TRACE_MESSAGE = 'TRUNCATED LOG: ';\nexport const APP_NAME = 'collaborate-ui';\nconst LOG_INTERVAL = 2000;\nconst MAX_LOG_INTERVAL = 30000;\nconst MAX_LOG_SIZE = 14500;\nconst SERVER_LOG_LEVEL = 'warn';\nconst GLOBAL_ERROR = /Global Error Caught/;\n// strings equality regex by item (string), item.message (item is object) or JSON.stringify(item) (item is object)\n// or by matcher function\n// i.e.,\n// 'someLog' will filter 'someLog' or { message: 'someLog' }. Will not filter 'someLog with more info'.\n// /someLog.*/ will filter 'someLog', 'someLog with more info', or { message: 'someLog with info' }\n// (item) => item && item.status === 0 && item.statusText === 'error' will filter { status: \"0\", statusText: 'error' } regardless of property order\n// DO NOT USE STATEFUL REGEXES - no /g flag\nconst SILENCED_ERRORS = [\n    /TransitionAborted/,\n    /Request Cancelled/,\n    /Request cancelled/, // PCUI-132\n    /Undefined intl key/,\n    /Error encountered while ensuring trace data is clean/, // PCM-1574\n    /ResizeObserver loop limit exceeded/,\n\n    /safeScroll/,\n    /_scrollToBottom called before DOM insertion/,\n    /The ajax operation was aborted/, // PCUI-131\n    /SEARCHPANE: Search Failed:/, // PCUI-132\n    /Failed to execute 'removeChild' on 'Node': The node to be removed is not a child of this node./, // https://github.com/yapplabs/ember-tether/issues/35\n    /Uncaught Error: only one instance of babel-polyfill is allowed/,\n    /Error getting timeOffRequests/, // PCUI-135\n    /Failed to fetch time off requests:/, // PCUI-135\n    /Script error\\./, // PCUI-138\n    /^TimeoutPromise.*/, // PCUI-133\n    /You do not belong to any management unit/,\n    /supervisorassistance/, // PCUI-134\n    /Request was rejected because user is not permitted to perform/, // PCUI-137\n    item => item && item.status === '0' && (item.statusText === 'error' || item.statusText === 'abort'), // PCUI-136\n    item => isAbortError(item), // PCUI-136\n    (item, all, isLocal) => all.length > 1 && all[0] === 'Failed to obtain Apps Session' && isLocal\n];\n\n// http://stackoverflow.com/questions/5515869/string-length-in-bytes-in-javascript\nconst lengthInUtf8Bytes = function (str) {\n    // Matches only the 10.. bytes that are non-initial characters in a multi-byte sequence.\n    const m = encodeURIComponent(str).match(/%[89ABab]/g);\n    return str.length + (m ? m.length : 0);\n};\n\nexport default Service.extend({\n    MAX_INTERNAL_LOG_ITEMS: 1000,\n    internalLogs: [],\n\n    logCounts: null,\n    failureCount: 0,\n\n    _originalLogger: console, // Ember Logger has been deprecated\n    application: service(),\n    session: service(),\n    conversation: service(),\n    interaction: service(),\n    sidebar: service(),\n    conversationTimelineLogger: service(),\n\n    init() {\n        this._super(...arguments);\n        this.set('exponentialBackoff', new ExponentialIntervalGenerator(LOG_INTERVAL, MAX_LOG_INTERVAL));\n        this.set('logs', []);\n        this.set('internalLogs', A([]));\n        this.set('logCounts', {});\n        this.set('clientSessionId', uuid.v4());\n        LOG_LEVELS.forEach(level => this.set(`logCounts.${level}`, 0));\n        this.bindLogMethods();\n        this.resetLogLimit();\n    },\n\n    loggingOptions: computed(\n        'session.org.orgPreferences.loggerOptions',\n        'session.features.{AURA-763_enableThrottlingMonitoringPerfTrace}',\n        function () {\n            let items = [\n                {\n                    topic: 'service:webrtc',\n                    serverLevel: 'info',\n                    localLevel: 'debug'\n                },\n                {\n                    topic: 'webrtc',\n                    serverLevel: 'info',\n                    localLevel: 'debug'\n                },\n                {\n                    regex: 'RtcSession Log', // OPTIONAL if topic is provided.\n                    propertyToMatch: 'kind', // OPTIONAL. ignored if no regex. if excluded, it will match on the logged string or the message property of the logged object(s)\n                    localLevel: 'debug'\n                },\n                {\n                    regex: 'webrtc',\n                    localLevel: 'debug'\n                },\n                {\n                    regex: /^Running\\sin\\smedia\\shelper\\smode$/,\n                    serverLevel: 'info',\n                    localLevel: 'info'\n                },\n                {\n                    regex: /^SERVOPS-33410/,\n                    serverLevel: 'debug',\n                    localLevel: 'debug'\n                },\n                {\n                    regex: /^\\[MonitoringService\\]/,\n                    // Dynamic serverLevel based on feature toggle - if enabled, use 'info', otherwise use undefined to prevent server logging\n                    serverLevel: this.get('session.features.AURA-763_enableThrottlingMonitoringPerfTrace')\n                        ? 'info'\n                        : undefined,\n                    localLevel: 'debug'\n                }\n\n                // EXAMPLE:\n                // {\n                //     topic: 'service:webrtc',    // OPTIONAL\n                //     regex: 'RECORDINGS',   // OPTIONAL if topic is provided. If adding through orgPrefs, use a simple string without the surrounding slashes.\n                //     propertyToMatch: 'message', // OPTIONAL. ignored if no regex. if excluded, it will match on the logged string or the message property of the logged object(s)\n                //     serverLevel: 'info',\n                //     localLevel: 'debug'\n                // }\n            ];\n\n            const options = this.get('session.org.orgPreferences.loggerOptions');\n            if (options && options.length) {\n                items = items.concat(options);\n            }\n\n            items.forEach(item => {\n                if (typeof item.regex === 'string') {\n                    item.regex = new RegExp(item.regex);\n                }\n            });\n\n            return items;\n        }\n    ),\n\n    bindLogMethods() {\n        LOG_LEVELS.forEach(level => {\n            this[level] = this.bufferLog.bind(this, level, 'logger:general');\n        });\n    },\n\n    getOriginalLogger() {\n        return this._originalLogger;\n    },\n\n    // Scope is the object that JSON.stringify is turning into a string.\n    restrictedTypeConverter(key, item) {\n        if (item == null) {\n            return item;\n        }\n\n        if (isAjaxError(item)) {\n            const application = this.application;\n            const sidebar = this.sidebar;\n            return {\n                name: item.name,\n                message: item.message,\n                stack: item.stack,\n                currentRoute: application.get('currentRouteName'),\n                sidebarPanel: sidebar.get('communicationPanel'),\n                timeSinceLogin: moment().diff(application.get('session._timeAuthenticated'))\n            };\n        } else if (item instanceof Error) {\n            const application = this.application;\n            const sidebar = this.sidebar;\n            return {\n                name: item.name,\n                stack: item.stack,\n                currentRoute: application.get('currentRouteName'),\n                sidebarPanel: sidebar.get('communicationPanel'),\n                timeSinceLogin: moment().diff(application.get('session._timeAuthenticated'))\n            };\n        } else {\n            return item;\n        }\n    },\n\n    fullTypeConverter(key, item) {\n        if (item == null) {\n            return item;\n        }\n\n        if (item instanceof Error) {\n            const application = this.application;\n            const sidebar = this.sidebar;\n            return {\n                name: item.name,\n                message: item.message,\n                stack: item.stack,\n                errors: item.errors,\n                payload: item.payload,\n                currentRoute: application.get('currentRouteName'),\n                sidebarPanel: sidebar.get('communicationPanel'),\n                timeSinceLogin: moment().diff(application.get('session._timeAuthenticated'))\n            };\n        } else {\n            return item;\n        }\n    },\n\n    createTrace(level, topic, logItem) {\n        if (logItem === null || logItem === undefined) {\n            throw new Error('You must log a value and/or context; attempted to log null or undefined');\n        }\n\n        // try default json stringify, if it fails, log the error\n        let itemToLog = logItem;\n        try {\n            JSON.stringify(logItem);\n        } catch (err) {\n            itemToLog = err;\n        }\n\n        const type = typeof itemToLog;\n        const isError = type === 'object' && itemToLog instanceof Error;\n        if (!isError && (type === 'array' || type === 'object')) {\n            try {\n                itemToLog = this._restrictTraceData(itemToLog);\n\n                // After stripped, we want readable client logs so when they are exported\n                // by the customer, we can accurately read them\n                this._originalLogger[level].call(\n                    this._originalLogger,\n                    JSON.stringify(logItem, this.fullTypeConverter.bind(this))\n                );\n            } catch (error) {\n                this._originalLogger[level].call(this._originalLogger, 'Error parsing log item', {\n                    error,\n                    itemToLog\n                });\n                itemToLog = ['Error encountered while ensuring trace data is clean', error.message];\n            }\n        } else if (!isError) {\n            this._originalLogger[level].call(this._originalLogger, 'Log item in bad format', {\n                itemToLog\n            });\n            itemToLog = ['Log item was not in the expected data format'];\n        } else {\n            // Errors should be parsed out by the typeConverter later\n            itemToLog = { error: logItem };\n        }\n\n        const clientTime = moment().toISOString();\n        let message;\n        try {\n            message = JSON.stringify(\n                {\n                    clientTime,\n                    log: itemToLog,\n                    clientSessionId: this.clientSessionId\n                },\n                this.restrictedTypeConverter.bind(this)\n            );\n        } catch (err) {\n            message = `Error serializing log data: ${err.message}`;\n            level = 'error';\n        }\n\n        return {\n            topic: `${APP_NAME}.${topic}`,\n            level: level.toUpperCase(),\n            time: clientTime,\n            message\n        };\n    },\n\n    /**\n     * Restrict log data to format that will ensure customer data is only sent when the\n     * consumer has opted-in\n     * @param {Array} itemToLog - an array with a string description as the first element and an object of data as the second\n     * @throws\n     * @returns a restricted version of itemToLog array\n     */\n    _restrictTraceData(itemToLog) {\n        const remoteDataKey = 'remoteData';\n        if (\n            typeof itemToLog === 'string' ||\n            typeof itemToLog === 'number' ||\n            (Array.isArray(itemToLog) && itemToLog.length === 0)\n        ) {\n            return itemToLog;\n        }\n        if (!Array.isArray(itemToLog) || typeof itemToLog[0] !== 'string') {\n            throw new Error('Log data was in an unexpected format');\n        }\n        try {\n            // First we remove everything except for our blessed data\n            let allowedKeys = [remoteDataKey, 'activeConversations'];\n            let [message, data, conversationIds] = itemToLog;\n\n            // Just a plain message, e.g. logger.error(\"Got an error\")\n            if (!data) {\n                return [message];\n            }\n\n            // The usual message, e.g. logger.error(\"Got an error\", { ... data ... })\n            // Filter out everything that is not under the remoteDataKey\n            let keyFilter = (path, key) => {\n                return allowedKeys.includes(key) || allowedKeys.includes(path[0]);\n            };\n\n            // `extractRawData` only accepts null/undefined/array/object/instance and throws for\n            // other types (Date, moment, RegExp, Error, boolean, number, etc.). Callers sometimes\n            // pass such a value as the data arg (e.g. `logger.warn(msg, someError)`), which\n            // previously threw and dropped the entire log line (\"Error parsing log item\"). Coerce\n            // any non-extractable data into a safe plain object so the log still gets through.\n            data = extractRawData(this._coerceToExtractable(data), {\n                maxDepth: 5,\n                keyFilter\n            });\n\n            if (typeof conversationIds !== 'object' || Array.isArray(conversationIds)) {\n                conversationIds = {};\n            }\n\n            // Check the rest of the data, it might contain conversation ids\n            // but we filter out EVERYTHING else\n            conversationIds = extractRawData(this._coerceToExtractable(conversationIds), {\n                maxDepth: 2,\n                keyFilter\n            });\n\n            if (data[remoteDataKey]) {\n                data[remoteDataKey] = this._augmentSensitiveData(data[remoteDataKey]);\n            }\n\n            let finalLogItem = [message, data, conversationIds].filter(elem => {\n                // Strings, arrays\n                if (Object.prototype.hasOwnProperty.call(elem, 'length')) {\n                    return elem.length > 0;\n                }\n                return Object.keys(elem).length > 0;\n            });\n\n            return finalLogItem;\n        } catch (error) {\n            throw error;\n        }\n    },\n\n    /**\n     * Coerce a log-data value into a type that `extractRawData` can process.\n     * `extractRawData` accepts only null/undefined/array/object/Ember instances and throws for\n     * everything else (Date, moment, RegExp, Error, boolean, number, string, etc.). For those\n     * non-extractable types we wrap the value in a plain object so the log line is preserved\n     * instead of being dropped. null/undefined/array/object are returned unchanged.\n     * @param {*} value - the raw log-data value\n     * @returns {null|undefined|Array|object} a value safe to pass to extractRawData\n     */\n    _coerceToExtractable(value) {\n        if (value === null || value === undefined) {\n            return value;\n        }\n\n        // extractRawData only accepts arrays, plain objects, and Ember instances at the top level.\n        // moment is detected as an object by Ember's typeOf but is rejected by extractRawData.\n        const type = value instanceof moment ? 'moment' : typeOf(value);\n        if (type === 'array' || type === 'object' || type === 'instance') {\n            return value;\n        }\n\n        // Errors/Events are objects but extractRawData filters Error values; convert to a plain\n        // object so the message/name/stack are preserved in the log.\n        if (value instanceof Error) {\n            return {\n                name: value.name,\n                message: value.message,\n                stack: value.stack\n            };\n        }\n\n        // Everything else (date, moment, regexp, boolean, number, string, symbol, etc.) is wrapped\n        // in a plain object so the log line survives instead of throwing and being dropped.\n        return { value: type === 'symbol' ? value.toString() : String(value) };\n    },\n\n    _augmentSensitiveData(remoteData) {\n        if (!remoteData) {\n            return;\n        }\n        if (!remoteData.sensitive) {\n            return remoteData;\n        }\n        let sensitive = remoteData.sensitive;\n        let wrappedSensitive;\n        if (typeof sensitive !== 'object') {\n            wrappedSensitive = `GCPII[${sensitive.toString()}]`;\n        } else {\n            wrappedSensitive = Object.keys(sensitive).reduce((data, key) => {\n                let value = { [key]: `GCPII[${sensitive[key]}]` };\n                return Object.assign(data, value);\n            }, {});\n        }\n        return Object.assign({}, remoteData, {\n            sensitive: wrappedSensitive\n        });\n    },\n\n    checkItemsAgainstOptions(logOption, level, topic, itemsToLog) {\n        const defaultAnswer = {\n            server: false,\n            local: false\n        };\n\n        if (logOption.topic && topic && logOption.topic !== topic) {\n            return defaultAnswer;\n        }\n\n        if (logOption.regex) {\n            let matches;\n            if (logOption.propertyToMatch) {\n                matches = (itemsToLog || []).some(\n                    item =>\n                        item &&\n                        typeof item[logOption.propertyToMatch] === 'string' &&\n                        item[logOption.propertyToMatch].match(logOption.regex)\n                );\n            } else {\n                matches = (itemsToLog || []).some(\n                    item =>\n                        item &&\n                        ((typeof item === 'string' && item.match(logOption.regex)) ||\n                            (typeof item.message === 'string' && item.message.match(logOption.regex)))\n                );\n            }\n\n            if (!matches) {\n                return defaultAnswer;\n            }\n        }\n\n        const itemLogIndex = LOG_LEVELS.indexOf(level.toLowerCase());\n\n        return {\n            server: logOption.serverLevel && itemLogIndex >= LOG_LEVELS.indexOf(logOption.serverLevel.toLowerCase()),\n            local: logOption.localLevel && itemLogIndex >= LOG_LEVELS.indexOf(logOption.localLevel.toLowerCase())\n        };\n    },\n\n    /**\n     * Determine whether a log item matches the SILENCED_ERRORS list (string equality, regex, or\n     * matcher function). Extracted so the silence check can run ahead of the global-error console\n     * exposure in bufferLog.\n     * @param {*} item - the raw log item\n     * @param {string} checkForSilence - the string form of the item used for string/regex matches\n     * @param {Array} itemsToLog - all items in this log call (passed to matcher functions)\n     * @param {boolean} isLocal - whether this is a local runtime (passed to matcher functions)\n     * @returns {boolean} true if the item should be silenced\n     */\n    _isSilencedError(item, checkForSilence, itemsToLog, isLocal) {\n        for (let i = 0; i < SILENCED_ERRORS.length; i++) {\n            const SILENCED = SILENCED_ERRORS[i];\n            const silencedByStringMatch = typeof SILENCED === 'string' && checkForSilence === SILENCED;\n            const silencedByRegex = typeof SILENCED.test === 'function' && SILENCED.test(checkForSilence);\n            let silencedByMatcher;\n            try {\n                silencedByMatcher = typeof SILENCED === 'function' && SILENCED(item, itemsToLog, isLocal);\n            } catch (e) {\n                silencedByMatcher = false;\n            }\n            if (silencedByStringMatch || silencedByRegex || silencedByMatcher) {\n                return true;\n            }\n        }\n        return false;\n    },\n\n    bufferLog(level, topic, ...itemsToLog) {\n        if (this.isDestroyed || this.isDestroying) {\n            return;\n        }\n        let logResult = { server: false, local: false };\n        const isLocal = this.get('application.runtime.local');\n\n        if (itemsToLog && itemsToLog.length > 0) {\n            for (let j = 0; j < itemsToLog.length; j++) {\n                const item = itemsToLog[j];\n                if (typeof item === 'undefined' || item === null || item === '') {\n                    if (isLocal && DEBUG) {\n                        console.debug(\n                            new Error('Local Only Error: Undefined error reported to stash logger'),\n                            itemsToLog\n                        );\n                    }\n                    return;\n                }\n\n                let checkForSilence;\n                if (typeof item === 'string') {\n                    checkForSilence = item;\n                }\n                if (!checkForSilence) {\n                    try {\n                        checkForSilence = JSON.stringify(item);\n                    } catch (err) {\n                        checkForSilence = `Error serializing log data: ${err.message}`;\n                    }\n                }\n\n                // Check the silence list BEFORE exposing global errors. Global errors routed\n                // through Ember.onerror are prefixed with \"Global Error Caught: \", so previously\n                // the GLOBAL_ERROR short-circuit returned before SILENCED_ERRORS was ever consulted\n                // and known-benign errors (e.g. the ember-tether removeChild teardown race) still\n                // spammed the console on every occurrence. Run the silence check first so those are\n                // suppressed regardless of the global-error prefix.\n                const silencedError = this._isSilencedError(item, checkForSilence, itemsToLog, isLocal);\n                if (silencedError) {\n                    if (isLocal && DEBUG) {\n                        console.debug('local-only error', itemsToLog[j]);\n                    }\n                    return logResult;\n                }\n\n                // expose (non-silenced) global errors\n                if (GLOBAL_ERROR.test(checkForSilence)) {\n                    console.error(item);\n                    return;\n                }\n\n                if (!DEBUG && (level === 'debug' || level === 'info')) {\n                    return;\n                }\n            }\n        }\n        const serverLogLevelIndex = LOG_LEVELS.indexOf(SERVER_LOG_LEVEL.toLowerCase());\n        const itemLogIndex = LOG_LEVELS.indexOf(level.toLowerCase());\n\n        const options = this.loggingOptions;\n        let logServer = itemLogIndex >= serverLogLevelIndex;\n        let logLocal = false;\n        for (let i = 0; i < options.length; i++) {\n            logResult = this.checkItemsAgainstOptions(options[i], level, topic, itemsToLog);\n\n            logServer = logServer || logResult.server;\n            logLocal = logLocal || logResult.local;\n\n            if (logServer && logLocal) {\n                break;\n            }\n        }\n\n        let skipSumoSend;\n        if (logServer) {\n            skipSumoSend = this.conversationTimelineLogger.curateMessage(level, topic, ...itemsToLog);\n        }\n\n        if (level === 'error') {\n            skipSumoSend = false;\n            const activeConversations = this.get('conversation.activeConversations') || [];\n            itemsToLog.push({ activeConversations: activeConversations.map(c => c.get('id')) });\n        }\n\n        if (logServer && !skipSumoSend) {\n            const trace = this.createTrace.call(this, level, topic, itemsToLog);\n            this.logs.pushObject(trace);\n        }\n\n        if (logLocal || level.toLowerCase() === 'error') {\n            this.internalLogs.pushObject({ topic, level, itemsToLog: itemsToLog, time: moment().toISOString() });\n\n            if (this.get('internalLogs.length') > this.MAX_INTERNAL_LOG_ITEMS) {\n                this.internalLogs.shiftObject();\n            }\n        }\n\n        this.logCounts[level]++;\n        this._originalLogger[level].apply(this._originalLogger, itemsToLog);\n\n        return { local: logLocal, server: logServer };\n    },\n\n    decreaseLogLimit(currentLimit) {\n        this.maxTracesByteLength = currentLimit - 500;\n    },\n\n    resetLogLimit() {\n        this.maxTracesByteLength = MAX_LOG_SIZE;\n    },\n\n    getTracesToLog(logs) {\n        let toLog = [];\n        let totalLogSize = 0;\n        for (let i = 0; i < logs.length; i++) {\n            const log = logs[i];\n            let logSize = lengthInUtf8Bytes(JSON.stringify(log));\n            if (toLog.length === 0 && logSize > this.maxTracesByteLength) {\n                // single log is too big to log\n                // slice it to 90% of the max (allow room for json chars)\n                log.message = (TRUNCATED_TRACE_MESSAGE + log.message).slice(\n                    0,\n                    Math.floor(0.9 * (this.maxTracesByteLength - TRUNCATED_TRACE_MESSAGE.length))\n                );\n                logSize = lengthInUtf8Bytes(JSON.stringify(log));\n            }\n            if (totalLogSize + logSize < this.maxTracesByteLength) {\n                toLog.push(log);\n                totalLogSize += logSize;\n            } else {\n                break; // break out, log the rest on next run\n            }\n        }\n        return toLog;\n    },\n\n    saveLogs: observer('logs.[]', 'backOffTask.isRunning', 'session.isAuthenticated', function () {\n        this._saveLogsTask.perform();\n    }),\n\n    _saveLogsTask: task(function* () {\n        const logs = this.logs;\n        if (logs.length <= 0 || this.get('backOffTask.isRunning') || !this.get('session.isAuthenticated')) {\n            return;\n        }\n        const toSend = this.getTracesToLog.call(this, logs);\n        logs.removeObjects(toSend);\n        yield timeout(LOG_INTERVAL);\n        this.sendLogTraces(toSend)\n            .then(() => {\n                this._resetLogsOnSuccessfulSave();\n            })\n            .catch(error => {\n                logs.addObjects(toSend);\n                if (error.status === 413) {\n                    this.decreaseLogLimit(toSend.length);\n                    this._originalLogger.error(\n                        `# of logs to send limited due to server size limit. Last sent size of <= ${this.maxTracesByteLength}.`\n                    );\n                } else if (error.status === 400) {\n                    this._originalLogger.error('Failed to log traces', error);\n                    if (this.failureCount === 0) {\n                        logs.removeObjects(toSend);\n                        this.incrementProperty('failureCount');\n                    } else {\n                        logs.clear();\n                    }\n                } else {\n                    this._originalLogger.error('Failed to log traces', error);\n                    this.exponentialBackoff.fail();\n\n                    // ACE-1903: Dump logs if we fail to send on expo. backup to avoid them\n                    // potentially backing up continuously.\n                    logs.clear();\n                }\n            })\n            .finally(() => {\n                this.backOffTask.perform();\n            });\n    })\n        .keepLatest()\n        .maxConcurrency(1), // comment below\n    // if this gets called more than once while its currently executing,\n    // it will cancel earlier calls that haven't started yet and just keep the latest\n\n    backOffTask: task(function* () {\n        yield timeout(this.exponentialBackoff.getInterval());\n    }),\n\n    immediateSaveLogs() {\n        const logs = this.logs;\n        const toSend = this.getTracesToLog.call(this, logs);\n        return this.sendLogTraces(toSend)\n            .then(() => {\n                logs.removeObjects(toSend);\n\n                this._resetLogsOnSuccessfulSave();\n            })\n            .catch(error => {\n                // If the immediate send doesn't work, we do not remove the logs and they will\n                // be processed by the usual task\n                this._originalLogger.warn('STASH-LOGGER: immediateSaveLogs error', {\n                    error\n                });\n            });\n    },\n\n    sendLogTraces(traces) {\n        if (isTesting) return resolve();\n\n        // this._originalLogger.log('STASH-LOGGER: sendLogTraces', traces, this);\n        const data = JSON.stringify({\n            app: {\n                appId: 'collaborate-ui',\n                appVersion: config.APP.semver\n            },\n            traces: traces\n        });\n\n        //Do not log traces when running locally\n        if (this.get('application.runtime.local')) {\n            return resolve();\n        }\n\n        const request = {\n            url: this.get('session.application').pcV2Uri('api/v2/diagnostics/trace'),\n            type: 'post',\n            contentType: 'application/json; charset=UTF-8',\n            dataType: 'text',\n            data,\n            cache: false,\n            context: this,\n            headers: {\n                Authorization: `bearer ${this.session.accessToken}`\n            }\n        };\n        return RSVP.cast($.ajax(request), 'applicationService#sendLogTraces');\n    },\n\n    _resetLogsOnSuccessfulSave() {\n        this.set('failureCount', 0);\n        this.resetLogLimit();\n        this.exponentialBackoff.reset();\n    }\n});\n","import Service from '@ember/service';\nimport { getOwner } from '@ember/application';\n\ninterface PreferencesService {\n    getPreference(key: string): Promise<any>;\n    setPreference(key: string, value: any, persist?: boolean): Promise<void>;\n}\n\nexport type StorageService = {\n    getMemoryStorageItem(key: string): any;\n    setMemoryStorageItem(key: string, value: any): void;\n    removeMemoryStorageItem(key: string): void;\n    getSessionStorageItem(key: string): string | null;\n    setSessionStorageItem(key: string, value: string): void;\n    removeSessionStorageItem(key: string): void;\n    getLocalStorageItem(key: string): string | null;\n    setLocalStorageItem(key: string, value: string): void;\n    getPreferenceStorageItem(key: string): Promise<any | null>;\n    setPreferenceStorageItem(key: string, value: any): Promise<void>;\n};\n\nexport default class StorageServiceImpl extends Service implements StorageService {\n    memoryStorage = new Map<string, any>();\n\n    /**\n     * Resolve the preferences service via an explicit container lookup.\n     *\n     * NOTE: This service is a native class. The classic field-injection form\n     * (`preferences = inject('preferences')`) did not reliably resolve here\n     * under Ember 3.28 — `this.get('preferences')` returned the injection\n     * descriptor instead of the service, causing\n     * \"this.get(...).getPreference is not a function\" during bootstrap render.\n     * An explicit owner lookup is transform-independent and always resolves the\n     * real service. See ember-3-migration spec.\n     */\n    private get preferencesService(): PreferencesService {\n        return getOwner(this).lookup('service:preferences') as PreferencesService;\n    }\n\n    /**\n     * Stores the value in memory only until the window refreshes or tears down.\n     * Won't persist on refresh of the active window or across different browser\n     * sessions.\n     */\n    setMemoryStorageItem(key: string, value: any): void {\n        this.memoryStorage.set(key, value);\n    }\n    getMemoryStorageItem(key: string): any {\n        return this.memoryStorage.get(key) || null;\n    }\n    removeMemoryStorageItem(key: string): void {\n        this.memoryStorage.delete(key);\n    }\n\n    /**\n     * Stores the value in the browser session only until that session tears down.\n     * Will persist on refresh of the window. Will not persist on a different tab\n     * or browser instance\n     */\n    setSessionStorageItem(key: string, value: string): void {\n        if (sessionStorage) {\n            sessionStorage.setItem(key, value);\n        }\n    }\n    getSessionStorageItem(key: string): string | null {\n        if (sessionStorage) {\n            return sessionStorage.getItem(key);\n        }\n        return null;\n    }\n    removeSessionStorageItem(key: string): void {\n        if (sessionStorage) {\n            sessionStorage.removeItem(key);\n        }\n    }\n\n    /**\n     * Stores the value in browser storage.\n     * Will persist on refresh, will persist on a different tab and browser instance.\n     * Will not persist on a DIFFERENT browser entirely.\n     * eg. If saved in chrome, it won't return in firefox.\n     */\n    setLocalStorageItem(key: string, value: string): void {\n        if (localStorage) {\n            localStorage.setItem(key, value);\n        }\n    }\n    getLocalStorageItem(key: string): string | null {\n        if (localStorage) {\n            return localStorage.getItem(key);\n        }\n        return null;\n    }\n\n    /**\n     * Stores the value in the database so the user can persist this setting in perpetuity.\n     * Will persist on refresh, will persist on different tabs, and will persist across different\n     * browsers.\n     *\n     * @note\n     * to save a preference, a valid and existing namespace must be prepended to the key.\n     * eg. `interactions.defaultQueuesEnabled` whereas `interactions` is the namespace.\n     */\n    setPreferenceStorageItem(key: string, value: any): Promise<void> {\n        return this.preferencesService.setPreference(key, value, true);\n    }\n    getPreferenceStorageItem(key: string): Promise<any> {\n        return this.preferencesService.getPreference(key);\n    }\n}\n\ndeclare module '@ember/service' {\n    interface Registry {\n        storage: StorageService;\n    }\n}\n","import { join } from '@ember/runloop';\nimport { A } from '@ember/array';\nimport { reads } from '@ember/object/computed';\nimport { set } from '@ember/object';\nimport RSVP, { Promise } from 'rsvp'; // allSettled - keep for future implementation\nimport { assert } from '@ember/debug';\nimport { getOwner } from '@ember/application';\nimport { inject as service } from '@ember/service';\nimport DS from 'ember-data';\nimport _ from 'lodash';\n\nimport ApplicationAdapter from '../adapters/application';\nimport PromiseArray from '../utils/promise-array';\n\nimport SearchStoreMixin from '../search/store-mixin';\n\nimport { FL } from '../utils/entity-fields';\n\n/* Batch entity ids into lists of 50. */\nexport function batchEntityIds(ids, size = 50) {\n    ids = _.clone(ids);\n\n    const guids = ids.filter(id => id.indexOf('@') === -1);\n    const jids = ids.filter(id => id.indexOf('@') > -1);\n\n    var batches = [];\n\n    while (guids.length > 0) {\n        batches.push(guids.splice(0, size));\n    }\n    while (jids.length > 0) {\n        batches.push(jids.splice(0, size));\n    }\n\n    return batches;\n}\n\nfunction updateGroup(group, data) {\n    const updateKeys = ['contactInfo', 'general', 'privacy'];\n    if (data.attributes) {\n        updateKeys.forEach(key => {\n            if (data.attributes[key] !== undefined) {\n                group.set(key, data.attributes[key], { overwrite: true });\n            }\n        });\n    }\n}\n\nvar ApplicationStore = DS.Store.extend(SearchStoreMixin, {\n    session: service(),\n\n    adapter: ApplicationAdapter,\n\n    applicationAdapter() {\n        return getOwner(this).lookup('adapter:application');\n    },\n\n    findQuery(type, query) {\n        var store = this;\n        var promiseLabel = 'ApplicationStore#_findQuery for: ' + type;\n        var adapter = this.adapterFor(type);\n\n        assert('You tried to load a query but you have no adapter (for ' + type + ')', adapter);\n        assert(\n            'You tried to load a query but your adapter does not implement `findQuery`',\n            typeof adapter.findQuery === 'function'\n        );\n\n        var result = adapter.query(store, type, query);\n\n        var promise = Promise.cast(result, promiseLabel).then(\n            function (payload) {\n                var collection = [];\n                if (payload.res) {\n                    _.forEach(payload.res, function (entity) {\n                        const id = entity.guid || entity._id;\n                        if (id) {\n                            entity.id = id;\n                            collection.push(store.push(type, entity, true));\n                        }\n                    });\n                } else {\n                    // if no payload.res then we are not dealing with the application adapter,\n                    // but we still want to keep the result in case we are using a fixture adapter\n                    _.forEach(payload, function (item) {\n                        collection.push(store.push(type, item, true));\n                    });\n                }\n                return {\n                    collection: collection,\n                    payload: payload\n                };\n            },\n            null,\n            'ApplicationStore#_findQuery: Extract payload from findQuery'\n        );\n\n        return PromiseArray.create({\n            promise: promise\n        });\n    },\n\n    findMultiEntity(params, requestType) {\n        let store = this;\n        let promiseLabel = 'ApplicationStore#findMultiEntity';\n        let adapter = this.applicationAdapter();\n        let serializer = this.serializerFor('application');\n\n        let result = adapter.findMultiEntity(store, params, requestType);\n\n        let promise = Promise.cast(result, promiseLabel).then(\n            payload => {\n                payload = serializer.normalizeArrayResponse(store, null, payload, null, requestType || 'query');\n                if (!payload.data && payload.included) {\n                    payload.data = payload.included;\n                    payload.included = [];\n                }\n\n                let records = store.push(payload);\n                set(records, 'meta', payload.meta);\n                return records;\n            },\n            null,\n            'ApplicationStore#findMultiEntity: Extract payload from multi-entity search'\n        );\n\n        return DS.PromiseArray.create({\n            promise: promise,\n            meta: reads('content.meta')\n        });\n    },\n\n    findFavorites(type, id, params) {\n        return this.findFavoritesV3(type, id, params);\n    },\n\n    findFavoritesV3(type, id, params) {\n        const promiseLabel = 'Store: Application#findFavoritesV3';\n        const adapter = this.adapterFor(type);\n        const result = adapter.findFavorites(this, type, id, params);\n        const promise = Promise.cast(result, promiseLabel).then(res => {\n            return this.findMany(type, A(res).mapBy('favoriteId'), FL[type]).then(favorites => {\n                return {\n                    payload: res,\n                    collection: favorites\n                };\n            });\n        });\n\n        return PromiseArray.create({\n            promise: promise\n        });\n    },\n\n    forwardVoicemail(voicemail, recipient, type) {\n        const adapter = this.adapterFor(voicemail.type);\n        return adapter.forwardVoicemail(voicemail.id, recipient.get('guid'), type);\n    },\n\n    findSuperiors(type, id, params) {\n        const store = this;\n        const modelClass = this.modelFor(type);\n        const adapter = this.adapterFor(type);\n        const serializer = this.serializerFor(type);\n        const promise = RSVP.cast(adapter.findSuperiors(type, id, params)).then(payload => {\n            payload = serializer.normalizeArrayResponse(store, modelClass, payload, null, 'findMany');\n            const records = store.push(payload);\n            return records || [];\n        });\n\n        return DS.PromiseArray.create({\n            promise: promise\n        });\n    },\n\n    findDirectReports(type, id, params) {\n        const store = this;\n        const modelClass = this.modelFor(type);\n        const adapter = this.adapterFor(type);\n        const serializer = this.serializerFor(type);\n        return new Promise(resolve => {\n            adapter.findDirectReports(type, id, params).then(payload => {\n                payload = serializer.normalizeArrayResponse(store, modelClass, payload, null, 'findMany');\n                const records = store.push(payload);\n                resolve(records);\n            });\n        });\n    },\n\n    findLatestCalls(type, ids) {\n        return this.query(type, {\n            latestCalls: true,\n            ids: ids\n        });\n    },\n\n    findMany(type, ids, params) {\n        if (Array.isArray(type)) {\n            return this._super(...arguments);\n        }\n\n        const store = this;\n        const adapter = this.adapterFor(type);\n        const serializer = this.serializerFor(type);\n        const modelClass = this.modelFor(type);\n        const batches = batchEntityIds(ids, 25);\n        const batchLimit = 3;\n\n        // TODO: keep for future implementation\n        // if (type === 'person' && this.get('session.features.enableUIAjaxRetryHeader')) {\n        //     return new Promise((resolve, reject) => {\n        //         let promises = batches.map(batch => {\n        //             return adapter.findMany(store, modelClass, batch, params).then(payload => {\n        //                 payload = serializer.normalizeArrayResponse(store, modelClass, payload, null, 'findMany');\n        //                 const records = store.push(payload);\n        //                 return records;\n        //             });\n        //         });\n        //         allSettled(promises).then(results => {\n        //             let successfulRequests = results.filter(r => r.state === 'fulfilled').map(r => r.value);\n        //             let failedRequests = results.filter(r => r.state === 'rejected').map(r => r.value);\n        //             if (failedRequests.length > 0) {\n        //                 reject('store:application#findMany request failed:', {\n        //                     failedRequests\n        //                 });\n        //                 return;\n        //             }\n        //             resolve(_.flatten(successfulRequests));\n        //         });\n        //     });\n        // }\n        return new Promise((resolve, reject) => {\n            window.async.mapLimit(\n                batches,\n                batchLimit,\n                function (batch, callback) {\n                    join(() => {\n                        adapter\n                            .findMany(store, modelClass, batch, params)\n                            .then(function (payload) {\n                                payload = serializer.normalizeArrayResponse(\n                                    store,\n                                    modelClass,\n                                    payload,\n                                    null,\n                                    'findMany'\n                                );\n                                const records = store.push(payload);\n                                callback(null, records);\n                            })\n                            .catch(function (err) {\n                                callback(err);\n                            });\n                    });\n                },\n                function (err, bulkResults) {\n                    join(() => {\n                        if (err) {\n                            return reject('store:application#findMany(): async.mapLimit failed' + err);\n                        }\n                        resolve(_.flatten(bulkResults));\n                    });\n                }\n            );\n        }, 'store:application#findMany(): async.mapLimit');\n    },\n\n    /**\n     * Overrides adapterFor to support type being passed into 'find' as a string.\n     */\n    adapterFor(type) {\n        if (type.modelName) {\n            return this._super(type.modelName);\n        }\n        return this._super(type);\n    },\n\n    didSaveRecord(internalModel, data) {\n        // The api returns data instead of an empty object, so we do not want to update\n        // our deleted record, otherwise an error is thrown\n        let recordInfo = data;\n        if (data && data.data) {\n            recordInfo = data.data;\n        }\n\n        if (!internalModel.currentState.isDeleted && recordInfo && recordInfo.id) {\n            if (internalModel.currentState.isSaving && recordInfo.attributes.version) {\n                const record = internalModel.record || internalModel.getRecord();\n\n                if (record) {\n                    record.set('version', recordInfo.attributes.version);\n\n                    if (record.get('type') === 'group') {\n                        updateGroup(record, recordInfo);\n                    }\n                }\n            }\n        }\n\n        return this._super(internalModel, data);\n    }\n});\n\nexport default ApplicationStore;\n","/* global Realtime */\nimport { readOnly } from '@ember/object/computed';\n\nimport { later, run } from '@ember/runloop';\nimport { get, set } from '@ember/object';\nimport { A } from '@ember/array';\nimport Service, { inject as service } from '@ember/service';\nimport { Promise, reject, resolve, defer } from 'rsvp';\nimport Ember from 'ember';\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport netUtils from 'web-directory/utils/net';\nimport StreamingClient from 'web-directory/utils/streaming-client';\n\nconst INVITE_QUEUE_DELAY = 700;\nconst STREAMING_CACHE_KEY = '__streamingCacheKey';\n\nconst StreamingService = Service.extend(LoggerMixin, {\n    presence: service(),\n    session: service(),\n    webrtcSdkService: service('webrtcSdk'),\n\n    connectOnLoad: false,\n\n    jid: null,\n    accessToken: null,\n\n    connectionPromise: null,\n    connection: null,\n    connected: false,\n    connectedV2: false,\n    realtimePromise: null,\n    v2Deferred: null,\n    v2Promise: null,\n    v2Connecting: false,\n    useV2Only: false,\n    pubsubV2: null,\n    disableStreamingConnection: false,\n    subscribers: null,\n    inviteQueue: null,\n    streamingClientInstance: null,\n    alertingLeader: {},\n\n    _eventHandlers: null,\n\n    init() {\n        this._super(...arguments);\n        this.set('subscribers', A());\n        this.set('inviteQueue', A());\n        this.set('_eventHandlers', {});\n        const deferred = defer();\n        this.set('v2Deferred', deferred);\n        this.set('v2Promise', deferred.promise);\n    },\n\n    connectionV2: readOnly('streamingClientInstance'),\n\n    getDefaultOptions() {\n        return {\n            carrierPigeon: false,\n            fetchGroupsOnConnect: false,\n            fetchRosterOnConnect: false,\n            focusV2: true,\n            jidResource: 'emberchat',\n            jidRouting: true,\n            offlineJoinNotifications: true,\n            rawMessageIds: true,\n            recentlyClosed: true,\n            roomsV2: true,\n            rtcLastN: 4,\n            rtcSessionSurvivability: true\n        };\n    },\n\n    initialize() {\n        this.addAllSubscriptions();\n\n        if (this.connectOnLoad) {\n            this.connect(this.connectOnLoad);\n        }\n    },\n\n    connect(accessToken) {\n        if (!accessToken) {\n            return reject(new Error('Access token required. To reconnect use the reconnect method instead.'));\n        }\n        this.logger.log('streaming service connect');\n\n        const connectionPromise = this.connectionPromise;\n        if (!connectionPromise) {\n            this.set('connectOnLoad', accessToken);\n            return Promise.resolve();\n        }\n        return connectionPromise.then(connection => {\n            if (!connection.connected) {\n                connection.on('connect', () => this.set('connected', true));\n                connection.on('disconnect', () => this.set('connected', false));\n                this.logger.log('connecting');\n                if (connection.options) {\n                    connection.options.authKey = accessToken;\n                }\n                connection.connect();\n            }\n            return connection;\n        });\n    },\n\n    isConnectionConnecting() {\n        const connection = this.connection;\n        return !!(connection && connection.socket && !connection.connected);\n    },\n\n    disconnect() {\n        this.logger.log('streaming service disconnect');\n\n        if (this.connection) {\n            this.connection.disconnect();\n        }\n\n        if (this.connectionV2) {\n            this.connectionV2.disconnect();\n        }\n    },\n\n    reconnect() {\n        this.logger.log('streaming service reconnect');\n\n        if (this.connection) {\n            this.connection.reconnect();\n        }\n\n        const connectionV2 = this.connectionV2;\n        if (connectionV2) {\n            connectionV2.disconnect().finally(() => connectionV2.connect({ keepTryingOnFailure: true }));\n        }\n    },\n\n    subscribeToConnection(subscriber) {\n        this.subscribers.addObject(subscriber);\n\n        if (this.connection) {\n            this.addAllSubscriptions();\n        }\n    },\n\n    unsubscribeFromConnection(subscriber) {\n        this.subscribers.removeObject(subscriber);\n\n        if (this.connection) {\n            this.unsubscribeListeners(subscriber);\n        }\n    },\n\n    addAllSubscriptions() {\n        const connection = this.connection;\n        this.subscribers.forEach(subscriber => {\n            if (!get(subscriber, 'streamingEventsSubscribed')) {\n                set(subscriber, 'streamingEventsSubscribed', true);\n\n                const cacheKey = Ember.generateGuid();\n                set(subscriber, STREAMING_CACHE_KEY, cacheKey);\n                this._eventHandlers[cacheKey] = [];\n\n                this.subscribeListeners(subscriber);\n\n                // For debugging purposes, requests to the streaming connection should go through this proxy\n                if (connection) {\n                    set(subscriber, 'streamingConnection', connection);\n                } else {\n                    this.realtimePromise.then(connection => {\n                        set(subscriber, 'streamingConnection', connection);\n                    });\n                }\n            }\n        });\n    },\n\n    _subscribeV2Event(subscriber, event, handler) {\n        const eventHandler = handler.bind(subscriber);\n        if (handler.namespace === '*') {\n            this.connectionV2.on(event, eventHandler);\n            this._cacheEvent(subscriber, event, eventHandler);\n        } else if (handler.namespace) {\n            const extension = this.connectionV2[handler.namespace];\n            if (extension) {\n                if (!extension.on) {\n                    this.logger.warn(\n                        'Streaming client event subscribed with namespace, but namespace does not support eventing. No event listener was added',\n                        {\n                            event,\n                            remoteData: {\n                                namespace: handler.namespace\n                            }\n                        }\n                    );\n                    return;\n                }\n                extension.on(event, eventHandler);\n                this._cacheEvent(subscriber, event, eventHandler, handler.namespace);\n            } else {\n                this.logger.warn(\n                    'Streaming client event subscribed with namespace, but no matching extension was found. No event listener was added.',\n                    {\n                        event,\n                        remoteData: {\n                            namespace: handler.namespace\n                        }\n                    }\n                );\n            }\n        } else {\n            this.logger.error(\n                'Streaming Service: A namespace is required for streaming events. Use * for global events. No event listener has been added.',\n                {\n                    event\n                }\n            );\n        }\n    },\n\n    _unsubscribeV2Event(handlerInfo) {\n        if (handlerInfo.namespace) {\n            const extension = this.connectionV2[handlerInfo.namespace];\n            if (extension) {\n                extension.off(handlerInfo.event, handlerInfo.handler);\n            }\n        } else {\n            this.connectionV2.off(handlerInfo.event, handlerInfo.handler);\n        }\n    },\n\n    subscribeListeners(subscriber) {\n        const connection = this.connection;\n        for (let event in subscriber) {\n            let handler = subscriber[event];\n            if (handler && handler.streamingEvent) {\n                let eventName = handler.event || event;\n                if (this.useV2Only) {\n                    this._subscribeV2Event(subscriber, eventName, handler);\n                } else {\n                    if (!handler.namespace) {\n                        // Realtime path\n                        const eventHandler = handler.bind(subscriber);\n                        if (connection) {\n                            connection.addListener(eventName, eventHandler);\n                            this._cacheEvent(subscriber, event, eventHandler);\n                        } else {\n                            this.realtimePromise.then(connection => {\n                                connection.addListener(eventName, eventHandler);\n                                this._cacheEvent(subscriber, event, eventHandler);\n                            });\n                        }\n                    } else {\n                        if (this.connectionV2) {\n                            this._subscribeV2Event(subscriber, eventName, handler);\n                        }\n                    }\n                }\n            }\n        }\n    },\n\n    unsubscribeListeners(subscriber) {\n        if (!get(subscriber, 'streamingEventsSubscribed')) {\n            return;\n        }\n\n        const cacheKey = get(subscriber, STREAMING_CACHE_KEY);\n        const handlers = this._eventHandlers[cacheKey];\n\n        handlers.forEach(handlerInfo => {\n            if (this.useV2Only) {\n                this._unsubscribeV2Event(handlerInfo);\n            } else {\n                if (!handlerInfo.namespace) {\n                    this.connection.removeListener(handlerInfo.event, handlerInfo.handler);\n                } else {\n                    if (this.connectionV2) {\n                        this._unsubscribeV2Event(handlerInfo);\n                    }\n                }\n            }\n        });\n\n        delete this._eventHandlers[cacheKey];\n    },\n\n    _cacheEvent(subscriber, event, handler, namespace = null) {\n        let key = get(subscriber, STREAMING_CACHE_KEY);\n        if (!key) {\n            key = Ember.generateGuid();\n            set(subscriber, STREAMING_CACHE_KEY, key);\n            this._eventHandlers[key] = [];\n        }\n\n        this._eventHandlers[key].push({\n            event,\n            handler,\n            namespace\n        });\n    },\n\n    setStatus(status, entity = null) {\n        if (entity) {\n            return this._setAPIStatus(entity, status);\n        }\n        return reject(new Error('Entity is required'));\n    },\n\n    _setAPIStatus(entity, status) {\n        return this.presence.setUsersStatus(entity, status);\n    },\n\n    _setRealtimeStatus(status) {\n        return new Promise((resolve, reject) => {\n            this.connection.setStatus(status, error => {\n                if (error) {\n                    reject(error);\n                } else {\n                    resolve(status);\n                }\n            });\n        });\n    },\n\n    setRoomInactive(room) {\n        const jid = get(room, 'jid');\n\n        this.connection.setInactive(jid);\n\n        if (!room.isOneToOneRoom()) {\n            this.connection.leaveRoom(jid);\n        }\n    },\n\n    inviteToRoom(room, person) {\n        this.inviteQueue.pushObject({ room, person });\n        if (!this.inviteQueueRunning) {\n            this.set('inviteQueueRunning', true);\n            later(this, this._processInviteQueue, INVITE_QUEUE_DELAY);\n        }\n    },\n\n    _processInviteQueue() {\n        const invite = this.inviteQueue.popObject();\n        this.connection.inviteToRoom(invite.room.get('jid'), invite.person.get('jid'));\n        if (this.get('inviteQueue.length') > 0) {\n            later(this, this._processInviteQueue, INVITE_QUEUE_DELAY);\n        } else {\n            this.set('inviteQueueRunning', false);\n        }\n    },\n\n    _getEnvDetails() {\n        return netUtils.getEnvDetails();\n    },\n\n    _createStreamingClientInstance(connectionOptions) {\n        const options = {\n            jid: connectionOptions.jid,\n            jidResource: connectionOptions.hawkJidResource,\n            authToken: connectionOptions.accessToken,\n            appName: connectionOptions.originAppName,\n            appVersion: connectionOptions.originAppVersion,\n            appId: connectionOptions.originAppId,\n            useServerSidePings: connectionOptions.useServerSidePings,\n            enablePartialBulkResubscribe: connectionOptions.enablePartialBulkResubscribe,\n            customHeaders: connectionOptions.customHeaders,\n            alertableInteractionTypes: connectionOptions.alertableInteractionTypes\n        };\n\n        if (connectionOptions.streamingServiceUri) {\n            options.host = connectionOptions.streamingServiceUri;\n            options.apiHost = connectionOptions.streamingServiceApiUri;\n        } else {\n            this.set('useV2Only', false);\n            const error = new Error(\n                'Unable to find streaming v2 host - no streamingServiceUri provided by application service as `streamingServiceUri`'\n            );\n            this.logger.error(error);\n            throw error;\n        }\n\n        const sc = this.constructStreamingClient(options);\n\n        this.set('streamingClientInstance', sc);\n        // it looks like there are some external services that depend on this but we shouldn't use this\n        return sc;\n    },\n\n    constructStreamingClient(options) {\n        return new StreamingClient(options);\n    },\n\n    async _connectStreamingClient(connectionOptions) {\n        let scInstance = this.streamingClientInstance;\n        if (scInstance) {\n            const error = new Error('Streaming client instance already exists');\n            this.logger.warn(error);\n            return;\n        }\n\n        scInstance = this._createStreamingClientInstance(connectionOptions);\n        scInstance.alertingLeader.on('alertingLeaderChanged', update => {\n            this.set('alertingLeader', update);\n\n            try {\n                const { voice } = update;\n                if (!voice.configured || !this.get('session.features.CHAT-3526_enableAlertingLeaderPublicApi')) {\n                    this.webrtcSdkService.setMediaHandling('standard-media');\n                } else {\n                    this.webrtcSdkService.setMediaHandling(voice.alerting ? 'alerting-leader-media' : 'reduced-media');\n                }\n            } catch (e) {\n                this.logger.warn('Unable to set media handling', e);\n                scInstance.alertingLeader.claimAlertingLeader();\n            }\n        });\n        this.set('v2Connecting', true);\n\n        scInstance.on('disconnected', () => {\n            this.set('connectedV2', false);\n            this.set('v2Connecting', scInstance.connecting);\n        });\n\n        scInstance.on('connected', () => {\n            this.logger.info('streaming client connected');\n\n            this.set('connectedV2', true);\n            this.set('v2Connecting', scInstance.connecting);\n            this.v2Deferred.resolve(scInstance);\n        });\n\n        scInstance.on('stream:error', error => {\n            this.logger.error('Streaming Service: Error from streaming client connection:', {\n                error\n            });\n            this.set('connectedV2', false);\n        });\n\n        try {\n            await scInstance.connect({ keepTryingOnFailure: true });\n            return scInstance;\n        } catch (err) {\n            // we should only end up here if sc failed to connect and won't retry\n            this.set('v2Connecting', false);\n            this.set('pubsubV2', false);\n            throw err;\n        }\n    },\n\n    // Utility method for loading realtime\n    _loadRealtime(connectionOptions) {\n        if (this.realtimePromise) {\n            return this.realtimePromise;\n        }\n\n        const realtimePromise = new Promise((resolve, reject) => {\n            try {\n                let env = connectionOptions.envDetails || netUtils.getEnvDetails();\n                if (!env.local) {\n                    connectionOptions.host = `https://realtime.${env.envTld}`;\n                }\n            } catch (e) {\n                this.logger.error('Streaming Service: Error getting env info for realtime', {\n                    error: e\n                });\n                return reject(e);\n            }\n\n            const scriptUrl = this.scriptUrl;\n            const realtimeScript = document.createElement('script');\n            realtimeScript.type = 'text/javascript';\n            realtimeScript.async = true;\n            realtimeScript.src = scriptUrl;\n            realtimeScript.onerror = error => {\n                this.logger.error(\"Streaming Service: Couldn't load realtime.js script\", {\n                    error\n                });\n                reject(error);\n            };\n            realtimeScript.addEventListener('load', () => {\n                run(() => {\n                    const connection = new Realtime(connectionOptions);\n                    connection.on('error', error =>\n                        this.logger.error('Streaming Service: Error in realtime.js', {\n                            error\n                        })\n                    );\n                    resolve(connection);\n                });\n            });\n\n            const head = document.head || document.getElementsByTagName('head')[0];\n            head.appendChild(realtimeScript);\n        });\n\n        this.set('realtimePromise', realtimePromise);\n        return realtimePromise;\n    },\n\n    setupConnection(options = {}) {\n        if (this.connectionPromise) {\n            return this.connectionPromise;\n        }\n\n        if (this.disableStreamingConnection) {\n            return resolve();\n        }\n\n        const connectionOptions = Object.assign(this.getDefaultOptions(), options);\n        if (!connectionOptions.logger) {\n            connectionOptions.logger = this.logger;\n        }\n\n        let connectionPromise;\n        if (this.useV2Only) {\n            connectionPromise = this._connectStreamingClient(connectionOptions);\n        } else {\n            if (options.splitHawkAndRealtime) {\n                // we want to connect hawk and realtime separately\n                // connect to Hawk\n                this._connectStreamingClient(connectionOptions)\n                    .then(() => {\n                        this.logger.info('Streaming Service: Initial streaming-client connection finished');\n                    })\n                    .catch(error => {\n                        this.logger.error('Streaming Service: Initial streaming-client connection failed', {\n                            error\n                        });\n                    });\n                // connect to Realtime\n                connectionPromise = this._loadRealtime(connectionOptions)\n                    .then(connection => {\n                        this.logger.info('Streaming Service: Realtime connection finished');\n                        return connection;\n                    })\n                    .catch(err => {\n                        this.logger.error('Streaming Service: Error connecting to realtime', {\n                            error: err\n                        });\n                        return reject(err);\n                    });\n\n                // Add subscriptions before streaming-client connects so subscribers can listen to streaming-client 'connect' events\n                this.addAllSubscriptions();\n            } else {\n                connectionPromise = this._connectStreamingClient(connectionOptions)\n                    .catch(error => {\n                        this.logger.error('Streaming Service: Initial streaming-client connection failed', {\n                            error\n                        });\n                    })\n                    .then(() => {\n                        // Try to connect to realtime, even if hawk fails\n                        return this._loadRealtime(connectionOptions);\n                    })\n                    .catch(err => {\n                        this.logger.error('Streaming Service: Error connecting to realtime', {\n                            error: err\n                        });\n                        return reject(err);\n                    });\n            }\n        }\n        connectionPromise.then(connection => {\n            // Expose Realtimejs instance to embedded clients like Engage.\n            // For backward compatibility\n            if (window.Orgspan) {\n                window.Orgspan.realtime = connection;\n            }\n\n            this.set('connection', connection);\n            this.initialize();\n        });\n\n        this.set('connectionPromise', connectionPromise);\n        return connectionPromise;\n    }\n});\n\nStreamingService.reopenClass({\n    streamingEvent(namespace, event, handler) {\n        if (typeof namespace === 'function') {\n            handler = namespace;\n            namespace = null;\n            event = null;\n        }\n        if (typeof event === 'function') {\n            handler = event;\n            event = null;\n        }\n        handler.streamingEvent = true;\n        handler.namespace = namespace;\n        handler.event = event;\n        return handler;\n    }\n});\n\nexport default StreamingService;\n","import Evented from '@ember/object/evented';\nimport Service, { inject } from '@ember/service';\nimport ConversationMixin from 'web-directory/mixins/conversation';\nimport {\n    AssignmentStateType,\n    TransferOptions,\n    TransferType,\n    WorkitemInteraction\n} from '@genesys/genesys-cloud-conversation-utils';\nimport type { CreateWorkitemPayload, TaskManagementQueryRequest } from 'web-directory/utils/workitem-create';\n\nconst BASE_URI_V2 = 'api/v2/taskmanagement';\n\nexport default Service.extend(ConversationMixin, Evented, {\n    application: inject('application'),\n\n    baseUri() {\n        const application = this.get('application');\n        return application.pcV2Uri(BASE_URI_V2);\n    },\n\n    /**\n     * Creates a workitem via POST /api/v2/taskmanagement/workitems.\n     *\n     * @param payload - Workitem create body (name required; other fields optional).\n     * @returns The created workitem entity from the API.\n     */\n    createWorkitem(payload: CreateWorkitemPayload) {\n        const url = `${this.baseUri()}/workitems`;\n        return this.makeRequest(url, { data: payload }, 'post');\n    },\n\n    /**\n     * Queries workbins via POST /api/v2/taskmanagement/workbins/query.\n     * Cursor-paginated: pass a prior response's `after` to fetch the next page.\n     *\n     * @param request - Optional filters and paging (name, pageSize, after cursor).\n     * @returns A cursor-paginated workbin listing.\n     */\n    queryWorkbins(request: TaskManagementQueryRequest = {}) {\n        const url = `${this.baseUri()}/workbins/query`;\n        return this.makeRequest(url, { data: request }, 'post');\n    },\n\n    /**\n     * Queries worktypes via POST /api/v2/taskmanagement/worktypes/query.\n     * Cursor-paginated: pass a prior response's `after` to fetch the next page.\n     *\n     * @param request - Optional filters and paging (name, pageSize, after cursor).\n     * @returns A cursor-paginated worktype listing.\n     */\n    queryWorktypes(request: TaskManagementQueryRequest = {}) {\n        const url = `${this.baseUri()}/worktypes/query`;\n        return this.makeRequest(url, { data: request }, 'post');\n    },\n\n    /**\n     * Accept a Workitem Interaction\n     * @param interaction\n     * @returns\n     */\n    acceptWorkitemInteraction(interaction: WorkitemInteraction) {\n        return this.changeAssignmentState(interaction, 'Connected');\n    },\n\n    /**\n     * End a Workitem Interaction\n     * @param interaction\n     * @returns\n     */\n    endWorkitemInteraction(interaction: WorkitemInteraction) {\n        return this.changeAssignmentState(interaction, 'Disconnected');\n    },\n\n    /**\n     * Decline a Workitem Interaction\n     * @param interaction\n     * @returns\n     */\n    declineWorkitemInteraction(interaction: WorkitemInteraction) {\n        return this.changeAssignmentState(interaction, 'Declined');\n    },\n\n    /**\n     * Park a Workitem Interaction\n     * @param interaction\n     * @returns\n     */\n    parkWorkitemInteraction(interaction: WorkitemInteraction) {\n        return this.changeAssignmentState(interaction, 'Parked');\n    },\n\n    /**\n     * Hold a Workitem Interaction\n     * @param interaction\n     * @returns\n     */\n    holdWorkitemInteraction(interaction: WorkitemInteraction) {\n        return this.changeAssignmentState(interaction, 'Held');\n    },\n\n    /**\n     * Unhold a Workitem Interaction.\n     * NOTE: This is the same action as accepting a workitem interaction,\n     * but we have an explicit call.\n     *\n     * @param interaction\n     * @returns\n     */\n    unholdWorkitemInteraction(interaction: WorkitemInteraction) {\n        return this.changeAssignmentState(interaction, 'Connected');\n    },\n\n    /**\n     * Change Assignment State. Supports any AssignmentState.\n     *\n     * @param interaction\n     * @param assignmentState\n     * @returns\n     */\n    changeAssignmentState(interaction: WorkitemInteraction, assignmentState: AssignmentStateType) {\n        const workitemId = interaction.workitem.id;\n\n        const options = {\n            data: { assignmentState }\n        };\n\n        return this.makeWorkitemRequest(workitemId, options, 'patch');\n    },\n\n    /**\n     * Assign a Workitem to a queue or another agent. TransferType can be queue or person for an agent.\n     * If queue transfer is requested, a queueId is required.\n     * If agent transfer is requested, an assigneeId is required.\n     *\n     * @param interaction\n     * @param transferType\n     * @param transferOptions\n     * @returns\n     */\n    assignWorkitem(interaction: WorkitemInteraction, transferType: TransferType, transferOptions: TransferOptions) {\n        const workitemId = interaction.workitem.id;\n\n        let options = {\n            data: {}\n        };\n\n        if (transferType === 'queue') {\n            options.data = {\n                assignmentOperation: 'QueueAssignmentAlerting',\n                queueId: transferOptions.queueId\n            };\n        } else if (transferType === 'person') {\n            options.data = {\n                assignmentOperation: 'AgentAssignmentAlerting',\n                assigneeId: transferOptions.userId\n            };\n        }\n\n        return this.makeWorkitemRequest(workitemId, options, 'patch');\n    },\n\n    /**\n     * Load active Workitems for an Agent using the API.\n     * The assigneeId of the agent is required.\n     *\n     * @param userId\n     * @returns\n     */\n    loadActiveWorkitems(userId: string) {\n        const url = this.baseUri() + '/workitems/query';\n        const options = {\n            method: 'post',\n            data: {\n                filters: [\n                    {\n                        name: 'assigneeId',\n                        type: 'String',\n                        operator: 'EQ',\n                        values: [userId]\n                    },\n                    {\n                        name: 'assignmentState',\n                        type: 'String',\n                        operator: 'IN',\n                        values: ['Alerting', 'Connected', 'Held']\n                    }\n                ],\n                expands: ['type', 'workbin', 'status']\n            }\n        };\n\n        return this.makeRequest(url, options, options.method);\n    },\n\n    makeWorkitemRequest(workitemId: string, options: any, method: string) {\n        const url = `${this.baseUri()}/workitems/${workitemId}`;\n\n        return this.makeRequest(url, options, method);\n    },\n\n    async getWorktypeById(worktypeId: string) {\n        return this.makeRequest(`${this.baseUri()}/worktypes/${worktypeId}`);\n    },\n\n    async getWorkbinById(workbinId: string) {\n        return this.makeRequest(`${this.baseUri()}/workbins/${workbinId}`);\n    },\n\n    async getStatusByIds(typeId: string, statusId: string) {\n        return this.makeRequest(`${this.baseUri()}/worktypes/${typeId}/statuses/${statusId}`);\n    },\n\n    /**\n     * Lists all statuses for a worktype via GET /api/v2/taskmanagement/worktypes/{worktypeId}/statuses.\n     *\n     * @param worktypeId - The worktype whose statuses to load.\n     * @returns A status listing (`{ entities }`).\n     */\n    async getStatusesByWorktype(worktypeId: string) {\n        return this.makeRequest(`${this.baseUri()}/worktypes/${worktypeId}/statuses`);\n    },\n\n    async getSchemaById(schemaId: string, schemaVersion: number) {\n        return this.makeRequest(`${this.baseUri()}/workitems/schemas/${schemaId}/versions/${schemaVersion}`);\n    },\n\n    async getWorkitemById(workitemId: string) {\n        return this.makeRequest(\n            `${this.baseUri()}/workitems/${workitemId}?expands=${encodeURIComponent('type,workbin,status')}`\n        );\n    }\n});\n","import { A } from '@ember/array';\nimport EmberObject, { computed } from '@ember/object';\nimport Service from '@ember/service';\n\nexport default Service.extend({\n    events: A([] as any),\n    cachedEvents: EmberObject.create({}),\n\n    sortedEvents: computed('events.@each.timeAt', function () {\n        return [...this.get('events')].sort(\n            (a: any, b: any) => new Date(b.get('timeAt')).getTime() - new Date(a.get('timeAt')).getTime()\n        );\n    }),\n\n    mentionEvent(message: any) {\n        // this key ensures mentions are clearable by room, and still have unique keys\n        const eventKey = message.get('room.objectId') + '-mention-' + message.get('id');\n\n        const mention = EmberObject.create({\n            message,\n            eventKey,\n            type: 'mention',\n            timeAt: new Date(message.get('time')),\n            renderer: 'timeline-stream/mention-renderer'\n        });\n\n        this.get('events').unshiftObject(mention);\n        this.get('cachedEvents').set(eventKey, mention);\n    },\n\n    directMessageEvent(message: any) {\n        const messageKey = message.get('id');\n        const eventKey = message.get('chatUser.id');\n        const cachedEvents = this.get('cachedEvents');\n\n        let direct = cachedEvents.get(eventKey);\n        if (\n            !direct ||\n            // Create a new event group if 10+ minutes have passed since the last one (diff / 60,000 ms/min)\n            (!!direct &&\n                (new Date(message.get('time')).getTime() - new Date(direct.get('timeAt')).getTime()) / 60000 >= 10)\n        ) {\n            direct = EmberObject.create({\n                renderer: 'timeline-stream/direct-message-renderer',\n                eventKey,\n                type: 'direct-message',\n                timeAt: new Date(message.get('time')),\n                from: message.get('chatUser'),\n                messages: []\n            });\n\n            cachedEvents.set(eventKey, direct);\n            this.get('events').unshiftObject(direct);\n        } else {\n            direct.set('timeAt', new Date(message.get('time')));\n        }\n\n        direct.get('messages').pushObject(message);\n\n        // Store the event under the message id as well to enable duplicate checking\n        cachedEvents.set(messageKey, direct);\n    },\n\n    roomMessageEvent(message: any) {\n        const roomMessages = this.get('cachedEvents');\n        const eventKey = message.get('room.objectId');\n\n        let roomEvent = roomMessages.get(eventKey);\n        if (\n            !roomEvent ||\n            // Create a new event group if 10+ minutes have passed since the last one (diff / 60,000 ms/min)\n            (!!roomEvent &&\n                (new Date(message.get('time')).getTime() - new Date(roomEvent.get('timeAt')).getTime()) / 60000 >= 10)\n        ) {\n            roomEvent = EmberObject.create({\n                renderer: 'timeline-stream/room-message-renderer',\n                eventKey: eventKey,\n                type: 'room-message',\n                timeAt: new Date(message.get('time')),\n                room: message.get('room'),\n                messages: []\n            });\n\n            roomMessages.set(eventKey, roomEvent);\n            this.get('events').unshiftObject(roomEvent);\n        } else {\n            roomEvent.set('timeAt', new Date(message.get('time')));\n        }\n\n        roomEvent.get('messages').pushObject(message);\n    },\n\n    markEventAcknowledged(event: any) {\n        const key = event.get('eventKey');\n        if (key && event.type !== 'missed-call') {\n            this.get('cachedEvents').set(key, null);\n        }\n    },\n\n    missedCallEvent(call: any, callv2: boolean) {\n        const eventKey = call.get('id');\n        const missedCalls = this.get('cachedEvents');\n\n        let callEvent = missedCalls.get(eventKey);\n        if (!callEvent) {\n            const timeAt = callv2\n                ? new Date(call.get('callStart'))\n                : new Date(call.get('sortedSegmentBeginTimes')[0].segmentEnd);\n\n            callEvent = EmberObject.create({\n                renderer: 'timeline-stream/missed-call-renderer',\n                eventKey,\n                call,\n                voicemail: null,\n                type: 'missed-call',\n                timeAt\n            });\n            this.get('events').unshiftObject(callEvent);\n        } else {\n            callEvent.set('call', call);\n        }\n        missedCalls.set(eventKey, callEvent);\n    },\n\n    voicemailEvent(voicemail: any) {\n        const eventKey = voicemail.get('conversation.id');\n        const voicemails = this.get('cachedEvents');\n\n        let voicemailEvent = voicemails.get(eventKey);\n        if (!voicemailEvent) {\n            const timeAt = new Date(voicemail.get('createdDate'));\n\n            voicemailEvent = EmberObject.create({\n                renderer: 'timeline-stream/missed-call-renderer',\n                eventKey,\n                call: null,\n                voicemail,\n                type: 'missed-call',\n                timeAt\n            });\n\n            this.get('events').unshiftObject(voicemailEvent);\n        } else {\n            voicemailEvent.set('voicemail', voicemail);\n        }\n        voicemails.set(eventKey, voicemailEvent);\n    },\n\n    markAllRead() {\n        this.get('events').forEach((event: any) => {\n            event.set('acknowledged', true);\n            this.markEventAcknowledged(event);\n        });\n    },\n\n    markRead(type: string, eventId: string) {\n        const event = this.get('cachedEvents').get(eventId);\n        if (!!event) {\n            event.set('acknowledged', true);\n            this.markEventAcknowledged(event);\n        }\n\n        if (type === 'room') {\n            //check for mentions and clear them\n            (this.get('events') || A([]))\n                .filter((event: any) => event && event.eventKey && event.eventKey.indexOf(`${eventId}-mention`) >= 0)\n                .forEach((mention: any) => {\n                    mention.set('acknowledged', true);\n                    this.markEventAcknowledged(mention);\n                });\n        }\n    },\n\n    clearAllEvents() {\n        this.set('events', A([]));\n        this.set('cachedEvents', EmberObject.create({}));\n    }\n});\n","import { computed } from '@ember/object';\nimport Service, { inject as service } from '@ember/service';\nimport LoggerMixin from 'web-directory/mixins/logger';\n\nexport default Service.extend(LoggerMixin, {\n    session: service(),\n    ajax: service(),\n    application: service(),\n\n    freeTrialInfo: {},\n    freeTrialDaysRemaining: 0,\n    inActiveFreeTrial: false,\n\n    showTrialSupportCenter: computed('session.features.PURE-7878', function () {\n        return !this.get('session.features.PURE-7878');\n    }).readOnly(),\n\n    init() {\n        this._super(...arguments);\n        this.loadFreeTrialInfo();\n    },\n\n    loadFreeTrialInfo() {\n        const url = this.application.pcV2Uri('api/v2/billing/signup/freetrial');\n        return this.ajax\n            .request(url, { retry: false })\n            .then(data => {\n                this.set('freeTrialInfo', data);\n                this.set('inActiveFreeTrial', this.isTrialActive(data));\n            })\n            .catch(() => {\n                // This request is allowed to fail if not trial is active\n                this.set('inActiveFreeTrial', false);\n                this.set('freeTrialInfo', {});\n            });\n    },\n\n    isTrialActive: function (trialInfo) {\n        if (trialInfo && trialInfo.daysRemaining && trialInfo.daysRemaining > 0) {\n            this.set('freeTrialDaysRemaining', trialInfo.daysRemaining);\n            return true;\n        }\n        return false;\n    }\n});\n","import Service from '@ember/service';\nimport { computed, defineProperty } from '@ember/object';\nimport { getOwner } from '@ember/application';\nimport { A } from '@ember/array';\nimport { IVideoConferenceDetails } from '../types/video-conference-details.type';\n\nconst CONFERENCES_TO_TRACK = 10;\nconst VIDEO_CONFERENCE_UPDATE = 'videoConferenceUpdate';\n\n/**\n * NOTE on dependencies: this is a native class, so services are resolved with explicit container\n * lookups in init(). Two patterns were removed to get here:\n *\n *  - `ajax = inject('ajax')` class fields. Under Ember 3.28 a decorator assigned to a native class\n *    field is stored verbatim, so `this.get('pigeon')` returned the injection descriptor rather than\n *    the service. The same applied to `computed()` on a field: `showParticipantCount` evaluated to a\n *    truthy descriptor object, so the canViewCollaborateVideo check always passed.\n *  - `application.inject('service:video-conference-details', ...)` in the initializer, which installs\n *    getter-only properties. Those cannot be assigned (app boot threw \"Cannot set property ... which\n *    has only a getter\") and are absent entirely in unit tests, because initializers don't run under\n *    setupTest(). Owning the lookups here keeps app and test behaviour identical.\n *\n * `activeCount` is consumed by templates, so it is installed with defineProperty() to stay reactive;\n * `showParticipantCount` is only read internally and is a plain getter.\n * See .kiro/steering/ember-3-migration.md.\n */\nexport default class VideoConferenceDetailsService extends Service {\n    declare ajax: any;\n    declare application: any;\n    declare logger: any;\n    declare permissions: any;\n    declare pigeon: any;\n\n    declare activeCount: number;\n\n    subscribedConferences = A([] as IVideoConferenceDetails[]);\n\n    get showParticipantCount(): boolean {\n        return !!this.permissions?.canViewCollaborateVideo;\n    }\n\n    init() {\n        // Must use super.init() with native class syntax per Ember 3.28 assertion\n        super.init();\n\n        const owner = getOwner(this);\n        this.ajax = owner.lookup('service:ajax');\n        this.application = owner.lookup('service:application');\n        this.logger = owner.lookup('service:stash-logger');\n        this.permissions = owner.lookup('service:permissions');\n        this.pigeon = owner.lookup('service:pigeon');\n\n        defineProperty(\n            this,\n            'activeCount',\n            computed('subscribedConferences.[]', function (this: VideoConferenceDetailsService): number {\n                const activeConference = this.get('subscribedConferences')[0];\n                return this.getVideoParticipantCount(activeConference);\n            })\n        );\n\n        const pigeon = this.get('pigeon');\n        this.set('subscribedConferences', A([]));\n        pigeon.on('connect', this._onPigeonConnect.bind(this));\n        pigeon.on('disconnect', this._onPigeonDisconnect.bind(this));\n        pigeon.on(VIDEO_CONFERENCE_UPDATE, this._onVideoConferenceDetailsUpdate.bind(this));\n\n        if (pigeon.get('connected')) {\n            this._onPigeonConnect();\n        }\n    }\n\n    getVideoParticipantCount(subscribedConference: IVideoConferenceDetails): number {\n        return subscribedConference?.participantInfo?.activeParticipantCount ?? 0;\n    }\n\n    setActiveRoomId(roomId: string, isOneToOne: boolean) {\n        if (!this.get('showParticipantCount') || isOneToOne) {\n            return;\n        }\n\n        const conferenceId = roomId;\n\n        const conferenceIndex = this.get('subscribedConferences').findIndex(\n            existingConference => existingConference.conferenceId === conferenceId\n        );\n\n        let conferenceDetails = { conferenceId };\n        if (conferenceIndex === -1) {\n            const topic = this._topicForConferenceId(conferenceId);\n            this.get('pigeon').registerTopic(topic, VIDEO_CONFERENCE_UPDATE);\n            this._fetchConferenceDetails(conferenceId);\n        } else {\n            conferenceDetails = this.get('subscribedConferences')[conferenceIndex];\n            this.get('subscribedConferences').removeAt(conferenceIndex);\n        }\n\n        this.get('subscribedConferences').unshiftObject(conferenceDetails);\n        const newLength = this.get('subscribedConferences').length;\n        if (newLength > CONFERENCES_TO_TRACK) {\n            const conferenceToUnregister = this.get('subscribedConferences').popObject();\n            if (conferenceToUnregister !== null) {\n                const topic = this._topicForConferenceId(conferenceToUnregister.conferenceId);\n                this.get('pigeon').unRegisterTopic(topic);\n            }\n        }\n    }\n\n    async _fetchConferenceDetails(conferenceId: string) {\n        const conferenceDetailsPath = `api/v2/conversations/videos/${conferenceId}/details`;\n        const conferenceDetailsUrl = this.get('application').pcV2Uri(conferenceDetailsPath);\n\n        try {\n            const newConferenceDetails = await this.get('ajax').request(conferenceDetailsUrl);\n            const conferenceIndex = this.get('subscribedConferences').findIndex(\n                existingConference => existingConference.conferenceId === newConferenceDetails.conferenceId\n            );\n\n            if (conferenceIndex !== -1) {\n                const existingConferenceDetails = this.get('subscribedConferences')[conferenceIndex];\n\n                if (existingConferenceDetails.participantInfo === undefined) {\n                    this.get('subscribedConferences').replace(conferenceIndex, 1, [newConferenceDetails]);\n                }\n            }\n        } catch (error) {\n            // If there isn't an active conference, this will return a 404\n            if ((error as any).status !== 404) {\n                throw error;\n            }\n        }\n    }\n\n    _onVideoConferenceDetailsUpdate(newConferenceDetails: IVideoConferenceDetails) {\n        const conferenceIndex = this.get('subscribedConferences').findIndex(\n            existingConference => existingConference.conferenceId === newConferenceDetails.conferenceId\n        );\n\n        if (conferenceIndex !== -1) {\n            const existingConferenceDetails = this.get('subscribedConferences')[conferenceIndex];\n            const newVersion = newConferenceDetails.participantInfo?.version ?? 0;\n            const existingVersion = existingConferenceDetails.participantInfo?.version ?? 0;\n\n            if (\n                newConferenceDetails.conversationId !== existingConferenceDetails.conversationId ||\n                newVersion > existingVersion\n            ) {\n                this.get('subscribedConferences').replace(conferenceIndex, 1, [newConferenceDetails]);\n            }\n        }\n    }\n\n    _onPigeonConnect() {\n        const conferences = this.get('subscribedConferences');\n        if (conferences.length === 0) {\n            return;\n        }\n\n        this._fetchConferenceDetails(conferences[0].conferenceId);\n    }\n\n    _onPigeonDisconnect() {\n        const conferences = this.get('subscribedConferences');\n\n        if (conferences.length === 0) {\n            return;\n        }\n\n        const resetConferences = conferences.map(conference => {\n            return {\n                conferenceId: conference.conferenceId\n            };\n        });\n        this.set('subscribedConferences', A(resetConferences));\n    }\n\n    _topicForConferenceId(conferenceId: string): string {\n        const userPart = conferenceId.split('@')[0];\n        return `v2.video.conferences.${userPart}`;\n    }\n}\n\n/** DO NO REMOVE MODULE DECLARATION **/\ndeclare module '@ember/service' {\n    interface Registry {\n        videoConferenceDetails: VideoConferenceDetailsService;\n    }\n}\n","import { reads, alias } from '@ember/object/computed';\nimport { computed } from '@ember/object';\nimport Service, { inject as service } from '@ember/service';\nimport Evented from '@ember/object/evented';\n\nimport LoggerMixin from 'web-directory/mixins/logger';\nimport { isPersonJid, isAcdJid } from 'web-directory/utils/jid-helpers';\n\nimport { createVideoConferenceLink as buildConferenceLinkUrl } from '../utils/volt-popout';\n\nexport default Service.extend(LoggerMixin, Evented, {\n    audioElement: null,\n\n    session: service(),\n    sidebar: service(),\n    webrtc: service(),\n    chat: service(),\n    intl: service(),\n    fullscreen: service(),\n    application: service(),\n    notification: service(),\n    chatCommands: service(),\n    permissions: service(),\n    webrtcSettings: service(),\n\n    webrtcActiveRoom: alias('webrtc.activeRoom'),\n    isHosted: reads('application.hostedContext.isHostedProp'),\n    isShowingVideo: alias('webrtcActiveRoom.showingVideo'),\n    shouldPopout: reads('webrtcSettings.settings.directorySettings.alwaysPopoutVideo'),\n\n    voltConference: computed('webrtcActiveRoom.showingVideo', function () {\n        return !this.get('webrtcActiveRoom.oneToOneTarget');\n    }),\n\n    voltOneToOne: computed('webrtcActiveRoom.{oneToOneTarget,showingVideo}', function () {\n        return this.get('webrtcActiveRoom.oneToOneTarget');\n    }),\n\n    init() {\n        this._super(...arguments);\n        this.set('audioElement', new Audio());\n\n        if (this.get('permissions.canViewCollaborateVideo')) {\n            this.addChatCommands();\n        } else {\n            this.addObserver('permissions.canViewCollaborateVideo', this, this.observerAddChatCommands);\n        }\n    },\n\n    observerAddChatCommands() {\n        if (!this.get('permissions.canViewCollaborateVideo')) {\n            return;\n        }\n\n        this.removeObserver('permissions.canViewCollaborateVideo', this, this.observerAddChatCommands);\n        this.addChatCommands();\n    },\n\n    addChatCommands() {\n        this.chatCommands.addCommand(\n            'conferenceLink',\n            () => {\n                const conferenceLink = this.createVideoConferenceLink(this.get('chat.activeRoom.jid'));\n\n                if (conferenceLink.valid) {\n                    navigator.clipboard.writeText(conferenceLink.link).then(\n                        () => {\n                            let success = this.intl.t('volt.copyConferenceLinkSuccess');\n                            this.notification.info(null, success, {\n                                hideAfter: 2\n                            });\n                        },\n                        () => {\n                            this.notification.error(null, this.intl.t('volt.copyConferenceLinkError'));\n                        }\n                    );\n                } else {\n                    this.notification.error(null, this.intl.t('volt.conferenceLinkError'));\n                }\n            },\n            undefined,\n            false\n        );\n\n        this.chatCommands.addCommand('video', () => {\n            const room = this.get('chat.activeRoom');\n\n            this.application.openChatRoomWithVideo(room.get('jid'), false);\n        });\n    },\n\n    /**\n     * Generate the peer JID for a 1:1 video call between the current user and\n     * the given person.\n     *\n     * The popout owns the actual session — we just need a deterministic conference\n     * id so the URL we open matches what other participants generate.\n     */\n    prepareOneToOne(personJid) {\n        return this._generateOneToOneConferenceId(personJid);\n    },\n\n    createVideoConferenceLink(chatRoomJid) {\n        if (isPersonJid(chatRoomJid) || isAcdJid(chatRoomJid)) {\n            return { valid: false, link: this.intl.t('volt.conferenceLinkError') };\n        }\n\n        return { valid: true, link: buildConferenceLinkUrl(chatRoomJid) };\n    },\n\n    // Previews the join/leave video notification sound.\n    async playVideoNotificationPreview(selectedOutputDevice) {\n        const urlPrefix = this.get('application.urlprefix');\n        const audio = this.audioElement;\n        const volume = this.get('webrtcSettings.settings.voltSettings.notificationVolume');\n        audio.src = urlPrefix + 'assets/sounds/roster-notification.mp3';\n        audio.load();\n        audio.volume = (typeof volume === 'number' ? volume : 100) / 100;\n        audio.setSinkId(selectedOutputDevice.deviceId);\n        await audio.play();\n    },\n\n    _generateOneToOneConferenceId(personJid) {\n        const userJid = this.get('session.person.jid');\n        const userParts = [userJid, personJid].map(jid => jid.split('@')[0]);\n        const sortedUsers = userParts.sort();\n\n        const peerRoomJid = `peer-${sortedUsers.join('-')}@conference.${this.get('session.org.shortName')}.orgspan.com`;\n\n        return peerRoomJid;\n    }\n});\n","import Ember from 'ember';\n\nconst { computed, observer } = Ember;\n\nimport { Promise } from 'rsvp';\nimport LoggerMixin from '../mixins/logger';\nimport Evented from '@ember/object/evented';\n\nimport Service, { inject } from '@ember/service';\nimport {\n    AcdCallService,\n    ApplicationService,\n    IntlService,\n    PhoneService,\n    SessionService,\n    StashLoggerService\n} from '@web-directory/services';\nimport { PigeonService } from 'web-directory/services/pigeon';\nimport { AjaxServiceClass } from 'ember-ajax/services/ajax';\nimport { WebrtcSettingsService } from './webrtc-settings';\nimport ScreenMediaService, { BrowserScreenRecordingError } from './screen-media';\nimport {\n    IExtendedMediaSession,\n    ISdkMediaState,\n    IPendingSession,\n    SdkError,\n    IStation,\n    ISdkConversationUpdateEvent,\n    IStartSoftphoneSessionParams,\n    SessionTypes,\n    IEndSessionRequest,\n    ISessionMuteRequest,\n    IConversationHeldRequest,\n    GenesysCloudWebrtcSdk,\n    ISessionIdAndConversationId,\n    SdkErrorTypes,\n    IMediaSettings,\n    IPendingSessionActionParams,\n    MediaHandling\n} from 'genesys-cloud-webrtc-sdk';\nimport { ExpandedDeviceConnectionStatus } from 'genesys-cloud-webrtc-sdk/dist/es/headsets/headset-types';\nimport { IWebrtcSettings } from '../types/webrtc-settings.type';\nimport uuid from '../utils/uuid';\nimport { APP_NAME } from './stash-logger';\nimport config from '../config/environment';\nimport { getGenesysAppName } from '../utils/genesys-app-name';\nimport ComputedProperty from '@ember/object/computed';\nimport EmberArray from '@ember/array';\nimport EmberObject from '@ember/object';\nimport { differenceWith, isEqual } from 'lodash';\nimport MutableArray from '@ember/array/mutable';\n\nexport interface MediaDevices {\n    camera?: { deviceId: string };\n    microphone?: { deviceId: string };\n    outputDevice?: { deviceId: string };\n}\n\nexport type WebrtcEvents = {\n    deviceAnsweredCall: undefined;\n    deviceEndedCall: undefined;\n    deviceMuteStatusChanged: boolean;\n    deviceRejectedCall: string; // conversationId\n    autoAnswer: string; // conversationId\n    mediaStateChange: ISdkMediaState;\n};\n\nexport interface IVideoInvitation extends IPendingSession {\n    user?: any; // User entity from batch data requests\n    userJid?: string;\n    hasDisplayedToast?: boolean;\n}\n\nexport interface BasicConversationLegacy extends EmberObject {\n    id: string;\n    shouldAutoProceedWebrtc: boolean;\n    acceptedByClient: boolean;\n    isOutbound: boolean;\n    myselfIsMCB: boolean;\n    participants: [\n        {\n            bargedParticipantId?: string;\n            monitoredParticipantId?: string;\n            coachedParticipantId?: string;\n            userId: string;\n        }\n    ];\n}\n\nexport interface IPendingSessionEmber extends IPendingSession, EmberObject {}\n\nexport interface IVideoInvitationEmber extends IVideoInvitation, EmberObject {}\n\nexport interface WebrtcSdkService extends EmberObject {\n    // mimicks ember evented stuff, but with types\n    on<Target>(name: string, target: Target, method: (this: Target, ...args: any[]) => void): this;\n    on(name: string, method: (...args: any[]) => void): this;\n    one<Target>(name: string, target: Target, method: (this: Target, ...args: any[]) => void): this;\n    one(name: string, method: (...args: any[]) => void): this;\n    trigger<K extends keyof WebrtcEvents>(name: K, args: WebrtcEvents[K]): any;\n    off<Target>(name: string, target: Target, method: (this: Target, ...args: any[]) => void): this;\n    off(name: string, method: (...args: any[]) => void): this;\n\n    session: SessionService;\n    application: ApplicationService;\n    phone: PhoneService;\n    acdcallback: AcdCallService;\n    webrtcSettings: WebrtcSettingsService;\n    pigeon: PigeonService;\n    screenMedia: ScreenMediaService;\n    ajax: AjaxServiceClass;\n    intl: IntlService;\n\n    logger: StashLoggerService;\n    sdk: GenesysCloudWebrtcSdk;\n\n    initSdk(): Promise<void>;\n    initService(): Promise<void>;\n\n    pendingSessions: Ember.MutableArray<IPendingSessionEmber>;\n    videoInvitations: Ember.MutableArray<IVideoInvitationEmber>;\n    batchDataRequests: any;\n    station: IStation;\n    headsetState: ExpandedDeviceConnectionStatus;\n    mediaState: ISdkMediaState;\n    showPermissionsModal: boolean;\n    previousAutoAnswerProps: {\n        pendingSessions: { id: string; sessionType: SessionTypes }[];\n        conversationsToAutoAnswer: { id: string }[];\n    };\n    lastConversationUpdate: ISdkConversationUpdateEvent;\n    requestAdditionalPermissions: undefined | (() => void);\n    userId: ComputedProperty<string>;\n    hasActiveSoftphoneConversation: boolean;\n    hasActiveSoftphoneSession: boolean;\n    _initializingSdk: boolean;\n    isPersistentConnection: ComputedProperty<boolean>;\n    showPersistentFailureToasts: ComputedProperty<boolean>;\n    useSdk: ComputedProperty<boolean>;\n    useNewPolyImplementation: ComputedProperty<boolean>;\n    useWebHidOnDesktopCyberAcoustics: ComputedProperty<boolean>;\n    useWebHidOnDesktopJabra: ComputedProperty<boolean>;\n    useWebHidOnDesktopVbet: ComputedProperty<boolean>;\n    useWebHidOnDesktopYealink: ComputedProperty<boolean>;\n    relevantFeatureTogglesFetched: ComputedProperty<boolean>;\n    useHeadsets: ComputedProperty<boolean>;\n    settingsPromise: ComputedProperty<IWebrtcSettings>;\n    _inboundAcdCallsToAutoAnswer: ComputedProperty<EmberArray<BasicConversationLegacy>>;\n    _bargeCoachMonitorAutoAnswer: ComputedProperty<BasicConversationLegacy[]>;\n    manuallyAnsweredSoftphoneConversationsWithLatePropose: ComputedProperty<BasicConversationLegacy[]>;\n    _softphoneConversationsToAutoAnswer: ComputedProperty<BasicConversationLegacy[]>;\n    logChangedAutoAnswerProps(): void;\n    _autoAnswerSoftphone(): void;\n    _getSessionIdFromConversationId(conversationId: string): string;\n\n    /**\n     *\n     * EVENT HANDLERS FUNCTIONS\n     *\n     */\n    _handleMediaStateChange(mediaState: ISdkMediaState): Promise<void>;\n    _handlePendingSession(pendingSession: IPendingSession): void;\n    _handleVideoPendingSession(pendingSession: IPendingSession): Promise<void>;\n    _handleCancelPendingSession(pendingSession: ISessionIdAndConversationId): void;\n    _handleSessionStarted(session: IExtendedMediaSession): void;\n    _handleSdkError(sdkError: SdkError): void;\n    _handleSettingsChanged(settings: IWebrtcSettings): void;\n    _handleStationUpdate(update: { action: 'Associated' | 'Disassociated'; station: IStation | null }): void;\n    _handleConversationsUpdate(update: ISdkConversationUpdateEvent): void;\n    _handleSessionEnded(): void;\n    _checkHasActiveSoftphoneSession(): boolean;\n    _pollForActiveSoftphoneSession(maxAttempts?: number, delay?: number, attempt?: number): void;\n    _initializeScreenRecordingSession(screenRecordingSession: IExtendedMediaSession): Promise<void>;\n    _initializeLiveScreenMonitoringSession(liveScreenMonitoringSession: IExtendedMediaSession): Promise<void>;\n\n    /**\n     *\n     * PUBLIC FUNCTIONS\n     *\n     */\n    startSoftphoneSession(startParams: IStartSoftphoneSessionParams): Promise<{ id: string; selfUri: string }>;\n    setDevices(devices: MediaDevices): void;\n    setCallVolume(volume: number): void;\n    setMediaHandling(mediaType: MediaHandling): void;\n    ensureVideoPermissions(): Promise<void>;\n    ensureAudioPermissions(): Promise<void>;\n    acceptPendingSession(params: { conversationId: string; sessionType: SessionTypes }): Promise<void>;\n    rejectPendingSession(params: { conversationId: string; sessionType: SessionTypes }): Promise<void>;\n    findRemainingSessionsBasedOnParams(\n        conversationId: string,\n        sessionType?: SessionTypes\n    ): Ember.MutableArray<IPendingSessionEmber>;\n    endSession(endSessionParams: IEndSessionRequest): Promise<void>;\n    setMute(muteOptions: ISessionMuteRequest): Promise<void>;\n    setHold(heldOptions: IConversationHeldRequest): Promise<void>;\n    endAllSoftphoneSessions(): void;\n    getAllActiveSessions(): IExtendedMediaSession[];\n    shouldIgnoreSoftphone(): boolean;\n    getVideoInvitationByUserJid(userJid: string): IVideoInvitationEmber | undefined;\n    removeVideoInvitation(invitation: IVideoInvitationEmber): void;\n    declineVideoInvitation(invitation: IVideoInvitationEmber): void;\n}\n\nexport default Service.extend(LoggerMixin, Evented, {\n    session: inject('session'),\n    application: inject('application'),\n    phone: inject('phone'),\n    acdcallback: inject('acdcallback'),\n    conversationModeService: inject('modes/conversation-mode-service'),\n    webrtcSettings: inject('webrtcSettings'),\n    pigeon: inject('pigeon'),\n    screenMedia: inject('screenMedia'),\n    ajax: inject('ajax'),\n    intl: inject('intl'),\n    //@ts-ignore\n    batchDataRequests: inject('batchDataRequests'),\n\n    init(this: WebrtcSdkService) {\n        (this as any)._super(...arguments);\n\n        this.set('pendingSessions', Ember.A());\n        this.set('videoInvitations', Ember.A());\n        this.set('headsetState', 'noVendor');\n        this.set('showPermissionsModal', false);\n        this.set('requestAdditionalPermissions', undefined);\n        this.initService();\n    },\n\n    userId: computed.reads('session.person.id'),\n\n    isPersistentConnection: computed.reads('station.webRtcPersistentEnabled'),\n\n    useNewPolyImplementation: computed.reads('session.features.PURE-6951_newPolyImplementation'),\n    useWebHidOnDesktopCyberAcoustics: computed.reads('session.features.PURE-6951_useWebHidOnDesktopCyberAcoustics'),\n    useWebHidOnDesktopJabra: computed.reads('session.features.PURE-6951_useWebHidOnDesktopJabra'),\n    useWebHidOnDesktopVbet: computed.reads('session.features.PURE-6951_useWebHidOnDesktopVbet'),\n    useWebHidOnDesktopYealink: computed.reads('session.features.PURE-6951_useWebHidOnDesktopYealink'),\n    relevantFeatureTogglesFetched: computed(\n        'useNewPolyImplementation',\n        'useWebHidOnDesktopCyberAcoustics',\n        'useWebHidOnDesktopJabra',\n        'useWebHidOnDesktopVbet',\n        'useWebHidOnDesktopYealink',\n        function () {\n            const necessaryFeatureToggles = {\n                useNewPolyImplementation: this.get('useNewPolyImplementation'),\n                useWebHidOnDesktopCyberAcoustics: this.get('useWebHidOnDesktopCyberAcoustics'),\n                useWebHidOnDesktopJabra: this.get('useWebHidOnDesktopJabra'),\n                useWebHidOnDesktopVbet: this.get('useWebHidOnDesktopVbet'),\n                useWebHidOnDesktopYealink: this.get('useWebHidOnDesktopYealink')\n            };\n            const featureToggleStates = Object.values(necessaryFeatureToggles);\n\n            return (\n                featureToggleStates.filter(el => {\n                    return el !== null && typeof el !== 'undefined';\n                }).length === featureToggleStates.length\n            );\n        }\n    ),\n    useSdk: computed('sdk', function (this: WebrtcSdkService) {\n        return !this.shouldIgnoreSoftphone();\n    }),\n\n    phoneIncomingConversations: computed.reads('phone.incomingConversations'),\n    settingsPromise: computed.readOnly('webrtcSettings.userSettingsPromise'),\n\n    // I know I said no observables, but I'm making an exception here\n    initService: observer('session.accessToken', 'relevantFeatureTogglesFetched', function (this: WebrtcSdkService) {\n        //@ts-ignore\n        if (\n            this.get('session.accessToken' as any) &&\n            !this.get('_initializingSdk') &&\n            !this.get('sdk') &&\n            this.get('relevantFeatureTogglesFetched')\n        ) {\n            this.set('_initializingSdk', true);\n            this.logger.debug('initializing the webrtc sdk');\n            this.initSdk().catch((err: unknown) => {\n                // If initSdk fails during token transition, reset\n                // the initialization guard so it can retry when a\n                // valid token arrives. (ATLAS-2431)\n                this.logger.warn('initSdk failed, will retry on next valid token', { err });\n                this.set('_initializingSdk', false);\n            });\n        }\n    }),\n\n    showPersistentFailureToasts: computed.reads('session.features.STREAM-1868_persistent_failure_toast'),\n\n    _sdkSoftphoneChange: observer('useSdk', async function (this: WebrtcSdkService) {\n        const sdk = this.get('sdk');\n\n        // we only care if the feature toggle changed after we initialized\n        if (!sdk) {\n            return;\n        }\n\n        const softphoneViaSdk = this.get('useSdk');\n        const isCurrentlyEnabled = sdk._config.allowedSessionTypes?.includes(SessionTypes.softphone);\n\n        if (softphoneViaSdk !== isCurrentlyEnabled) {\n            if (softphoneViaSdk) {\n                this.logger.info('enabling softphone via sdk due to feature toggle change');\n                await sdk.addAllowedSessionType(SessionTypes.softphone);\n                sdk.setUseHeadsets(true);\n            } else {\n                this.logger.info('disabling softphone via sdk due to feature toggle change');\n                await sdk.removeAllowedSessionType(SessionTypes.softphone);\n                sdk.setUseHeadsets(false);\n            }\n        }\n    }),\n\n    async initSdk(this: WebrtcSdkService) {\n        let allowedSessionTypes: SessionTypes[] = [];\n        let jidResource: string | undefined;\n\n        if (!this.shouldIgnoreSoftphone()) {\n            allowedSessionTypes = [SessionTypes.softphone];\n\n            const runAsMediaHelper =\n                (this.get('application.hostedContext.isHostedProp' as any) || (window as any).testMediaHelperMode) &&\n                this.get('application.hostedContext.runAsMediaHelper' as any);\n\n            if (runAsMediaHelper) {\n                jidResource = `mediahelper_wdsdk_${uuid.generate()}`;\n                this.logger.info(`Sdk to use media helper jid: ${jidResource}`);\n            }\n        }\n\n        if (this.get('screenMedia').canDoScreenRecording()) {\n            allowedSessionTypes.push(SessionTypes.screenRecording);\n            allowedSessionTypes.push(SessionTypes.liveScreenMonitoring);\n        }\n\n        // Include collaborateVideo so the SDK doesn't reject video proposals (GC comes with video by default).\n        allowedSessionTypes.push(SessionTypes.collaborateVideo);\n\n        this.logger.info('Initializing webrtc-sdk with session types: ', {\n            remoteData: {\n                allowedSessionTypes: allowedSessionTypes.map(t => String(t))\n            }\n        });\n\n        const settings = await this.get('settingsPromise');\n\n        // Re-check the access token after the async settings fetch. During auth\n        // transitions (gcmfeauth), the token can become null between when the\n        // observer fires and when we actually construct the SDK. Bail out so the\n        // observer can retry with a valid token. (ATLAS-2431)\n        const currentToken = this.get('session.accessToken' as any);\n        if (!currentToken) {\n            this.logger.warn('Access token became null before SDK construction, aborting initSdk');\n            throw new Error('accessToken became null during initSdk');\n        }\n\n        const sdk = new GenesysCloudWebrtcSdk({\n            accessToken: currentToken,\n            environment: this.get('application').get('runtime').publicDomainName,\n            disableAutoAnswer: true, // web dir has some unique auto answer logic so we need to handle it ourselves\n            allowedSessionTypes,\n            jidResource,\n            autoAcceptPendingScreenRecordingRequests: true,\n            autoAcceptPendingLiveScreenMonitoringRequests: false,\n            useHeadsets: !this.shouldIgnoreSoftphone(),\n            originAppName: APP_NAME + '-sdk',\n            originAppVersion: config.APP.semver as string,\n            originAppId: this.get('stashLogger.clientSessionId' as any),\n            useNewPolyImplementation: this.get('useNewPolyImplementation'),\n            useWebHidOnDesktopCyberAcoustics: this.get('useWebHidOnDesktopCyberAcoustics'),\n            useWebHidOnDesktopJabra: this.get('useWebHidOnDesktopJabra'),\n            useWebHidOnDesktopVbet: this.get('useWebHidOnDesktopVbet'),\n            useWebHidOnDesktopYealink: this.get('useWebHidOnDesktopYealink'),\n            useServerSidePings: true,\n            hostedContext: this.get('application.hostedContext' as any),\n            customHeaders: {\n                'Genesys-App': getGenesysAppName({\n                    semver: config.APP.semver as string,\n                    isHosted: this.get('application.hostedContext.isHostedProp' as any),\n                    isPopout: this.get('application.isPopout' as any)\n                })\n            },\n            defaults: {\n                micAutoGainControl: settings?.generalSettings?.advancedMicSettings?.autoGain,\n                micEchoCancellation: settings?.generalSettings?.advancedMicSettings?.echoCancellation,\n                micNoiseSuppression: settings?.generalSettings?.advancedMicSettings?.noiseSuppression\n            }\n        });\n\n        sdk.on('pendingSession', this._handlePendingSession.bind(this));\n        sdk.on('sessionStarted', this._handleSessionStarted.bind(this));\n        sdk.on('sessionEnded', this._handleSessionEnded.bind(this));\n        sdk.on('cancelPendingSession', this._handleCancelPendingSession.bind(this));\n        sdk.on('station', this._handleStationUpdate.bind(this));\n        sdk.on('conversationUpdate', this._handleConversationsUpdate.bind(this));\n        sdk.media.on('state', this._handleMediaStateChange.bind(this));\n        sdk.on('concurrentSoftphoneSessionsEnabled', (value: boolean) =>\n            this.logger.info('concurrentSoftphoneSessionsEnabled', { value })\n        );\n        sdk.on('sdkError', this._handleSdkError.bind(this));\n        this.get('webrtcSettings').on('sdkSettingsUpdate', settings => {\n            if (this.get('sdk')) {\n                this._handleSettingsChanged(settings);\n            }\n        });\n\n        sdk.on('handledPendingSession', (session: ISessionIdAndConversationId) => {\n            this.logger.info('Another WebRTC client handled the pending session; clearing local pending state', {\n                remoteData: { sessionId: session.sessionId, conversationId: session.conversationId }\n            });\n            this._handleCancelPendingSession(session);\n        });\n\n        await sdk.initialize();\n        this.logger.info('SDK initialized successfully', {\n            remoteData: {\n                allowedSessionTypes: allowedSessionTypes.map(t => String(t)),\n                sdkVersion: (sdk as any).VERSION || 'unknown'\n            }\n        });\n\n        if (this.get('session').features['CHAT-3526_enableAlertingLeaderPublicApi']) {\n            sdk.setMediaHandling(MediaHandling.reducedMedia);\n        }\n\n        sdk.media.requestMediaPermissions('audio');\n\n        sdk.headset.headsetEvents$.subscribe(value => {\n            switch (value.event) {\n                case 'deviceAnsweredCall':\n                    this.trigger(value.event, undefined);\n                    break;\n                case 'deviceEndedCall':\n                    this.trigger(value.event, undefined);\n                    break;\n                case 'deviceMuteStatusChanged':\n                    this.trigger(value.event, value.payload.isMuted);\n                    break;\n                case 'deviceHoldStatusChanged':\n                    (this.trigger as any)(value.event, value.payload.holdRequested, value.payload.toggle);\n                    break;\n                case 'deviceRejectedCall':\n                    this.trigger(value.event, value.payload.conversationId);\n                    break;\n                case 'webHidPermissionRequested':\n                    this.set('showPermissionsModal', true);\n                    this.set('requestAdditionalPermissions', value.payload.callback);\n                    break;\n                case 'deviceConnectionStatusChanged':\n                    this.set('headsetState', value.payload);\n                    break;\n                default:\n            }\n        });\n\n        this.set('sdk', sdk);\n    },\n\n    _inboundAcdCallsToAutoAnswer: computed('phone.incomingConversations.[]', function (this: WebrtcSdkService) {\n        const incomingConversations = this.get(\n            'phone.incomingConversations' as any\n        ) as EmberArray<BasicConversationLegacy>;\n        if (!incomingConversations) {\n            return Ember.A();\n        }\n\n        return Ember.A(\n            incomingConversations.filter(conversation => {\n                const pendingSession = this.get('pendingSessions').findBy(\n                    'conversationId',\n                    Ember.get(conversation, 'id')\n                );\n                const shouldAutoAnswer = pendingSession && pendingSession.autoAnswer;\n                if (!shouldAutoAnswer && incomingConversations.length) {\n                    this.logger.debug('Inbound ACD call not eligible for auto-answer', {\n                        remoteData: {\n                            conversationId: Ember.get(conversation, 'id'),\n                            hasPendingSession: !!pendingSession,\n                            pendingSessionAutoAnswer: pendingSession ? pendingSession.autoAnswer : undefined\n                        }\n                    });\n                }\n                return shouldAutoAnswer;\n            })\n        );\n    }),\n\n    _bargeCoachMonitorAutoAnswer: computed(\n        'phone.conversations.@each.myselfIsMCB',\n        'pendingSessions.[]',\n        function (this: WebrtcSdkService) {\n            const conversations = this.get('phone.conversations' as any) as EmberArray<BasicConversationLegacy>;\n            if (!conversations) {\n                return Ember.A();\n            }\n            const pendingConversation = conversations.find(conversation => {\n                const pendingSession = this.get('pendingSessions').findBy(\n                    'conversationId',\n                    Ember.get(conversation, 'id')\n                );\n                // barge, monitor, and coach calls will have autoAnswer, so if the session has no autoAnswer, we filter it out.\n                return pendingSession && pendingSession.get('autoAnswer');\n            });\n            if (!pendingConversation || !pendingConversation.participants) {\n                return Ember.A();\n            }\n            /*\n            There will only be one pending conversation matching the conversation ID, we need to make sure its either a barge-in, monitor, or coach session.\n            Barge-in sessions are outbound calls that need to be auto-answered. Monitor/coach are inbound calls that need to be auto-answered.\n            */\n            const mySelfIsMonitorCoachBarge = pendingConversation.get('myselfIsMCB');\n            if (mySelfIsMonitorCoachBarge) {\n                this.logger.info('Auto-answer: barge/coach/monitor session eligible for auto-answer', {\n                    remoteData: {\n                        conversationId: Ember.get(pendingConversation, 'id')\n                    }\n                });\n            }\n            return mySelfIsMonitorCoachBarge ? Ember.A([pendingConversation]) : Ember.A();\n        }\n    ),\n\n    // PCM-2099 - This is somewhat of a hack in order to handle delayed proposes when using persistent connection. We\n    // normally hide the interaction buttons until we have a conversation update *and* a pending session, however\n    // in the case of persistent connection, we don't know if that connection already exists somewhere else so we can't\n    // gate the answer/decline buttons waiting for the pending session. If someone manages to answer before\n    // the pending session is received, we make assumptions and try and answer via pub api, then when the delayed\n    // propose comes in, we do nothing and the call goes unanswered. Whenever we get a new pending session, we need\n    // to look at the answered conversations and auto answer it (assuming station has persistent connection).\n    manuallyAnsweredSoftphoneConversationsWithLatePropose: computed(\n        'pendingSessions.[]',\n        'phone.conversations.@each.acceptedByClient',\n        'isPersistentConnection',\n        function (this: WebrtcSdkService) {\n            if (!this.get('isPersistentConnection')) {\n                return [];\n            }\n\n            const manuallyAnsweredSoftphoneConversationsWithLatePropose = this.get('phone.conversations' as any).filter(\n                (c: BasicConversationLegacy) => {\n                    return (\n                        c.get('shouldAutoProceedWebrtc') &&\n                        this.get('pendingSessions').find(pendingSession => {\n                            const isSoftphone = pendingSession.sessionType === SessionTypes.softphone;\n                            return isSoftphone && pendingSession.conversationId === c.get('id');\n                        })\n                    );\n                }\n            );\n\n            if (manuallyAnsweredSoftphoneConversationsWithLatePropose.length) {\n                const conversationIds = manuallyAnsweredSoftphoneConversationsWithLatePropose.map(\n                    (c: BasicConversationLegacy) => c.get('id')\n                );\n                this.logger.info('Found answered conversation(s) for which we received a late propose', {\n                    remoteData: { conversationIds }\n                });\n            }\n\n            return manuallyAnsweredSoftphoneConversationsWithLatePropose;\n        }\n    ),\n\n    _callbackCallsToAutoAnswer: computed(\n        'session.useModes',\n        'acdcallback.incomingCallbackCallsToAutoAnswer.[]',\n        'conversationModeService.incomingCallbackCallsToAutoAnswer.[]',\n        function (this: WebrtcSdkService) {\n            if (this.get('session.useModes' as any)) {\n                return this.get('conversationModeService.incomingCallbackCallsToAutoAnswer' as any) || [];\n            }\n            return this.get('acdcallback.incomingCallbackCallsToAutoAnswer' as any) || [];\n        }\n    ),\n\n    _softphoneConversationsToAutoAnswer: computed.union(\n        '_inboundAcdCallsToAutoAnswer',\n        'phone.dialingOrContactingOrAlertingConversationsToProceed',\n        '_callbackCallsToAutoAnswer',\n        '_bargeCoachMonitorAutoAnswer',\n        'manuallyAnsweredSoftphoneConversationsWithLatePropose'\n    ),\n\n    logChangedAutoAnswerProps(this: WebrtcSdkService) {\n        const previous = this.get('previousAutoAnswerProps') || { pendingSessions: [], conversationsToAutoAnswer: [] };\n\n        const simplifiedPendingSessions = this.get('pendingSessions').map(s => ({\n            id: s.id,\n            sessionType: s.sessionType as SessionTypes\n        }));\n        const simplifiedConversations = this.get('_softphoneConversationsToAutoAnswer').map(c => ({ id: c.get('id') }));\n\n        const newPendingSessions = differenceWith(simplifiedPendingSessions, previous.pendingSessions, isEqual);\n        const removedPendingSessions = differenceWith(previous.pendingSessions, simplifiedPendingSessions, isEqual);\n\n        const newConversations = differenceWith(simplifiedConversations, previous.conversationsToAutoAnswer, isEqual);\n        const removedConversations = differenceWith(\n            previous.conversationsToAutoAnswer,\n            simplifiedConversations,\n            isEqual\n        );\n\n        if (\n            newPendingSessions.length ||\n            newConversations.length ||\n            removedConversations.length ||\n            removedPendingSessions.length\n        ) {\n            const newAutoAnswerProps = {\n                pendingSessions: simplifiedPendingSessions,\n                conversationsToAutoAnswer: simplifiedConversations\n            };\n            this.logger.info('Checking conversations to auto answer', { remoteData: newAutoAnswerProps });\n            this.set('previousAutoAnswerProps', newAutoAnswerProps);\n        }\n    },\n\n    _autoAnswerSoftphone: observer(\n        'pendingSessions.[]',\n        '_softphoneConversationsToAutoAnswer.[]',\n        function (this: WebrtcSdkService) {\n            this.logChangedAutoAnswerProps();\n\n            const pendingSoftphoneSessions = this.get('pendingSessions').filterBy(\n                'sessionType',\n                SessionTypes.softphone\n            );\n            if (!pendingSoftphoneSessions.length) {\n                const conversationsToAutoAnswer = this.get('_softphoneConversationsToAutoAnswer');\n                if (conversationsToAutoAnswer.length) {\n                    this.logger.info(\n                        'Auto-answer: have conversations to answer but no pending softphone sessions yet',\n                        {\n                            remoteData: {\n                                conversationIds: conversationsToAutoAnswer.map(c => Ember.get(c, 'id')),\n                                allPendingSessionTypes: this.get('pendingSessions').map(s => s.sessionType)\n                            }\n                        }\n                    );\n                }\n                return;\n            }\n\n            let conversationsToAutoAnswer = this.get('_softphoneConversationsToAutoAnswer');\n            conversationsToAutoAnswer.forEach(conversation => {\n                if (conversation) {\n                    let sessionsToAccept = pendingSoftphoneSessions.filterBy(\n                        'conversationId',\n                        Ember.get(conversation, 'id')\n                    );\n\n                    if (!sessionsToAccept.length) {\n                        this.logger.debug('Auto-answer: conversation has no matching pending softphone session', {\n                            remoteData: {\n                                conversationId: Ember.get(conversation, 'id'),\n                                pendingSoftphoneSessionConversationIds: pendingSoftphoneSessions.map(\n                                    s => s.conversationId\n                                )\n                            }\n                        });\n                    }\n\n                    sessionsToAccept.forEach(sessionToAccept => {\n                        if (!sessionToAccept.accepted) {\n                            this.logger.info('attempting to auto answer session v2', {\n                                remoteData: {\n                                    sessionId: sessionToAccept.id,\n                                    conversationId: Ember.get(conversation, 'id')\n                                }\n                            });\n\n                            sessionToAccept.accepted = true;\n\n                            if (\n                                !Ember.get(conversation, 'isOutbound') &&\n                                !Ember.get(conversation, 'acceptedByClient') &&\n                                !Ember.get(conversation, 'shouldAutoProceedWebrtc')\n                            ) {\n                                this.trigger('autoAnswer', Ember.get(conversation, 'id'));\n                            }\n\n                            this.acceptPendingSession({\n                                conversationId: Ember.get(conversation, 'id'),\n                                sessionType: sessionToAccept.sessionType as SessionTypes\n                            });\n                        }\n                    });\n                }\n            });\n        }\n    ),\n\n    _getSessionIdFromConversationId(this: WebrtcSdkService, conversationId: string) {\n        const pendingSession = this.get('pendingSessions').findBy('conversationId', conversationId);\n        return pendingSession && pendingSession.id;\n    },\n\n    /**\n     *\n     * EVENT HANDLERS FUNCTIONS\n     *\n     */\n\n    async _handleMediaStateChange(this: WebrtcSdkService, state: ISdkMediaState) {\n        if (!state.micPermissionsRequested) {\n            this.logger.debug('No mic permissions');\n        }\n\n        await (this.get('intl.loadedPromise' as any) as Promise<void>);\n        state.devices = state.devices.map(device => {\n            let displayLabel = device.label;\n            if (device.kind === 'audioinput' || device.kind === 'audiooutput') {\n                if (device.deviceId === 'default') {\n                    displayLabel = this.get('intl').t('deviceProfiles.default');\n                } else if (device.deviceId === 'communications') {\n                    displayLabel = this.get('intl').t('deviceProfiles.communicationsDefault');\n                }\n            }\n\n            return Object.assign(device, { displayLabel });\n        });\n\n        this.set('mediaState', state);\n        this.trigger('mediaStateChange', state);\n    },\n\n    _handlePendingSession(this: WebrtcSdkService, pendingSession: IPendingSession) {\n        // Handle video sessions separately only if Volt redesign is enabled\n        if (pendingSession.sessionType === SessionTypes.collaborateVideo) {\n            this._handleVideoPendingSession(pendingSession);\n            return;\n        }\n\n        // Do not handle pendingSessions from liveScreenMonitoring sessions.\n        // The SDK will auto accept for the Agent, and Volt will auto accept for the Supervisor.\n        if (pendingSession.sessionType === SessionTypes.liveScreenMonitoring) {\n            this.logger.info('Ignoring liveScreenMonitoring pending session', {\n                remoteData: {\n                    sessionId: pendingSession.id,\n                    conversationId: pendingSession.conversationId\n                }\n            });\n            return;\n        }\n\n        // For non-video sessions\n        this.get('pendingSessions').pushObject(Ember.Object.create(pendingSession));\n    },\n\n    async _handleVideoPendingSession(this: WebrtcSdkService, pendingSession: IPendingSession) {\n        // Do not alert for agent video sessions.\n        if (pendingSession.fromJid?.startsWith('agent-')) {\n            return;\n        }\n\n        this.logger.info('Received video invitation', {\n            remoteData: {\n                sessionId: pendingSession.id,\n                conversationId: pendingSession.conversationId,\n                fromUserId: pendingSession.fromUserId,\n                roomJid: pendingSession.roomJid\n            }\n        });\n\n        const videoInvitation: IVideoInvitation = { ...pendingSession };\n        const invitation = Ember.Object.create(videoInvitation) as IVideoInvitationEmber;\n\n        // Add immediately so cancellation can find it before the user fetch resolves\n        this.get('videoInvitations').pushObject(invitation);\n        this.logger.info('Adding video invitation to videoInvitations alert array', {\n            remoteData: {\n                sessionId: invitation.get('id'),\n                conversationId: invitation.get('conversationId'),\n                fromUserId: invitation.get('fromUserId'),\n                currentCount: this.get('videoInvitations').length\n            }\n        });\n\n        if (pendingSession.fromUserId) {\n            try {\n                const user = await this.get('batchDataRequests').getUser(pendingSession.fromUserId);\n                // Only update if the invitation wasn't cancelled/removed while we were fetching\n                if (this.get('videoInvitations').includes(invitation)) {\n                    invitation.set('user', user);\n                    invitation.set('userJid', user?.get('jid'));\n                }\n            } catch (error) {\n                this.logger.warn('Failed to fetch user info for video invitation', { error });\n            }\n        }\n\n        // Only show toast if the invitation is still active (wasn't cancelled during user fetch)\n        if (this.get('videoInvitations').includes(invitation)) {\n            (this.trigger as any)('videoInvitationReceived', invitation);\n        }\n    },\n\n    _handleCancelPendingSession(this: WebrtcSdkService, pendingSession: ISessionIdAndConversationId) {\n        // Handle video session cancellation\n        const cancelledVideoInvitation = this.get('videoInvitations').find(s => {\n            const storedSessionId = s.get('sessionId') || s.get('id');\n            return storedSessionId === pendingSession.sessionId;\n        });\n        if (cancelledVideoInvitation) {\n            const remainingVideoInvitations = this.get('videoInvitations').filter(s => {\n                const storedSessionId = s.get('sessionId') || s.get('id');\n                return storedSessionId !== pendingSession.sessionId;\n            }) as unknown as MutableArray<IVideoInvitationEmber>;\n            this.set('videoInvitations', remainingVideoInvitations);\n\n            // Emit event for alerting-manager to dismiss toast - we're using events because observers are BAD.\n            (this.trigger as any)('videoInvitationCancelled', pendingSession);\n            return;\n        }\n\n        // Handle softphone session cancellation\n        const pendingSessions = this.get('pendingSessions').filter(\n            s => s.get('sessionId') !== pendingSession.sessionId\n        ) as unknown as MutableArray<IPendingSessionEmber>;\n        this.logger.info('Pending session cancelled (auto-answer may not proceed for this session)', {\n            remoteData: {\n                sessionId: pendingSession.sessionId,\n                conversationId: pendingSession.conversationId,\n                remainingPendingSessions: pendingSessions.length\n            }\n        });\n        this.set('pendingSessions', pendingSessions);\n    },\n\n    _handleSessionStarted(this: WebrtcSdkService, session: IExtendedMediaSession) {\n        this.logger.debug('Received incoming session from webrtc sdk', session);\n        if (this.get('screenMedia').canDoScreenRecording()) {\n            // desktop app\n            if (this.get('sdk')!.isScreenRecordingSession(session)) {\n                this._initializeScreenRecordingSession(session);\n            } else if (this.get('sdk')!.isLiveScreenMonitoringSession(session)) {\n                const isObserver = session.fromUserId && session.fromUserId !== this.get('userId');\n                if (isObserver) {\n                    // Volt popout handles everything. Don't 'steal' the session here.\n                    return;\n                } else {\n                    // initialize for Agent\n                    this._initializeLiveScreenMonitoringSession(session);\n                }\n            }\n        }\n\n        this._pollForActiveSoftphoneSession();\n    },\n\n    _pollForActiveSoftphoneSession(this: WebrtcSdkService, maxAttempts = 10, delay = 500, attempt = 0) {\n        setTimeout(() => {\n            const hasActiveSession = this._checkHasActiveSoftphoneSession();\n\n            if (!hasActiveSession && attempt < maxAttempts) {\n                this._pollForActiveSoftphoneSession(maxAttempts, delay, attempt + 1);\n            }\n        }, delay);\n    },\n\n    _handleSdkError(this: WebrtcSdkService, sdkError: SdkError) {\n        // we are assuming that general errors are going to have handled and reported by the sdk itself.\n        // basically we want whitelist error handling\n        if (sdkError.type !== SdkErrorTypes.call) {\n            this.logger.debug('received a SDK error', sdkError);\n            return;\n        }\n\n        // A FAILED persistent connection (the softphone's connection to the Edge actually\n        // breaking) gets a dedicated toast so it's distinguishable from other call errors.\n        // Other states (DISCONNECTED, UNKNOWN, etc.) are not treated as persistent-connection\n        // failures.\n        const persistentState = sdkError.details?.persistentState;\n        if (!persistentState) {\n            this.get('phone').showErrorNotification(sdkError.details?.errorInfo);\n        } else if (persistentState === 'FAILED') {\n            if (this.get('showPersistentFailureToasts')) {\n                this.get('phone').showPersistentConnectionStateNotification();\n            } else {\n                this.get('phone').showErrorNotification(sdkError.details?.errorInfo);\n            }\n        }\n    },\n\n    _handleSettingsChanged(this: WebrtcSdkService, settings: IWebrtcSettings) {\n        const advMicSettings = (settings.generalSettings && settings.generalSettings.advancedMicSettings) || {};\n        const sdk = this.get('sdk')!;\n        const { defaults: sdkDefaults } = sdk._config;\n        const updatedSettings: IMediaSettings = {};\n\n        // default to current sdk settings if undefined\n        if (typeof advMicSettings.autoGain === 'undefined') {\n            advMicSettings.autoGain = !!sdkDefaults!.micAutoGainControl;\n        }\n        if (typeof advMicSettings.echoCancellation === 'undefined') {\n            advMicSettings.echoCancellation = !!sdkDefaults!.micEchoCancellation;\n        }\n        if (typeof advMicSettings.noiseSuppression === 'undefined') {\n            advMicSettings.noiseSuppression = !!sdkDefaults!.micNoiseSuppression;\n        }\n\n        // override with updated settings\n        if (advMicSettings.autoGain !== null && advMicSettings.autoGain !== sdkDefaults!.micAutoGainControl) {\n            updatedSettings.micAutoGainControl = advMicSettings.autoGain;\n        }\n        if (\n            advMicSettings.echoCancellation !== null &&\n            advMicSettings.echoCancellation !== sdkDefaults!.micEchoCancellation\n        ) {\n            updatedSettings.micEchoCancellation = advMicSettings.echoCancellation;\n        }\n        if (\n            advMicSettings.noiseSuppression !== null &&\n            advMicSettings.noiseSuppression !== sdkDefaults!.micNoiseSuppression\n        ) {\n            updatedSettings.micNoiseSuppression = advMicSettings.noiseSuppression;\n        }\n\n        sdk.updateDefaultMediaSettings({ ...updatedSettings, updateActiveSessions: true });\n    },\n\n    _handleStationUpdate(this: WebrtcSdkService, { station }: { station: IStation }) {\n        const newStation = station && Ember.Object.create(station);\n        this.set('station', newStation);\n    },\n\n    _handleConversationsUpdate(this: WebrtcSdkService, update: ISdkConversationUpdateEvent) {\n        this.set('lastConversationUpdate', Ember.Object.create(update));\n        this.set('hasActiveSoftphoneConversation', !!update.current.length);\n        this.logger.debug('sdk conversation update', update);\n    },\n\n    _handleSessionEnded(this: WebrtcSdkService) {\n        this._checkHasActiveSoftphoneSession();\n    },\n\n    _checkHasActiveSoftphoneSession(this: WebrtcSdkService) {\n        // for the case of persistent connection we need to check if we have active sessions still\n        const softphoneSessions = this.get('sdk')!\n            .sessionManager.getAllActiveSessions()\n            .filter(session => session.sessionType === SessionTypes.softphone);\n        return this.set('hasActiveSoftphoneSession', !!softphoneSessions.length);\n    },\n\n    async _initializeScreenRecordingSession(this: WebrtcSdkService, screenRecordingSession: IExtendedMediaSession) {\n        try {\n            const { stream, metadatas } = await this.get('screenMedia').getMediaStreamWithAllMonitors(\n                screenRecordingSession.conversationId\n            );\n            await this.get('sdk')!.acceptSession({\n                conversationId: screenRecordingSession.conversationId,\n                sessionType: SessionTypes.screenRecording,\n                screenRecordingMetadatas: metadatas,\n                mediaStream: stream\n            });\n        } catch (e: any) {\n            if (!(e instanceof BrowserScreenRecordingError)) {\n                this.logger.error(e.message);\n            }\n        }\n    },\n\n    async _initializeLiveScreenMonitoringSession(\n        this: WebrtcSdkService,\n        liveScreenMonitoringSession: IExtendedMediaSession\n    ) {\n        try {\n            const { stream, metadatas } = await this.get('screenMedia').getMediaStreamWithAllMonitors(\n                liveScreenMonitoringSession.conversationId\n            );\n            await this.get('sdk')!.acceptSession({\n                conversationId: liveScreenMonitoringSession.conversationId,\n                sessionType: SessionTypes.liveScreenMonitoring,\n                screenRecordingMetadatas: metadatas,\n                mediaStream: stream\n            });\n        } catch (e: any) {\n            if (!(e instanceof BrowserScreenRecordingError)) {\n                this.logger.error(e.message);\n            }\n        }\n    },\n\n    /**\n     *\n     * PUBLIC FUNCTIONS\n     *\n     */\n    startSoftphoneSession(this: WebrtcSdkService, startParams: IStartSoftphoneSessionParams) {\n        return this.get('sdk').startSoftphoneSession(startParams);\n    },\n\n    setDevices(this: WebrtcSdkService, devices: MediaDevices) {\n        const sdk = this.get('sdk');\n        sdk.updateDefaultDevices({\n            videoDeviceId: devices.camera && devices.camera.deviceId,\n            audioDeviceId: devices.microphone && devices.microphone.deviceId,\n            outputDeviceId: devices.outputDevice && devices.outputDevice.deviceId,\n            updateActiveSessions: true\n        });\n    },\n\n    setCallVolume(this: WebrtcSdkService, volume: number) {\n        const sdk = this.get('sdk');\n        // Only allow call volume updates after we're sure the SDK is initialized.\n        if (!sdk) {\n            return;\n        }\n        sdk.updateAudioVolume(volume);\n    },\n\n    ensureVideoPermissions(this: WebrtcSdkService) {\n        if (this.get('mediaState.hasCameraPermissions' as any)) {\n            return Ember.RSVP.resolve();\n        }\n\n        return this.get('sdk').media.requestMediaPermissions('video');\n    },\n\n    ensureAudioPermissions(this: WebrtcSdkService) {\n        if (this.get('mediaState.hasMicPermissions' as any)) {\n            return Ember.RSVP.resolve();\n        }\n\n        return this.get('sdk').media.requestMediaPermissions('audio');\n    },\n\n    acceptPendingSession(this: WebrtcSdkService, params: IPendingSessionActionParams) {\n        if (!params.conversationId) {\n            this.logger.error(new Error('Must use conversationId to accept session'));\n            return;\n        }\n\n        this.set('pendingSessions', this.findRemainingSessionsBasedOnParams(params.conversationId, params.sessionType));\n        this.logger.info('telling sdk to accept pending session', {\n            conversationId: params.conversationId,\n            sessionType: params.sessionType\n        });\n        return this.get('sdk').acceptPendingSession(params);\n    },\n\n    rejectPendingSession(this: WebrtcSdkService, params: IPendingSessionActionParams) {\n        if (!params.conversationId) {\n            this.logger.error(new Error('Must use conversationId to reject session'), {});\n            return;\n        }\n\n        this.set('pendingSessions', this.findRemainingSessionsBasedOnParams(params.conversationId, params.sessionType));\n\n        return this.get('sdk').rejectPendingSession(params);\n    },\n\n    findRemainingSessionsBasedOnParams(this: WebrtcSdkService, conversationId: string, sessionType?: SessionTypes) {\n        return this.get('pendingSessions').filter(session => {\n            let matchesRequestedSessionType = true;\n            if (sessionType) {\n                matchesRequestedSessionType = sessionType === session.sessionType;\n            }\n\n            return matchesRequestedSessionType && session.conversationId !== conversationId;\n        }) as unknown as Ember.MutableArray<IPendingSessionEmber>;\n    },\n\n    /*\n        interface IEndSessionRequest {\n            sessionId?: string;\n            conversationId?: string;\n            reason?: Constants.JingleReasonCondition;\n        }\n    */\n    endSession(this: WebrtcSdkService, endSessionParams: IEndSessionRequest) {\n        return this.get('sdk').endSession(endSessionParams);\n    },\n\n    setMute(this: WebrtcSdkService, muteOptions: ISessionMuteRequest) {\n        return this.get('sdk').setAudioMute(muteOptions);\n    },\n\n    setHold(this: WebrtcSdkService, heldOptions: IConversationHeldRequest) {\n        return this.get('sdk').setConversationHeld(heldOptions);\n    },\n\n    endAllSoftphoneSessions(this: WebrtcSdkService) {\n        const sdk = this.get('sdk');\n        const sessions = sdk.sessionManager\n            .getAllActiveSessions()\n            .filter(session => session.sessionType === SessionTypes.softphone);\n        sessions.forEach(session => sdk.forceTerminateSession(session.id));\n    },\n\n    getAllActiveSessions(this: WebrtcSdkService) {\n        if (this.get('useSdk')) {\n            return this.get('sdk.sessionManager' as any).getAllActiveSessions();\n        }\n\n        return [];\n    },\n\n    shouldIgnoreSoftphone(this: WebrtcSdkService) {\n        const disableSoftphone = 'disableSoftphone=true';\n        const urlSearch = window.location.search;\n        const urlHash = window.location.hash;\n        const disableParam = urlHash.includes(disableSoftphone) || urlSearch.includes(disableSoftphone);\n        // If embedded (disableSoftphone=true), we want to disable softphone and log.\n        if (disableParam) {\n            this.logger.debug('disableSoftphone=true, ignoring softphone event.');\n            return true;\n        }\n\n        return false;\n    },\n\n    setUseHeadsets(this: WebrtcSdkService) {\n        const sdk = this.get('sdk');\n        sdk.setUseHeadsets(this.get('useSdk') && !this.shouldIgnoreSoftphone());\n    },\n\n    setMediaHandling(this: WebrtcSdkService, mediaType: MediaHandling) {\n        this.get('sdk').setMediaHandling(mediaType);\n    },\n\n    /**\n     * Get a video invitation by the inviting user's JID\n     */\n    getVideoInvitationByUserJid(this: WebrtcSdkService, userJid: string) {\n        return this.get('videoInvitations').find(invitation => invitation.get('userJid') === userJid);\n    },\n\n    /**\n     * Remove a video invitation from the list (e.g., after answering)\n     */\n    removeVideoInvitation(this: WebrtcSdkService, invitation: IVideoInvitationEmber) {\n        const remainingInvitations = this.get('videoInvitations').filter(\n            inv => inv.get('id') !== invitation.get('id')\n        ) as unknown as MutableArray<IVideoInvitationEmber>;\n        this.set('videoInvitations', remainingInvitations);\n    },\n\n    /**\n     * Decline a video invitation\n     */\n    declineVideoInvitation(this: WebrtcSdkService, invitation: IVideoInvitationEmber) {\n        this.logger.info('Declining video invitation', {\n            remoteData: {\n                sessionId: invitation.get('id'),\n                conversationId: invitation.get('conversationId')\n            }\n        });\n\n        this.removeVideoInvitation(invitation);\n\n        // Reject the pending session via SDK\n        return this.get('sdk').rejectPendingSession({\n            conversationId: invitation.get('conversationId'),\n            sessionType: SessionTypes.collaborateVideo\n        });\n    }\n});\n\ndeclare module '@ember/service' {\n    interface Registry {\n        webrtcSdk: WebrtcSdkService;\n        'webrtc-sdk': WebrtcSdkService;\n    }\n}\n","import Ember from 'ember';\n\nimport Evented from '@ember/object/evented';\nimport { Promise } from 'rsvp';\nimport LoggerMixin from '../mixins/logger';\n\nimport { computed } from '@ember/object';\nimport Service, { inject } from '@ember/service';\nimport {\n    ApplicationService,\n    IntlService,\n    NotificationService,\n    PreferencesService,\n    SessionService,\n    StashLoggerService\n} from '@web-directory/services';\nimport { AjaxServiceClass } from 'ember-ajax/services/ajax';\nimport { isTesting } from 'web-directory/utils/testing';\nimport { PigeonService } from 'web-directory/services/pigeon';\nimport { IDirectorySettings, IGeneralSettings, IWebrtcSettings } from '../types/webrtc-settings.type';\n\nconst WEBRTC_SETTINGS_UPDATE = 'webrtcSettingsUpdate';\nconst SETTINGS_PATH = 'api/v2/settings/webrtc/users';\n\nexport type SettingsEvents = {\n    sdkSettingsUpdate: IWebrtcSettings;\n};\n\nexport const defaultGeneralSettings: IGeneralSettings = {\n    ringtoneSelection: 'phone',\n    advancedMicSettings: {\n        autoGain: true,\n        echoCancellation: true,\n        noiseSuppression: true\n    }\n};\n\nexport const defaultDirectorySettings: IDirectorySettings = {\n    alwaysPopoutVideo: false,\n    selectedProfile: '',\n    profiles: [],\n    defaultProfileId: ''\n};\n\nexport interface WebrtcSettingsService {\n    // mimicks ember evented stuff, but with types\n    on<Target>(name: string, target: Target, method: (this: Target, ...args: any[]) => void): this;\n    on(name: string, method: (...args: any[]) => void): this;\n    one<Target>(name: string, target: Target, method: (this: Target, ...args: any[]) => void): this;\n    one(name: string, method: (...args: any[]) => void): this;\n    trigger<K extends keyof SettingsEvents>(name: K, args: SettingsEvents[K]): any;\n    off<Target>(name: string, target: Target, method: (this: Target, ...args: any[]) => void): this;\n    off(name: string, method: (...args: any[]) => void): this;\n\n    get<K extends keyof WebrtcSettingsService>(name: K | string): WebrtcSettingsService[K];\n    set<K extends keyof WebrtcSettingsService>(\n        name: K | string,\n        value: WebrtcSettingsService[K]\n    ): WebrtcSettingsService[K];\n    removeObserver(depName: string, target: any, handler: Function): void;\n    addObserver(depName: string, target: any, handler: Function): void;\n\n    // Ember CoreObject lifecycle properties\n    isDestroyed: boolean;\n    isDestroying: boolean;\n\n    ajax: AjaxServiceClass;\n    application: ApplicationService;\n    preferences: PreferencesService;\n    session: SessionService;\n    pigeon: PigeonService;\n    logger: StashLoggerService;\n    notification: NotificationService;\n    intl: IntlService;\n\n    _ready: Promise<any>;\n    settings: IWebrtcSettings | null;\n    failedSettingsFetch: boolean;\n    reallyWaitForToken?: boolean;\n    _fetchSettingsPromise: Promise<IWebrtcSettings> | null;\n    _updatePromise: Promise<any> | null;\n\n    _super(...args: any[]): void;\n    _handleSettingsChanged(settings: IWebrtcSettings): void;\n    _waitForAccessToken(): Promise<any>;\n    _fetchSettings(): Promise<IWebrtcSettings>;\n    _checkAndFixSettings(settings: IWebrtcSettings): boolean;\n    _updateSettings(settings: IWebrtcSettings): void;\n\n    getSettings(forceRefresh?: boolean, retryOnFail?: boolean): Promise<IWebrtcSettings>;\n    updateSettings(settings: IWebrtcSettings): Promise<void>;\n    updateSetting<K extends keyof IWebrtcSettings>(settingPath: K | string, value: IWebrtcSettings[K]): Promise<void>;\n}\n\nexport default Service.extend(Evented, LoggerMixin, {\n    preferences: inject('preferences'),\n    session: inject('session'),\n    ajax: inject('ajax'),\n    application: inject('application'),\n    pigeon: inject('pigeon'),\n    notification: inject('notification'),\n    intl: inject('intl'),\n\n    error: false,\n    syncEnabled: false,\n    deferredPersistRequests: null,\n\n    settings: null,\n    // Wait for the service to be initialized and have settings.\n    userSettingsPromise: computed('_ready', 'settings', async function () {\n        try {\n            await this.get('_ready');\n            return this.get('settings');\n        } catch (err) {\n            this.logger.error('Failed to fetch settings - userSettingsPromise', err);\n            // Even if we get an error, we will still set some non-persisting defaults and should return those.\n            return this.get('settings');\n        }\n    }),\n    failedSettingsFetch: false,\n    _fetchSettingsPromise: null,\n    _updatePromise: null,\n\n    init(this: WebrtcSettingsService) {\n        this._super(...arguments);\n        // Wait until we have a token to grab settings and only resolve ready once we have/set settings.\n        const ready = this._waitForAccessToken()\n            .then(async () => {\n                this.logger.debug('Ready to fetch WebRTC settings');\n                const settings = (await this._fetchSettings()) || {};\n                // Check if we are missing some/all settings.\n                if (this._checkAndFixSettings(settings)) {\n                    // Persist adjusted settings.\n                    await this._updateSettings(settings);\n                }\n            })\n            .catch(err => {\n                this.set('failedSettingsFetch', true);\n                this._checkAndFixSettings({});\n                return Promise.reject(err);\n            });\n        this.set('_ready', ready);\n    },\n\n    /**\n     * @deprecated Ember observers shouldn't be used\n     */\n    _registerSettings: Ember.observer('session.person.id', function (this: WebrtcSettingsService) {\n        const pigeon = this.get('pigeon');\n        const userId = this.get('session.person.id');\n        if (userId) {\n            pigeon.registerPriorityTopic(`v2.settings.webrtc.users.${userId}`, WEBRTC_SETTINGS_UPDATE);\n            pigeon.on(WEBRTC_SETTINGS_UPDATE, this._handleSettingsChanged.bind(this));\n        }\n    }),\n\n    async _waitForAccessToken(this: WebrtcSettingsService) {\n        if (this.get('session.accessToken') || (isTesting && !this.reallyWaitForToken)) {\n            return;\n        }\n\n        return new Promise<void>((resolve, reject) => {\n            const handler = () => {\n                if (this.isDestroyed || this.isDestroying) {\n                    this.removeObserver('session.accessToken', this, handler);\n                    reject(new Error('webrtc-settings service destroyed while waiting for token'));\n                    return;\n                }\n                if (this.get('session.accessToken')) {\n                    this.removeObserver('session.accessToken', this, handler);\n                    resolve();\n                }\n            };\n\n            this.addObserver('session.accessToken', this, handler);\n        });\n    },\n\n    async getSettings(this: WebrtcSettingsService, forceRefresh?: boolean, retryOnFail = true) {\n        if (!forceRefresh && this.get('settings')) {\n            return this.get('settings');\n        }\n\n        try {\n            await this.get('_ready');\n            const settings = await this._fetchSettings();\n            this.set('settings', settings);\n            this.set('failedSettingsFetch', false);\n            return settings;\n        } catch (err) {\n            this.logger.error('Failed to fetch settings:', { err });\n            this.set('failedSettingsFetch', true);\n            // If we fail to fetch settings, retry one time.\n            if (retryOnFail) {\n                return this.getSettings(forceRefresh, false);\n            }\n            this._checkAndFixSettings({});\n            return Promise.reject(err);\n        }\n    },\n\n    _fetchSettings(this: WebrtcSettingsService) {\n        if (this.get('_fetchSettingsPromise')) {\n            return this.get('_fetchSettingsPromise');\n        }\n\n        // Verify the access token is still available before making the request.\n        // During auth transitions (gcmfeauth), the token can become null between\n        // when _waitForAccessToken resolves and when _fetchSettings fires. If null,\n        // wait for a valid token before proceeding. (ATLAS-2431)\n        const tokenGate = this.get('session.accessToken') ? Promise.resolve() : this._waitForAccessToken();\n\n        const promise = tokenGate\n            .then(() => {\n                const path = this.get('application').pcV2Uri(SETTINGS_PATH);\n                return this.get('ajax').request(path);\n            })\n            .then(settings => Ember.Object.create(settings))\n            .catch(e => {\n                this.logger.error('Failed to fetch webrtc settings', { err: e });\n                return undefined;\n            })\n            .finally(() => this.set('_fetchSettingsPromise', null));\n\n        this.set('_fetchSettingsPromise', promise as Promise<IWebrtcSettings>);\n        return promise;\n    },\n\n    // Trigger PATCH request on webrtc user settings. Used only internally in this service.\n    async _updateSettings(this: WebrtcSettingsService, settings: IWebrtcSettings) {\n        // Always make settings changes immediate\n        const cached = Object.assign({}, this.get('settings') || {}, settings);\n        this.set('settings', cached);\n\n        // If there's already an update in progress, return that promise to avoid 409 conflicts\n        const existingPromise = this.get('_updatePromise');\n        if (existingPromise) {\n            this.logger.debug('WebRTC settings update already in progress, waiting for completion');\n            return existingPromise;\n        }\n\n        const path = this.get('application').pcV2Uri(SETTINGS_PATH);\n        const promise = this.get('ajax')\n            .request(path, {\n                method: 'PATCH',\n                dataType: 'text',\n                data: settings\n            })\n            .catch(e => {\n                this.logger.error('Failed to update webrtc settings', { err: e });\n                throw e;\n            })\n            .finally(() => {\n                this.trigger('sdkSettingsUpdate', this.get('settings') ?? {});\n                if (this.get('_updatePromise') === promise) {\n                    this.set('_updatePromise', null);\n                }\n            });\n\n        this.set('_updatePromise', promise);\n        return promise;\n    },\n\n    _checkAndFixSettings(this: WebrtcSettingsService, settings: IWebrtcSettings) {\n        // If some important settings are missing, set some local defaults.\n        // These do NOT automatically persist.\n        if (!settings.directorySettings || !settings.generalSettings || !settings.generalSettings.advancedMicSettings) {\n            if (!settings.directorySettings) {\n                settings.directorySettings = defaultDirectorySettings;\n            }\n            if (!settings.generalSettings) {\n                settings.generalSettings = defaultGeneralSettings;\n            }\n            if (!settings.generalSettings.advancedMicSettings) {\n                settings.generalSettings.advancedMicSettings = defaultGeneralSettings.advancedMicSettings;\n            }\n            this.logger.warn('Some WebRTC settings were missing, setting local defaults.', settings);\n            // Set the settings locally. Settings will only be persisted when explicitly updated.\n            this.set('settings', settings);\n            return true;\n        }\n        this.set('settings', settings);\n        return false;\n    },\n\n    async updateSettings(this: WebrtcSettingsService, settings: IWebrtcSettings) {\n        try {\n            // If we have no access token, we don't want to try updating settings.\n            await this.get('_ready');\n        } catch (error) {\n            this.logger.error('Failed to fetch WebRTC settings, cannot update WebRTC settings.');\n            this.get('notification').error(\n                this.get('intl').t('purecloud.station.fetchFailureTitle'),\n                this.get('intl').t('purecloud.station.fetchFailureMsg')\n            );\n            return;\n        }\n\n        // If we failed to fetch settings, we don't want a user to update them because they could override their saved settings.\n        if (this.get('failedSettingsFetch')) {\n            this.logger.warn('Cannot update settings because they failed to fetch.');\n            this.get('notification').error(\n                this.get('intl').t('purecloud.station.fetchFailureTitle'),\n                this.get('intl').t('purecloud.station.fetchFailureMsg')\n            );\n            return;\n        }\n        await this._updateSettings(settings);\n    },\n\n    /**\n     * This fn can take a dot-delimited path and update that single setting\n     */\n    async updateSetting<K extends keyof IWebrtcSettings>(\n        this: WebrtcSettingsService,\n        settingPath: K | string,\n        value: IWebrtcSettings[K]\n    ) {\n        const pieces = settingPath.split('.');\n        const settings = Object.assign({}, this.get('settings'));\n\n        let ref = settings;\n\n        pieces.forEach((piece, index) => {\n            if (index === pieces.length - 1) {\n                // @ts-ignore\n                Ember.set(ref, piece, value);\n            } else {\n                // @ts-ignore\n                Ember.set(ref, piece, ref[piece] || {});\n            }\n\n            // @ts-ignore\n            ref = ref[piece];\n        });\n\n        // only update the top-level object\n        const topLevelKey = pieces[0];\n        // @ts-ignore\n        return this.updateSettings({ [topLevelKey]: settings[topLevelKey] });\n    },\n\n    // If we get an update from another client, sync settings to latest update.\n    _handleSettingsChanged(this: WebrtcSettingsService, settings: IWebrtcSettings) {\n        const updatedSettings = Object.assign({}, this.get('settings'), settings);\n        // Immediately set new webrtc settings\n        this.set('settings', updatedSettings);\n        // Trigger settings event so SDK can update if being used.\n        this.trigger('sdkSettingsUpdate', updatedSettings);\n    }\n});\n\n/** DO NO REMOVE MODULE DECLARATION **/\ndeclare module '@ember/service' {\n    interface Registry {\n        webrtcSettings: WebrtcSettingsService;\n        'webrtc-settings': WebrtcSettingsService;\n    }\n}\n","/* global Hashes, WebrtcTroubleshooter, RTCPeerConnection */\n\nimport { alias, reads } from '@ember/object/computed';\n\nimport { A } from '@ember/array';\nimport Service, { inject as service } from '@ember/service';\nimport Evented from '@ember/object/evented';\nimport RSVP, { reject, resolve, Promise } from 'rsvp';\nimport { observer, computed, get } from '@ember/object';\nimport { run } from '@ember/runloop';\n\nimport Ember from 'ember';\nimport WebrtcEvents from 'web-directory/mixins/webrtc-service/webrtc-events';\nimport WebrtcNotificationsMixin from 'web-directory/mixins/webrtc-service/webrtc-message-notifications';\nimport WebrtcMedia from 'web-directory/mixins/webrtc-service/webrtc-media';\nimport DeviceEnumerationMixin from 'web-directory/mixins/device-enumeration';\nimport WebrtcDebugger from 'web-directory/mixins/webrtc-service/webrtc-debug';\nimport WebrtcStats from 'web-directory/mixins/webrtc-service/webrtc-stats';\nimport moment from 'web-directory/utils/dates';\nimport { EVENTS } from 'web-directory/utils/hosted-context';\nimport WebrtcConversationManager from 'web-directory/mixins/webrtc-service/webrtc-conversation-manager';\nimport BrowserUtils from 'web-directory/utils/browser';\nimport attachMediaStream from 'web-directory/utils/attach-media-stream';\nimport uuid from 'web-directory/utils/uuid';\nimport webrtcConversationTypes from 'web-directory/utils/webrtc-conversation-types';\nimport { task, timeout } from 'ember-concurrency';\n\nconst FIREFOX_ADDON_URL = 'https://addons.mozilla.org/en-US/firefox/addon/screensharing-helper-for-purec/';\nconst PROBE_FREQUENCY_IN_MINUTES = 240;\n\nconst mixins = [\n    Evented,\n    WebrtcEvents,\n    WebrtcMedia,\n    WebrtcNotificationsMixin,\n    WebrtcDebugger,\n    WebrtcConversationManager,\n    WebrtcStats,\n    DeviceEnumerationMixin\n];\n\nlet _rtcPeerConnectionHasTrackFunctionality = null;\nexport default Service.extend(...mixins, {\n    // TODO: seriously, this is too many services\n    chat: service(),\n    fullscreen: service(),\n    application: service(),\n    phone: service(),\n    session: service(),\n    intl: service(),\n    notification: service(),\n    streaming: service(),\n    sidebar: service(),\n    presenceSubscription: service(),\n    sound: service(),\n    acdcallback: service(),\n    feature: service(),\n    ajax: service(),\n    conversationService: service('conversation'),\n    settings: service(),\n    pigeon: service(),\n    ring: service(),\n    webrtcSdkService: service('webrtcSdk'),\n    deviceProfilesV2: service(),\n    webrtcSettings: service(),\n\n    attachMediaStream,\n\n    activeRoom: null,\n    activeEmpty: null,\n    activeBridge: true, // this is just so we don't run into issue removing this.\n    iceServers: null,\n    roomFull: false,\n    webrtcTroubleshooterCall: false,\n\n    canDoScreenRecording() {\n        const context = this.get('application.hostedContext');\n        return (context && context.isHosted()) || this.allowScreenRecordingInBrowser;\n    },\n\n    _hasTransceiverFunctionality() {\n        if (_rtcPeerConnectionHasTrackFunctionality !== null) {\n            return _rtcPeerConnectionHasTrackFunctionality;\n        }\n\n        try {\n            // make sure we are capable\n            const rtcPeerConnection = new RTCPeerConnection();\n\n            // if this function exists we should be good\n            _rtcPeerConnectionHasTrackFunctionality = !!rtcPeerConnection.getTransceivers;\n        } catch (err) {\n            this.logger.info('rtcPeerConnection.getTranceivers capability check failed.');\n            _rtcPeerConnectionHasTrackFunctionality = false;\n        }\n\n        return _rtcPeerConnectionHasTrackFunctionality;\n    },\n\n    canUseTrackBasedActions(conversation) {\n        // if we don't have track functionality, then return false\n        if (!this._hasTransceiverFunctionality()) {\n            return false;\n        }\n\n        // if we have a screenshare\n        const isScreenShare = conversation && conversation.get('isScreenShare');\n        if (isScreenShare) {\n            // return if the jid should use hawk\n            return this.shouldUseHawkByJid(conversation.get('jid'));\n        }\n\n        // otherwise, assume true (was previously a feature toggle)\n        return true;\n    },\n\n    streamBasedActionsFallback(conversation) {\n        /**\n         * if we have a screenshare over hawk\n         * but we cannot use tracks because they aren't supported...\n         */\n        const isScreenShareOverHawk = conversation && conversation.get('isAcdScreenShareViaHawk');\n\n        const hasFunctionality = this._hasTransceiverFunctionality();\n\n        return isScreenShareOverHawk && !hasFunctionality;\n    },\n\n    startFullScreen(isAcd = false) {\n        return this.fullscreen.startFullScreen(isAcd);\n    },\n\n    endFullScreen() {\n        return this.fullscreen.endFullScreen();\n    },\n\n    isFullScreen: alias('fullscreen.isFullScreen'),\n\n    maxCapacity: 25,\n\n    peerConnectionConstraints: {\n        optional: [\n            // required\n            { DtlsSrtpKeyAgreement: true },\n            { RTPDataChannels: true },\n\n            // andyet experimental\n            // { andyetAssumeSetLocalSuccess: true },\n            { andyetFasterIce: true },\n\n            // goog experimental\n            { googImprovedWifiBwe: true },\n            { googDscp: true },\n            { googSuspendBelowMinBitrate: true },\n            { googScreencastMinBitrate: 400 },\n            { googCombinedAudioVideoBwe: true },\n            { googCpuOveruseDetection: true },\n            { googCpuOveruseEncodeUsage: true },\n            { googCpuUnderuseThreshold: 55 },\n            { googCpuOverUseThreshold: 85 }\n\n            // unused experimental\n            // { gogIPv6: true }\n        ]\n    },\n\n    init() {\n        this._super(...arguments);\n\n        run.next(this, () => {\n            if (this.isDestroyed || this.isDestroying) {\n                return;\n            }\n\n            this.initModelCache();\n            if (!Ember.testing) {\n                this._timeoutTurnServers.perform();\n            }\n\n            this.componentToUse; // get initial component to render\n\n            // make sure iceServers get loaded after we connect\n            this._onV2InitialConnection();\n        });\n    },\n\n    _onV2InitialConnection() {\n        const v2Promise = this.get('streaming.v2Promise');\n        if (!v2Promise) {\n            return;\n        }\n        v2Promise.then(connection => {\n            if (this.isDestroyed || this.isDestroying) {\n                return;\n            }\n            if (!connection.connected) {\n                connection.once('connected', () => this.refreshIceServers());\n            } else {\n                this.refreshIceServers();\n            }\n        });\n    },\n\n    initModelCache() {\n        this.streaming.subscribeToConnection(this);\n    },\n\n    showMigratingNotification() {\n        this.notification.info(null, this.intl.t('ewc.migrateToConference'), {\n            tag: 'video-migration',\n            hideAfter: 5,\n            forceBrowserNotification: true\n        });\n    },\n\n    _timeoutTurnServers: task(function* () {\n        yield timeout(moment.duration(6, 'hours').asMilliseconds());\n        try {\n            if (this.canGetIceServers) {\n                let services = yield this.refreshIceServers();\n                services = services.map(server => {\n                    const serverCopy = Object.assign({}, server);\n                    ['username', 'credential'].forEach(key => {\n                        if (serverCopy[key]) {\n                            serverCopy[key] = '<REDACTED>';\n                        }\n                    });\n                    return serverCopy;\n                });\n                this.logger.info('turn servers updated', services);\n            }\n        } catch (err) {\n            this.logger.warn('turn servers failed to update', { remoteData: { err } });\n        }\n        this._timeoutTurnServers.perform();\n    }),\n\n    willDestroy() {\n        this._super(...arguments);\n        this.cancelPendingRtcSessions();\n        this.checkConversationStates.forEach(later => run.cancel(later));\n    },\n\n    triggerWebrtcDump(problemDesc) {\n        if (!this.activeConversation) {\n            this.notification.error(null, this.intl.t('ewc.noActiveSessions'));\n        }\n\n        this.logger.info('triggering webrtc dump');\n\n        let roomJid = this.get('activeRoom.jid');\n        if (this.get('activeRoom.oneToOneTarget')) {\n            roomJid = this.get('activeSessions.firstObject.sid');\n        }\n\n        const requestId = uuid.generate();\n\n        this.get('streaming.connection').sendLog({\n            opts: {\n                type: 'info',\n                facility: 'collaborate-ui',\n                level: 'medium',\n                id: 'webrtcDump'\n            },\n            tags: { roomJid: roomJid, requestId }\n        });\n\n        if (problemDesc) {\n            this.logger.info({ requestId, problemDesc });\n\n            const diagRequest = {\n                topic: `${this.intl.t('ewc.webrtcProblem')} ${this.intl.t('common.report')}`,\n                description: `${this.intl.t('ewc.webrtcProblem')} ${requestId}`,\n                data: {\n                    requestId,\n                    problem: problemDesc,\n                    userAgent: navigator.userAgent,\n                    clientJid: this.get('session.person.jid'),\n                    clientLocation: window.location.toString(),\n                    clientTimestamp: moment().format(),\n                    clientOrgName: this.get('applicationService.orgName'),\n                    clientLocale: this.get('applicationService.locale'),\n                    clientType: this.get('applicationService.hostedContext') ? 'Desktop' : 'Browser',\n                    clientVersion: this.get('applicationService.semver'),\n                    clientLogs: this.troubleshootingLog\n                }\n            };\n\n            this.application.sendDiagnostics(diagRequest);\n\n            const useApi = this.shouldUseApiByJid(roomJid);\n            if (useApi && !this.get('activeRoom.oneToOneTarget')) {\n                this.requestDetailedStateDump(roomJid, requestId);\n            }\n        }\n\n        this.notification.info(null, this.intl.t('ewc.problemReported'));\n    },\n\n    requestDetailedStateDump(roomJid, requestId) {\n        const conversation = this.getConversation({ jid: roomJid });\n        if (!conversation) {\n            this.logger.error('Cannot find conversation for room. Cannot trigger detailed state dump', {\n                jid: roomJid\n            });\n            return;\n        }\n\n        if (!conversation.get('sessions.length')) {\n            this.logger.error('Cannot trigger detailed state dump, no webrtc sessions', {\n                conversationId: conversation.get('conversationId')\n            });\n            return;\n        }\n\n        this.webrtcSessions.requestStateDump(conversation.get('sessions.firstObject'), requestId);\n    },\n\n    canGetIceServers: reads('streaming.connectedV2'),\n\n    refreshIceServers: function () {\n        if (\n            this.isDestroyed ||\n            this.isDestroying ||\n            !this.webrtcSessions ||\n            typeof this.webrtcSessions.refreshIceServers !== 'function'\n        ) {\n            return resolve([]);\n        }\n        if (this.get('streaming.connectedV2')) {\n            const promise = this.webrtcSessions.refreshIceServers();\n            promise.then(result => {\n                this.set('iceServers', result);\n            });\n            return promise;\n        }\n\n        return reject(new Error('streaming service V2 is not connected'));\n    },\n\n    // eslint-disable-next-line ember/no-observers\n    changeRoom: observer('chat.activeRoom.{jid,showingVideo}', function () {\n        // this is so we preserve activeRoom momentarily when closing activeRoom while in a different room\n        run.later(() => {\n            if (!this.get('activeRoom.showingVideo')) {\n                const activeMedia = this.activeMedia;\n                this.set('activeRoom', this.get('chat.activeRoom'));\n                if (activeMedia) {\n                    activeMedia.stop();\n                }\n                this.set('activeMedia', null);\n            } else if (this.activeRoom) {\n                this.trigger('activeChatRoomChange');\n            }\n        });\n    }),\n\n    pendingSessions: A(), // outgoing session requests\n    activeSessions: A(), // sessions given to us\n    sessionTimeouts: {},\n\n    /**\n     * chat.enabled is primarily used to gate UC video and the old video panel.\n     * With the old video panel, we’ve always assumed that any video call will have an associated chat with it.\n     * When Volt's default behavior changes to 'popout', we will not need this relationship.\n     */\n    enabled: computed('chat.enabled', function () {\n        return this.get('chat.enabled');\n    }),\n\n    canConference: computed('enabled', 'callCapable', function () {\n        return this.enabled && this.callCapable;\n    }),\n\n    canUseWebrtcSoftphone: computed(\n        'audioCallCapable',\n        'hasMicrophone',\n        'phone.station.webRtcRequireMediaHelper',\n        function () {\n            const isEdge = BrowserUtils.isEdge;\n            if (isEdge) {\n                return false;\n            }\n            return this.audioCallCapable && (this.hasMicrophone || this.get('phone.station.webRtcRequireMediaHelper'));\n        }\n    ),\n\n    isV2(activeRoom) {\n        if (!activeRoom) {\n            return false;\n        }\n        return !activeRoom.oneToOneTarget;\n    },\n\n    showZeroAudioBitrateNotification() {\n        this.notification.error(null, this.intl.t('ewc.zeroAudioBitrate'));\n    },\n\n    // TODO: remove when v1 is deprecated\n    cancelInvitation(room, person) {\n        const existing = this.incomingInvitations.findBy('entity', person);\n\n        if (existing) {\n            this.incomingInvitations.removeObject(existing);\n        }\n    },\n\n    // TODO: remove when v1 is deprecated\n    joinVideo(jid) {\n        if (jid && typeof this.get('streaming.connection').joinVideo === 'function') {\n            this.get('streaming.connection').joinVideo(jid);\n        }\n    },\n\n    // TODO: remove when v1 is deprecated\n    leaveVideo(jid) {\n        if (jid && typeof this.get('streaming.connection').leaveVideo === 'function') {\n            this.get('streaming.connection').leaveVideo(jid);\n        }\n    },\n\n    handleMissedCall(sessionId) {\n        const invitation = this.incomingInvitations.findBy('sessionId', sessionId);\n\n        if (!invitation) {\n            const pendingSessions = this.pendingSessions.filter(session => {\n                return session && session.id === sessionId;\n            });\n            if (pendingSessions.length === 0) {\n                // We got a cancel/retract for a session we don't know about, so just ignore it.\n                return;\n            }\n            pendingSessions.forEach(pendingSession => {\n                this.logger.info('canceling pending session for missed call', {\n                    remoteData: {\n                        sessionId: pendingSession.id,\n                        conversationId:\n                            pendingSession.conversationId ||\n                            (pendingSession.callInfo && pendingSession.callInfo.conversationId)\n                    }\n                });\n                this._cancelPendingSession(pendingSession);\n            });\n            return;\n        }\n\n        this.get('application.hostedContext').sendEventToDesktop(EVENTS.WEBRTC_CONNECTION_DECLINED, invitation);\n\n        const name =\n            typeof session !== 'undefined' ? invitation.get('room.oneToOneTarget.name') : this.intl.t('ewc.unknown');\n\n        this.notification.error(null, this.intl.t('ewc.missedCall', { personName: name }), {\n            hideAfter: null,\n            forceBrowserNotification: true\n        });\n\n        this.trigger('videoNotification', invitation.get('room'), 'noAnswer');\n        invitation.set('room.invited', false);\n    },\n\n    showNoAnswerNotification(message, type) {\n        this.notification[type](null, message);\n    },\n\n    showTrackRemovedNotification(trackOwner) {\n        this.logger.warn('Removing incoming video track from due to \"video track hack\"', {\n            remoteData: { trackOwner }\n        });\n        this.notification.warn(null, this.intl.t('ewc.incomingVideoTrackRemoved', { trackOwner }), {\n            hideAfter: 15,\n            forceBrowserNotification: true\n        });\n    },\n\n    getEndpointId() {\n        return this.get('streaming.connection').jid.toString();\n    },\n\n    notifyOfMute(muterName) {\n        this.notification.info(null, this.intl.t('ewc.youHaveBeenMuted', { person: muterName }), {\n            hideAfter: 45,\n            forceBrowserNotification: true\n        });\n    },\n\n    notifySessionEnded({ session, conversation, reason }) {\n        if (conversation) {\n            this._logConnectionEnded({ session, conversation, reason });\n        }\n        this.get('application.hostedContext').sendEventToDesktop(EVENTS.WEBRTC_CONNECTION_ENDED, {\n            name: 'disconnect',\n            session: session.sid\n        });\n    },\n\n    connectivityError(conversationType) {\n        if (this.stationHasPersistentConnection && conversationType === webrtcConversationTypes.SOFTPHONE) {\n            this.notification.error(null, this.intl.t('ewc.failedToConnectPersistentSession'));\n        } else {\n            this.notification.error(null, this.intl.t('ewc.failedToConnectSession'));\n        }\n    },\n\n    showBandwidthNotification() {\n        this.notification.info(null, this.intl.t('ewc.bandwidthIssues'), { hideAfter: 20 });\n    },\n\n    lostConnectionError(name) {\n        this.notification.info(null, this.intl.t('ewc.lostConnection', { personName: name }));\n    },\n\n    hangupNotification(name) {\n        this.notification.info(null, this.intl.t('ewc.hungUp', { personName: name }));\n    },\n\n    bridgeDownError() {\n        this.notification.error(null, this.intl.t('ewc.bridgeDownError'));\n        this.logger.warn('Videobridge gone');\n    },\n\n    engageScreenShareError(conversationId) {\n        this.logger.warn('Engage screen share terminated from videobridge gone', {\n            remoteData: {\n                conversationId: conversationId,\n                kind: 'webrtcSession'\n            }\n        });\n        this.notification.error(null, this.intl.t('ewc.screenShareError'));\n    },\n\n    // keep for v3\n    showScreenShareError(requestedTime) {\n        if (BrowserUtils.isFirefox) {\n            const failedTime = window.performance.now();\n            if (failedTime - requestedTime < 200) {\n                // TODO: remove firefox addon stuff, after 52 it's no longer required\n                const getAddon = window.confirm(this.intl.t('ewc.screenPermissionDeniedAddon'));\n                if (getAddon) {\n                    window.open(FIREFOX_ADDON_URL, '_blank');\n                }\n            }\n        } else {\n            this.logger.info('Screen sharing permission denied');\n        }\n    },\n\n    // keep for v3\n    _hashValue(value) {\n        const hasher = new Hashes.SHA256();\n        const salt = this.get('session.user.personId');\n        return hasher.hex_hmac(salt, value);\n    },\n\n    repairRoomPresences() {\n        return new Promise((resolve, reject) => {\n            this.get('streaming.connection')._repairRoomPresences(this.get('activeRoom.jid'), err => {\n                if (err) {\n                    return reject(err);\n                }\n                return resolve();\n            });\n        });\n    },\n\n    sanitizeDeviceLabel(deviceLabel) {\n        const idRegex = /(.*)\\s?\\(.*/;\n        const defaultTextRegex = /^(.*\\s-\\s)/;\n\n        // Remove the trailing numbers\n        let sanitizedLabel = deviceLabel ? deviceLabel.replace(idRegex, '$1').trim() : '';\n\n        // Remove the 'Default - ' text added by the browser\n        sanitizedLabel = sanitizedLabel ? sanitizedLabel.replace(defaultTextRegex, '').trim() : '';\n\n        return sanitizedLabel;\n    },\n\n    updatePhoneAndNotificationVolumes(outputDevice, notificationOutputDevice) {\n        const phoneOutputVolumesPromise = this._getOutputDeviceVolumePreferences(outputDevice);\n        const notificationOutputVolumesPromise = notificationOutputDevice\n            ? this._getOutputDeviceVolumePreferences(notificationOutputDevice)\n            : Promise.resolve();\n\n        RSVP.all([phoneOutputVolumesPromise, notificationOutputVolumesPromise]).then(\n            ([phoneOutputDeviceVolumes, notificationOutputDeviceVolumes]) => {\n                const chatService = this.chat;\n                const phoneService = this.phone;\n\n                if (notificationOutputDeviceVolumes) {\n                    chatService.updateVolumes(notificationOutputDeviceVolumes);\n                } else {\n                    chatService.updateVolumes(phoneOutputDeviceVolumes);\n                }\n\n                phoneService.updateVolumes(phoneOutputDeviceVolumes);\n            }\n        );\n    },\n\n    updateChatVolumes(volumes) {\n        this.chat.updateVolumes(volumes);\n    },\n\n    updatePhoneVolumes(volumes) {\n        this.phone.updateVolumes(volumes);\n    },\n\n    _getOutputDeviceVolumePreferences(outputDevice) {\n        let deviceVolumes = {\n            callVolume: 100,\n            ringerVolume: 100,\n            chatNotificationVolume: 100,\n            interactionNotificationVolume: 100,\n            callActiveRingerVolume: 100\n        };\n\n        if (!outputDevice) {\n            return RSVP.resolve(deviceVolumes);\n        }\n\n        let promise = RSVP.resolve();\n        const deviceLabel = get(outputDevice, 'label');\n        if (deviceLabel) {\n            const sanitizedLabel = this.sanitizeDeviceLabel(deviceLabel);\n            promise = RSVP.resolve(this.get(`webrtcSettings.settings.volumeSettings.${sanitizedLabel}`));\n            return promise.then(preferences => {\n                if (preferences) {\n                    deviceVolumes = preferences;\n                }\n                return deviceVolumes;\n            });\n        }\n    },\n\n    // eslint-disable-next-line ember/no-observers\n    _updateStationIceServersSettings: observer('phone.station', 'phone.station.webrtcForceTurn', function () {\n        if (this.get('phone.station.isWebrtc') && this.canGetIceServers) {\n            this.refreshIceServers();\n            this.probeNetwork();\n        }\n    }),\n\n    // so we can mock it in tests\n    _createNetworkProbe() {\n        return new WebrtcTroubleshooter.SymmetricNatTest();\n    },\n\n    _lastProbe: null,\n    probeNetwork() {\n        if (!this.get('phone.station.isWebrtc')) {\n            return;\n        }\n\n        const webrtcForceTurn = this.get('phone.station.webrtcForceTurn');\n        if (webrtcForceTurn) {\n            this.setIceTransportPolicy('relay');\n            return Promise.resolve();\n        }\n        const lastProbe = this._lastProbe;\n        if (lastProbe && moment().diff(lastProbe, 'minutes') < PROBE_FREQUENCY_IN_MINUTES) {\n            return Promise.resolve();\n        }\n\n        this.logger.debug('Starting webrtc client network probe');\n        this.set('_lastProbe', moment());\n        const test = this._createNetworkProbe();\n        return test\n            .start()\n            .then(result => {\n                this.logger.info('WebRTC Client Network Probe finished', { remoteData: { result } });\n                run(() => {\n                    this.set('natTestResults', result);\n                    this.setIceTransportPolicy(result);\n                });\n            })\n            .catch(error => {\n                this.logger.warn('WebRTC Client Network Probe error', { remoteData: { error } });\n            });\n    },\n\n    setIceTransportPolicy(result) {\n        const realtime = this.get('streaming.connection');\n        const webrtcSessions = this.webrtcSessions;\n        let iceTransportPolicy;\n        const relayOnly = result === 'relay';\n        if (relayOnly) {\n            iceTransportPolicy = 'relay';\n        } else {\n            iceTransportPolicy = 'all';\n        }\n        realtime.options.iceTransportPolicy = iceTransportPolicy;\n        if (webrtcSessions) {\n            webrtcSessions.config.iceTransportPolicy = iceTransportPolicy;\n        }\n        this.logger.info('WebRTC iceTransportPolicy set', { remoteData: { iceTransportPolicy } });\n\n        const telemetry = this.get('application.pwt');\n        if (telemetry) {\n            try {\n                const score = telemetry.webrtc.data.iceFailure.track('probe', 0);\n                telemetry.webrtc.data.iceFailure.reset();\n                telemetry.webrtc.emit('score', score);\n            } catch (e) {\n                // ignore errors here\n            }\n        }\n    }\n});\n","import { readOnly } from '@ember/object/computed';\nimport { resolve } from 'rsvp';\nimport { A } from '@ember/array';\nimport Service, { inject as service } from '@ember/service';\nimport { getOwner } from '@ember/application';\nimport { observer } from '@ember/object';\nimport { run } from '@ember/runloop';\nimport _ from 'lodash';\nimport moment from '../utils/dates';\nimport WfmNotificationModel from '../models/wfm-notification';\n\nexport default Service.extend({\n    application: service(),\n    session: service(),\n    store: service(),\n    permissions: service(),\n    ajax: service(),\n    pigeon: service(),\n    intl: service(),\n    notification: service(),\n\n    userMap: {},\n    shiftTradeRequests: A([]),\n    timeOffRequests: A([]),\n    maxNotificationCount: 100,\n    isRouteChanged: false,\n    explanationJobs: new Set(),\n\n    currentUrl: readOnly('_router.currentURL'),\n    currentUrlObserver: observer('currentUrl', function () {\n        if (this.get('application.showLoader')) {\n            run.once(this, 'handleRouteChange');\n        }\n    }),\n\n    init() {\n        this._super(...arguments);\n        this.set('_router', getOwner(this).lookup('router:main'));\n        this.registerExplanationJobTopic();\n    },\n\n    willDestroy() {\n        this._super(...arguments);\n        this.unRegisterExplanationJobTopic();\n    },\n\n    getAgentNameById: function (uid) {\n        return this.get(`userMap.${uid}.name`);\n    },\n\n    getAgentNameByIdWithState: function (uid) {\n        const agentName = this.getAgentNameById(uid);\n        const state = this.get(`userMap.${uid}.state`);\n        if (state && state !== 'active') {\n            return this.intl.t(`userState.${state}`, { agentName: agentName || '' });\n        }\n        return agentName;\n    },\n\n    getPersonById: function (uid) {\n        return this.get(`userMap.${uid}`);\n    },\n\n    changeTimeOffRequestReadState: function (timeOffRequest, read) {\n        timeOffRequest.set('markedAsRead', read);\n\n        const url = this.application.pcV2Uri('api/v2/workforcemanagement/notifications/update');\n        const data = {\n            entities: [timeOffRequest]\n        };\n        this.ajax.post(url, { data });\n    },\n\n    getNotifications: function () {\n        return this.ajax\n            .ajaxGet(this.application.pcV2Uri('api/v2/workforcemanagement/notifications'))\n            .then(response => {\n                if (response.entities) {\n                    let shiftTradeRequests = [];\n                    let timeOffRequests = [];\n                    let usersToCache = [];\n                    let adherenceExplanations = [];\n                    let shiftTradeNotifications = 0;\n                    let timeOffNotifications = 0;\n                    let explanationNotifications = 0;\n\n                    response.entities\n                        .sortBy('timestamp')\n                        .reverse()\n                        .forEach(notification => {\n                            if (notification.type === 'TimeOffRequest') {\n                                if (timeOffNotifications <= this.maxNotificationCount) {\n                                    this.processTimeOffNotification(usersToCache, timeOffRequests, notification);\n                                }\n                                timeOffNotifications++;\n                            } else if (\n                                notification.type === 'ShiftTrade' ||\n                                (notification.type === 'AlternativeShift' &&\n                                    this.canViewAlternativeShiftTradeNotification(notification))\n                            ) {\n                                if (shiftTradeNotifications <= this.maxNotificationCount) {\n                                    this.processShiftTradeNotification(usersToCache, shiftTradeRequests, notification);\n                                }\n                                shiftTradeNotifications++;\n                            } else if (\n                                this.get('permissions.hasAdherenceExplanationViewAccess') &&\n                                notification.type === 'AdherenceExplanation'\n                            ) {\n                                if (explanationNotifications <= this.maxNotificationCount) {\n                                    this.processExplanationNotification(\n                                        usersToCache,\n                                        adherenceExplanations,\n                                        notification\n                                    );\n                                }\n                                explanationNotifications++;\n                            }\n                        });\n\n                    return this.processNotificationResult(\n                        usersToCache,\n                        timeOffRequests,\n                        shiftTradeRequests,\n                        adherenceExplanations\n                    );\n                }\n\n                return [];\n            })\n            .catch(reason => {\n                console.warn('Failed to fetch wfm notifications: ', { reason });\n            });\n    },\n\n    handleWfmNotificationUpdate: function (notification) {\n        let shiftTradeRequests = this.shiftTradeRequests;\n        let timeOffRequests = this.timeOffRequests;\n        let adherenceExplanations = this.adherenceExplanations;\n        let usersToCache = [];\n\n        // Updating an existing notification's groupId\n        if (!notification.type) {\n            this.updateNotificationGroupId(\n                notification.id,\n                notification.mutableGroupId,\n                shiftTradeRequests,\n                timeOffRequests,\n                adherenceExplanations\n            );\n        } else {\n            // Adding a new TOR/Shift Trade/explanation notification\n            if (notification.type === 'TimeOffRequest') {\n                this.processTimeOffNotification(usersToCache, timeOffRequests, notification);\n            } else if (\n                notification.type === 'ShiftTrade' ||\n                (notification.type === 'AlternativeShift' &&\n                    this.canViewAlternativeShiftTradeNotification(notification))\n            ) {\n                this.processShiftTradeNotification(usersToCache, shiftTradeRequests, notification);\n            } else if (\n                this.get('permissions.hasAdherenceExplanationViewAccess') &&\n                notification.type === 'AdherenceExplanation'\n            ) {\n                this.processExplanationNotification(usersToCache, adherenceExplanations, notification);\n            }\n\n            // Update groupIds for all existing notifications in the same group as the new notification\n            if (notification.otherNotificationIdsInGroup) {\n                notification.otherNotificationIdsInGroup.forEach(id => {\n                    this.updateNotificationGroupId(\n                        id,\n                        notification.mutableGroupId,\n                        shiftTradeRequests,\n                        timeOffRequests,\n                        adherenceExplanations\n                    );\n                });\n            }\n        }\n\n        return resolve(\n            this.processNotificationResult(usersToCache, timeOffRequests, shiftTradeRequests, adherenceExplanations)\n        );\n    },\n\n    readTimeOffRequest: function (timeOffRequest) {\n        if (timeOffRequest) {\n            if (\n                timeOffRequest.agentNotification &&\n                timeOffRequest.timeOffRequest.user.id === this.get('session.person.id')\n            ) {\n                let torId = timeOffRequest.timeOffRequest.timeOffRequestId;\n                if (this.get('permissions.canViewAgentActivity')) {\n                    this._setHash(`#/activity/schedule?timeOffRequestId=${torId}`);\n                } else {\n                    this._setHash(`#/analytics/agents/schedule/me?timeOffRequest=${torId}`);\n                }\n            } else {\n                this._setHash('#/engage/wfm/admin/timeOffRequests');\n            }\n        }\n    },\n\n    changeShiftTradeRequestReadState: function (shiftTradeRequest, read) {\n        shiftTradeRequest.set('markedAsRead', read);\n        const url = this.application.pcV2Uri('api/v2/workforcemanagement/notifications/update');\n        const data = {\n            entities: [shiftTradeRequest]\n        };\n        this.ajax.post(url, { data });\n    },\n\n    readShiftTradeRequest: function (shiftTradeRequest) {\n        if (shiftTradeRequest) {\n            if (shiftTradeRequest.agentNotification) {\n                const shiftTrade = shiftTradeRequest.alternativeShift\n                    ? shiftTradeRequest.alternativeShift\n                    : shiftTradeRequest.shiftTrade;\n                const shiftTradeId = shiftTradeRequest.alternativeShift ? shiftTrade.id : shiftTrade.tradeId;\n                const start = moment(shiftTrade.weekDate);\n                if (this.get('permissions.canViewAgentActivity')) {\n                    this._setHash(`#/activity/schedule?start=${start.toISOString()}&shiftTradeId=${shiftTradeId}`);\n                } else {\n                    this._setHash(\n                        `#/analytics/agents/schedule/me?start=${start.toISOString()}&shiftTrade=${shiftTradeId}`\n                    );\n                }\n            } else {\n                this._setHash('#/engage/wfm/admin/shiftTrades');\n            }\n        }\n    },\n\n    /**\n     * Sets window.location.hash to the given URL. Extracted as a method so tests\n     * can stub it without triggering the browser's hashchange event (which fires\n     * Ember's HashLocation handler outside the run loop in test mode).\n     */\n    _setHash: function (url) {\n        window.location.hash = url;\n    },\n\n    doCacheUser(user) {\n        return user && !this.getAgentNameById(user.id);\n    },\n\n    processShiftTradeNotification(usersToCache, shiftTradeRequests, notification) {\n        shiftTradeRequests.push(WfmNotificationModel.create(notification));\n        if (notification.shiftTrade) {\n            if (this.doCacheUser(notification.shiftTrade.initiatingUser)) {\n                usersToCache.push(notification.shiftTrade.initiatingUser.id);\n            }\n\n            if (this.doCacheUser(notification.shiftTrade.receivingUser)) {\n                usersToCache.push(notification.shiftTrade.receivingUser.id);\n            }\n        } else if (notification.alternativeShift) {\n            const initiatingUserId = notification.alternativeShift.initiatingUser.id;\n            const receivingUserId = notification.alternativeShift.receivingUser.id;\n            if (initiatingUserId !== 'System' && !this.getAgentNameById(initiatingUserId)) {\n                usersToCache.push(initiatingUserId);\n            }\n\n            if (receivingUserId !== 'System' && !this.getAgentNameById(receivingUserId)) {\n                usersToCache.push(receivingUserId);\n            }\n        }\n    },\n\n    processTimeOffNotification(usersToCache, timeOffRequests, notification) {\n        timeOffRequests.push(WfmNotificationModel.create(notification));\n\n        if (this.doCacheUser(notification.timeOffRequest.user)) {\n            usersToCache.push(notification.timeOffRequest.user.id);\n        }\n    },\n\n    processExplanationNotification(usersToCache, adherenceExplanation, notification) {\n        adherenceExplanation.push(WfmNotificationModel.create(notification));\n\n        if (this.doCacheUser(notification.adherenceExplanation.agent)) {\n            usersToCache.push(notification.adherenceExplanation.agent.id);\n        }\n    },\n\n    processNotificationResult(usersToCache, timeOffRequests, shiftTradeRequests, adherenceExplanations) {\n        let notifications = {};\n\n        let returnResult = () => {\n            this.set('timeOffRequests', timeOffRequests);\n            notifications.timeOffRequests = timeOffRequests;\n            this.set('shiftTradeRequests', shiftTradeRequests);\n            notifications.shiftTradeRequests = shiftTradeRequests;\n            if (this.get('permissions.hasAdherenceExplanationViewAccess')) {\n                this.set('adherenceExplanations', adherenceExplanations);\n                notifications.adherenceExplanations = adherenceExplanations;\n            }\n            return notifications;\n        };\n\n        if (usersToCache.length > 0) {\n            return this.store.findMany('person', _.uniq(usersToCache)).then(results => {\n                results.forEach(user => {\n                    this.set(`userMap.${user.get('id')}`, user);\n                });\n\n                return returnResult();\n            });\n        }\n\n        return returnResult();\n    },\n\n    updateNotificationGroupId(notificationId, groupId, shiftTradeRequests, timeOffRequests, adherenceExplanations) {\n        const findRequestByNotificationId = requests => requests.find(str => str.id === notificationId);\n        const findExplanations = () =>\n            this.get('permissions.hasAdherenceExplanationViewAccess') &&\n            findRequestByNotificationId(adherenceExplanations);\n\n        const existingShiftTradeRequest = findRequestByNotificationId(shiftTradeRequests);\n        const existingTimeOffRequest = !existingShiftTradeRequest && findRequestByNotificationId(timeOffRequests);\n        const existingExplanationRequest = !existingShiftTradeRequest && !existingTimeOffRequest && findExplanations();\n\n        if (existingShiftTradeRequest) {\n            existingShiftTradeRequest.mutableGroupId = groupId;\n        } else if (existingTimeOffRequest) {\n            existingTimeOffRequest.mutableGroupId = groupId;\n        } else if (existingExplanationRequest) {\n            existingExplanationRequest.mutableGroupId = groupId;\n        }\n    },\n\n    toggleNotificationState(notification) {\n        const url = this.application.pcV2Uri('api/v2/workforcemanagement/notifications/update');\n        const data = {\n            entities: [notification]\n        };\n        this.ajax.post(url, { data });\n    },\n\n    updateAdherenceExplanation(explanation, status) {\n        const agentId = explanation.agent.id;\n        const explanationId = explanation.id;\n        const url = this.application.pcV2Uri(\n            `api/v2/workforcemanagement/agents/${agentId}/adherence/explanations/${explanationId}`\n        );\n\n        return this.ajax.patch(url, { data: { status } }).then(result => {\n            this.explanationJobs.add(result.job.id);\n        });\n    },\n\n    async getScheduleUrl(explanation) {\n        try {\n            this.set('application.showLoader', true);\n            this.set('isRouteChanged', false);\n            const schedule = await this.loadSchedule(explanation);\n            const scheduleInfo = this.getScheduleInfo(schedule);\n            const agentId = explanation.agent.id;\n            const startDate = explanation.startDate;\n            if (scheduleInfo) {\n                const url = `#/admin/wfm/schedules/${scheduleInfo.buId}/update/${scheduleInfo.weekDate}${scheduleInfo.id}?agentId=${agentId}&explanationDateTime=${startDate}`;\n                return url;\n            }\n        } catch (error) {\n            throw error;\n        } finally {\n            this.set('application.showLoader', false);\n        }\n    },\n\n    handleRouteChange() {\n        this.set('isRouteChanged', true);\n        this.set('application.showLoader', false);\n    },\n\n    async loadSchedule(explanation) {\n        const agentId = explanation.agent.id;\n        const buId = explanation.businessUnit.id;\n        const endDate = moment.utc(explanation.startDate).add(explanation.lengthMinutes, 'm').toISOString();\n        const data = {\n            startDate: explanation.startDate,\n            endDate,\n            userIds: [agentId]\n        };\n        const scheduleData = await this.ajax.post(\n            this.application.pcV2Uri(`api/v2/workforcemanagement/businessunits/${buId}/agentschedules/search`),\n            { data }\n        );\n\n        return _.assign(scheduleData.result, { buId });\n    },\n\n    getScheduleInfo(schedules) {\n        const [agentSchedule] = schedules.agentSchedules;\n        const scheduleInfo = {\n            buId: schedules.buId\n        };\n\n        if (agentSchedule.shifts.length) {\n            // Get the schduleInfo for the shift, matches the given date range.\n            const [shift] = agentSchedule.shifts;\n            return _.assign(scheduleInfo, {\n                weekDate: shift.schedule.weekDate,\n                id: shift.schedule.id\n            });\n        } else if (schedules.publishedSchedules.length) {\n            // For the empty shifts on the given date range, fetch the schduleInfo of first published schedule.\n            const [publishedSchedule] = schedules.publishedSchedules;\n            return _.assign(scheduleInfo, {\n                weekDate: publishedSchedule.weekDate,\n                id: publishedSchedule.id\n            });\n        }\n    },\n\n    registerExplanationJobTopic() {\n        const topic = this.getExplanationJobTopic();\n        this.pigeon.registerPriorityTopic(topic);\n        this.pigeon.on('jobs', this, this.handleExplanationJobEvent);\n    },\n\n    unRegisterExplanationJobTopic() {\n        const topic = this.getExplanationJobTopic();\n        this.pigeon.unRegisterPriorityTopic(topic);\n        this.pigeon.off('jobs', this, this.handleExplanationJobEvent);\n    },\n\n    handleExplanationJobEvent(event) {\n        if (event.type !== 'UpdateExplanation' || !this.explanationJobs.has(event.id)) {\n            return;\n        }\n        const adherenceExplanation = event.adherenceExplanation;\n        const agentName =\n            this.getAgentNameById(adherenceExplanation.agent.id) || this.intl.t('notification.inbox.unknownAgent');\n        if (event.status === 'Complete') {\n            const title = this.intl.t('notification.inbox.adherenceExplanation.toast.update.title');\n            const message = this.intl.t('notification.inbox.adherenceExplanation.toast.update.message', {\n                agentName,\n                status: this.intl.t(`notification.inbox.adherenceExplanation.${adherenceExplanation.status}`)\n            });\n            this.notification.info(title, message);\n        } else if (event.status === 'Error') {\n            const title = this.intl.t('notification.inbox.adherenceExplanation.toast.badrequest.title');\n            const message = this.intl.t('notification.inbox.adherenceExplanation.toast.badrequest.message', {\n                agentName\n            });\n            this.notification.error(title, message);\n        }\n        this.explanationJobs.delete(event.id);\n    },\n\n    getExplanationJobTopic() {\n        const userId = this.get('session.user.id');\n        return `v2.users.${userId}.workforcemanagement.adherence.explanations.jobs`;\n    },\n\n    canViewAlternativeShiftTradeNotification(notification) {\n        const canViewNotification =\n            notification.agentNotification && this.get('permissions.hasAgentAlternativeShiftAccess');\n        return canViewNotification;\n    }\n});\n","import { observer } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport RSVP from 'rsvp';\nimport config from '../config/environment';\nimport AdaptiveStore from 'ember-simple-auth/session-stores/adaptive';\nimport LocalStorageStore from 'ember-simple-auth/session-stores/local-storage';\nimport EphemeralStore from 'ember-simple-auth/session-stores/ephemeral';\nimport netUtils from '../utils/net';\nimport pcUiAuth from '@purecloud/pc-ui-auth/dist/host';\n\n// Legacy storage key to be phased out. Some apps rely on reading it directly\n// from local storage, which creates problematic coupling between systems\nconst LEGACY_STORAGE_KEY = 'pc_auth';\n\n// sessionStorage key that pc-ui-auth publishes the token under for embedded\n// clients, and that gc-mfe-auth also reads. Kept in sync with AUTH_TOKEN_KEY in\n// @purecloud/pc-ui-auth/dist/common.js.\nconst CLIENT_TOKEN_KEY = 'gcui_auth';\nconst DEFAULT_STORAGE_KEY = 'web_dir_auth';\nconst DEV_COOKIE_EXPIRATION_SECONDS = 10 * 24 * 60 * 60; // 10 days in seconds\n\nconst LEGACY_PROP = 'secure';\nconst CURRENT_PROP = 'authenticated';\n\nlet BaseStore = EphemeralStore;\nlet mode = 'ephemeral';\nlet legacyStorageKey = LEGACY_STORAGE_KEY;\nlet storageKey = DEFAULT_STORAGE_KEY;\n\nif (config.environment === 'development') {\n    BaseStore = AdaptiveStore;\n    mode = 'adaptive';\n\n    try {\n        let currEnvDetails = netUtils.getEnvDetails();\n        if (currEnvDetails && currEnvDetails.local) {\n            legacyStorageKey = `${LEGACY_STORAGE_KEY}-localhost-${currEnvDetails.env}`;\n            storageKey = `${DEFAULT_STORAGE_KEY}-localhost-${currEnvDetails.env}`;\n        }\n    } catch (e) {\n        // Unknown env, prob testing ... just use base storage key\n    }\n} else {\n    BaseStore = LocalStorageStore;\n    mode = 'localStorage';\n}\n\n/**\n * Custom session store that supports:\n *\n * <ul>\n *   <li>All Modes: Backwards compatible with ESA 0.8.3 and previous PC deploys under 0.8.3</li>\n *   <li>Prod Mode: Local Storage persistance with Ephemeral fallback</li>\n *   <li>Dev Mode: Multi-env concurrent authentication to our envs (dev, test, stage, prod) when in dev mode</li>\n *   <li>Dev Mode: Cookie fallback if local storage is unavailable (e.g. Private Safari, Some Mobile)</li>\n * </ul>\n */\nexport default BaseStore.extend({\n    session: service(),\n\n    init() {\n        let storeProps = null;\n        switch (mode) {\n            case 'localStorage':\n                storeProps = {\n                    key: storageKey\n                };\n                break;\n            case 'adaptive':\n                storeProps = {\n                    localStorageKey: storageKey,\n                    cookieName: storageKey,\n                    cookieExpirationTime: DEV_COOKIE_EXPIRATION_SECONDS\n                };\n                break;\n            default:\n                storeProps = {};\n        }\n        this.setProperties(storeProps);\n\n        this._super(...arguments);\n    },\n\n    /*\n     * Override persist/restore to ensure the pre-ESA1.x key\n     * - is used as the restored property when new Collaborate version lands\n     * - is persisted to localstorage for direct Embeded application use\n     */\n    persist(data) {\n        /*\n         * When gc-mfe-auth is managing the session lifecycle, ESA's localStorage-based\n         * cross-tab sync becomes harmful. During gc-mfe-auth bootstrap, the authenticator's\n         * restore() rejects (by design — gc-mfe-auth handles token restoration itself),\n         * which causes ESA to clear the session and persist empty auth data to localStorage.\n         * This empty write propagates via the 'storage' event to other tabs, which interpret\n         * it as session invalidation and reload — creating an infinite reload loop.\n         *\n         * The fix: skip persisting to localStorage when gc-mfe-auth is active and the\n         * authenticated data is being cleared (no access_token). This prevents the\n         * cross-tab invalidation cascade while preserving normal persist behavior for\n         * legitimate session updates.\n         */\n        if (this.get('session.useGCMFEAuth') && (!data[CURRENT_PROP] || !data[CURRENT_PROP].access_token)) {\n            return RSVP.resolve();\n        }\n\n        data[LEGACY_PROP] = data[CURRENT_PROP];\n\n        // Send the auth token to client applications.\n        const token = data[CURRENT_PROP] && data[CURRENT_PROP].access_token;\n\n        if (this.get('session.useGCMFEAuth')) {\n            // Do nothing, the new auth lib handles this now\n        } else if (typeof token === 'string' && token.length > 0) {\n            pcUiAuth.sendTokenToClients(token);\n        } else {\n            /*\n             * pc-ui-auth publishes the token for embedded clients under the\n             * `gcui_auth` sessionStorage key, and gc-mfe-auth reads that same key,\n             * treating whatever it finds as an authoritative raw token.\n             *\n             * Handing sendTokenToClients an absent token stores the string\n             * \"undefined\", which gc-mfe-auth then wraps in a fabricated 24-hour\n             * session and returns from authenticate(). Bootstrap 401s on every\n             * request with that value, and the recovery path clears the session and\n             * restarts OAuth — a second, pointless trip through login. Clear the key\n             * instead so gc-mfe-auth falls back to a real session. (ATLAS-2424)\n             */\n            clearClientToken();\n        }\n\n        const result = this._super(data);\n\n        this.updateLegacyStorage();\n\n        return result;\n    },\n\n    manageLegacyToken: observer('session.features.PURE-5920_disable_legacy_auth', function () {\n        this.updateLegacyStorage();\n    }),\n\n    /*\n     * Depending on the state of the legacy auth toggle, persist to or clear the\n     * legacy auth storage.\n     */\n    updateLegacyStorage() {\n        if (this.get('session.features.PURE-5920_disable_legacy_auth')) {\n            localStorage.removeItem(legacyStorageKey);\n        } else {\n            const data = localStorage.getItem(storageKey);\n            localStorage.setItem(legacyStorageKey, data);\n        }\n    },\n\n    /**\n     * Copy data from the legacy storage location to the new storage location.\n     * This will be needed the first time this version of the session store runs.\n     */\n    migrateFromLegacyStorage() {\n        // Read legacy toggle state to ensure observer will fire on changes.\n        this.get('session.features.PURE-5920_disable_legacy_auth');\n\n        // Do the copy\n        const legacyJson = localStorage.getItem(legacyStorageKey);\n        const currentJson = localStorage.getItem(storageKey);\n        if (readAuthToken(legacyJson) && !readAuthToken(currentJson)) {\n            localStorage.setItem(storageKey, legacyJson);\n        }\n    },\n\n    restore() {\n        // If the previous release used legacy storage, migrate to the new location\n        this.migrateFromLegacyStorage();\n\n        return this._super(...arguments).then(data => {\n            let payload;\n\n            if (data && data[CURRENT_PROP]) {\n                payload = data[CURRENT_PROP];\n            } else if (data && data[LEGACY_PROP]) {\n                // Bridge from 'secure' key to 'authenticated'\n                payload = data[LEGACY_PROP];\n\n                // Bridge from 'authenticators' registration type to 'authenticator'\n                if (payload.authenticator) {\n                    payload.authenticator = payload.authenticator.replace(/^authenticators:/, 'authenticator:');\n                }\n            }\n\n            return {\n                [CURRENT_PROP]: payload\n            };\n        });\n    }\n});\n\n/**\n * Removes the token published for embedded clients.\n *\n * Mirrors `AUTH_TOKEN_KEY` in @purecloud/pc-ui-auth, which exposes a setter but no\n * way to clear the value. The same key is read by @genesys/gc-mfe-auth.\n */\nfunction clearClientToken() {\n    try {\n        window.sessionStorage.removeItem(CLIENT_TOKEN_KEY);\n    } catch (e) {\n        // sessionStorage unavailable (e.g. private browsing); nothing to clear\n    }\n}\n\nfunction readAuthToken(storedJson) {\n    try {\n        return JSON.parse(storedJson).authenticated.access_token;\n    } catch (e) {\n        return null;\n    }\n}\n","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"83A9RtrN\",\"block\":\"[[[10,0],[14,0,\\\"about-pane\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"text-container\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"h3\\\"],[12],[1,[28,[35,0],[\\\"about.title\\\"],null]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,\\\"header\\\"],[14,0,\\\"about-logo-container\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"logo\\\"],[12],[10,1],[14,0,\\\"hide\\\"],[12],[1,[28,[35,0],[\\\"about.company\\\"],null]],[13],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"about-product about-info\\\"],[12],[1,[28,[35,0],[\\\"about.product\\\"],null]],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"about-product-version about-info\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,0],[\\\"about.version\\\"],[[\\\"versionNumber\\\"],[[33,1,[\\\"semver\\\"]]]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,1,[\\\"hostedContext\\\",\\\"isHostedProp\\\"]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"about-product-version about-info\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,0],[\\\"about.desktopVersion\\\"],[[\\\"desktopOS\\\"],[[33,1,[\\\"hostedContext\\\",\\\"_operatingSystem\\\"]]]]]],[1,\\\"\\\\n                \\\"],[1,[33,1,[\\\"hostedContext\\\",\\\"_version\\\"]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"text-container content-container\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"content-pane\\\"],[12],[1,\\\"\\\\n            \\\"],[10,2],[12],[1,[28,[35,0],[\\\"about.paragraph1\\\"],null]],[13],[1,\\\"\\\\n\\\\n            \\\"],[10,2],[12],[1,[28,[35,0],[\\\"about.paragraph2\\\"],null]],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"link-pane\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"ul\\\"],[14,0,\\\"links\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,3],[14,6,\\\"http://help.genesys.cloud/blog/article/purecloud-privacy-policy/\\\"],[14,\\\"target\\\",\\\"help\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,0],[\\\"components.navMenu.privacyPolicy\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,3],[14,6,\\\"http://help.genesys.cloud/blog/article/terms-and-conditions/\\\"],[14,\\\"target\\\",\\\"help\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,0],[\\\"about.termsAndConditions\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,3],[14,6,\\\"http://help.genesys.cloud/blog/article/copyright-trademark-information/\\\"],[14,\\\"target\\\",\\\"help\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,0],[\\\"about.copyrightTrademark\\\"],null]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"brand-footer\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"genesys-logo-container\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"brand-footer-text\\\"],[12],[1,[28,[35,0],[\\\"about.copyright\\\"],[[\\\"currentYear\\\"],[[33,1,[\\\"currentYear\\\"]]]]]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"t\\\",\\\"applicationService\\\",\\\"if\\\"]]\",\"moduleName\":\"web-directory/templates/about/index.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"WuKTWEOC\",\"block\":\"[[[1,[28,[35,0],null,[[\\\"path\\\",\\\"gotoRoute\\\"],[[33,1],\\\"gotoRoute\\\"]]]]],[],false,[\\\"embedded-admin\\\",\\\"path\\\"]]\",\"moduleName\":\"web-directory/templates/admin.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"N7kGGNIZ\",\"block\":\"[[[1,\\\"\\\\n\\\"],[41,[28,[37,1],[[28,[37,2],[[33,3,[\\\"publicApiUser\\\"]],[27]],null],[28,[37,2],[[33,4,[\\\"currentRouteName\\\"]],\\\"login-oauth\\\"],null],[28,[37,2],[[33,4,[\\\"currentRouteName\\\"]],\\\"maintenance\\\"],null],[28,[37,2],[[33,4,[\\\"currentRouteName\\\"]],\\\"no-access\\\"],null],[28,[37,2],[[33,4,[\\\"currentRouteName\\\"]],\\\"policy-access-denied\\\"],null]],null],[[[6,[39,5],null,null,[[\\\"default\\\"],[[[[1,\\\"        \\\"],[46,[28,[37,7],null,null],null,null,null],[1,\\\"\\\\n\\\"]],[]]]]]],[]],[[[41,[33,3,[\\\"useNewNav\\\"]],[[[6,[39,8],null,[[\\\"openChatRoomWithVideo\\\"],[\\\"openChatRoomWithVideo\\\"]],[[\\\"default\\\"],[[[[1,\\\"        \\\"],[46,[28,[37,7],null,null],null,null,null],[1,\\\"\\\\n\\\"]],[]]]]]],[]],[[[6,[39,9],null,[[\\\"openChatRoomWithVideo\\\",\\\"panelsOverrideObject\\\"],[\\\"openChatRoomWithVideo\\\",[33,10]]],[[\\\"default\\\"],[[[[1,\\\"        \\\"],[46,[28,[37,7],null,null],null,null,null],[1,\\\"\\\\n\\\"]],[]]]]]],[]]]],[]]]],[],false,[\\\"if\\\",\\\"or\\\",\\\"eq\\\",\\\"session\\\",\\\"application\\\",\\\"simple-outlet-view\\\",\\\"component\\\",\\\"-outlet\\\",\\\"command-view\\\",\\\"application-view\\\",\\\"panelsOverrideObject\\\"]]\",\"moduleName\":\"web-directory/templates/application.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"/PqmQ60w\",\"block\":\"[[[41,[28,[37,1],[[33,2,[\\\"canViewBusinessChat\\\"]]],null],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"no-access\\\"],[12],[1,\\\"\\\\n        \\\"],[10,2],[14,0,\\\"text-center\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"strong\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,3],[\\\"chat.permissions.accessErrorTitle\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,2],[14,0,\\\"text text-center\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,3],[\\\"chat.permissions.accessError\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[],false,[\\\"if\\\",\\\"not\\\",\\\"permissions\\\",\\\"t\\\"]]\",\"moduleName\":\"web-directory/templates/chat-room.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"UxcHix2b\",\"block\":\"[[[10,0],[15,0,[29,[\\\"media-item webhooks collapsible \\\",[52,[51,[33,1]],\\\"collapsed\\\"]]]],[12],[1,\\\"\\\\n    \\\"],[11,\\\"button\\\"],[24,0,\\\"collapse-toggle btn btn-link\\\"],[24,4,\\\"button\\\"],[4,[38,2],[[30,0],\\\"toggleExpanded\\\"],null],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"webhooks-header\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,3],[[33,4]],null]],[1,\\\"\\\\n            \\\"],[10,\\\"i\\\"],[14,0,\\\"ion-arrow-down-b\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[33,1],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"webhooks-body\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[35,3],[[33,6]],null]],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"webhooks-details\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[12],[1,\\\" \\\"],[1,[28,[35,3],[[33,7]],null]],[1,\\\" \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13]],[],false,[\\\"unless\\\",\\\"expanded\\\",\\\"action\\\",\\\"html-safe\\\",\\\"webhooksHeader\\\",\\\"if\\\",\\\"webhooksTitle\\\",\\\"webhooksDetails\\\"]]\",\"moduleName\":\"web-directory/templates/components/webhooks-collapsible.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"Wy2kFKu4\",\"block\":\"[[[10,0],[14,0,\\\"media-item webhooks collapsed\\\"],[12],[1,\\\"\\\\n    \\\"],[10,1],[14,0,\\\"webhooks-header\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[15,0,[29,[\\\"status \\\",[36,0]]]],[12],[13],[1,\\\"\\\\n        \\\"],[1,[28,[35,1],[[33,2]],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"webhooksStatus\\\",\\\"html-safe\\\",\\\"webhooksHeader\\\"]]\",\"moduleName\":\"web-directory/templates/components/webhooks.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"OxkqEaK7\",\"block\":\"[[[1,[28,[35,0],null,[[\\\"mobile\\\"],[[33,1]]]]]],[],false,[\\\"feedback-section-v2\\\",\\\"mobile\\\"]]\",\"moduleName\":\"web-directory/templates/feedback.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"w+x1SBcc\",\"block\":\"[[[10,1],[14,0,\\\"index\\\"],[12],[1,\\\"\\\\n    \\\"],[1,[28,[35,0],[\\\"about.product\\\"],null]],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"t\\\"]]\",\"moduleName\":\"web-directory/templates/index.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"iVel0aTj\",\"block\":\"[[[1,[34,0]]],[],false,[\\\"internal-logs-panel\\\"]]\",\"moduleName\":\"web-directory/templates/internal-logs.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"4wDusnM5\",\"block\":\"[[[1,[28,[35,0],null,[[\\\"offerMobileApp\\\",\\\"mobileOfferDeclined\\\",\\\"authenticate\\\"],[[33,1,[\\\"offerMobileApp\\\"]],[28,[37,2],[\\\"mobileOfferDeclined\\\"],null],[28,[37,2],[\\\"authenticate\\\"],null]]]]],[1,\\\"\\\\n\\\"],[1,[34,3]]],[],false,[\\\"login-oauth\\\",\\\"model\\\",\\\"route-action\\\",\\\"icon-bootstrap\\\"]]\",\"moduleName\":\"web-directory/templates/login-oauth.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"f9/Xtd9s\",\"block\":\"[[[1,[28,[35,0],null,[[\\\"model\\\",\\\"reloadApp\\\"],[[33,1],[28,[37,2],[[30,0],\\\"reloadApp\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[],false,[\\\"maintenance-page\\\",\\\"model\\\",\\\"action\\\"]]\",\"moduleName\":\"web-directory/templates/maintenance.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"BsOGTlY9\",\"block\":\"[[[10,0],[15,0,[29,[\\\"agent-ui-wrapper \\\",[52,[28,[37,1],[[33,2,[\\\"currentRouteName\\\"]],\\\"agent-ui\\\"],null],\\\"active\\\"]]]],[12],[1,\\\"\\\\n\\\"],[41,[33,3,[\\\"useMultipanel\\\"]],[[[1,\\\"        \\\"],[1,[28,[35,4],null,[[\\\"active\\\",\\\"isPopout\\\",\\\"onQueue\\\",\\\"selectedInteraction\\\",\\\"requestedInteraction\\\",\\\"activeInteractions\\\",\\\"activeWorkitems\\\",\\\"panelsOverrideObject\\\",\\\"emergencyLocationData\\\",\\\"emergencyLocationOn\\\",\\\"streamingConnected\\\"],[true,[33,2,[\\\"isPopout\\\"]],[33,3,[\\\"person\\\",\\\"isOnQueue\\\"]],[33,5,[\\\"selectedInteraction\\\"]],[33,5,[\\\"requestedInteraction\\\"]],[33,5,[\\\"activeInteractions\\\"]],[33,6,[\\\"activeWorkitems\\\"]],[33,7],[33,8,[\\\"emergencyLocationData\\\"]],[33,9],[33,10,[\\\"connectedV2\\\"]]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[1,[28,[35,11],null,[[\\\"active\\\",\\\"isPopout\\\",\\\"onQueue\\\",\\\"selectedInteraction\\\",\\\"requestedInteraction\\\",\\\"activeInteractions\\\",\\\"activeWorkitems\\\",\\\"panelsOverrideObject\\\",\\\"emergencyLocationData\\\",\\\"emergencyLocationOn\\\",\\\"streamingConnected\\\"],[true,[33,2,[\\\"isPopout\\\"]],[33,3,[\\\"person\\\",\\\"isOnQueue\\\"]],[33,5,[\\\"selectedInteraction\\\"]],[33,5,[\\\"requestedInteraction\\\"]],[33,5,[\\\"activeInteractions\\\"]],[33,6,[\\\"activeWorkitems\\\"]],[33,7],[33,8,[\\\"emergencyLocationData\\\"]],[33,9],[33,10,[\\\"connectedV2\\\"]]]]]],[1,\\\"\\\\n\\\"]],[]]],[13]],[],false,[\\\"if\\\",\\\"eq\\\",\\\"application\\\",\\\"session\\\",\\\"acd-interactions-panel-v2\\\",\\\"interaction\\\",\\\"acdworkitem\\\",\\\"panelsOverrideObject\\\",\\\"emergencyLocation\\\",\\\"emergencyLocationOn\\\",\\\"streaming\\\",\\\"acd-interactions-panel\\\"]]\",\"moduleName\":\"web-directory/templates/nav-system-v2/agent-ui.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"/Yxl60tX\",\"block\":\"[[[41,[33,1,[\\\"adminUIContext\\\"]],[[[1,\\\"\\\\n    \\\"],[1,[28,[35,2],null,[[\\\"route\\\",\\\"visible\\\",\\\"clientConfig\\\"],[[33,3,[\\\"activeRoute\\\"]],[52,[33,3,[\\\"activeRoute\\\"]],true,false],[33,3,[\\\"activeCenterStageClients\\\"]]]]]],[1,\\\"\\\\n\\\"],[41,[51,[33,3,[\\\"activeRoute\\\"]]],[[[1,\\\"        \\\"],[18,1,null],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"    \\\"],[10,0],[15,0,[29,[\\\"application-scroll\\\\n            \\\",[36,6],\\\"\\\\n            \\\",[52,[33,7],[33,8,[\\\"communicationOffset\\\"]]],\\\"\\\\n            \\\",[52,[33,9,[\\\"onCall\\\"]],\\\"on-call\\\"],\\\"\\\\n            \\\",[52,[33,1,[\\\"dragging\\\"]],\\\"dragging\\\"],\\\"\\\\n            \\\",[52,[33,10],\\\"admin-footer-visible\\\"],\\\"\\\\n            \\\",[52,[28,[37,11],[[33,12],[33,10]],null],\\\"reclusive-application-scroll\\\"]]]],[12],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[14,1,\\\"orgspan\\\"],[14,\\\"tabindex\\\",\\\"-1\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,13],[[[1,\\\"                \\\"],[10,1],[14,0,\\\"app-loader\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/comet\\\"],[14,0,\\\"gux-spin\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,1,[\\\"isImpersonating\\\"]],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"impersonation-heading\\\"],[12],[1,\\\"\\\\n                    \\\"],[8,[39,14],[[24,0,\\\"clickable\\\"]],[[\\\"@route\\\"],[\\\"admin.manage\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n                        \\\"],[1,[28,[35,15],[\\\"chrome.proxyGreeting\\\"],[[\\\"username\\\",\\\"person\\\"],[[33,16,[\\\"user\\\",\\\"email\\\"]],[33,16,[\\\"person\\\",\\\"email\\\"]]]]]],[1,\\\"\\\\n                    \\\"]],[]]]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[37,11],[[33,16,[\\\"isAuthenticated\\\"]],[33,17,[\\\"isEngageActive\\\"]]],null],[[[1,\\\"                \\\"],[10,0],[15,0,[29,[\\\"embed-container \\\",[52,[33,17,[\\\"isEngageActive\\\"]],\\\"is-visible\\\"]]]],[12],[1,\\\"\\\\n\\\"],[41,[33,17,[\\\"breadcrumb\\\"]],[[[1,\\\"                        \\\"],[1,[28,[35,18],null,[[\\\"breadcrumbs\\\"],[[33,17,[\\\"breadcrumb\\\"]]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                    \\\"],[10,0],[14,0,\\\"engage-app-view\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,0],[14,0,\\\"engage-wrapper\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,19],null,[[\\\"id\\\",\\\"appUrl\\\",\\\"title\\\",\\\"class\\\",\\\"location\\\",\\\"navigation\\\",\\\"redirect\\\",\\\"registerNavEntries\\\",\\\"interact\\\",\\\"phone\\\",\\\"setBreadcrumb\\\",\\\"alerting\\\",\\\"helpURL\\\",\\\"documentFax\\\"],[\\\"engage-frame\\\",[33,17,[\\\"location\\\"]],[28,[37,15],[\\\"components.embeddedAppTitle\\\"],null],\\\"embedded-app-expanded\\\",[33,17,[\\\"location\\\"]],\\\"engageNavigate\\\",\\\"engageRedirect\\\",\\\"engageRegisterNavEntries\\\",\\\"engageInteract\\\",\\\"engagePhoneSelection\\\",\\\"engageSetBreadcrumb\\\",\\\"engageAlertingHeader\\\",\\\"engageHelpURL\\\",\\\"engageDocumentFax\\\"]]]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\\n                    \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[33,16,[\\\"isAuthenticated\\\"]],[[[1,\\\"                \\\"],[10,0],[15,0,[29,[\\\"apps-embed-container \\\",[52,[33,20,[\\\"standaloneAppPoolVisible\\\"]],\\\"is-visible\\\"]]]],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,21],null,[[\\\"appPool\\\",\\\"onAppInstanceApiCall\\\",\\\"onDeletedAppClose\\\",\\\"class\\\",\\\"appsSdkEnabled\\\"],[[33,20,[\\\"standaloneAppPool\\\"]],[28,[37,22],[[30,0],\\\"onStandaloneAppInstanceApiCall\\\"],null],[28,[37,22],[[30,0],\\\"transitionToRoute\\\",\\\"index\\\",null],null],\\\"standalone-app-pool\\\",true]]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n            \\\"],[1,[28,[35,2],null,[[\\\"route\\\",\\\"visible\\\",\\\"clientConfig\\\"],[[33,3,[\\\"activeRoute\\\"]],[52,[33,3,[\\\"activeRoute\\\"]],true,false],[33,3,[\\\"activeCenterStageClients\\\"]]]]]],[1,\\\"\\\\n\\\"],[41,[51,[33,3,[\\\"activeRoute\\\"]]],[[[1,\\\"                \\\"],[18,1,null],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,10],[[[1,\\\"            \\\"],[1,[28,[35,23],null,[[\\\"showAppChrome\\\",\\\"auditDrawerOpen\\\"],[[33,7],[33,12]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[\\\"&default\\\"],false,[\\\"if\\\",\\\"application\\\",\\\"center-stage-frame\\\",\\\"frameService\\\",\\\"unless\\\",\\\"yield\\\",\\\"currentRouteClass\\\",\\\"showAppChrome\\\",\\\"sidebar\\\",\\\"phone\\\",\\\"showAdminAuditFooter\\\",\\\"and\\\",\\\"auditDrawerOpen\\\",\\\"showLoader\\\",\\\"link-to\\\",\\\"t\\\",\\\"session\\\",\\\"engage\\\",\\\"breadcrumb-bar\\\",\\\"embedded-app\\\",\\\"apps\\\",\\\"app-pool\\\",\\\"action\\\",\\\"audit-footer\\\"]]\",\"moduleName\":\"web-directory/templates/nav-system-v2/mainstage.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"qkBflV0K\",\"block\":\"[[[6,[39,0],null,[[\\\"size\\\",\\\"showHeader\\\",\\\"showFooter\\\",\\\"extraClassNames\\\",\\\"cancel\\\",\\\"isOpen\\\"],[\\\"dynamic\\\",false,false,[52,[33,2,[\\\"hostedContext\\\",\\\"isHostedProp\\\"]],\\\"preferences-modal is-desktop\\\",\\\"preferences-modal\\\"],\\\"safeClosePreferencesModal\\\",[33,3]]],[[\\\"default\\\"],[[[[1,\\\"    \\\"],[1,[34,4]],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"\\\\n\\\"],[6,[39,0],null,[[\\\"size\\\",\\\"showHeader\\\",\\\"headerText\\\",\\\"showFooter\\\",\\\"cancel\\\",\\\"confirm\\\",\\\"isOpen\\\"],[\\\"medium\\\",true,[28,[37,5],[\\\"components.inbox.labels.openAgentWorkspaceModal.header\\\"],null],true,\\\"closeAgentWorkspaceRedirectModal\\\",\\\"confirmRedirectToAgentWorkspace\\\",[33,6]]],[[\\\"default\\\"],[[[[1,\\\"    \\\"],[1,[28,[35,5],[\\\"components.inbox.labels.openAgentWorkspaceModal.description\\\"],null]],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"show-agent-workspace-redirect-modal-setting\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,7],null,[[\\\"id\\\",\\\"type\\\",\\\"name\\\",\\\"checked\\\",\\\"change\\\"],[\\\"show-agent-workspace-redirect-modal\\\",\\\"checkbox\\\",\\\"show-agent-workspace-redirect-modal\\\",[33,8],[28,[37,9],[[30,0],\\\"updateUserPreferenceHideWorkspaceRedirectModal\\\"],null]]]]],[1,\\\"\\\\n        \\\"],[10,\\\"label\\\"],[14,\\\"for\\\",\\\"show-agent-workspace-redirect-modal\\\"],[12],[1,[28,[35,5],[\\\"components.inbox.labels.openAgentWorkspaceModal.hideModal\\\"],null]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"\\\\n\\\"],[6,[39,0],null,[[\\\"showHeader\\\",\\\"showFooter\\\",\\\"extraClassNames\\\",\\\"isOpen\\\"],[false,false,[33,10],[33,11]]],[[\\\"default\\\"],[[[[1,\\\"    \\\"],[1,[28,[35,12],null,[[\\\"sendClose\\\"],[\\\"closeMobileModal\\\"]]]],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"\\\\n\\\"],[6,[39,0],null,[[\\\"cancel\\\",\\\"showFooter\\\",\\\"showHeader\\\",\\\"isOpen\\\"],[\\\"closeAdminModal\\\",false,false,[33,13]]],[[\\\"default\\\"],[[[[1,\\\"    \\\"],[1,[28,[35,14],null,[[\\\"closeAdminModal\\\",\\\"src\\\"],[\\\"closeAdminModal\\\",[33,15]]]]],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"\\\\n\\\"],[6,[39,0],null,[[\\\"cancel\\\",\\\"extraClassNames\\\",\\\"showFooter\\\",\\\"headerText\\\",\\\"isOpen\\\"],[\\\"closeWebrtcDebugModal\\\",\\\"webrtc-debug-modal\\\",false,\\\"Webrtc Debugger\\\",[33,16,[\\\"showDebugModal\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"    \\\"],[1,[34,17]],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"\\\\n\\\"],[6,[39,0],null,[[\\\"headerText\\\",\\\"cancel\\\",\\\"size\\\",\\\"extraClassNames\\\",\\\"showFooter\\\",\\\"isOpen\\\"],[[28,[37,5],[\\\"auth.sessionInvalidated\\\"],null],\\\"endCallsAndInvalidateSession\\\",\\\"medium\\\",\\\"logout-modal modal-lg\\\",false,[28,[37,18],[[33,19,[\\\"shouldPreventLogout\\\"]],[33,19,[\\\"logoutSinceUnauthorized\\\"]]],null]]],[[\\\"default\\\"],[[[[1,\\\"    \\\"],[10,0],[14,0,\\\"session-invalidated\\\"],[12],[1,\\\"\\\\n        \\\"],[10,2],[12],[1,[28,[35,5],[\\\"auth.sessionInvalidatedInstructions\\\"],null]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"\\\\n\\\"],[6,[39,0],null,[[\\\"headerText\\\",\\\"cancel\\\",\\\"size\\\",\\\"extraClassNames\\\",\\\"showFooter\\\",\\\"isOpen\\\"],[[28,[37,5],[\\\"carrierPigeon.noLongerSubscribed.header\\\"],null],\\\"immediatelyResubscribe\\\",\\\"medium\\\",\\\"logout-modal modal-lg\\\",false,[33,19,[\\\"shouldWarnNoLongerSubscribed\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"    \\\"],[10,0],[14,0,\\\"cp-no-longer-subscribed\\\"],[12],[1,\\\"\\\\n        \\\"],[10,2],[12],[1,[28,[35,5],[\\\"carrierPigeon.noLongerSubscribed.instructions\\\"],null]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"\\\\n\\\"],[6,[39,0],null,[[\\\"cancelText\\\",\\\"confirmText\\\",\\\"size\\\",\\\"headerText\\\",\\\"confirm\\\",\\\"cancel\\\",\\\"isOpen\\\"],[[28,[37,5],[\\\"common.no\\\"],null],[28,[37,5],[\\\"common.yes\\\"],null],\\\"medium\\\",[28,[37,5],[\\\"deviceProfiles.headsets.permissions.header\\\"],null],[28,[37,9],[[30,0],\\\"closePermissionsModal\\\",true],null],[28,[37,9],[[30,0],\\\"closePermissionsModal\\\"],null],[33,20,[\\\"showPermissionsModal\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"    \\\"],[10,1],[12],[1,[28,[35,5],[\\\"deviceProfiles.headsets.permissions.bodyText\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]]]]]],[],false,[\\\"modal-gux\\\",\\\"if\\\",\\\"application\\\",\\\"showPreferencesModal\\\",\\\"application-preferences\\\",\\\"t\\\",\\\"showAgentWorkspaceRedirectModal\\\",\\\"input\\\",\\\"userPreferenceHideWorkspaceRedirectModal\\\",\\\"action\\\",\\\"mobileModalClasses\\\",\\\"showMobileAppOffer\\\",\\\"mobile-modal\\\",\\\"showAdminModal\\\",\\\"admin-ui-modal\\\",\\\"adminModalSrc\\\",\\\"webrtc\\\",\\\"webrtc-debug-modal\\\",\\\"and\\\",\\\"session\\\",\\\"webrtcSdkService\\\"]]\",\"moduleName\":\"web-directory/templates/nav-system-v2/modals.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"g4jMsTZv\",\"block\":\"[[[10,\\\"h3\\\"],[14,0,\\\"text-center\\\"],[12],[1,\\\"\\\\n    \\\"],[1,[28,[35,0],[\\\"auth.noPermissionsHeader\\\"],null]],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[14,0,\\\"text text-center\\\"],[12],[1,\\\"\\\\n    \\\"],[1,[28,[35,0],[\\\"auth.noPermissions\\\"],null]],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[14,0,\\\"text text-center\\\"],[12],[1,\\\"\\\\n    \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"btn btn-default\\\"],[4,[38,1],[[30,0],\\\"logout\\\"],null],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,0],[\\\"components.navMenu.logout\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"brand-footer\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"genesys-logo-container\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"brand-footer-text\\\"],[12],[1,[28,[35,0],[\\\"about.copyright\\\"],[[\\\"currentYear\\\"],[[33,2,[\\\"currentYear\\\"]]]]]],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"t\\\",\\\"action\\\",\\\"applicationService\\\"]]\",\"moduleName\":\"web-directory/templates/no-access.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"YqKK/zD1\",\"block\":\"[[[10,0],[14,0,\\\"no-station-notification\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"gux-icon\\\"],[14,\\\"icon-name\\\",\\\"legacy/phone-off\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[10,1],[14,0,\\\"no-phone\\\"],[12],[1,\\\"\\\\n        \\\"],[10,1],[14,0,\\\"no-phone-text\\\"],[12],[1,[28,[35,0],[\\\"purecloud.noPhoneSelected\\\"],null]],[13],[1,\\\"\\\\n        \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link action-open-station-picker-v2\\\"],[24,4,\\\"button\\\"],[4,[38,1],[[30,0],\\\"openStationPicker\\\"],null],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"select-text\\\"],[12],[1,[28,[35,0],[\\\"purecloud.station.change\\\"],null]],[13],[1,\\\"\\\\n\\\"],[1,\\\"            \\\"],[10,\\\"i\\\"],[14,0,\\\"pc pc-angle-right\\\"],[12],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"t\\\",\\\"action\\\"]]\",\"moduleName\":\"web-directory/templates/partials/-no-station-notification.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"UyzFAV1c\",\"block\":\"[[[10,0],[14,0,\\\"policy-access-denied-warning-icon\\\"],[14,\\\"aria-hidden\\\",\\\"true\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"gux-icon\\\"],[14,0,\\\"svg-icon\\\"],[14,\\\"icon-name\\\",\\\"fa/hexagon-exclamation-regular\\\"],[14,\\\"decorative\\\",\\\"true\\\"],[12],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,\\\"h3\\\"],[14,0,\\\"text-center\\\"],[12],[1,\\\"\\\\n    \\\"],[1,[28,[35,0],[\\\"auth.policyAccessDeniedHeader\\\"],null]],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[14,0,\\\"text text-center\\\"],[12],[1,\\\"\\\\n    \\\"],[1,[28,[35,0],[\\\"auth.policyAccessDeniedBody\\\"],null]],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,2],[14,0,\\\"text text-center\\\"],[12],[1,\\\"\\\\n    \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"btn btn-default\\\"],[4,[38,1],[[30,0],\\\"logout\\\"],null],[12],[1,\\\"\\\\n        \\\"],[1,[28,[35,0],[\\\"components.navMenu.logout\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"brand-footer\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"genesys-logo-container\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"brand-footer-text\\\"],[12],[1,[28,[35,0],[\\\"about.copyright\\\"],[[\\\"currentYear\\\"],[[33,2,[\\\"currentYear\\\"]]]]]],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"t\\\",\\\"action\\\",\\\"applicationService\\\"]]\",\"moduleName\":\"web-directory/templates/policy-access-denied.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"wLsjrCAX\",\"block\":\"[[[10,0],[15,0,[29,[\\\"active-call \\\",[52,[33,1,[\\\"isRecording\\\"]],\\\"is-recording\\\"]]]],[12],[1,\\\"\\\\n\\\"],[41,[33,1,[\\\"justMyselfOnCall\\\"]],[[[6,[39,2],null,[[\\\"minHeight\\\"],[215]],[[\\\"default\\\"],[[[[1,\\\"            \\\"],[10,0],[14,0,\\\"participants\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"participant-container\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,3],null,[[\\\"participant\\\"],[[33,4,[\\\"activeCall\\\",\\\"theOtherPartyWhileContacting\\\"]]]]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"],[41,[33,4,[\\\"activeCall\\\",\\\"dialingTime\\\"]],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"duration\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[35,5],[\\\"purecloud.contacting\\\"],null]],[1,\\\":\\\\n                        \\\"],[1,[28,[35,6],null,[[\\\"startTime\\\"],[[33,4,[\\\"activeCall\\\",\\\"dialingTime\\\"]]]]]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]]],[]],[[[41,[33,7],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"prompt-merge\\\"],[12],[1,\\\"\\\\n                \\\"],[10,2],[12],[1,[28,[35,5],[\\\"purecloud.promptForMerge\\\"],null]],[13],[1,\\\"\\\\n                \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-primary\\\"],[24,4,\\\"button\\\"],[4,[38,8],[[30,0],\\\"makeMergeRequest\\\"],null],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,5],[\\\"common.confirm\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[11,\\\"button\\\"],[24,0,\\\"btn btn-link cancel\\\"],[24,4,\\\"button\\\"],[4,[38,8],[[30,0],\\\"cancelMerge\\\"],null],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[35,5],[\\\"common.cancel\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[6,[39,2],null,[[\\\"minHeight\\\"],[215]],[[\\\"default\\\"],[[[[1,\\\"            \\\"],[10,0],[14,0,\\\"participants\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,1,[\\\"onConsult\\\"]],[[[1,\\\"                    \\\"],[1,[28,[35,9],null,[[\\\"conversation\\\"],[[33,1]]]]],[1,\\\"\\\\n\\\"]],[]],[[[6,[39,10],null,[[\\\"dropped\\\"],[\\\"itemDropped\\\"]],[[\\\"default\\\"],[[[[1,\\\"                        \\\"],[10,0],[14,0,\\\"participant-container\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,1,[\\\"isDisconnected\\\"]],[[[41,[33,1,[\\\"onConference\\\"]],[[[1,\\\"                                    \\\"],[10,0],[14,0,\\\"call-status\\\"],[12],[1,[28,[35,5],[\\\"purecloud.disconnected\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,11],[[33,1,[\\\"conversationIsAConsult\\\"]],[28,[37,12],[[33,1,[\\\"isDisconnected\\\"]]],null]],null],[[[1,\\\"                                        \\\"],[1,[28,[35,3],null,[[\\\"participant\\\"],[[33,1,[\\\"consultOtherParty\\\"]]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                        \\\"],[1,[28,[35,3],null,[[\\\"participant\\\"],[[33,1,[\\\"otherDisconnectedParty\\\"]]]]]],[1,\\\"\\\\n\\\"]],[]]]],[]]],[41,[33,13],[[[41,[28,[37,11],[[33,4,[\\\"activeCall\\\",\\\"isGroupRing\\\"]],[28,[37,12],[[33,4,[\\\"activeCall\\\",\\\"isOutboundGroupRing\\\"]]],null]],null],[[[1,\\\"                                        \\\"],[10,0],[14,0,\\\"call-status\\\"],[12],[1,\\\"\\\\n                                            \\\"],[1,[28,[35,5],[\\\"purecloud.peerDisconnect\\\"],[[\\\"caller\\\"],[[28,[37,14],[[33,4,[\\\"activeCall\\\",\\\"groupRingCaller\\\",\\\"name\\\"]],\\\"\\\"],null]]]]],[1,\\\"\\\\n                                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                        \\\"],[10,0],[14,0,\\\"call-status\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,4,[\\\"activeCall\\\",\\\"conversationIsAConsult\\\"]],[[[41,[33,4,[\\\"activeCall\\\",\\\"consultInitiatorLeftCall\\\"]],[[[1,\\\"                                                    \\\"],[1,[28,[35,5],[\\\"purecloud.myselfDisconnect\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                                    \\\"],[1,[28,[35,5],[\\\"purecloud.peerDisconnect\\\"],[[\\\"caller\\\"],[[28,[37,14],[[33,4,[\\\"activeCall\\\",\\\"consultOtherPartyModel\\\",\\\"name\\\"]],\\\"\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]]]],[]],[[[1,\\\"                                                \\\"],[1,[28,[35,5],[\\\"purecloud.peerDisconnect\\\"],[[\\\"caller\\\"],[[28,[37,14],[[33,4,[\\\"activeCall\\\",\\\"otherDisconnectedPartyModel\\\",\\\"name\\\"]],\\\"\\\"],null]]]]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"                                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[]],[[[41,[33,15],[[[1,\\\"                                    \\\"],[10,0],[14,0,\\\"call-status\\\"],[12],[1,[28,[35,5],[\\\"purecloud.myselfDisconnect\\\"],null]],[13],[1,\\\"\\\\n                                \\\"]],[]],null]],[]]]],[]],[[[41,[33,4,[\\\"activeCall\\\",\\\"myselfIsMonitor\\\"]],[[[1,\\\"                                    \\\"],[1,[28,[35,3],null,[[\\\"participant\\\"],[[33,4,[\\\"activeCall\\\",\\\"monitoredParticipant\\\"]]]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,4,[\\\"activeCall\\\",\\\"myselfIsCoach\\\"]],[[[1,\\\"                                    \\\"],[1,[28,[35,3],null,[[\\\"participant\\\"],[[33,4,[\\\"activeCall\\\",\\\"coachedParticipant\\\"]]]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[33,4,[\\\"activeCall\\\",\\\"myselfIsBarged\\\"]],[[[1,\\\"                                    \\\"],[1,[28,[35,3],null,[[\\\"participant\\\"],[[33,4,[\\\"activeCall\\\",\\\"bargedParticipant\\\"]]]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[37,11],[[33,4,[\\\"activeCall\\\",\\\"isGroupRing\\\"]],[33,4,[\\\"activeCall\\\",\\\"_groupRingCaller\\\"]],[28,[37,12],[[33,4,[\\\"activeCall\\\",\\\"isOutboundGroupRing\\\"]]],null],[28,[37,12],[[33,4,[\\\"activeCall\\\",\\\"onConference\\\"]]],null]],null],[[[1,\\\"                                    \\\"],[1,[28,[35,3],null,[[\\\"participant\\\"],[[33,4,[\\\"activeCall\\\",\\\"_groupRingCaller\\\"]]]]]],[1,\\\"\\\\n\\\"]],[]],[[[42,[28,[37,17],[[28,[37,17],[[33,1,[\\\"callParties\\\"]]],null]],null],null,[[[1,\\\"                                        \\\"],[1,[28,[35,3],null,[[\\\"participant\\\"],[[30,1]]]]],[1,\\\"\\\\n\\\"]],[1]],[[[41,[33,1,[\\\"errorInfoMessage\\\"]],[[[1,\\\"                                            \\\"],[10,2],[12],[1,[33,1,[\\\"errorInfoMessage\\\"]]],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                                            \\\"],[10,0],[14,0,\\\"call-status\\\"],[12],[1,[28,[35,5],[\\\"purecloud.connecting\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]]]],[]]],[1,\\\"                                \\\"]],[]]]],[]]]],[]]]],[]]]],[]]],[1,\\\"                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]]],[]]],[1,\\\"\\\\n\\\"],[41,[33,1,[\\\"startTime\\\"]],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"duration\\\"],[12],[1,\\\"\\\\n\\\"],[41,[33,4,[\\\"activeCall\\\",\\\"isRinging\\\"]],[[[1,\\\"                            \\\"],[1,[28,[35,5],[\\\"purecloud.ringing\\\"],null]],[1,\\\":\\\\n\\\"]],[]],[[[41,[33,4,[\\\"activeCall\\\",\\\"isDialing\\\"]],[[[1,\\\"                            \\\"],[1,[28,[35,5],[\\\"purecloud.dialing\\\"],null]],[1,\\\":\\\\n                        \\\"]],[]],null]],[]]],[1,\\\"                        \\\"],[10,1],[15,\\\"aria-hidden\\\",[29,[[52,[33,18],\\\"true\\\",\\\"false\\\"]]]],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[35,6],null,[[\\\"startTime\\\"],[[33,1,[\\\"startTime\\\"]]]]]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                        \\\"],[10,1],[14,0,\\\"sr-only\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[34,19]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[51,[33,1,[\\\"isDisconnected\\\"]]],[[[1,\\\"                    \\\"],[1,[28,[35,21],[[33,1],[33,22]],[[\\\"addParticipant\\\",\\\"record\\\",\\\"mergeCalls\\\"],[\\\"addParticipant\\\",\\\"record\\\",\\\"mergeCalls\\\"]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"  \\\\n\\\"],[41,[28,[37,12],[[33,23]],null],[[[1,\\\"            \\\"],[10,0],[15,0,[29,[\\\"chat \\\",[52,[51,[33,24]],\\\"hidden\\\"]]]],[12],[1,\\\"\\\\n                \\\"],[1,[28,[35,25],null,[[\\\"isCallPane\\\"],[true]]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]],[13]],[\\\"participant\\\"],false,[\\\"if\\\",\\\"activeCall\\\",\\\"resizable-content\\\",\\\"call-participant\\\",\\\"phone\\\",\\\"t\\\",\\\"duration-format\\\",\\\"promptForMerge\\\",\\\"action\\\",\\\"consult-transfer\\\",\\\"drag-drop-container\\\",\\\"and\\\",\\\"not\\\",\\\"peerDisconnectedCall\\\",\\\"or\\\",\\\"myselfDisconnectedCall\\\",\\\"each\\\",\\\"-track-array\\\",\\\"durationFormatter\\\",\\\"readableDurationFormat\\\",\\\"unless\\\",\\\"conversation-controls\\\",\\\"dialpadShouldSendDtmf\\\",\\\"isPoppedOut\\\",\\\"showChatRoom\\\",\\\"chat-frame-router\\\"]]\",\"moduleName\":\"web-directory/templates/purecloud/partials/on-call.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"666ZVwgQ\",\"block\":\"[[[10,0],[14,0,\\\"logo-container\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"logo\\\"],[12],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"panel-container\\\"],[12],[1,\\\"\\\\n    \\\"],[1,[34,0]],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"brand-footer\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"genesys-logo-container\\\"],[12],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"brand-footer-text\\\"],[12],[1,[28,[35,1],[\\\"about.copyright\\\"],[[\\\"currentYear\\\"],[[33,2,[\\\"currentYear\\\"]]]]]],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"]],[],false,[\\\"region-chooser\\\",\\\"t\\\",\\\"applicationService\\\"]]\",\"moduleName\":\"web-directory/templates/region-chooser.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"ySjxPhuh\",\"block\":\"[[[1,[28,[35,0],null,[[\\\"model\\\",\\\"isEditing\\\"],[[33,1],[33,2]]]]]],[],false,[\\\"skillgroup-profile\\\",\\\"model\\\",\\\"isEditing\\\"]]\",\"moduleName\":\"web-directory/templates/skillgroup/detail.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"tQqyvyly\",\"block\":\"[[],[],false,[]]\",\"moduleName\":\"web-directory/templates/third-party/app-embed.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"dEtrCCnR\",\"block\":\"[[[46,[28,[37,1],null,null],null,null,null],[1,\\\"\\\\n\\\"]],[],false,[\\\"component\\\",\\\"-outlet\\\"]]\",\"moduleName\":\"web-directory/templates/time-machine.hbs\",\"isStrictMode\":false});","import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory({\"id\":\"3FjeopqI\",\"block\":\"[[[10,0],[14,0,\\\"timeline-layout\\\"],[12],[1,\\\"\\\\n    \\\"],[1,[34,0]],[1,\\\"\\\\n\\\"],[13]],[],false,[\\\"timeline-stream\\\"]]\",\"moduleName\":\"web-directory/templates/timeline.hbs\",\"isStrictMode\":false});","import Transform from 'ember-data/transform';\n\nexport default Transform.extend({\n    deserialize(serialized) {\n        return new Date(serialized);\n    },\n\n    serialize(deserialized) {\n        return deserialized.toISOString();\n    }\n});\n","/**\n * Type tests for feature toggle keys\n *\n * These tests verify that the type system correctly extracts and validates\n * feature toggle keys. They are compile-time tests - if this file compiles\n * without errors, the types are working correctly.\n */\n\nimport type {\n    FeatureToggleKey,\n    V1FeatureToggleKey,\n    V2FeatureToggleKey,\n    FeatureToggles,\n    FeatureTogglesBySuffix,\n    AtlasFeatureToggle,\n    PureFeatureToggle,\n    AIFeatureToggle,\n    ACEFeatureToggle,\n    WEMFeatureToggle\n} from './feature-toggle-keys';\nimport featureToggles, { v1Toggles, v2Toggles } from '../utils/feature-toggles';\n\n// Test 1: Valid toggle keys should compile\nconst validToggle1: FeatureToggleKey = 'ATLAS-1796_new-call-persistent-connection';\nconst validToggle2: FeatureToggleKey = 'PURE-5920_disable_legacy_auth';\nconst validToggle3: FeatureToggleKey = 'AI-1223_copilot-framework';\n\n// Test 2: V1 and V2 toggle separation\nconst v1Toggle: V1FeatureToggleKey = 'acdAnnounceMonitoring';\nconst v2Toggle: V2FeatureToggleKey = 'ATLAS-1796_new-call-persistent-connection';\n\n// Test 3: Can check if toggle exists in array\nconst isInArray: boolean = featureToggles.includes('ATLAS-1796_new-call-persistent-connection');\nconst isV1InArray: boolean = v1Toggles.includes('acdAnnounceMonitoring');\nconst isV2InArray: boolean = v2Toggles.includes('ATLAS-1796_new-call-persistent-connection');\n\n// Test 4: Prefix filtering works\nconst atlasToggle: AtlasFeatureToggle = 'ATLAS-1796_new-call-persistent-connection';\nconst pureToggle: PureFeatureToggle = 'PURE-5920_disable_legacy_auth';\nconst aiToggle: AIFeatureToggle = 'AI-1223_copilot-framework';\nconst aceToggle: ACEFeatureToggle = 'ACE-4461_org-settings-fetch';\nconst wemToggle: WEMFeatureToggle = 'WEM-1083_staReprocessInteractions';\n\n// Test 5: Suffix filtering\ntype UIToggles = FeatureTogglesBySuffix<'.ui'>;\nconst uiToggle: UIToggles = 'coaching.overdue.ui';\n\n// Test 6: FeatureToggles type matches the actual array\nconst allToggles: FeatureToggles = featureToggles;\n\n// Test 7: Can iterate over toggle keys\nconst toggleKeys: FeatureToggleKey[] = [\n    'ATLAS-1796_new-call-persistent-connection',\n    'PURE-5920_disable_legacy_auth',\n    'AI-1223_copilot-framework'\n];\n\ntoggleKeys.forEach((key: FeatureToggleKey) => {\n    const isPresent: boolean = featureToggles.includes(key);\n    console.log(`${key}: ${isPresent}`);\n});\n\n// Test 9: Type narrowing works\nfunction checkToggle(key: FeatureToggleKey): boolean {\n    return featureToggles.includes(key);\n}\n\nconst result = checkToggle('ATLAS-1796_new-call-persistent-connection');\n\n// Test 10: V1 and V2 toggle sets are separate\nconst v1Keys: V1FeatureToggleKey[] = ['acdAnnounceMonitoring', 'never-free-seating'];\n// Test 11: New PLATFORM-4742 toggle is a valid V2 toggle key\nconst platformToggle: V2FeatureToggleKey = 'PLATFORM-4742_use-gc-mfe-auth';\nconst v2Keys: V2FeatureToggleKey[] = ['ATLAS-1796_new-call-persistent-connection', 'PURE-5920_disable_legacy_auth'];\n\n// Export to prevent \"unused\" warnings\nexport {\n    validToggle1,\n    validToggle2,\n    validToggle3,\n    v1Toggle,\n    v2Toggle,\n    isInArray,\n    isV1InArray,\n    isV2InArray,\n    atlasToggle,\n    pureToggle,\n    aiToggle,\n    aceToggle,\n    wemToggle,\n    uiToggle,\n    allToggles,\n    toggleKeys,\n    result,\n    v1Keys,\n    v2Keys,\n    platformToggle\n};\n","export * from './maybe.type';\nexport * from './conversation.type';\n","import { CommunicationType } from '@genesys/genesys-cloud-conversation-utils';\nimport { UnionFromTuple, assertNever } from 'web-directory/utils/types';\nimport { AppContext } from './apps';\nimport { get } from '@ember/object';\nimport type { QueueMediaSettingsType, ConversationTypeArray } from 'web-directory/types/queue-media-settings';\n\nexport const COMMUNICATION_TYPE_SINGULAR = ['call', 'email', 'message', 'chat', 'callback'] as const;\nexport type CommunicationTypeSingular = UnionFromTuple<typeof COMMUNICATION_TYPE_SINGULAR>;\n\n/**\n * Issue warning that closure action was not provided to component.\n * @param {string} actionName The name of closure function that was not provided\n */\nexport function warnClosureAction(actionName: string, args: any = {}): any {\n    const message = `ACD: ${actionName} closure action has not been set up for this component.`;\n    console.warn(message, { arguments: args });\n}\n\nexport function singularizeMediaType(type: CommunicationType): CommunicationTypeSingular {\n    return type.substring(0, type.length - 1) as CommunicationTypeSingular;\n}\n\n/**\n * Retrieves the queue ID from the given app context.\n *\n * This function extracts the queue ID based on the type of the app context.\n * For 'conversation' type, it attempts to retrieve the queue ID from the participant payload.\n * For 'workitem' type, it retrieves the queue ID directly from the workitem payload.\n * If the type is not recognized, it asserts an error.\n */\nexport function getQueueIdFromAppContext(appContext: AppContext): string | undefined {\n    const { type } = appContext;\n    switch (type) {\n        case 'conversation': {\n            return (\n                appContext.payload.get('participantForCurrentUser.queueId') ||\n                appContext.payload.get('participantForQueue.queueId')\n            );\n        }\n        case 'workitem': {\n            return appContext.payload.workitem.queueId;\n        }\n        case 'externalContact':\n        case 'analyticsConversation': {\n            return undefined;\n        }\n        default: {\n            assertNever(type);\n        }\n    }\n}\n\nfunction getCommunicationMediaChannelArray(conversation: any): ConversationTypeArray | [] {\n    let mediaChannels: ConversationTypeArray | undefined;\n    const conversationType = getBaseCommunicationType(conversation);\n    switch (conversationType) {\n        case 'call':\n            mediaChannels = get(conversation, 'participantForCurrentUser.calls');\n            break;\n        case 'chat':\n            mediaChannels = get(conversation, 'participantForCurrentUser.chats');\n            break;\n        case 'email':\n            mediaChannels = get(conversation, 'participantForCurrentUser.emails');\n            break;\n        case 'message':\n            mediaChannels = get(conversation, 'participantForCurrentUser.messages');\n            break;\n        case 'callback':\n            mediaChannels =\n                get(conversation, 'participantForCurrentUser.callbacks') ||\n                get(conversation, 'participantForCurrentUser.calls');\n            break;\n    }\n    return mediaChannels || [];\n}\n\nfunction getBaseCommunicationType(interactionModel: any): CommunicationTypeSingular | null {\n    if (!interactionModel) return null;\n    return get(interactionModel, 'type');\n}\n\nexport function getQueueMediaSettings(conversation: any): QueueMediaSettingsType | Record<string, never> {\n    const mediaChannels = getCommunicationMediaChannelArray(conversation);\n    return mediaChannels[0]?.queueMediaSettings || {};\n}\n","import { A } from '@ember/array';\nimport { typeOf } from '@ember/utils';\nimport { get } from '@ember/object';\nimport _ from 'lodash';\nimport { pluralize } from 'ember-inflector';\nimport { camelize } from 'web-directory/utils/string-transforms';\nimport moment from 'web-directory/utils/dates';\nimport { findLast } from './find-last';\n\nconst MEDIA_TYPES = ['callbacks', 'calls', 'chats', 'emails', 'messages'];\n\nfunction participantHasMedia(participants, media) {\n    return !!participants.find(participant => !!participant[media]);\n}\n\n// Assigns the interaction data sent from carrier pigeon or REST API response\n// to a property on the model that can be used to retrieve an interaction's \"raw\" data\nexport function setInteractionModelMetadata(model, interactionMetadata) {\n    try {\n        let metadataClone = _.cloneDeep(interactionMetadata);\n\n        if (typeOf(model) === 'instance') {\n            model.set('__interaction_metadata__', metadataClone);\n        } else {\n            model.__interaction_metadata__ = metadataClone;\n        }\n    } catch (err) {\n        console.error('Unable to clone and set the interaction metadata for interaction', {\n            err,\n            remoteData: {\n                interactionId: get(model, 'id')\n            }\n        });\n    }\n}\n\nexport function getCommunicationType(interactionModel) {\n    if (!interactionModel) return null;\n    return interactionModel.get('subMessageType') || interactionModel.get('type');\n}\n\nexport function getInteractionTypeFromCP(interaction, myGuid) {\n    if (!interaction || !myGuid || !interaction.participants) {\n        return {};\n    }\n\n    const myParticipants = interaction.participants.filter(participant => {\n        return participant.userId === myGuid;\n    });\n\n    const active = {};\n    MEDIA_TYPES.forEach(type => {\n        active[type] = participantHasMedia(myParticipants, type);\n    });\n\n    return active;\n}\n\nexport function interactionHasSipErrors(interaction) {\n    if (!interaction) {\n        return false;\n    }\n\n    let callsError = false;\n    const calls = interaction.get('participantForCurrentUser.calls');\n\n    if (calls) {\n        callsError = A(calls).some(call => {\n            const code = get(call, 'disconnectReasons.firstObject.code');\n\n            // 487 is Voicemail Not Available, which is not treated as an error\n            // 410 is a queue call that gets transfered to an agent for some reason\n            return code && code >= 300 && code !== 487 && code !== 410;\n        });\n    }\n\n    return callsError;\n}\n\n/**\n * Gets the true customer participant - whether it is the consultParticipant true customer or the last connected customer\n * @param interaction\n * @returns {*}\n */\nexport function getTrueCustomerIfMultipleCustomersExist(interaction) {\n    if (interaction) {\n        const participants = get(interaction, 'participants') || [];\n        const type = get(interaction, 'type');\n        const isEmail = interaction.get('isEmail');\n        const customerParticipants =\n            participants.filter(\n                ({ purpose }) => purpose === 'customer' || purpose === 'external' || (purpose === 'user' && isEmail)\n            ) || A([]);\n\n        const hasMultipleCustomers = customerParticipants.length > 1;\n\n        if (hasMultipleCustomers) {\n            const isCallOrCallbackOrEmail = interaction.get('isCall') || interaction.get('isCallback') || isEmail;\n\n            if (isCallOrCallbackOrEmail) {\n                const consultParticipantId =\n                    get(interaction, 'consultParticipantId') ||\n                    customerParticipants.mapBy('consultParticipantId').pop();\n                if (consultParticipantId) {\n                    return customerParticipants.findBy('id', consultParticipantId);\n                } else {\n                    /**\n                     * SERVOPS-13490 - when there are multiple customers on a blind transfer call from a previous consult\n                     * call there can be more than one customer participant in the list so deriving the correct communication\n                     * ID for the true customer can be wrong.  Since the blind transfer happened - there is no longer information\n                     * about what user is the consultParticipant so we will take the most recently connected\n                     * customer as the inferred true customer\n                     *\n                     * SERVOPS-58642 – when agent 1 starts an outbound email interaction – then agent 2\n                     * reconnects and replies – agent 2 is added to the participant array as `user`.\n                     * This can cause issues when the conversation is connected again as the `customer` name in the agent UI will be\n                     * agent 2 instead of the original customer contact.\n                     */\n\n                    let participant;\n                    for (let i = 0; i < customerParticipants.length; i++) {\n                        let customer = customerParticipants[i];\n\n                        const communicationType = camelize(pluralize(type));\n                        const communications = customer[communicationType] || [];\n                        const { state } = communications[0] || {};\n                        if (!get(customer, 'endTime') || state === 'connected') {\n                            return customer;\n                        }\n                        const customerEndTime = moment(get(customer, 'endTime'));\n                        const lastParticipantEndTime = participant ? moment(get(participant, 'endTime')) : null;\n\n                        if (!participant || customerEndTime.isAfter(lastParticipantEndTime)) {\n                            participant = customer;\n                        }\n                    }\n                    return participant;\n                }\n            }\n        }\n    }\n}\n\n/**\n * Determines if a participant is a barge participant.\n *\n * `bargedParticipantId` gets removed when the barge participant leaves, so it's not always\n * a reliable indicator. The `mediaRoles` array persists with a `barge` string after the barge participant leaves\n * and serves as the fallback check.\n *\n * @param {object} participant - the raw participant object from a conversation payload\n * @returns {boolean}\n */\nexport function isBargeParticipant(participant) {\n    if (!participant) return false;\n\n    return (\n        !!participant.bargedParticipantId ||\n        (Array.isArray(participant.mediaRoles) && participant.mediaRoles.includes('barge'))\n    );\n}\n\n/**\n * True when the participant has no endTime and call state is not a terminal disconnected state.\n * Used for queue-to-queue naming. Treat alerting/contacting as \"still active\" like otherConnectedParticipants.\n * @private\n * @param {object} participant\n * @returns {boolean}\n */\nfunction _isParticipantActive(participant) {\n    if (!participant || participant.endTime) {\n        return false;\n    }\n    // Not terminated or disconnected. Should be somewhat redundant with the endTime check, but better safe than sorry.\n    return _callStateScoreForQueueToQueue(participant) !== 1;\n}\n\n/** Rank call legs so connected peers beat alerting ones when choosing a display participant. */\nfunction _callStateScoreForQueueToQueue(participant) {\n    const state = get(participant, 'calls.firstObject.state');\n    const callState = state && String(state).toLowerCase();\n    if (callState === 'connected') {\n        return 3;\n    }\n    if (callState === 'alerting' || callState === 'contacting' || callState === 'offering') {\n        return 2;\n    }\n    if (callState === 'terminated' || callState === 'disconnected') {\n        return 1;\n    }\n    return 0;\n}\n\n/**\n * Voice: prefer call leg `connectedTime` (similar to `interaction-timers` / conference roster), then participant.\n *\n * @private\n * @param {object} participant\n * @returns {number}\n */\nfunction _voiceParticipantConnectedAtMs(participant) {\n    // Call leg time differentiates duplicate agent rows. Similar to interaction-timers / roster behavior.\n    const fromCall = get(participant, 'calls.firstObject.connectedTime');\n    const fromParticipant = get(participant, 'connectedTime');\n    const raw = fromCall || fromParticipant;\n    // Convert to milliseconds since 1970 for comparison.\n    return new Date(raw || 0).getTime();\n}\n\n/**\n * Latest disconnect / end timestamp available on the participant or its primary call.\n *\n * @private\n * @param {object} participant\n * @returns {number}\n */\nfunction _voiceParticipantEndedAtMs(participant) {\n    // Use whichever end timestamp the platform populated (participant vs call) for tie-breaks.\n    const times = [get(participant, 'endTime'), get(participant, 'calls.firstObject.endTime')]\n        .filter(Boolean)\n        .map(t => new Date(t).getTime());\n    return times.length ? Math.max(...times) : 0;\n}\n\n/**\n * Stable most recent ordering for queue-to-queue picks. Later index wins on full ties (newer legs appended last).\n *\n * @private\n * @param {Array} participants\n * @param {object} a\n * @param {object} b\n * @returns {number}\n */\nfunction _compareParticipantsByVoiceRecency(participants, a, b) {\n    // Prefer more recently connected leg.\n    const connectedAtDiff = _voiceParticipantConnectedAtMs(b) - _voiceParticipantConnectedAtMs(a);\n    if (connectedAtDiff !== 0) {\n        return connectedAtDiff;\n    }\n    // Same connect time. Prefer whoever ended last.\n    const endedAtDiff = _voiceParticipantEndedAtMs(b) - _voiceParticipantEndedAtMs(a);\n    if (endedAtDiff !== 0) {\n        return endedAtDiff;\n    }\n    // Tiebreaker, later array slot wins (conversation service tends to append newer legs).\n    return participants.indexOf(b) - participants.indexOf(a);\n}\n\n/**\n * Initiator (queue-calling side): agent row for current user with an outbound call leg.\n *\n * @private\n * @param {Array} agentParticipants\n * @param {string} currentUserGuid\n * @returns {boolean}\n */\nfunction _isCurrentUserQueueToQueueInitiator(agentParticipants, currentUserGuid) {\n    if (!agentParticipants || !agentParticipants.length || !currentUserGuid) {\n        return false;\n    }\n    // Queue caller's agent row is outbound. Answering agent rows are inbound.\n    return agentParticipants.some(participant => {\n        if (participant.userId !== currentUserGuid) {\n            return false;\n        }\n        return get(participant, 'calls.firstObject.direction') === 'outbound';\n    });\n}\n\n/**\n * Among non-self agents, pick best for receiver naming.\n *\n * @private\n * @param {Array} agentParticipants\n * @param {string} currentUserGuid\n * @returns {object|null}\n */\nfunction _pickReceiverPeerAgent(agentParticipants, currentUserGuid) {\n    const otherAgents = agentParticipants.filter(p => p.userId && p.userId !== currentUserGuid);\n    if (otherAgents.length === 0) {\n        return null;\n    }\n    const sorted = otherAgents.slice().sort((a, b) => {\n        // Prefer connected alerting peer when multiple non-self agent rows exist.\n        const diff = _callStateScoreForQueueToQueue(b) - _callStateScoreForQueueToQueue(a);\n        if (diff !== 0) {\n            return diff;\n        }\n        // Same call-state tier (e.g. all terminated or disconnected).\n        // Break ties with voice recency on the full agent list.\n        return _compareParticipantsByVoiceRecency(agentParticipants, a, b);\n    });\n    return sorted[0];\n}\n\n/**\n * Initiator-side: among all `acd` legs and other agents, prefer any still-active leg.\n * Tiebreak prefers peer agent, then call state, then voice connected time.\n * When everyone is disconnected/terminated, pick the **last connected** non-self **agent** row.\n * Using call-first `connectedTime`, then latest end, then array order.\n *\n * @private\n * @param {Array} participants Full roster (most recent ordering uses index in this array).\n * @param {string} currentUserGuid\n * @param {Array} agentParticipants `participants` filtered to `purpose === 'agent'`.\n * @param {Array} acdParticipants `participants` filtered to `purpose === 'acd'`.\n * @returns {object|null}\n */\nfunction _pickInitiatorQueueToQueueParticipant(participants, currentUserGuid, agentParticipants, acdParticipants) {\n    // Preserve roster order so full-tie most recent ordering matches the prior loop.\n    const candidates = participants.filter(\n        p => p.purpose === 'acd' || (p.purpose === 'agent' && p.userId && p.userId !== currentUserGuid)\n    );\n\n    const active = candidates.filter(_isParticipantActive);\n    if (active.length) {\n        const sorted = active.slice().sort((a, b) => {\n            // While both queue and peer are active, prefer the human.\n            const purposeDiff = (b.purpose === 'agent' ? 1 : 0) - (a.purpose === 'agent' ? 1 : 0);\n            // Different purpose. Prefer agent.\n            if (purposeDiff !== 0) {\n                return purposeDiff;\n            }\n            // Same purpose. Break ties with call state.\n            const stateDiff = _callStateScoreForQueueToQueue(b) - _callStateScoreForQueueToQueue(a);\n            if (stateDiff !== 0) {\n                return stateDiff;\n            }\n            // Same call state. Break ties with voice recency.\n            return _compareParticipantsByVoiceRecency(participants, a, b);\n        });\n        return sorted[0];\n    }\n\n    // Everyone down, pick last-connected agent only so ended queue rows do not beat the peer.\n    const peerAgents = agentParticipants.filter(p => p.userId && p.userId !== currentUserGuid);\n    if (peerAgents.length) {\n        const sortedPeers = peerAgents.slice().sort((a, b) => _compareParticipantsByVoiceRecency(participants, a, b));\n        return sortedPeers[0];\n    }\n\n    // No peer agent rows, fall back to best queue object for naming.\n    const sortedAcd = acdParticipants.slice().sort((a, b) => _compareParticipantsByVoiceRecency(participants, a, b));\n    return sortedAcd[0];\n}\n\n/**\n * Queue-to-queue voice: when the conversation has **only** `agent` and `acd` participants — no other purposes,\n * no screen-monitor rows, and no coach/monitor/barge legs — return the participant `participantForCustomer` should use.\n * Supports multiple agent and/or `acd` rows (re-alert, blind transfer back to queue).\n * Call only when `isCall && !onConsult`. Otherwise behavior is undefined.\n * Returns `null` when this does not apply so legacy logic runs.\n *\n * @see [Queue to Queue Voice Participant for Customer](../../docs/ADRs/participantForCustomer/queueToQueueCalls.md)\n *\n * @param {Array} participants\n * @param {string} currentUserGuid\n * @returns {object|null}\n */\nexport function resolveQueueToQueueVoiceParticipantForCustomer(participants, currentUserGuid) {\n    // Bail out so callers fall back to generic participantForCustomer logic.\n    if (!participants || !participants.length || !currentUserGuid) {\n        return null;\n    }\n\n    // Bail out if the participants array is not in queue-to-queue shape.\n    if (\n        participants.some(\n            part =>\n                isScreenMonitoringParticipant(part) ||\n                Boolean(part.monitoredParticipantId || part.coachedParticipantId || isBargeParticipant(part)) ||\n                (part.purpose !== 'agent' && part.purpose !== 'acd')\n        )\n    ) {\n        return null;\n    }\n\n    const acdParticipants = participants.filter(p => p.purpose === 'acd');\n    const agentParticipants = participants.filter(p => p.purpose === 'agent');\n\n    // Require at least one queue leg so we do not treat pure internal agent-agent conversations as queue-to-queue.\n    if (!acdParticipants.length || !agentParticipants.length) {\n        return null;\n    }\n\n    // Newest active queue leg wins when multiple ACD objects exist.\n    const liveAcd = acdParticipants.filter(_isParticipantActive);\n    const sortedLiveAcd = liveAcd.length\n        ? liveAcd.slice().sort((a, b) => _compareParticipantsByVoiceRecency(participants, a, b))\n        : [];\n\n    const initiator = _isCurrentUserQueueToQueueInitiator(agentParticipants, currentUserGuid);\n\n    // Initiator: show destination queue while an ACD leg is still active, then apply same non-self rules as below.\n    if (initiator) {\n        if (sortedLiveAcd.length) {\n            return sortedLiveAcd[0];\n        }\n        return _pickInitiatorQueueToQueueParticipant(participants, currentUserGuid, agentParticipants, acdParticipants);\n    }\n\n    // Receiver or non-outbound current user, always prefer initiator peer agent.\n    return _pickReceiverPeerAgent(agentParticipants, currentUserGuid);\n}\n\n/**\n * Determines if a participant is a screen monitoring participant.\n *\n * `screenMonitoredParticipantId` gets removed when a call ends, so it's not always\n * a reliable indicator. The `screenMonitorings` array persists after the call ends and\n * serves as the fallback check.\n *\n * @param {object} participant - the raw participant object from a conversation payload\n * @returns {boolean}\n */\nexport function isScreenMonitoringParticipant(participant) {\n    if (!participant) return false;\n\n    return !!(\n        participant.screenMonitoredParticipantId ||\n        (participant.screenMonitorings && participant.screenMonitorings.length > 0)\n    );\n}\n\n/**\n * Returns true if the conversation event should be skipped because the current user\n * is only participating as a screen monitor. Assumes that the participants array will\n * always hold at least one participant that is the current user.\n *\n * @param {Array} participants - the participants array from the conversation payload\n * @param {string} currentUserId - the current user's guid\n * @returns {boolean}\n */\nexport function isCurrentUserOnlyAScreenMonitor(participants, currentUserId) {\n    const participantsArr = participants || [];\n    const nonScreenMonitorUserParticipant = findLast(participantsArr, p => {\n        return p.userId === currentUserId && !isScreenMonitoringParticipant(p);\n    });\n\n    return !nonScreenMonitorUserParticipant;\n}\n\nexport function isOutboundEmailInteraction(interactionModel) {\n    const agent = (get(interactionModel, 'participants') || []).findBy('purpose', 'agent') || {};\n    return get(agent, 'emails.firstObject.direction') === 'outbound';\n}\n\nexport function isOutboundMessagingInteraction(interactionModel) {\n    const agent = (get(interactionModel, 'participants') || []).findBy('purpose', 'agent') || {};\n    return get(agent, 'messages.firstObject.direction') === 'outbound';\n}\n\n/**\n * Util for creating an immutable pojo for a given contact\n * @param contact\n * @returns {*}\n */\nexport function createContactPojo(contact) {\n    if (!contact) return;\n    const derivedProperties = ['name', 'canonicalId', 'isCanonical'];\n    const contactJSON = typeof contact.toJSON === 'function' ? contact.toJSON({ includeId: true }) : {};\n    const derived = derivedProperties.reduce((accumulator, property) => {\n        const value = get(contact, property);\n        if (value) {\n            accumulator[property] = value;\n        }\n        return accumulator;\n    }, {});\n    return Object.assign(contactJSON, derived);\n}\n\n/**\n * Issue warning that closure action was not provided to component.\n * @param {string} actionName The name of closure function that was not provided\n */\nexport function warnClosureAction(actionName, args) {\n    const message = `ACD: ${actionName} closure action has not been set up for this component.`;\n    console.warn(message, { arguments: args });\n}\n","const participantStatuses = {\n    ALERTING: 'ALERTING',\n    CONNECTING: 'CONNECTING',\n    CONNECTED: 'CONNECTED',\n    CONTACTING: 'CONTACTING',\n    DIALING: 'DIALING',\n    DISCONNECTED: 'DISCONNECTED',\n    PARKED: 'PARKED',\n    OFFERING: 'OFFERING',\n    TERMINATED: 'TERMINATED',\n    TRANSMITTING: 'TRANSMITTING'\n};\n\nexport default participantStatuses;\n","import { hasKey } from 'web-directory/utils/types';\n\n/** Interaction shape from `validActiveInteractions` used when mapping for Apps V2. */\nexport type ValidActiveInteractionForAppsV2 = {\n    id: string;\n    type: string;\n    payload?: object;\n};\n\n/**\n * Filters to conversation interactions and maps payloads to conversation metadata for Apps V2.\n */\nexport function mapValidActiveInteractionsToConversations(\n    validActiveInteractions: ValidActiveInteractionForAppsV2[] | null | undefined\n): unknown[] {\n    const activeInteractions = (validActiveInteractions || []).filter(curr => curr.type === 'conversation');\n    return activeInteractions.map(conv =>\n        conv.payload != null && typeof conv.payload === 'object' && hasKey(conv.payload, '__interaction_metadata__')\n            ? (conv.payload as Record<string, unknown>)['__interaction_metadata__']\n            : { id: conv.id }\n    );\n}\n","import Ember from 'ember';\nimport { get } from '@ember/object';\nimport AgentAssistChecks from 'web-directory/services/agent-assist-checks';\nimport { doFocus } from 'web-directory/utils/focus-management';\n\ninterface CleanupAfterWrapupGadgetSubmitArgs {\n    interaction: any;\n    logger: any;\n    agentAssistChecksService: AgentAssistChecks;\n    isSelectedInteraction: boolean;\n    chatService?: any;\n    communicationService?: any;\n}\n\nexport async function cleanupAfterWrapupGadgetSubmit({\n    logger,\n    chatService,\n    agentAssistChecksService,\n    communicationService,\n    interaction,\n    isSelectedInteraction\n}: CleanupAfterWrapupGadgetSubmitArgs) {\n    if (!interaction) {\n        logger?.error('ACW wrapup gadget cleanup: interaction does not exist');\n        return;\n    }\n\n    const isChat = get(interaction, 'isChat');\n    const isCall = get(interaction, 'isCall');\n    const isCallback = get(interaction, 'isCallback');\n    const isAgentAssistACWEnabled = get(interaction, 'isAgentAssistACWEnabled');\n    const room = get(interaction, 'room');\n\n    if (isAgentAssistACWEnabled) {\n        removeAgentAssistSummaryFromLocalStorage({\n            interaction,\n            logger,\n            agentAssistChecksService\n        });\n    }\n\n    if (isChat && !!room && !!get(room, 'jid') && !!chatService) {\n        room.clearMessageCache();\n        await chatService.closeActiveRoom(room);\n    }\n\n    if ((isCall || isCallback) && !!communicationService) {\n        await communicationService.disconnectCall(interaction);\n    }\n\n    if (isSelectedInteraction) {\n        doFocus(Ember, '#interactions-heading');\n    }\n}\n\nfunction removeAgentAssistSummaryFromLocalStorage({\n    interaction,\n    logger,\n    agentAssistChecksService\n}: Pick<CleanupAfterWrapupGadgetSubmitArgs, 'interaction' | 'logger' | 'agentAssistChecksService'>) {\n    const interactionId = get(interaction, 'id');\n    let agentAssistSummaryData: Record<string, any> = {};\n\n    try {\n        const agentAssistSummaryFromLocalStorage = localStorage.getItem('agentAssistSummary');\n\n        if (!!agentAssistSummaryFromLocalStorage) {\n            agentAssistSummaryData = JSON.parse(agentAssistSummaryFromLocalStorage);\n        }\n    } catch (error) {\n        logger?.debug('Agent Assist Summary: Could not get summary data from localStorage', error);\n    }\n\n    if (!!agentAssistSummaryData[interactionId]) {\n        delete agentAssistSummaryData[interactionId];\n        agentAssistChecksService.removeAssistantState(interactionId);\n\n        try {\n            localStorage.setItem('agentAssistSummary', JSON.stringify(agentAssistSummaryData));\n        } catch (error) {\n            logger?.debug('Agent Assist Summary: Unable to update summary data localStorage', error);\n        }\n    }\n}\n","import { getGenesysAppName } from '../utils/genesys-app-name';\n\n/**\n * Builds the standard Authorization header used by adapters that talk to org/Genesys Cloud APIs.\n *\n * @param {Object} session - the session service (or any object exposing `accessToken`)\n * @param {Object} [extraHeaders] - additional headers to merge in\n * @returns {Object} a headers hash including `Content-Type` and `Authorization` when a token is available\n */\nexport function buildAuthHeaders(session, application, extraHeaders = {}) {\n    const headers = Object.assign({ 'Content-Type': 'application/json' }, extraHeaders);\n    const accessToken = session ? session.accessToken : null;\n    if (accessToken) {\n        headers['Authorization'] = `bearer ${accessToken}`;\n    }\n\n    // Add Genesys-App header for all GC Public API requests\n    // This matches the logic in app/authenticators/directory.js _addHeadersPrefilter\n    if (application) {\n        const genesysAppName = getGenesysAppName({\n            semver: application.get('semver'),\n            isHosted: application.get('hostedContext.isHostedProp'),\n            isPopout: application.get('isPopout')\n        });\n        if (genesysAppName) {\n            headers['Genesys-App'] = genesysAppName;\n        }\n    }\n    return headers;\n}\n\n/**\n * Force-merges auth headers into an `ajaxOptions()` hash. Ember 3.28's `DS.RESTAdapter` does not\n * reliably pick up a native `get headers()` getter via Ember Data's internal request machinery, so\n * adapters must also merge these headers explicitly inside their own `ajaxOptions()` override.\n * Mirrors the equivalent logic already used in `app/adapters/application.js` and `app/adapters/purecloud.js`.\n *\n * @param {Object} hash - the ajaxOptions hash to mutate (as returned by `this._super(...)`)\n * @param {Object} headers - the headers to merge in (typically the adapter's own `this.headers`)\n * @returns {Object} the same hash, with headers merged in\n */\nexport function mergeAuthHeaders(hash, headers) {\n    if (headers) {\n        hash.headers = Object.assign({}, headers, hash.headers || {});\n    }\n    return hash;\n}\n","/* global intlTelInputUtils */\n\n/**\n   Result from attempting to format an address string.\n   @prop {string} originalAddress - Address passed in to be formatted\n   @prop {string} displayText - Text representation of the address suitable of display to a user.\n   @prop {string} queueId - Queue ID from the address if one was found.\n   @prop {string} jid - User JID from the address if one was found.\n*/\nexport class AddressFormatResult {\n    constructor(originalAddress, displayText) {\n        this.originalAddress = originalAddress;\n        this.displayText = displayText;\n    }\n\n    /**\n     Does the address contain an entity ID that could be used to look up a name for display?\n     @return {bool}\n  */\n    get isEntity() {\n        return !!(this.queueId || this.jid);\n    }\n}\n\n/**\n * Format addresses including international numbers (e.g., +1 (919) 555-5555), tel addresses and sip addresses.\n * @param  {string} address\n * @param  {string} [country] - The country code of the address. Usually not needed; defaults to 'US' so formatNumber will work, but international numbers will be formatted correctly even with that default.\n * @return {AddressFormatResult}\n */\nexport function formatAddressForDisplay(address, country = 'US') {\n    let displayText = address || '';\n\n    if (displayText.startsWith('sip:')) {\n        return formatSipAddressForDisplay(displayText);\n    }\n\n    if (displayText.startsWith('tel:')) {\n        const telParts = displayText.split(';');\n\n        const telNumber = telParts[0].slice(4);\n        const extension = telParts.slice(1).find(part => /^ext=/g.test(part));\n\n        displayText = extension ? `${telNumber};${extension}` : telNumber;\n    }\n\n    if (intlTelInputUtils.isValidNumber(displayText, country)) {\n        displayText = intlTelInputUtils.formatNumber(\n            displayText,\n            country,\n            intlTelInputUtils.numberFormat.INTERNATIONAL\n        );\n    }\n\n    return new AddressFormatResult(address, displayText);\n}\n\n/**\n * This is a mild improvement over our naiive formatting of just stripping 'sip:'\n * it does a regex to try to find a jid, in the case that the address might identify a purecloud user\n * Otherwise, see if the address part is a phone number, and try to format it as such. Otherwise, fallback\n * to the original sip address, without the prefix\n * @param  {string} address\n * @return {AddressFormatResult}\n */\nexport function formatSipAddressForDisplay(address) {\n    const fallback = address.substring(4);\n    const regex = /sip:([A-z0-9]+\\+.*?\\.orgspan\\.com).*/;\n    const result = new AddressFormatResult(address, fallback);\n\n    // Use try catch because sip addresses returned from services can be crazy sometimes, and we want a lot of\n    // protection against unexpected values/formats\n    try {\n        const jidMatch = address.match(regex);\n        const jid = jidMatch && jidMatch.length > 1 && jidMatch[1] && jidMatch[1].replace('+', '@');\n\n        if (jid) {\n            result.jid = jid;\n            result.displayText = jid;\n            return result;\n        }\n\n        const phoneRegex = /sip:([0-9()+\\-\\s]+)@.*/;\n        let phoneNumberMatch = address.match(phoneRegex);\n        let phoneNumber = phoneNumberMatch && phoneNumberMatch.length > 1 && phoneNumberMatch[1];\n\n        if (phoneNumberMatch) {\n            return formatAddressForDisplay(phoneNumber);\n        }\n\n        const queueRegex = /sip:([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})@/;\n        let queueIdMatch = address.match(queueRegex);\n        let queueId = queueIdMatch && queueIdMatch.length > 1 && queueIdMatch[1];\n\n        if (queueId) {\n            result.queueId = queueId;\n            return result;\n        }\n    } catch (e) {\n        // no op;\n    }\n\n    return result;\n}\n","/**\n * Params from the URL in the router. Pattern could be any of the following.\n *   - engage/admin/interactions/:interactionId/\n *   - engage/admin/interactions/:interactionId/*interactionDetailPath\n *   - engage/agent/interactions/:interactionId/\n *   - engage/agent/interactions/:interactionId/*interactionDetailPath\n */\ninterface InteractionDetailRedirectUrlParams {\n    /** GUID for the interaction. */\n    interactionId: string;\n\n    /** Sub-path within the interaction detail view like /details or /transcript. May not be present if the path ends with the interaction ID like engage/agent/interactions/:interactionId/ */\n    interactionDetailPath?: string;\n}\n\nexport interface InteractionDetailRedirectArgs {\n    /** Params from the URL in the router. */\n    urlParams: InteractionDetailRedirectUrlParams;\n\n    /** Query params from the URL. */\n    queryParams?: Record<string, string | undefined>;\n\n    /** URL segment for routing to either the admin or agent interaction detail path. */\n    adminAgentSegment: 'admin' | 'agent';\n}\n\n/** Builds a path to the analytics-ui iframe coordinator route for the interaction detail view given parameters from the old /engage/admin/interactions/ path. */\nexport function buildInteractionDetailRedirectPath(args: InteractionDetailRedirectArgs): string {\n    const queryParams = args.queryParams || {};\n    const queryParamSegments: Array<string> = [];\n\n    Object.entries(queryParams).forEach(keyValuePair => queryParamSegments.push(keyValuePair.join('=')));\n\n    const queryParamString = queryParamSegments.join('&');\n    const interactionId = args.urlParams.interactionId;\n    const interactionDetailPath = args.urlParams.interactionDetailPath;\n    const adminAgentSegment = args.adminAgentSegment;\n\n    let url = `/analytics/interactions/${interactionId}/${adminAgentSegment}/`;\n\n    if (interactionDetailPath) {\n        url += interactionDetailPath;\n    }\n\n    if (queryParamString) {\n        url += `?${queryParamString}`;\n    }\n\n    return url;\n}\n","import { getEvaluator, parse } from 'boon-js';\nimport { _buildProviderComputed } from 'web-directory/utils/shared-provider';\n\nexport const _buildAppProviderComputed = function (providerConfig) {\n    return _buildProviderComputed(providerConfig, 'app-provider');\n};\n\nexport const _buildProviderConfig = function (providerConfigMap, logger) {\n    if (!providerConfigMap) {\n        return {};\n    }\n    let keys = Object.keys(providerConfigMap);\n    let providerConfig = {};\n    keys.forEach(currKey => {\n        const boolExpr = providerConfigMap[currKey];\n        providerConfig[currKey] = { providerInstance: null, boolExpr };\n        try {\n            if (boolExpr) {\n                providerConfig[currKey].evaluator = getEvaluator(boolExpr);\n\n                let currDependencies = parse(boolExpr)\n                    .filter(curr => {\n                        return curr.name === 'IDENTIFIER';\n                    })\n                    .map(curr => {\n                        const [valueTag, value] = curr.value.split(':');\n                        if (!value || value === '') {\n                            throw new Error('Invalid element in boolean expression');\n                        }\n                        if (valueTag === 'ft') {\n                            return 'session.features.' + value;\n                        } else if (\n                            valueTag === 'perm' ||\n                            (valueTag === 'bool' && (value === 'true' || value === 'false'))\n                        ) {\n                            return '';\n                        } else {\n                            throw new Error('Invalid element in boolean expression');\n                        }\n                    })\n                    .filter(curr => {\n                        return curr !== '';\n                    });\n                providerConfig[currKey].dependencies = currDependencies;\n            }\n        } catch (err) {\n            delete providerConfig[currKey];\n            logger.warn('Invalid feature toggle and permission restrictions expression for provider: ', {\n                key: currKey\n            });\n        }\n    });\n    return providerConfig;\n};\n\nexport const validatePortNumber = function (portToValidate, defaultPort) {\n    const portInt = +portToValidate;\n    if (isNaN(portInt) || portInt <= 0 || portInt >= 65535) {\n        return defaultPort;\n    }\n    return portInt;\n};\n\nexport default { _buildProviderConfig, _buildAppProviderComputed };\n","import { assertNever } from 'web-directory/utils/types';\nimport { RenderedInstanceState, WorkerInstance } from '@genesys/apps-v2-host';\nimport { isKnown } from '@genesys/service-discovery-web-internal';\n\nexport const isTrusted = (renderedInstance: RenderedInstanceState): boolean => {\n    const { appDef } = renderedInstance;\n    const { type: appType } = appDef;\n\n    switch (appType) {\n        case 'dynaWebComp':\n        case 'elementFactoryAppDef':\n        case 'elementSingletonAppDef':\n            // all internal types are trusted and allowed\n            break;\n        case 'iframe':\n            if (!appDef.trustedDataPassing) {\n                return false;\n            }\n            break;\n        default:\n            assertNever(appType);\n    }\n\n    return true;\n};\n\nexport const isWorkerTrusted = (_workerInstance: WorkerInstance): boolean => {\n    return true;\n};\n\nexport const isWorkerInternallyHosted = (workerInstance: WorkerInstance): boolean => {\n    try {\n        if (!isKnown(workerInstance.definition.src, {})) {\n            return false;\n        }\n    } catch (error) {\n        return false;\n    }\n    return true;\n};\n\nexport const isActive = (renderedInstance: RenderedInstanceState): boolean => {\n    return renderedInstance.appState !== 'STOPPING';\n};\n\nexport const isVisible = (renderedInstance: RenderedInstanceState): boolean => {\n    return renderedInstance.appState !== 'STOPPING' && renderedInstance.userVisible;\n};\n\nexport const isInternallyHosted = (renderedInstance: RenderedInstanceState): boolean => {\n    const { appDef } = renderedInstance;\n    const { type: appType } = appDef;\n\n    switch (appType) {\n        case 'dynaWebComp':\n        case 'elementFactoryAppDef':\n        case 'elementSingletonAppDef':\n            // all internallyHosted types are trusted and allowed\n            break;\n        case 'iframe':\n            // isKnown throws if the url is invalid, so we catch it and return false\n            try {\n                if (!isKnown(appDef.src.href, {})) {\n                    return false;\n                }\n            } catch (error) {\n                return false;\n            }\n            break;\n        default:\n            assertNever(appType);\n    }\n\n    return true;\n};\n\n//exported for testing\nexport const validationChecks = {\n    isTrusted: {\n        check: isTrusted,\n        invalidReason: 'appDefNotTrusted'\n    },\n    isActive: {\n        check: isActive,\n        invalidReason: 'instanceNotActive'\n    },\n    isVisible: {\n        check: isVisible,\n        invalidReason: 'instanceNotVisible'\n    }\n};\n\nexport type ValidationKey = keyof typeof validationChecks;\ntype InvalidReason = (typeof validationChecks)[ValidationKey]['invalidReason'];\n\ntype ValidateRenderedInstanceResult =\n    | {\n          type: 'valid';\n      }\n    | { type: 'invalid'; reasons: InvalidReason[] };\n\nexport const validateRenderedInstance = (\n    renderedInstance: RenderedInstanceState,\n    ...validations: ValidationKey[]\n): ValidateRenderedInstanceResult => {\n    const invalidReasons: InvalidReason[] = [];\n\n    for (const validation of validations) {\n        const validationConfig = validationChecks[validation];\n        const result = validationConfig.check(renderedInstance);\n        if (!result) invalidReasons.push(validationConfig.invalidReason);\n    }\n    if (invalidReasons.length > 0) {\n        return { type: 'invalid', reasons: invalidReasons };\n    }\n    return { type: 'valid' };\n};\n","import { typeOf, isPresent } from '@ember/utils';\nimport { WorkitemInteraction } from '@genesys/genesys-cloud-conversation-utils';\nimport { assertNever, hasKey } from './types';\nimport { AppDef, AppLogDetails, Asset } from '@genesys/apps-v2-host';\nimport { StashLoggerLogPayload } from '@web-directory/services';\nimport { Models } from 'purecloud-platform-client-internal-v2';\n\n// General Constants\nexport const SDK_REPO_URL = 'https://github.com/MyPureCloud/client-app-sdk';\n\n// Namespaces for logging, metrics, etc\nexport const LOG_ROOT_NAMESPACE = 'PureCloud Client Apps';\nexport const LOG_STANDALONE_APP_NAMESPACE = 'Standalone App';\nexport const LOG_API_NAMESPACE = 'API';\nexport const LOG_INTERAPPTIONS_NAMESPACE = 'Interapptions';\nexport const LOG_COPILOT_FRAMEWORK_NAMESPACE = 'Copilot Framework';\nconst LOG_SEPARATOR = ' - ';\n\nexport * as AppsV2 from '@genesys/apps-v2-host';\n\nexport type ConversationAppContext = {\n    type: 'conversation';\n    // TODO: The actual type is an ember model, InteractionModel; use when this type is available.\n    payload: any;\n    id: string;\n};\nexport type WorkitemAppContext = {\n    type: 'workitem';\n    payload: WorkitemInteraction;\n    id: string;\n};\nexport type ExternalContactAppContext = {\n    type: 'externalContact';\n    /** The external contact ID. Mapped to GcExternalContactAppContext.externalContactId in getBootstrapData. */\n    id: string;\n};\nexport type AnalyticsConversationAppContext = {\n    type: 'analyticsConversation';\n    /** Revisit to determine if the payload should stay optional. */\n    payload?: Models.AnalyticsConversation;\n    /** The analytics conversation ID. Mapped to GcAnalyticsConversationAppContext.conversationId in getBootstrapData. */\n    id: string;\n};\nexport type InteractionAppContext = ConversationAppContext | WorkitemAppContext;\nexport type AppContext = InteractionAppContext | ExternalContactAppContext | AnalyticsConversationAppContext;\n\ntype AppDefV1VectorAsset = { vector: string };\ntype AppDefV1GuxAsset = { guxIcon: { name: string; decorative: boolean } };\ntype AppDefV1AssetSrcSet = { raster: Record<`x${number}`, string> };\nexport type AppDefV1Asset = Partial<AppDefV1GuxAsset & AppDefV1VectorAsset & AppDefV1AssetSrcSet>;\n\ntype AppLogDetailsObject = ReturnType<AppLogDetails['getLogs']>;\n\nexport default {\n    SDK_REPO_URL,\n    LOG_ROOT_NAMESPACE,\n    LOG_STANDALONE_APP_NAMESPACE,\n    LOG_API_NAMESPACE,\n    LOG_INTERAPPTIONS_NAMESPACE,\n    LOG_COPILOT_FRAMEWORK_NAMESPACE,\n\n    buildLogMsg(msg: string, ...subNamespaces: string[]) {\n        let tokens = [LOG_ROOT_NAMESPACE];\n\n        if (subNamespaces.length > 0) {\n            subNamespaces.forEach(currNamespace => {\n                if (typeOf(currNamespace) !== 'string' || !isPresent(currNamespace)) {\n                    throw new Error('invalidNamespaceValue');\n                } else {\n                    tokens.push(currNamespace);\n                }\n            });\n        }\n\n        if (typeOf(msg) !== 'string' || !isPresent(msg)) {\n            throw new Error('invalidMessage');\n        } else {\n            tokens.push(msg);\n        }\n\n        return tokens.join(LOG_SEPARATOR);\n    },\n\n    buildApiLogMsg(msg: string) {\n        return this.buildLogMsg(msg, LOG_API_NAMESPACE);\n    },\n\n    buildStandaloneAppLogMsg(msg: string, ...subNamespaces: string[]) {\n        return this.buildLogMsg(msg, LOG_STANDALONE_APP_NAMESPACE, ...subNamespaces);\n    },\n\n    buildInterapptionsLogMsg(msg: string, ...subNamespaces: string[]) {\n        return this.buildLogMsg(msg, LOG_INTERAPPTIONS_NAMESPACE, ...subNamespaces);\n    },\n\n    buildCopilotFrameworkLogMsg(msg: string, ...subNamespaces: string[]) {\n        return this.buildLogMsg(msg, LOG_COPILOT_FRAMEWORK_NAMESPACE, ...subNamespaces);\n    },\n\n    buildStashLoggerDetails(logDetails: Partial<AppLogDetailsObject> = {}): StashLoggerLogPayload {\n        const details: StashLoggerLogPayload = { ...logDetails.data };\n        details.remoteData = { ...logDetails.remote };\n        if (logDetails.mask) {\n            details.remoteData.sensitive = { ...logDetails.mask };\n        }\n        return details;\n    },\n\n    buildViewId(id: string) {\n        return `app_${id.replaceAll('&', '_')}`;\n    },\n\n    isAppDefV2(toCheck: unknown): toCheck is AppDef {\n        if (!toCheck || typeof toCheck !== 'object' || !hasKey(toCheck, 'type') || typeof toCheck.type !== 'string') {\n            return false;\n        }\n        return (\n            ['iframe', 'elementSingletonAppDef', 'elementFactoryAppDef', 'dynaWebComp'] as ReadonlyArray<string>\n        ).includes(toCheck.type);\n    },\n\n    isAppContext(toCheck: unknown): toCheck is AppContext {\n        if (!toCheck || typeof toCheck !== 'object') {\n            return false;\n        }\n\n        if (\n            !hasKey(toCheck, 'type') ||\n            typeof toCheck.type !== 'string' ||\n            !['conversation', 'workitem', 'externalContact', 'analyticsConversation'].includes(toCheck.type)\n        ) {\n            return false;\n        }\n\n        if (!hasKey(toCheck, 'id') || typeof toCheck.id !== 'string') {\n            return false;\n        }\n\n        if (toCheck.type === 'conversation' || toCheck.type === 'workitem') {\n            if (!hasKey(toCheck, 'payload') || typeof toCheck.payload !== 'object' || !toCheck.payload) {\n                return false;\n            }\n        }\n\n        if (toCheck.type === 'analyticsConversation') {\n            if (\n                hasKey(toCheck, 'payload') &&\n                toCheck.payload !== undefined &&\n                (typeof toCheck.payload !== 'object' || toCheck.payload === null)\n            ) {\n                return false;\n            }\n        }\n\n        return true;\n    },\n\n    buildV1IconAsset(asset: Asset): AppDefV1Asset {\n        const { type } = asset;\n        switch (type) {\n            case 'remoteVectorImage':\n                return {\n                    vector: asset.url.href\n                };\n            case 'remoteRasterImage':\n                if (asset.width !== asset.height) {\n                    return {};\n                }\n                return {\n                    raster: {\n                        [`x${asset.width}`]: asset.url.href\n                    }\n                };\n            case 'remoteRasterImageSet':\n                const raster = Object.fromEntries(\n                    asset.images\n                        .filter(curr => curr.width === curr.height)\n                        .map<[string, string]>(curr => {\n                            return [`x${curr.width}`, curr.url.href];\n                        })\n                );\n\n                if (Object.keys(raster).length === 0) {\n                    return {};\n                }\n\n                return {\n                    raster\n                };\n            case 'sparkV3SvgSprite':\n                return {\n                    guxIcon: {\n                        name: asset.classNames.join(' '),\n                        decorative: true\n                    }\n                };\n            default:\n                assertNever(type);\n        }\n    },\n\n    buildV2IconAsset(asset: AppDefV1Asset): Asset | undefined {\n        if (!asset || typeof asset !== 'object') {\n            return undefined;\n        }\n        if (asset.guxIcon && typeof asset.guxIcon.name === 'string') {\n            return {\n                type: 'sparkV3SvgSprite',\n                classNames: [asset.guxIcon.name]\n            };\n        } else if (typeof asset.vector === 'string') {\n            try {\n                return {\n                    type: 'remoteVectorImage',\n                    url: new URL(asset.vector)\n                };\n            } catch (_) {\n                return undefined;\n            }\n        } else if (asset.raster && typeof asset.raster === 'object') {\n            // Look though raster props and validate the url\n            const RASTER_PROP_PATTERN = /^x(\\d+)$/;\n            const rasterEntries = Object.entries(asset.raster)\n                .filter(([currProp]) => RASTER_PROP_PATTERN.test(currProp))\n                .filter((toCheck): toCheck is [string, string] => typeof toCheck[1] === 'string');\n            const images = rasterEntries.reduce<Array<{ width: number; height: number; url: URL }>>(\n                (result, [currRasterProp, currRasterValue]) => {\n                    let url;\n                    try {\n                        url = new URL(currRasterValue);\n                    } catch (_) {\n                        // TODO: Log invalid asset url\n                        return result;\n                    }\n\n                    const match = RASTER_PROP_PATTERN.exec(currRasterProp);\n                    if (!match) {\n                        return result;\n                    }\n\n                    const size = parseInt(match[1], 10);\n                    if (isNaN(size)) {\n                        return result;\n                    }\n\n                    result.push({\n                        width: size,\n                        height: size,\n                        url\n                    });\n\n                    return result;\n                },\n                []\n            );\n\n            if (images.length === 1) {\n                const { url, width, height } = images[0];\n                return {\n                    type: 'remoteRasterImage',\n                    url,\n                    width,\n                    height\n                };\n            }\n\n            if (images.length > 1) {\n                return {\n                    type: 'remoteRasterImageSet',\n                    images\n                };\n            }\n        }\n        return undefined;\n    }\n};\n","export type PromiseResolve<T> = NonNullable<Parameters<Promise<T>['then']>[0]>;\nexport type PromiseReject<T> = NonNullable<Parameters<Promise<T>['catch']>[0]>;\n\nexport type DeferredPromise<T> = {\n    promise: Promise<T>;\n    resolve: PromiseResolve<T>;\n    reject: PromiseReject<T>;\n};\n\nexport const deferPromise = <T>(): DeferredPromise<T> => {\n    let resolve!: PromiseResolve<T>;\n    let reject!: PromiseReject<T>;\n\n    const promise = new Promise<T>((res, rej) => {\n        resolve = res;\n        reject = rej;\n    });\n    return { promise, resolve, reject };\n};\n","import BrowserUtils from 'web-directory/utils/browser';\n\nexport default function (stream, element, options) {\n    const opts = {\n        autoplay: true,\n        mirror: false,\n        muted: false,\n        audio: false,\n        disableContextMenu: false\n    };\n\n    if (options) {\n        Object.keys(options).forEach(key => {\n            opts[key] = options[key];\n        });\n    }\n\n    if (!element) {\n        element = document.createElement(opts.audio ? 'audio' : 'video');\n    } else if (element.tagName.toLowerCase() === 'audio') {\n        opts.audio = true;\n    }\n\n    if (opts.disableContextMenu) {\n        element.oncontextmenu = function (e) {\n            e.preventDefault();\n        };\n    }\n\n    if (opts.autoplay) element.autoplay = 'autoplay';\n    element.muted = !!opts.muted;\n    if (!opts.audio) {\n        ['', 'moz', 'webkit', 'o', 'ms'].forEach(function (prefix) {\n            const styleName = prefix ? prefix + 'Transform' : 'transform';\n            element.style[styleName] = opts.mirror ? 'scaleX(-1)' : 'scaleX(1)';\n        });\n    }\n\n    if (BrowserUtils.isSafari) {\n        element.setAttribute('playsinline', true);\n    }\n\n    element.srcObject = stream;\n    return element;\n}\n","/**\n * Authentication-related constants\n * Extracted for better maintainability and testability\n */\n\nexport const AUTH_CONFIG = {\n    // Application identifiers\n    APP_NAME: 'web-directory',\n\n    // Local development\n    LOCALHOST_HOSTNAME: 'localhost',\n    LOCALHOST_PORT: '4200',\n    LOCALHOST_REGION: 'dev',\n\n    // OAuth paths\n    LOGIN_PATH: '/oauth/authorize',\n    LOGOUT_PATH: '/logout',\n\n    // Cookie and storage keys\n    AUTH_COOKIE_NAME: 'ININ-Auth-Api',\n    REDIRECT_FRAGMENT_KEY: 'genesys-webdir-redirect-fragment',\n    USE_GC_MFE_AUTH_KEY: 'useGCMFEAuth',\n\n    // OAuth parameters\n    OAUTH_STORE_PARAMS: ['access_token', 'token_type', 'expires_in'],\n    OAUTH_STORE_PROPS: [\n        'access_token',\n        'token_type',\n        'expires_in',\n        'token_expiry_time_millis',\n        'token_expiry_time_iso_string'\n    ],\n\n    // Account switcher query params\n    ACCOUNT_SWITCHER_PARAMS: ['auth_as', 'orgName', 'email', 'regionName'],\n\n    // Frame path override params for IFE (iframe embed) clients. These are dynamic\n    // per-client keys of the form `center-stage-<clientId>` (e.g.\n    // `center-stage-knowledgeConfigurationUI`) that point an embedded frame at a\n    // branch/path override. The center-stage-frame service reads them from the URL\n    // search at construction, so they must survive the OAuth redirect. Unlike the\n    // account switcher params they are preserved (re-applied), not stripped.\n    FRAME_PATH_OVERRIDE_PREFIX: 'center-stage-',\n    FRAME_PATH_OVERRIDE_SEARCH_KEY: 'genesys-webdir-frame-path-overrides',\n\n    // Regex patterns\n    TIMEMACHINE_PATH_REGEX: /^\\/directory\\/(.+)\\/index\\.html$/,\n    TIMEMACHINE_FRAGMENT_PREFIX: '#/timemachine/'\n};\n","import { parse } from 'boon-js';\n\nexport function buildSymbolMap(expression, symbolEvaluator) {\n    if (typeof expression !== 'string' || expression === '') {\n        throw new Error('Missing/invalid expression');\n    }\n    if (typeof symbolEvaluator !== 'object' || symbolEvaluator === null || Object.keys(symbolEvaluator).length === 0) {\n        throw new Error('Missing/invalid symbol evaluator');\n    }\n\n    const symbolMap = {};\n\n    const identifiers = parse(expression)\n        .filter(curr => {\n            return curr.name == 'IDENTIFIER';\n        })\n        .map(curr => {\n            return curr.value;\n        });\n\n    if (identifiers.length === 0) {\n        throw new Error('No Identifiers Found');\n    }\n\n    identifiers.forEach(currIdentifier => {\n        const ns = currIdentifier.split(':')[0];\n        let variable = currIdentifier.substring(ns.length + 1);\n        if (!ns || !variable || ns === '' || variable === '') {\n            throw new Error('Invalid identifier');\n        }\n        const nsSymbolEvaluator = symbolEvaluator[ns];\n        if (typeof nsSymbolEvaluator !== 'function') {\n            throw new Error('Missing/Invalid namespace symbol evaluator');\n        }\n        try {\n            symbolMap[`${ns}:${variable}`] = nsSymbolEvaluator(variable);\n        } catch (error) {\n            throw new Error('Namespace symbol evaluator threw');\n        }\n    });\n\n    return symbolMap;\n}\n\nconst expressionBuilder = (operator, conditions) => {\n    return `(${conditions.join(` ${operator} `)})`;\n};\n\nexport const and = function (...conditions) {\n    return expressionBuilder('AND', conditions);\n};\n\nexport const or = function (...conditions) {\n    return expressionBuilder('OR', conditions);\n};\n\nexport const not = condition => `(NOT (${condition}))`;\n\nexport const ft = name => `ft:${name}`;\n\nexport const perm = name => `perm:${name}`;\n\nexport const bool = name => `bool:${name}`;\n\nexport const role = name => `role:${name}`;\n","import browserama from 'browserama';\n\nconst mimeTypes = {\n    mp3: 'audio/mp3',\n    webm: 'audio/webm',\n    wav: 'audio/wav'\n};\n\nconst mimeTypeToFormat = type => {\n    if (typeof type === 'string') {\n        const parts = type.split('/');\n        return parts.length && parts[1] ? parts[1] : type;\n    }\n};\n\nconst formatToAudioMimeType = format => {\n    if (typeof format === 'string') {\n        return `audio/${format}`;\n    }\n};\n\nconst probeAudioTypeCompatibilityFrom = types => {\n    let suggested;\n    let audioElement = document.createElement('audio');\n    if (audioElement && audioElement.canPlayType) {\n        if (types.includes(mimeTypes.mp3) && audioElement.canPlayType(mimeTypes.mp3)) {\n            suggested = mimeTypes.mp3;\n        } else if (\n            types.includes(mimeTypes.webm) &&\n            !browserama.isFirefox &&\n            audioElement.canPlayType(mimeTypes.webm)\n        ) {\n            // Need a browser check here because Firefox 'supports' webm, but\n            // the seeking doesn't work due to missing cues in webm audio spec.\n            // https://bugzilla.mozilla.org/show_bug.cgi?id=657791\n\n            // Chrome and Chromium. Also, IE if the codec is installed\n            suggested = mimeTypes.webm;\n        } else if (types.includes(mimeTypes.wav) && audioElement.canPlayType(mimeTypes.wav)) {\n            // Firefox and Safari\n            suggested = mimeTypes.wav;\n        }\n    }\n    audioElement = null;\n    return suggested;\n};\n\nconst mimeTypeKeys = Object.keys(mimeTypes);\nconst mimeTypeValues = mimeTypeKeys.map(k => mimeTypes[k]);\nlet shouldInstallWebM = false;\nlet suggestedAudioType = probeAudioTypeCompatibilityFrom(mimeTypeValues);\n\nif (!suggestedAudioType) {\n    shouldInstallWebM = true;\n}\n\nexport default Object.assign({}, browserama, {\n    getSuggestedAudioTypeFrom(desiredFormats) {\n        if (Array.isArray(desiredFormats) && desiredFormats.length) {\n            const desiredMimeTypes = desiredFormats.map(format => {\n                if (typeof format === 'string') {\n                    return formatToAudioMimeType(format);\n                } else {\n                    return format;\n                }\n            });\n            const suggestedMimeType = probeAudioTypeCompatibilityFrom(desiredMimeTypes);\n            if (suggestedMimeType) {\n                return mimeTypeToFormat(suggestedMimeType);\n            }\n        }\n    },\n\n    get suggestedAudioType() {\n        return suggestedAudioType;\n    },\n\n    get shouldInstallWebM() {\n        return shouldInstallWebM;\n    }\n});\n","const whitespace = /\\s+/g;\nconst nonAlpha = /[^A-Za-z-]+/g;\n\nexport default {\n    generateClassName(str, prefix = '') {\n        // When receiving a SafeString\n        str = str.toString();\n\n        let classValue = str.replace(whitespace, '-').replace(nonAlpha, '-').toLowerCase();\n\n        return `${prefix}${classValue}`;\n    }\n};\n","// ---- COLLABRATE CHAT FRAME CONSTANTS -----\n\nexport const TOAST_TYPE = Object.freeze({\n    SUCCESS: 'success',\n    ERROR: 'error'\n});\n\nexport const COLLABORATE_CHAT_FRAME_ID = {\n    MAIN: 'collaborate-chat-frame',\n    PHONE: 'collaborate-chat-frame-phone-call'\n};\n\nexport const COLLABORATE_CHAT_EVENTS = {\n    /**\n     * Domain for publish event names\n     */\n    publish: {\n        /**\n         * Publish the sidebar expand state\n         */\n        sidebarExpanded: 'collaborate-chat-sidebar-expanded',\n\n        /**\n         * Publish the chat room change\n         */\n        roomChanged: 'collaborate-chat-host-changed-room',\n\n        toCollabChatCommand: 'webdir-to-collaborate-chat-command',\n\n        /**\n         * Publish to initiate a conference video call\n         */\n        startVideoConference: 'collaborate-chat-host-started-video-conference',\n\n        /**\n         * Publish to indicate that a chat room has started showing video\n         */\n        toggleShowingVideo: 'collaborate-chat-host-toggled-showing-video',\n\n        /**\n         * Publish to indicate the current video participant count\n         */\n        videoParticipantCount: 'webdir-to-collaborate-chat-video-participant-count',\n\n        /**\n         * Publish to indicate that a chat room or a user to user chat has been favourited or unfavourited\n         */\n        favoriteChanged: 'collaborate-chat-host-changed-favorite',\n        /**\n         * Publish to indicate that the desktop app has woken after a period of sleep (user PC went for a sleep and is now back)\n         */\n        desktopWakeUp: 'desktop-wake-up',\n        /**\n         * Publish to indicate that the desktop app is going to asleep\n         */\n        desktopAsleep: 'desktop-asleep',\n        /**\n         * Publish to indicate that a chatRoom has been popped out to a new window\n         */\n        RoomPoppedOut: 'room-popped-out',\n        /**\n         * Publish to indicate the profile image has been updated\n         */\n        profileImage: 'webdir-to-collaborate-chat-profile-image-update',\n        /**\n         * Publish to indicate org setting around free seating for stations\n         */\n        freeSeatPreference: 'webdir-to-collaborate-chat-free-seat-pref',\n        /**\n         * Publish orgPreferences to collaborate chat use for disabling/hiding certain UI\n         */\n        orgPreferences: 'webdir-to-collaborate-chat-org-preferences',\n        /**\n         * Publish to update chat preference\n         */\n        updateChatPreference: 'web-dir-update-preference-setting',\n        /**\n         * Publish to update chat volumes\n         */\n        updateChatVolumes: 'web-dir-update-volume-setting',\n        realtimeConnected: 'realtime-event-connected',\n        realtimeDisconnected: 'realtime-event-disconnected'\n    },\n    /**\n     * Domain for listener event names\n     */\n    listeners: {\n        /**\n         * Listen for the client initialized event.\n         * Used to determine when app is ready.\n         */\n        clientInitialized: 'clientInitialized',\n        /**\n         * Listen for the hide event to hide the chat panel.\n         */\n        hide: 'collaborate-chat-hide',\n        /**\n         * Listen for the toggle sidebar event to toggle the chat side bar.\n         */\n        toggleSidebar: 'collaborate-chat-toggle-sidebar',\n        /**\n         * Listen for the popout event to pop out chat\n         */\n        popout: 'collaborate-chat-popout',\n        /**\n         * Listens for switching of the active chat room\n         */\n        changeRoom: 'collaborate-chat-client-changed-room',\n        /**\n         * Listens for chat room join events from the client\n         */\n        joinRoom: 'collaborate-chat-client-joined-room',\n        /**\n         * listen for events for custom commands that uses 'addCommand'\n         */\n        fromCollabChatCommand: 'collaborate-chat-to-webdir-commands',\n        /**\n         * Listens for requests to open the video pane\n         */\n        openVideoPane: 'collaborate-chat-client-opened-video-pane',\n        /**\n         * listen to this event trigger a toast message\n         */\n        toast: 'collaborate-chat-to-webdir-toast',\n        /**\n         * open preference modal\n         */\n        openPreferenceModal: 'collaborate-chat-to-webdir-open-preference-modal',\n        /**\n         * display error toast when received from collaborate chat\n         */\n        collabChatIntegrationError: 'collaborate-chat-to-webdir-integration-error',\n        /**\n         * Listens for event indicating a conference video call was started\n         */\n        collabChatStartedConference: 'collaborate-chat-started-video-conference',\n        /**\n         * listen to when collab-chat is fully loaded, signaling that the frame is ready for interaction (like selecting rooms and displaying messages)\n         */\n        collabChatPhoneFrameReady: 'collaborate-chat-phone-frame-ready',\n        /**\n         * clear the notification on the chat tab\n         */\n        clearNotificationSidebar: 'collaborate-chat-to-webdir-clear-notification-sidebar',\n\n        /**\n         * listen to event when app is unauthorized\n         */\n        unauthorized: 'collaborate-chat-to-webdir-unauthorized',\n\n        /**\n         * display informational toast about how at-mentioning users works when direct messaging\n         */\n        directMessageAtMention: 'at-mention-in-direct-message',\n\n        /**\n         * Listens for change in favourited value for room and user to user chat\n         */\n        changeFavorite: 'collaborate-chat-client-changed-favorite',\n\n        /***\n         * listens for the event emitted by the main chat window indicating that the video-chat should be closed\n         */\n        closeMainWindowVideo: 'close-main-window-video',\n\n        /**\n         * Listens to when a collaborate chat application has received a new message\n         */\n        collabChatMessageReceived: 'collaborate-chat-realtime-message-received',\n\n        /**\n         * Listens to when a collaborate chat application has updated its display preference\n         */\n        collabChatUpdatePreference: 'collaborate-chat-update-display-preference',\n\n        /**\n         * Listens to when a collaborate chat application has updated the display splat value\n         */\n        collabChatUpdateSplatValue: 'updateChatSplatValue',\n        /**\n         * Listens to when a room's mute status changes\n         */\n        collabChatToggleMute: 'collaborate-chat-toggled-chat-mute',\n        realtimeConnected: 'realtime-event-connected',\n        realtimeDisconnected: 'realtime-event-disconnected'\n    }\n};\n","import { MenuDefinition } from '../components/command-nav/navMenu';\nimport { Maybe } from 'web-directory/types';\n\nexport type MenuMapDefinition = {\n    title: string;\n    link: string | undefined;\n    icon: string | undefined;\n    keywords: string | undefined;\n    parentFolder: string | null;\n    topParentFolder?: string | null;\n    externalLink?: boolean | null;\n};\n\nexport function matchMenuLink(menu: MenuDefinition[], pageHash: string) {\n    let menuMap = createMenuMap(menu);\n    let matchedMenuItem: string = '';\n    menuMap.forEach((menuItem: MenuMapDefinition) => {\n        if (menuItem.link == pageHash) {\n            matchedMenuItem = menuItem.title;\n        }\n    });\n    return matchedMenuItem;\n}\n\nexport function createMenuMap(menu: MenuDefinition[]) {\n    let navMenuMap: MenuMapDefinition[] = [];\n    menu.forEach(menuItem => {\n        if (menuItem.subMenu) {\n            menuItem.subMenu?.forEach(subMenuItem => {\n                if (!subMenuItem.subMenu) {\n                    navMenuMap.push({\n                        title: subMenuItem.title,\n                        parentFolder: menuItem.title,\n                        link: subMenuItem.link,\n                        icon: subMenuItem.icon,\n                        keywords: subMenuItem.keywords,\n                        topParentFolder: null,\n                        externalLink: subMenuItem.externalLink\n                    });\n                } else if (subMenuItem.subMenu) {\n                    subMenuItem.subMenu.forEach(secondarySubMenuItem => {\n                        navMenuMap.push({\n                            title: secondarySubMenuItem.title,\n                            link: secondarySubMenuItem.link,\n                            icon: secondarySubMenuItem.icon,\n                            keywords: secondarySubMenuItem.keywords,\n                            parentFolder: subMenuItem.title,\n                            topParentFolder: menuItem.title,\n                            externalLink: secondarySubMenuItem.externalLink\n                        });\n                    });\n                }\n            });\n        } else if (menuItem.link) {\n            navMenuMap.push({\n                title: menuItem.title,\n                link: menuItem.link,\n                icon: menuItem.icon,\n                keywords: menuItem.keywords,\n                parentFolder: null,\n                topParentFolder: null,\n                externalLink: menuItem.externalLink\n            });\n        }\n    });\n    return navMenuMap;\n}\n\n/**\n * Finds all MenuDefinition entries whose link (or altLink) is contained in the hash.\n * Recurses into subMenus.\n */\nexport function getMatchingLinks(availableMenuItems: MenuDefinition[], hash: string): MenuDefinition[] {\n    const matches: MenuDefinition[] = [];\n\n    for (const menuItem of availableMenuItems) {\n        if (!menuItem.subMenu && menuItem.link && hash.includes(menuItem.link) && !matches.includes(menuItem)) {\n            matches.push(menuItem);\n        }\n        if (!menuItem.subMenu && menuItem.link && menuItem.altLink) {\n            for (const altLink of menuItem.altLink) {\n                if (hash.includes(altLink)) {\n                    matches.push(menuItem);\n                }\n            }\n        } else if (menuItem.subMenu) {\n            matches.push(...getMatchingLinks(menuItem.subMenu, hash));\n        }\n    }\n    return matches;\n}\n\n/**\n * Counts the number of leading path segments that match between two segment arrays.\n */\nexport function countMatchingSegments(segments1: string[], segments2: string[]): number {\n    let matchingSegments = 0;\n    const minLength = Math.min(segments1.length, segments2.length);\n\n    for (let i = 0; i < minLength; i++) {\n        if (segments1[i] === segments2[i]) {\n            matchingSegments++;\n        } else {\n            break;\n        }\n    }\n    return matchingSegments;\n}\n\n/**\n * Finds the link string of the MenuDefinition whose link (or altLink) has the most\n * matching path segments compared to the given hash.\n * Used by command-nav component to resolve the active link.\n */\nexport function findBestMatchingLink(menuItems: MenuDefinition[], hash: string): Maybe<string> {\n    if (!hash || !menuItems || menuItems.length === 0) return null;\n\n    const hashSegments = hash.split('/').filter(segment => segment.length > 0);\n    let bestMatch: Maybe<string> = null;\n    let maxMatchingSegments = 0;\n\n    for (const menuItem of menuItems) {\n        if (menuItem.link) {\n            const linkSegments = menuItem.link.split('/').filter(Boolean);\n            const matching = countMatchingSegments(hashSegments, linkSegments);\n            if (matching > maxMatchingSegments) {\n                maxMatchingSegments = matching;\n                bestMatch = menuItem.link;\n            }\n        }\n        if (menuItem.altLink) {\n            for (const altLink of menuItem.altLink) {\n                const altLinkSegments = altLink.split('/').filter(Boolean);\n                const matching = countMatchingSegments(hashSegments, altLinkSegments);\n                if (matching > maxMatchingSegments) {\n                    maxMatchingSegments = matching;\n                    bestMatch = menuItem.link;\n                }\n            }\n        }\n    }\n    return bestMatch;\n}\n\n/**\n * Same as findBestMatchingLink but returns the full MenuDefinition instead of\n * just the link string. Used by page-title service to access the item's title.\n */\nexport function findBestMatchingMenuItem(menuItems: MenuDefinition[], hash: string): Maybe<MenuDefinition> {\n    if (!hash || !menuItems || menuItems.length === 0) return null;\n\n    const hashSegments = hash.split('/').filter(s => s.length > 0);\n    let bestMatch: Maybe<MenuDefinition> = null;\n    let maxMatchingSegments = 0;\n\n    for (const menuItem of menuItems) {\n        if (menuItem.link) {\n            const linkSegments = menuItem.link.split('/').filter(Boolean);\n            const matching = countMatchingSegments(hashSegments, linkSegments);\n            if (matching > maxMatchingSegments) {\n                maxMatchingSegments = matching;\n                bestMatch = menuItem;\n            }\n        }\n        if (menuItem.altLink) {\n            for (const altLink of menuItem.altLink) {\n                const altSegments = altLink.split('/').filter(Boolean);\n                const matching = countMatchingSegments(hashSegments, altSegments);\n                if (matching > maxMatchingSegments) {\n                    maxMatchingSegments = matching;\n                    bestMatch = menuItem;\n                }\n            }\n        }\n    }\n    return bestMatch;\n}\n","export const CONVERSATION_STATES = {\n    ALERTING: 'alerting',\n    CONNECTED: 'connected',\n    CONNECTING: 'connecting',\n    DIALING: 'dialing',\n    DISCONNECTED: 'disconnected',\n    TERMINATED: 'terminated'\n};\n","export function isGuid(id: string): boolean {\n    if (!id) return false;\n    return !!id.match(/^[a-z0-9-]{36}$/i);\n}\n\n/**\n * Get userId\n * @param user participant.\n * @returns {string or undefined} the userId\n */\nexport const userGuidFromParticipant = (user: any) => {\n    if (!user) {\n        return;\n    }\n\n    const { userId, userUri } = user;\n\n    if (userId) {\n        return userId;\n    }\n    if (userUri) {\n        return userUri.substring(userUri.lastIndexOf('/') + 1);\n    }\n};\n","import { Intl as SparkIntl } from 'genesys-spark';\n\n/**\n * Formats an ISO timestamp into a regional date and time string\n * @param {string} timestamp - ISO 8601 format (i.e., \"2025-08-18T16:00:00.000Z\")\n * @returns {string} formatted date-time string\n * @example\n * returns \"August 18, 2025 12:00 PM\" in en-US\n * returns \"18 August 2025 17:00\" in en-GB\n */\nexport const formatTimestampForDisplay = (timestamp: string) => {\n    const dateTime = new Date(timestamp);\n\n    const displayedDate = SparkIntl.dateTimeFormat({\n        dateStyle: 'long'\n    }).format(dateTime);\n\n    const displayedTime = SparkIntl.dateTimeFormat({\n        timeStyle: 'short'\n    }).format(dateTime);\n\n    return `${displayedDate} ${displayedTime}`;\n};\n\ntype DateTimeStyle = 'medium' | 'short' | 'full' | 'long' | undefined;\n\n/**\n * Formats a date string for display\n * @param {string} dateString - ISO date string\n * @param {string} dateStyle - 'short', 'medium', 'long', or 'full'\n * @returns {string} formatted date string\n */\nexport const formatDateForDisplay = (dateString: string, dateStyle: DateTimeStyle = 'medium') => {\n    return SparkIntl.dateTimeFormat({ dateStyle }).format(new Date(dateString));\n};\n\n/**\n * Formats a time string for display\n * @param {string} dateString - ISO date string\n * @param {string} timeStyle - 'short', 'medium', 'long', or 'full'\n * @returns {string} formatted time string\n */\nexport const formatTimeForDisplay = (dateString: string, timeStyle: DateTimeStyle = 'short') => {\n    return SparkIntl.dateTimeFormat({ timeStyle }).format(new Date(dateString));\n};\n","import moment from 'moment';\n\nfunction _decideFormat(date, today) {\n    if (today.isSame(date, 'day')) {\n        return 'LT'; // 1:32pm\n    } else if (today.isSame(date, 'week')) {\n        return 'ddd LT'; // Thu 11:07 AM\n    } else {\n        return 'lll'; // Jan 22, 2015 11:06 AM\n    }\n}\n\nfunction displayDateRelativeToToday(rawDate, locale) {\n    let date = moment(rawDate);\n    let today = moment();\n    let formatString = _decideFormat(date, today);\n    return date.locale(locale).format(formatString);\n}\n\nfunction generateCurrentInterval() {\n    let start = moment();\n    let end = moment();\n\n    if (start.minutes() < 30) {\n        start.startOf('hour');\n        end = moment(start).minutes(30).startOf('minute');\n    } else {\n        start.minutes(30).startOf('minute');\n        end = moment(start).add(1, 'hours').startOf('hour');\n    }\n    return start.toISOString() + '/' + end.toISOString();\n}\n\nfunction splitIntervalString(intervalStr) {\n    if (typeof intervalStr === 'string') {\n        return intervalStr.split('/');\n    }\n    return null;\n}\n\nfunction timeInMillis(dateString) {\n    return moment(dateString).valueOf();\n}\n\n// Save the current moment locale because defineLocale and updateLocale change the active locale for some reason\nconst currentLocale = moment.locale();\n\n// Moment does not support 'no' (Norwegian) directly, so add it as an alias for 'nb' (Norwegian Bokmal) which is supported\nmoment.defineLocale('no', { parentLocale: 'nb' });\n\n// Behavior changes requested by our localization team\nmoment.updateLocale('ko', {\n    longDateFormat: {\n        LT: 'HH:mm',\n        LTS: 'HH:mm:ss',\n        L: 'YYYY-MM-DD',\n        LLL: 'YYYY년 MMMM D일 HH:mm',\n        LLLL: 'YYYY년 MMMM D일 dddd HH:mm',\n        lll: 'YYYY년 MMMM D일 HH:mm',\n        llll: 'YYYY년 MMMM D일 dddd HH:mm'\n    }\n});\n\nmoment.updateLocale('ja', {\n    months: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']\n});\n\nmoment.updateLocale('zh-cn', {\n    months: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']\n});\n\nmoment.updateLocale('zh-tw', {\n    months: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n    longDateFormat: {\n        L: 'YYYY-MM-DD'\n    }\n});\n\nmoment.updateLocale('pl', {\n    months: [\n        'styczeń',\n        'luty',\n        'marzec',\n        'kwiecień',\n        'maj',\n        'czerwiec',\n        'lipiec',\n        'sierpień',\n        'wrzesień',\n        'październik',\n        'listopad',\n        'grudzień'\n    ]\n});\n\nmoment.locale(currentLocale);\n\nexport default moment;\n\nexport { displayDateRelativeToToday, generateCurrentInterval, splitIntervalString, timeInMillis };\n","/* eslint no-console: \"off\" */\nimport { get } from '@ember/object';\n\nimport { run } from '@ember/runloop';\n\nlet _backburnerDebugTimeoutFn = run.backburner._setTimeout;\n\nfunction secondsFromNow(timeMillis) {\n    return (timeMillis - new Date().getTime()) / 1000;\n}\n\nfunction debugBackburner(config) {\n    if (config && get(config, 'backburnerDebug.showStacks')) {\n        console.log('showing backburner stacks');\n        run.backburner._setTimeout = function (fn, executeAt) {\n            let secondsToPop = secondsFromNow(executeAt);\n            if (secondsToPop > config.backburnerDebug.showTimersSecs) {\n                console.log(`Backburner Executing Timer ${secondsToPop} seconds from now at ${executeAt}`);\n                console.trace();\n            }\n            return _backburnerDebugTimeoutFn.apply(run.backburner, arguments);\n        };\n    }\n    return true;\n}\n\nfunction disableBackburnerDebugging() {\n    run.backburner._setTimeout = _backburnerDebugTimeoutFn;\n    return true;\n}\n\n/**\n * Backburner stores pending timers in one flat array with a stride of 6:\n *\n *     [executeAt, id, target, method, args, stack, executeAt, id, ...]\n *\n * (see TIMERS_OFFSET in ember-source's vendored backburner). This previously walked the array with a\n * stride of 2, which happened to land on real `executeAt` values only by accident and could never\n * report the callback.\n */\nconst TIMERS_OFFSET = 6;\n\nfunction describeTimerCallback(target, method) {\n    let methodName = '<unknown>';\n    if (typeof method === 'function') {\n        methodName = method.name || method.toString().replace(/\\s+/g, ' ').trim().slice(0, 120);\n    } else if (typeof method === 'string') {\n        methodName = method;\n    }\n\n    let targetName = '';\n    try {\n        targetName = target ? String(target).slice(0, 80) : '';\n    } catch (e) {\n        targetName = '<unstringifiable target>';\n    }\n\n    return targetName ? `${targetName}#${methodName}` : methodName;\n}\n\nfunction logTimerQueue() {\n    const raw = run.backburner._timers || [];\n    const timesList = [];\n\n    for (let i = 0; i < raw.length; i += TIMERS_OFFSET) {\n        const executeAt = raw[i];\n        if (typeof executeAt !== 'number' || secondsFromNow(executeAt) <= 0) {\n            continue;\n        }\n        timesList.push({\n            secondsToPop: secondsFromNow(executeAt),\n            timestamp: executeAt,\n            callback: describeTimerCallback(raw[i + 2], raw[i + 3])\n        });\n    }\n\n    if (console.table && timesList.length > 0) {\n        console.table(timesList);\n    }\n}\n\nexport { debugBackburner, disableBackburnerDebugging, logTimerQueue };\n","import { get } from '@ember/object';\nimport RSVP from 'rsvp';\n\nlet promiseMap = {};\n\nfunction debugRsvpCreate(config) {\n    if (config && get(config, 'rsvpDebug.showStacks')) {\n        RSVP.configure('instrument-with-stack', true);\n        RSVP.on('created', event => {\n            // eslint-disable-next-line no-console\n            console.log('debug-rsvp: created promise', event.id, event.stack);\n        });\n    }\n}\nfunction debugRsvp(config) {\n    if (config && get(config, 'rsvpDebug.enabled')) {\n        RSVP.configure('instrument', true);\n        RSVP.configure('instrument-with-stack', true);\n\n        RSVP.on('created', event => {\n            let id = event.id;\n            promiseMap[id] = event;\n        });\n        RSVP.on('rejected', event => {\n            let id = event.id;\n            delete promiseMap[id];\n        });\n        RSVP.on('fulfilled', event => {\n            let id = event.id;\n            delete promiseMap[id];\n        });\n    }\n}\n\nfunction lookupPromiseStack(id) {\n    let event = promiseMap[id];\n    if (event) {\n        // eslint-disable-next-line no-console\n        console.log(event.stack);\n    } else {\n        // eslint-disable-next-line no-console\n        console.log('promise gone');\n    }\n}\n\nfunction logPendingPromises() {\n    let promiseList = Object.values(promiseMap).map(event => {\n        return {\n            id: event.id,\n            timeStamp: event.timeStamp\n        };\n    });\n    // eslint-disable-next-line no-console\n    if (console.table && promiseList.length > 0) {\n        // eslint-disable-next-line no-console\n        console.log('debug-rsvp:');\n        // eslint-disable-next-line no-console\n        console.table(promiseList);\n    }\n}\n\nexport { debugRsvp, debugRsvpCreate, logPendingPromises, lookupPromiseStack };\n","import { get } from '@ember/object';\n\nlet displayGeolocation = function (entity) {\n    if (get(entity, 'geolocation')) {\n        const city = get(entity, 'geolocation.city');\n        const region = get(entity, 'geolocation.region');\n        const country = get(entity, 'geolocation.country');\n        if (city && country) {\n            return `${city}, ${country}`;\n        } else if (city && region && city !== region) {\n            return `${city}, ${region}`;\n        } else if (city && region) {\n            return city;\n        } else if (region && country) {\n            return `${region}, ${country}`;\n        } else if (city) {\n            return city;\n        } else if (country) {\n            return country;\n        } else {\n            return region;\n        }\n    } else {\n        return '';\n    }\n};\n\nconst USA = 'United States';\n\nexport default function displayRelativeGeolocation(entity, sourceEntity) {\n    if (sourceEntity && get(sourceEntity, 'geolocation') && get(entity, 'geolocation')) {\n        let sourceCountry = get(sourceEntity, 'geolocation.country');\n        const city = get(entity, 'geolocation.city');\n        const region = get(entity, 'geolocation.region');\n        const country = get(entity, 'geolocation.country');\n        if (sourceCountry === country && city && region && city !== region) {\n            return `${city}, ${region}`;\n        } else if (sourceCountry === country && city && region && city === region) {\n            return `${city}`;\n        } else if (country === USA && city && country && region) {\n            return `${city}, ${region}, ${country}`;\n        }\n    }\n    return displayGeolocation(entity);\n}\n","/**\n * Crude object copy since our old version of chromium\n * doesn't support `structuredClone`.\n */\nexport function duplicateObject<T>(obj: T): T {\n    return JSON.parse(JSON.stringify(obj));\n}\n","/* eslint no-useless-escape: off */\n\nexport function isValidEmailAddress(emailStr, supportSingleDomain = false) {\n    const defaultEmailRe =\n        /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n    const singleDomainSupportRe =\n        /^(([^<>()\\[\\]\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\.,;:\\s@\"]+)*)|(\".+\"))@(([^<>()[\\]\\.,;:\\s@\"]+\\.)+[^<>()[\\]\\.,;:\\s@\"]{1,})$/;\n    const emailRe = supportSingleDomain ? singleDomainSupportRe : defaultEmailRe;\n    const emailAddresses = splitOnSpacesOrComma(emailStr);\n    if (emailAddresses.length === 0) {\n        return false;\n    }\n    return emailAddresses.every(emailAddress => {\n        return emailRe.test(emailAddress);\n    });\n}\n\nexport function splitOnSpacesOrComma(emails) {\n    if (!emails) {\n        return [];\n    }\n\n    const emailsRe = /[ ,]+/;\n    return emails.split(emailsRe).filter(str => {\n        return str.length !== 0;\n    });\n}\n","const API_ERROR_MESSAGES = {\n    userNotAssignedNumber: 'USER_NOT_ASSIGNED_TO_NUMBER',\n    e911Support: 'NUMBER_DOES_NOT_SUPPORT_ENHANCED_911',\n    invalidCity: 'INVALID_CITY',\n    notValidNumber: 'PHONE_NUMBER_NOT_US_OR_CA'\n};\n\nconst getErrorString = function (err, defaultMessage) {\n    let errorMessage = defaultMessage || 'emergencyLocation.errors.e911LocationSet';\n\n    if (err.payload && err.payload.message) {\n        const messageType = err.payload.message;\n        switch (messageType) {\n            case API_ERROR_MESSAGES.userNotAssignedNumber:\n                errorMessage = 'emergencyLocation.errors.userNotAssignedNum';\n                break;\n            case API_ERROR_MESSAGES.e911Support:\n                errorMessage = 'emergencyLocation.errors.e911NotEligible';\n                break;\n            case API_ERROR_MESSAGES.invalidCity:\n                errorMessage = 'emergencyLocation.errors.invalidAddressProvided';\n                break;\n            case API_ERROR_MESSAGES.notValidNumber:\n                errorMessage = 'emergencyLocation.errors.e911NotEligible';\n                break;\n        }\n    }\n    return errorMessage;\n};\n\nexport default {\n    getErrorString\n};\n","import emojify from 'emojify.js';\nimport emoji from 'node-emoji';\n\nexport function initializeEmojiRendering(urlPrefix) {\n    emojify.setConfig({\n        tag_type: null,\n        only_crawl_id: null,\n        img_dir: urlPrefix + 'assets/images/emoji',\n        blacklist: {\n            elements: ['script', 'textarea', 'a', 'code'],\n            classes: ['no-emojify']\n        }\n    });\n}\n\nexport function emojifyDom(element) {\n    emojify.run(element);\n}\n\nexport function emojifyDomUnicode(element) {\n    emojify.run(element, function (emoji) {\n        emoji = emojifyStringUnicode(emoji);\n        const span = document.createElement('span');\n        span.innerHTML = emoji;\n        return span;\n    });\n}\n\nexport function emojifyString(htmlString) {\n    return emojify.replace(htmlString);\n}\n\nexport function emojifyStringUnicode(htmlString) {\n    return emoji.emojify(htmlString);\n}\n\nexport function emojifyMarkdown(markdown) {\n    const el = document.createElement('span');\n    el.innerHTML = markdown;\n    emojifyDom(el);\n    return el.innerHTML;\n}\n\nexport function getEmojiNames() {\n    return emojify.emojiNames;\n}\n\nexport function getEmojiNamesUnicode() {\n    let namedEmojiString =\n        // This is the list of emoji suggestions that show up in the lookahead.\n        // List is from https://github.com/joypixels/emojify.js/blob/master/dist/js/emojify.js\n        // This is the list that was used previously with the image emoji lookahead, but 'inappropriate' emoji have been removed.\n        // Other emoji like \"poop\" can still be sent when the shortcode is entered, but are not shown as a suggestion on the lookahead.\n        '+1,-1,100,1234,8ball,a,ab,abc,abcd,accept,aerial_tramway,airplane,alarm_clock,alien,ambulance,anchor,angel,anger,angry,anguished,ant,apple,aquarius,aries,arrow_backward,arrow_double_down,arrow_double_up,arrow_down,arrow_down_small,arrow_forward,arrow_heading_down,arrow_heading_up,arrow_left,arrow_lower_left,arrow_lower_right,arrow_right,arrow_right_hook,arrow_up,arrow_up_down,arrow_up_small,arrow_upper_left,arrow_upper_right,arrows_clockwise,arrows_counterclockwise,art,articulated_lorry,astonished,atm,b,baby,baby_bottle,baby_chick,baby_symbol,back,baggage_claim,balloon,ballot_box_with_check,bamboo,banana,bangbang,bank,bar_chart,barber,baseball,basketball,bath,bathtub,battery,bear,bee,beer,beers,beetle,beginner,bell,bento,bicyclist,bike,bikini,bird,birthday,black_circle,black_joker,black_medium_small_square,black_medium_square,black_nib,black_small_square,blossom,blowfish,blue_book,blue_car,blue_heart,blush,boar,boat,book,bookmark,bookmark_tabs,books,boom,boot,bouquet,bow,bowling,boy,bread,bride_with_veil,bridge_at_night,briefcase,broken_heart,bug,bulb,bullettrain_front,bullettrain_side,bus,busstop,bust_in_silhouette,busts_in_silhouette,cactus,cake,calendar,calling,camel,camera,cancer,candy,capital_abcd,capricorn,car,card_index,carousel_horse,cat,cat2,cd,chart,chart_with_downwards_trend,chart_with_upwards_trend,checkered_flag,cherries,cherry_blossom,chestnut,chicken,children_crossing,chocolate_bar,christmas_tree,church,cinema,circus_tent,city_sunrise,city_sunset,cl,clap,clapper,clipboard,clock1,clock10,clock1030,clock11,clock1130,clock12,clock1230,clock130,clock2,clock230,clock3,clock330,clock4,clock430,clock5,clock530,clock6,clock630,clock7,clock730,clock8,clock830,clock9,clock930,closed_book,closed_lock_with_key,closed_umbrella,cloud,clubs,cn,cocktail,coffee,cold_sweat,collision,computer,confetti_ball,confounded,confused,congratulations,construction,construction_worker,convenience_store,cookie,cool,cop,copyright,corn,cow,cow2,credit_card,crescent_moon,crocodile,crossed_flags,crown,cry,crying_cat_face,crystal_ball,cupid,curly_loop,currency_exchange,curry,custard,customs,cyclone,dancer,dancers,dango,dart,dash,date,de,deciduous_tree,department_store,diamond_shape_with_a_dot_inside,diamonds,disappointed,disappointed_relieved,dizzy,dizzy_face,do_not_litter,dog,dog2,dollar,dolls,dolphin,door,doughnut,dragon,dragon_face,dress,dromedary_camel,droplet,dvd,e-mail,ear,ear_of_rice,earth_africa,earth_americas,earth_asia,egg,eggplant,eight,eight_pointed_black_star,eight_spoked_asterisk,electric_plug,elephant,email,end,envelope,es,euro,european_castle,european_post_office,evergreen_tree,exclamation,expressionless,eyeglasses,eyes,facepunch,factory,fallen_leaf,family,fast_forward,fax,fearful,feet,ferris_wheel,file_folder,fire,fire_engine,fireworks,first_quarter_moon,first_quarter_moon_with_face,fish,fish_cake,fishing_pole_and_fish,fist,five,flags,flashlight,floppy_disk,flower_playing_cards,flushed,foggy,football,fork_and_knife,fountain,four,four_leaf_clover,fr,free,fried_shrimp,fries,frog,frowning,fuelpump,full_moon,full_moon_with_face,game_die,gb,gem,gemini,ghost,gift,gift_heart,girl,globe_with_meridians,goat,golf,grapes,green_apple,green_book,green_heart,grey_exclamation,grey_question,grimacing,grin,grinning,guardsman,guitar,haircut,hamburger,hammer,hamster,hand,handbag,hash,hatched_chick,hatching_chick,headphones,hear_no_evil,heart,heart_decoration,heart_eyes,heart_eyes_cat,heartbeat,heartpulse,hearts,heavy_check_mark,heavy_division_sign,heavy_dollar_sign,heavy_exclamation_mark,heavy_minus_sign,heavy_multiplication_x,heavy_plus_sign,helicopter,herb,hibiscus,high_brightness,high_heel,honey_pot,honeybee,horse,horse_racing,hospital,hotel,hotsprings,hourglass,hourglass_flowing_sand,house,house_with_garden,hushed,ice_cream,icecream,id,ideograph_advantage,imp,inbox_tray,incoming_envelope,information_desk_person,information_source,innocent,interrobang,iphone,it,izakaya_lantern,jack_o_lantern,japan,japanese_castle,japanese_goblin,japanese_ogre,jeans,joy,joy_cat,jp,key,keycap_ten,kimono,kiss,kissing,kissing_cat,kissing_closed_eyes,kissing_heart,kissing_smiling_eyes,koala,koko,kr,large_blue_circle,large_blue_diamond,large_orange_diamond,last_quarter_moon,last_quarter_moon_with_face,laughing,leaves,ledger,left_luggage,left_right_arrow,leftwards_arrow_with_hook,lemon,leo,leopard,libra,light_rail,link,lips,lipstick,lock,lock_with_ink_pen,lollipop,loop,loudspeaker,love_hotel,love_letter,low_brightness,m,mag,mag_right,mahjong,mailbox,mailbox_closed,mailbox_with_mail,mailbox_with_no_mail,man,man_with_gua_pi_mao,man_with_turban,mans_shoe,maple_leaf,mask,massage,meat_on_bone,mega,melon,memo,mens,metro,microphone,microscope,milky_way,minibus,minidisc,mobile_phone_off,money_with_wings,moneybag,monkey,monkey_face,monorail,mortar_board,mount_fuji,mountain_bicyclist,mountain_cableway,mountain_railway,mouse,mouse2,movie_camera,moyai,muscle,mushroom,musical_keyboard,musical_note,musical_score,mute,nail_care,name_badge,necktie,negative_squared_cross_mark,neutral_face,new,new_moon,new_moon_with_face,newspaper,ng,nine,no_bell,no_bicycles,no_entry,no_entry_sign,no_good,no_mobile_phones,no_mouth,no_pedestrians,no_smoking,non-potable_water,nose,notebook,notebook_with_decorative_cover,notes,nut_and_bolt,o,o2,ocean,octopus,oden,office,ok,ok_hand,ok_woman,older_man,older_woman,on,oncoming_automobile,oncoming_bus,oncoming_police_car,oncoming_taxi,one,open_file_folder,open_hands,open_mouth,ophiuchus,orange_book,outbox_tray,ox,package,page_facing_up,page_with_curl,pager,palm_tree,panda_face,paperclip,parking,part_alternation_mark,partly_sunny,passport_control,paw_prints,peach,pear,pencil,pencil2,penguin,pensive,performing_arts,persevere,person_frowning,person_with_blond_hair,person_with_pouting_face,phone,pig,pig2,pig_nose,pill,pineapple,pisces,pizza,point_down,point_left,point_right,point_up,point_up_2,police_car,poodle,post_office,postal_horn,postbox,potable_water,pouch,poultry_leg,pound,pouting_cat,pray,princess,punch,purple_heart,purse,pushpin,put_litter_in_its_place,question,rabbit,rabbit2,racehorse,radio,radio_button,railway_car,rainbow,raised_hand,raised_hands,raising_hand,ram,ramen,rat,recycle,red_car,red_circle,registered,relaxed,relieved,repeat,repeat_one,restroom,revolving_hearts,rewind,ribbon,rice,rice_ball,rice_cracker,rice_scene,ring,rocket,roller_coaster,rooster,rose,rotating_light,round_pushpin,rowboat,ru,rugby_football,runner,running,running_shirt_with_sash,sa,sagittarius,sailboat,sake,sandal,santa,satellite,satisfied,saxophone,school,school_satchel,scissors,scorpius,scream,scream_cat,scroll,seat,secret,see_no_evil,seedling,seven,shaved_ice,sheep,shell,ship,shirt,shoe,shower,signal_strength,six,six_pointed_star,ski,skull,sleeping,sleepy,slot_machine,small_blue_diamond,small_orange_diamond,small_red_triangle,small_red_triangle_down,smile,smile_cat,smiley,smiley_cat,smiling_imp,smirk,smirk_cat,smoking,snail,snake,snowboarder,snowflake,snowman,sob,soccer,soon,sos,sound,space_invader,spades,spaghetti,sparkle,sparkler,sparkles,sparkling_heart,speak_no_evil,speaker,speech_balloon,speedboat,star,star2,stars,station,statue_of_liberty,steam_locomotive,stew,straight_ruler,strawberry,stuck_out_tongue,stuck_out_tongue_closed_eyes,stuck_out_tongue_winking_eye,sun_with_face,sunflower,sunglasses,sunny,sunrise,sunrise_over_mountains,surfer,sushi,suspension_railway,sweat,sweat_drops,sweat_smile,sweet_potato,swimmer,symbols,tada,tanabata_tree,tangerine,taurus,taxi,tea,telephone,telephone_receiver,telescope,tennis,tent,thought_balloon,three,thumbsdown,thumbsup,ticket,tiger,tiger2,tired_face,tm,toilet,tokyo_tower,tomato,tongue,top,tophat,tractor,traffic_light,train,train2,tram,triangular_flag_on_post,triangular_ruler,trident,triumph,trolleybus,trophy,tropical_drink,tropical_fish,truck,trumpet,tshirt,tulip,turtle,tv,twisted_rightwards_arrows,two,two_hearts,two_men_holding_hands,two_women_holding_hands,u5272,u5408,u55b6,u6307,u6708,u6709,u6e80,u7121,u7533,u7981,u7a7a,uk,umbrella,unamused,underage,unlock,up,us,v,vertical_traffic_light,vhs,vibration_mode,video_camera,video_game,violin,virgo,volcano,vs,walking,waning_crescent_moon,waning_gibbous_moon,warning,watch,water_buffalo,watermelon,wave,wavy_dash,waxing_crescent_moon,waxing_gibbous_moon,wc,weary,wedding,whale,whale2,wheelchair,white_check_mark,white_circle,white_flower,wind_chime,wine_glass,wink,wolf,woman,womans_clothes,womans_hat,womens,worried,wrench,x,yellow_heart,yen,yum,zap,zero,zzz';\n    let namedEmoji = namedEmojiString.split(/,/);\n    return namedEmoji;\n}\n","import _ from 'lodash';\n\nimport { BASE_GROUP_FIELDS, BASE_GROUP } from '../models/group';\nimport { BASE_LOCATION_FIELDS, BASE_LOCATION } from '../models/location';\nimport { BASE_PERSON_FIELDS, BASE_PERSON } from '../models/person';\n\nexport const MULTI_ENTITY_FIELDS = _.uniq(\n    [].concat(BASE_GROUP_FIELDS).concat(BASE_LOCATION_FIELDS).concat(BASE_PERSON_FIELDS)\n);\n\nexport const FL = {\n    all: {\n        fl: MULTI_ENTITY_FIELDS.join(',')\n    },\n    group: {\n        fl: BASE_GROUP\n    },\n    person: BASE_PERSON,\n    location: BASE_LOCATION\n};\n","export default ['error.ininedgecontrol.sesion.inactive'];\n","import { isHTMLSafe } from '@ember/template';\nimport Ember from 'ember';\n\nconst HTMLChars = [\n    {\n        char: '&',\n        escaped: '&amp;'\n    },\n    {\n        char: '<',\n        escaped: '&lt;'\n    },\n    {\n        char: '>',\n        escaped: '&gt;'\n    },\n    {\n        char: '\"',\n        escaped: '&quot;'\n    },\n    {\n        char: \"'\",\n        escaped: '&apos;'\n    }\n];\n\nfunction regExpEscape(literal_string) {\n    return literal_string.replace(/[-[\\]{}()*+!<=:?.\\/\\\\^$|#\\s,]/g, '\\\\$&');\n}\n\nexport default function escape(obj) {\n    if (obj === null || typeof obj === 'function') {\n        return null;\n    }\n    if (typeof obj === 'string') {\n        const escapedString = Ember.Handlebars.Utils.escapeExpression(obj);\n        // [RELATE-2592] allow single quotes to make it through the escape pass\n        return escapedString.replace(/&#x27;/g, `'`);\n    }\n    if (typeof obj !== 'object') {\n        return obj;\n    }\n    const clone = JSON.parse(JSON.stringify(obj));\n    Object.keys(clone).forEach(k => {\n        clone[k] = escape(clone[k]);\n    });\n    // maintain keys with value of undefined (these get lost in the clone)\n    Object.keys(obj).forEach(k => {\n        // fixup SafeString items that looked like objects\n        if (isHTMLSafe(obj[k])) {\n            clone[k] = obj[k].toString();\n        }\n        if (Object.prototype.hasOwnProperty.call(obj, k) && typeof obj[k] === 'undefined') {\n            clone[k] = undefined;\n        }\n    });\n    return clone;\n}\n\nexport function unescape(obj) {\n    if (typeof obj === 'string') {\n        let theString = obj;\n        HTMLChars.forEach(char => {\n            // replaceAll isn't available until Chrome 85, so unit tests failed\n            // This regex method works, just not as clean\n            theString = theString.replace(new RegExp(regExpEscape(char.escaped), 'g'), char.char);\n        });\n\n        return theString;\n    } else {\n        return obj;\n    }\n}\n","class ExponentialIntervalGenerator {\n    constructor(maxInterval, baselineInterval = 0) {\n        this._failures = 0;\n        this._baselineInterval = baselineInterval;\n        this._maxAdditionalInterval = maxInterval - baselineInterval;\n    }\n\n    fail() {\n        this._failures++;\n    }\n\n    reset() {\n        this._failures = 0;\n    }\n\n    getInterval() {\n        /*\n         The max interval is determined by the following equation:\n\n         2^k - 1\n\n         We then multiple it by 1000 to convert it to milliseconds.\n         */\n        var expInterval = (Math.pow(2, this._failures) - 1) * 1000;\n        var generatedMaxInterval = Math.min(expInterval, this._maxAdditionalInterval);\n\n        // Get a random interval amount so that we don't flood the server with reconnect\n        // requests from every single user at the same time.\n        var interval = this._baselineInterval + Math.random() * generatedMaxInterval;\n        return interval;\n    }\n}\n\nexport default ExponentialIntervalGenerator;\n","import { run, join } from '@ember/runloop';\nimport { messagingChannelTypes, getDisplayOrScreenName, messagingChannelTypeFor } from './message-channels';\nimport { CHANNEL_MODEL_TYPE } from 'web-directory/services/relate';\n\nexport const I18N_INFO = {\n    updateChannelInfoPrompt: 'purecloud.acdInteraction.relate.displayProfile.updateChannelInfoPrompt',\n    updateChannelInfoPromptPlural: 'purecloud.acdInteraction.relate.displayProfile.updateChannelInfoPromptPlural',\n    updateAllChannelInfoPrompt: 'purecloud.acdInteraction.relate.displayProfile.updateAllChannelInfoPrompt',\n    newChannelPrompt: 'purecloud.acdInteraction.relate.displayProfile.newChannelPrompt',\n    pleaseWaitForFullContactInfo: 'purecloud.acdInteraction.relate.displayProfile.pleaseWaitForFullContactInfo',\n    propertyChanged: 'purecloud.acdInteraction.relate.channelTypes'\n};\n\nexport const ID = 'id';\nexport const IDS = 'ids';\nexport const USER_ID = 'userId';\nconst CHANNEL_ID_PROPERTY = 'channelIdProperty';\nconst CHANNEL_TYPE = 'type';\nconst IS_NEW_CHANNEL = 'isNewChannel';\nconst AGENT_RESPONDED_TO_PROMPT = 'agentRespondedToPrompt';\nconst CHANGES_IGNORED_BY_AGENT = 'changesIgnoredByAgent';\n\nexport const CHANNEL_RECORD_PROPERTIES = [\n    CHANNEL_TYPE,\n    CHANNEL_ID_PROPERTY,\n    IS_NEW_CHANNEL,\n    CHANGES_IGNORED_BY_AGENT,\n    AGENT_RESPONDED_TO_PROMPT,\n    USER_ID,\n    IDS,\n    ID\n];\n\n// Refer to the message-interaction.js MESSENGER_TYPE const for these values.  Could use DRYing\nexport const KNOWN_INBOUND_MESSAGE_SUBTYPES = [\n    ...messagingChannelTypes.map(messagingChannelType => messagingChannelType.type)\n];\n\n/**\n * Used to return the \"class\" of an Ember component `call`ing this function; e.g.\n * `componentClassName.call(this)`\n *\n * Used primarily to include a query parameter in a REST endpoint call to identify a component responsible for making the call.\n */\nexport function componentClassName() {\n    try {\n        return encodeURIComponent(this.toString());\n    } catch (e) {\n        return 'COMPONENT_UNKNOWN';\n    }\n}\n\nexport function isInboundMessageType(interaction) {\n    return interaction && KNOWN_INBOUND_MESSAGE_SUBTYPES.includes(getMessengerType(interaction));\n}\n\nexport function getMessengerType(interaction) {\n    return interaction && interaction.get('subMessageType');\n}\n\nexport function getIdentifier(interaction) {\n    if (!interaction) {\n        return null;\n    }\n\n    const messagingChannelType = messagingChannelTypeFor(getMessengerType(interaction));\n    return messagingChannelType && messagingChannelType.getReverseWhitepagesLookupValue(interaction);\n}\n\nexport function getDisplayableName(interaction) {\n    return interaction && interaction.get('participantForCustomer.messages.firstObject.fromAddress.addressDisplayable');\n}\n\nexport function isNewId(id, messengerType, externalContact) {\n    if (!externalContact) {\n        return true; // If the caller supplies no externalContact instance, then consider the id as being new\n    }\n    const messagingChannelType = messagingChannelTypes.find(mct => {\n        return mct.type === messengerType;\n    });\n    if (!messagingChannelType) {\n        return false; // An unrecognized messenger type, so can't determine if the ID is new or not, so return\n    }\n\n    return messagingChannelType.isNewId(messagingChannelType.getIdsFromExternalContact(externalContact), id);\n}\n\nexport function getMessageChannelType(messengerType) {\n    return messagingChannelTypes.find(messagingChannelType => {\n        return messagingChannelType.type === messengerType;\n    });\n}\n\n// Returns an external contact channel object that's specific to the interaction's `subMessageType` type,\n// populated with properties mapping to Relate's Java message channel type models (e.g. FacebookId, LineId, TwitterId, and WhatsappId).\nexport function getInteractionChannel(interaction, logger = null) {\n    if (!interaction) {\n        return null;\n    }\n    const interactionId = interaction.get('id');\n    const interactionType = interaction.get('type');\n    const messengerType = getMessengerType(interaction);\n    const messagingChannelType = messagingChannelTypeFor(messengerType);\n\n    if (!messagingChannelType) {\n        if (logger) {\n            logger.error(\n                `ACD Relate: Could not determine the messenger channel type for interaction id \"${interactionId}\" where messenger type is \"${messengerType}\" and the interaction type is \"${interactionType}\"`\n            );\n        }\n        return null;\n    }\n    const id = getIdentifier(interaction);\n    const displayOrScreenName = getDisplayOrScreenName(interaction);\n    const handle = getDisplayableName(interaction); // Returns undefined if not a Twitter interaction and that's OK because the other modelProperties functions will just ognore it\n\n    return messagingChannelType.modelProperties(id, displayOrScreenName, handle);\n}\n\nexport function notExcluded(key) {\n    return !CHANNEL_RECORD_PROPERTIES.includes(key);\n}\n\n/**\n * Sets new values into the channel record for purposes of change detection\n * @param interactionChannelProperties An object with properties and values based on a channel-record; e.g. for Facebook:\n * { displayName: 'Don Herkimer', ids: [ { scopedId: '23456' } ] }.  The source of \"new\" values for the channel gotten\n * from an interaction.\n * @param isNewChannel true if this is a new channel for the contact\n * @param contact An external contact that may (or may not) already have a channel for this interaction.  The source of\n * \"old\" values for the channel.\n * @param channelIdProperty E.g. 'id', 'ids', 'phoneNumber' etc. (see the message-channels util for details)\n * @param idPropertyName E.g. 'userId' or 'scopedId', if the channel is capable of having an array of ID objects\n * whose every key is the given property name.  Null otherwise.\n * @param channelRecord A channel-record model instance that will track changed attributes (ref. Ember DS.Model's changedAttributes method)\n */\nexport function setNewValuesInChannelRecord(\n    interactionChannelProperties,\n    isNewChannel,\n    contact,\n    channelIdProperty,\n    idPropertyName,\n    channelRecord\n) {\n    const messagingChannelType = messagingChannelTypeFor(channelRecord.get('type'));\n    // Iterate over the interaction's channel-related properties to get potentially new values\n    Object.keys(interactionChannelProperties).forEach(key => {\n        const modelKey = `${messagingChannelType.modelKey}`;\n        const contactChannelIds = !isNewChannel && IDS === key && contact.get(`${modelKey}.${key}`);\n        if (key === IDS && (contactChannelIds || isNewChannel)) {\n            addOrReplaceIdsInChannelRecord(\n                idPropertyName,\n                channelRecord,\n                interactionChannelProperties,\n                contactChannelIds\n            );\n        } else {\n            if ('id' === key) {\n                // We don't use an 'id' key in the channel record, since Ember DS will consider that to be the ID of the record.\n                // We use 'userId' to hold the value of the inbound message's (user) 'id' property.\n                channelRecord.set(USER_ID, interactionChannelProperties[key]);\n            } else if (deepNotEqual(channelRecord.get(`${key}`), interactionChannelProperties[key])) {\n                // Set this legit new value in the record\n                channelRecord.set(`${key}`, interactionChannelProperties[key]);\n            }\n        }\n    });\n}\n\nfunction getChannelRecordInfo(type, freshContactSnapshot, channelIdProperty, interaction, logger) {\n    const interactionChannel = getInteractionChannel(interaction, logger);\n    if (!interactionChannel) {\n        // Not much we can do for this interaction if we can't get channel info from it\n        return {};\n    }\n\n    const messagingChannelType = getMessageChannelType(type);\n    let attributes = {};\n    if (freshContactSnapshot) {\n        Object.assign(attributes, freshContactSnapshot.get(messagingChannelType.modelKey)); // The source for old (WRT the Ember DS channel record) values\n    }\n    const interactionChannelProperties = interactionChannel[messagingChannelType.modelKey]; // The source for new (WRT the Ember DS channelRecord) values\n    const isNewChannel = !attributes || !attributes[messagingChannelType.channelId]; // The channel's new if either there is no lineId, or twitterId, or ... property, *or* said property has no channel ID\n    if (isNewChannel) {\n        attributes = interactionChannel;\n    }\n    attributes.type = type;\n    attributes.channelIdProperty = channelIdProperty;\n    attributes.isNewChannel = isNewChannel;\n    attributes.changesIgnoredByAgent = false;\n    attributes.agentRespondedToPrompt = false;\n    const messengerType = messagingChannelType.type;\n    const idAttribute = messagingChannelType.channelId;\n    const idOrIDs =\n        freshContactSnapshot.get(`${messengerType}Id.${idAttribute}`) ||\n        interactionChannelProperties[interactionChannel.channelId];\n    if (idAttribute === IDS) {\n        attributes.userId = idOrIDs;\n    } else {\n        attributes.userId = idOrIDs;\n    }\n    // The ids, name, displayName, screenName, and phoneNumber properties for the channel record under-construction\n    // (see the channel-record model)\n    return { attributes, isNewChannel, interactionChannelProperties };\n}\n\n// Returns an Ember DS channel-record; see the model for more info.\n// The ID of the returned record is that of the interaction\nexport function push(store, interaction, freshContactSnapshot, type, channelIdProperty, logger) {\n    const { attributes, isNewChannel, interactionChannelProperties } = getChannelRecordInfo(\n        type,\n        freshContactSnapshot,\n        channelIdProperty,\n        interaction,\n        logger\n    );\n    if (!attributes) {\n        // Not much we can do for this interaction if we can't get channel info from it\n        return null;\n    }\n\n    // The channelRecord's changedAttributes function will return an object\n    // with properties storing arrayed pairs denoting an oldValue and\n    // a newValue: [oldValue, newValue], plus the numberOfChanges method that helps\n    // to determine if the inbound message introduces changes that need to be applied\n    // to the freshContactSnapshot's channel.\n    //\n    // We leverage that capability by setting values below.\n    let channelRecord;\n    run(() => {\n        // A run is required here for a successful run of the interaction-relate-profile-v2's \"should display a confirmation prompt if...\" integration test\n        channelRecord = store.push({\n            data: {\n                id: interaction.get('id'), // Use the interaction's ID as the ID for the record to allow peeks (see the peekForChannelRecord method)\n                type: CHANNEL_MODEL_TYPE,\n                attributes: attributes // The set of \"old\" values that may be updated by the forEach iterator below\n            }\n        });\n        // Add a numberOfChanges function to the channelRecord object so the confirmation prompt component can use it to\n        // determine what sort of prompt to offer the user\n        channelRecord.numberOfChanges = () => {\n            return Object.keys(channelRecord.changedAttributes()).length;\n        };\n\n        // See if the channel identifies users with an _array_ of IDs\n        const ids = interactionChannelProperties.ids;\n        // If so, grab the property of the first of those IDs to use as a property name if IDs are being added (below)\n        const idPropertyName = ids ? Object.keys(ids[0])[0] : null;\n        setNewValuesInChannelRecord(\n            interactionChannelProperties,\n            isNewChannel,\n            freshContactSnapshot,\n            channelIdProperty,\n            idPropertyName,\n            channelRecord\n        );\n    });\n    return channelRecord;\n}\n\n/**\n * Updates the contact with changes recorded by the channel Ember DS record\n * @param channelRecord\n * @param contact\n */\nexport function updateContactWithChannelChanges(channelRecord, contact) {\n    if (!channelRecord) {\n        return;\n    }\n\n    // In Ember 3, DS.Model still has attributes accessible via get()\n    const channelRecordType = channelRecord.get('type');\n    const isNewChannel = channelRecord.get('isNewChannel');\n    const changedAttributes = channelRecord.changedAttributes();\n    const messagingChannelType = messagingChannelTypeFor(channelRecordType);\n    const modelKey = `${messagingChannelType.modelKey}`;\n    const modelProperties = Object.keys(messagingChannelType.modelProperties()[modelKey]);\n    join(() => {\n        if (isNewChannel) {\n            // Set up the new channel and its id(s)\n            // Build the channel data object from the record's attributes\n            const channelData = {};\n            modelProperties.forEach(prop => {\n                // Map 'id' to 'userId' since channel records use 'userId' to avoid conflicts with Ember Data's id\n                const recordProp = prop === 'id' ? USER_ID : prop;\n                const value = channelRecord.get(recordProp);\n                if (value !== undefined) {\n                    channelData[prop] = value;\n                }\n            });\n            contact.set(`${modelKey}`, channelData);\n        } else {\n            // Copy the updated channel's data into the contact\n            Object.keys(changedAttributes).forEach(key => {\n                if (key === USER_ID) {\n                    const channelIdProperty = `${messagingChannelType.modelKey}.${messagingChannelType.channelId}`;\n                    // We don't use an 'id' key in the record because Ember DS will consider that to be the ID of the record.\n                    // We use 'channelId' to hold the value of the inbound message's 'id' property.\n                    if (messagingChannelType.idPropertyName) {\n                        // If the there's an idPropertyName, that means the channel uses an array of objects to denote IDs\n                        const id = messagingChannelType.getIdFrom(changedAttributes[key][1]);\n                        const contactChannelIds = contact.get(`${channelIdProperty}`);\n                        contact.set(`${channelIdProperty}`, [id].concat(contactChannelIds));\n                    } else {\n                        contact.set(`${channelIdProperty}`, messagingChannelType.getIdFrom(changedAttributes[key][1]));\n                    }\n                } else if (notExcluded(key) && modelProperties.includes(key)) {\n                    contact.set(`${modelKey}.${key}`, changedAttributes[key][1]);\n                }\n            });\n        }\n\n        // Delete irrelevant, channel-record-specific properties\n        CHANNEL_RECORD_PROPERTIES.forEach(property => {\n            delete contact.get(`${modelKey}.${property}`);\n        });\n    });\n}\n\nfunction deepNotEqual(a, b) {\n    return JSON.stringify(a) !== JSON.stringify(b);\n}\n\nfunction addOrReplaceIdsInChannelRecord(idPropertyName, channelRecord, interactionChannel, contactChannelIds) {\n    // Currently, FacebookId and LineId (contacts-service Java model class names) objects\n    // (facebook-id and line-id Ember DS models) use a property named 'ids' that has an array of\n    // objects whose key/value pairs are an ID name ('scopedId' and 'userId' respectively)\n    // paired with an ID string value.\n    //\n    // E.g. a facebook-id model object will have a property named 'ids', and its value could be\n    // [ { scopedId: '1234' }, { scopedId: '5678' } ]\n    const contactChannelIdValues = contactChannelIds ? contactChannelIds.map(id => id[idPropertyName]) : [];\n    const interactionIdValues = interactionChannel.ids.map(id => {\n        return id[idPropertyName];\n    });\n    let addedIds = false;\n    const newIdValues = interactionIdValues.map(interactionId => {\n        if (!contactChannelIdValues.includes(interactionId)) {\n            addedIds = true;\n            return interactionId;\n        }\n    });\n    if (addedIds) {\n        // As of this writing (31AUG2018), there is only one element in any contact's ids array.\n        //\n        // The uncommented statement map invocation below works under this assumption.  To relax that assumption at\n        // some point in the future, use the commented-out map line below instead.\n        const ids = newIdValues.map(idVal => {\n            // const ids = contactChannelIdValues.concat(newIdValues).map(idVal => {\n            const id = {};\n            id[idPropertyName] = idVal;\n            return id;\n        });\n        // Invoking the setter on the record engages the Ember DS changed attribute logic for models\n        channelRecord.set(IDS, ids);\n    }\n}\n","/**\n * Feature Toggle Configuration\n *\n * This file defines feature toggles for the application.\n * All toggles listed here will be fetched from the backend at session initialization.\n *\n * Toggle Naming Conventions:\n * - V1 Toggles: camelCase or dot.notation (e.g., 'acdAnnounceMonitoring', 'coaching.overdue.ui')\n * - V2 Toggles: JIRA-123_description format (e.g., 'ATLAS-1709_pigeon-service', 'ACT-1409_workTeamsMigration')\n */\n\nconst v1WhiteList = ['PAUI-80.PeopleUiDecomposition', 'never-free-seating', 'emergencyLocation'] as const;\n\n/**\n * V1 Feature Toggles (Legacy Format)\n * These use camelCase, dot.notation, or dash-separated naming\n */\nconst v1Toggles = [\n    'acdAnnounceMonitoring', // ACE-2630\n    'acdAnnounceMonitoringDigital', // ACE-2630\n    'acdDialpadDialing', // Partially Enabled | ACE-1061 | SERVOPS-12594 | can remove with useMultiPanel\n    'acdDivisionPresenceProfileToggle', // Secondary translation fix for regions | ACE-3661\n    'adminUI.v3.IFC.migration',\n    'agentAddressOnBehalfOfQueue', // MSG-5191 | PURE-3846 | TODO MSG-5859: remove toggle once direct routing is GA\n    'assignment.audioAlertDuration', // ACE-2879 | PURE-3878\n    'auraACWGadgets', // AURA-88\n    'browser-log-debug-enabled', // PURE-3205\n    'callbacks.inherit.routing.from.inbound.call', // CB-325\n    'coaching.overdue.ui',\n    'coaching.usability.ui',\n    'cobrowse.popoutAuthWindowFlow',\n    'cobrowseAssist',\n    'comui-disable-legacy-api-url',\n    'DX.GKC-5121.CX2DX-migration-force-cx',\n    'emergencyLocation',\n    'gpr.AP-8265.showCustomKpiLink', // AP-15781\n    'groupProileNoIndividualsSave', // PLUG-188\n    'hideAdhocRecordingsUi', // PCUCC-4176\n    'iam-admin-ui.authorized-orgs',\n    'interactionNameQueueCallingQueue', // ACE-1872\n    'learning.release.assessment.ui',\n    'never-free-seating',\n    'PAUI-80.PeopleUiDecomposition', // PAUI-517: feature toggle for the new decompositioned People's UI\n    'PURE-3835', // ACE-3769 Division name in interaction header, roster group, and outbound dialog search.\n    'switchboardUI.notificationRules', // WEM-578\n    'wfpDecisionsDataDownloadDecomp'\n] as const;\n\n/**\n * V2 Feature Toggles (JIRA Format)\n * These follow the strict pattern: JIRA-123_description (with underscore after JIRA number)\n * Examples: 'ATLAS-1709_pigeon-service', 'ACT-1409_workTeamsMigration'\n */\nconst v2Toggles = [\n    'ACE-4461_org-settings-fetch',\n    'ACT-1205', // ACT-1205 Adding Agent Greeting from Agent UI Settings to Preferences\n    'ACT-1409_workTeamsMigration',\n    'ACT-2139_queue-activation-page-agent-ui-settings', // ACT-2139 migrate queue activation page to agent-ui-settings-v2\n    'AGORA-78_integrate-agora-ui', // AGORA-78 Legacy Directory UI Decomposition - phase II - agora-ui\n    'AI-1199_summary_workbench', // AI-1199 Summary Workbench\n    'AI-1206_guides_for_va', // AI-1206 Guides for Virtual Agents\n    'AI-1223_copilot-framework', // AI-1223 Feature toggle for Copilot Framework\n    'AI-1296_copilot_social', // AI-1296 Agent Copilot social channel support\n    'AI-1365_agentic_virtual_agents', // AI-1365 LAM-based Virtual Agent (Sage)\n    'AI-1390_Copilot_Configuration', // AI-1390 Copilot Configuration\n    'AI-1402_email_refinement_with_ai', // AI-1402 Email Refinement with AI (Refine Response)\n    'AI-1433_optional_knowledge', // AI-1433 Allow Copilot without knowledgeSuggestionConfig\n    'AI-1435_CustomRevenueKpis', // AI-1435 Revenue KPIs; TODO: AP-21609: (Post GA) UI: FT AI-1435_CustomRevenueKpis removal from code base\n    'AI-1469_source-file-listing', // AI-1469 Knowledge fabric source content listing\n    'ATLAS-1709_pigeon-service', // ATLAS-1709: Simplified pigeon service with streaming client retry logic\n    'ATLAS-1796_new-call-persistent-connection', // TODO: ATLAS-1838 Remove once persistent connection update enabled globally\n    'ATLAS-1921_disable-v1-toggles',\n    'ATLAS-2042_bookmarking', //TODO: ATLAS-2067 Remove once bookmarking is enabled globally\n    'ATLAS-2158_help-accessibility-tab', // ATLAS-2158: Add accessibility tab in help panel\n    'ATLAS-2160_dark-theme-pilot', // TODO: ATLAS-2161: Remove dark theme toggle when we have a proper theme switcher\n    'AURA-1131_appsV2WorkersForACWGadgets',\n    'AURA-1668_retryForAppsV2Workers', // AURA-1668: Enable/Disable the retry mechanism for AppsV2 Workers\n    'AURA-1810_keepaliveForAppsV2Workers', // AURA-1810: Enable/Disable the keepAlive mechanism for AppsV2 Workers\n    'AURA-763_enableThrottlingMonitoring', // AURA-763: Feature toggle for throttling monitoring service\n    'AURA-763_enableThrottlingMonitoringPerfTrace', // AURA-763: Feature toggle for enabling throttling monitoring perf trace\n    'CHAT-3304_RealtimeEnableSystemMessages',\n    'CHAT-3526_enableAlertingLeaderPublicApi',\n    'CPR-615', // ClientV2 for HCJ\n    'EC-772_get-groups-mailboxes',\n    'GCUCCUI-2587_includeBadge',\n    'GKC-26947_disable-knowledge-v3-for-EUSC', // GKC-26947: Lock Knowledge Fabric UI in Web Directory menu behind FT in EUSC\n    'IAM-4157_new_security_page',\n    'PLATFORM-4742_use-gc-mfe-auth', // PLATFORM-4742: use gc-mfe-auth independently from account switcher\n    'PURE-3796_DIDGroups',\n    'PURE-3963_caller_id_groups',\n    'PURE-5007_digitalConsult', // PURE-5007\n    'PURE-5013_enableRequestingOffQueue',\n    'PURE-5110_AudioHook-Monitor-Config',\n    'PURE-5128_MaxInboundVoiceCalls',\n    'PURE-5149_ui_enableAlertablePresencesOverrides',\n    'PURE-5268_digital_messaging_inactivity_handling',\n    'PURE-5422_video-chat-ftv2',\n    'PURE-5487_require_queue', // GAUI-83\n    'PURE-5534_OpenMessagingEngagementSourceTagging', // PURE-5534 | ACE-5039\n    'PURE-5564_CCA', // PURE-5564 Adds Conversation Custom Attributes view\n    'PURE-5705_CloudTrunkStatusAndMetrics',\n    'PURE-5788_GCV_Disaster_Recovery', // PURE-5788 Toggles the availability of the Voice Number Redirection functionality.\n    'PURE-5920_disable_legacy_auth', // COMUI-3501\n    'PURE-6186_Scripter_Gadget_GCUI', // CC-4815\n    'PURE-6191', // RELATE-16223 | Enable Workitem support in Profile Panel\n    'PURE-6225_mrmo_replication', // PURE-6225 MRMO replication feature\n    'PURE-6270_failover_conductor', // MRMO-449 Failover conductor / org pairing / user switching\n    'PURE-6320_association_requests_ui', // PURE-6320 Case Management Association Requests UI - enables case icon to show if they are activities on workitems and allows for requesting other case association types\n    'PURE-6320_case_agent_ui', // PURE-6320 Case Management - Panel toggle\n    'PURE-6320_case_management', // PURE-6320 Case Management - Service/backend toggle\n    'PURE-6320_workitem_activities_ui', // PURE-6320 Case - Management Workitem Activities UI - enables case icon to show if they are activities on workitems\n    'PURE-6462_CustomerIntents', // PURE-6462 Customer Intent Roster UI\n    'PURE-6631', // hub-my-activity\n    'PURE-6632_inbox-ui', // PURE-6632 | New Inbox UI powered by Jetway\n    'PURE-6790_enableFocusMode', // PURE-6790 | ATEAM-1740 | Allow agents to use focus mode on main stage and carousel\n    'PURE-6790_enableNewAppSizer', // PURE-6790 | ATEAM-1741 | Switches to the new app sizer selector\n    'PURE-6813_OutcomesMilestones', // CPR-4131 | Outcomes & Milestones host integration (renamed from PURE-6813_CustomerOutcomes)\n    'PURE-6828_refinery_launch',\n    'PURE-6914', // PURE-6914 | Message Takeover\n    'PURE-6951_newPolyImplementation', //PURE-6951 | Allows Poly to use WebHID when enabled, Plantronics Hub when disabled\n    'PURE-6951_useWebHidOnDesktopCyberAcoustics', //PURE-6951 | Allows CyberAcoustics to use WebHID on the desktop app\n    'PURE-6951_useWebHidOnDesktopJabra', //PURE-6951 | Allows Jabra to use WebHID on the desktop app\n    'PURE-6951_useWebHidOnDesktopVbet', //PURE-6951 | Allows VBeT to use WebHID on the desktop app\n    'PURE-6951_useWebHidOnDesktopYealink', //PURE-6951 | Allows Yealink to use WebHID on the desktop app\n    'PURE-7059_Architect-EmailFlows', // PURE-7059 | Email Send Flow execution UI states\n    'PURE-7071_external-events-ui', // External Event Ingestion admin UIs (schemas + configurations) | removal ticket: RELATE-25540\n    'PURE-7111_aa-holding',\n    'PURE-7138_caseplan_builder', // PURE-7138 Caseplan Builder / WORKITEMS-6526: new admin app for managing caseplans, removal ticket: https://inindca.atlassian.net/browse/WORKITEMS-6677\n    'PURE-7203_case_list', // PURE-7203 New agent app for managing cases, removal ticket: https://inindca.atlassian.net/browse/WORKITEMS-7863\n    'PURE-7203_case_list_ui', // PURE-7203 New agent app for managing cases, removal ticket: https://inindca.atlassian.net/browse/WORKITEMS-7863\n    'PURE-7222_associate-user', // PURE-7222 Associate User\n    'PURE-7224_Prefix', // PURE-7224 Toggles the availability of the GCV Prefix Blocking funtionality\n    'PURE-7349_acdConferenceMS3-phase-1', // PURE-7349 | ACE-4686\n    'PURE-7428_embedded-analytics', // PURE-7428 Analytics Explorer\n    'PURE-7570',\n    'PURE-7606_in_memory_storage', // PURE-7606 | Use in-memory storage for rolling log capture\n    'PURE-7648_locations',\n    'PURE-7878', // PURE-7878 | GCX Now trial expansion - hide legacy trial support center\n    'SERVOPS-62312_queueToQueueVoiceCustomer', // SERVOPS-62312: Queue to Queue Voice Participant for Customer\n    'STREAM-1457_troubleshooter_iframe_auth', // STREAM-1457: Embed the WebRTC troubleshooter via frame-router w/ host-provided auth\n    'STREAM-1868_persistent_failure_toast', // STREAM-1868: Persistent connection failure to establish toast\n    'TC-351', // TC-351 - Rewrite of /api/v2/stations API\n    'WEM-1083_staReprocessInteractions',\n    'WEM-1142_MSEdgeNativeMessaging',\n    'WEM-118_snippet-recording',\n    'WEM-1246_ActivityPlanRules',\n    'WEM-1262_category-aggregates',\n    'WEM-1310_QueueAnomalyDetection',\n    'WEM-1368_Queue-Performance-Widget',\n    'WEM-1384_SequentialTORApproval',\n    'WEM-1385_DecisionMetrics',\n    'WEM-1476_Agent-Activity-Migration',\n    'WEM-1537_agentScheduleVisibility',\n    'WEM-1539_forecast_list', // WFMFUI-2684:WEM-1539 | Post GA toggle cleanup\n    'WEM-437_screen-monitoring',\n    'WEM-438_recorder-states',\n    'WEM-885_ReprocessInteractionsUI',\n    'WEM-893_Adherence_Adjustments'\n] as const;\n\n/**\n * Combined feature toggles export\n * Merges V1 and V2 toggles into a single array for backward compatibility\n */\nconst featureToggles = [...v1Toggles, ...v2Toggles] as const;\n\nexport default featureToggles;\n\n/**\n * Export individual toggle sets for specific use cases\n */\nexport { v1Toggles, v2Toggles, v1WhiteList };\n","/**\n * Like Array.prototype.findLast (not available in this runtime).\n * Returns the last element matching the predicate, or undefined.\n */\nexport function findLast<T>(array: T[], predicate: (value: T, index: number, arr: T[]) => boolean): T | undefined {\n    for (let i = array.length - 1; i >= 0; i--) {\n        const val = array[i];\n\n        if (predicate(val, i, array)) {\n            return val;\n        }\n    }\n\n    return undefined;\n}\n","import Ember from 'ember';\nimport { scheduleOnce, next } from '@ember/runloop';\n\n// Focus management should ONLY be used for pulling by pass blocks\n// do not add implicit pulling (x happens so we should move to this button), it cause A11Y issues confusing screen reader users\n// - speak to the ATLAS team for further details\n\nfunction _isSafeToFocus(selector) {\n    const activeElement = document.activeElement;\n\n    switch (selector) {\n        case '#roster-action-answer-button button':\n            // interaction roster\n            if (activeElement && activeElement.parentElement) {\n                return activeElement.parentElement.classList.contains('toggle-switch-container');\n            }\n            return false;\n        case '.incoming-controls button.answer-call':\n            // active-call-entry\n            if (activeElement && activeElement.parentElement) {\n                return activeElement.parentElement.classList.contains('toggle-switch-container');\n            }\n            return false;\n        case '.answer-call-action-bar button.answer-call':\n            // call toast\n            if (activeElement && activeElement.parentElement) {\n                return activeElement.parentElement.classList.contains('toggle-switch-container');\n            }\n            return false;\n        default:\n            return false;\n    }\n}\n\n/**\n * Normalizes jQuery-style selectors (e.g. `:first`, `:last`) to work with native querySelector.\n * Returns the first matching element for the given selector within the root.\n *\n * `selector` is normally a CSS selector string. As a defensive measure it also accepts an already\n * resolved DOM Element (returned as-is) and returns null for any other type, so a bad caller can no\n * longer trigger \"TypeError: selector.match is not a function\".\n */\nfunction _queryElement(root, selector) {\n    // Already-resolved element: use it directly.\n    if (selector instanceof Element) {\n        return selector;\n    }\n    // Anything that isn't a selector string can't be queried; bail out safely.\n    if (typeof selector !== 'string') {\n        return null;\n    }\n    // Handle jQuery's :first / :last pseudo-selectors which aren't valid in native CSS\n    const jqueryPseudoMatch = selector.match(/^(.+):first$/);\n    if (jqueryPseudoMatch) {\n        return root.querySelector(jqueryPseudoMatch[1]);\n    }\n    const jqueryLastMatch = selector.match(/^(.+):last$/);\n    if (jqueryLastMatch) {\n        const all = root.querySelectorAll(jqueryLastMatch[1]);\n        return all.length ? all[all.length - 1] : null;\n    }\n    return root.querySelector(selector);\n}\n\nexport function doFocus(component, selector) {\n    scheduleOnce('afterRender', component, function () {\n        const root = component.element || document;\n        const el = _queryElement(root, selector);\n        if (el) {\n            el.focus();\n        }\n    });\n}\n\nexport function requestFocus(scope = Ember, selector) {\n    let isSafe;\n    try {\n        isSafe = _isSafeToFocus(selector);\n    } catch (e) {\n        isSafe = false;\n    }\n\n    if (isSafe) {\n        next(() => {\n            doFocus(scope, selector);\n        });\n    }\n}\n","/**\n * Coordinates access to gc-mfe-auth's Host.authenticate() to prevent\n * concurrent calls that cause race conditions.\n *\n * Problem: When the app is rate-limited (429) during bootstrapping with\n * useGCMFEAuth=true, calling Host.clearActiveSession() followed by\n * Host.authenticate() should force a new OAuth flow to get a fresh token.\n * However, multiple parts of the app call authenticate() concurrently\n * (e.g., via hashchange events during bootstrap), causing gc-mfe-auth to\n * think authorization is already in progress and skip the OAuth redirect.\n *\n * Solution: This coordinator ensures only one authenticate() call is\n * in-flight at a time. Additional callers receive the same promise.\n * When a session clear is requested, it ensures clearActiveSession()\n * completes before authenticate() is called.\n */\n\n/**\n * Organization target for authentication.\n */\ninterface AuthOrg {\n    region?: string;\n    orgName: string;\n}\n\n/**\n * Specific user target for authentication.\n */\ninterface AuthUser {\n    org: AuthOrg;\n    email: string;\n}\n\n/**\n * Fresh login target — ignores existing sessions.\n */\ninterface NewLogin {\n    region?: string;\n    user: 'new_user';\n}\n\n/**\n * Union type representing the target of authentication.\n */\ntype AuthTarget = AuthOrg | AuthUser | NewLogin;\n\ninterface AuthSession {\n    token: { value: string; expiration: number };\n}\n\ninterface AuthOptions {\n    authAs?: AuthTarget;\n    skipAccountSelection?: boolean;\n    redirectTo?: string;\n}\n\ninterface GCAuthHost {\n    authenticate(options?: AuthOptions): Promise<AuthSession | void>;\n    clearActiveSession(): Promise<void>;\n}\n\ninterface PendingAuth {\n    promise: Promise<AuthSession | void>;\n    clearRequested: boolean;\n}\n\nlet pendingAuth: PendingAuth | null = null;\n\n/**\n * Calls Host.authenticate() with deduplication. If a call is already\n * in-flight, subsequent callers receive the same promise.\n *\n * @param host - The gc-mfe-auth Host instance\n * @param options - Authentication options (redirectUrl, orgName, etc.)\n * @param clearSession - If true, calls clearActiveSession() before authenticate()\n *   to force a new OAuth flow (e.g., when the current token is rate-limited)\n * @returns The result of Host.authenticate()\n */\nexport function coordinatedAuthenticate(\n    host: GCAuthHost,\n    options?: AuthOptions,\n    clearSession = false\n): Promise<AuthSession | void> {\n    // If there's already an in-flight auth and we don't need a clear\n    // (or the in-flight one already did a clear), piggyback on it\n    if (pendingAuth && (!clearSession || pendingAuth.clearRequested)) {\n        return pendingAuth.promise;\n    }\n\n    // If there's an in-flight auth but we now need a clear,\n    // wait for it to finish then start a fresh clear+authenticate cycle\n    if (pendingAuth && clearSession) {\n        const chainedPromise = pendingAuth.promise\n            .catch(() => {\n                // Ignore the previous result — we're starting fresh\n            })\n            .then(() => {\n                // Reset so the recursive call starts a new cycle\n                pendingAuth = null;\n                return coordinatedAuthenticate(host, options, true);\n            });\n\n        pendingAuth = { promise: chainedPromise, clearRequested: true };\n        return chainedPromise;\n    }\n\n    // No in-flight auth — start a new one\n    const authPromise = (\n        clearSession\n            ? host.clearActiveSession().catch(() => {\n                  // Best-effort clear — don't block auth if this fails\n              })\n            : Promise.resolve()\n    ).then(() => host.authenticate(options));\n\n    // Clean up when done (success or failure)\n    const tracked = authPromise.finally(() => {\n        if (pendingAuth && pendingAuth.promise === tracked) {\n            pendingAuth = null;\n        }\n    });\n\n    pendingAuth = { promise: tracked, clearRequested: clearSession };\n    return tracked;\n}\n\n/**\n * Resets internal coordinator state.\n * Exposed for testing only — do not call in production code.\n */\nexport function _resetCoordinator(): void {\n    pendingAuth = null;\n}\n","const SEMVER_PARSER = /^([^\\+]+)\\+(\\d+)-(.+)-([a-zA-Z0-9]+)$/;\n\nexport interface GenesysAppNameOptions {\n    /** The application semver string */\n    semver?: string;\n    /** Whether the app is running in desktop (hosted) mode */\n    isHosted?: boolean;\n    /** Whether the app is running as a popout window */\n    isPopout?: boolean;\n    /** Optional suffix appended to the app name (e.g., 'admin' yields 'directory-webui/.../admin') */\n    suffix?: string;\n}\n\n/**\n * Helper function to build the Genesys app name/identifier used for telemetry headers and authentication.\n * The full value includes: base app name, version info, platform (desktop/browser), optional popout flag, and optional suffix.\n * Format: directory-webui/version/platform[/popout][/suffix]\n *\n * @param options - Configuration options\n * @returns The full Genesys app identifier (e.g., 'directory-webui/11.1.0/browser')\n */\nexport function getGenesysAppName(options: GenesysAppNameOptions = {}): string {\n    const { semver, isHosted, isPopout, suffix } = options;\n    const headerTokens = ['directory-webui'];\n\n    // web-dir version\n    if (typeof semver === 'string') {\n        const semverParseResult = SEMVER_PARSER.exec(semver.trim());\n        if (semverParseResult && semverParseResult.length === 5) {\n            // Production build semver format\n            const [, pkgVersion, buildNumber, gitBranch, gitCommit] = semverParseResult;\n            // Reduce the size of the release details to keep the overall header length down\n            // packageVersion-gitBranch[0,24)-buildNumber-gitCommit[0,8)\n            // 25 branch chars accounts for our standard branch prefixes, jira teams/numbers, and a bit of desc\n            // 8 chars of git sha should be more than sufficient\n            headerTokens.push(\n                [pkgVersion, gitBranch.slice(0, 25), buildNumber, gitCommit.slice(0, 8)]\n                    .map(curr => curr.trim().replace(/\\//g, '_'))\n                    .filter(curr => curr)\n                    .join('-')\n            );\n        } else {\n            // Dev/Unparsable semver - just use it as is, replace slashes, and truncate to 25 chars\n            headerTokens.push(semver.trim().replace(/\\//g, '_').slice(0, 25));\n        }\n    }\n\n    // Desktop vs Browser\n    headerTokens.push(isHosted ? 'desktop' : 'browser');\n\n    // Popout (PEF, chat, etc)\n    // Popout is not a 1:1 mapping to PEF, but, it is one of the cases that manifests as isPopout\n    if (isPopout) {\n        headerTokens.push('popout');\n    }\n\n    if (suffix) {\n        headerTokens.push(suffix);\n    }\n\n    return headerTokens.join('/');\n}\n","import { Promise } from 'rsvp';\nimport EmberObject from '@ember/object';\nconst geolocation = navigator.geolocation;\n\nconst GeolocationUtil = EmberObject.create({\n    hostedContext: null,\n\n    setContext(context) {\n        this.hostedContext = context;\n    },\n\n    fetchCurrentPostion() {\n        let context = this.hostedContext;\n\n        // Use Windows native geolocation if supported\n        if (context && context.supportsWindowsNativeGeolocation()) {\n            return context.requestDesktopPromise({ cmd: 'getGeolocationPositionNative' });\n        }\n\n        // Fall back to existing logic\n        if (context !== null && context.isHosted() && context.requiresNativeGeolocation()) {\n            return context.requestDesktopPromise({ cmd: 'getGeolocationPosition' });\n        } else {\n            return new Promise(function (resolve, reject) {\n                geolocation.getCurrentPosition(\n                    position => resolve(position),\n                    error => reject(error)\n                );\n            });\n        }\n    },\n\n    watchPosition(onPositionChangedFn, onErrorFn, options) {\n        return geolocation.watchPosition(onPositionChangedFn, onErrorFn, options);\n    },\n\n    clearWatch(watcher) {\n        geolocation.clearWatch(watcher);\n    },\n\n    isGeolocationAvailable() {\n        return 'geolocation' in navigator;\n    },\n\n    getCurrentPosition(success, failure) {\n        return geolocation.getCurrentPosition(success, failure);\n    }\n});\n\nexport default GeolocationUtil;\n","/**\n * Accessibility utility for gux-popover-list in Ember 2.x.\n *\n * gux-list relies on slotted gux-list-item elements being direct children,\n * but Ember wraps components in divs, breaking gux-list's internal keyboard\n * navigation and focus management. This utility provides:\n *\n * - Arrow key navigation between gux-list-items (regardless of nesting)\n * - Space key activation (consistent with Enter)\n * - Auto-focus first item when popover opens\n * - Dismiss event handling\n *\n * Usage:\n *   import { setupGuxPopoverListA11y, focusFirstGuxPopoverItem, teardownGuxPopoverListA11y } from 'web-directory/utils/gux-popover-list-a11y';\n *\n *   // In didInsertElement:\n *   const cleanup = setupGuxPopoverListA11y(popoverElement, { onDismiss: () => this.set('isOpen', false) });\n *   this.set('_popoverCleanup', cleanup);\n *\n *   // When opening:\n *   focusFirstGuxPopoverItem(popoverElement);\n *\n *   // In willDestroyElement:\n *   teardownGuxPopoverListA11y(this.get('_popoverCleanup'));\n */\n\ninterface PopoverListA11yOptions {\n    /** Called when popover emits guxdismiss */\n    onDismiss?: () => void;\n}\n\ninterface PopoverListCleanup {\n    destroy: () => void;\n}\n\n/**\n * Sets up keyboard navigation and dismiss handling for a gux-popover-list element.\n * Returns a cleanup object — call cleanup.destroy() in willDestroyElement.\n */\nexport function setupGuxPopoverListA11y(\n    popoverElement: HTMLElement,\n    options: PopoverListA11yOptions = {}\n): PopoverListCleanup {\n    const keydownHandler = (event: KeyboardEvent) => {\n        if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n            event.preventDefault();\n\n            const items = getVisibleListItems(popoverElement);\n            if (!items.length) return;\n\n            const currentIndex = items.findIndex(item => item.matches(':focus-within') || item.matches(':focus'));\n\n            let nextIndex: number;\n            if (event.key === 'ArrowDown') {\n                nextIndex = currentIndex < items.length - 1 ? currentIndex + 1 : 0;\n            } else {\n                nextIndex = currentIndex > 0 ? currentIndex - 1 : items.length - 1;\n            }\n            items[nextIndex].focus();\n        } else if (event.key === ' ') {\n            event.preventDefault();\n            const items = getVisibleListItems(popoverElement);\n            const focused = items.find(item => item.matches(':focus-within') || item.matches(':focus'));\n            if (focused) {\n                focused.click();\n            }\n        }\n    };\n\n    const dismissHandler = () => {\n        if (options.onDismiss) {\n            options.onDismiss();\n        }\n    };\n\n    popoverElement.addEventListener('keydown', keydownHandler);\n    popoverElement.addEventListener('guxdismiss', dismissHandler);\n\n    return {\n        destroy() {\n            popoverElement.removeEventListener('keydown', keydownHandler);\n            popoverElement.removeEventListener('guxdismiss', dismissHandler);\n        }\n    };\n}\n\n/**\n * Focus the first list item in a gux-popover-list once it becomes visible.\n * Polls shadow DOM until the popover wrapper is no longer hidden, then focuses.\n */\nexport function focusFirstGuxPopoverItem(popoverElement: HTMLElement): void {\n    const tryFocus = () => {\n        const wrapper = popoverElement.shadowRoot?.querySelector('.gux-popover-wrapper') as HTMLElement;\n        if (wrapper && !wrapper.classList.contains('gux-hidden')) {\n            const item = popoverElement.querySelector('gux-list-item:not([disabled])') as HTMLElement;\n            if (item) {\n                item.focus();\n            }\n        } else {\n            requestAnimationFrame(tryFocus);\n        }\n    };\n    requestAnimationFrame(tryFocus);\n}\n\n/**\n * Tears down popover a11y handlers. Safe to call with null/undefined.\n */\nexport function teardownGuxPopoverListA11y(cleanup: PopoverListCleanup | null | undefined): void {\n    if (cleanup) {\n        cleanup.destroy();\n    }\n}\n\nfunction getVisibleListItems(popoverElement: HTMLElement): HTMLElement[] {\n    return Array.from(popoverElement.querySelectorAll('gux-list-item:not([disabled])')) as HTMLElement[];\n}\n","import { Promise } from 'rsvp';\nimport { debounce } from '@ember/runloop';\nimport { getOwner } from '@ember/application';\nimport { inject as service } from '@ember/service';\nimport Evented from '@ember/object/evented';\nimport EmberObject, { computed } from '@ember/object';\nimport _ from 'lodash';\nimport { PUBLIC_ENVS } from './net';\nimport { COLLABORATE_CHAT_EVENTS } from './collab-chat-constants';\n\n//For CEF:\n//_HostedContextFunctions functions:\n// - register(initData)\n// - showNotification(messageData)\n// - setUnreadMessageCount(count)\n// - doTerminateNow()\n\n//The app is considered hosted if it's running in an iframe, -or-. This class helps facilitate communication between\n//the app and its parent.\nvar HostedContext = EmberObject.extend(Evented, {\n    applicationService: service('application'),\n    logger: service('stash-logger'),\n    chatFrame: service(),\n    applicationController: null,\n\n    _applicationHasFocus: true,\n    _hostType: null, //This determines whether we are actually hosted or not. Possible values: 'CEF', or null\n    _operatingSystem: '', //Mac or Windows\n    _version: '(unknown)', //Desktop application version\n\n    _hostRegion: null,\n    _supportsRegions: false,\n    _supportsUnifiedPreferences: false,\n    _supportsJabra: true,\n    _supportsWebHID: true,\n    _additionalPreferences: [],\n\n    /**\n     * Named debounce target for setIdle — required because Ember 3 debounce coalesces\n     * by target+method identity; anonymous functions defeat this.\n     */\n    _debouncedSetIdle() {\n        try {\n            this._lastStreamingConnection.setIdle(this._lastIdleValue);\n        } catch (e) {\n            this.logger.log('Failed to execute debounced setIdle', e);\n        }\n    },\n    _requiresNativeGeolocation: false,\n    _supportsActionableNotifications: false,\n    _supportsWindowsNativeGeolocationAPI: false,\n    runAsMediaHelper: false,\n    previousPresence: null,\n    isScreenLockedOrSleep: false,\n    hasUserAlreadyReturn: false,\n    desktopSleptAt: null,\n\n    init: function () {\n        this._super(...arguments);\n\n        const owner = getOwner(this);\n        this.set('applicationController', owner.lookup('controller:application'));\n\n        //Create the initialization information to pass into the host\n        var assetURL = window.location.origin + window.location.pathname;\n        var urlPrefix = this.get('applicationService.urlprefix');\n\n        //urlprefix may be relative or fully qualified. If it's fully qualified, use that. Otherwise, append it to the origin.\n        if (urlPrefix && urlPrefix.length > 0) {\n            if (urlPrefix.substr(0, 5) === 'http:' || urlPrefix.substr(0, 6) === 'https:') {\n                assetURL = urlPrefix;\n            } else {\n                assetURL += urlPrefix;\n            }\n        }\n\n        var initData = {\n            assetURL: assetURL,\n            callback: this.callback.bind(this),\n            supportsTerminationRequest: true,\n            supportsUnifiedPreferences: true\n        };\n\n        //CEF version, talk directly to host via javascript->C++\n        if (window._HostedContextFunctions != null) {\n            try {\n                var appInfo = window._HostedContextFunctions.register(initData);\n                this._hostType = appInfo.hostType;\n                this._operatingSystem = appInfo.operatingSystem;\n                this._version = appInfo.version;\n                this._supportsRegions = appInfo.supportsRegions;\n                this._hostRegion = appInfo.hostRegion;\n                this._supportsActionableNotifications = !!appInfo.supportsNotificationActions;\n                this._additionalPreferences = appInfo.additionalPreferences\n                    ? appInfo.additionalPreferences.split('|')\n                    : [];\n                this._supportsJabra = appInfo.supportsJabra;\n                this._supportsWebHID = appInfo.supportsWebHID;\n                this._requiresNativeGeolocation = appInfo.requiresNativeGeolocation;\n                this.runAsMediaHelper = appInfo.runAsMediaHelper;\n                this._supportsWindowsNativeGeolocationAPI = appInfo.supportsWindowsNativeGeolocationAPI;\n\n                this.logger.log('Running: ' + this._operatingSystem + ' app version: ' + this._version);\n                this.logger.log(\n                    'Supports regions: ' + this._supportsRegions + ' | Current region: ' + this._hostRegion\n                );\n                this.logger.log('Requires native geolocation: ' + this._requiresNativeGeolocation);\n                this._supportsUnifiedPreferences = appInfo.unifiedPreferenceSupport;\n                if (appInfo.supportsScreenMediaSelection) {\n                    window.cefGetScreenMedia = callback => this.getScreenMedia(callback);\n                }\n                this.setUnreadMessageCount(0);\n            } catch (e) {\n                this.logger.error('Error initializing hosted context functions', { error: e });\n            }\n            return;\n        }\n    },\n\n    isHosted: function () {\n        return this._hostType !== null;\n    },\n\n    isHostedProp: computed(function () {\n        return this.isHosted();\n    }),\n\n    requiresNativeGeolocation: function () {\n        return this._requiresNativeGeolocation;\n    },\n\n    supportsWindowsNativeGeolocation: function () {\n        return (\n            this.isHosted() &&\n            this.isWindows() &&\n            window._HostedContextFunctions &&\n            this._supportsWindowsNativeGeolocationAPI\n        );\n    },\n\n    getRegion: function () {\n        return this._hostRegion;\n    },\n\n    supportsRegions: function () {\n        return this._supportsRegions;\n    },\n\n    supportsUnifiedPreferences: function () {\n        return this._supportsUnifiedPreferences;\n    },\n\n    supportsJabra: function () {\n        return this._supportsJabra;\n    },\n\n    supportsWebHid: function () {\n        return this._supportsWebHID;\n    },\n\n    isMac: function () {\n        return this._operatingSystem === 'Mac';\n    },\n\n    isWindows: function () {\n        return this._operatingSystem === 'Windows';\n    },\n\n    supportsActionableNotifications: function () {\n        return this._supportsActionableNotifications;\n    },\n\n    getAdditionalPreferences: function () {\n        return this._additionalPreferences;\n    },\n\n    doTerminateApplication: function (completion) {\n        this.logger.log('in doTerminationApplication with completion: ' + completion);\n        setTimeout(function () {\n            if (completion) {\n                completion();\n            }\n        }, 2000);\n    },\n\n    //CEF calls functions in Javascript by passing messages here\n    callback: function (obj) {\n        var msg = obj.msg;\n        if (msg === 'OpenSearchField') {\n            if (!document.body.classList.contains('modal-open')) {\n                // Check if using new nav or old nav\n                const session = getOwner(this).lookup('service:session');\n                const useNewNav = session && typeof session === 'object' && !!session.get('useNewNav');\n                let searchField;\n                if (useNewNav) {\n                    searchField = document.querySelector(\n                        '#search-field, input.global-search-field, .global-search-field input'\n                    );\n                } else {\n                    searchField = document.querySelector('.topbar .search-input input');\n                }\n                if (searchField) {\n                    searchField.focus();\n                }\n            }\n        } else if (msg === 'TerminateApplication') {\n            var completion = window._HostedContextFunctions.doTerminateNow;\n            this.doTerminateApplication(completion);\n            return true;\n        } else if (msg === 'OpenPreferences') {\n            this.applicationController.send('openPreferencesModal');\n        } else if (msg === 'HandleExternalURI') {\n            var protocol = obj.protocol;\n            var data = obj.data;\n            if (protocol === 'tel' || protocol === 'callto') {\n                var phoneService = Orgspan.serviceFor('phone');\n                if (phoneService != null) {\n                    data = window.decodeURIComponent(data);\n                    this.logger.log('Calling: ' + data);\n                    phoneService.makeCall(data);\n                }\n            }\n        } else if (msg === 'SetDesktopPresence') {\n            //Desktop presence will either be desktopaway or desktopback.\n            const desktopPresence = obj.presence;\n            const idle = desktopPresence === 'desktopaway';\n\n            try {\n                var streamingConnection = Orgspan.serviceFor('streaming').get('connection');\n                if (\n                    streamingConnection &&\n                    streamingConnection.connected &&\n                    typeof streamingConnection.setIdle === 'function'\n                ) {\n                    this.logger.debug(\n                        `Setting desktop presence of ${desktopPresence} and idle state to: ${idle ? 'idle' : 'back'}`\n                    );\n\n                    if (idle) {\n                        this.set('desktopSleptAt', Date.now());\n                        this.chatFrame.notifyCollaborateChatIFrame(\n                            COLLABORATE_CHAT_EVENTS.publish.desktopAsleep,\n                            this.desktopSleptAt\n                        );\n                    } else {\n                        this.chatFrame.notifyCollaborateChatIFrame(\n                            COLLABORATE_CHAT_EVENTS.publish.desktopWakeUp,\n                            this.desktopSleptAt\n                        );\n                    }\n\n                    // Ember 3 debounce coalesces by target+method identity; a named method is required\n                    // (anonymous arrows create a new reference each call, defeating debounce).\n                    this._lastStreamingConnection = streamingConnection;\n                    this._lastIdleValue = idle;\n                    debounce(this, this._debouncedSetIdle, 250);\n                } else {\n                    this.logger.log('Cannot call setIdle on streaming service connection.');\n                }\n            } catch (e) {\n                this.logger.log('Failed to call setIdle on streaming service connection.', e);\n            }\n        } else if (msg === 'JabraEvent') {\n            let eventName = obj.event; //Mute, Hold, OffHook, ...\n            let value = obj.value; //true or false\n            let hidInput = obj.hidInput; //Raw int value of input, useful if eventName is not recognized.\n            this.logger.log('Jabra event received: id: ' + hidInput + ' name:' + eventName + ' value: ' + value);\n            this.trigger('JabraEvent', { eventName, value, hidInput });\n        } else if (msg === 'JabraDeviceAttached') {\n            let attached = obj.attached; //true if attached, false if detached\n            let deviceName = obj.deviceName; //Name of device when attached, empty string when detached\n            let deviceId = obj.deviceId; //ID of device\n            this.logger.log(\n                'Jabra device-attached received: id: ' + deviceId + ' name:' + deviceName + ' attached: ' + attached\n            );\n            this.trigger('JabraDeviceAttached', { deviceName, deviceId, attached });\n        }\n    },\n\n    applicationHasFocus: function () {\n        return window._HostedContextFunctions && window._HostedContextFunctions.doesAppHaveFocus();\n    },\n\n    showNativeNotification: function (data) {\n        window._HostedContextFunctions.showNativeNotification(data);\n    },\n\n    setUnreadMessageCount: function (count) {\n        try {\n            if (this.isHosted() && window._HostedContextFunctions.setUnreadMessageCount) {\n                window._HostedContextFunctions.setUnreadMessageCount(count);\n            }\n        } catch (e) {\n            this.get('logger').error('Error setting unread message count', { error: e });\n        }\n    },\n\n    //Send a Jabra event to the desktop.\n    //deviceID - ID of the device\n    //event - 'offhook', 'hold', 'mute', ringer'\n    //value - true or false\n    sendJabraEventToDesktop: function (deviceID, event, value) {\n        this.sendEventToDesktop(EVENTS.JABRA_EVENT, {\n            deviceID: deviceID,\n            event: event,\n            value: value\n        });\n    },\n\n    requestJabraDevices: function () {\n        return this.requestDesktopPromise({ cmd: 'requestJabraDevices' });\n    },\n\n    sendEventToDesktop: function (event, data) {\n        try {\n            if (this.isHosted()) {\n                window._HostedContextFunctions.sendEventToDesktop(event, data);\n            }\n        } catch (e) {\n            this.logger.error('Error sending event to desktop', { error: e });\n        }\n    },\n\n    getScreenMedia: function (callback) {\n        this.requestDesktopPromise({\n            cmd: 'getUserSelectedScreenMedia'\n        })\n            .then(function (obj) {\n                callback(obj.id);\n            })\n            .catch(function (/*reason*/) {\n                callback(null);\n            });\n    },\n\n    sendRegionToDesktop: function (region) {\n        this._hostRegion = region;\n\n        try {\n            if (this.isHosted()) {\n                let matchedRegion = _.find(PUBLIC_ENVS, { desktopId: region });\n                if (matchedRegion) {\n                    let url = `https://apps.${matchedRegion.envTld}/directory`;\n                    this.logger.log('Region: ' + region + ' URL: ' + url);\n                    window._HostedContextFunctions.sendRegionToDesktop(region, url);\n                } else {\n                    this.logger.error(`Unable to send region to desktop.  Unknown Region '${region}'`);\n                }\n            }\n        } catch (e) {\n            this.logger.error('Error sending region to desktop', { error: e });\n        }\n    },\n\n    focusWindow() {\n        try {\n            if (this.isHosted() && window._HostedContextFunctions.focusWindow) {\n                window._HostedContextFunctions.focusWindow();\n                return true;\n            }\n            return false;\n        } catch (e) {\n            this.logger.error('Error focusing window', { error: e });\n            return false;\n        }\n    },\n\n    dismissNotification(id) {\n        try {\n            if (this.isHosted() && window._HostedContextFunctions.dismissNotification) {\n                window._HostedContextFunctions.dismissNotification(id);\n            }\n        } catch (e) {\n            this.logger.error('Error dismissing notification', { error: e });\n        }\n    },\n\n    getShareableScreens() {\n        return this.requestDesktopPromise({\n            cmd: 'getShareableScreens'\n        });\n    },\n\n    requestDesktopPromise: function (cmd) {\n        const logger = this.logger; // Capture logger reference before Promise constructor\n        return new Promise(function (resolve, reject) {\n            try {\n                var sCmd = JSON.stringify(cmd);\n                window.cefQuery({\n                    request: sCmd,\n                    persistent: false,\n                    onSuccess: function (response) {\n                        try {\n                            var obj = JSON.parse(response);\n                            resolve(obj);\n                        } catch (e) {\n                            resolve({});\n                        }\n                    },\n                    onFailure: function (response) {\n                        reject(response);\n                    }\n                });\n            } catch (e) {\n                logger.error('Error requesting desktop promise', {\n                    error: e\n                });\n                reject(new Error('Error requesting desktop promise: ' + (e.message || e)));\n            }\n        });\n    }\n});\n\nexport var EVENTS = {\n    INCOMING_CALL: 'incomingCall',\n    TERMINATED_CALL: 'terminatedCall',\n    MISSED_CALL: 'missedCall',\n    STOPPED_RINGING: 'stoppedRinging',\n    PHONE_CONNECTED: 'phoneConnected',\n    WEBRTC_CONNECTION_INCOMING: 'webrtcConnectionIncoming',\n    WEBRTC_CONNECTION_ANSWERED: 'webrtcConnectionAnswered',\n    WEBRTC_CONNECTION_DECLINED: 'webrtcConnectionDeclined',\n    WEBRTC_CONNECTION_STARTED: 'webrtcConnectionStarted',\n    WEBRTC_CONNECTION_ENDED: 'webrtcConnectionEnded',\n    JABRA_EVENT: 'jabraEvent'\n};\n\nexport default HostedContext;\n","import { Maybe } from 'web-directory/types';\n\ntype InteractionIcon = {\n    iconName: Maybe<string>;\n    textKey: string;\n};\ntype InteractionIconElementType = { [key: string]: InteractionIcon };\n\nconst defaultIcon = 'comments';\nconst messageTypesBaseKey = 'purecloud.acdInteraction.interactionTypes.messageTypes.';\nconst engagementSourceBaseKey = 'purecloud.acdInteraction.interactionTypes.engagementSource.';\n\nconst INTERACTION_ICON_NAMES: { [key: string]: string } = {\n    apple: 'custom/amb',\n    call: 'phone',\n    callback: 'phone-callback',\n    campaign: 'phone-outbound',\n    chat: 'roster-chat',\n    discord: 'fa/discord',\n    email: 'deprecated/roster-email',\n    facebook: 'facebook',\n    facebookMessenger: 'fa/facebook-messenger',\n    glassdoor: 'custom/glassdoor',\n    google: 'fa/google',\n    instagram: 'instagram',\n    kakaoTalk: 'custom/kakaotalk',\n    line: 'fa/line',\n    linkedin: 'fa/linkedin',\n    microsoftteams: 'custom/microsoft-teams',\n    qq: 'fa/qq',\n    reddit: 'fa/reddit',\n    salesforce: 'fa/salesforce',\n    servicenow: 'custom/servicenow',\n    sms: 'legacy/roster-sms',\n    snapchat: 'fa/snapchat-solid',\n    telegram: 'fa/telegram',\n    threads: 'fa/threads',\n    trustpilot: 'custom/trustpilot',\n    twitterX: 'fa/x-twitter',\n    viber: 'fa/viber',\n    webmessaging: 'chat',\n    wechat: 'fa/weixin',\n    weibo: 'fa/weibo',\n    whatsapp: 'whatsapp',\n    workitem: 'fa/clipboard-list-regular',\n    yelp: 'fa/yelp',\n    youtube: 'fa/youtube',\n    zendesk: 'custom/zendesk'\n};\n\nexport const ENGAGEMENT_SOURCE_ICONS: InteractionIconElementType = {\n    Unspecified: {\n        iconName: defaultIcon,\n        textKey: engagementSourceBaseKey + 'unspecified'\n    },\n    AppleMessagesForBusiness: {\n        iconName: INTERACTION_ICON_NAMES.apple,\n        textKey: engagementSourceBaseKey + 'apple'\n    },\n    Discord: {\n        iconName: INTERACTION_ICON_NAMES.discord,\n        textKey: engagementSourceBaseKey + 'discord'\n    },\n    Email: {\n        iconName: INTERACTION_ICON_NAMES.email,\n        textKey: engagementSourceBaseKey + 'email'\n    },\n    Facebook: {\n        iconName: INTERACTION_ICON_NAMES.facebook,\n        textKey: engagementSourceBaseKey + 'facebook'\n    },\n    FacebookMessenger: {\n        iconName: INTERACTION_ICON_NAMES.facebookMessenger,\n        textKey: engagementSourceBaseKey + 'facebookMessenger'\n    },\n    Glassdoor: {\n        iconName: INTERACTION_ICON_NAMES.glassdoor,\n        textKey: engagementSourceBaseKey + 'glassdoor'\n    },\n    GoogleBusinessProfile: {\n        iconName: INTERACTION_ICON_NAMES.google,\n        textKey: engagementSourceBaseKey + 'googleBusinessProfile'\n    },\n    Instagram: {\n        iconName: INTERACTION_ICON_NAMES.instagram,\n        textKey: engagementSourceBaseKey + 'instagram'\n    },\n    KakaoTalk: {\n        iconName: INTERACTION_ICON_NAMES.kakaoTalk,\n        textKey: engagementSourceBaseKey + 'kakaoTalk'\n    },\n    Line: {\n        iconName: INTERACTION_ICON_NAMES.line,\n        textKey: engagementSourceBaseKey + 'line'\n    },\n    LinkedIn: {\n        iconName: INTERACTION_ICON_NAMES.linkedin,\n        textKey: engagementSourceBaseKey + 'linkedin'\n    },\n    MicrosoftTeams: {\n        iconName: INTERACTION_ICON_NAMES.microsoftteams,\n        textKey: engagementSourceBaseKey + 'teams'\n    },\n    MobileChat: {\n        iconName: defaultIcon,\n        textKey: engagementSourceBaseKey + 'mobileChat'\n    },\n    Other: {\n        iconName: defaultIcon,\n        textKey: engagementSourceBaseKey + 'other'\n    },\n    QQ: {\n        iconName: INTERACTION_ICON_NAMES.qq,\n        textKey: engagementSourceBaseKey + 'qq'\n    },\n    Reddit: {\n        iconName: INTERACTION_ICON_NAMES.reddit,\n        textKey: engagementSourceBaseKey + 'reddit'\n    },\n    ServiceNow: {\n        iconName: INTERACTION_ICON_NAMES.servicenow,\n        textKey: engagementSourceBaseKey + 'serviceNow'\n    },\n    SFDC: {\n        iconName: INTERACTION_ICON_NAMES.salesforce,\n        textKey: engagementSourceBaseKey + 'salesforce'\n    },\n    SMS: {\n        iconName: INTERACTION_ICON_NAMES.sms,\n        textKey: engagementSourceBaseKey + 'sms'\n    },\n    Snapchat: {\n        iconName: INTERACTION_ICON_NAMES.snapchat,\n        textKey: engagementSourceBaseKey + 'snapchat'\n    },\n    Telegram: {\n        iconName: INTERACTION_ICON_NAMES.telegram,\n        textKey: engagementSourceBaseKey + 'telegram'\n    },\n    Threads: {\n        iconName: INTERACTION_ICON_NAMES.threads,\n        textKey: engagementSourceBaseKey + 'threads'\n    },\n    Trustpilot: {\n        iconName: INTERACTION_ICON_NAMES.trustpilot,\n        textKey: engagementSourceBaseKey + 'trustpilot'\n    },\n    Viber: {\n        iconName: INTERACTION_ICON_NAMES.viber,\n        textKey: engagementSourceBaseKey + 'viber'\n    },\n    WebChat: {\n        iconName: defaultIcon,\n        textKey: engagementSourceBaseKey + 'webChat'\n    },\n    WeChat: {\n        iconName: INTERACTION_ICON_NAMES.wechat,\n        textKey: engagementSourceBaseKey + 'weChat'\n    },\n    Weibo: {\n        iconName: INTERACTION_ICON_NAMES.weibo,\n        textKey: engagementSourceBaseKey + 'weibo'\n    },\n    WhatsApp: {\n        iconName: INTERACTION_ICON_NAMES.whatsapp,\n        textKey: engagementSourceBaseKey + 'whatsapp'\n    },\n    X: {\n        iconName: INTERACTION_ICON_NAMES.twitterX,\n        textKey: engagementSourceBaseKey + 'twitterX'\n    },\n    Yelp: {\n        iconName: INTERACTION_ICON_NAMES.yelp,\n        textKey: engagementSourceBaseKey + 'yelp'\n    },\n    YouTube: {\n        iconName: INTERACTION_ICON_NAMES.youtube,\n        textKey: engagementSourceBaseKey + 'youtube'\n    },\n    Zendesk: {\n        iconName: INTERACTION_ICON_NAMES.zendesk,\n        textKey: engagementSourceBaseKey + 'zendesk'\n    }\n};\n\nexport function getIconName(key: Maybe<string>) {\n    if (key && ENGAGEMENT_SOURCE_ICONS[key] && ENGAGEMENT_SOURCE_ICONS[key].iconName) {\n        return ENGAGEMENT_SOURCE_ICONS[key].iconName;\n    }\n\n    return defaultIcon;\n}\n\nexport function getTextKey(key: Maybe<string>) {\n    if (key && ENGAGEMENT_SOURCE_ICONS[key] && ENGAGEMENT_SOURCE_ICONS[key].textKey) {\n        return ENGAGEMENT_SOURCE_ICONS[key].textKey;\n    }\n    // Default to 'Open Messaging Interaction'\n    return messageTypesBaseKey + 'open';\n}\n","/**\n   @desc Formats a locale in a form suitable for language label lookup on a presence definition, transforming \"en-us\" to \"en_US\" for example.\n   @param {string} locale\n   @returns {string}\n*/\nexport function formatPresenceLanguageLabelLocale(locale) {\n    if (!locale || typeof locale !== 'string') {\n        return locale;\n    }\n\n    const [localeSegment, regionSegment] = locale.split('-');\n\n    if (regionSegment) {\n        return `${localeSegment}_${regionSegment.toUpperCase()}`;\n    }\n\n    return localeSegment;\n}\n","const serverPrefix = 'server_translations';\n\nexport default function missingMessage(key, locales, suppressError) {\n    if (typeof suppressError === 'string') {\n        return suppressError;\n    } else if (!key) {\n        return '';\n    } else if (key.indexOf(serverPrefix) !== -1) {\n        // When a labelKey is typed in, it is user specified and typed in manually.\n        // Show this value rather than the full key if no translation was found.\n        return key.split('_').pop();\n    } else {\n        return key;\n    }\n}\n","export function compareJids(left, right) {\n    return left === right || getEntityObjectId(left) === getEntityObjectId(right);\n}\n\nexport function getEntityObjectId(jid) {\n    if (!jid) {\n        return '';\n    }\n\n    const jidSplit = jid.split('@');\n    return jidSplit ? jidSplit[0] : null;\n}\n\nexport function isDirectoryId(id) {\n    if (!id) {\n        return false;\n    }\n    return !!id.match(/^[a-f0-9]{24}$/);\n}\n\nexport function isPersonJid(jid) {\n    if (typeof jid !== 'string') {\n        return false;\n    }\n\n    return jid && !jid.match(/@conference/);\n}\n\nexport function isRoomJid(jid) {\n    if (typeof jid !== 'string') {\n        return false;\n    }\n\n    return jid && !!jid.match(/@conference/);\n}\n\nexport function isGroupJid(jid) {\n    if (typeof jid !== 'string') {\n        return false;\n    }\n\n    return (\n        jid &&\n        !jid.startsWith('conference-') &&\n        !jid.startsWith('videoconference-') &&\n        !!jid.match(/[a-f0-9]{24}@conference/)\n    );\n}\n\nexport function isSupervisorJid(jid) {\n    return jid && jid.startsWith('supervisorassistance');\n}\n\nexport function isAcdJid(jid) {\n    return jid && jid.startsWith('acd-');\n}\n\nexport function isScreenRecordingJid(jid) {\n    return jid && jid.startsWith('screenrecording-');\n}\n\nexport function isMeetingJid(jid) {\n    return jid && jid.startsWith('meeting-');\n}\n\nexport function isSoftphoneJid(jid) {\n    if (!jid) {\n        return false;\n    }\n    return !!jid.match(/.*@.*gjoll.*/i);\n}\n","const WHITE_SPACE_KEYCODES = {\n    TAB: 9,\n    ENTER: 13,\n    SPACE: 32\n};\n\nconst WHITE_SPACE_KEYS = {\n    TAB: 'Tab'\n};\n\nconst CAP_ALPHA_KEYCODES = {\n    A: 65,\n    B: 66,\n    C: 67,\n    D: 68,\n    E: 69,\n    F: 70,\n    G: 71,\n    H: 72,\n    I: 73,\n    J: 74,\n    K: 75,\n    L: 76,\n    M: 77,\n    N: 78,\n    O: 79,\n    P: 80,\n    Q: 81,\n    R: 82,\n    S: 83,\n    T: 84,\n    U: 85,\n    V: 86,\n    W: 87,\n    X: 88,\n    Y: 89,\n    Z: 90\n};\n\nconst LOW_ALPHA_KEYCODES = {\n    A: 97,\n    B: 98,\n    C: 99,\n    D: 100,\n    E: 101,\n    F: 102,\n    G: 103,\n    H: 104,\n    I: 105,\n    J: 106,\n    K: 107,\n    L: 108,\n    M: 109,\n    N: 110,\n    O: 111,\n    P: 112,\n    Q: 113,\n    R: 114,\n    S: 115,\n    T: 116,\n    U: 117,\n    V: 118,\n    W: 119,\n    X: 120,\n    Y: 121,\n    Z: 122\n};\n\nconst NUM_KEYCODES = {\n    0: 48,\n    1: 49,\n    2: 50,\n    3: 51,\n    4: 52,\n    5: 53,\n    6: 54,\n    7: 55,\n    8: 56,\n    9: 57\n};\n\nconst NAV_KEYCODES = {\n    LEFT_ARROW: 37,\n    UP_ARROW: 38,\n    RIGHT_ARROW: 39,\n    DOWN_ARROW: 40\n};\n\nconst ESCAPE_KEYCODE = 27;\n\ntype KeyCodeSet = { [x: string]: number };\n\nexport function keyForKeyCode(keyCode: number, object: KeyCodeSet) {\n    let key: string;\n    for (key in object) {\n        if (object.hasOwnProperty(key) && object[key] === keyCode) {\n            return key;\n        }\n    }\n    return null;\n}\n\nexport function isNumber(evt: KeyboardEvent) {\n    const keyCode = evt.keyCode;\n    return keyCode >= NUM_KEYCODES[0] && keyCode <= NUM_KEYCODES[9];\n}\n\nexport function isAlphabet(evt: KeyboardEvent) {\n    const keyCode = evt.keyCode;\n    return (\n        (keyCode >= CAP_ALPHA_KEYCODES.A && keyCode <= CAP_ALPHA_KEYCODES.Z) ||\n        (keyCode >= LOW_ALPHA_KEYCODES.A && keyCode <= LOW_ALPHA_KEYCODES.Z)\n    );\n}\n\nexport function isNavigation(evt: KeyboardEvent) {\n    const keyCode = evt.keyCode;\n    return keyCode >= NAV_KEYCODES.LEFT_ARROW && keyCode <= NAV_KEYCODES.DOWN_ARROW;\n}\n\nexport function isWhitespace(evt: KeyboardEvent) {\n    const keyCode = evt.keyCode;\n    return (\n        keyCode === WHITE_SPACE_KEYCODES.SPACE ||\n        keyCode === WHITE_SPACE_KEYCODES.ENTER ||\n        keyCode === WHITE_SPACE_KEYCODES.TAB\n    );\n}\n\nexport function isEscape(evt: KeyboardEvent) {\n    const keyCode = evt.keyCode;\n    return keyCode === ESCAPE_KEYCODE;\n}\n\nexport function isTab(evt: KeyboardEvent) {\n    const keyCode = evt.keyCode;\n    const key = evt.key;\n    return keyCode === WHITE_SPACE_KEYCODES.TAB || key === WHITE_SPACE_KEYS.TAB;\n}\n\nexport function eventToString(evt: KeyboardEvent) {\n    const keyCode = evt.keyCode;\n    if (isAlphabet(evt) || isNumber(evt)) {\n        return String.fromCharCode(keyCode);\n    } else if (isNavigation(evt)) {\n        return keyForKeyCode(keyCode, NAV_KEYCODES);\n    } else if (isWhitespace(evt)) {\n        return keyForKeyCode(keyCode, WHITE_SPACE_KEYCODES);\n    } else if (isEscape(evt)) {\n        return 'ESCAPE';\n    }\n\n    return '' + keyCode;\n}\n\nexport default {\n    isAlphabet,\n    isEscape,\n    isNavigation,\n    isNumber,\n    isTab,\n    isWhitespace,\n    eventToString\n};\n","/**\n * Options for {@link LruCache} eviction behavior.\n *\n * @template V - Value type stored in the cache.\n */\nexport type LruCacheOptions<V> = {\n    /**\n     * When evicting, entries are scanned oldest-first (LRU). The first entry for which this returns true is removed.\n     * If none return true, the oldest entry is removed anyway.\n     */\n    preferEvictWhen?: (value: V) => boolean;\n};\n\n/**\n * Least-recently-used cache with a fixed maximum size. Uses insertion order on a {@link Map} for LRU ordering.\n * {@link get} and {@link has} mark an entry as most recently used.\n *\n * @template K - Key type (must be valid {@link Map} keys).\n * @template V - Stored value type.\n */\nexport default class LruCache<K, V> {\n    private readonly data = new Map<K, V>();\n    private readonly maxSize: number;\n    private readonly preferEvictWhen: ((value: V) => boolean) | undefined;\n\n    /**\n     * @param maxSize - Maximum number of entries. Clamped to at least 2.\n     * @param options - Optional eviction preferences (see {@link LruCacheOptions}).\n     */\n    constructor(maxSize: number, options: LruCacheOptions<V> = {}) {\n        this.maxSize = Math.max(2, maxSize);\n        this.preferEvictWhen = options.preferEvictWhen;\n    }\n\n    /** Current number of entries in the cache. */\n    get size(): number {\n        return this.data.size;\n    }\n\n    /**\n     * True when the cache holds {@link maxSize} entries (after constructor clamping).\n     */\n    isAtCapacity(): boolean {\n        return this.data.size >= this.maxSize;\n    }\n\n    /**\n     * True if inserting a value for `key` would grow the logical set of keys such that an eviction\n     * must occur — i.e. the key is absent and the cache is already full. Updating an existing key\n     * returns false.\n     */\n    wouldEvictOnNewKey(key: K): boolean {\n        return !this.data.has(key) && this.data.size >= this.maxSize;\n    }\n\n    /**\n     * Moves an existing key to the end of the map (most recently used). Caller must ensure the key is present.\n     * Uses delete+set so a stored value of `undefined` is preserved (unlike branching on `get() === undefined`).\n     */\n    private _moveKeyToMru(key: K): V {\n        const value = this.data.get(key) as V;\n        this.data.delete(key);\n        this.data.set(key, value);\n        return value;\n    }\n\n    /**\n     * Chooses which key to evict: first LRU candidate matching {@link LruCacheOptions.preferEvictWhen}, else the oldest key.\n     */\n    private _pickEvictionVictim(): K | undefined {\n        if (this.preferEvictWhen) {\n            // iterate over the map and find the first key that matches the preferEvictWhen predicate, return the key\n            for (const [key, value] of this.data) {\n                if (this.preferEvictWhen(value)) {\n                    return key;\n                }\n            }\n        }\n        // iterate over the map and find the oldest key, return the key\n        const first = this.data.keys().next();\n        // should never be done since maxSize is at least 2, but done for safety\n        return first.done ? undefined : first.value;\n    }\n\n    /** Removes entries until size is at most the configured maximum. */\n    private _evictWhileOverMax(): void {\n        // iterate over the map and delete the oldest key until the size is at most the configured maximum\n        while (this.data.size > this.maxSize) {\n            const victim = this._pickEvictionVictim();\n            if (victim === undefined) {\n                break;\n            }\n            // delete the oldest key\n            this.data.delete(victim);\n        }\n    }\n\n    /**\n     * @param key - Lookup key.\n     * @returns Whether the key exists; if so, the entry is touched (moved to most-recently-used).\n     */\n    has(key: K): boolean {\n        if (!this.data.has(key)) {\n            return false;\n        }\n        // move the key to the end of the map so it counts as most recently used\n        this._moveKeyToMru(key);\n        return true;\n    }\n\n    /**\n     * @param key - Lookup key.\n     * @returns The value if present, otherwise `undefined`. Missing keys and keys whose stored value\n     *   is `undefined` are distinguished via {@link Map.prototype.has}. Existing entries are touched (MRU).\n     */\n    get(key: K): V | undefined {\n        if (!this.data.has(key)) {\n            return undefined;\n        }\n        return this._moveKeyToMru(key);\n    }\n\n    /**\n     * Inserts or updates an entry. May evict older entries when size would exceed the configured maximum.\n     *\n     * @param key - Cache key.\n     * @param value - Value to store.\n     */\n    set(key: K, value: V): void {\n        if (this.data.has(key)) {\n            this.data.delete(key);\n        }\n        this.data.set(key, value);\n        this._evictWhileOverMax();\n    }\n\n    /**\n     * @param key - Key to remove.\n     * @returns `true` if an entry was removed.\n     */\n    delete(key: K): boolean {\n        return this.data.delete(key);\n    }\n\n    /** Removes all entries. */\n    clear(): void {\n        this.data.clear();\n    }\n}\n","import { COMMUNICATION_TYPE_SINGULAR } from 'web-directory/utils/acd-ts';\nimport { MESSAGING_SUBTYPES } from 'web-directory/utils/supported-messaging-subtypes';\n\nexport const MainstageSizes = ['small', 'medium', 'large', 'xlarge'] as const;\n\nexport type MainstageSize = (typeof MainstageSizes)[number];\n\nexport const MainstageSizeIcons: Record<string, string> = {\n    small: 'custom/panel-small-regular',\n    medium: 'custom/panel-medium-regular',\n    large: 'custom/panel-large-regular',\n    xlarge: 'custom/panel-extra-large-regular'\n};\n\nexport const MAINSTAGE_LAYOUT_STORAGE_KEY_INTERACTION_TYPES = new Set([\n    'workitem',\n    'analyticsConversation',\n    'externalContact',\n    ...COMMUNICATION_TYPE_SINGULAR,\n    ...MESSAGING_SUBTYPES\n]);\n\nexport type MainstageLayout = {\n    mainstageSize: MainstageSize;\n    mainstageCollapsed: boolean;\n    mainstageFocused: boolean;\n};\n\n/**\n * Hard default applied when neither an ephemeral entry nor a persisted preference exists.\n */\nexport const DEFAULT_MAINSTAGE_LAYOUT: MainstageLayout = {\n    mainstageSize: 'medium',\n    mainstageCollapsed: false,\n    mainstageFocused: false\n};\n\n/**\n * Preference namespace shared with the legacy interaction panel. Persisted layout defaults are stored\n * under `agentUiMainstage.<interactionType>`.\n */\nexport const MAINSTAGE_PREFERENCE_NAMESPACE = 'agentUiMainstage';\n\n/**\n * Validates and normalizes an unknown value into a `MainstageLayout`, defaulting any missing or\n * invalid field. Mirrors the legacy acd-interactions-panel-v2/interaction component's validation so both the legacy and Modes\n * paths agree on the shared persisted key space.\n *\n * @param toCheck The value to validate (e.g. a stored preference or ephemeral entry).\n * @param defaultLayout The layout to fall back to for missing/invalid fields.\n * @returns A fully-populated, valid `MainstageLayout`.\n */\nexport function buildValidMainstageLayout(\n    toCheck: unknown,\n    defaultLayout: MainstageLayout = DEFAULT_MAINSTAGE_LAYOUT\n): MainstageLayout {\n    if (typeof toCheck !== 'object' || toCheck === null) {\n        return { ...defaultLayout };\n    }\n\n    const result: MainstageLayout = { ...defaultLayout };\n    const candidate = toCheck as Partial<MainstageLayout>;\n\n    if (\n        typeof candidate.mainstageSize === 'string' &&\n        (MainstageSizes as readonly string[]).includes(candidate.mainstageSize)\n    ) {\n        result.mainstageSize = candidate.mainstageSize as MainstageSize;\n    }\n    if (typeof candidate.mainstageCollapsed === 'boolean') {\n        result.mainstageCollapsed = candidate.mainstageCollapsed;\n    }\n    if (typeof candidate.mainstageFocused === 'boolean') {\n        result.mainstageFocused = candidate.mainstageFocused;\n    }\n\n    return result;\n}\n\n/**\n * Ephemeral (in-session) cache key for a single item: `<id>.<interactionType>`.\n */\nexport function ephemeralMainstageKey(id: string, interactionType: string): string {\n    return `${id}.${interactionType}`;\n}\n\n/**\n * Persistent preference key for a media/interaction type: `agentUiMainstage.<interactionType>`.\n */\nexport function persistentMainstageKey(interactionType: string): string {\n    return `${MAINSTAGE_PREFERENCE_NAMESPACE}.${interactionType}`;\n}\n\n/**\n * Builds the telemetry payload for the `acdAgentUiMultipanelMainstageUserResize` page action,\n * preserving the legacy key shape so existing dashboards continue to work.\n */\nexport function buildMainstageResizePageAction(input: {\n    userId: string;\n    interactionId: string;\n    interactionType: string;\n    prev?: Partial<MainstageLayout>;\n    next: MainstageLayout;\n}): Record<string, unknown> {\n    const { userId, interactionId, interactionType, prev, next } = input;\n    return {\n        userId,\n        interactionId,\n        interactionType,\n        prevSize: prev?.mainstageSize,\n        prevCollapsedState: prev?.mainstageCollapsed,\n        prevFocusedState: prev?.mainstageFocused,\n        newSize: next.mainstageSize,\n        newCollapsedState: next.mainstageCollapsed,\n        newFocusedState: next.mainstageFocused\n    };\n}\n","const markdown = window.markdownit;\n\nconst md = markdown({\n    html: false,\n    linkify: true,\n    typographer: false\n});\n\nfunction isMailTo(href) {\n    return href.indexOf('mailto:') === 0;\n}\n\nfunction initializeMarkdownRendering(isApplicationRoute) {\n    const defaultRender =\n        md.renderer.rules.link_open ||\n        function (tokens, idx, options, env, self) {\n            return self.renderToken(tokens, idx, options);\n        };\n\n    md.renderer.rules.link_open = function (tokens, idx, options, env, self) {\n        const token = tokens[idx];\n        const targetIndex = token.attrIndex('href');\n        if (targetIndex !== -1) {\n            let href = token.attrGet('href');\n            if (!isApplicationRoute(href) && !isMailTo(href)) {\n                token.attrPush(['target', '_blank']);\n                token.attrPush(['rel', 'noopener noreferrer']);\n\n                const pattern = /:\\/\\//i;\n                if (!pattern.test(href)) {\n                    token.attrSet('href', `http://${href}`);\n                }\n            }\n        }\n\n        // pass token to default renderer.\n        return defaultRender(tokens, idx, options, env, self);\n    };\n}\n\nfunction markdownToHtml(markdown) {\n    return markdown ? md.render(markdown) : '';\n}\n\nexport { markdownToHtml, initializeMarkdownRendering };\n","import { typeOf } from '@ember/utils';\nimport Ember from 'ember';\n\n/**\n * Returns the first top-level menu item found that should be considered active.\n *\n * The initial pass will be a DFS of the top-level items and decendents looking for an\n * active match based on the menu item route or url properties (both are considered active\n * if they are the active route or a parent of the active route).\n *\n * If no suitable active menu item is found, a path-based search will be performed.\n * This will use the paths associated to top-level menu items specified in\n * menuItemBasePathsMap or the route's effective URL otherwise.\n *\n * @param {array} menu an array of top-level menu items containing 0 or more child menu items.\n * @param {*} The Ember router instance\n * @param {object} options\n * @param {object.menuItemBasePathsMap} a map of top-level menu item instances to an array of string paths.\n *   If you wish to opt out of path matching for a given top-level menu item, provide an empty array for it.\n * @returns the first-located top-level menu item that should be marked as active.\n */\nexport function getActiveTopLevelMenuItem(menu, router, { menuItemBasePathsMap } = {}) {\n    if (!menu || typeOf(menu) !== 'array' || !router) {\n        logError('Invalid menu or router');\n        return null;\n    }\n\n    try {\n        assertValidRouter(router);\n    } catch (e) {\n        logError('Invalid router shape', { e, remoteData: { reason: e.message } });\n        return null;\n    }\n\n    const definitiveMatch = menu.find(curr => isMenuBranchActive(curr, router)) || null;\n\n    if (definitiveMatch) {\n        return definitiveMatch;\n    }\n\n    return menu.find(curr => isMenuBranchActivePathRoot(curr, router, menuItemBasePathsMap)) || null;\n}\n\nfunction isMenuBranchActive(topLevelMenuItem, router) {\n    const menuItemType = typeOf(topLevelMenuItem);\n    if (!isObjectOrInstanceType(menuItemType)) {\n        logWarn('Invalid top level menu item type', { remoteData: { type: menuItemType } });\n        return false;\n    }\n\n    const { className, label, children } = topLevelMenuItem;\n\n    if (children) {\n        if (typeOf(children) !== 'array') {\n            logWarn('Top Level Menu Item children prop is not an array', { label, remoteData: { className } });\n            return false;\n        }\n\n        return children.find(curr => isLeafMenuItemActive(curr, router)) || false;\n    }\n\n    return isLeafMenuItemActive(topLevelMenuItem, router);\n}\n\nfunction isLeafMenuItemActive(menuItem, router) {\n    const menuItemType = typeOf(menuItem);\n    if (!isObjectOrInstanceType(menuItemType)) {\n        logWarn('Invalid leaf menu item type', { remoteData: { type: menuItemType } });\n        return false;\n    }\n\n    const { className, label, route, url } = menuItem;\n\n    if (route) {\n        try {\n            return isEmberRouteActive(route, router);\n        } catch (e) {\n            logWarn('Failed while checking ember route active state', { label, error: e, remoteData: { className } });\n            return false;\n        }\n    } else if (url) {\n        if (typeOf(url) !== 'string') {\n            logWarn('Menu Item URL is not a string', { label, remoteData: { className } });\n            return false;\n        }\n\n        return formatRoutePath(router.currentURL).startsWith(formatRoutePath(url));\n    } else {\n        logWarn('Unknown Menu Item Type', { label, remoteData: { className } });\n        return false;\n    }\n}\n\nfunction isEmberRouteActive(route, router) {\n    let routeType = typeOf(route);\n    if (routeType === 'string') {\n        return router.isActive(route);\n    } else if (routeType === 'object' && route.name) {\n        try {\n            return router.isActive(route.name, route.segment);\n        } catch (_) {\n            // The isActive call can fail if the incorrect models and segments are passed for a route\n            throw new Error('isActive check failed');\n        }\n    } else {\n        throw new Error('Unexpected Ember Route payload');\n    }\n}\n\nfunction isMenuBranchActivePathRoot(topLevelMenuItem, router, menuItemBasePathsMap) {\n    const menuItemType = typeOf(topLevelMenuItem);\n    if (!isObjectOrInstanceType(menuItemType)) {\n        logWarn('Invalid top level menu item type', { remoteData: { type: menuItemType } });\n        return false;\n    }\n\n    const { className, label } = topLevelMenuItem;\n\n    try {\n        const basePaths = getMenuItemBasePaths(topLevelMenuItem, router, menuItemBasePathsMap);\n        if (basePaths.length === 0) {\n            return false;\n        }\n\n        return basePaths.some(currBasePath =>\n            formatRoutePath(router.currentURL).startsWith(formatRoutePath(currBasePath))\n        );\n    } catch (e) {\n        logWarn('Failed to get basePaths for top-level menu item', { label, error: e, remoteData: { className } });\n        return false;\n    }\n}\n\nfunction getMenuItemBasePaths(topLevelMenuItem, router, menuItemBasePathsMap) {\n    if (menuItemBasePathsMap && menuItemBasePathsMap.has(topLevelMenuItem)) {\n        return menuItemBasePathsMap.get(topLevelMenuItem);\n    }\n\n    // IFC Routes contain two logical, but non-hierarchical routes and one path namespace.\n    // top-level menus configured for ifcFoo won't match ifcFoo.internal\n    // Utilizing the url of the ember route can support this without the need for explicit path mapping.\n\n    // There are likely other cases where this path approach is helpful.\n\n    const { route } = topLevelMenuItem;\n    if (route) {\n        let genUrlFn = router.urlFor;\n        if (typeOf(genUrlFn) !== 'function') {\n            genUrlFn = router.generate;\n        }\n        if (typeOf(genUrlFn) !== 'function') {\n            throw new Error('URL generation function unavailable');\n        }\n\n        const genUrlArgs = [];\n\n        const routeType = typeOf(route);\n        if (routeType === 'string') {\n            genUrlArgs.push(route);\n        } else if (isObjectOrInstanceType(routeType)) {\n            if (typeOf(route.name) !== 'string') {\n                throw new Error('Route name unavailable');\n            }\n            genUrlArgs.push(route.name);\n\n            if (route.segment) {\n                genUrlArgs.push(route.segment);\n            }\n        } else {\n            throw new Error('Unknown Menu Item Type');\n        }\n\n        return [genUrlFn.apply(router, genUrlArgs)];\n    }\n\n    /*\n     * No need to check the url as a basePath here.\n     * The url check in isLeafMenuItemActive will have already handled this for\n     * menu items using url.\n     */\n    return [];\n}\n\nfunction formatRoutePath(baseRoutePath, prefix = '#') {\n    if (baseRoutePath.slice(0, prefix.length) !== prefix) {\n        return `${prefix}${baseRoutePath}`;\n    }\n\n    return baseRoutePath;\n}\n\nfunction isObjectOrInstance(toCheck) {\n    return isObjectOrInstanceType(typeOf(toCheck));\n}\n\nfunction isObjectOrInstanceType(type) {\n    return ['object', 'instance'].includes(type);\n}\n\nfunction logError(msg, ...logData) {\n    log('error', msg, ...logData);\n}\n\nfunction logWarn(msg, ...logData) {\n    log('warn', msg, ...logData);\n}\n\nfunction log(level, msg, ...logData) {\n    Ember.Logger[level](`Menu - Active Selection - ${msg}`, ...logData);\n}\n\nfunction assertValidRouter(router) {\n    if (!isObjectOrInstance(router)) {\n        throw new Error('invalid router type');\n    }\n\n    if (typeOf(router.currentURL) !== 'string') {\n        throw new Error('router.currentURL must be a string');\n    }\n\n    if (typeOf(router.isActive) !== 'function') {\n        throw new Error('router.isActive must be a function');\n    }\n\n    if (typeOf(router.urlFor) !== 'function' && typeOf(router.generate) !== 'function') {\n        throw new Error('router must container either a urlFor or generate function');\n    }\n}\n","/* global intlTelInputUtils */\n\nimport { getMessengerType, getDisplayableName, getIdentifier } from './external-contact-messaging';\n\n/**\n * A list of all the available messaging channel types in the external contact model\n */\n\nfunction getNameFrom(interaction) {\n    return interaction.get('participantForCustomer.messages.firstObject.fromAddress.name');\n}\n\nfunction getTwitterDisplayNameFrom(interaction) {\n    return (\n        getDisplayableName(interaction) ||\n        interaction.get('participantForCustomer.messages.firstObject.fromAddress.name')\n    );\n}\n\nfunction getRawAddress(interaction) {\n    return interaction && interaction.get('participantForCustomer.messages.firstObject.fromAddress.addressRaw');\n}\n\nexport function getDisplayOrScreenName(interaction) {\n    if (!interaction) {\n        return null;\n    }\n    const messagingChannelType = messagingChannelTypeFor(getMessengerType(interaction));\n    return messagingChannelType && getNameFrom(interaction);\n}\n\n// Returns an object representing a channel property of an Ember DS contact model instance.\n// E.g. messagingChannelTypes[0].modelProperties(...)\nfunction getModelProperties(channelId, idProperties) {\n    const properties = {};\n    properties[channelId] = idProperties;\n    return properties;\n}\n\nexport function messagingChannelTypeFor(messageType) {\n    return messagingChannelTypes.find(messagingChannelType => messagingChannelType.type === messageType);\n}\n\nexport function modelKeyFor(messageType) {\n    const messagingChannelType = messagingChannelTypeFor(messageType);\n    return messagingChannelType ? messagingChannelType.modelKey : null;\n}\n\n// New message channel types must expose a `modelProperties` method that\n// creates an object whose structure is the same as that for that message channel's identifier\n// field in a contact model object.\n//\n// For example, a contact model instance with a Twitter channel looks like this:\n//      {\n//          id: 'df445345abdc',\n//          firstName: 'Elon',\n//          lastName: 'Musk',\n//          address: {\n//                      ...\n//                   }\n//          ...\n//          twitterId: {\n//              id: 'df445345abdc',\n//              name: 'Elon Musk'\n//              screenName: '@elonmusk\n//          }\n//          ...\n//      }\n//\n//     Thus,\n//          messagingChannelTypes.modelProperties('df445345abdc', 'Elon Musk', '@elonmusk')\n//     for a Twitter channel will return\n//          {\n//              twitterId: {\n//                  id: 'df445345abdc',\n//                  name: 'Elon Musk'\n//                  screenName: '@elonmusk\n//             }\n//          }\n//\n\n// The contacts-service returns a displayable phone number, while Smooch may send\n// an e164.  Use this to hopefully match them up.\nexport function getDisplayablePhoneNumberFrom(phoneNumber) {\n    // Assume a US country code;\n    // obviously a short-term kludge that will be unnecessary when the real bug is (hopefully quickly) fixed!\n    return intlTelInputUtils.formatNumber(phoneNumber, 'US', intlTelInputUtils.numberFormat.INTERNATIONAL);\n}\n\nfunction _getChannelPropertiesFromInteraction(interaction, channelType) {\n    const messagingChannelType = messagingChannelTypeFor(channelType);\n\n    const id = getIdentifier(interaction);\n    const displayableName = getDisplayableName(interaction);\n    const name = getDisplayableName(interaction);\n    return messagingChannelType.modelProperties(id, name, displayableName);\n}\n\n// The array of objects below represent the various inbound messaging channels.\n// The properties and functions exposed by message channel types are used for display purposes and other things.\n//\n//\n// For the hasCrucialChannelInfo functions: they should return true iff their condition holds, in service of\n// https://inindca.atlassian.net/browse/RELATE-2536: WhatsApp ACD: Allow the ACD UI to tolerate missing inbound message channel information\n//\n// \"The ACD UI should be aware of and behave tolerably in response to Smooch's updating their messaging protocol and payload, and the consequential\n// implication for possibly missing channel property values (e.g. a missing Twitter ID or handle).\"\n//\n// Although missing information should happen very rarely, the UI still needs to cope. The coping strategy is the same for any message type.\n// There are two cases:\n//\n// 1) The agent is creating a new external contact for an inbound message. The UI should not automatically populate any messaging fields.\n// Whatever info the agent supplies for the contact should be accepted and saved.\n//\n// 2) The agent has an existing contact to associate with the message. Because the message may be missing crucial information, the contact\n// is not automatically updated with the new/incomplete message channel information.\nexport const messagingChannelTypes = [\n    {\n        modelKey: 'twitterId', // The Ember DS externalcontacts/contact model's\n        channelId: 'id',\n        type: 'twitter',\n        idPropertyName: null,\n        modelProperties: function (id, name, twitterHandle) {\n            return getModelProperties(this.modelKey, {\n                id: id,\n                name: name,\n                screenName: twitterHandle\n            });\n        },\n        getReverseWhitepagesLookupValue: getRawAddress,\n        getChannelPropertiesFromExternalContact: externalContact => [externalContact.get('twitterId')],\n        getChannelPropertiesFromInteraction: interaction =>\n            _getChannelPropertiesFromInteraction(interaction, 'twitter'),\n        getIdsFromExternalContact: externalContact => [externalContact.get('twitterId.id')],\n        getIdFrom: id => id,\n        display: channelId => (channelId ? (channelId.screenName ? channelId.screenName : '') : ''),\n        present: channelId => !!(channelId && channelId.screenName),\n        hasCrucialChannelInfo: channelId => !!(channelId && channelId.id && channelId.screenName),\n        displayNameFrom: interaction => getTwitterDisplayNameFrom(interaction),\n        isNewId: (ids, id) => !ids || ids.length !== 1 || ids[0] !== id, // ids is null or a single-element string array with a Twitter ID\n        svgIconKey: '#icon-twitter-white-on-blue'\n    },\n    {\n        modelKey: 'lineId',\n        channelId: 'ids',\n        type: 'line',\n        idPropertyName: 'userId',\n        modelProperties: function (userId, displayName) {\n            return getModelProperties(this.modelKey, {\n                ids: [{ userId: userId }],\n                displayName: displayName\n            });\n        },\n        getReverseWhitepagesLookupValue: getRawAddress,\n        getChannelPropertiesFromExternalContact: externalContact => [externalContact.get('lineId')],\n        getChannelPropertiesFromInteraction: interaction => _getChannelPropertiesFromInteraction(interaction, 'line'),\n        getIdsFromExternalContact: externalContact => externalContact.get('lineId.ids'),\n        getIdFrom: userId => {\n            return {\n                userId: userId\n            };\n        },\n        display: channelId => (channelId.displayName ? channelId.displayName : ''),\n        present: channelId => !!(channelId && channelId.ids),\n        hasCrucialChannelInfo: channelId => !!(channelId && channelId.ids && channelId.ids.every(id => id.userId)),\n        displayNameFrom: interaction => getDisplayOrScreenName(interaction),\n        isNewId: (ids, id) => ids && ids.some(lineId => lineId.userId !== id),\n        svgIconKey: '#icon-line-messenger'\n    },\n    {\n        modelKey: 'facebookId',\n        channelId: 'ids',\n        type: 'facebook',\n        idPropertyName: 'scopedId',\n        modelProperties: function (userId, displayName) {\n            return getModelProperties(this.modelKey, {\n                ids: [{ scopedId: userId }],\n                displayName: displayName\n            });\n        },\n        getReverseWhitepagesLookupValue: getRawAddress,\n        getChannelPropertiesFromExternalContact: externalContact => [externalContact.get('facebookId')],\n        getChannelPropertiesFromInteraction: interaction =>\n            _getChannelPropertiesFromInteraction(interaction, 'facebook'),\n        getIdsFromExternalContact: externalContact => externalContact.get('facebookId.ids'),\n        getIdFrom: scopedId => {\n            return {\n                scopedId: scopedId\n            };\n        },\n        display: channelId => (channelId.displayName ? channelId.displayName : ''),\n        present: channelId => !!(channelId && channelId.ids),\n        hasCrucialChannelInfo: channelId => !!(channelId && channelId.ids && channelId.ids.every(id => id.scopedId)),\n        displayNameFrom: interaction => getDisplayOrScreenName(interaction),\n        isNewId: (ids, id) => ids && ids.some(facebookId => facebookId.scopedId !== id),\n        svgIconKey: '#icon-facebook-messenger'\n    },\n    {\n        modelKey: 'whatsAppId',\n        channelId: 'phoneNumber',\n        nestedIdProperty: 'display',\n        type: 'whatsapp',\n        idPropertyName: null,\n        modelProperties: function (phoneNumber, displayName) {\n            return getModelProperties(this.modelKey, {\n                displayName: displayName,\n                phoneNumber: {\n                    display: getDisplayablePhoneNumberFrom(phoneNumber)\n                }\n            });\n        },\n        getReverseWhitepagesLookupValue: interaction => {\n            const address = getRawAddress(interaction);\n            if (address && /^\\+?[\\d]+$/.test(address)) {\n                return /^\\+/gi.test(address) ? address : `+${address}`;\n            }\n            return address;\n        },\n        getChannelPropertiesFromExternalContact: externalContact => [externalContact.get('whatsAppId')],\n        getChannelPropertiesFromInteraction: interaction =>\n            _getChannelPropertiesFromInteraction(interaction, 'whatsapp'),\n        getIdsFromExternalContact: externalContact => [externalContact.get('whatsAppId.phoneNumber')],\n        getIdFrom: phoneNumber => {\n            return {\n                display: getDisplayablePhoneNumberFrom(phoneNumber)\n            };\n        },\n        display: channelId =>\n            channelId.displayName\n                ? channelId.displayName\n                : channelId.phoneNumber.display\n                ? channelId.phoneNumber.display\n                : channelId.phoneNumber.e164\n                ? channelId.phoneNumber.e164\n                : '',\n        present: channelId => !!(channelId && channelId.phoneNumber),\n        hasCrucialChannelInfo: channelId => !!(channelId && channelId.phoneNumber && channelId.phoneNumber.display),\n        displayNameFrom: interaction => getDisplayOrScreenName(interaction),\n\n        // These two value getters are used by the confirmation-prompt component to\n        // get changes to a whatpsapp channel's displayed phone number in order to prompt\n        // the agent properly.\n        oldIdValue: (channelId, changedAttributes) => changedAttributes[`${channelId}`][0].display,\n        newIdValue: (channelId, changedAttributes) => changedAttributes[`${channelId}`][1].display,\n\n        isNewId: (ids, id) => !ids || ids.length !== 1 || ids[0] !== id, // ids is null, or a single-element string array containing an e164 phone number; id is an e164 number\n        svgIconKey: '#icon-whatsapp'\n    }\n];\n","/**\n * Converts modal data object to a query string format\n * @param modalData - Object containing modal data to convert\n * @returns Query string starting with '?' or empty string if modalData is not an object\n */\nexport function modalDataToQueryString(modalData: any): string {\n    if (typeof modalData === 'object' && modalData !== null) {\n        let route = '?';\n        route += Object.entries(modalData)\n            .map(([key, value]) => {\n                let valueStr = value;\n                if (typeof value === 'object') {\n                    valueStr = JSON.stringify(value);\n                }\n                return `${key}=${valueStr}`;\n            })\n            .join('&');\n        return route;\n    }\n    return '';\n}\n","// eslint-disable-next-line no-control-regex\nconst OnlyLatinChars = /^[\\u0000-\\u024F\\s]+$/i;\n\n/**\n * Determines if the provided name can have initials generated from it. Not all languages support\n * the ability to reduce a name to initials, such as Latin.\n *\n * @note\n * The currently unsupported characters are:\n * - Latin\n *\n * @param name the name to test with\n * @returns boolean value depicting if initials can be generated\n */\nexport function initialsSupported(name: string) {\n    return OnlyLatinChars.test(name);\n}\n\n/**\n * Generates the initials from a given name. If initials are not supported based on the characters of\n * the name provided then `null` will be returned.\n *\n * @note\n * This will adhere to a name string that has been formatted by a comma such as \"Last, First\" and will give\n * the correct initials of \"FL\" (for that instance).\n *\n * @param name the name of the initials in which to generate from\n * @returns the generated initials from the provided name, if none could be generated then `null` is returned\n */\nexport function getInitials(name: string) {\n    if (!initialsSupported(name)) return null;\n\n    const commaIndex = name.indexOf(',') > -1;\n    const spaceIndex = name.indexOf(' ') > -1;\n    const left = name[0].toUpperCase();\n    const right = name.charAt(name.indexOf(' ') + 1).toUpperCase();\n\n    if (commaIndex) {\n        return right + left;\n    } else if (!spaceIndex) {\n        return left;\n    }\n    return left + right;\n}\n","import { buildSymbolMap } from 'web-directory/utils/boolean-expressions';\nimport { PermissionsService, SessionService } from '@web-directory/services';\n\nexport function evaluateProviderExpression(expr: string, permissions: PermissionsService, session: SessionService) {\n    return buildSymbolMap(expr, {\n        ft: (keyName: string) => {\n            const features = session.features || [];\n            return !!features[keyName];\n        },\n        perm: (keyName: string) => {\n            return permissions.validateDonutPermission(keyName) || permissions.validateDirectoryPermission(keyName);\n        },\n        bool: (keyName: string) => {\n            return keyName === 'true';\n        },\n        role: (keyName: string) => {\n            const roles = session.get('roleNames') || [];\n            return roles.indexOf(keyName) > -1;\n        }\n    });\n}\n","import serviceDiscovery from '@genesys/service-discovery-web-internal';\nexport const PRODUCTION_LIKE_ENVS = ['prod', 'fedramp', 'eusc'];\n\nconst VALID_LOCAL_HOSTNAMES = ['localhost', 'localhost.mypurecloud.com'];\n\nconst ENV_TRANSITIONS = {\n    dev: 'dca',\n    test: 'tca',\n    prod: 'pca'\n    // DO NOT ADD NEW ENVS HERE\n    // New envs will be defaulted to their true value in service-discovery-web\n};\n\nconst DEPLOYMENT_ID_MAP = {\n    dev: 'dca',\n    test: 'tca',\n    prod: 'us',\n    'prod-apne1': 'jp',\n    'prod-apne2': 'apne2',\n    'prod-aps1': 'aps1',\n    'prod-apse2': 'au',\n    'prod-cac1': 'cac1',\n    'prod-euc1': 'de',\n    'prod-euw1': 'ie',\n    'prod-euw2': 'euw2',\n    'prod-usw2': 'usw2'\n    // DO NOT ADD NEW REGIONS HERE\n    // New regions will be defaulted to their name in service-discovery-web\n};\n\nconst REGION_TRANSLATION_KEY_MAP = {\n    prod: 'components.region.global',\n    'prod-apne1': 'components.region.japan',\n    'prod-apne2': 'components.region.apne2',\n    'prod-aps1': 'components.region.aps1',\n    'prod-apse2': 'components.region.australia',\n    'prod-cac1': 'components.region.cac1',\n    'prod-euc1': 'components.region.germany',\n    'prod-euw1': 'components.region.ireland',\n    'prod-euw2': 'components.region.euw2',\n    'prod-usw2': 'components.region.usw2'\n    // DO NOT ADD NEW REGIONS HERE\n    // New regions will be defaulted to 'name': `components.region.${name}`\n};\n\nconst DEFAULT_GC_APP_SUBDOMAIN = 'apps';\n// TODO: Remove app and app-regional test subdomains when they are no longer needed\nconst SUPPORTED_GC_APP_SUBDOMAINS = [DEFAULT_GC_APP_SUBDOMAIN, 'app', 'app-regional'];\n\nconst getPcApplicationsSubdomain = (_window = window) => {\n    // window passed in for testing\n    let subdomain = _window.location.hostname.split('.')[0];\n\n    if (!subdomain || typeof subdomain !== 'string') {\n        return DEFAULT_GC_APP_SUBDOMAIN;\n    }\n\n    subdomain = subdomain.toLowerCase();\n    return SUPPORTED_GC_APP_SUBDOMAINS.find(curr => curr === subdomain) || DEFAULT_GC_APP_SUBDOMAIN;\n};\n\nconst getEnv = ({ env }) => ENV_TRANSITIONS[env] || env;\nconst getRegion = ({ name, region }) => DEPLOYMENT_ID_MAP[name] || region;\nconst getDeploymentId = ({ name }) => DEPLOYMENT_ID_MAP[name] || name;\nconst getRegionTranslationKey = ({ name }) => REGION_TRANSLATION_KEY_MAP[name] || `components.region.${name}`;\nconst getDesktopId = environment => {\n    const deploymentId = getDeploymentId(environment);\n    return deploymentId === 'us' ? 'global' : deploymentId;\n};\n\nconst publicEnvFilter = { env: [...PRODUCTION_LIKE_ENVS], status: ['beta', 'stable'] };\nexport const PUBLIC_ENVS = serviceDiscovery.getEnvironments(publicEnvFilter).map(environment => ({\n    id: getDeploymentId(environment),\n    desktopId: getDesktopId(environment),\n    region: getRegion(environment),\n    translationKey: getRegionTranslationKey(environment),\n    env: getEnv(environment),\n    envTld: environment.publicDomainName,\n    envStatus: environment.status\n}));\n\nexport const STABLE_PUBLIC_ENVS = serviceDiscovery.getEnvironments().map(environment => ({\n    id: getDeploymentId(environment),\n    desktopId: getDesktopId(environment),\n    region: getRegion(environment),\n    translationKey: getRegionTranslationKey(environment),\n    env: getEnv(environment),\n    envTld: environment.publicDomainName\n}));\n\nexport const parseRuntimeCustom = (url = window.location.href) => {\n    return (\n        serviceDiscovery.parseRuntimeFromLocalPath(VALID_LOCAL_HOSTNAMES)(url) ||\n        serviceDiscovery.parseDeployedRuntime(url)\n    );\n};\n\nexport const getEnvDetails = (url = window.location.href) => {\n    if (!url || typeof url !== 'string') throw new Error('url must be a non-empty string');\n    const runtime = parseRuntimeCustom(url);\n    if (!runtime) throw new Error(`'${url}' is not a valid, known Genesys Cloud app location`);\n    return {\n        runtime, // Attach the service-discovery-web runtime\n        local: runtime.local,\n        envTld: runtime.local ? new URL(url).hostname : runtime.currentDomainName,\n        env: getEnv(runtime),\n        region: PRODUCTION_LIKE_ENVS.includes(runtime.env) ? getRegion(runtime) : null\n    };\n};\n\nexport const getEnvCookieDomain = (hostname = window.location.hostname) => {\n    if (!hostname || typeof hostname !== 'string') {\n        throw new Error('hostname must be a non-empty string');\n    }\n    // Handle the local special cases\n    if (hostname === 'localhost') return '';\n    if (hostname === 'localhost.mypurecloud.com') return `.localhost.mypurecloud.com`;\n\n    const result = serviceDiscovery.parseDeployedRuntime(`https://${hostname}`);\n    if (!result) throw new Error(`'${hostname}' is not a valid, known Genesys Cloud app location`);\n    return `.${result.currentDomainName}`;\n};\n\nexport const isExternalDomain = url => !serviceDiscovery.isKnown(url, {});\n\nexport const getCurrentWindowOrigin = () => window.location.origin;\n\nexport default {\n    PUBLIC_ENVS,\n    STABLE_PUBLIC_ENVS,\n    getPcApplicationsSubdomain,\n    getEnvDetails,\n    getEnvCookieDomain,\n    isExternalDomain,\n    getCurrentWindowOrigin\n};\n","/*\n * This is a simple wrapper for New Relic's browser agent.  The goal is to no-op\n * when the browser agent is not available on the page (due to adblockers,\n * unit-tests, etc).\n */\n\nfunction addPageAction(actionName: string, attributes?: null | Record<string, any>) {\n    if (\n        window &&\n        'newrelic' in window &&\n        window.newrelic &&\n        typeof window.newrelic === 'object' &&\n        'addPageAction' in window.newrelic &&\n        typeof window.newrelic.addPageAction === 'function'\n    ) {\n        if (typeof actionName !== 'string' || !actionName.trim()) {\n            //actionName cannot be an empty string\n            console.error('Invalid actionName for addPageAction ->', {\n                remoteData: {\n                    actionName,\n                    actionNameType: typeof actionName\n                }\n            });\n            return;\n        }\n        if (attributes !== undefined && attributes !== null) {\n            // if not null and not undefined, attributes can be null/undefined\n            if (typeof attributes !== 'object' || Array.isArray(attributes)) {\n                console.error('Invalid attributes for addPageAction ->', {\n                    remoteData: {\n                        actionName,\n                        attrType: typeof attributes\n                    }\n                });\n                return;\n            } else {\n                const reservedKeys = ['accountId', 'appId'];\n                attributes = Object.fromEntries(\n                    Object.entries(attributes)\n                        .map<[string, any] | null>(([key, value]) => {\n                            if (reservedKeys.includes(key)) {\n                                console.warn('Invalid reserved keys for addPageAction ->', {\n                                    remoteData: {\n                                        actionName,\n                                        attrKey: key\n                                    }\n                                });\n                                return null;\n                            }\n\n                            if (key === 'timestamp') {\n                                if (typeof value !== 'number') {\n                                    console.warn('Invalid timestamp type for addPageAction ->', {\n                                        remoteData: {\n                                            actionName,\n                                            attrKey: key,\n                                            attrValueType: typeof value\n                                        }\n                                    });\n                                    return null;\n                                }\n                                const nowDate = Date.now();\n                                const oneDayMs = 24 * 60 * 60 * 1000;\n                                const timestampMs = value > 1e12 ? value : value * 1000;\n                                const givenDate = new Date(timestampMs);\n                                if (!isNaN(givenDate.getTime()) && Math.abs(nowDate - timestampMs) <= oneDayMs) {\n                                    return [key, value];\n                                }\n                                console.warn('Invalid timestamp range for addPageAction ->', {\n                                    remoteData: {\n                                        actionName,\n                                        attrKey: key\n                                    }\n                                });\n                                return null;\n                            }\n                            return [key, value];\n                        })\n                        .filter((curr): curr is [string, any] => {\n                            return !!curr;\n                        })\n                );\n            }\n        }\n        window.newrelic.addPageAction(actionName, attributes);\n    }\n}\n\nfunction setCustomAttribute(key: string, value: string | number | null | boolean, persist?: boolean) {\n    if (\n        window &&\n        'newrelic' in window &&\n        window.newrelic &&\n        typeof window.newrelic === 'object' &&\n        'setCustomAttribute' in window.newrelic &&\n        typeof window.newrelic.setCustomAttribute === 'function'\n    ) {\n        if (typeof key !== 'string') {\n            console.error('Invalid key for setCustomAttribute ->', {\n                remoteData: {\n                    key,\n                    keyType: typeof key\n                }\n            });\n            return;\n        }\n        if (value !== null && !['string', 'number', 'boolean'].includes(typeof value)) {\n            console.error('Invalid value for setCustomAttribute ->', {\n                remoteData: {\n                    key,\n                    valueType: typeof value\n                }\n            });\n            return;\n        }\n        if (typeof persist !== 'undefined' && typeof persist !== 'boolean') {\n            console.error('Invalid persist for setCustomAttribute ->', {\n                remoteData: {\n                    key,\n                    persistType: typeof persist\n                }\n            });\n            return;\n        }\n        window.newrelic.setCustomAttribute(key, value, persist);\n    }\n}\n\nexport { addPageAction, setCustomAttribute };\n","import { typeOf } from '@ember/utils';\nimport Service from '@ember/service';\nimport Application from '@ember/application';\nimport { get } from '@ember/object';\nimport moment from './dates';\n\n/**\n * @callback extractRawDataKeyFilter\n * @param {Array.<string>} path - An array of the ancesteral keys of this key. Array indices will be converted to strings. Note that the root node will not be included in this path so this array will be empty for root props/indices.\n * @param {string} key The current key to evaluate; Array indices will be converted to strings\n * @returns {boolean} true if the key and its associated value should be included; false to exclude.\n *\n * @callback extractRawDataValueFilter\n * @param {Array.<string>} path - An array of the keys down to the current value.  Array indices will be converted to strings. Note that the root node will not be included in this path so this array will be of length 1 for root values.\n * @param {*} value The current value to evaluate\n * @returns {boolean} true if the value and it's associated key should be included; false to exclude.\n */\n\nconst ALLOWED_VALUE_TYPES = [\n    'null',\n    'undefined',\n    'regexp',\n    'date',\n    'moment',\n    'boolean',\n    'number',\n    'string',\n    'array',\n    'object',\n    'instance',\n    'error' // Allow Event objects (detected as 'error' by typeOf) to be serialized; Error objects are still filtered\n];\n\n/**\n * Extract raw data from the provided input. Practically, this can be\n * used for extracting the raw data from Ember Object instances with some gotchas:\n *\n * * Non-string keys are NOT included\n * * All non-enumerable properties are NOT included\n *   * This implicitly excludes prototype properties\n * * Certain value types are NOT included\n *   * symbol, filelist, class, error\n *   * function (computeds, observers, etc.)\n *\n * Other important items to note:\n *\n * * If any object (other than Date or moment instances) in the hierarchy implements toJSON, it will be called with the current key and the result will then be processed through the depth check, key filters, and value filters.\n * * Cycles are replaced with [Cycle] and are more likely if services or the container are referenced (Best Practice: Use the defaults to filter underscore keys and Ember Services)\n * * Depth of objects will affect efficiency (Best Practice: Remove unnecessary keys/values with filters and built-in options)\n * * Objects and arrays will be truncated with '[Object]' and '[Array(<length>)]' if the maxDepth is exceeded.\n *\n * @param {null|undefined|Array|object} input - The object to extract\n * @param {Object} options - Options for parsing the object\n * @param {number?} options.maxDepth - An integer indicating the max allowed traversal depth.  Once reached, Objects and Arrays will be replaced with '[Object]' and '[Array(<length>)]' respectively. Root properties considered at depth 1.  Defaults to no max depth.\n * @param {boolean?} options.excludeUnderscoreKeys [true] - if keys starting with _ should be excluded; defaults to true\n * @param {boolean?} options.excludeEmberServices [true] - if Ember Service values should be excluded; defaults to true\n * @param {extractRawDataKeyFilter?} options.keyFilter [null] - A filter function to apply to keys which are not already excluded by other means; true will include the key/value pair, false will exclude\n * @param {extractRawDataValueFilter?} options.valueFilter [null] - A filter function to apply to values which are not already excluded by other means; true will include the key/value pair, false will exclude\n * @throws Error if the provided input is not undefined, null, a custom object, an Ember instance, or an array\n * @throws Error if the provided input cannot be extracted.  This could occur because of excessive depth, invalid input parameter or object structure, a faulty toJSON nested implementation, etc.\n * @throws Error if any options are invalid\n * @returns {null|undefined|Array|object} output\n */\nexport function extractRawData(input, options = {}) {\n    let safeOptions = {\n        maxDepth: Number.MAX_SAFE_INTEGER,\n        excludeUnderscoreKeys: true,\n        excludeEmberServices: true,\n        excludeEmberApplications: true\n    };\n\n    if (typeOf(options) !== 'object') {\n        throw new Error('options can only be an object if specified');\n    } else {\n        if (Object.prototype.hasOwnProperty.call(options, 'maxDepth')) {\n            if (typeOf(options.maxDepth) === 'number' && options.maxDepth < Number.MAX_SAFE_INTEGER) {\n                safeOptions.maxDepth = Math.floor(options.maxDepth);\n            } else {\n                throw new Error('maxDepth must be a number less than Number.MAX_SAFE_INTEGER if specified');\n            }\n        }\n\n        if (Object.prototype.hasOwnProperty.call(options, 'keyFilter')) {\n            if (typeof options.keyFilter === 'function') {\n                safeOptions.keyFilter = options.keyFilter;\n            } else {\n                throw new Error('keyFilter must be a function if specified');\n            }\n        }\n\n        if (Object.prototype.hasOwnProperty.call(options, 'valueFilter')) {\n            if (typeof options.valueFilter === 'function') {\n                safeOptions.valueFilter = options.valueFilter;\n            } else {\n                throw new Error('valueFilter must be a function if specified');\n            }\n        }\n\n        if (Object.prototype.hasOwnProperty.call(options, 'excludeUnderscoreKeys')) {\n            if (typeOf(options.excludeUnderscoreKeys) === 'boolean') {\n                safeOptions.excludeUnderscoreKeys = options.excludeUnderscoreKeys.valueOf();\n            } else {\n                throw new Error('excludeUnderscoreKeys must be a boolean if specified');\n            }\n        }\n\n        if (Object.prototype.hasOwnProperty.call(options, 'excludeEmberServices')) {\n            if (typeOf(options.excludeEmberServices) === 'boolean') {\n                safeOptions.excludeEmberServices = options.excludeEmberServices.valueOf();\n            } else {\n                throw new Error('excludeEmberServices must be a boolean if specified');\n            }\n        }\n\n        if (Object.prototype.hasOwnProperty.call(options, 'excludeEmberApplications')) {\n            if (typeOf(options.excludeEmberApplications) === 'boolean') {\n                safeOptions.excludeEmberApplications = options.excludeEmberApplications;\n            } else {\n                throw new Error('excludeEmberApplications must be a boolean if specified');\n            }\n        }\n    }\n\n    let inputType = myTypeOf(input);\n\n    if (['null', 'undefined'].indexOf(inputType) >= 0) {\n        return input;\n    } else if (['array', 'object', 'instance'].indexOf(inputType) >= 0) {\n        return _extractRawDataHelper(null, input, safeOptions);\n    } else {\n        throw new Error(\n            'Input must be undefined, null, a custom object (not date, moment, regexp, filelist, error, etc), an Ember Instance, or an array'\n        );\n    }\n}\n\n/**\n * Recursive raw data extraction util.\n *\n * An item of the stack used to track history in traversing a nested array/object.\n * @typedef {Object} ContextStackItem\n * @property {array|object} scope - The parent object or array of the specified property\n * @property {string} propertyName - The name of the property (or index for arrays)\n *\n * A stack used track history while traversing a nested array/object.\n * @typedef {Array.<ContextStackItem>} ContextStack\n *\n * @param {ContextStack} contextStack The stack representing the lineage of the input parameter.  If null, input is considered the root input to extract.\n * @param {*} input The current object to extract\n * @param {*} options Type-safe and valid extraction options\n * @returns {Object|string|null} raw data representation of input\n */\nfunction _extractRawDataHelper(contextStack, input, options) {\n    let inputType = myTypeOf(input);\n\n    if (['null', 'undefined', 'regexp', 'date', 'moment'].indexOf(inputType) >= 0) {\n        return input;\n    }\n\n    if (['boolean', 'number', 'string'].indexOf(inputType) >= 0) {\n        if (typeof input.valueOf === 'function') {\n            return input.valueOf();\n        }\n\n        return input;\n    }\n\n    // Handle Event objects (like WebSocket errors) by converting them to plain objects\n    // Event objects are detected as 'error' type by Ember's typeOf, but we need to serialize them\n    // to avoid logger crashes. Regular Error objects should still be filtered out (return null).\n    if (inputType === 'error') {\n        // Only serialize Event objects, not Error objects\n        if (input instanceof Event) {\n            return {\n                type: input.type,\n                isTrusted: input.isTrusted,\n                timeStamp: input.timeStamp,\n                target: input.target ? '[EventTarget]' : null\n            };\n        }\n        // For Error objects and other error-like objects, return null (filter them out)\n        return null;\n    }\n\n    // Return null for all other cases: 'function', 'symbol', 'filelist', 'class'\n    if (['array', 'object', 'instance'].indexOf(inputType) < 0) {\n        return null;\n    }\n\n    // Found an array, object, or instance that may need to be recursed\n\n    // Check for cycles before decending\n    if (contextStack) {\n        let found = contextStack.find(currStackItem => currStackItem.scope === input);\n        if (found) {\n            return '[Cycle]';\n        }\n    }\n\n    // Check maxDepth before decending\n    let currLevel = contextStack ? contextStack.length : 0;\n\n    if (currLevel + 1 > options.maxDepth) {\n        if (inputType === 'array') {\n            return `[Array(${input.length})]`;\n        } else {\n            return '[Object]';\n        }\n    }\n\n    // Safe to recurse sub-object or array\n\n    if (inputType === 'array') {\n        return input.reduce((result, currItem, currIndex) => {\n            let currStack = buildNewContextStack(contextStack, input, currIndex.toString());\n            if (isAllowed(currStack, currItem, options)) {\n                result.push(_extractRawDataHelper(currStack, currItem, options));\n            }\n\n            return result;\n        }, []);\n    } else {\n        if (typeof input.toJSON === 'function') {\n            try {\n                let customJsonValue = input.toJSON(\n                    (contextStack && contextStack[contextStack.length - 1].propertyName) || ''\n                );\n\n                // Process the custom json value back through the _extractRawDataHelper to process filters, rules, and depth checks (max depth, fitlers, etc.)\n                // The original stack should be kept\n                return _extractRawDataHelper(contextStack, customJsonValue, options);\n            } catch (e) {\n                let wrappedJsonError = new Error('Failed to marshal nested toJSON representation');\n                wrappedJsonError.baseError = e;\n                throw wrappedJsonError;\n            }\n        }\n\n        // iterate on props\n        return Object.keys(input).reduce((acc, currKey) => {\n            let currValue = input[currKey];\n\n            let currStack = buildNewContextStack(contextStack, input, currKey);\n            if (!isAllowed(currStack, currValue, options)) {\n                return acc;\n            }\n\n            acc[currKey] = _extractRawDataHelper(currStack, input[currKey], options);\n\n            return acc;\n        }, {});\n    }\n}\n\n/**\n * Assesses if provided stack (containing the implicit curr key) and value pass various filters to be\n * included in the extracted object.\n *\n * @param {ContextStack} contextStack The historical stack from the root down to the current key\n * @param {*} value The value to check\n * @param {object} options The configurable filtering options (assumed to be valid)\n * @param {?boolean} options.excludeUnderscoreKeys [false] - if keys starting with _ should be excluded\n * @param {?boolean} options.excludeEmberServices [false] - if Ember Service values should be excluded\n * @param {?extractRawDataKeyFilter} options.keyFilter [null] - A filter function to apply to keys which are not already excluded by other means; true will include the key/value pair, false will exclude\n * @param {?extractRawDataValueFilter} options.valueFilter [null] - A filter function to apply to values which are not already excluded by other means; true will includ the key/value pair, false will exclude\n */\nfunction isAllowed(contextStack, value, options) {\n    let key = contextStack[contextStack.length - 1].propertyName;\n    let path = contextStack.slice(0, -1).map(curr => curr.propertyName);\n\n    // Check Filters\n    if (key) {\n        if (myTypeOf(key) !== 'string') {\n            return false;\n        }\n\n        if (options.excludeUnderscoreKeys && key.charAt(0) === '_') {\n            return false;\n        }\n\n        let keyFilter = options.keyFilter || null;\n        if (keyFilter && !keyFilter(path, key)) {\n            return false;\n        }\n    }\n\n    let valueType = myTypeOf(value);\n    if (ALLOWED_VALUE_TYPES.indexOf(valueType) < 0) {\n        return false;\n    }\n\n    // Filter out Error objects (but allow Event objects which are also detected as 'error' type)\n    if (valueType === 'error' && value instanceof Error && !(value instanceof Event)) {\n        return false;\n    }\n\n    if (options.excludeEmberServices && valueType === 'instance' && value instanceof Service) {\n        return false;\n    }\n\n    if (options.excludeEmberApplications && valueType === 'instance' && value instanceof Application) {\n        return false;\n    }\n\n    let valueFilter = options.valueFilter || null;\n    if (valueFilter && !valueFilter([...path, key], value)) {\n        return false;\n    }\n\n    return true;\n}\n\nfunction buildNewContextStack(currStack, scope, propertyName) {\n    let newStackItem = {\n        scope,\n        propertyName\n    };\n\n    if (currStack) {\n        return [...currStack, newStackItem];\n    } else {\n        return [newStackItem];\n    }\n}\n\nfunction myTypeOf(value) {\n    if (typeof value === 'symbol') {\n        return 'symbol';\n    }\n\n    if (value instanceof moment) {\n        return 'moment';\n    }\n\n    return typeOf(value);\n}\n\n/**\n * Utility to determine if object is destroyed\n * or being destroyed.\n * @param obj - Ember object to check\n * @returns boolean\n */\nexport function isDestroyed(obj) {\n    return get(obj, 'isDestroyed') || get(obj, 'isDestroying');\n}\n\nexport default {\n    extractRawData\n};\n","import { isValidEmailAddress } from 'web-directory/utils/email';\n\n/**\n * Shape of a selected/typed outbound recipient used by create-conversation panels.\n */\nexport type RecipientValidationItem = {\n    value?: string;\n    entity?: unknown;\n};\n\n/**\n * Input snapshot passed to parent-owned recipient validators.\n */\nexport type RecipientValidationContext = {\n    searchValue: string;\n    recipient: RecipientValidationItem | null;\n    recipients: RecipientValidationItem[];\n};\n\n/**\n * Parent-owned recipient input validation for the shared create-conversation panel.\n *\n * - `validate` returns a translation key when invalid, or `null` when ok.\n * - `soft` shows an inline info message without blocking submit (call/message numbers).\n * - `hard` also disables submit while invalid (email).\n */\nexport type RecipientInputValidation = {\n    validate: (context: RecipientValidationContext) => string | null;\n    severity?: 'soft' | 'hard';\n};\n\nexport const INVALID_NUMBER_FORMAT_KEY = 'modeRoster.sidePanel.outbound.invalidNumberFormat';\nexport const INVALID_EMAIL_FORMAT_KEY = 'modeRoster.sidePanel.outbound.invalidEmailFormat';\n\nexport type PhoneNumberValidationDeps = {\n    isValidNumber: (value: string, country: null, strict: boolean, subMsgType?: string) => boolean;\n    formatAddress?: (value: string, country?: undefined, subMsgType?: string) => string;\n    subMsgType?: string;\n    /** When true, values are formatted before validation (SMS / WhatsApp). */\n    formatEnabled?: boolean;\n};\n\n/**\n * Soft phone-number validation for outbound call / message recipient input.\n * Entity-backed recipients (users/queues) are skipped; raw numbers and search text are checked.\n */\nexport function validatePhoneNumberInput(\n    context: RecipientValidationContext,\n    deps: PhoneNumberValidationDeps\n): string | null {\n    const { searchValue, recipient, recipients } = context;\n    const { isValidNumber, formatAddress, subMsgType, formatEnabled = false } = deps;\n\n    const isValid = (value: string): boolean => {\n        const valueToCheck = formatEnabled && formatAddress ? formatAddress(value, undefined, subMsgType) : value;\n        return isValidNumber(valueToCheck, null, true, subMsgType);\n    };\n\n    if (recipient?.value) return isValid(recipient.value) ? null : INVALID_NUMBER_FORMAT_KEY;\n    const hasInvalidRawRecipient = (recipients || []).some(\n        item => !item.entity && !!item.value && !isValid(item.value)\n    );\n\n    if (hasInvalidRawRecipient) return INVALID_NUMBER_FORMAT_KEY;\n    if (searchValue && !isValid(searchValue)) return INVALID_NUMBER_FORMAT_KEY;\n\n    return null;\n}\n\n/**\n * Hard email validation for outbound email recipient search input.\n * Empty search is treated as valid (chips / submit gating handled separately).\n */\nexport function validateEmailInput(context: RecipientValidationContext): string | null {\n    const { searchValue } = context;\n    if (!searchValue) return null;\n    return isValidEmailAddress(searchValue) ? null : INVALID_EMAIL_FORMAT_KEY;\n}\n","/**\n * Pure utility functions for resolving participant display names from conversation\n * payloads and store lookups. These are extracted from `services/participant-name`\n * so that callers in the mode-manager stack can resolve names without depending on\n * the `interaction` service (which carries `activeInteractions` state that is not\n * available outside the legacy ACD panel).\n *\n * The existing `participant-name` service is unchanged and continues to be used by\n * the legacy `acd-interactions-panel` components.\n */\n\nimport { isGuid } from 'web-directory/utils/conversation';\nimport type {\n    Communication,\n    CommunicationType,\n    Participant,\n    ParticipantPurposeType\n} from '@genesys/genesys-cloud-conversation-utils';\nimport type { Maybe } from 'web-directory/types';\n\n// ---------------------------------------------------------------------------\n// Sync helpers\n// ---------------------------------------------------------------------------\n\nfunction hasMedia(participant: Participant, commType: CommunicationType): boolean {\n    return ((participant[commType] as unknown[]) || []).length > 0;\n}\n\nfunction getNameForCall(call: Communication): Maybe<string> {\n    const direction = call.direction ?? '';\n    const isOutbound = direction.toLowerCase() === 'outbound';\n\n    if (isOutbound && call.self) {\n        return call.self.name || call.self.addressNormalized || null;\n    } else if (!isOutbound && call.other) {\n        return call.other.name || call.other.addressNormalized || null;\n    }\n    return null;\n}\n\nfunction getNameForMessage(message: Communication & { type?: string }): Maybe<string> {\n    const toAddress = message.toAddress?.addressNormalized;\n    const fromAddress = message.fromAddress?.addressNormalized;\n\n    if (fromAddress && !isGuid(fromAddress) && message.type !== 'apple') {\n        return fromAddress;\n    } else if (toAddress && !isGuid(toAddress)) {\n        return toAddress;\n    }\n    return null;\n}\n\n/**\n * Synchronously derive the best display name for a participant from the raw\n * conversation payload. Mirrors `ParticipantNameService.getRawParticipantName`\n * but without the email path that requires `interaction.activeInteractions`.\n *\n * For email participants the sync path returns `null`; use `fetchParticipantName`\n * to resolve asynchronously via external contacts / user store.\n */\nexport function getRawParticipantName(participant: Participant): Maybe<string> {\n    if (!participant) return null;\n\n    try {\n        if (participant.name) return participant.name;\n\n        const { attributes } = participant;\n        if (attributes) {\n            const name: string = attributes['name'] || '';\n            const firstName: string = attributes['context.firstName'] || '';\n            const lastName: string = attributes['context.lastName'] || '';\n            if (name) return name.trim();\n            if (firstName || lastName) return `${firstName} ${lastName}`.trim();\n        }\n\n        if (hasMedia(participant, 'calls')) {\n            const name = getNameForCall(participant.calls![0]);\n            if (name) return name;\n        }\n\n        if (hasMedia(participant, 'messages')) {\n            const name = getNameForMessage(participant.messages![0] as Communication & { type?: string });\n            if (name) return name;\n        }\n\n        // Email: messages are fetched separately and not on the raw payload —\n        // fall through to null and let fetchParticipantName handle it async.\n    } catch {\n        // swallow — caller shows fallback name\n    }\n\n    return null;\n}\n\n// ---------------------------------------------------------------------------\n// Async helpers\n// ---------------------------------------------------------------------------\n\nasync function fetchExternalContactName(\n    externalContactId: string,\n    externalContactsService: any,\n    logger: any\n): Promise<Maybe<string>> {\n    try {\n        const contact = await externalContactsService.getCanonicalExternalContact(externalContactId, false);\n        if (contact) {\n            const name = contact.get ? contact.get('name') : contact.name;\n            if (name) return name;\n        }\n    } catch (error) {\n        logger?.error('ACD: participant-name util could not fetch external contact', {\n            error,\n            remoteData: { externalContactId }\n        });\n    }\n    return null;\n}\n\nasync function fetchUserName(userId: string, store: any, logger: any): Promise<Maybe<string>> {\n    try {\n        const person = await store.findRecord('person', userId);\n        if (person) {\n            const name = person.get ? person.get('name') : person.name;\n            if (name) return name;\n        }\n    } catch (error) {\n        logger?.error('ACD: participant-name util could not fetch user record', {\n            error,\n            remoteData: { userId }\n        });\n    }\n    return null;\n}\n\nexport async function fetchQueueName(queueId: Maybe<string>, store: any, logger: any): Promise<Maybe<string>> {\n    if (!queueId) return null;\n    try {\n        const queue = await store.findRecord('queue', queueId);\n        if (queue) {\n            const name = queue.get ? queue.get('name') : queue.name;\n            if (name) return name;\n        }\n    } catch (error) {\n        logger?.error('ACD: participant-name util could not fetch queue record', {\n            error,\n            remoteData: { queueId }\n        });\n    }\n    return null;\n}\n\n/**\n * Asynchronously resolve the best display name for a participant. Mirrors\n * `ParticipantNameService.fetchNameFromParticipant` without the interaction\n * service dependency.\n *\n * @param participant  Raw participant object from the conversation payload.\n * @param store        Ember Data store (for person / queue lookups).\n * @param externalContactsService  External contacts service instance.\n * @param logger       Logger service instance (optional).\n */\nexport async function fetchParticipantName(\n    participant: Participant,\n    store: any,\n    externalContactsService: any,\n    logger?: any\n): Promise<Maybe<string>> {\n    if (!participant) return null;\n\n    const queuePurpose: ParticipantPurposeType = 'acd';\n    if (participant.purpose === queuePurpose) {\n        return fetchQueueName(participant.queueId, store, logger);\n    }\n\n    if (participant.externalContactId) {\n        const name = await fetchExternalContactName(participant.externalContactId, externalContactsService, logger);\n        if (name) return name;\n    }\n\n    if (participant.userId) {\n        return fetchUserName(participant.userId, store, logger);\n    }\n\n    return getRawParticipantName(participant);\n}\n","export const topicPriority = {\n    presence: 1,\n    routingStatus: 2,\n    conversationsummary: 3,\n    other: 4,\n    outofoffice: 5,\n    geolocation: 6\n};\n\n/**\n * Get the maximum priority value for pigeon topics\n * Priority topics get the highest priority (lowest number)\n * @returns {number} The maximum priority value\n */\nexport function getPigeonMaxPriority() {\n    const priorities = Object.values(topicPriority);\n    // Subtract 10 from the minimum to give priority topics the highest priority\n    return Math.min(...priorities) - 10;\n}\n\n/** Pre-computed max priority — avoids recalculating on every subscription */\nexport const PIGEON_MAX_PRIORITY = getPigeonMaxPriority();\n","/** Platform API error code when org security policy denies access (IAM-4413). */\nexport const AUTHZ_POLICY_DENIED_CODE = 'authz.policy.denied';\n\n/**\n * True when the API error is 403 with {@link AUTHZ_POLICY_DENIED_CODE} on the payload.\n * `error` is the ember-ajax rejection object: numeric `status` and JSON `payload` from the response body.\n */\nexport function isAccessDeniedDueToPolicy(error: { status?: number; payload?: { code?: string } }): boolean {\n    if (!error) {\n        return false;\n    }\n\n    if (typeof error.status !== 'number' || error.status !== 403) {\n        return false;\n    }\n    if (!error.payload) {\n        return false;\n    }\n\n    return error.payload.code === AUTHZ_POLICY_DENIED_CODE;\n}\n","/**\n * Helpers for deciding where to send the user once authentication completes.\n *\n * The route requested before authentication survives the OAuth round trip in one\n * of two places:\n *\n * - `purecloud-oauth`'s restore state (implicit grant), which carries a full URL\n *   including pathname and query string.\n * - `window.location.hash`, which the authenticator rewrites from session storage\n *   before session bootstrap starts (gc-mfe-auth). See `app/authenticators/directory.js`.\n *\n * Ember Simple Auth knows about neither. Its post-authentication handling retries\n * `session.attemptedTransition` — which by then can be a stale transition to\n * `index` recorded before the redirect — or falls back to `routeAfterAuthentication`\n * ('index'). Both land the user on /home and discard the route they asked for.\n * These helpers let the application route and the login route agree on the\n * correct destination instead. (ATLAS-2424)\n */\n\n/**\n * Where to send the user after authentication.\n *\n * - `route`: transition the router to `path` (a URL path such as `/timeline`).\n * - `url`: assign `window.location`, reloading the app. Required when the target\n *   differs from the current document by more than its fragment.\n * - `default`: no pre-authentication route to honor; use the framework default.\n */\nexport type PostAuthDestination = { type: 'route'; path: string } | { type: 'url'; url: string } | { type: 'default' };\n\n/**\n * The parts of `window.location` needed to tell \"same document\" from \"needs a reload\".\n */\nexport interface DocumentLocation {\n    origin: string;\n    pathname: string;\n    search: string;\n}\n\n/**\n * Routes that must never be restored as a post-authentication destination.\n *\n * Sending the user back to an unauthenticated or terminal route after a\n * successful login either loops (`login-oauth`) or strands them on an error\n * page they have just recovered from.\n */\nconst NON_RESTORABLE_PATHS = [\n    '/login-oauth',\n    '/login',\n    '/signup',\n    '/reset-password',\n    '/region-chooser',\n    '/maintenance',\n    '/no-access',\n    '/policy-access-denied'\n];\n\n/**\n * Extracts the fragment from an absolute or relative URL.\n *\n * @returns The fragment including its leading `#`, or an empty string.\n */\nfunction getHash(url: string, base: string): string {\n    try {\n        return new URL(url, base).hash;\n    } catch (e) {\n        return '';\n    }\n}\n\n/**\n * Converts a location fragment into a router path, when the fragment names a\n * route worth returning to.\n *\n * @param hash A location fragment, e.g. `#/timeline` or `#/admin/users?tab=1`.\n * @returns The path to transition to (e.g. `/timeline`), or null when the\n * fragment is not a restorable route. OAuth responses (`#access_token=...`,\n * `#code=...`), the bare root, and unauthenticated/terminal routes all yield null.\n */\nexport function getRestorableRoutePath(hash: string | null | undefined): string | null {\n    if (!hash || !hash.startsWith('#/')) {\n        return null;\n    }\n\n    // Collapse repeated leading slashes. PEF direct-routing URLs are built by the\n    // embedded client rather than by this app and arrive as `#//interaction/<id>`,\n    // which matches no route: handing it to `transitionTo` throws an assertion that\n    // takes the render down with it.\n    const path = hash.slice(1).replace(/^\\/+/, '/');\n    if (path === '/') {\n        return null;\n    }\n\n    const [pathname] = path.split('?');\n    const isNonRestorable = NON_RESTORABLE_PATHS.some(\n        candidate => pathname === candidate || pathname.startsWith(`${candidate}/`)\n    );\n\n    return isNonRestorable ? null : path;\n}\n\n/**\n * Determines whether a URL addresses the document that is already loaded, meaning\n * only its fragment could differ.\n */\nexport function isCurrentDocument(url: string, location: DocumentLocation): boolean {\n    let parsed;\n    try {\n        parsed = new URL(url, location.origin);\n    } catch (e) {\n        return false;\n    }\n\n    return (\n        parsed.origin === location.origin &&\n        parsed.pathname === location.pathname &&\n        parsed.search === (location.search || '')\n    );\n}\n\n/**\n * Resolves the post-authentication destination from the two places a\n * pre-authentication route can survive an OAuth round trip.\n *\n * @param restoreStateUrl Full URL from `purecloud-oauth`'s restore state, if any.\n * @param hash Current location fragment, which the gc-mfe-auth flow rewrites to\n * the pre-authentication route before bootstrap.\n * @param location Current document location.\n */\nexport function resolvePostAuthDestination({\n    restoreStateUrl,\n    hash,\n    location\n}: {\n    restoreStateUrl?: string | null;\n    hash?: string | null;\n    location: DocumentLocation;\n}): PostAuthDestination {\n    if (restoreStateUrl) {\n        if (!isCurrentDocument(restoreStateUrl, location)) {\n            // A different pathname or query string can only be applied by reloading.\n            return { type: 'url', url: restoreStateUrl };\n        }\n\n        // Same document, so only the fragment differs. Assigning `window.location`\n        // would not reload, which leaves any in-flight transition (typically the\n        // one to `index` that ran while unauthenticated) free to finish and clobber\n        // the restored route. Drive the router instead.\n        const restoredPath = getRestorableRoutePath(getHash(restoreStateUrl, location.origin));\n        return restoredPath ? { type: 'route', path: restoredPath } : { type: 'default' };\n    }\n\n    const restoredPath = getRestorableRoutePath(hash);\n    return restoredPath ? { type: 'route', path: restoredPath } : { type: 'default' };\n}\n\n/**\n * Exhaustiveness guard. Adding a `PostAuthDestination` variant without a matching\n * branch in `applyPostAuthDestination` fails to compile here.\n */\nfunction assertNever(destination: never): never {\n    throw new Error(`Unhandled post-auth destination: ${JSON.stringify(destination)}`);\n}\n\n/**\n * Dispatches a resolved destination to the caller's handlers.\n *\n * The dispatch lives here rather than at the call site because the union is\n * declared here and the consumer (`app/routes/application.js`) is untyped\n * JavaScript, where TypeScript cannot check the branches.\n *\n * Handlers are invoked synchronously, so an Ember route may call `_super` from one\n * (captured up front, since `_super` is only valid for the synchronous extent of\n * the method that owns it).\n */\nexport function applyPostAuthDestination(\n    destination: PostAuthDestination,\n    handlers: {\n        useFrameworkDefault(): void;\n        assignLocation(url: string): void;\n        transitionToRoute(path: string): void;\n    }\n): void {\n    switch (destination.type) {\n        case 'default':\n            handlers.useFrameworkDefault();\n            return;\n        case 'url':\n            handlers.assignLocation(destination.url);\n            return;\n        case 'route':\n            handlers.transitionToRoute(destination.path);\n            return;\n        default:\n            assertNever(destination);\n    }\n}\n","export type Presence = 'on_queue' | 'available';\n\n/**\n * Checks if the presence source is a default presence source.\n * @param {string} source the presence source to check\n * @returns\n */\nexport function isDefaultPresence(source: string) {\n    // we will want to switch completely to 'default'\n    // as the only default presence source but will be blocked until\n    // the Presence Service is only returning 'default'.\n    return isPurecloudSource(source) || source === 'default';\n}\n/**\n * Checks if the presence source is PURECLOUD.\n * @param {string} source the presence source to check\n * @returns\n */\nexport function isPurecloudSource(source: string) {\n    return source && source.toLowerCase() === 'purecloud';\n}\n\n/**\n * Takes the presence key and returns in a format Gux Elements understand\n * @param {string} key the presence key given\n * @returns\n */\nexport function formatPresenceKeyForGux(key: string | undefined) {\n    if (!key) return 'offline';\n    if (key?.toLowerCase() === 'out_of_office') return 'out-of-office';\n    if (key?.toLowerCase() === 'on_queue') return 'on-queue';\n    return key;\n}\n\n/**\n * Display Presence Model\n * */\nexport type DisplayPresence = {\n    id?: any;\n    primaryKey: string;\n    secondaryKey: string;\n    label: string; // translation string or indicator for if statement if its pre-translated\n    requestedPresenceId?: any;\n    requestedPrimaryKey?: string;\n    requestedPresenceLabel?: string;\n};\n\n/**\n * Presence Model\n * */\nexport type PresenceType = {\n    id?: any;\n    key: string;\n    label: string; // translation string or indicator for if statement if its pre-translated\n    order?: number;\n    display?: boolean; // marker for items we never show\n    secondaryPresences?: Array<PresenceType>;\n};\n\n/**\n * Standardized List of Presence to control things like order that they\n * presence show up on the page and weather or not they are displayed at all\n * */\nexport const StandardPresenceList: Array<PresenceType> = [\n    {\n        key: 'available',\n        label: 'chat.presence.available',\n        order: 0,\n        display: true,\n        secondaryPresences: []\n    },\n    {\n        key: 'busy',\n        label: 'chat.presence.busy',\n        order: 1,\n        display: true\n    },\n    {\n        key: 'away',\n        label: 'chat.presence.away',\n        order: 2,\n        display: true\n    },\n    {\n        key: 'break',\n        label: 'chat.presence.break',\n        order: 3,\n        display: true\n    },\n    {\n        key: 'meal',\n        label: 'chat.presence.meal',\n        order: 4,\n        display: true\n    },\n    {\n        key: 'meeting',\n        label: 'chat.presence.meeting',\n        order: 5,\n        display: true\n    },\n    {\n        key: 'training',\n        label: 'chat.presence.training',\n        order: 6,\n        display: true\n    },\n    {\n        key: 'on_queue',\n        label: 'chat.presence.onQueue',\n        order: 7,\n        display: false\n    },\n    {\n        key: 'idle',\n        label: 'chat.presence.idle',\n        display: false\n    },\n    {\n        key: 'offline',\n        label: 'chat.presence.offline',\n        display: false\n    },\n    {\n        key: 'out_of_office',\n        label: 'chat.presence.outOfOffice.title',\n        display: true\n    }\n];\n\n/**\n * Sorts a list of DisplayPresence by the order given to by StandardPresenceList\n * @param {PresenceType} a item one to sort\n * @param {PresenceType} b item two to sort\n * @returns\n */\nexport function sortByOrder(a: PresenceType, b: PresenceType) {\n    if (a.order === undefined) return 0;\n    if (b.order === undefined) return 0;\n    if (a.order > b.order) {\n        return 1;\n    } else {\n        return -1;\n    }\n}\n\n/**\n * Sorts a list of SecondaryStatuses\n * @param {any} secondaryPresences\n * @returns\n */\nexport function sortSecondaryStatuses(secondaryPresences: any) {\n    return secondaryPresences.sort((a: any, b: any) => {\n        const presenceA = a.get('label');\n        const presenceB = b.get('label');\n        // Extract numeric parts and remaining parts from the strings\n        const numPartA = parseInt(presenceA, 10);\n        const numPartB = parseInt(presenceB, 10);\n        // Check if both strings start with numbers\n        if (!isNaN(numPartA) && !isNaN(numPartB)) {\n            if (numPartA !== numPartB) {\n                return numPartA - numPartB;\n            }\n            // If numeric parts are equal, compare the rest of the string\n            return presenceA\n                .slice(numPartA.toString().length)\n                .localeCompare(presenceB.slice(numPartB.toString().length));\n        }\n        // If not both strings start with numbers, compare them as usual strings\n        return presenceA.localeCompare(presenceB);\n    });\n}\n","import { set, computed } from '@ember/object';\nimport DS from 'ember-data';\n\nfunction tap(proxy, promise) {\n    set(proxy, 'isFulfilled', false);\n    set(proxy, 'isRejected', false);\n\n    return promise.then(\n        function (result) {\n            var payload;\n            var content = result;\n            if (result && typeof result === 'object') {\n                content = result.collection;\n                payload = result.payload;\n            }\n\n            set(proxy, 'isFulfilled', true);\n            set(proxy, 'content', content);\n\n            set(proxy, 'content._payload', payload);\n            set(proxy, '_payload', payload);\n\n            return content;\n        },\n        function (reason) {\n            set(proxy, 'isRejected', true);\n            set(proxy, 'reason', reason);\n            throw reason;\n        },\n        'Ember: PromiseProxy'\n    );\n}\n\nexport default DS.PromiseArray.extend({\n    _payload: null,\n\n    promise: computed({\n        get() {\n            throw console.error(\"PromiseProxy's promise must be set\");\n        },\n\n        set(key, promise) {\n            return tap(this, promise);\n        }\n    })\n});\n","export function parseQueryParams() {\n    var obj = {};\n    var params = window.location.search.slice(1).split('&');\n\n    params.forEach(function (param) {\n        const split = param.split('=');\n        const key = decodeURIComponent(split[0]);\n        const value = split.length > 1 ? decodeURIComponent(split[1]) : '';\n        obj[key] = value;\n    });\n\n    return obj;\n}\n","import EmberObject, { computed } from '@ember/object';\nimport { typeOf } from '@ember/utils';\nimport uuid from 'uuid';\n\nconst MSG_NAMESPACE = 'QueuedProcessingChain';\n\n/**\n * Queues events by queueId and processes said events serially through a processor chain.\n * Events across queues will be processed \"concurrently\" via javascript's event loop.\n *\n * Chain:\n * A sequence of 1 or more processors which run serially for an event.\n *\n * Processors:\n * A synchronous or async function that performs work.  Regardless of whether a\n * processor is sync or async, each processor within a queue will be run serially.  While\n * processors could perform side-effects, it is preferable to mutate the data\n * in the context or the context itself.\n *\n * Processor Return Values:\n * false - Stops the event from progressing further in the chain\n * undefined (explicit or implicit) - Passes the current context, as is, into the next processor\n * object - Passes the returned object to the next processor as it's context\n *\n * Processor Errors:\n * If a processor throws or rejects, an error will be logged and the event will stop\n * propogating through the chain.  It is advised that processor blocks handle\n * their own errors internally and either recover or explicitly stop the chain by returning false.\n *\n * Lifecycle:\n * Both the QueuedProcessingChain instance and an optional lifecycleContainer can be used to manage events\n * and processors.  If either this instance or the optional lifecycleContainer is\n * destroying/destroyed, all active event processing will be haulted, any queued\n * work will be dropped, and any future attempt to enqueue new work will noop.\n */\nconst QueuedProcessingChain = EmberObject.extend({\n    // An ember object (instance) whose lifecycle should bind this chain's event processing\n    lifecycleContainer: undefined,\n    label: null,\n    _defaultLabel: null,\n    _chain: null,\n    _processingQueueMap: null,\n\n    init() {\n        this._super(...arguments);\n        this._defaultLabel = `processingChain-${uuid()}`;\n        this._chain = [];\n        this._processingQueueMap = {};\n\n        if (!['undefined', 'instance'].includes(typeOf(this.lifecycleContainer))) {\n            throw new Error('if specified, the lifecycleContainer must be an Ember instance');\n        }\n    },\n\n    setProcessingChain(chain) {\n        if (!chain || !Array.isArray(chain)) {\n            throw new Error(this._buildErrorMessage('Only an array can be used as a processing chain.'));\n        }\n\n        chain.forEach((p, index) => {\n            if (!isValidProcessor(p)) {\n                throw new Error(this._buildErrorMessage(`Invalid Processor Provided at ${index}`));\n            }\n        });\n\n        this._chain = chain;\n    },\n\n    appendToChain(processor) {\n        if (!isValidProcessor(processor)) {\n            throw new Error(this._buildErrorMessage('Invalid Processor Provided'));\n        }\n        this._chain.push(processor);\n\n        return this._chain;\n    },\n\n    enqueueEvent(queueId, event) {\n        // NICETOHAVE/FUTURE: Optimize the chain by rejecting duplicate events\n        if (!this._isLifecycleValid()) {\n            // Do not enqueue more events if the chain or container are shutting down\n            return;\n        }\n\n        if (this._processingQueueMap[queueId]) {\n            this._processingQueueMap[queueId].workQueue.unshift(event);\n        } else {\n            this._processingQueueMap[queueId] = {\n                workQueue: [event],\n                activeWorkItem: null\n            };\n        }\n        this._checkForWork();\n    },\n\n    _checkForWork() {\n        let emptyQueueIds = [];\n        for (let currQueueId in this._processingQueueMap) {\n            const currQueue = this._processingQueueMap[currQueueId];\n            if (!currQueue.activeWorkItem) {\n                if (currQueue.workQueue.length > 0) {\n                    // start work\n                    let event = currQueue.workQueue.pop();\n                    currQueue.activeWorkItem = (async () => {\n                        try {\n                            await this._processEventThroughChain(event);\n                        } catch (error) {\n                            console.error(this._buildLoggerMessage('Exception thrown in process chain'), {\n                                event,\n                                error,\n                                remoteData: {\n                                    chainLabel: this._safeLabel\n                                }\n                            });\n                        }\n                        currQueue.activeWorkItem = null;\n                        this._checkForWork();\n                    })();\n                } else {\n                    emptyQueueIds.push(currQueueId);\n                }\n            }\n        }\n\n        emptyQueueIds.forEach(c => {\n            this._processingQueueMap[c] = undefined;\n            delete this._processingQueueMap[c];\n        });\n    },\n\n    async _processEventThroughChain(event) {\n        if (!this._isLifecycleValid()) {\n            // Lifecycle ended.  Log and skip processing this event.\n            console.debug(\n                this._buildLoggerMessage(\n                    'Chain or Lifecycle Container are shutting down.  Event will be skipped.  All active and queued work will be dropped.'\n                ),\n                {\n                    event,\n                    remoteData: {\n                        chainLabel: this._safeLabel,\n                        chainIndex: 0\n                    }\n                }\n            );\n\n            return;\n        }\n\n        const chain = this._chain;\n        if (chain && chain.length > 0) {\n            console.debug(this._buildLoggerMessage('Processing Event through chain'), {\n                event,\n                remoteData: {\n                    chainLabel: this._safeLabel\n                }\n            });\n            await this._chainHelper(chain, 0, event);\n        }\n    },\n\n    async _chainHelper(chain, chainIndex, context) {\n        let processor = chain[chainIndex];\n        let { label, process } = processor;\n\n        if (!this._isLifecycleValid()) {\n            // Lifecycle ended.  Log and end this processing chain.\n            console.debug(\n                this._buildLoggerMessage(\n                    'Chain or Lifecycle Container are shutting down.  Processor will be skipped.  All active and queued work will be dropped.'\n                ),\n                {\n                    remoteData: {\n                        chainLabel: this._safeLabel,\n                        chainIndex,\n                        processorLabel: label\n                    }\n                }\n            );\n\n            return;\n        }\n\n        let processorResult;\n        try {\n            console.debug(this._buildLoggerMessage('Running Processor'), {\n                context,\n                remoteData: {\n                    chainLabel: this._safeLabel,\n                    chainIndex,\n                    processorLabel: label\n                }\n            });\n            processorResult = await process(context);\n        } catch (e) {\n            console.error(this._buildLoggerMessage('Processor threw or rejected'), {\n                context,\n                e,\n                remoteData: {\n                    chainLabel: this._safeLabel,\n                    chainIndex,\n                    processorLabel: label\n                }\n            });\n            return;\n        }\n\n        let processorResultType = typeOf(processorResult);\n        if (\n            !['undefined', 'boolean', 'object'].includes(processorResultType) ||\n            (processorResultType === 'boolean' && processorResult !== false)\n        ) {\n            console.error(this._buildLoggerMessage('Processor returned unallowed value'), {\n                context,\n                remoteData: {\n                    chainLabel: this._safeLabel,\n                    chainIndex,\n                    processorLabel: label,\n                    processorResultType\n                }\n            });\n            return;\n        }\n\n        if (processorResult === false) {\n            console.info(this._buildLoggerMessage('Processor haulted chain'), {\n                context,\n                remoteData: {\n                    chainLabel: this._safeLabel,\n                    chainIndex,\n                    processorLabel: label\n                }\n            });\n            return;\n        }\n\n        if (chainIndex + 1 < chain.length) {\n            // Call the next processor in the chain with the existing or mutated context\n            await this._chainHelper(chain, chainIndex + 1, !processorResult ? context : processorResult);\n        }\n    },\n\n    _buildLoggerMessage(msg) {\n        return [MSG_NAMESPACE, msg].join(' - ');\n    },\n\n    _buildErrorMessage(msg) {\n        return [MSG_NAMESPACE, this._safeLabel, msg].join(' - ');\n    },\n\n    _safeLabel: computed('label', '_defaultLabel', function () {\n        const { label, _defaultLabel } = this;\n        return label || _defaultLabel;\n    }),\n\n    _isLifecycleValid() {\n        const lifecycleContainer = this.lifecycleContainer;\n\n        return !(\n            this.isDestroying ||\n            this.isDestroyed ||\n            (lifecycleContainer && (lifecycleContainer.get('isDestroying') || lifecycleContainer.get('isDestroyed')))\n        );\n    }\n});\n\nfunction isValidProcessor(processor) {\n    if (!processor || !processor.process) {\n        return false;\n    }\n    return typeof processor === 'object' && typeof processor.process === 'function';\n}\n\nexport default QueuedProcessingChain;\n","import RSVP from 'rsvp';\nimport TtlCache from '../ttl-cache';\nimport { uniq } from 'lodash';\n\nexport enum EntityTypes {\n    TEAM = 'team',\n    USER = 'user',\n    QUEUE = 'queue'\n}\n\nexport enum MetricTypes {\n    UNKNOWN = 'Unknown',\n    INTERVAL = 'Interval',\n    INSTANCE = 'Instance'\n}\n\nenum DetailPageSubPath {\n    USER = 'agents',\n    QUEUE = 'queues'\n}\n\ninterface Entity {\n    id: string;\n    name?: string;\n}\n\ninterface AlertSummary {\n    entities?: AlertSummaryEntity[];\n    conversation?: {\n        id: string;\n    };\n    metricType?: MetricTypes;\n}\n\ninterface AlertSummaryEntity {\n    entityType: EntityTypes;\n    user?: Entity;\n    queue?: Entity;\n    team?: Entity;\n    alerting: boolean;\n}\n\ninterface ReportingAlertSummaryArgs {\n    ruleName: string;\n    alertSummary?: AlertSummary;\n    alertingEntitiesOnly?: boolean;\n    intl: any;\n    cache: TtlCache<string | undefined>;\n    queueService: any;\n    engageanalytics: any;\n    logger: any;\n}\n\ninterface EntityDetail {\n    type: string;\n    names: string;\n}\n\ninterface Permissions {\n    canViewInteractionDetails: boolean;\n    canViewAgentStatusDetails: boolean;\n    canViewAgentPerformanceDetails: boolean;\n    canViewQueuePerformance: boolean;\n}\n\n/**\n * Given an alert summary object and permissions, figure out analytics-ui detail page route.\n * If the alert summary contains a conversation id, then build interaction detail route.\n * Else, based on the entityType value, determine whether the route should be agent status detail,\n * queue performance detail or agent status group detail. Also calculate agentIds or queueId\n * for filtering in the page.\n */\nexport function buildDetailPageRoute(\n    alertSummary: AlertSummary | undefined,\n    permissions: Permissions,\n    alertingEntitiesOnly = false\n): string | undefined {\n    const conversationId = alertSummary?.conversation?.id;\n\n    //if conversationId is found, then build interaction-detail route.\n    if (conversationId) {\n        if (permissions?.canViewInteractionDetails) {\n            return `#/analytics/interactions/${conversationId}/admin/details`;\n        } else {\n            return;\n        }\n    }\n\n    // for building detail page route in the inbox, we'll use alerting + non alerting entities.\n    let entities = alertSummary?.entities ?? [];\n\n    // for building detail page route in the toast (when hawk update is received), we'll use alerting entities only.\n    if (alertingEntitiesOnly) {\n        entities = entities.filter(entity => entity.alerting);\n    }\n\n    let entityType: string | undefined = entities[0]?.entityType.toLowerCase();\n    let canViewPage: boolean;\n    let pageType: 'status' | 'performance';\n\n    if (entityType) {\n        let subPath;\n\n        if (entityType === EntityTypes.QUEUE) {\n            subPath = DetailPageSubPath.QUEUE;\n            canViewPage = !!permissions?.canViewQueuePerformance;\n            pageType = 'performance';\n        } else if (entityType === EntityTypes.TEAM || entityType === EntityTypes.USER) {\n            // for team or user, pick user ids for agent group status page or agent performance detail\n            entityType = EntityTypes.USER;\n            subPath = DetailPageSubPath.USER;\n            if (alertSummary?.metricType === MetricTypes.INTERVAL) {\n                canViewPage = !!permissions?.canViewAgentPerformanceDetails;\n                pageType = 'performance';\n            } else {\n                canViewPage = !!permissions?.canViewAgentStatusDetails;\n                pageType = 'status';\n            }\n        } else {\n            // if entityType isn't a user, queue or team, do not build route\n            return;\n        }\n\n        const alertingEntityIds = entities\n            .map(entity => entity[entityType as EntityTypes]?.id)\n            .filter((id): id is string => !!id);\n        const alertingEntityIdsLength = alertingEntityIds.length;\n\n        if (alertingEntityIdsLength && canViewPage) {\n            //Routes are different for one and multiple entities.\n            if (alertingEntityIdsLength === 1) {\n                //This will be always true for entityType=Queue because alert rules only allow\n                //one queue for instance based metrics.\n                return `#/analytics/${subPath}/${alertingEntityIds[0]}/${pageType}`;\n            }\n\n            //There could be multiple agents for team based alert rule.\n            return `#/analytics/${subPath}/group/status?user=${alertingEntityIds.join(',')}`;\n        }\n    }\n\n    return;\n}\n\nexport class ReportingAlertSummary {\n    constructor(private args: ReportingAlertSummaryArgs) {}\n\n    get entities(): AlertSummaryEntity[] {\n        // we want to show only alerting entities for hawk update.\n        if (this.args.alertingEntitiesOnly) {\n            return this.args.alertSummary?.entities?.filter(entity => entity.alerting) ?? [];\n        }\n\n        return this.args.alertSummary?.entities ?? [];\n    }\n\n    translate(keyString: string | undefined, isTitle = false): string {\n        const intl = this.args.intl;\n        const titleKey = `notification.inbox.reportingAlertSummary.title.${keyString}`;\n        const bodyKey = `notification.inbox.reportingAlertSummary.entityDetails.${keyString}`;\n        const key = isTitle ? titleKey : bodyKey;\n\n        return intl.exists(key) ? intl.t(key) : intl.t('purecloud.unknown');\n    }\n\n    /**\n     * Multiple entities in the reportingAlert.alertSummary.entities list will\n     * always have same entityType, so its efficient to pick the first element\n     * from the array for the main entity type.\n     */\n    getMainEntity(): string {\n        const entities = this.entities;\n        const entityType = entities[0]?.entityType;\n\n        if (entityType) {\n            return this.translate(entityType.toLowerCase(), true);\n        }\n\n        return '';\n    }\n\n    buildDetailPageRoute(permissions: Permissions): string | undefined {\n        return buildDetailPageRoute(this.args.alertSummary, permissions, this.args.alertingEntitiesOnly);\n    }\n\n    async getOtherEntities(): Promise<EntityDetail[]> {\n        const cache = this.args.cache;\n        const entities = this.entities;\n        const promises = [];\n\n        const entityDetails: Record<string, string[]> = {\n            queue: [],\n            team: [],\n            user: []\n        };\n\n        entities.forEach(entityObject => {\n            const entries = Object.entries(entityObject);\n            entries.forEach(([key, value]) => {\n                const type = key.toLowerCase();\n                if (entityDetails.hasOwnProperty(type)) {\n                    entityDetails[type].push(value.id);\n                }\n            });\n        });\n\n        for (const entityType in entityDetails) {\n            const entityIds = entityDetails[entityType].filter(entityId => !cache.has(entityId));\n\n            if (entityIds.length) {\n                if (entityType === EntityTypes.QUEUE) {\n                    promises.push(this.getQueues(entityIds));\n                }\n\n                if (entityType === EntityTypes.USER) {\n                    promises.push(this.getUsers(entityIds));\n                }\n\n                if (entityType === EntityTypes.TEAM) {\n                    promises.push(this.getTeams(entityIds));\n                }\n            }\n        }\n\n        await RSVP.allSettled(promises);\n\n        return Object.entries(entityDetails)\n            .map(([type, entityIds]) => {\n                if (entityIds.length) {\n                    return {\n                        type: this.translate(type),\n                        names: uniq(entityIds)\n                            .map(entityId => cache.get(entityId) || entityId)\n                            .join(', ')\n                    };\n                }\n                return;\n            })\n            .filter((entity): entity is EntityDetail => !!entity);\n    }\n\n    hasOtherEntityDetails(): boolean {\n        return this.entities\n            .map(entity => Object.entries(entity))\n            .reduce((flatEntries, entries) => flatEntries.concat(entries), [])\n            .some(entry => entry[1]?.id);\n    }\n\n    private async getQueues(entityIds: string[]): Promise<any> {\n        let queuesResponse: Record<string, Entity[]> = {};\n\n        try {\n            queuesResponse = await this.args.queueService.getQueues(undefined, entityIds);\n        } catch (error) {\n            this.args.logger.error('Error getting queues', { error });\n        }\n\n        if (queuesResponse.entities?.length) {\n            queuesResponse.entities.forEach(result => this.args.cache.put(result.id, result.name));\n        }\n    }\n\n    private async getUsers(entityIds: string[]): Promise<any> {\n        let usersResponse: Record<string, Entity[]> = {};\n\n        try {\n            usersResponse = await this.args.engageanalytics.getUsersByIds(entityIds);\n        } catch (error) {\n            this.args.logger.error('Error getting users', { error });\n        }\n\n        if (usersResponse.results?.length) {\n            usersResponse.results.forEach(entity => this.args.cache.put(entity.id, entity.name));\n        }\n    }\n\n    private async getTeams(entityIds: string[]): Promise<any> {\n        let teamsResponse: Record<string, Entity[]> = {};\n\n        try {\n            teamsResponse = await this.args.engageanalytics.getTeamsByIds(entityIds);\n        } catch (error) {\n            this.args.logger.error('Error getting teams', { error });\n        }\n\n        if (teamsResponse.results?.length) {\n            teamsResponse.results.forEach((entity: any) => this.args.cache.put(entity.id, entity.name));\n        }\n    }\n\n    async generateToast(): Promise<string> {\n        const mainEntity = this.getMainEntity();\n        const separator = mainEntity ? ' - ' : '';\n\n        const mainEntityRuleNameHtml = `<p style=\"font-weight:600;margin:0\"> ${mainEntity}${separator}${this.args.ruleName} </p>`;\n\n        const entitiesDetails = await this.getOtherEntities();\n\n        const entityDetailsHtml = entitiesDetails.map(entityDetail => {\n            const { type, names } = entityDetail;\n\n            if (names) {\n                return `<p style=\"margin:0\"> ${this.args.intl.t(\n                    'notification.inbox.reportingAlertSummary.entityDetail',\n                    { type, names }\n                )} </p>`;\n            }\n\n            return '';\n        });\n\n        return `\n            <div class=\"reporting-alert-summary\">\n                <div class=\"reporting-alert-summary-name\">\n                    ${mainEntityRuleNameHtml}\n                </div>\n\n                <div class=\"reporting-alert-summary-entity-details\">\n                    ${entityDetailsHtml.join('')}\n                </div>\n\n            </div>\n        `;\n    }\n}\n","import { isAjaxError, AjaxError } from 'ember-ajax/errors';\nimport DS from 'ember-data';\nimport { RawErrorResponse } from 'ember-ajax/-private/types';\nimport { hasKey } from './types';\n\nexport type RequestFailureLoggableDetails = {\n    status?: number;\n    correlationId?: string;\n};\n\nexport function getLoggableRequestFailureDetails(errorResponse: unknown): undefined | RequestFailureLoggableDetails {\n    if (!errorResponse || typeof errorResponse !== 'object') {\n        return undefined;\n    }\n\n    try {\n        if (errorResponse instanceof DS.AdapterError) {\n            return getAdapterErrorLoggableDetails(errorResponse);\n        } else if (isAjaxError(errorResponse)) {\n            return getAjaxErrorLoggableDetails(errorResponse);\n        } else if (isRawErrorResponse(errorResponse)) {\n            return getRawAjaxErrorLoggableDetails(errorResponse);\n        }\n    } catch (_) {}\n\n    return undefined;\n}\n\nfunction getAdapterErrorLoggableDetails(adapterError: DS.AdapterError): undefined | RequestFailureLoggableDetails {\n    if (hasKey(adapterError, 'errors') && Array.isArray(adapterError.errors) && adapterError.errors.length > 0) {\n        const error = adapterError.errors[0];\n        if (error && typeof error === 'object') {\n            // Tragically, all the various adapters in this baseline are inconsistent\n            // So, we need to check the root error as well as error.detail and error.details for the server payload\n            return Object.assign(\n                {},\n                ...[error, error.detail, error.details].map<undefined | RequestFailureLoggableDetails>(curr => {\n                    const payloadDetails = getLoggableRequestFailureDetailsPartial(curr);\n\n                    if (!payloadDetails) {\n                        return undefined;\n                    }\n\n                    // Prune out undefined values so they won't override previous, non-undefined values in Object.assign\n                    return Object.fromEntries(\n                        Object.entries(payloadDetails).filter(([, value]) => value !== undefined)\n                    );\n                })\n            );\n        }\n    }\n\n    return undefined;\n}\n\nfunction getAjaxErrorLoggableDetails({ status, payload }: AjaxError): undefined | RequestFailureLoggableDetails {\n    const result: RequestFailureLoggableDetails = {\n        status: status\n    };\n\n    if (\n        payload &&\n        typeof payload === 'object' &&\n        hasKey(payload, 'contextId') &&\n        typeof payload.contextId === 'string' &&\n        isUuid(payload.contextId)\n    ) {\n        result.correlationId = payload.contextId;\n    }\n\n    return result;\n}\n\nfunction getRawAjaxErrorLoggableDetails(rawErrorResponse: RawErrorResponse): RequestFailureLoggableDetails {\n    return {\n        status: rawErrorResponse.jqXHR.status,\n        correlationId: rawErrorResponse.jqXHR.getResponseHeader('inin-correlation-id') || undefined\n    };\n}\n\nfunction getLoggableRequestFailureDetailsPartial(payload: unknown): undefined | RequestFailureLoggableDetails {\n    if (!payload || typeof payload !== 'object') {\n        return undefined;\n    }\n\n    let result: undefined | RequestFailureLoggableDetails = undefined;\n\n    if (hasKey(payload, 'status')) {\n        if (typeof payload.status === 'number' && Number.isInteger(payload.status)) {\n            result = result || {};\n            result.status = payload.status;\n        } else if (typeof payload.status === 'string') {\n            const statusInt = parseInt(payload.status, 10);\n            if (Number.isInteger(statusInt) && payload.status === statusInt + '') {\n                result = result || {};\n                result.status = statusInt;\n            }\n        }\n    }\n\n    if (hasKey(payload, 'contextId') && typeof payload.contextId === 'string' && isUuid(payload.contextId)) {\n        result = result || {};\n        result.correlationId = payload.contextId;\n    }\n\n    return result;\n}\n\nconst UUID_REGEXP = /^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/;\nfunction isUuid(toCheck: string) {\n    return UUID_REGEXP.test(toCheck);\n}\n\nfunction isRawErrorResponse(toCheck: unknown): toCheck is RawErrorResponse {\n    if (!toCheck || typeof toCheck !== 'object') return false;\n\n    // We can reasonably assume this is a ember-ajax RawErrorResponse\n    return ['payload', 'textStatus', 'jqXHR', 'errorThrown', 'response'].every(currProp =>\n        Object.prototype.hasOwnProperty.call(toCheck, currProp)\n    );\n}\n","/**\n * RovingTabIndex utility class for managing keyboard navigation in lists.\n * Implements the roving tabindex pattern where only one element in a group\n * has tabindex=\"0\" and the rest have tabindex=\"-1\", allowing arrow key navigation.\n */\nexport class RovingTabIndex {\n    private container: HTMLElement;\n    private focusableElements: HTMLElement[] = [];\n    private keydownHandler: (event: KeyboardEvent) => void;\n    private mutationObserver: MutationObserver | null = null;\n    private type: 'horizontal' | 'vertical' | 'both';\n    private loop: boolean;\n    private enabled: boolean;\n    private roving: boolean;\n\n    constructor(\n        container: HTMLElement,\n        options: {\n            type?: 'horizontal' | 'vertical' | 'both';\n            loop?: boolean;\n            enabled?: boolean;\n            roving?: boolean;\n            filterFocusables?: (el: HTMLElement) => boolean;\n        } = {}\n    ) {\n        this.container = container;\n        this.type = options.type ?? 'vertical';\n        this.loop = options.loop ?? false;\n        this.enabled = options.enabled ?? true;\n        this.roving = options.roving ?? true;\n\n        // Bind handlers\n        this.keydownHandler = this.handleKeydown.bind(this);\n\n        // Initialize\n        this.updateFocusableElements(options.filterFocusables);\n        this.setupMutationObserver();\n        this.setupKeyboardListener();\n    }\n\n    /**\n     * Updates the list of focusable elements and manages tabindexes\n     */\n    private updateFocusableElements(filterFocusables?: (el: HTMLElement) => boolean): void {\n        if (!this.container) return;\n\n        const elements = Array.from(this.container.querySelectorAll<HTMLElement>('[tabindex]')).filter(\n            el => !el.hasAttribute('disabled')\n        );\n\n        this.focusableElements = filterFocusables ? elements.filter(filterFocusables) : elements;\n\n        this.cleanupTabIndexes();\n    }\n\n    /**\n     * Ensures only one element has tabindex=\"0\" (the rest get tabindex=\"-1\")\n     */\n    private cleanupTabIndexes(): void {\n        if (!this.roving) return;\n\n        const zeroTabindexElements = this.focusableElements.filter(el => el.tabIndex === 0);\n\n        if (zeroTabindexElements.length > 1) {\n            // Multiple elements with tabindex=\"0\", keep only the first one\n            zeroTabindexElements.slice(1).forEach(el => {\n                el.tabIndex = -1;\n            });\n        } else if (zeroTabindexElements.length === 0 && this.focusableElements.length > 0) {\n            // No element with tabindex=\"0\", set the first one (or one with data-default-tabindex)\n            const defaultTabindexElement =\n                this.focusableElements.find(el => el.dataset.defaultTabindex) || this.focusableElements[0];\n            if (defaultTabindexElement) {\n                defaultTabindexElement.tabIndex = 0;\n            }\n        }\n    }\n\n    /**\n     * Handles keyboard events for arrow key navigation\n     */\n    private handleKeydown(event: KeyboardEvent): void {\n        const activeElement = document.activeElement;\n        if (\n            !activeElement ||\n            !(activeElement instanceof HTMLElement) ||\n            !this.focusableElements.includes(activeElement)\n        ) {\n            return;\n        }\n\n        if (!this.enabled) {\n            return;\n        }\n\n        let targetElement: HTMLElement | undefined;\n\n        switch (event.key) {\n            case 'ArrowLeft': {\n                if (['both', 'horizontal'].includes(this.type)) {\n                    event.preventDefault();\n                    const currentIndex = this.focusableElements.indexOf(activeElement);\n                    targetElement = this.focusableElements[currentIndex - 1];\n                    if (!targetElement && this.loop) {\n                        targetElement = this.focusableElements[this.focusableElements.length - 1];\n                    }\n                }\n                break;\n            }\n            case 'ArrowRight': {\n                if (['both', 'horizontal'].includes(this.type)) {\n                    event.preventDefault();\n                    const currentIndex = this.focusableElements.indexOf(activeElement);\n                    targetElement = this.focusableElements[currentIndex + 1];\n                    if (!targetElement && this.loop) {\n                        targetElement = this.focusableElements[0];\n                    }\n                }\n                break;\n            }\n            case 'ArrowUp': {\n                if (['both', 'vertical'].includes(this.type)) {\n                    event.preventDefault();\n                    const currentIndex = this.focusableElements.indexOf(activeElement);\n                    targetElement = this.focusableElements[currentIndex - 1];\n                    if (!targetElement && this.loop) {\n                        targetElement = this.focusableElements[this.focusableElements.length - 1];\n                    }\n                }\n                break;\n            }\n            case 'ArrowDown': {\n                if (['both', 'vertical'].includes(this.type)) {\n                    event.preventDefault();\n                    const currentIndex = this.focusableElements.indexOf(activeElement);\n                    targetElement = this.focusableElements[currentIndex + 1];\n                    if (!targetElement && this.loop) {\n                        targetElement = this.focusableElements[0];\n                    }\n                }\n                break;\n            }\n        }\n\n        if (targetElement) {\n            if (this.roving) {\n                activeElement.tabIndex = -1;\n                targetElement.tabIndex = 0;\n            }\n            targetElement.focus();\n        }\n    }\n\n    /**\n     * Sets up a MutationObserver to watch for DOM changes\n     */\n    private setupMutationObserver(): void {\n        this.mutationObserver = new MutationObserver(() => {\n            this.updateFocusableElements();\n        });\n\n        this.mutationObserver.observe(this.container, {\n            attributes: true,\n            attributeFilter: ['tabindex', 'disabled'],\n            subtree: true,\n            childList: true\n        });\n    }\n\n    /**\n     * Sets up the keyboard event listener\n     */\n    private setupKeyboardListener(): void {\n        window.addEventListener('keydown', this.keydownHandler);\n    }\n\n    /**\n     * Manually update the focusable element (useful when programmatically changing focus)\n     */\n    public updateFocusable(el: HTMLElement): void {\n        if (this.roving) {\n            const lastActiveElement = this.focusableElements.find(el => el.tabIndex === 0);\n            if (lastActiveElement) {\n                lastActiveElement.tabIndex = -1;\n            }\n            el.tabIndex = 0;\n        }\n    }\n\n    /**\n     * Refresh the list of focusable elements\n     */\n    public refresh(): void {\n        this.updateFocusableElements();\n    }\n\n    /**\n     * Clean up resources\n     */\n    public destroy(): void {\n        if (this.mutationObserver) {\n            this.mutationObserver.disconnect();\n        }\n        window.removeEventListener('keydown', this.keydownHandler);\n        this.focusableElements = [];\n    }\n}\n","import { set, get } from '@ember/object';\n\nexport default function (object, property, value) {\n    if (property && isSafe(object)) {\n        return set(object, property, value);\n    }\n}\n\nexport function isSafe(object) {\n    return object && !(get(object, 'isDestroyed') || get(object, 'isDestroying'));\n}\n","import { StorageService } from 'web-directory/services/storage';\n\nconst SCHEDULE_CALLBACK_GADGET_SESSION_STORAGE_KEY = 'schedule-callback-gadget';\n\nexport async function updateScheduleCallbackGadgetSessionStorage(\n    interactionId: string,\n    numbersToAdd: { number?: string; value?: string }[],\n    storage: StorageService\n) {\n    if (!numbersToAdd?.length) return;\n    let newCallbackNumbersByInteractionId: Record<string, string[]> = {};\n\n    const sessionStorageValue = storage.getSessionStorageItem(SCHEDULE_CALLBACK_GADGET_SESSION_STORAGE_KEY);\n    if (!!sessionStorageValue) {\n        const prevCallbackNumbersByInteractionId = JSON.parse(sessionStorageValue);\n        newCallbackNumbersByInteractionId = { ...prevCallbackNumbersByInteractionId };\n    }\n\n    // In SP, numbersToAdd uses \"number\" property\n    // In MP, numbersToAdd uses \"value\" property\n    newCallbackNumbersByInteractionId[interactionId] = numbersToAdd.map(n => n.number || n.value || '');\n\n    storage.setSessionStorageItem(\n        SCHEDULE_CALLBACK_GADGET_SESSION_STORAGE_KEY,\n        JSON.stringify(newCallbackNumbersByInteractionId)\n    );\n}\n\nexport async function cleanupScheduleCallbackGadgetSessionStorage(\n    interactionIdsToRemove: string[],\n    storage: StorageService | undefined\n) {\n    const sessionStorageValue = storage?.getSessionStorageItem?.(SCHEDULE_CALLBACK_GADGET_SESSION_STORAGE_KEY);\n    if (!storage || !sessionStorageValue) return;\n\n    const callbackNumbersByInteractionId: Record<string, string[]> = JSON.parse(sessionStorageValue);\n\n    if (!!callbackNumbersByInteractionId) {\n        interactionIdsToRemove.forEach(id => {\n            delete callbackNumbersByInteractionId[id];\n        });\n    }\n\n    // If the session storage value is an empty object after the update, delete the whole item.\n    // Otherwise, update the session storage with the relevant interactionId removed\n    if (!Object.keys(callbackNumbersByInteractionId).length) {\n        storage.removeSessionStorageItem(SCHEDULE_CALLBACK_GADGET_SESSION_STORAGE_KEY);\n    } else {\n        storage.setSessionStorageItem(\n            SCHEDULE_CALLBACK_GADGET_SESSION_STORAGE_KEY,\n            JSON.stringify(callbackNumbersByInteractionId)\n        );\n    }\n}\n","import { Promise, resolve, reject } from 'rsvp';\nimport type { StashLoggerLogPayload, StashLoggerService } from '@web-directory/services';\nimport { hasKey } from './types';\n\nexport type AsyncPromiseChainStep = {\n    stepDesc: string;\n    process: () => Promise<any>;\n};\nexport type SyncPromiseChainStep = {\n    stepDesc: string;\n    processSync: () => any;\n};\n\nexport type PromiseChainStep = AsyncPromiseChainStep | SyncPromiseChainStep;\nfunction isSyncPromiseChainStep(toCheck: PromiseChainStep): toCheck is SyncPromiseChainStep {\n    return 'processSync' in toCheck;\n}\n\nexport type LoggingConfig = {\n    logger: StashLoggerService;\n    logMsgPrefix?: string;\n};\n\nexport type ChainOptions = {\n    loggingConfig?: LoggingConfig;\n};\n\nexport type ChainStepFailure = {\n    origReason: any;\n    stepDesc: string;\n};\n\nexport function isChainStepFailure(toCheck: unknown): toCheck is ChainStepFailure {\n    if (!toCheck || typeof toCheck !== 'object') {\n        return false;\n    }\n\n    return hasKey(toCheck, 'origReason') && hasKey(toCheck, 'stepDesc') && typeof toCheck.stepDesc === 'string';\n}\n\n/**\n * Serially executes a chain of synchronous and/or asynchronous steps utilizing RSVP promises\n * to work correctly with the Ember runloop.\n *\n * Work will not be started (no promise creation) until the previous step completes successfully\n * The chain will hault and reject with a ChainStepFailure upon the first encountered step rejection or thrown error\n */\nexport function executeChain(chain: PromiseChainStep[], { loggingConfig }: ChainOptions = {}): Promise<void> {\n    loggingConfig?.logger.debug(buildLogMsg('Chain begin', loggingConfig), {\n        remoteData: { chainLength: chain.length }\n    });\n\n    return chain\n        .reduce((acc, currChainStep, stepIndex) => {\n            const { stepDesc } = currChainStep;\n            const stepProgress = `${stepIndex + 1} of ${chain.length}`;\n            return acc.then(() => {\n                return resolve()\n                    .then(() => {\n                        loggingConfig?.logger.debug(buildLogMsg('Step begin', loggingConfig), {\n                            remoteData: { stepDesc, stepProgress }\n                        });\n                        if (isSyncPromiseChainStep(currChainStep)) {\n                            return currChainStep.processSync();\n                        } else {\n                            return currChainStep.process();\n                        }\n                    })\n                    .then(() => {\n                        loggingConfig?.logger.debug(buildLogMsg('Step success', loggingConfig), {\n                            remoteData: { stepDesc, stepProgress }\n                        });\n                        return;\n                    })\n                    .catch(reason => {\n                        loggingConfig?.logger.warn(buildLogMsg('Step failure', loggingConfig), {\n                            reason,\n                            remoteData: { stepDesc, stepProgress }\n                        });\n                        return reject({\n                            origReason: reason,\n                            stepDesc\n                        } as ChainStepFailure);\n                    });\n            });\n        }, resolve())\n        .then(() => {\n            loggingConfig?.logger.debug(buildLogMsg('Chain success', loggingConfig), {\n                remoteData: { chainLength: chain.length }\n            });\n        })\n        .catch(reason => {\n            const logPayload: StashLoggerLogPayload = {\n                remoteData: {\n                    chainLength: chain.length\n                }\n            };\n\n            // Theoretically, we ensure reason will always be a ChainStepFailure, but .. promise rejection typings\n            if (isChainStepFailure(reason)) {\n                logPayload.origReason = reason.origReason;\n                logPayload.remoteData!.failedStep = reason.stepDesc;\n            }\n\n            loggingConfig?.logger.warn(buildLogMsg('Chain failure', loggingConfig), logPayload);\n\n            return reject(reason);\n        });\n}\n\nfunction buildLogMsg(msg: string, loggingConfig: undefined | LoggingConfig) {\n    return `${loggingConfig?.logMsgPrefix ? loggingConfig.logMsgPrefix : ''}${msg}`;\n}\n","import { buildSymbolMap } from 'web-directory/utils/boolean-expressions';\nimport { computed } from '@ember/object';\nimport { getOwner } from '@ember/application';\n\nexport interface SharedProviderConfigEntry {\n    boolExpr?: string;\n    dependencies?: string[];\n    providerInstance?: { destroy(): void } | null;\n    evaluator?: (symbolMap: Record<string, boolean>) => boolean;\n}\n\nexport type SharedProviderConfig = Record<string, SharedProviderConfigEntry>;\n\ninterface AppProviderComputedThis {\n    get(key: string): unknown;\n    logger: { warn(message: string, details?: Record<string, unknown>): void };\n}\n\nexport const _buildProviderComputed = function (\n    providerConfig: SharedProviderConfig,\n    providerKeyPrefix: string = 'app-provider'\n) {\n    let dependencies: string[] = ['permissions.donutPermissions.[]', 'session.features'];\n    const keys = Object.keys(providerConfig);\n    keys.forEach(currKey => {\n        const entryDeps = providerConfig[currKey].dependencies;\n        if (entryDeps) {\n            dependencies = [...dependencies, ...entryDeps];\n        }\n    });\n    dependencies = [...new Set(dependencies)];\n\n    const evaluateProviderExpression = function (\n        expr: string,\n        features: Record<string, boolean>,\n        permissions: { validateDonutPermission(key: string): boolean }\n    ): Record<string, boolean> {\n        return buildSymbolMap(expr, {\n            ft: (keyName: string) => {\n                return features[keyName];\n            },\n            perm: (keyName: string) => {\n                return permissions.validateDonutPermission(keyName);\n            },\n            bool: (keyName: string) => {\n                return keyName === 'true';\n            }\n        }) as Record<string, boolean>;\n    };\n\n    const callback = function (this: AppProviderComputedThis) {\n        const validProviders: unknown[] = [];\n        const permissions = this.get('permissions') as { validateDonutPermission(key: string): boolean };\n        const features = this.get('session.features') as Record<string, boolean>;\n        keys.forEach(currKey => {\n            const entry = providerConfig[currKey];\n            const boolExpr = entry.boolExpr;\n            const oldProvider = entry.providerInstance;\n            let validProvider: boolean;\n            if (boolExpr) {\n                try {\n                    const runEvaluator = entry.evaluator;\n                    validProvider = Boolean(\n                        runEvaluator && runEvaluator(evaluateProviderExpression(boolExpr, features, permissions))\n                    );\n                } catch {\n                    validProvider = false;\n                }\n            } else {\n                validProvider = true;\n                this.logger.warn('There are no feature toggle or permission restrictions for provider: ', {\n                    key: currKey\n                });\n            }\n            if (validProvider) {\n                if (!oldProvider) {\n                    entry.providerInstance = getOwner(this).lookup(`${providerKeyPrefix}:${currKey}`);\n                }\n                // Avoid adding a null provider to the list, as it will cause an error when using this.get('interapptionProviders') collection\n                if (entry.providerInstance) {\n                    validProviders.push(entry.providerInstance);\n                }\n            } else if (oldProvider) {\n                oldProvider.destroy();\n                entry.providerInstance = null;\n            }\n        });\n        return validProviders;\n    };\n\n    type ComputedWithDynamicDeps = (...args: [...string[], typeof callback]) => ReturnType<typeof computed>;\n    return (computed as unknown as ComputedWithDynamicDeps)(...dependencies, callback);\n};\n","interface CacheItem<T> {\n    value: T;\n    timestamp: number;\n}\n\nexport default class SimpleCache<T> {\n    private cache: Map<string, CacheItem<T>> = new Map();\n\n    set(id: string, value: T, ttlMinutes = 60): void {\n        const expirationTime = Date.now() + ttlMinutes * 60 * 1000;\n        this.cache.set(id, { value, timestamp: expirationTime });\n    }\n\n    get(id: string): T | undefined {\n        const cachedItem = this.cache.get(id);\n\n        if (cachedItem && Date.now() < cachedItem.timestamp) {\n            return cachedItem.value;\n        }\n\n        this.cache.delete(id);\n        return undefined;\n    }\n\n    delete(id: string): void {\n        this.cache.delete(id);\n    }\n\n    clear(): void {\n        this.cache.clear();\n    }\n}\n","import StreamingClient from 'genesys-cloud-streaming-client';\n\nexport default StreamingClient;\n","/**\n * Converts a string to camelCase.\n * Replaces the Ember String.prototype.camelize() extension.\n */\nexport function camelize(str: string): string {\n    return str.replace(/[-_\\s]+(.)?/g, (_, c) => (c ? c.toUpperCase() : '')).replace(/^[A-Z]/, c => c.toLowerCase());\n}\n\n/**\n * Capitalizes the first letter of a string.\n * Replaces Ember.String.capitalize / _.capitalize.\n */\nexport function capitalize(str: string): string {\n    return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n/**\n * Converts a string to kebab-case.\n * Replaces _.kebabCase / Ember String.prototype.dasherize().\n */\nexport function kebabCase(str: string): string {\n    return str\n        .replace(/([a-z])([A-Z])/g, '$1-$2')\n        .replace(/[\\s_]+/g, '-')\n        .toLowerCase();\n}\n","export const MESSAGING_SUBTYPES = [\n    'apple',\n    'facebook',\n    'instagram',\n    'open',\n    'sms',\n    'twitter',\n    'whatsapp',\n    'webmessaging'\n] as const;\n","import ENV from 'web-directory/config/environment';\n\n/**\n * Determines if the app is currently running in a testing mode or not based on the ENV config used\n * at build time.\n *\n * @returns boolean detailing if the environment is in testing mode or not\n */\nexport const isTesting = ENV.environment === 'test';\n","import { later, cancel } from '@ember/runloop';\nimport { Promise } from 'rsvp';\n\nconst DEFAULT_CANCEL_TIME = 5000;\n\nexport default function (promise, timeout = DEFAULT_CANCEL_TIME, label = '') {\n    return new Promise(function (resolve, reject) {\n        const rejectOnTimeout = function () {\n            reject(`TimeoutPromise - timeout reached - ${label}`);\n        };\n        // Carry the label on the function name. This timer is only cancelled when the wrapped promise\n        // settles, so an unsettled promise leaves it scheduled — and an anonymous callback gives a\n        // leak report no way to say which caller armed it.\n        Object.defineProperty(rejectOnTimeout, 'name', { value: `timeoutPromise(${label})` });\n\n        const TIMEOUT_IDENTIFIER = later(rejectOnTimeout, timeout);\n\n        promise\n            .then(function (...params) {\n                cancel(TIMEOUT_IDENTIFIER);\n                resolve(...params);\n            })\n            .catch(function (...params) {\n                cancel(TIMEOUT_IDENTIFIER);\n                reject(...params);\n            });\n    });\n}\n","// Native Panels will eventually be replaced by providers and gadgets\nconst NATIVE_PANELS = ['details', 'scripts', 'responses', 'notes', 'scheduleCallback', 'wrapup'] as const;\ntype NativePanel = (typeof NATIVE_PANELS)[number];\n\nconst SCRIPTS_GADGET_PANEL_ID = 'scripts&scriptsProvider';\nconst deprecatedConversationSummaryPanelIds = ['interaction-details', 'agent-conversation-summary'].map(\n    currPanelId => `${currPanelId}&conversationSummaryInterapptionsProvider`\n);\nconst CONVERSATION_DETAILS_GADGET_PANEL_ID = 'conversation-details&conversationDetailsInterapptionsProvider';\nconst CANNED_RESPONSES_GADGET_PANEL_ID = 'responses&cannedResponsesProvider';\nconst SCHEDULE_CALLBACK_GADGET_PANEL_ID = 'scheduleCallbackGadget&scheduleCallbackGadgetProvider';\nconst NOTES_GADGET_PANEL_ID = 'notesGadget&notesGadgetProvider';\nconst WRAPUP_GADGET_PANEL_ID = 'wrapupCodesGadget&wrapupCodesGadgetProvider';\n\nexport interface PanelSetting {\n    type: 'BuiltIn' | 'BuiltInInterapption' | 'Integration';\n    panelId: string;\n}\n\ninterface TransformationMap {\n    [key: string]: {\n        dependentFeatureToggles?: string[];\n        active: (features: Record<string, boolean>) => boolean;\n        shouldTransformPanelSetting: (panelSetting: PanelSetting) => boolean;\n        transformPanelSetting: () => PanelSetting;\n        // Supports both single and multipanel\n        shouldTransformAppDefId: (appDefId: string) => boolean;\n        transformAppDefId: () => string;\n    };\n}\n\nconst transformationMaps: TransformationMap = {\n    // Note: Conversation Summary will be replaced by Conversation Details before going GA\n    // CS options were never shipped to AUiB and CS used two different panel ids which complicates the transform\n    // As such, we're only supporting between details and conversation-details\n    details: {\n        shouldTransformPanelSetting: panelSetting => {\n            return panelSetting.panelId === 'details' && panelSetting.type.toLowerCase() === 'builtin';\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltInInterapption',\n                panelId: CONVERSATION_DETAILS_GADGET_PANEL_ID\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return ['details', addNativeProvider('details'), ...deprecatedConversationSummaryPanelIds].includes(\n                appDefId\n            );\n        },\n        transformAppDefId: () => {\n            return CONVERSATION_DETAILS_GADGET_PANEL_ID;\n        },\n        active: () => {\n            return true;\n        }\n    },\n    notes: {\n        shouldTransformPanelSetting: panelSetting => {\n            return panelSetting.panelId === 'notes' && panelSetting.type.toLowerCase() === 'builtin';\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltInInterapption',\n                panelId: NOTES_GADGET_PANEL_ID\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === 'notes' || appDefId === addNativeProvider('notes');\n        },\n        transformAppDefId: () => {\n            return NOTES_GADGET_PANEL_ID;\n        },\n        dependentFeatureToggles: ['auraACWGadgets'],\n        active: () => {\n            // \"auraACWGadgets\" FT is globally enabled, so we can safely hardcode this state to be true\n            return true;\n        }\n    },\n    reverseNotes: {\n        shouldTransformPanelSetting: panelSetting => {\n            return (\n                panelSetting.panelId === NOTES_GADGET_PANEL_ID &&\n                panelSetting.type.toLowerCase() === 'builtininterapption'\n            );\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltIn',\n                panelId: 'notes'\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === NOTES_GADGET_PANEL_ID;\n        },\n        transformAppDefId: () => {\n            return 'notes';\n        },\n        active: features => {\n            return !transformationMaps.notes.active(features);\n        }\n    },\n    wrapup: {\n        shouldTransformPanelSetting: panelSetting => {\n            return panelSetting.panelId === 'wrapup' && panelSetting.type.toLowerCase() === 'builtin';\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltInInterapption',\n                panelId: WRAPUP_GADGET_PANEL_ID\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === 'wrapup' || appDefId === addNativeProvider('wrapup');\n        },\n        transformAppDefId: () => {\n            return WRAPUP_GADGET_PANEL_ID;\n        },\n        dependentFeatureToggles: ['auraACWGadgets'],\n        active: () => {\n            // \"auraACWGadgets\" FT is globally enabled, so we can safely hardcode this state to be true\n            return true;\n        }\n    },\n    reverseWrapup: {\n        shouldTransformPanelSetting: panelSetting => {\n            return (\n                panelSetting.panelId === WRAPUP_GADGET_PANEL_ID &&\n                panelSetting.type.toLowerCase() === 'builtininterapption'\n            );\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltIn',\n                panelId: 'wrapup'\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === WRAPUP_GADGET_PANEL_ID;\n        },\n        transformAppDefId: () => {\n            return 'wrapup';\n        },\n        active: features => {\n            return !transformationMaps.wrapup.active(features);\n        }\n    },\n    responses: {\n        shouldTransformPanelSetting: panelSetting => {\n            return panelSetting.panelId === 'responses' && panelSetting.type.toLowerCase() === 'builtin';\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltInInterapption',\n                panelId: CANNED_RESPONSES_GADGET_PANEL_ID\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === 'responses' || appDefId == addNativeProvider('responses');\n        },\n        transformAppDefId: () => {\n            return CANNED_RESPONSES_GADGET_PANEL_ID;\n        },\n        active: () => {\n            return true;\n        }\n    },\n    scheduleCallback: {\n        shouldTransformPanelSetting: panelSetting => {\n            return panelSetting.panelId === 'scheduleCallback' && panelSetting.type.toLowerCase() === 'builtin';\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltInInterapption',\n                panelId: SCHEDULE_CALLBACK_GADGET_PANEL_ID\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === 'scheduleCallback' || appDefId === addNativeProvider('scheduleCallback');\n        },\n        transformAppDefId: () => {\n            return SCHEDULE_CALLBACK_GADGET_PANEL_ID;\n        },\n        active: () => {\n            // \"PURE-5897_schedule-callback-gadget\" FT is globally enabled, so we can safely hardcode this state to be true\n            // Note that we no longer fetch this FT in web-directory\n            return true;\n        }\n    },\n    reverseScheduleCallback: {\n        shouldTransformPanelSetting: panelSetting => {\n            return (\n                panelSetting.panelId === SCHEDULE_CALLBACK_GADGET_PANEL_ID &&\n                panelSetting.type.toLowerCase() === 'builtininterapption'\n            );\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltIn',\n                panelId: 'scheduleCallback'\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === SCHEDULE_CALLBACK_GADGET_PANEL_ID;\n        },\n        transformAppDefId: () => {\n            return 'scheduleCallback';\n        },\n        active: features => {\n            return !transformationMaps.scheduleCallback.active(features);\n        }\n    },\n    scripts: {\n        shouldTransformPanelSetting: panelSetting => {\n            return panelSetting.panelId === 'scripts' && panelSetting.type.toLowerCase() === 'builtin';\n        },\n        transformPanelSetting: () => {\n            return {\n                type: 'BuiltInInterapption',\n                panelId: SCRIPTS_GADGET_PANEL_ID\n            };\n        },\n        shouldTransformAppDefId: appDefId => {\n            return appDefId === 'scripts' || appDefId === addNativeProvider('scripts');\n        },\n        transformAppDefId: () => {\n            return SCRIPTS_GADGET_PANEL_ID;\n        },\n        dependentFeatureToggles: ['PURE-6186_Scripter_Gadget_GCUI'], // assumption for the ft\n        active: features => {\n            // Here, we do not have to check for workitem scripter FT\n            // PEF does not support workitems and therefore we only need to transform query params for conversations\n            // The Workitem scripter PM setting will use the built-in provider panel setting from the get-go\n            // The workitem scritper panel will use the built-in provider panelId from the get-go\n            // legacy scripter panel ids in layout models only need to be transformed for conversations;\n            //   again because workitem scripter panelIds will use provider from the get-go\n            return features['PURE-6186_Scripter_Gadget_GCUI'];\n        }\n    }\n};\n\nexport const transformationDependentFeatureToggles = [\n    ...new Set(\n        Object.values(transformationMaps).flatMap(({ dependentFeatureToggles }) => dependentFeatureToggles ?? [])\n    )\n];\n\nexport const buildTransformationFtComputedDepKey = (injectionPrefix: string): string => {\n    return `${injectionPrefix}.{${transformationDependentFeatureToggles.join(',')}}`;\n};\n\nexport const standardTransformationFtComputedDepKey = buildTransformationFtComputedDepKey('session.features');\n\nexport const transformPanelSetting = (panelSetting: PanelSetting, features: Record<string, boolean>) => {\n    const requiredTransform = Object.values(transformationMaps).find(\n        transform => transform.active(features) && transform.shouldTransformPanelSetting(panelSetting)\n    );\n    if (requiredTransform) {\n        return requiredTransform.transformPanelSetting();\n    }\n    return panelSetting;\n};\n\n/**\n * Transforms the provided panelId to the target panelId based on the enable state of various transformers.\n * If no applicable transformer is found, the original panelId is returned. This\n * transformation will work for native src panels with and without a native provider, but note that\n * transformations back to native panels will not include the native provider.  If the native provider is needed,\n * callers should call `addNativeProvider` on the returned panelId.\n *\n * @param panelId The panelId (with or without native provider) to transform, when applicable\n * @param features The feature flags to use when determining which transformer to use\n * @returns A transformed panelId if applicable, otherwise the original panelId.  Native panelIds will not include the native provider.\n */\nexport const transformPanelId = (panelId: string, features: Record<string, boolean>) => {\n    // Normalize native panel ids to not include the native provider for searching transformers\n    const srcNativePanelMatch = findNativePanel(panelId);\n    const toSearch = srcNativePanelMatch ? srcNativePanelMatch.panelId : panelId;\n\n    const requiredTransform = Object.values(transformationMaps).find(\n        transform => transform.active(features) && transform.shouldTransformAppDefId(toSearch)\n    );\n    if (requiredTransform) {\n        return requiredTransform.transformAppDefId();\n    }\n    return panelId;\n};\n\n/**\n * Appends the native provider to the end of the provided panelId if it represents a native panel.\n * This function is idempotent and safe to call on non-native panelIds as well as panelIds\n * which may already include the native provider.\n *\n * eg.\n * scheduleCallback -> scheduleCallback&native\n * scheduleCallback&native -> scheuldeCallback&native\n * nonNativePanelId -> nonNativePanelId\n * nonNativePanelId&nonNativeProviderId -> nonNativePanelId&nonNativeProviderId\n */\nexport const addNativeProvider = (panelId: string): string => {\n    const nativePanel = findNativePanel(panelId);\n    if (nativePanel) {\n        return `${nativePanel.panelId}&native`;\n    }\n\n    return panelId;\n};\n\ntype NativePanelMatch = {\n    panelId: NativePanel;\n    includedNativeProvider: boolean;\n};\nconst findNativePanel = (panelId: string): NativePanelMatch | undefined => {\n    const nativePanel = NATIVE_PANELS.find(\n        currNativePanel => panelId === currNativePanel || panelId === `${currNativePanel}&native`\n    );\n    if (!nativePanel) {\n        return;\n    }\n\n    return {\n        panelId: nativePanel,\n        includedNativeProvider: panelId.endsWith('&native')\n    };\n};\n","import { hasKey } from './types';\n\ntype CacheEntry<T> = {\n    expirationTimestamp?: number;\n    value: T;\n};\ntype TtlCacheConfig = {\n    defaultTtl?: number;\n};\n\n// A bit of jitter to ensure the TTL has been reached upon timer expiration\nconst TIMER_JITTER_MILLIS = 5;\n\nexport default class TtlCache<T> {\n    private config: TtlCacheConfig;\n    private cacheData: Record<string, CacheEntry<T>>;\n    private expiryCheck: {\n        timerRef?: number;\n        nextExpirationTimestamp?: number;\n    };\n    private tearingDown: boolean;\n\n    constructor({ defaultTtl }: TtlCacheConfig = {}) {\n        this.config = {\n            // <0, 0, and undefined all equate to no TTL (undefined)\n            defaultTtl: this.normalizeTtl(defaultTtl)\n        };\n        this.cacheData = {};\n        this.tearingDown = false;\n        this.expiryCheck = {};\n    }\n\n    keys(): string[] {\n        return Object.keys(this.cacheData);\n    }\n\n    /**\n     * Returns true if the key is in the cache, regardless of expiry; flase otherwise.\n     * Calls to has and get are stable within the same function.\n     *\n     * @param key The key to check\n     * @returns true if an item exists in the case under the specified key (regardless of expiry); false otherwise.\n     */\n    has(key: string): boolean {\n        return hasKey(this.cacheData, key);\n    }\n\n    get(key: string): undefined | T {\n        return this.cacheData[key]?.value;\n    }\n\n    /**\n     * @param key The key to use for this cache entry\n     * @param value The value to use for this cache entry\n     * @param ttl Unspecified/undefined uses the default ttl; <=0 indicates no caching, ttl otherwise\n     */\n    put(key: string, value: T, ttl?: number) {\n        const currTimeMillis = Date.now();\n\n        // Use the default ttl if item ttl is unspecified\n        // <=0 indicates no cache\n        const effectiveTtl = typeof ttl === 'undefined' ? this.config.defaultTtl : this.normalizeTtl(ttl);\n        const expirationTimestamp = typeof effectiveTtl === 'number' ? currTimeMillis + effectiveTtl : undefined;\n\n        this.cacheData[key] = {\n            expirationTimestamp,\n            value\n        };\n\n        if (expirationTimestamp) {\n            this.scheduleEviction(expirationTimestamp);\n        }\n    }\n\n    delete(key: string): boolean {\n        if (this.has(key)) {\n            const removedExpirationTimestamp = this.cacheData[key]?.expirationTimestamp;\n            delete this.cacheData[key];\n\n            if (removedExpirationTimestamp && removedExpirationTimestamp === this.expiryCheck.nextExpirationTimestamp) {\n                // We've removed an item which matches the next eviction timestamp\n\n                // Clear the existing timer.  Otherwise, scheduleEviction will still see\n                // the exiting timer as earlier than the new timer we're trying to set and noop\n                this.clearEvictionTimer();\n\n                // Re-schedule the eviction timer in case this is the last such entry at that eviction time\n                this.scheduleEviction();\n            }\n\n            return true;\n        }\n\n        return false;\n    }\n\n    clear() {\n        this.clearEvictionTimer();\n\n        this.cacheData = {};\n    }\n\n    tearDown(): void {\n        this.tearingDown = true;\n\n        this.clearEvictionTimer();\n\n        this.clear();\n    }\n\n    private clearEvictionTimer() {\n        if (this.expiryCheck.timerRef) {\n            window.clearTimeout(this.expiryCheck.timerRef);\n        }\n\n        this.expiryCheck = {};\n    }\n\n    /**\n     * Schedules an eviction timer to run approximately at the sprecified timestamp if no earlier timer already exists.\n     *\n     * If an earlier timer exists, this function will no-op; however, the \"interval\" will continue to be set\n     * based on the expiry timestamps of the cache, always selecting the nearest timestamp until no such timer is needed.\n     *\n     * @param requestedTimestamp The desired timestamp for the next timer. If no timestamp is provided, the next\n     *  timer will be calculated from the entries in the cache.\n     */\n    private scheduleEviction(requestedTimestamp = this.getEarliestExpirationTimestamp()) {\n        const currTimeMillis = Date.now();\n\n        if (this.tearingDown || typeof requestedTimestamp !== 'number' || requestedTimestamp < currTimeMillis) {\n            return;\n        }\n\n        if (\n            this.expiryCheck.nextExpirationTimestamp &&\n            this.expiryCheck.nextExpirationTimestamp <= requestedTimestamp\n        ) {\n            return;\n        }\n\n        if (this.expiryCheck.timerRef) {\n            window.clearTimeout(this.expiryCheck.timerRef);\n        }\n\n        this.expiryCheck.nextExpirationTimestamp = requestedTimestamp;\n        this.expiryCheck.timerRef = window.setTimeout(() => {\n            this.evictExpiredItems();\n            this.scheduleEviction();\n        }, requestedTimestamp - currTimeMillis + TIMER_JITTER_MILLIS);\n    }\n\n    private evictExpiredItems() {\n        const currTimeMillis = Date.now();\n        Object.entries(this.cacheData).forEach(([key, cacheEntry]) => {\n            if (cacheEntry.expirationTimestamp && cacheEntry.expirationTimestamp <= currTimeMillis) {\n                delete this.cacheData[key];\n            }\n        });\n    }\n\n    private getEarliestExpirationTimestamp() {\n        let earliestExpiration: undefined | number;\n\n        Object.values(this.cacheData).forEach(({ expirationTimestamp }) => {\n            if (expirationTimestamp && (!earliestExpiration || expirationTimestamp < earliestExpiration)) {\n                earliestExpiration = expirationTimestamp;\n            }\n        });\n\n        return earliestExpiration;\n    }\n\n    private normalizeTtl(ttl: undefined | number) {\n        if (typeof ttl === 'undefined') {\n            return undefined;\n        }\n\n        if (ttl <= 0) {\n            return undefined;\n        }\n\n        return ttl;\n    }\n}\n","/*\n * Utility and Common types\n * Note: Feature-specific types should be kept within their own or separate util files.\n */\nexport function assertNever(x: never): never {\n    throw new Error(`Unexpected object: ${x}`);\n}\n\n// TS can't narrow `object` to an object with a known key, so we need a type-guard for that\nexport function hasKey<K extends string>(obj: object, key: K): obj is Record<K, unknown> {\n    return key in obj;\n}\n\n// Includes type-guard/utility for readonly arrays/tuples/string unions\nexport function includes<S extends string>(haystack: readonly S[], needle: string): needle is S {\n    const _haystack: readonly string[] = haystack;\n    return _haystack.includes(needle);\n}\n\nexport type UnionFromTuple<T extends any[] | readonly any[]> = T[number];\n","/**\n * URL manipulation and query parameter handling utilities\n * Extracted from authenticator for better code organization\n */\n\n/**\n * Removes specified query parameters from a URL search string\n * @param {string} searchString - The URL search string (e.g., \"?foo=bar&baz=qux\")\n * @param {string[]} paramsToRemove - Array of parameter names to remove\n * @returns {string} - The cleaned search string (with leading \"?\" if non-empty)\n */\nexport function removeQueryParams(searchString, paramsToRemove) {\n    if (!searchString) {\n        return '';\n    }\n\n    const urlParams = new URLSearchParams(searchString);\n\n    paramsToRemove.forEach(param => {\n        urlParams.delete(param);\n    });\n\n    const newParams = urlParams.toString();\n    return newParams ? `?${newParams}` : '';\n}\n\n/**\n * Extracts the query parameters whose keys start with the given prefix, preserving\n * their original encoding, and returns them as a search string fragment (no leading\n * \"?\"). Used to capture `center-stage-*` frame path overrides before the OAuth\n * redirect, which drops the search string.\n *\n * @param {string} searchString - The URL search string (e.g., \"?center-stage-app=feature%2Fx&foo=1\")\n * @param {string} prefix - The key prefix to match (e.g., \"center-stage-\")\n * @returns {string} - The matching params joined by \"&\" (no leading \"?\"), or \"\" if none\n */\nexport function extractQueryParamsByPrefix(searchString, prefix) {\n    if (!searchString || !prefix) {\n        return '';\n    }\n\n    const urlParams = new URLSearchParams(searchString);\n    const matched = new URLSearchParams();\n\n    urlParams.forEach((value, key) => {\n        if (key.startsWith(prefix)) {\n            matched.append(key, value);\n        }\n    });\n\n    return matched.toString();\n}\n\n/**\n * Merges an \"extra\" search fragment into an existing search string, without\n * duplicating keys that are already present. Used to restore captured\n * `center-stage-*` frame path overrides after the OAuth redirect.\n *\n * @param {string} searchString - The current URL search string (may be empty, with/without leading \"?\")\n * @param {string} extraParams - Additional params to merge (no leading \"?\"), e.g. from extractQueryParamsByPrefix\n * @returns {string} - The merged search string (with leading \"?\" if non-empty)\n */\nexport function mergeQueryParams(searchString, extraParams) {\n    const merged = new URLSearchParams(searchString || '');\n\n    if (extraParams) {\n        const extra = new URLSearchParams(extraParams);\n        extra.forEach((value, key) => {\n            if (!merged.has(key)) {\n                merged.append(key, value);\n            }\n        });\n    }\n\n    const result = merged.toString();\n    return result ? `?${result}` : '';\n}\n\n/**\n * Builds a redirect URI from window location\n * @param {Object} location - Object with origin, protocol, host, and pathname\n * @returns {string} - The redirect URI\n */\nexport function buildRedirectUri(location) {\n    // Determine redirect URI base\n    let redirectUri = location.origin;\n    if (!redirectUri) {\n        redirectUri = `${location.protocol}//${location.host}`;\n    }\n\n    // Use only the first path part\n    const pathParts = location.pathname.split('/').filter(x => !!x);\n    if (pathParts.length > 0) {\n        redirectUri += `/${pathParts[0]}/`;\n    } else {\n        redirectUri += '/directory/';\n    }\n\n    return redirectUri;\n}\n\n/**\n * Ensures pathname has trailing slash for Safari compatibility\n * @param {string} pathname - The pathname to process\n * @returns {string} - Pathname with trailing slash\n */\nexport function ensureTrailingSlash(pathname) {\n    if (!pathname) {\n        return '/';\n    }\n\n    const lastIndex = pathname.length - 1;\n    if (lastIndex >= 0 && pathname.charAt(lastIndex) !== '/') {\n        return pathname + '/';\n    }\n\n    return pathname;\n}\n","import uuid from 'uuid';\n\nfunction generate() {\n    return uuid.v4();\n}\n\nexport default {\n    generate\n};\n","import { parseQueryParams } from './query-parser';\n\nexport interface VoltPopoutOptions {\n    hosted?: boolean;\n    inviteJid?: string;\n}\n\nexport interface VoltPopoutConfig {\n    voltBaseUrl: string;\n    featureBranch: string;\n}\n\n/**\n * Default window options for Volt popout\n */\nconst DEFAULT_WINDOW_OPTIONS = 'height=900,width=1200,right=700,top=100,menubar=no,toolbar=no,location=no,status=no';\n\ninterface VoltQueryParams {\n    volt?: string;\n    voltLocalhost?: string;\n    voltLocalHost?: string;\n    [key: string]: string | undefined;\n}\n\n/**\n * Get the Volt feature branch from query parameters\n */\nexport function getVoltFeatureBranch(): string {\n    const queryParams = parseQueryParams() as VoltQueryParams;\n    return queryParams['volt'] || '';\n}\n\n/**\n * Check if Volt should use localhost (NOTE THE HASH).\n * https://apps.inindca.com/directory/?voltLocalHost=true#/\n * OR\n * https://apps.inindca.com/dev/?voltLocalHost=true#/\n */\nexport function isVoltLocalhost(): boolean {\n    const queryParams = parseQueryParams() as VoltQueryParams;\n    return (queryParams['voltLocalhost'] || queryParams['voltLocalHost']) === 'true';\n}\n\n/**\n * Get the origin URL for Volt (without path or hash)\n */\nexport function getVoltOrigin(): string {\n    const getLocalWebDirEnv = () => {\n        const env = window.location.pathname.split('/')[1];\n        switch (env) {\n            case 'dev':\n                return 'https://apps.inindca.com';\n            case 'tca':\n                return 'https://apps.inintca.com';\n            case 'prod':\n                return 'https://apps.mypurecloud.com';\n            default:\n                return 'https://localhost:8443';\n        }\n    };\n\n    /**\n     * If we want to run Volt locally, check query param and route.\n     * If we are running web-dir locally, use the corresponding web-dir (/dev, /test, /prod) env if no volt localhost is set.\n     * Otherwise use the matching window.location.origin.\n     */\n    if (isVoltLocalhost()) {\n        return 'https://localhost:8443';\n    } else if (window.location.origin === 'https://localhost:4300') {\n        return getLocalWebDirEnv();\n    } else {\n        return window.location.origin;\n    }\n}\n\n/**\n * Get the Volt app path (e.g., '/volt' or '/volt/feature-branch' or '' for localhost)\n */\nexport function getVoltAppPath(): string {\n    if (isVoltLocalhost()) {\n        return '';\n    }\n\n    const featureBranch = getVoltFeatureBranch();\n    if (featureBranch) {\n        return `/volt/${featureBranch}`;\n    }\n\n    return '/volt';\n}\n\n/**\n * Build a Volt popout URL for a video room\n * @param roomJid - The JID of the video room\n * @param options - Optional parameters for the popout\n *\n * Expected format: https://apps.inindca.com/volt/#/media/{roomJid}?clientType=popoutVideo&hosted={hosted}&inviteJid={inviteJid}\n * Note: Query params must come AFTER the hash path for Volt's hash-based routing\n */\nexport function buildVoltPopoutUrl(roomJid: string, options: VoltPopoutOptions = {}): string {\n    const origin = getVoltOrigin();\n    const appPath = getVoltAppPath();\n\n    // Build query string for hash-based routing (params go after the hash path)\n    // clientType=popoutVideo should always be included since this is a popout window.\n    const queryParams: string[] = ['clientType=popoutVideo'];\n\n    if (options.hosted !== undefined) {\n        queryParams.push(`hosted=${encodeURIComponent(String(options.hosted))}`);\n    }\n\n    if (options.inviteJid) {\n        queryParams.push(`inviteJid=${encodeURIComponent(options.inviteJid)}`);\n    }\n\n    const queryString = `?${queryParams.join('&')}`;\n\n    // Format: {origin}{appPath}/#/media/{roomJid}?params\n    return `${origin}${appPath}/#/media/${roomJid}${queryString}`;\n}\n\n/**\n * Open Volt in a popout window for video\n * @param roomJid - The JID of the video room\n * @param options - Optional parameters for the popout\n * @returns The window reference or null if popup was blocked\n */\nexport function openVoltPopout(roomJid: string, options: VoltPopoutOptions = {}): Window | null {\n    const url = buildVoltPopoutUrl(roomJid, options);\n    const windowName = `volt-video-${roomJid}`;\n    return window.open(url, windowName, DEFAULT_WINDOW_OPTIONS);\n}\n\n/**\n * Create a video conference link (for copying to clipboard)\n * @param chatRoomJid - The chat room JID\n */\nexport function createVideoConferenceLink(chatRoomJid: string): string {\n    const featureBranch = getVoltFeatureBranch();\n    const branchPath = featureBranch ? `/${featureBranch}` : '';\n    return `${window.location.origin}/volt${branchPath}/#/media/${chatRoomJid}`;\n}\n","const webrtcConversationTypes = {\n    SOFTPHONE: 'softphone',\n    ENGAGE_SCREENSHARE: 'engage-screenshare',\n    ENGAGE_VIDEO: 'engage-video',\n    ENGAGE_VR: 'engage-vr',\n    COLLABORATE_VIDEO: 'collaborate-video',\n    ENGAGE_SCREEN_RECORDING: 'engage-screen-recording'\n};\n\nexport default webrtcConversationTypes;\n","import { _buildProviderComputed, SharedProviderConfig } from 'web-directory/utils/shared-provider';\n\nexport const _buildWorkerProviderComputed = function (providerConfig: SharedProviderConfig) {\n    return _buildProviderComputed(providerConfig, 'worker-provider');\n};\n\nexport default { _buildWorkerProviderComputed };\n","/**\n * Workitem create form helpers — pure validation and payload shaping for outbound create.\n */\n\nexport const WORKITEM_NAME_MIN_LENGTH = 3;\nexport const WORKITEM_NAME_MAX_LENGTH = 256;\nexport const WORKITEM_DESCRIPTION_MAX_LENGTH = 512;\nexport const WORKITEM_PRIORITY_MIN = -25_000_000;\nexport const WORKITEM_PRIORITY_MAX = 25_000_000;\nexport const WORKITEM_MAX_DAYS_FROM_NOW = 365;\nexport const SECONDS_PER_DAY = 86_400;\nexport const WORKITEM_MAX_DURATION_SECONDS = WORKITEM_MAX_DAYS_FROM_NOW * SECONDS_PER_DAY;\n\n/** A workbin option shown in the create-workitem dropdown. */\nexport type WorkbinOption = {\n    id: string;\n    name: string;\n};\n\n/** A worktype option shown in the create-workitem dropdown. */\nexport type WorktypeOption = {\n    id: string;\n    name: string;\n};\n\n/** A worktype status option shown in the create-workitem dropdown. */\nexport type StatusOption = {\n    id: string;\n    name: string;\n};\n\n/**\n * Request body shared by the cursor-paginated task management query endpoints\n * (`/workbins/query`, `/worktypes/query`).\n */\nexport type TaskManagementQueryRequest = {\n    name?: string;\n    pageSize?: number;\n    /** Cursor for the next page, taken from a prior response's `after`. */\n    after?: string;\n};\n\n/** Cursor-paginated listing returned by the task management query endpoints. */\nexport type TaskManagementQueryResponse = {\n    entities?: Array<{ id?: string; name?: string }>;\n    /** Cursor for the next page; absent/empty when there are no more pages. */\n    after?: string;\n};\n\n/** Form field values collected by the outbound create-workitem panel. */\nexport type CreateWorkitemFormValues = {\n    name: string;\n    /** Id of the selected worktype; empty means unset. Required to submit. */\n    typeId: string;\n    /** Id of the selected worktype status; empty means unset. Required to submit. */\n    statusId: string;\n    /** Id of the selected workbin; empty means unset. Required to submit. */\n    workbinId: string;\n    /** Id of the selected queue; empty means unset. Required to submit. */\n    queueId: string;\n    description: string;\n    /** Raw input string; empty means unset. */\n    priority: string;\n    /** ISO date (`yyyy-mm-dd`) from the datepicker, or empty when unset. */\n    dueDate: string;\n    /** ISO date (`yyyy-mm-dd`) from the datepicker, or empty when unset. */\n    dateExpires: string;\n    /** Raw input string for estimated duration in seconds; empty means unset. */\n    durationSeconds: string;\n    /** ISO date (`yyyy-mm-dd`) from the datepicker used to derive TTL epoch seconds; empty when unset. */\n    ttlDate: string;\n};\n\n/**\n * Body for POST /api/v2/taskmanagement/workitems.\n * Additional required fields (e.g. typeId) will be added as the form expands.\n */\nexport type CreateWorkitemPayload = {\n    name: string;\n    /** Required — the worktype the workitem is created from. */\n    typeId: string;\n    /** Required — the worktype status the workitem starts in. */\n    statusId: string;\n    /** Required — the workbin the workitem is created in. */\n    workbinId: string;\n    /** Required — the queue the workitem is routed to. */\n    queueId: string;\n    description?: string;\n    priority?: number;\n    dateDue?: string;\n    dateExpires?: string;\n    durationSeconds?: number;\n    /** Epoch seconds; must not exceed 365 days from now. */\n    ttl?: number;\n};\n\nexport type WorkitemFieldErrorKey =\n    | 'nameLength'\n    | 'descriptionLength'\n    | 'priorityRange'\n    | 'priorityInteger'\n    | 'dateTooFar'\n    | 'durationRange'\n    | 'durationInteger'\n    | 'ttlTooFar'\n    | 'ttlInteger';\n\nexport type WorkitemFieldErrors = Partial<Record<keyof CreateWorkitemFormValues, WorkitemFieldErrorKey>>;\n\nfunction maxDateFromNow(now: Date): Date {\n    const max = new Date(now.getTime());\n    max.setUTCDate(max.getUTCDate() + WORKITEM_MAX_DAYS_FROM_NOW);\n    return max;\n}\n\n/**\n * Returns true when `isoDate` is a valid date and not more than 365 days after `now`.\n */\nexport function isDateWithinMaxDays(isoDate: string, now: Date = new Date()): boolean {\n    const date = new Date(isoDate);\n    if (Number.isNaN(date.getTime())) return false;\n    return date.getTime() <= maxDateFromNow(now).getTime();\n}\n\n/**\n * Validates a `yyyy-mm-dd` value emitted by gux-datepicker and returns it unchanged,\n * or an empty string when it is not a well-formed date. gux-datepicker both emits and\n * consumes this ISO date format, so we store it verbatim in form state.\n */\nexport function normalizeGuxDate(dateDetail: string): string {\n    if (!dateDetail) return '';\n    const [year, month, day] = dateDetail.split('-').map(Number);\n    if (!year || !month || !day) return '';\n    const date = new Date(Date.UTC(year, month - 1, day));\n    return Number.isNaN(date.getTime()) ? '' : dateDetail;\n}\n\n/**\n * Converts an ISO date (`yyyy-mm-dd`) to a full ISO-8601 UTC datetime string for the API.\n */\nexport function isoDateToDateTime(isoDate: string): string {\n    const date = new Date(isoDate);\n    return Number.isNaN(date.getTime()) ? '' : date.toISOString();\n}\n\n/**\n * Converts an ISO date/datetime to epoch seconds for the workitem `ttl` field.\n */\nexport function isoToEpochSeconds(isoDate: string): number | null {\n    const date = new Date(isoDate);\n    if (Number.isNaN(date.getTime())) return null;\n    return Math.floor(date.getTime() / 1000);\n}\n\nfunction parseOptionalInteger(raw: string): { ok: true; value: number | undefined } | { ok: false } {\n    const trimmed = raw.trim();\n    if (!trimmed) return { ok: true, value: undefined };\n    if (!/^-?\\d+$/.test(trimmed)) return { ok: false };\n    const value = Number(trimmed);\n    if (!Number.isSafeInteger(value)) return { ok: false };\n    return { ok: true, value };\n}\n\n/**\n * Validates outbound workitem form values. Empty optional fields are skipped.\n * Empty name is treated as incomplete (via {@link canSubmitCreateWorkitem}), not as a field error.\n */\nexport function validateCreateWorkitemForm(\n    values: CreateWorkitemFormValues,\n    now: Date = new Date()\n): WorkitemFieldErrors {\n    const errors: WorkitemFieldErrors = {};\n    const name = values.name.trim();\n\n    if (name.length > 0 && (name.length < WORKITEM_NAME_MIN_LENGTH || name.length > WORKITEM_NAME_MAX_LENGTH)) {\n        errors.name = 'nameLength';\n    }\n\n    if (values.description.trim().length > WORKITEM_DESCRIPTION_MAX_LENGTH) {\n        errors.description = 'descriptionLength';\n    }\n\n    const priority = parseOptionalInteger(values.priority);\n    if (!priority.ok) {\n        errors.priority = 'priorityInteger';\n    } else if (\n        priority.value !== undefined &&\n        (priority.value < WORKITEM_PRIORITY_MIN || priority.value > WORKITEM_PRIORITY_MAX)\n    ) {\n        errors.priority = 'priorityRange';\n    }\n\n    if (values.dueDate && !isDateWithinMaxDays(values.dueDate, now)) {\n        errors.dueDate = 'dateTooFar';\n    }\n\n    if (values.dateExpires && !isDateWithinMaxDays(values.dateExpires, now)) {\n        errors.dateExpires = 'dateTooFar';\n    }\n\n    const duration = parseOptionalInteger(values.durationSeconds);\n    if (!duration.ok) {\n        errors.durationSeconds = 'durationInteger';\n    } else if (duration.value !== undefined && (duration.value < 0 || duration.value > WORKITEM_MAX_DURATION_SECONDS)) {\n        errors.durationSeconds = 'durationRange';\n    }\n\n    if (values.ttlDate) {\n        if (!isDateWithinMaxDays(values.ttlDate, now)) {\n            errors.ttlDate = 'ttlTooFar';\n        } else if (isoToEpochSeconds(values.ttlDate) === null) {\n            errors.ttlDate = 'ttlInteger';\n        }\n    }\n\n    return errors;\n}\n\n/**\n * Builds the API create payload from form values. Omits empty optional fields.\n * Call only after {@link validateCreateWorkitemForm} reports no errors and name is valid.\n */\nexport function buildCreateWorkitemPayload(values: CreateWorkitemFormValues): CreateWorkitemPayload {\n    const payload: CreateWorkitemPayload = {\n        name: values.name.trim(),\n        typeId: values.typeId,\n        statusId: values.statusId,\n        workbinId: values.workbinId,\n        queueId: values.queueId\n    };\n\n    const description = values.description.trim();\n    if (description) payload.description = description;\n\n    const priority = parseOptionalInteger(values.priority);\n    if (priority.ok && priority.value !== undefined) payload.priority = priority.value;\n\n    if (values.dueDate) payload.dateDue = isoDateToDateTime(values.dueDate);\n    if (values.dateExpires) payload.dateExpires = isoDateToDateTime(values.dateExpires);\n\n    const duration = parseOptionalInteger(values.durationSeconds);\n    if (duration.ok && duration.value !== undefined) payload.durationSeconds = duration.value;\n\n    if (values.ttlDate) {\n        const ttl = isoToEpochSeconds(values.ttlDate);\n        if (ttl !== null) payload.ttl = ttl;\n    }\n\n    return payload;\n}\n\nfunction isNameValid(name: string): boolean {\n    const trimmed = name.trim();\n    return trimmed.length >= WORKITEM_NAME_MIN_LENGTH && trimmed.length <= WORKITEM_NAME_MAX_LENGTH;\n}\n\n/**\n * True when the form has a valid name, a selected worktype, status, workbin, and queue,\n * and no field errors.\n */\nexport function canSubmitCreateWorkitem(values: CreateWorkitemFormValues, now: Date = new Date()): boolean {\n    if (!isNameValid(values.name)) return false;\n    if (!values.typeId) return false;\n    if (!values.statusId) return false;\n    if (!values.workbinId) return false;\n    if (!values.queueId) return false;\n    return Object.keys(validateCreateWorkitemForm(values, now)).length === 0;\n}\n\ntype MessageHolder = { message?: unknown };\n\n/** Possible shapes a failed task management request surfaces the response body in. */\ntype TaskManagementErrorLike = {\n    payload?: MessageHolder;\n    responseJSON?: MessageHolder;\n    errorResponse?: MessageHolder;\n    jqXHR?: { responseJSON?: MessageHolder };\n};\n\n/**\n * Extracts the server-provided error message from a failed create-workitem request.\n * The task management API returns a `message` field in the response body; depending on the\n * ajax layer it surfaces as `payload`, `responseJSON`, `errorResponse`, or `jqXHR.responseJSON`.\n * Returns null when no server message can be found so callers can fall back to a generic message.\n */\nexport function extractCreateWorkitemErrorMessage(error: unknown): string | null {\n    if (!error || typeof error !== 'object') return null;\n    const err = error as TaskManagementErrorLike;\n    const candidates = [\n        err.payload?.message,\n        err.responseJSON?.message,\n        err.errorResponse?.message,\n        err.jqXHR?.responseJSON?.message\n    ];\n    for (const candidate of candidates) {\n        if (typeof candidate === 'string' && candidate.trim()) return candidate.trim();\n    }\n    return null;\n}\n","import $ from 'jquery';\nimport { on } from '@ember/object/evented';\nimport Component from '@ember/component';\n\nexport default Component.extend({\n    templateName: 'card/tree/tree',\n    classNames: ['card-tree-container', 'container-fluid'],\n\n    attachTextInputListeners: on('didInsertElement', function () {\n        const fields = $.merge($('.ember-text-area'), $('.ember-text-field'));\n        return fields.on('keydown', event => event.stopPropagation());\n    }),\n\n    removeTextInputListeners: on('willClearRender', function () {\n        const fields = $.merge($('.ember-text-area'), $('.ember-text-field'));\n        return fields.off('keydown');\n    })\n});\n","// Imports\nimport EmberObject, { computed } from '@ember/object';\nimport { inject } from '@ember/service';\nimport { WorkerDef } from '@genesys/apps-v2-host';\nimport { validatePortNumber } from 'web-directory/utils/app-provider';\nimport { ft } from 'web-directory/utils/boolean-expressions';\n\nexport default EmberObject.extend({\n    // Injections\n    application: inject('application'),\n    intl: inject('intl'),\n    // Attributes\n    id: 'notesWorkerProvider',\n    trustedProvider: true,\n    monitorInteractionUpdates: true,\n    // Derived\n    targetOrigin: computed<string>('application.runtime', function () {\n        const runtimeEnv = this.get('application.runtime');\n        if (runtimeEnv.local) {\n            return `https://apps.${runtimeEnv.publicDomainName}`;\n        }\n        return window.location.origin;\n    }),\n    getWorkerConfig(): WorkerDef {\n        return buildWorkerDef(this.get('targetOrigin'));\n    }\n});\n\nexport const boolExpr = ft('AURA-1131_appsV2WorkersForACWGadgets');\n\nconst getWorkerUrl = (webDirectoryOrigin: string) => {\n    const workerSuffix = '/worker.js';\n    const urlParams = new URLSearchParams(window.location.search);\n    const version = urlParams?.get('notesGadgetVersion') || '';\n    if (!version) {\n        return `${webDirectoryOrigin}/acw-gadgets-notes${workerSuffix}`;\n    }\n    if (version === 'local') {\n        return `https://localhost:${validatePortNumber(urlParams.get('notesGadgetPort') || '', 4041)}${workerSuffix}`;\n    }\n    return `${webDirectoryOrigin}/acw-gadgets-notes/${version}${workerSuffix}`;\n};\n//TODO: Remove the casting to any here when new version of AppsV2 is pushed in WD, including AURA-1659\nconst buildWorkerDef = (origin: string): WorkerDef => {\n    return {\n        id: 'notesWorker',\n        displayName: 'Notes Worker',\n        src: getWorkerUrl(origin),\n        context: {\n            appDefId: 'notesGadget',\n            appProviderId: 'notesGadgetProvider',\n            group: 'contextual'\n        },\n        lifecycleConfig: {\n            bootstrap: true,\n            bootstrapTimeoutMillis: 15000,\n            bootstrapReadyTimeoutMillis: 15000,\n            loadTimeoutMillis: 15000,\n            loadMaxRetries: 3,\n            loadRetryDelayMillis: 2000\n        } as any\n    };\n};\n","// Imports\nimport EmberObject, { computed } from '@ember/object';\nimport { inject } from '@ember/service';\nimport { WorkerDef } from '@genesys/apps-v2-host';\nimport { validatePortNumber } from 'web-directory/utils/app-provider';\nimport { ft } from 'web-directory/utils/boolean-expressions';\n\nexport default EmberObject.extend({\n    // Injections\n    application: inject('application'),\n    intl: inject('intl'),\n    // Attributes\n    id: 'wrapupWorkerProvider',\n    trustedProvider: true,\n    monitorInteractionUpdates: true,\n    // Derived\n    targetOrigin: computed<string>('application.runtime', function () {\n        const runtimeEnv = this.get('application.runtime');\n        if (runtimeEnv.local) {\n            return `https://apps.${runtimeEnv.publicDomainName}`;\n        }\n        return window.location.origin;\n    }),\n    getWorkerConfig(): WorkerDef {\n        return buildWorkerDef(this.get('targetOrigin'));\n    }\n});\n\nexport const boolExpr = ft('AURA-1131_appsV2WorkersForACWGadgets');\n\nconst getWorkerUrl = (webDirectoryOrigin: string) => {\n    const workerSuffix = '/worker.js';\n    const urlParams = new URLSearchParams(window.location.search);\n    const version = urlParams?.get('wrapupGadgetVersion') || '';\n    if (!version) {\n        return `${webDirectoryOrigin}/acw-gadgets-wrap-up${workerSuffix}`;\n    }\n    if (version === 'local') {\n        return `https://localhost:${validatePortNumber(urlParams.get('wrapupGadgetPort') || '', 4040)}${workerSuffix}`;\n    }\n    return `${webDirectoryOrigin}/acw-gadgets-wrap-up/${version}${workerSuffix}`;\n};\n\n//TODO: Remove the casting to any here when new version of AppsV2 is pushed in WD, including AURA-1659\nconst buildWorkerDef = (origin: string): WorkerDef => {\n    return {\n        id: 'wrapupCodesWorker',\n        displayName: 'Wrap-up Codes Worker',\n        src: getWorkerUrl(origin),\n        context: {\n            appDefId: 'wrapupCodesGadget',\n            appProviderId: 'wrapupCodesGadgetProvider',\n            group: 'contextual'\n        },\n        lifecycleConfig: {\n            bootstrap: true,\n            bootstrapTimeoutMillis: 15000,\n            bootstrapReadyTimeoutMillis: 15000,\n            loadTimeoutMillis: 15000,\n            loadMaxRetries: 3,\n            loadRetryDelayMillis: 2000\n        } as any\n    };\n};\n","define('web-directory/config/environment', [], function() {\n  var prefix = 'web-directory';\ntry {\n  var metaName = prefix + '/config/environment';\n  var rawConfig = document.querySelector('meta[name=\"' + metaName + '\"]').getAttribute('content');\n  var config = JSON.parse(decodeURIComponent(rawConfig));\n\n  var exports = { 'default': config };\n\n  Object.defineProperty(exports, '__esModule', { value: true });\n\n  return exports;\n}\ncatch(err) {\n  throw new Error('Could not read config from meta tag with name \"' + metaName + '\".');\n}\n\n});\n","\n          if (!runningTests) {\n            require(\"web-directory/app\")[\"default\"].create({\"version\":\"13.2.0\",\"semver\":\"13.2.0+6-release/13.2.0-15316a14c11086df17680a0fe16cc495e074f47e\",\"urlprefix\":\"/directory/build-assets/13.2.0-6/\",\"buildNumber\":\"6\",\"axeAudit\":false,\"libs\":{\"@purecloud/ember-softphone-integration\":\"1.0.9\"},\"INTL_LANGUAGES\":{\"ar\":\"العربية (beta)\",\"cs\":\"Čeština\",\"da\":\"Dansk\",\"de\":\"Deutsch\",\"en-us\":\"English\",\"es\":\"Español\",\"fi\":\"Suomi\",\"fr-ca\":\"Français canadien (beta)\",\"fr\":\"Français\",\"he\":\"עברית (beta)\",\"hi\":\"हिन्दी\",\"it\":\"Italiano\",\"ja\":\"日本語\",\"ko\":\"한국어\",\"nl\":\"Nederlands\",\"no\":\"Norsk\",\"pl\":\"Polski\",\"pt-br\":\"Português do Brasil\",\"pt-pt\":\"Português\",\"ru\":\"Русский\",\"sv\":\"Svenska\",\"th\":\"ไทย\",\"tr\":\"Türkçe\",\"uk\":\"Українська\",\"zh-cn\":\"简体中文\",\"zh-tw\":\"繁體中文\"},\"name\":\"web-directory\"});\n          }\n        \n"]}